From d6ac86bfcc9d386c42796dbba5c000c67aab124e Mon Sep 17 00:00:00 2001 From: stalbe_j Date: Fri, 12 May 2023 09:05:06 +0200 Subject: [PATCH] get list names, thoughts about multiplotting --- grum/mainwin.py | 108 +++++++++++++++++++++++++++++++---------------- grum/plotdesc.py | 4 +- 2 files changed, 74 insertions(+), 38 deletions(-) diff --git a/grum/mainwin.py b/grum/mainwin.py index c111796..b7c1c48 100644 --- a/grum/mainwin.py +++ b/grum/mainwin.py @@ -14,17 +14,16 @@ from .plotdesc import PlotDescription from .imgdesc import ImageDescription from .rpc import RPCServerThread from .shortcut import shortcut -# from .webview import WebView # doesnt work for CSAXS version of pyqtWebEngine +# from .webview import WebView # doesnt work for CSAXS version of pyqtWebEngine class MainWindow(QMainWindow): - sig_make_new_plot = pyqtSignal(str, PlotDescription) + sig_make_new_plot = pyqtSignal(str, PlotDescription) sig_make_new_image = pyqtSignal(str, ImageDescription) def __init__(self, *args, title="grum", host="localhost", port=8000, offline=False, add_examples=False, window_mode=MDIWindowMode.MULTI, **kwargs): super().__init__(*args, **kwargs) - if offline: title = f"{title} (offline)" @@ -33,7 +32,7 @@ class MainWindow(QMainWindow): self.setWindowIcon(assets.icon()) url = f"http://{host}:{port}/" - # self.webdoc = WebView(url, title=title) # doesnt work for CSAXS version of pyqtWebEngine + # self.webdoc = WebView(url, title=title) # doesnt work for CSAXS version of pyqtWebEngine self.lst = lst = DictList() lst.setAlternatingRowColors(True) @@ -46,16 +45,21 @@ class MainWindow(QMainWindow): lst_menu.addSeparator() lst_menu.addAction("Plot selected", self.on_plot_selected) lst_menu.addSeparator() - lst_menu.addAction("Mark selected as seen", self.on_mark_selected_as_seen) - lst_menu.addAction("Mark selected as not seen", self.on_mark_selected_as_not_seen) + lst_menu.addAction("Mark selected as seen", + self.on_mark_selected_as_seen) + lst_menu.addAction("Mark selected as not seen", + self.on_mark_selected_as_not_seen) lst_menu.addSeparator() sort_group = lst_menu.addGroup() - sort_group.addCheckbox("Sort by insertion order", triggered=self.on_sort_by_insertion_order, state=True) + sort_group.addCheckbox( + "Sort by insertion order", triggered=self.on_sort_by_insertion_order, state=True) sort_group.addCheckbox("Sort by name", triggered=self.on_sort_by_name) - sort_group.addCheckbox("Sort by timestamp", triggered=self.on_sort_by_timestamp) - sort_group.addCheckbox("Sorting disabled", triggered=self.on_sorting_disabled) + sort_group.addCheckbox("Sort by timestamp", + triggered=self.on_sort_by_timestamp) + sort_group.addCheckbox( + "Sorting disabled", triggered=self.on_sorting_disabled) - #TODO: clean up + # TODO: clean up def on_item_about_to_be_moved(): sort_group.checkboxes["Sorting disabled"].setChecked(True) self.on_sorting_disabled() @@ -75,7 +79,8 @@ class MainWindow(QMainWindow): self.menu_settings = menu = BarMenu(bar, "&Settings") menu.addCheckbox("Open new plots", state=True) menu.addSeparator() - menu.addEntrybox("Limit number of entries", placeholder="Maximum number of entries", triggered=lst.set_nkeep) + menu.addEntrybox("Limit number of entries", + placeholder="Maximum number of entries", triggered=lst.set_nkeep) self.mdi = mdi = MDIArea(bar, window_mode=window_mode) @@ -87,25 +92,28 @@ class MainWindow(QMainWindow): self.setCentralWidget(splitter) if not offline: - self.rst = rst = RPCServerThread(host, port, doc_title_suffix=title) + self.rst = rst = RPCServerThread( + host, port, doc_title_suffix=title) rst.start() rst.server.register_function(self.new_plot) rst.server.register_function(self.append_data) rst.server.register_function(self.extend_data) rst.server.register_function(self.set_data) rst.server.register_function(self.new_image) - rst.server.register_function(self.append_image_to_list) # function for CSAXS beamtime + # function for CSAXS beamtime + rst.server.register_function(self.append_image_to_list) + # new function to get list of names from current grum session + rst.server.register_function(self.get_list_names) + # rst.server.register_function(self.plot_multiple_plots) self.sig_make_new_plot.connect(self.on_make_new_plot) self.sig_make_new_image.connect(self.on_make_new_image) - def keyPressEvent(self, event): if event.key() == Qt.Key_F1: - # self.webdoc.show() # doesnt work for CSAXS version of pyqtWebEngine + # self.webdoc.show() # doesnt work for CSAXS version of pyqtWebEngine pass - # Remote API calls def new_plot(self, name, cfg): @@ -155,14 +163,15 @@ class MainWindow(QMainWindow): The configuration is forwarded to the constructor of ImageDescription. Allowed keys are: title, xlabel, ylabel, image. """ - desc = self.add_new_desc_to_list(name, cfg, Desc=ImageDescription) #TODO: clean up Desc argument + desc = self.add_new_desc_to_list( + name, cfg, Desc=ImageDescription) # TODO: clean up Desc argument if self.menu_settings.checkboxes["Open new plots"].isChecked(): sub = self.mdi.findSubWindow(name) if sub: - sub.pw.setImage(desc.data) #TODO lacks the list sync + sub.pw.setImage(desc.data) # TODO lacks the list sync vbox = sub.pw.getView() allchildren = vbox.allChildren() - for child in allchildren: + for child in allchildren: if isinstance(child, pg.LabelItem): vbox.removeItem(child) vbox.addItem(pg.LabelItem(desc.xlabel, size='50pt')) @@ -171,7 +180,41 @@ class MainWindow(QMainWindow): self.sig_make_new_image.emit(name, desc) def append_image_to_list(self, img): - desc = self.add_new_desc_to_list(img[0], img[1], Desc=ImageDescription) + desc = self.add_new_desc_to_list(img[0], img[1], Desc=ImageDescription) + + def get_list_names(self): + return [key for key in self.lst.lst.items.keys()] + + # def plot_multiple_plots(self, aa): + + # name = "plot 1" + # cfg = {"xs": [0, 1], "ys": [3, 7]} + # desc = self.add_new_desc_to_list(name, cfg) + # name = "plot 2" + # cfg = {"xs": [0, 3], "ys": [2,0]} + # desc2 = self.add_new_desc_to_list(name, cfg) + # items = [self.lst.get("plot 1"), self.lst.get("plot 2")] + # self.plot_multiple_items(items) + + + # descs = {i.name: i for i in items} + # names = descs.keys() + # name = " | ".join(names) + + # self.activate_or_make_subwin(MDISubMultiPlot, name, descs) + + # if self.menu_settings.checkboxes["Open new plots"].isChecked(): + # if not self.mdi.findSubWindow(name): + # self.sig_make_new_plot.emit(name, desc) + + # self.make_subwin(MDISubMultiPlot, name, **descs) + # if not self.mdi.findSubWindow(name): + # sub = MDISubMultiPlot(name, descs) + # print("multi name", name) + # print("multi descs", descs, *descs) + # print("MULTI sub", sub) + # print("multi mdi", self.mdi) + # self.mdi.add(sub) # Signal callbacks @@ -191,19 +234,18 @@ class MainWindow(QMainWindow): if len(selected) == 1: item = selected[0] self.plot_single_item(item) - elif type(selected[0].value) == ImageDescription: #TODO: what should be the typecheck? + # TODO: what should be the typecheck? + elif type(selected[0].value) == ImageDescription: self.plot_multiple_images(selected) else: self.plot_multiple_items(selected) - def on_mark_selected_as_seen(self): self.lst.set_alarm_for_selected(False) def on_mark_selected_as_not_seen(self): self.lst.set_alarm_for_selected(True) - def on_sort_by_insertion_order(self): self.lst.enable_sort_by_insertion_order() @@ -216,7 +258,6 @@ class MainWindow(QMainWindow): def on_sorting_disabled(self): self.lst.disable_sorting() - def on_file_open(self): fns = open_h5_files_dialog(self) if not fns: @@ -225,10 +266,9 @@ class MainWindow(QMainWindow): for fn in fns: data = read_dict(fn) for k, v in data.items(): - Desc = ImageDescription if "image" in v else PlotDescription #TODO + Desc = ImageDescription if "image" in v else PlotDescription # TODO self.add_new_desc_to_list(k, v, Desc=Desc) - def on_file_save(self): fn = save_h5_file_dialog(self) if not fn: @@ -241,10 +281,9 @@ class MainWindow(QMainWindow): write_dict(fn, data) - # Plumbing - def add_new_desc_to_list(self, name, cfg, Desc=PlotDescription): #TODO + def add_new_desc_to_list(self, name, cfg, Desc=PlotDescription): # TODO desc = Desc(name, **cfg) self.lst.set(name, desc) return desc @@ -264,7 +303,8 @@ class MainWindow(QMainWindow): item.timestamps.access.update() item.set_alarm(False) name, desc = item.key, item.value - MDISubType = MDISubImage if isinstance(desc, ImageDescription) else MDISubPlot #TODO + MDISubType = MDISubImage if isinstance( + desc, ImageDescription) else MDISubPlot # TODO self.activate_or_make_subwin(MDISubType, name, desc) def plot_multiple_items(self, items): @@ -277,20 +317,19 @@ class MainWindow(QMainWindow): self.activate_or_make_subwin(MDISubMultiPlot, name, descs) def plot_multiple_images(self, images): - for i in images: i.timestamps.access.update() i.set_alarm(False) descs = {i.key: i.value for i in images} names = descs.keys() name = " | ".join(names) - self.activate_or_make_subwin(MDISubMultiImage, name, descs) + self.activate_or_make_subwin(MDISubMultiImage, name, descs) - #TODO: the following two could be methods to MDIArea? + # TODO: the following two could be methods to MDIArea? def activate_or_make_subwin(self, MDISubType, name, *args, **kwargs): sub = self.mdi.findSubWindow(name) - if sub: #TODO check type? what to do for mismatches? + if sub: # TODO check type? what to do for mismatches? self.mdi.setActiveSubWindow(sub) else: self.make_subwin(MDISubType, name, *args, **kwargs) @@ -298,6 +337,3 @@ class MainWindow(QMainWindow): def make_subwin(self, MDISubType, name, *args, **kwargs): sub = MDISubType(name, *args, **kwargs) self.mdi.add(sub) - - - diff --git a/grum/plotdesc.py b/grum/plotdesc.py index 29dd42c..52c4195 100644 --- a/grum/plotdesc.py +++ b/grum/plotdesc.py @@ -33,7 +33,7 @@ class PlotDescription: def make_plot(self, plotwidget, style): if self.format: - res = plot_with_format() + res = self.plot_with_format(plotwidget, style) else: res = plotwidget.plot(self.xs, self.ys, name=self.name, **style) @@ -55,7 +55,7 @@ class PlotDescription: def to_dict(self): return {k: v for k, v in self.__dict__.items() if not k.startswith("_") and k != "name" and v is not None} - def plot_with_format(): + def plot_with_format(self, plotwidget, style): if self.format == "Line": res = plotwidget.plot(self.xs, self.ys, name=self.name, pen="w") elif self.format == "Dots":