7
7
from PyQt5 .QtCore import (QCoreApplication , QDir , Qt , QSettings , QSignalBlocker ,
8
8
QRect , QPoint , qDebug , qInstallMessageHandler ,
9
9
QtDebugMsg , QtInfoMsg , QtWarningMsg ,
10
- QtCriticalMsg , QtFatalMsg )
10
+ QtCriticalMsg , QtFatalMsg , QSize )
11
11
from PyQt5 .QtGui import (QGuiApplication , QIcon , QCloseEvent )
12
12
from PyQt5 .QtWidgets import (QCalendarWidget , QFileSystemModel , QFrame , QLabel ,
13
13
QMenu , QTreeView , QAction , QWidgetAction ,
25
25
from PyQtAds import QtAds
26
26
27
27
import rc # pyrcc5 demo.qrc -o rc.py
28
+ from status_dialog import CStatusDialog
28
29
29
30
UI_FILE = os .path .join (os .path .dirname (__file__ ), 'mainwindow.ui' )
30
31
MainWindowUI , MainWindowBase = uic .loadUiType (UI_FILE )
@@ -100,7 +101,12 @@ def create_calendar_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
100
101
101
102
dock_widget = QtAds .CDockWidget ("Calendar {}" .format (_State .calendar_count ))
102
103
_State .calendar_count += 1
104
+ # The following lines are for testing the setWidget() and takeWidget()
105
+ # functionality
103
106
dock_widget .setWidget (widget )
107
+ dock_widget .setWidget (widget ) # what happens if we set a widget if a widget is already set
108
+ dock_widget .takeWidget () # we remove the widget
109
+ dock_widget .setWidget (widget ) # and set the widget again - there should be no error
104
110
dock_widget .setToggleViewActionMode (QtAds .CDockWidget .ActionModeShow )
105
111
dock_widget .setIcon (svg_icon (":/adsdemo/images/date_range.svg" ))
106
112
view_menu .addAction (dock_widget .toggleViewAction ())
@@ -149,9 +155,15 @@ def create_editor_widget(view_menu: QMenu) -> QtAds.CDockWidget:
149
155
150
156
return dock_widget
151
157
158
+ class CMinSizeTableWidget (QTableWidget ):
159
+ """Custom QTableWidget with a minimum size hint to test CDockWidget
160
+ setMinimumSizeHintMode() function of CDockWidget"""
161
+
162
+ def minimumSizeHint (self ) -> QSize :
163
+ return QSize (300 , 100 )
152
164
153
165
def create_table_widget (view_menu : QMenu ) -> QtAds .CDockWidget :
154
- widget = QTableWidget ()
166
+ widget = CMinSizeTableWidget ()
155
167
dock_widget = QtAds .CDockWidget ("Table {}" .format (_State .table_count ))
156
168
_State .table_count += 1
157
169
COLCOUNT = 5
@@ -165,6 +177,15 @@ def create_table_widget(view_menu: QMenu) -> QtAds.CDockWidget:
165
177
166
178
dock_widget .setWidget (widget )
167
179
dock_widget .setIcon (svg_icon (":/adsdemo/images/grid_on.svg" ))
180
+ dock_widget .setMinimumSizeHintMode (QtAds .CDockWidget .MinimumSizeHintFromContent )
181
+ toolbar = dock_widget .createDefaultToolBar ()
182
+ action = toolbar .addAction (svg_icon (":/adsdemo/images/fullscreen.svg" ), "Toggle Fullscreen" )
183
+ def on_toggle_fullscreen ():
184
+ if dock_widget .isFullScreen ():
185
+ dock_widget .showNormal ()
186
+ else :
187
+ dock_widget .showFullScreen ()
188
+ action .triggered .connect (on_toggle_fullscreen )
168
189
view_menu .addAction (dock_widget .toggleViewAction ())
169
190
return dock_widget
170
191
@@ -179,7 +200,7 @@ def create_activex_widget(view_menu: QMenu, parent: QWidget = None) -> QtAds.CDo
179
200
return dock_widget
180
201
181
202
182
- class CustomComponentsFactory (QtAds .CDockComponentsFactory ):
203
+ class CCustomComponentsFactory (QtAds .CDockComponentsFactory ):
183
204
184
205
def createDockAreaTitleBar (self , dock_area : QtAds .CDockAreaWidget ) -> QtAds .CDockAreaTitleBar :
185
206
title_bar = QtAds .CDockAreaTitleBar (dock_area )
@@ -192,7 +213,6 @@ def createDockAreaTitleBar(self, dock_area: QtAds.CDockAreaWidget) -> QtAds.CDoc
192
213
return title_bar
193
214
194
215
195
-
196
216
class MainWindow (MainWindowUI , MainWindowBase ):
197
217
save_perspective_action : QAction
198
218
perspective_list_action : QWidgetAction
@@ -213,13 +233,39 @@ def __init__(self, parent=None):
213
233
# a QToolButton instead of a QPushButton
214
234
# QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.configFlags() | QtAds.CDockManager.TabCloseButtonIsToolButton)
215
235
236
+ # uncomment the following line if you want to use opaque undocking and
237
+ # opaque splitter resizing
238
+ #QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.DefaultOpaqueConfig);
239
+
216
240
# uncomment the following line if you want a fixed tab width that does
217
241
# not change if the visibility of the close button changes
218
- # QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.RetainTabSizeWhenCloseButtonHidden, True)
242
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.RetainTabSizeWhenCloseButtonHidden, True)
243
+
244
+ # uncomment the following line if you don't want close button on DockArea's title bar
245
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasCloseButton, false);
246
+
247
+ # uncomment the following line if you don't want undock button on DockArea's title bar
248
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasUndockButton, false);
249
+
250
+ # uncomment the following line if you don't want tabs menu button on DockArea's title bar
251
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasTabsMenuButton, false);
219
252
220
- # uncomment the follwing line if you want to use non opaque undocking and splitter
221
- # movements
222
- # QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.DefaultNonOpaqueConfig)
253
+ # uncomment the following line if you don't want disabled buttons to appear on DockArea's title bar
254
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHideDisabledButtons, true);
255
+
256
+ # uncomment the following line if you want to show tabs menu button on DockArea's title bar only when there are more than one tab and at least of them has elided title
257
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaDynamicTabsMenuButtonVisibility, true);
258
+
259
+ # uncomment the following line if you want floating container to always show application title instead of active dock widget's title
260
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FloatingContainerHasWidgetTitle, false);
261
+
262
+ # uncomment the following line if you want floating container to show active dock widget's icon instead of always showing application icon
263
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FloatingContainerHasWidgetIcon, true);
264
+
265
+ # uncomment the following line if you want a central widget in the main dock container (the dock manager) without a titlebar
266
+ # If you enable this code, you can test it in the demo with the Calendar 0
267
+ # dock widget.
268
+ #QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.HideSingleCentralWidgetTitleBar, true);
223
269
224
270
# Now create the dock manager and its content
225
271
self .dock_manager = QtAds .CDockManager (self )
@@ -245,8 +291,6 @@ def create_content(self):
245
291
view_menu = self .menuView
246
292
dock_widget = create_calendar_dock_widget (view_menu )
247
293
dock_widget .setFeature (QtAds .CDockWidget .DockWidgetClosable , False )
248
- dock_widget .setFeature (QtAds .CDockWidget .DockWidgetMovable , False )
249
- dock_widget .setFeature (QtAds .CDockWidget .DockWidgetFloatable , False )
250
294
special_dock_area = self .dock_manager .addDockWidget (QtAds .LeftDockWidgetArea , dock_widget )
251
295
252
296
# For this Special Dock Area we want to avoid dropping on the center of it (i.e. we don't want this widget to be ever tabbified):
@@ -271,18 +315,13 @@ def create_content(self):
271
315
append_feature_string_to_window_title (file_system_widget )
272
316
273
317
# Test custom factory - we inject a help button into the title bar
274
- self .factory = CustomComponentsFactory ()
275
- QtAds .CDockComponentsFactory .setFactory (self .factory )
318
+ QtAds .CDockComponentsFactory .setFactory (CCustomComponentsFactory ())
276
319
top_dock_area = self .dock_manager .addDockWidget (QtAds .TopDockWidgetArea , file_system_widget )
277
320
QtAds .CDockComponentsFactory .resetDefaultFactory ()
278
321
279
-
280
322
# We create a calendar widget and clear all flags to prevent the dock area
281
323
# from closing
282
324
dock_widget = create_calendar_dock_widget (view_menu )
283
- dock_widget .setFeature (QtAds .CDockWidget .DockWidgetClosable , False )
284
- dock_widget .setFeature (QtAds .CDockWidget .DockWidgetMovable , False )
285
- dock_widget .setFeature (QtAds .CDockWidget .DockWidgetFloatable , False )
286
325
dock_widget .setTabToolTip ("Tab ToolTip\n Hodie est dies magna" )
287
326
dock_area = self .dock_manager .addDockWidget (QtAds .CenterDockWidgetArea , dock_widget , top_dock_area )
288
327
@@ -292,6 +331,7 @@ def create_content(self):
292
331
custom_button .setToolTip ("Create Editor" )
293
332
custom_button .setIcon (svg_icon (":/adsdemo/images/plus.svg" ))
294
333
custom_button .setAutoRaise (True )
334
+
295
335
title_bar = dock_area .titleBar ()
296
336
index = title_bar .indexOf (title_bar .tabBar ())
297
337
title_bar .insertWidget (index + 1 , custom_button )
@@ -309,7 +349,7 @@ def on_button_clicked():
309
349
self .dock_manager .addDockWidget (
310
350
QtAds .TopDockWidgetArea ,
311
351
create_long_text_label_dock_widget (view_menu ), right_dock_area )
312
-
352
+
313
353
bottom_dock_area = self .dock_manager .addDockWidget (
314
354
QtAds .BottomDockWidgetArea ,
315
355
create_long_text_label_dock_widget (view_menu ), right_dock_area )
@@ -320,9 +360,14 @@ def on_button_clicked():
320
360
self .dock_manager .addDockWidget (
321
361
QtAds .CenterDockWidgetArea ,
322
362
create_long_text_label_dock_widget (view_menu ), bottom_dock_area )
323
-
324
- action = self .menuView .addAction ("Set {} floating" .format (dock_widget .windowTitle ()))
363
+
364
+
365
+ action = self .menuTests .addAction ("Set {} Floating" .format (dock_widget .windowTitle ()))
325
366
action .triggered .connect (dock_widget .setFloating )
367
+ action = self .menuTests .addAction ("Set {} As Current Tab" .format (dock_widget .windowTitle ()))
368
+ action .triggered .connect (dock_widget .setAsCurrentTab )
369
+ action = self .menuTests .addAction ("Raise {}" .format (dock_widget .windowTitle ()))
370
+ action .triggered .connect (dock_widget .raise_ )
326
371
327
372
if ACTIVEX_AVAILABLE :
328
373
flags = self .dock_manager .configFlags ()
@@ -353,25 +398,40 @@ def create_actions(self):
353
398
self .toolBar .addAction (self .perspective_list_action )
354
399
self .toolBar .addAction (self .save_perspective_action )
355
400
356
- a = self .toolBar .addAction ("Create Editor" )
401
+ a = self .toolBar .addAction ("Create Floating Editor" )
402
+ a .setProperty ("Floating" , True )
357
403
a .setToolTip ("Creates floating dynamic dockable editor windows that are deleted on close" )
358
404
a .setIcon (svg_icon (":/adsdemo/images/note_add.svg" ))
359
405
a .triggered .connect (self .create_editor )
406
+ self .menuTests .addAction (a )
407
+
408
+ a = self .toolBar .addAction ("Create Docked Editor" )
409
+ a .setProperty ("Floating" , False )
410
+ a .setToolTip ("Creates a docked editor windows that are deleted on close" )
411
+ a .setIcon (svg_icon (":/adsdemo/images/docked_editor.svg" ))
412
+ a .triggered .connect (self .create_editor )
413
+ self .menuTests .addAction (a )
360
414
361
- a = self .toolBar .addAction ("Create Table" )
415
+ a = self .toolBar .addAction ("Create Floating Table" )
362
416
a .setToolTip ("Creates floating dynamic dockable table with millions of entries" )
363
417
a .setIcon (svg_icon (":/adsdemo/images/grid_on.svg" ))
364
418
a .triggered .connect (self .create_table )
419
+ self .menuTests .addAction (a )
420
+
421
+ self .menuTests .addSeparator ()
422
+ a = self .menuTests .addAction ("Show Status Dialog" )
423
+ a .triggered .connect (self .show_status_dialog )
424
+ self .menuTests .addSeparator ()
365
425
366
426
def closeEvent (self , event : QCloseEvent ):
367
427
self .save_state ()
368
428
super ().closeEvent (event )
369
429
370
- def on_action_save_state_triggered ( state : bool ):
430
+ def on_actionSaveState_triggered ( self , state : bool ):
371
431
qDebug ("MainWindow::on_action_save_state_triggered" )
372
432
self .save_state ()
373
433
374
- def on_action_restore_state_triggered ( state : bool ):
434
+ def on_actionRestoreState_triggered ( self , state : bool ):
375
435
qDebug ("MainWindow::on_action_restore_state_triggered" )
376
436
self .restore_state ()
377
437
@@ -403,11 +463,18 @@ def on_view_visibility_changed(self, visible: bool):
403
463
qDebug ("{} visibility_changed({})" .format (dock_widget .objectName (), visible ))
404
464
405
465
def create_editor (self ):
466
+ sender = self .sender ()
467
+ floating = sender .property ("Floating" )
468
+ print ("Floating:" , floating )
406
469
dock_widget = create_editor_widget (self .menuView )
407
470
dock_widget .setFeature (QtAds .CDockWidget .DockWidgetDeleteOnClose , True )
408
- floating_widget = self .dock_manager .addDockWidgetFloating (dock_widget )
409
- floating_widget .move (QPoint (20 , 20 ))
410
471
dock_widget .closeRequested .connect (self .on_editor_close_requested )
472
+
473
+ if floating :
474
+ floating_widget = self .dock_manager .addDockWidgetFloating (dock_widget )
475
+ floating_widget .move (QPoint (20 , 20 ))
476
+ else :
477
+ self .dock_manager .addDockWidget (QtAds .TopDockWidgetArea , dock_widget )
411
478
412
479
def on_editor_close_requested (self ):
413
480
dock_widget = self .sender ()
@@ -421,6 +488,10 @@ def create_table(self):
421
488
dock_widget .setFeature (QtAds .CDockWidget .DockWidgetDeleteOnClose , True )
422
489
floating_widget = self .dock_manager .addDockWidgetFloating (dock_widget )
423
490
floating_widget .move (QPoint (40 , 40 ))
491
+
492
+ def show_status_dialog (self ):
493
+ dialog = CStatusDialog (self .dock_manager )
494
+ dialog .exec_ ()
424
495
425
496
def save_state (self ):
426
497
'''
0 commit comments