class ExampleApp: """ A user-facing model composed with a Qt widget and window. A key point here is that the model `searches` is public and can be manipuated from a console, but the view `_window` and all Qt-related components are private. The public `show()` and `close()` methods are the only view-specific actions that are exposed to the user. Thus, this could be implemented in another UI framework with no change to the user-facing programmatic interface. """ def __init__(self, *, show=True, title="Example App"): super().__init__() self.title = title self.searches = SearchListWithButton() widget = QtSearchListWithButton(self.searches) self._window = Window(widget, show=show) # Initialize with a two search tabs: one with some generated example data... self.searches.append(Search(get_catalog(), columns=columns)) # ...and one listing any and all catalogs discovered on the system. from databroker import catalog self.searches.append(Search(catalog, columns=columns)) def show(self): """Resize, show, and raise the window.""" self._window.show() def close(self): """Close the window.""" self._window.close()
class Viewer(ViewerModel): """ This extends the model by attaching a Qt Window as its view. This object is meant to be exposed to the user in an interactive console. """ def __init__(self, *, show=True, title="Demo App"): # TODO Where does title thread through? super().__init__() if SETTINGS.subscribe_to: from bluesky_widgets.qt.zmq_dispatcher import RemoteDispatcher from bluesky_widgets.utils.streaming import ( stream_documents_into_runs, ) for address in SETTINGS.subscribe_to: dispatcher = RemoteDispatcher(address) dispatcher.subscribe(stream_documents_into_runs(self.auto_plot_builder.add_run)) dispatcher.start() widget = QtViewer(self) self._window = Window(widget, show=show) @property def window(self): return self._window def show(self): """Resize, show, and raise the window.""" self._window.show() def close(self): """Close the window.""" self._window.close()
class Searches(SearchList): """ A user-facing model composed with a Qt widget and window. """ def __init__(self, *, show=True, title=""): super().__init__() self.title = title widget = SearchesWidget(self) self.window = Window(widget, show=show) # Initialize with a two search tabs: one with some generated example data... self.append(Search(get_catalog(), columns=columns)) # ...and one listing any and all catalogs discovered on the system. from databroker import catalog self.append(Search(catalog, columns=columns)) def show(self): """Resize, show, and raise the window.""" self.window.show() def close(self): """Close the window.""" self.window.close()
def __init__(self, *, show=True, title=""): super().__init__() self.title = title # You can set your own catalog/run here or use this synthetic data. self._run = get_catalog()[-1] widget = QtTreeView(self, self._run) self.window = Window(widget, show=show)
def __init__(self, *, show=True, title=""): super().__init__() self.title = title widget = SearchesWidget(self) self.window = Window(widget, show=show) # Initialize with a two search tabs: one with some generated example data... self.append(Search(get_catalog(), columns=columns)) # ...and one listing any and all catalogs discovered on the system. from databroker import catalog self.append(Search(catalog, columns=columns))
class Viewer(ViewerModel): """ This extends the model by attaching a Qt Window as its view. This object is meant to be exposed to the user in an interactive console. """ def __init__(self, *, show=True, title="Demo App"): # TODO Where does title thread through? super().__init__() self._widget = QtViewer(self) self._window = Window(self._widget, show=show) menu_bar = self._window._qt_window.menuBar() menu_item_control = menu_bar.addMenu("Control Actions") self.action_activate_env_destroy = QAction( "Activate 'Destroy Environment'", self._window._qt_window) self.action_activate_env_destroy.setCheckable(True) self._update_action_env_destroy_state() self.action_activate_env_destroy.triggered.connect( self._activate_env_destroy_triggered) menu_item_control.addAction(self.action_activate_env_destroy) self._widget.model.run_engine.events.status_changed.connect( self.on_update_widgets) def _update_action_env_destroy_state(self): env_destroy_activated = self._widget.model.run_engine.env_destroy_activated self.action_activate_env_destroy.setChecked(env_destroy_activated) def _activate_env_destroy_triggered(self): env_destroy_activated = self._widget.model.run_engine.env_destroy_activated self._widget.model.run_engine.activate_env_destroy( not env_destroy_activated) def on_update_widgets(self, event): self._update_action_env_destroy_state() @property def window(self): return self._window def show(self): """Resize, show, and raise the window.""" self._window.show() def close(self): """Close the window.""" self._window.close()
def __init__(self, *, show=True, title="Demo App"): # TODO Where does title thread through? super().__init__() if SETTINGS.subscribe_to: from bluesky_widgets.qt.zmq_dispatcher import RemoteDispatcher from bluesky_widgets.utils.streaming import ( stream_documents_into_runs, ) for address in SETTINGS.subscribe_to: dispatcher = RemoteDispatcher(address) dispatcher.subscribe(stream_documents_into_runs(self.auto_plot_builder.add_run)) dispatcher.start() widget = QtViewer(self) self._window = Window(widget, show=show)
def __init__(self, *, show=True, title="Example App"): super().__init__() self.title = title self.searches = SearchListWithButton() self.viewer = AutoLines(max_runs=3) self.model = SearchAndView(self.searches, self.viewer) widget = QtSearchAndView(self.model) self._window = Window(widget, show=show) # Initialize with a two search tabs: one with some generated example data... self.searches.append(Search(get_catalog(), columns=columns)) # ...and one listing any and all catalogs discovered on the system. from databroker import catalog self.model.searches.append(Search(catalog, columns=columns))
class RunTree(RunTree): """ A user-facing model extended with a Qt widget and window. """ def __init__(self, run=None, *, show=True, title="Bluesky run tree"): super().__init__(run=run) self.title = title widget = QtTreeView(self) self._window = Window(widget, show=show) def show(self): """Resize, show, and raise the window.""" self._window.show() def close(self): """Close the window.""" self._window.close()
def __init__(self, *, show=True, title="Demo App"): # TODO Where does title thread through? super().__init__() self._widget = QtViewer(self) self._window = Window(self._widget, show=show) menu_bar = self._window._qt_window.menuBar() menu_item_control = menu_bar.addMenu("Control Actions") self.action_activate_env_destroy = QAction( "Activate 'Destroy Environment'", self._window._qt_window) self.action_activate_env_destroy.setCheckable(True) self._update_action_env_destroy_state() self.action_activate_env_destroy.triggered.connect( self._activate_env_destroy_triggered) menu_item_control.addAction(self.action_activate_env_destroy) self._widget.model.run_engine.events.status_changed.connect( self.on_update_widgets)
class Views(QWidget): """ A user-facing model composed with a Qt widget and window. """ def __init__(self, *, show=True, title=""): super().__init__() self.title = title # You can set your own catalog/run here or use this synthetic data. self._run = get_catalog()[-1] widget = QtTreeView(self, self._run) self.window = Window(widget, show=show) def show(self): """Resize, show, and raise the window.""" self.window.show() def close(self): """Close the window.""" self.window.close()
def __init__(self, run=None, *, show=True, title="Bluesky run tree"): super().__init__(run=run) self.title = title widget = QtTreeView(self) self._window = Window(widget, show=show)