44
55DOCKER_TITLE = 'Plugin Developer Tools'
66
7+
8+ class PluginDevToolsDialog (QMainWindow ):
9+ signal_closed = pyqtSignal ()
10+ def __init__ (self , parent = None ):
11+ super ().__init__ (parent )
12+ self .setWindowTitle (DOCKER_TITLE )
13+
14+ def updateWindowTitle (self ):
15+ if isinstance (self .parentWidget (), QWidget ):
16+ self .setObjectName ("PluginDevToolsDialog_" + self .parentWidget ().objectName ())
17+ if self .parentWidget ().windowTitle ().__len__ () == 0 :
18+ self .setWindowTitle (DOCKER_TITLE )
19+ else :
20+ self .setWindowTitle (self .parentWidget ().windowTitle () + ' - ' + DOCKER_TITLE )
21+
22+ def closeEvent (self , event : QtGui .QCloseEvent ):
23+ self .signal_closed .emit ()
24+ return super ().closeEvent (event )
25+
26+
27+
728class PluginDevToolsDocker (DockWidget ):
829 signal_leaveFloating = pyqtSignal ()
930 signal_manualOpenDocker = pyqtSignal ()
1031 def __init__ (self ):
1132 super ().__init__ ()
1233 self .setWindowTitle (DOCKER_TITLE )
1334 self .titleBarEventListening = False
35+ self .installEventFilter (self )
36+ # Prepare a standalone window
37+ self .floatModeDialog = PluginDevToolsDialog (self .parent ())
38+ # Prepare content widget. This widget will be added into docker itself or self.floatModeDialog. Only keep one instance.
39+ self .centralWidget = PluginDevToolsWidget ()
40+ self .mutex = QMutex ()
41+ # Status route: modeAllHide <--> modeDocker <--> modeDialog
42+ self .floatModeDialog .signal_closed .connect (lambda : self .applyDockerMode ('dialog.signal_closed' ))
43+ self .signal_leaveFloating .connect (lambda : self .applyDialogMode ('docker.signal_leaveFloating' ))
44+ self .signal_manualOpenDocker .connect (lambda : self .applyDockerMode ('docker.signal_manualOpenDocker' ))
1445
1546 def canvasChanged (self , canvas ):
1647 pass
@@ -37,12 +68,81 @@ def showEvent(self, event: QtGui.QShowEvent) -> None:
3768 self .signal_leaveFloating .emit ()
3869 return super ().showEvent (event )
3970
71+ def changeEvent (self , event : QtCore .QEvent ) -> None :
72+ if event .type () == QEvent .Type .ParentChange :
73+ if isinstance (self .parentWidget (), QWidget ):
74+ self .floatModeDialog .setParent (self .parentWidget ())
75+ # Always reset window type after manually setParent
76+ self .floatModeDialog .setWindowFlag (Qt .WindowType .Window )
77+ self .parentWidget ().windowTitleChanged .connect (self .floatModeDialog .updateWindowTitle )
78+
79+ return super ().changeEvent (event )
80+
4081
4182 def eventFilter (self , obj : QObject , event : QEvent ) -> bool :
4283 if obj is self .titleBarWidget ():
4384 if event .type () == QEvent .Type .MouseButtonDblClick :
4485 if not self .isFloating ():
4586 self .signal_leaveFloating .emit ()
4687 return True
88+
4789 return super ().eventFilter (obj , event )
4890
91+
92+ def setFirstAfterStart (self ):
93+ # Initialize the first status after start Krita
94+ if self .isFloating ():
95+ self .applyDialogMode ('initiallize' )
96+ elif self .isVisible ():
97+ self .applyDockerMode ('initiallize' )
98+ else :
99+ self .applyHideMode ('initiallize' )
100+
101+
102+ def applyHideMode (self , senderName = str ()):
103+ if self .mutex .tryLock () == False :
104+ #print('skipped applyHideMode')
105+ #print(' mutex.tryLock()= ', False)
106+ #print(' sender= ', senderName)
107+ #print('')
108+ return
109+ self .setFloating (False )
110+ self .setWidget (self .centralWidget )
111+ self .close ()
112+ self .floatModeDialog .close ()
113+ self .mutex .unlock ()
114+
115+
116+ def applyDockerMode (self , senderName = str ()):
117+ if self .mutex .tryLock () == False :
118+ #print('skipped applyDockerMode')
119+ #print(' mutex.tryLock()= ', False)
120+ #print(' sender= ', senderName)
121+ #print('')
122+ return
123+ self .setFloating (False )
124+ self .setWidget (self .centralWidget )
125+ self .show ()
126+ self .floatModeDialog .close ()
127+ self .mutex .unlock ()
128+
129+
130+ def applyDialogMode (self , senderName = str ()):
131+ if self .mutex .tryLock () == False :
132+ #print('skipped applyDialogMode')
133+ #print(' mutex.tryLock()= ', False)
134+ #print(' sender= ', senderName)
135+ #print('')
136+ return
137+ self .setFloating (False )
138+ self .close ()
139+ self .floatModeDialog .setCentralWidget (self .centralWidget )
140+ self .floatModeDialog .show ()
141+ self .floatModeDialog .activateWindow ()
142+ newWidth = self .floatModeDialog .size ().width ()
143+ newPoint = QCursor .pos ()
144+ newPoint .setX (newPoint .x ()- int (newWidth / 2 ))
145+ self .floatModeDialog .move (self .floatModeDialog .mapFrom (self .floatModeDialog , newPoint ))
146+ self .mutex .unlock ()
147+
148+
0 commit comments