def _methodChosen(self, toggled):
        style = QtGui.QApplication.style()
        if toggled:
            methodName = str(self.__methodComboBox.currentText())
            instance = self.node.get_input(0)
            # if instance is not None and not hasattr(instance, methodName):
            #     QtGui.QMessageBox.warning(self, "Type error", "Object of type " + str(type(instance)) + " does not have \n" + \
            #     "such attribute " + methodName)
            #     return
            self.__methodComboBox.setEnabled(False)
            self.__lockChoice.setIcon(style.standardIcon(QtGui.QStyle.SP_DialogCancelButton))
            if not self.__isInit:
                self.node.set_method_name(methodName)
            DefaultNodeWidget.do_layout(self, self.node, self.__vboxlayout)
        else:
            self.__methodComboBox.setEnabled(True)
            self.__lockChoice.setIcon(style.standardIcon(QtGui.QStyle.SP_DialogApplyButton))

            if not self.__isInit:
                self.node.discard_method_name()

            for i in range(self.__vboxlayout.count()):
                it = self.__vboxlayout.itemAt(0)
                if it:
                    self.__vboxlayout.removeItem(it)
                    it.widget().setAttribute(QtCore.Qt.WA_DeleteOnClose)
                    it.widget().close()
            self.widgets = []

            self.refresh_layout()
    def _methodChosen(self, toggled):
        style = QtGui.QApplication.style()
        if toggled:
            methodName = str(self.__methodComboBox.currentText())
            instance = self.node.get_input(0)
            # if instance is not None and not hasattr(instance, methodName):
            #     QtGui.QMessageBox.warning(self, "Type error", "Object of type " + str(type(instance)) + " does not have \n" + \
            #     "such attribute " + methodName)
            #     return
            self.__methodComboBox.setEnabled(False)
            self.__lockChoice.setIcon(
                style.standardIcon(QtGui.QStyle.SP_DialogCancelButton))
            if not self.__isInit:
                self.node.set_method_name(methodName)
            DefaultNodeWidget.do_layout(self, self.node, self.__vboxlayout)
        else:
            self.__methodComboBox.setEnabled(True)
            self.__lockChoice.setIcon(
                style.standardIcon(QtGui.QStyle.SP_DialogApplyButton))

            if not self.__isInit:
                self.node.discard_method_name()

            for i in range(self.__vboxlayout.count()):
                it = self.__vboxlayout.itemAt(0)
                if it:
                    self.__vboxlayout.removeItem(it)
                    it.widget().setAttribute(QtCore.Qt.WA_DeleteOnClose)
                    it.widget().close()
            self.widgets = []

            self.refresh_layout()
Exemple #3
0
    def instantiate_widget(self, node=None, parent=None,
                            edit=False, autonomous=False):
        """ Return the corresponding widget initialised with node """

        # Code Editor
        if(edit):
            from openalea.visualea.code_editor import get_editor
            w = get_editor()(parent)
            try:
                w.edit_module(self.get_node_module(), self.nodeclass_name)
            except Exception as e:
                # Unable to load the module
                # Try to retrieve the file and open the file in an editor
                src_path = self.get_node_file()
                print("instantiate widget exception:", e)
                if src_path:
                    w.edit_file(src_path)
            return w

        # Node Widget
        if(node == None):
            node = self.instantiate()

        modulename = self.widgetmodule_name
        if(not modulename):
            modulename = self.nodemodule_name

        # if no widget declared, we create a default one
        if(not modulename or not self.widgetclass_name):

            from openalea.visualea.node_widget import DefaultNodeWidget
            return DefaultNodeWidget(node, parent, autonomous)

        else:
            # load module
            (file, pathname, desc) = imp.find_module(modulename,
                self.search_path + sys.path)

            sys.path.append(os.path.dirname(pathname))
            module = imp.load_module(modulename, file, pathname, desc)
            sys.path.pop()

            if(file):
                file.close()

            widgetclass = module.__dict__[self.widgetclass_name]
            return widgetclass(node, parent)
    def __init__(self, node, parent=None, autonomous=False):

        qt.QtGui.QWidget.__init__(self, parent)
        NodeWidget.__init__(self, node)

        vboxlayout = qt.QtGui.QVBoxLayout(self)
        self.vboxlayout = vboxlayout

        self.node = node

        # Container
        self.container = qt.QtGui.QTabWidget(self)
        vboxlayout.addWidget(self.container)

        if (autonomous):
            self.set_autonomous()
            return

        # empty_io is a flag to define if the composite widget add only io widgets

        # Trey to create a standard node widget for inputs
        default_widget = DefaultNodeWidget(node, parent)

        if (default_widget.is_empty()):
            default_widget.close()
            default_widget.destroy()
            del default_widget
            empty_io = True

        else:
            empty_io = False
            self.container.addTab(default_widget, "Inputs")

        # Add subwidgets (Need to sort widget)
        for id in node.vertices():

            subnode = node.node(id)

            # Do not display widget if hidden
            hide = subnode.internal_data.get('hide', False)
            user_app = subnode.internal_data.get('user_application', False)
            if (hide and not empty_io): continue

            if (not user_app):
                # ignore node with all input connected
                states = [
                    bool(subnode.get_input_state(p) == "connected")
                    for p in xrange(subnode.get_nb_input())
                ]

                if (all(states)): continue

            # Add tab
            try:
                factory = subnode.get_factory()
                widget = factory.instantiate_widget(subnode, self)
                assert widget
            except:
                continue

            if (widget.is_empty()):
                widget.close()
                del widget
            else:
                # Add as tab
                caption = "%s" % (subnode.caption)
                self.container.addTab(widget, caption)
Exemple #5
0
class FuncFactory(NodeFactory):
    """
    Subclass of openalea.core.NodeFactory that instanciate a `PFuncNode`
    
    :BUG: 
        Also overload get_module_node because the NodeFactory method is 
        re-importing the python modules each time a node is instanciated
    """
    def instantiate(self, call_stack=[]):
        """
        Returns a PFuncNode instance.
        
        call_stack: 
            the list of NodeFactory id in call stack (to avoir infinite recursion)
        """

        # The module contains the node implementation.
        module = self.get_node_module()
        classobj = reduce(lambda m, n: getattr(m, n, None),
                          [module] + self.nodeclass_name.split('.'))

        if classobj is None:
            raise Exception("Cannot instantiate '" + \
                self.nodeclass_name + "' from " + str(module))

        # Check inputs and outputs
        if (self.inputs is None):
            sign = sgn.Signature(classobj)
            self.inputs = sign.get_parameters()
        if (self.outputs is None):
            self.outputs = (dict(name="out", interface=None), )

        # Check and Instantiate if we have a functor class
        if ((type(classobj) == types.TypeType)
                or (type(classobj) == types.ClassType)):

            _classobj = classobj()
            if callable(_classobj):
                classobj = _classobj

        node = PFuncNode(auto_caption=True,
                         inputs=self.inputs,
                         outputs=self.outputs,
                         func=classobj)

        # Properties
        try:
            node.factory = self
            node.lazy = self.lazy
            if (not node.caption):
                node.set_caption(self.name)

            node.delay = self.delay
        except:
            pass

        # to script
        if self.toscriptclass_name is not None:
            node._to_script_func = module.__dict__.get(self.toscriptclass_name,
                                                       None)

        return node

    def instantiate_widget(self,
                           node=None,
                           parent=None,
                           edit=False,
                           autonomous=False):
        """ Return the corresponding widget initialised with node """

        # Code Editor
        if (edit):
            from openalea.visualea.code_editor import get_editor
            w = get_editor()(parent)
            try:
                w.edit_module(self.get_node_module(), self.nodeclass_name)
            except Exception, e:
                # Unable to load the module
                # Try to retrieve the file and open the file in an editor
                src_path = self.get_node_file()
                print "instantiate widget exception:", e
                if src_path:
                    w.edit_file(src_path)
            return w

        # Node Widget
        if (node == None):
            node = self.instantiate()

        modulename = self.widgetmodule_name
        if (not modulename):
            modulename = self.nodemodule_name

        # if no widget declared, we create a default one
        if (not modulename or not self.widgetclass_name):

            from openalea.visualea.node_widget import DefaultNodeWidget
            return DefaultNodeWidget(node, parent, autonomous)

        else:
            # load module
            module = load_module(modulename)

            ##(file, pathname, desc) = imp.find_module(modulename,
            ##    self.search_path + sys.path)
            ##
            ##sys.path.append(os.path.dirname(pathname))
            ##module = imp.load_module(modulename, file, pathname, desc)
            ##sys.path.pop()
            ##if(file):
            ##    file.close()

            widgetclass = module.__dict__[self.widgetclass_name]
            return widgetclass(node, parent)
Exemple #6
0
                    w.edit_file(src_path)
            return w

        # Node Widget
        if(node == None):
            node = self.instantiate()

        modulename = self.widgetmodule_name
        if(not modulename):
            modulename = self.nodemodule_name

        # if no widget declared, we create a default one
        if(not modulename or not self.widgetclass_name):

            from openalea.visualea.node_widget import DefaultNodeWidget
            return DefaultNodeWidget(node, parent, autonomous)

        else:
            # load module
            (file, pathname, desc) = imp.find_module(modulename,
                self.search_path + sys.path)

            sys.path.append(os.path.dirname(pathname))
            module = imp.load_module(modulename, file, pathname, desc)
            sys.path.pop()

            if(file):
                file.close()

            widgetclass = module.__dict__[self.widgetclass_name]
            return widgetclass(node, parent)
    def __init__(self, node, parent=None, autonomous=False):

        qt.QtGui.QWidget.__init__(self, parent)
        NodeWidget.__init__(self, node)

        vboxlayout = qt.QtGui.QVBoxLayout(self)
        self.vboxlayout = vboxlayout

        self.node = node

        # Container
        self.container = qt.QtGui.QTabWidget(self)
        vboxlayout.addWidget(self.container)


        if(autonomous):
            self.set_autonomous()
            return

        # empty_io is a flag to define if the composite widget add only io widgets

        # Trey to create a standard node widget for inputs
        default_widget = DefaultNodeWidget(node, parent)

        if(default_widget.is_empty()):
            default_widget.close()
            default_widget.destroy()
            del default_widget
            empty_io = True

        else:
            empty_io = False
            self.container.addTab(default_widget, "Inputs")


        # Add subwidgets (Need to sort widget)
        for id in node.vertices():

            subnode = node.node(id)

            # Do not display widget if hidden
            hide = subnode.internal_data.get('hide', False)
            user_app = subnode.internal_data.get('user_application', False)
            if(hide and not empty_io): continue

            if(not user_app):
                # ignore node with all input connected
                states = [ bool(subnode.get_input_state(p)=="connected")
                           for p in xrange(subnode.get_nb_input())]

                if(all(states)): continue

            # Add tab
            try:
                factory = subnode.get_factory()
                widget = factory.instantiate_widget(subnode, self)
                assert widget
            except:
                continue

            if(widget.is_empty()) :
                widget.close()
                del widget
            else :
                # Add as tab
                caption = "%s"%(subnode.caption)
                self.container.addTab(widget, caption)