1919
2020from inspect import signature
2121
22- from PyQt5 import QtCore , QtWidgets
23- from PyQt5 .QtQuick import QQuickView , QQuickItem # type: ignore
22+ from PyQt5 .QtQuick import QQuickItem # type: ignore
2423from PyQt5 .QtQml import QQmlComponent
25- from PyQt5 .QtQuickWidgets import QQuickWidget
2624from PyQt5 .QtGui import QFontDatabase
27- from PyQt5 .QtCore import QEvent , QObject
28- from PyQt5 .QtWidgets import QWidget
25+ from PyQt5 .QtCore import QObject , QSettings
2926
3027from friture .qml_tools import component_raise_if_error , qml_url
3128from friture .widgetdict import getWidgetById , widgetIds
3835 from PyQt5 .QtQml import QQmlEngine
3936
4037
41- class Dock (QtWidgets . QWidget ):
38+ class Dock (QObject ):
4239
4340 def __init__ (
4441 self ,
@@ -54,9 +51,6 @@ def __init__(
5451
5552 self .setObjectName (name )
5653
57- self .vbox = QtWidgets .QVBoxLayout (self )
58- self .vbox .setContentsMargins (0 , 0 , 0 , 0 )
59-
6054 self .qml_engine = qml_engine
6155
6256 self .controlbar_viewmodel = ControlBarViewModel (self )
@@ -67,14 +61,15 @@ def __init__(
6761 self .controlbar_viewmodel .moveNextClicked .connect (self .moveNext )
6862 self .controlbar_viewmodel .closeClicked .connect (self .closeClicked )
6963
70- self .dockQuickWidget = QQuickWidget (self .qml_engine , self )
71- self .dockQuickWidget .setObjectName ("dockQuickWidget" )
72- self .dockQuickWidget .setSizePolicy (QtWidgets .QSizePolicy .Expanding , QtWidgets .QSizePolicy .Expanding )
73- self .dockQuickWidget .setResizeMode (QQuickWidget .SizeRootObjectToView )
74- self .dockQuickWidget .setSource (qml_url ("Dock.qml" ))
75- self .vbox .addWidget (self .dockQuickWidget )
64+ dock_component = QQmlComponent (self .qml_engine )
65+ dock_component .loadUrl (qml_url ("Dock.qml" ))
66+
67+ component_raise_if_error (dock_component )
7668
77- dock_root = self .dockQuickWidget .rootObject ()
69+ context = self .qml_engine .rootContext ()
70+ self .dock_qml = dock_component .createWithInitialProperties ({}, context )
71+ self .dock_qml .setParent (self .qml_engine )
72+ self .dock_qml .setParentItem (self .parent ().main_grid_layout ) # type: ignore
7873
7974 initialProperties = {"viewModel" : self .controlbar_viewmodel }
8075 component = QQmlComponent (self .qml_engine )
@@ -86,10 +81,12 @@ def __init__(
8681 control_bar_qml = component .createWithInitialProperties (initialProperties , controlbar_context )
8782 control_bar_qml .setParent (self .qml_engine )
8883
89- control_bar_container = dock_root .findChild (QObject , "control_bar_container" )
84+ control_bar_container = self .dock_qml .findChild (QObject , "control_bar_container" )
85+ assert control_bar_container is not None , "Control bar container not found in Dock.qml"
9086 control_bar_qml .setParentItem (control_bar_container ) # type: ignore
9187
92- self .audio_widget_container = dock_root .findChild (QObject , "audio_widget_container" )
88+ self .audio_widget_container = self .dock_qml .findChild (QObject , "audio_widget_container" )
89+ assert self .audio_widget_container is not None , "Audio widget container not found in Dock.qml"
9390
9491 self .widgetId : Optional [int ] = None
9592 self .audiowidget : Optional [QObject ] = None
@@ -100,10 +97,15 @@ def __init__(
10097
10198 self .widget_select (widgetId )
10299
103- # note that by default the closeEvent is accepted, no need to do it explicitely
104- def closeEvent (self , event ):
100+ def closeClicked (self ):
105101 self .dockmanager .close_dock (self )
106102
103+ def cleanup (self ):
104+ if self .dock_qml is not None :
105+ self .dock_qml .setParentItem (None ) # type: ignore
106+ self .dock_qml .deleteLater ()
107+ self .dock_qml = None
108+
107109 if self .audio_widget_qml is not None :
108110 self .audio_widget_qml .setParentItem (None ) # type: ignore
109111 self .audio_widget_qml .deleteLater ()
@@ -115,33 +117,11 @@ def closeEvent(self, event):
115117 self .audiowidget .deleteLater ()
116118 self .audiowidget = None
117119
118- def closeClicked (self ):
119- self .close ()
120-
121120 def movePrevious (self ):
122- layout = self .parent ().parent ().centralLayout
123- itemList = layout .itemList
124-
125- for i , item in enumerate (itemList ):
126- if item .widget () is self :
127- if i > 0 and i < len (itemList ):
128- itemList .insert (i - 1 , itemList .pop (i ))
129- self .dockmanager .docks .insert (i - 1 , self .dockmanager .docks .pop (i ))
130- layout .update ()
131-
132- break
121+ self .dockmanager .movePrevious (self )
133122
134123 def moveNext (self ):
135- layout = self .parent ().parent ().centralLayout
136- itemList = layout .itemList
137-
138- for i , item in enumerate (itemList ):
139- if item .widget () is self :
140- if i >= 0 and i < len (itemList )- 1 :
141- itemList .insert (i + 1 , itemList .pop (i ))
142- self .dockmanager .docks .insert (i + 1 , self .dockmanager .docks .pop (i ))
143- layout .update ()
144- break
124+ self .dockmanager .moveNext (self )
145125
146126 # slot
147127 def indexChanged (self , index ):
@@ -161,7 +141,7 @@ def widget_select(self, widgetId: int) -> None:
161141 self .audio_widget_qml = None
162142
163143 if self .audiowidget is not None :
164- settings = QtCore . QSettings ()
144+ settings = QSettings ()
165145 self .audiowidget .saveState (settings ) # type: ignore
166146 assert self .widgetId is not None
167147 self .dockmanager .last_settings [self .widgetId ] = settings
@@ -181,7 +161,7 @@ def widget_select(self, widgetId: int) -> None:
181161 if len (signature (constructor ).parameters ) == 2 :
182162 self .audiowidget = constructor (self , self .qml_engine )
183163 else :
184- self .audiowidget = constructor (self )
164+ self .audiowidget = constructor (self . parent () )
185165 assert self .audiowidget is not None # mypy can't prove this :(
186166
187167 initialProperties = {
@@ -218,7 +198,7 @@ def on_status_changed(self, status):
218198 self .logger .error ("QML error: " + error .toString ())
219199
220200 def canvasUpdate (self ):
221- if self .audiowidget is not None and self . isVisible () :
201+ if self .audiowidget is not None :
222202 self .audiowidget .canvasUpdate ()
223203
224204
@@ -237,7 +217,8 @@ def settings_slot(self, checked):
237217 # method
238218 def saveState (self , settings ):
239219 settings .setValue ("type" , self .widgetId )
240- self .audiowidget .saveState (settings )
220+ if self .audiowidget is not None :
221+ self .audiowidget .saveState (settings )
241222
242223 # method
243224 def restoreState (self , settings ):
0 commit comments