77from PyQt5 .QtCore import (QCoreApplication , QDir , Qt , QSettings , QSignalBlocker ,
88 QRect , QPoint , qDebug , qInstallMessageHandler ,
99 QtDebugMsg , QtInfoMsg , QtWarningMsg ,
10- QtCriticalMsg , QtFatalMsg )
10+ QtCriticalMsg , QtFatalMsg , QSize )
1111from PyQt5 .QtGui import (QGuiApplication , QIcon , QCloseEvent )
1212from PyQt5 .QtWidgets import (QCalendarWidget , QFileSystemModel , QFrame , QLabel ,
1313 QMenu , QTreeView , QAction , QWidgetAction ,
2525from PyQtAds import QtAds
2626
2727import rc # pyrcc5 demo.qrc -o rc.py
28+ from status_dialog import CStatusDialog
2829
2930UI_FILE = os .path .join (os .path .dirname (__file__ ), 'mainwindow.ui' )
3031MainWindowUI , MainWindowBase = uic .loadUiType (UI_FILE )
@@ -100,7 +101,12 @@ def create_calendar_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
100101
101102 dock_widget = QtAds .CDockWidget ("Calendar {}" .format (_State .calendar_count ))
102103 _State .calendar_count += 1
104+ # The following lines are for testing the setWidget() and takeWidget()
105+ # functionality
103106 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
104110 dock_widget .setToggleViewActionMode (QtAds .CDockWidget .ActionModeShow )
105111 dock_widget .setIcon (svg_icon (":/adsdemo/images/date_range.svg" ))
106112 view_menu .addAction (dock_widget .toggleViewAction ())
@@ -149,9 +155,15 @@ def create_editor_widget(view_menu: QMenu) -> QtAds.CDockWidget:
149155
150156 return dock_widget
151157
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 )
152164
153165def create_table_widget (view_menu : QMenu ) -> QtAds .CDockWidget :
154- widget = QTableWidget ()
166+ widget = CMinSizeTableWidget ()
155167 dock_widget = QtAds .CDockWidget ("Table {}" .format (_State .table_count ))
156168 _State .table_count += 1
157169 COLCOUNT = 5
@@ -165,6 +177,15 @@ def create_table_widget(view_menu: QMenu) -> QtAds.CDockWidget:
165177
166178 dock_widget .setWidget (widget )
167179 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 )
168189 view_menu .addAction (dock_widget .toggleViewAction ())
169190 return dock_widget
170191
@@ -179,7 +200,7 @@ def create_activex_widget(view_menu: QMenu, parent: QWidget = None) -> QtAds.CDo
179200 return dock_widget
180201
181202
182- class CustomComponentsFactory (QtAds .CDockComponentsFactory ):
203+ class CCustomComponentsFactory (QtAds .CDockComponentsFactory ):
183204
184205 def createDockAreaTitleBar (self , dock_area : QtAds .CDockAreaWidget ) -> QtAds .CDockAreaTitleBar :
185206 title_bar = QtAds .CDockAreaTitleBar (dock_area )
@@ -192,7 +213,6 @@ def createDockAreaTitleBar(self, dock_area: QtAds.CDockAreaWidget) -> QtAds.CDoc
192213 return title_bar
193214
194215
195-
196216class MainWindow (MainWindowUI , MainWindowBase ):
197217 save_perspective_action : QAction
198218 perspective_list_action : QWidgetAction
@@ -213,13 +233,39 @@ def __init__(self, parent=None):
213233 # a QToolButton instead of a QPushButton
214234 # QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.configFlags() | QtAds.CDockManager.TabCloseButtonIsToolButton)
215235
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+
216240 # uncomment the following line if you want a fixed tab width that does
217241 # 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);
219252
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);
223269
224270 # Now create the dock manager and its content
225271 self .dock_manager = QtAds .CDockManager (self )
@@ -245,8 +291,6 @@ def create_content(self):
245291 view_menu = self .menuView
246292 dock_widget = create_calendar_dock_widget (view_menu )
247293 dock_widget .setFeature (QtAds .CDockWidget .DockWidgetClosable , False )
248- dock_widget .setFeature (QtAds .CDockWidget .DockWidgetMovable , False )
249- dock_widget .setFeature (QtAds .CDockWidget .DockWidgetFloatable , False )
250294 special_dock_area = self .dock_manager .addDockWidget (QtAds .LeftDockWidgetArea , dock_widget )
251295
252296 # 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):
271315 append_feature_string_to_window_title (file_system_widget )
272316
273317 # 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 ())
276319 top_dock_area = self .dock_manager .addDockWidget (QtAds .TopDockWidgetArea , file_system_widget )
277320 QtAds .CDockComponentsFactory .resetDefaultFactory ()
278321
279-
280322 # We create a calendar widget and clear all flags to prevent the dock area
281323 # from closing
282324 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 )
286325 dock_widget .setTabToolTip ("Tab ToolTip\n Hodie est dies magna" )
287326 dock_area = self .dock_manager .addDockWidget (QtAds .CenterDockWidgetArea , dock_widget , top_dock_area )
288327
@@ -292,6 +331,7 @@ def create_content(self):
292331 custom_button .setToolTip ("Create Editor" )
293332 custom_button .setIcon (svg_icon (":/adsdemo/images/plus.svg" ))
294333 custom_button .setAutoRaise (True )
334+
295335 title_bar = dock_area .titleBar ()
296336 index = title_bar .indexOf (title_bar .tabBar ())
297337 title_bar .insertWidget (index + 1 , custom_button )
@@ -309,7 +349,7 @@ def on_button_clicked():
309349 self .dock_manager .addDockWidget (
310350 QtAds .TopDockWidgetArea ,
311351 create_long_text_label_dock_widget (view_menu ), right_dock_area )
312-
352+
313353 bottom_dock_area = self .dock_manager .addDockWidget (
314354 QtAds .BottomDockWidgetArea ,
315355 create_long_text_label_dock_widget (view_menu ), right_dock_area )
@@ -320,9 +360,14 @@ def on_button_clicked():
320360 self .dock_manager .addDockWidget (
321361 QtAds .CenterDockWidgetArea ,
322362 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 ()))
325366 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_ )
326371
327372 if ACTIVEX_AVAILABLE :
328373 flags = self .dock_manager .configFlags ()
@@ -353,25 +398,40 @@ def create_actions(self):
353398 self .toolBar .addAction (self .perspective_list_action )
354399 self .toolBar .addAction (self .save_perspective_action )
355400
356- a = self .toolBar .addAction ("Create Editor" )
401+ a = self .toolBar .addAction ("Create Floating Editor" )
402+ a .setProperty ("Floating" , True )
357403 a .setToolTip ("Creates floating dynamic dockable editor windows that are deleted on close" )
358404 a .setIcon (svg_icon (":/adsdemo/images/note_add.svg" ))
359405 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 )
360414
361- a = self .toolBar .addAction ("Create Table" )
415+ a = self .toolBar .addAction ("Create Floating Table" )
362416 a .setToolTip ("Creates floating dynamic dockable table with millions of entries" )
363417 a .setIcon (svg_icon (":/adsdemo/images/grid_on.svg" ))
364418 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 ()
365425
366426 def closeEvent (self , event : QCloseEvent ):
367427 self .save_state ()
368428 super ().closeEvent (event )
369429
370- def on_action_save_state_triggered ( state : bool ):
430+ def on_actionSaveState_triggered ( self , state : bool ):
371431 qDebug ("MainWindow::on_action_save_state_triggered" )
372432 self .save_state ()
373433
374- def on_action_restore_state_triggered ( state : bool ):
434+ def on_actionRestoreState_triggered ( self , state : bool ):
375435 qDebug ("MainWindow::on_action_restore_state_triggered" )
376436 self .restore_state ()
377437
@@ -403,11 +463,18 @@ def on_view_visibility_changed(self, visible: bool):
403463 qDebug ("{} visibility_changed({})" .format (dock_widget .objectName (), visible ))
404464
405465 def create_editor (self ):
466+ sender = self .sender ()
467+ floating = sender .property ("Floating" )
468+ print ("Floating:" , floating )
406469 dock_widget = create_editor_widget (self .menuView )
407470 dock_widget .setFeature (QtAds .CDockWidget .DockWidgetDeleteOnClose , True )
408- floating_widget = self .dock_manager .addDockWidgetFloating (dock_widget )
409- floating_widget .move (QPoint (20 , 20 ))
410471 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 )
411478
412479 def on_editor_close_requested (self ):
413480 dock_widget = self .sender ()
@@ -421,6 +488,10 @@ def create_table(self):
421488 dock_widget .setFeature (QtAds .CDockWidget .DockWidgetDeleteOnClose , True )
422489 floating_widget = self .dock_manager .addDockWidgetFloating (dock_widget )
423490 floating_widget .move (QPoint (40 , 40 ))
491+
492+ def show_status_dialog (self ):
493+ dialog = CStatusDialog (self .dock_manager )
494+ dialog .exec_ ()
424495
425496 def save_state (self ):
426497 '''
0 commit comments