QGIS API Documentation 4.1.0-Master (3b8ef1f72a3)
Loading...
Searching...
No Matches
qgswidgetstatehelper_p.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgswidgetstatehelper_p.cpp - QgsWidgetStateHelper
3
4 ---------------------
5 begin : 3.12.2017
6 copyright : (C) 2017 by Nathan Woodrow
7 Email : woodrow.nathan at gmail dot com
8 ***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
17
18#include "qgsguiutils.h"
19#include "qgslogger.h"
20
21#include <QEvent>
22#include <QObject>
23#include <QVariant>
24#include <QWidget>
25#include <QWindow>
26
27#include "moc_qgswidgetstatehelper_p.cpp"
28
30 : QObject( parent )
31{}
32
33bool QgsWidgetStateHelper::eventFilter( QObject *object, QEvent *event )
34{
35 if ( event->type() == QEvent::Close || event->type() == QEvent::Destroy || event->type() == QEvent::Hide )
36 {
37 QWidget *widget = qobject_cast<QWidget *>( object );
38
39 // don't save geometry for windows which were never shown
40 if ( widget->property( "widgetStateHelperWasShown" ).toBool() )
41 {
42 const QString name = widgetSafeName( widget );
43 const QString key = mKeys[name];
44 QgsGuiUtils::saveGeometry( widget, key );
45 widget->setProperty( "widgetStateHelperWasShown", QVariant( false ) );
46 }
47 }
48 else if ( event->type() == QEvent::Show )
49 {
50 QWidget *widget = qobject_cast<QWidget *>( object );
51
52 // Skip geometry restore if the widget has already been shown once.
53 if ( widget->property( "widgetStateHelperWasShown" ).toBool() )
54 return QObject::eventFilter( object, event );
55
56 const QString name = widgetSafeName( widget );
57
58 // If window is already maximized by Window Manager,
59 // there is no need to restore its geometry as it might lead to
60 // an incorrect state of QFlags<Qt::WindowState>(WindowMinimized|WindowMaximized)
61 // thus minimizing window after it just has been restored by WM.
62 // Inability to restore minimized windows has been observed with
63 // KWin 5.19 and Qt 5.15 running under X11.
64 QWindow *win = widget->windowHandle();
65 if ( !win )
66 return QObject::eventFilter( object, event );
67
68 if ( !( win->windowStates() & Qt::WindowMaximized ) )
69 {
70 const QString key = mKeys[name];
71 QgsGuiUtils::restoreGeometry( widget, key );
72 }
73
74 widget->setProperty( "widgetStateHelperWasShown", QVariant( true ) );
75 }
76 return QObject::eventFilter( object, event );
77}
78
79void QgsWidgetStateHelper::registerWidget( QWidget *widget, const QString &key )
80{
81 const QString name = widgetSafeName( widget );
82 mKeys[name] = key;
83 widget->installEventFilter( this );
84}
85
86QString QgsWidgetStateHelper::widgetSafeName( QWidget *widget )
87{
88 if ( widget->objectName().isEmpty() )
89 {
90 return widget->metaObject()->className();
91 }
92 return widget->objectName();
93}
bool eventFilter(QObject *object, QEvent *event) override
Event filter to catch events from registered widgets.
void registerWidget(QWidget *widget, const QString &key=QString())
Register a widget to have it geometry state automatically saved and restored.
QgsWidgetStateHelper(QObject *parent=nullptr)
QgsWidgetStateHelper.
bool restoreGeometry(QWidget *widget, const QString &keyName)
Restore the wigget geometry from settings.
void saveGeometry(QWidget *widget, const QString &keyName)
Save the wigget geometry into settings.