def create(self): print("Generating catalog") result = [] for category in self.registry.categories(): if self.categories is not None and category.name not in self.categories: continue widgets = [] result.append((category.name, widgets)) for widget in category.widgets: iconfn = icon_loader.from_description(widget).find(widget.icon) icon = path.relpath(iconfn, os.getcwd()) doc = self.__get_help(widget) if doc: doc = path.relpath(doc, os.getcwd()) widgets.append({ "text": widget.name, "doc": doc, "icon": icon, "background": category.background, "keywords": widget.keywords, }) with open(path.join(self.output_dir, "widgets.json"), 'wt') as f: json.dump(result, f, indent=1) print("Done")
def __add_widget_for_node(self, node): # type: (SchemeNode) -> None item = self.__item_for_node.get(node) if item is not None: return if self.__workflow is None: return if node not in self.__workflow.nodes: return if node in self.__init_queue: self.__init_queue.remove(node) item = Item(node, None, -1) # Insert on the node -> item mapping. self.__item_for_node[node] = item log.debug("Creating widget for node %s", node) try: w = self.create_widget_for_node(node) except Exception: # pylint: disable=broad-except log.critical("", exc_info=True) lines = traceback.format_exception(*sys.exc_info()) text = "".join(lines) errorwidget = QLabel(textInteractionFlags=Qt.TextSelectableByMouse, wordWrap=True, objectName="widgetmanager-error-placeholder", text="<pre>" + escape(text) + "</pre>") item.errorwidget = errorwidget node.set_state_message(UserMessage(text, UserMessage.Error, "")) raise else: item.widget = w self.__item_for_widget[w] = item self.__set_float_on_top_flag(w) if w.windowIcon().isNull(): desc = node.description w.setWindowIcon(icon_loader.from_description(desc).get(desc.icon)) if not w.windowTitle(): w.setWindowTitle(node.title) w.installEventFilter(self.__activation_monitor) raise_canvas = QAction( self.tr("Raise Canvas to Front"), w, objectName="action-canvas-raise-canvas", toolTip=self.tr("Raise containing canvas workflow window"), shortcut=QKeySequence(Qt.ControlModifier | Qt.Key_Up)) raise_canvas.triggered.connect(self.__on_activate_parent) raise_descendants = QAction( self.tr("Raise Descendants"), w, objectName="action-canvas-raise-descendants", toolTip=self.tr("Raise all immediate descendants of this node"), shortcut=QKeySequence(Qt.ControlModifier | Qt.ShiftModifier | Qt.Key_Right)) raise_descendants.triggered.connect( partial(self.__on_raise_descendants, node)) raise_ancestors = QAction( self.tr("Raise Ancestors"), w, objectName="action-canvas-raise-ancestors", toolTip=self.tr("Raise all immediate ancestors of this node"), shortcut=QKeySequence(Qt.ControlModifier | Qt.ShiftModifier | Qt.Key_Left)) raise_ancestors.triggered.connect( partial(self.__on_raise_ancestors, node)) w.addActions([raise_canvas, raise_descendants, raise_ancestors]) # send all the post creation notification events workflow = self.__workflow assert workflow is not None inputs = workflow.find_links(sink_node=node) for link in inputs: ev = LinkEvent(LinkEvent.InputLinkAdded, link) QCoreApplication.sendEvent(w, ev) outputs = workflow.find_links(source_node=node) for link in outputs: ev = LinkEvent(LinkEvent.OutputLinkAdded, link) QCoreApplication.sendEvent(w, ev) self.widget_for_node_added.emit(node, w)
def create_widget_instance(self, node): """ Create a OWWidget instance for the node. """ desc = node.description klass = name_lookup(desc.qualified_name) log.info("Creating %r instance.", klass) widget = klass.__new__(klass, None, signal_manager=self.signal_manager(), stored_settings=node.properties) # Init the node/widget mapping and state before calling __init__ # Some OWWidgets might already send data in the constructor # (should this be forbidden? Raise a warning?) triggering the signal # manager which would request the widget => node mapping or state self.__widget_for_node[node] = widget self.__node_for_widget[widget] = node self.__widget_processing_state[widget] = 0 widget.__init__() widget.setCaption(node.title) widget.widgetInfo = desc widget.setWindowIcon(icon_loader.from_description(desc).get(desc.icon)) widget.setVisible(node.properties.get("visible", False)) node.title_changed.connect(widget.setCaption) # Widget's info/warning/error messages. widget.widgetStateChanged.connect(self.__on_widget_state_changed) # Widget's statusTip node.set_status_message(widget.statusMessage()) widget.statusMessageChanged.connect(node.set_status_message) # Widget's progress bar value state. widget.progressBarValueChanged.connect(node.set_progress) # Widget processing state (progressBarInit/Finished) # and the blocking state. widget.processingStateChanged.connect( self.__on_processing_state_changed) widget.blockingStateChanged.connect(self.__on_blocking_state_changed) if widget.isBlocking(): # A widget can already enter blocking state in __init__ self.__widget_processing_state[widget] |= self.BlockingUpdate if widget.processingState != 0: # It can also start processing (initialization of resources, ...) self.__widget_processing_state[widget] |= self.ProcessingUpdate node.set_processing_state(1) node.set_progress(widget.progressBarValue) # Install a help shortcut on the widget help_shortcut = QShortcut(QKeySequence("F1"), widget) help_shortcut.activated.connect(self.__on_help_request) # Up shortcut (activate/open parent) up_shortcut = QShortcut(QKeySequence(Qt.ControlModifier + Qt.Key_Up), widget) up_shortcut.activated.connect(self.__on_activate_parent) owactions = [ action for action in widget.actions() if isinstance(action, OWAction) ] node.setProperty("ext-menu-actions", owactions) return widget
def create_widget_instance(self, node): # type: (SchemeNode) -> OWBaseWidget """ Create a OWBaseWidget instance for the node. """ desc = node.description # type: WidgetDescription signal_manager = self.signal_manager() # Setup mapping for possible reentry via signal manager in widget's # __init__ item = Item(node, None, ProcessingState.Initializing) self.__item_for_node[node] = item try: # Lookup implementation class klass = name_lookup(desc.qualified_name) log.info("WidgetManager: Creating '%s.%s' instance '%s'.", klass.__module__, klass.__name__, node.title) item.widget = widget = klass.__new__( klass, None, captionTitle=node.title, signal_manager=signal_manager, stored_settings=copy.deepcopy(node.properties), # NOTE: env is a view of the real env and reflects # changes to the environment. env=self.scheme().runtime_env()) widget.__init__() except BaseException: item.widget = None raise finally: # Clear Initializing flag even in case of error item.state &= ~ProcessingState.Initializing # bind the OWBaseWidget to the node node.title_changed.connect(widget.setCaption) # Widget's info/warning/error messages. self.__initialize_widget_messages(node, widget) widget.messageActivated.connect(self.__on_widget_message_changed) widget.messageDeactivated.connect(self.__on_widget_message_changed) # Widget's statusMessage node.set_status_message(widget.statusMessage()) widget.statusMessageChanged.connect(node.set_status_message) # Widget's progress bar value state. widget.progressBarValueChanged.connect(node.set_progress) # OWBaseWidget's processing state (progressBarInit/Finished) # and the blocking state. We track these for the WidgetsSignalManager. widget.processingStateChanged.connect( self.__on_processing_state_changed) widget.blockingStateChanged.connect(self.__on_blocking_state_changed) if widget.isBlocking(): # A widget can already enter blocking state in __init__ item.state |= ProcessingState.BlockingUpdate if widget.processingState != 0: # It can also start processing (initialization of resources, ...) item.state |= ProcessingState.ProcessingUpdate node.set_processing_state(1) node.set_progress(widget.progressBarValue) # Install a help shortcut on the widget help_action = widget.findChild(QAction, "action-help") if help_action is not None: help_action.setEnabled(True) help_action.setVisible(True) help_action.triggered.connect(self.__on_help_request) widget.setWindowIcon(icon_loader.from_description(desc).get(desc.icon)) widget.setCaption(node.title) # befriend class Report widget._Report__report_view = self.scheme().report_view # Schedule an update with the signal manager, due to the cleared # implicit Initializing flag self.signal_manager()._update() return widget
def create_widget_instance(self, node): """ Create a OWWidget instance for the node. """ desc = node.description klass = name_lookup(desc.qualified_name) log.info("Creating %r instance.", klass) widget = klass.__new__(klass, None, signal_manager=self.signal_manager(), stored_settings=node.properties) # Init the node/widget mapping and state before calling __init__ # Some OWWidgets might already send data in the constructor # (should this be forbidden? Raise a warning?) triggering the signal # manager which would request the widget => node mapping or state self.__widget_for_node[node] = widget self.__node_for_widget[widget] = node self.__widget_processing_state[widget] = 0 widget.__init__() widget.setCaption(node.title) widget.widgetInfo = desc widget.setWindowIcon(icon_loader.from_description(desc).get(desc.icon)) widget.setVisible(node.properties.get("visible", False)) node.title_changed.connect(widget.setCaption) # Widget's info/warning/error messages. widget.widgetStateChanged.connect(self.__on_widget_state_changed) # Widget's statusTip node.set_status_message(widget.statusMessage()) widget.statusMessageChanged.connect(node.set_status_message) # Widget's progress bar value state. widget.progressBarValueChanged.connect(node.set_progress) # Widget processing state (progressBarInit/Finished) # and the blocking state. widget.processingStateChanged.connect(self.__on_processing_state_changed) widget.blockingStateChanged.connect(self.__on_blocking_state_changed) if widget.isBlocking(): # A widget can already enter blocking state in __init__ self.__widget_processing_state[widget] |= self.BlockingUpdate if widget.processingState != 0: # It can also start processing (initialization of resources, ...) self.__widget_processing_state[widget] |= self.ProcessingUpdate node.set_processing_state(1) node.set_progress(widget.progressBarValue) # Install a help shortcut on the widget help_shortcut = QShortcut(QKeySequence("F1"), widget) help_shortcut.activated.connect(self.__on_help_request) # Up shortcut (activate/open parent) up_shortcut = QShortcut(QKeySequence(Qt.ControlModifier + Qt.Key_Up), widget) up_shortcut.activated.connect(self.__on_activate_parent) owactions = [action for action in widget.actions() if isinstance(action, OWAction)] node.setProperty("ext-menu-actions", owactions) return widget
def create_widget_instance(self, node): # type: (SchemeNode) -> OWBaseWidget """ Create a OWBaseWidget instance for the node. """ desc = node.description # type: WidgetDescription signal_manager = self.signal_manager() # Setup mapping for possible reentry via signal manager in widget's # __init__ item = Item(node, None, ProcessingState.Initializing) self.__item_for_node[node] = item try: # Lookup implementation class klass = name_lookup(desc.qualified_name) log.info("WidgetManager: Creating '%s.%s' instance '%s'.", klass.__module__, klass.__name__, node.title) item.widget = widget = klass.__new__( klass, None, captionTitle=node.title, signal_manager=signal_manager, stored_settings=copy.deepcopy(node.properties), # NOTE: env is a view of the real env and reflects # changes to the environment. env=self.scheme().runtime_env() ) widget.__init__() except BaseException: item.widget = None raise finally: # Clear Initializing flag even in case of error item.state &= ~ProcessingState.Initializing # bind the OWBaseWidget to the node node.title_changed.connect(widget.setCaption) # Widget's info/warning/error messages. self.__initialize_widget_messages(node, widget) widget.messageActivated.connect(self.__on_widget_message_changed) widget.messageDeactivated.connect(self.__on_widget_message_changed) # Widget's statusMessage node.set_status_message(widget.statusMessage()) widget.statusMessageChanged.connect(node.set_status_message) # OWBaseWidget's progress bar state (progressBarInit/Finished,Set) widget.progressBarValueChanged.connect(node.set_progress) widget.processingStateChanged.connect( self.__on_widget_state_changed ) # Advertised state for the workflow execution semantics. widget.widgetStateChanged.connect(self.__on_widget_state_changed) # Install a help shortcut on the widget help_action = widget.findChild(QAction, "action-help") if help_action is not None: help_action.setEnabled(True) help_action.setVisible(True) help_action.triggered.connect(self.__on_help_request) widget.setWindowIcon( icon_loader.from_description(desc).get(desc.icon) ) widget.setCaption(node.title) # befriend class Report widget._Report__report_view = self.scheme().report_view self.__update_item(item) # Added by Jean 2020/01/10, bind the passed in table to the OWDataTable widget # import the orange table passed in from Orange.canvas.__main__ # and set the dataset to it for data table widget passed in from Spyder from Orange.canvas.__main__ import init_tables isSpyder = desc.name[:11] # only data table passed in from Spyder is initialized if isSpyder == "FromSpyder-" and \ desc.qualified_name == "Orange.widgets.data.owtable.OWDataTable" and\ init_tables is not None: wtable = None for table in init_tables: name = "FromSpyder-"+table.name if name == desc.name: wtable = table break if wtable is not None: widget.set_dataset(wtable) log.info("Data bind to the data table widget: ", desc.name) return widget