Skip to content

Commit 705ec21

Browse files
committed
fix plugin initialize when open multiple windows
1 parent e4cd09e commit 705ec21

File tree

5 files changed

+121
-146
lines changed

5 files changed

+121
-146
lines changed

plugindevtools/PluginDevTools/PluginDevToolsDialog.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

plugindevtools/PluginDevTools/PluginDevToolsDocker.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,44 @@
44

55
DOCKER_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+
728
class 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+

plugindevtools/PluginDevTools/PluginDevToolsExtension.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def createActions(self, window: Window):
3737
def dynamicAddEntry(self, *args):
3838
# Only for debug
3939
# How to use in console:
40-
#debugentry = next((w for w in Krita.instance().extensions() if str(type(w)).__contains__('PluginDevToolsDebugEntry')), None)
40+
#debugentry = next((w for w in Krita.instance().extensions() if str(type(w)).__contains__('PluginDevToolsTestExtension')), None)
4141
#print(vars(debugentry))
4242
# then use debugentry.yourVariable to access yourVariable
4343
frame = inspect.currentframe()
@@ -53,12 +53,17 @@ def dynamicAddEntry(self, *args):
5353
for name, value in zip(args_name, args):
5454
setattr(self, name, value)
5555

56-
def dynamicCreateAction(self, connectObject, window: Window, id_text: str, displayName: str = str(), addToMenu=False) ->QAction:
57-
action = window.createAction(id_text, displayName)
58-
action.triggered.connect(connectObject)
59-
if addToMenu:
60-
self.menu.addAction(action)
6156

62-
return action
57+
def dynamicCreateAction(self, connectObject, window: QObject, id_text: str, displayName: str = str(), addToMenu=False) ->QAction:
58+
if not isinstance(window, Window):
59+
print("PluginDevToolsExtension.dynamicCreateAction: {window} is not an instance of Krita.Window type. Empty QAction was returned.")
60+
return QAction()
61+
else:
62+
action = window.createAction(id_text, displayName)
63+
action.triggered.connect(connectObject)
64+
if addToMenu:
65+
self.menu.addAction(action)
66+
67+
return action
6368

6469

plugindevtools/PluginDevTools/PluginDevToolsStatusManager.py

Lines changed: 0 additions & 92 deletions
This file was deleted.
Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from krita import *
2-
from .PluginDevToolsExtension import *
3-
from .PluginDevToolsDocker import *
42
from .PluginDevToolsWidget import *
5-
from .PluginDevToolsDialog import *
6-
from .PluginDevToolsStatusManager import *
3+
from .PluginDevToolsDocker import *
4+
from .PluginDevToolsExtension import *
75

86

97
app = Krita.instance()
@@ -21,8 +19,6 @@
2119
dock_widget_factory = DockWidgetFactory(DOCKER_ID, DockWidgetFactoryBase.DockBottom, PluginDevToolsDocker)
2220
app.addDockWidgetFactory(dock_widget_factory)
2321

24-
statusManager = PluginDevToolsStatusManager('statusManager')
25-
2622
def retrieveDocker(docker_id: str)->PluginDevToolsDocker:
2723
# Only retrieve docker instance after the main window was completely created
2824
try:
@@ -40,41 +36,24 @@ def retrieveDocker(docker_id: str)->PluginDevToolsDocker:
4036

4137

4238
def setup():
43-
global statusManager
4439

4540
qwin = Krita.instance().activeWindow().qwindow()
4641

47-
4842
docker = retrieveDocker(DOCKER_ID)
49-
statusManager.setDocker(docker)
5043

51-
# Prepare a standalone window
52-
dialog = PluginDevToolsDialog(qwin)
53-
statusManager.setDialog(dialog)
54-
55-
# Prepare content widget. This widget will be added into docker or dialog. Only keep one instance.
56-
centralwidget = PluginDevToolsWidget()
57-
statusManager.setCentralWidget(centralwidget)
58-
59-
statusManager.setFirstAfterStart()
60-
61-
# Status route: modeAllHide <--> modeDocker <--> modeDialog
62-
statusManager.dialog.signal_closed.connect(lambda : statusManager.applyDockerMode('dialog.signal_closed'))
63-
statusManager.docker.signal_leaveFloating.connect(lambda : statusManager.applyDialogMode('docker.signal_leaveFloating'))
64-
statusManager.docker.signal_manualOpenDocker.connect(lambda : statusManager.applyDockerMode('docker.signal_manualOpenDocker'))
65-
44+
docker.setFirstAfterStart()
6645

6746
# Only for debug
68-
testExtension.dynamicAddEntry(DOCKER_ID, dock_widget_factory, centralwidget, dialog, docker, statusManager)
47+
testExtension.dynamicAddEntry(DOCKER_ID, dock_widget_factory, docker)
6948

7049
# Dynamically load some object into actions menu
71-
testExtension.dynamicCreateAction(statusManager.applyDockerMode, Krita.instance().activeWindow(), 'PluginDevToolsActionOpenAsDocker', 'Open as Docker', True)
72-
testExtension.dynamicCreateAction(statusManager.applyDialogMode, Krita.instance().activeWindow(), 'PluginDevToolsActionOpenAsDialog', 'Open as Dialog', True)
50+
testExtension.dynamicCreateAction(docker.applyDockerMode, Krita.instance().activeWindow(), 'PluginDevToolsActionOpenAsDocker', 'Open as Docker', True)
51+
testExtension.dynamicCreateAction(docker.applyDialogMode, Krita.instance().activeWindow(), 'PluginDevToolsActionOpenAsDialog', 'Open as Dialog', True)
7352
def toggleOnAndOff():
74-
if statusManager.docker.isVisible():
75-
statusManager.applyHideMode()
53+
if docker.isVisible():
54+
docker.applyHideMode()
7655
else:
77-
statusManager.applyDockerMode()
56+
docker.applyDockerMode()
7857
testExtension.dynamicCreateAction(toggleOnAndOff, Krita.instance().activeWindow(), 'PluginDevToolsToggleOnOff', 'Toggle On or Off')
7958

8059

@@ -84,6 +63,5 @@ def toggleOnAndOff():
8463
appNotifier = Krita.instance().notifier()
8564
appNotifier.setActive(True)
8665
appNotifier.windowCreated.connect(setup)
87-
#appNotifier.applicationClosing.connect(statusManager.saveLastBeforeExit)
8866

8967

0 commit comments

Comments
 (0)