def main(argv=None): # noqa import argparse from AnyQt.QtWidgets import QApplication app = QApplication(argv if argv is not None else []) argv = app.arguments() parser = argparse.ArgumentParser() parser.add_argument("--config", metavar="CLASSNAME", default="orangecanvas.config.default", help="The configuration namespace to use") args = parser.parse_args(argv[1:]) config_ = name_lookup(args.config) config_ = config_() config_.init() config.set_default(config_) dlg = AddonManagerDialog() dlg.start(config_) dlg.show() dlg.raise_() return app.exec()
def main(argv=None): # noqa import argparse from AnyQt.QtWidgets import QApplication app = QApplication(argv if argv is not None else []) argv = app.arguments() parser = argparse.ArgumentParser() parser.add_argument( "--config", metavar="CLASSNAME", default="orangecanvas.config.default", help="The configuration namespace to use" ) args = parser.parse_args(argv[1:]) config_ = name_lookup(args.config) config_ = config_() config_.init() config.set_default(config_) dlg = AddonManagerDialog() dlg.start(config_) dlg.show() dlg.raise_() return app.exec()
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 main(argv=None): app = QApplication(list(argv) if argv else []) argv = app.arguments() parser = argparse.ArgumentParser(description=( "Run an orange workflow without showing a GUI and exit " "when it completes.\n\n" "WARNING: This is experimental as Orange is not designed to run " "non-interactive.")) parser.add_argument("--log-level", "-l", metavar="LEVEL", type=int, default=logging.CRITICAL, dest="log_level") parser.add_argument("--config", default="Orange.canvas.config.Config", type=str) parser.add_argument("file") args = parser.parse_args(argv[1:]) log_level = args.log_level filename = args.file logging.basicConfig(level=log_level) cfg_class = utils.name_lookup(args.config) cfg: config.Config = cfg_class() config.set_default(cfg) config.init() reg = WidgetRegistry() widget_discovery = cfg.widget_discovery( reg, cached_descriptions=cache.registry_cache()) widget_discovery.run(cfg.widgets_entry_points()) model = cfg.workflow_constructor() model.set_runtime_env("basedir", os.path.abspath(os.path.dirname(filename))) sigprop = model.findChild(signalmanager.SignalManager) sigprop.pause() # Pause signal propagation during load with open(filename, "rb") as f: model.load_from(f, registry=reg) # Ensure all widgets are created (this is required for the workflow # to even start - relies to much on OWWidget behaviour). for _ in map(model.widget_for_node, model.nodes): pass sigprop.resume() # Resume inter-widget signal propagation def on_finished(): severity = 0 for node in model.nodes: for msg in node.state_messages(): if msg.contents and msg.severity == msg.Error: print(msg.contents, msg.message_id, file=sys.stderr) severity = msg.Error if severity == UserMessage.Error: app.exit(1) else: app.exit() sigprop.finished.connect(on_finished) rval = app.exec_() model.clear() # Notify the workflow model to 'close'. QApplication.sendEvent(model, QEvent(QEvent.Close)) app.processEvents() return rval
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