From f25b5442e76cb3f0f0eadc6145ae1f679db64472 Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Mon, 8 Feb 2016 16:26:02 +0100 Subject: [PATCH] applets: properly name docks to support state save/restore --- artiq/gui/applets.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/artiq/gui/applets.py b/artiq/gui/applets.py index 909069796..626195d87 100644 --- a/artiq/gui/applets.py +++ b/artiq/gui/applets.py @@ -54,8 +54,8 @@ class AppletIPCServer(AsyncioParentComm): class AppletDock(dockarea.Dock): - def __init__(self, name, command): - dockarea.Dock.__init__(self, "applet" + str(id(self)), # TODO + def __init__(self, uid, name, command): + dockarea.Dock.__init__(self, "applet" + str(uid), label="Applet: " + name, closable=True) self.setMinimumSize(QtCore.QSize(500, 400)) @@ -125,6 +125,7 @@ class AppletsDock(dockarea.Dock): def __init__(self, dock_area): self.dock_area = dock_area self.dock_to_checkbox = dict() + self.applet_uids = set() self.workaround_pyqtgraph_bug = False dockarea.Dock.__init__(self, "Applets") @@ -168,8 +169,8 @@ class AppletsDock(dockarea.Dock): self.table.cellChanged.connect(self.cell_changed) - def create(self, name, command): - dock = AppletDock(name, command) + def create(self, uid, name, command): + dock = AppletDock(uid, name, command) # If a dock is floated and then dock state is restored, pyqtgraph # leaves a "phantom" window open. if self.workaround_pyqtgraph_bug: @@ -192,17 +193,17 @@ class AppletsDock(dockarea.Dock): name = "" else: name = name.text() - dock = self.create(name, command) + dock = self.create(item.applet_uid, name, command) item.applet_dock = dock self.dock_to_checkbox[dock] = item else: - dock = getattr(item, "applet_dock", None) + dock = item.applet_dock if dock is not None: # This calls self.on_dock_closed dock.close() elif column == 1 or column == 2: new_value = self.table.item(row, column).text() - dock = getattr(self.table.item(row, 0), "applet_dock", None) + dock = self.table.item(row, 0).applet_dock if dock is not None: if column == 1: dock.rename(new_value) @@ -217,6 +218,10 @@ class AppletsDock(dockarea.Dock): checkbox_item.setCheckState(QtCore.Qt.Unchecked) def new(self): + uid = next(iter(set(range(len(self.applet_uids) + 1)) + - self.applet_uids)) + self.applet_uids.add(uid) + row = self.table.rowCount() self.table.insertRow(row) checkbox = QtWidgets.QTableWidgetItem() @@ -224,6 +229,8 @@ class AppletsDock(dockarea.Dock): QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) checkbox.setCheckState(QtCore.Qt.Unchecked) + checkbox.applet_uid = uid + checkbox.applet_dock = None self.table.setItem(row, 0, checkbox) self.table.setItem(row, 1, QtWidgets.QTableWidgetItem()) self.table.setItem(row, 2, QtWidgets.QTableWidgetItem()) @@ -237,7 +244,7 @@ class AppletsDock(dockarea.Dock): selection = self.table.selectedRanges() if selection: row = selection[0].topRow() - dock = getattr(self.table.item(row, 0), "applet_dock", None) + dock = self.table.item(row, 0).applet_dock if dock is not None: asyncio.ensure_future(dock.restart()) @@ -245,15 +252,18 @@ class AppletsDock(dockarea.Dock): selection = self.table.selectedRanges() if selection: row = selection[0].topRow() - dock = getattr(self.table.item(row, 0), "applet_dock", None) + item = self.table.item(row, 0) + dock = item.applet_dock if dock is not None: # This calls self.on_dock_closed dock.close() + self.applet_uids.remove(item.applet_uid) self.table.removeRow(row) + async def stop(self): for row in range(self.table.rowCount()): - dock = getattr(self.table.item(row, 0), "applet_dock", None) + dock = self.table.item(row, 0).applet_dock if dock is not None: await dock.terminate()