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()
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)
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)
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)