From 6b17fe2dcc6bd51c511b33b3d85b736428aeb781 Mon Sep 17 00:00:00 2001 From: Nils <> Date: Mon, 20 Apr 2020 16:03:31 +0200 Subject: [PATCH] Remove hacky icon overlay. It crashes with Qt themes --- qtgui/quickopensessioncontroller.py | 61 +++++++++++++++-------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/qtgui/quickopensessioncontroller.py b/qtgui/quickopensessioncontroller.py index ceed267..2ec0b92 100644 --- a/qtgui/quickopensessioncontroller.py +++ b/qtgui/quickopensessioncontroller.py @@ -103,76 +103,79 @@ class StarterClientItem(QtWidgets.QListWidgetItem): self.nsmClientDict = clientDict #for comparison with later status changes. Especially for stopped clients. if clientDict is None: self.removed() - else: + else: getattr(self, clientDict["lastStatus"], nothing)() def _setIconOverlay(self, status:str): """https://doc.qt.io/qt-5/qstyle.html#StandardPixmap-enum""" + #TODO: this crashes with certain Qt Themes. It was a hack anyway. Use our own graphical overlays instead. That is prettier and works. + return True + standardPixmap, enabled, removeAlpha = { - "removed":(QtWidgets.QStyle.SP_TrashIcon, False, True), - "stopped":(QtWidgets.QStyle.SP_BrowserStop, False, False), - "ready": (None, True, False), - "hidden":(QtWidgets.QStyle.SP_TitleBarMaxButton, True, True), + "removed":(QtWidgets.QStyle.SP_TrashIcon, False, True), + "stopped":(QtWidgets.QStyle.SP_BrowserStop, False, False), + "ready": (None, True, False), + "hidden":(QtWidgets.QStyle.SP_TitleBarMaxButton, True, True), }[status] - if standardPixmap: - overlayPixmap = self.parentController.listWidget.style().standardPixmap(standardPixmap) + if standardPixmap: + overlayPixmap = self.parentController.listWidget.style().standardPixmap(standardPixmap) if removeAlpha: - whiteBg = QtGui.QPixmap(overlayPixmap.size()) + whiteBg = QtGui.QPixmap(overlayPixmap.size()) whiteBg.fill(QtGui.QColor(255,255,255,255)) #red - + icon = self.parentController.mainWindow.programIcons[self.argodejoExec] if enabled: pixmap = icon.pixmap(QtCore.QSize(70,70)) else: pixmap = icon.pixmap(QtCore.QSize(70,70), QtGui.QIcon.Disabled) - + p = QtGui.QPainter(pixmap) if removeAlpha: p.drawPixmap(0, 0, whiteBg) - p.drawPixmap(0, 0, overlayPixmap) + p.drawPixmap(0, 0, overlayPixmap) p.end() ico = QtGui.QIcon(pixmap) - else: + else: ico = self.parentController.mainWindow.programIcons[self.argodejoExec] - self.setIcon(ico) + self.setIcon(ico) #Status def ready(self): if self.nsmClientDict["hasOptionalGUI"]: if self.nsmClientDict["visible"]: self._setIconOverlay("ready") - else: - self._setIconOverlay("hidden") + else: + self._setIconOverlay("hidden") else: self._setIconOverlay("ready") - - + + self.setFlags(QtCore.Qt.ItemIsEnabled) #We can still mouseClick through parent signal when set to NoItemFlags def removed(self): - self.setFlags(QtCore.Qt.NoItemFlags) #We can still mouseClick through parent signal when set to NoItemFlags + self.setFlags(QtCore.Qt.NoItemFlags) #We can still mouseClick through parent signal when set to NoItemFlags self.nsmClientDict = None #in opposite to stop def stopped(self): self.setFlags(QtCore.Qt.ItemIsEnabled) - self._setIconOverlay("stopped") + self._setIconOverlay("stopped") - def handleClick(self): + def handleClick(self): alreadyInSession = api.executableInSession(self.argodejoExec) #Development-paranoia Start if self.nsmClientDict: - assert alreadyInSession - elif alreadyInSession: + assert alreadyInSession + elif alreadyInSession: assert self.nsmClientDict #Development-paranoia End - + if not alreadyInSession: api.clientAdd(self.argodejoExec) #triggers status update callback which activates our item. elif self.nsmClientDict["lastStatus"] == "stopped": - api.clientResume(self.nsmClientDict["clientId"]) + api.clientResume(self.nsmClientDict["clientId"]) else: api.clientToggleVisible(self.nsmClientDict["clientId"]) #api is tolerant to sending this to non-optional-GUI clients @@ -292,7 +295,7 @@ class QuickOpenSessionController(object): del item #old: rebuild from scratch - """ + """ self.listWidget.clear() StarterClientItem.allItems.clear() whitelist = [e for e in api.getSystemPrograms() if e["whitelist"]] @@ -302,7 +305,7 @@ class QuickOpenSessionController(object): self.listWidget.addItem(item) StarterClientItem.allItems[entry["argodejoExec"]] = item """ - + def _clientStatusChanged(self, clientDict:dict): """Maps to nsmd status changes. We already have icons for all programs, in opposite to detailed-view opensession controller. @@ -311,11 +314,11 @@ class QuickOpenSessionController(object): """ #index = self.listWidget.indexFromItem(QuickClientItem.allItems[clientId]).row() #Row is the real index in a listView, no matter iconViewMode. if clientDict["dumbClient"]: - #This includes the initial loading of nsm-clients. + #This includes the initial loading of nsm-clients. return backgroundClients = METADATA["preferredClients"].values() - if clientDict["executable"] in backgroundClients: - return + if clientDict["executable"] in backgroundClients: + return if clientDict["executable"] in StarterClientItem.allItems: item = StarterClientItem.allItems[clientDict["executable"]]