QGIS API Documentation 3.99.0-Master (21b3aa880ba)
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}
33
34bool QgsWidgetStateHelper::eventFilter( QObject *object, QEvent *event )
35{
36 if ( event->type() == QEvent::Close || event->type() == QEvent::Destroy || event->type() == QEvent::Hide )
37 {
38 QWidget *widget = qobject_cast<QWidget *>( object );
39
40 // don't save geometry for windows which were never shown
41 if ( widget->property( "widgetStateHelperWasShown" ).toBool() )
42 {
43 const QString name = widgetSafeName( widget );
44 const QString key = mKeys[name];
45 QgsGuiUtils::saveGeometry( widget, key );
46 }
47 }
48 else if ( event->type() == QEvent::Show )
49 {
50 QWidget *widget = qobject_cast<QWidget *>( object );
51 const QString name = widgetSafeName( widget );
52
53 // If window is already maximized by Window Manager,
54 // there is no need to restore its geometry as it might lead to
55 // an incorrect state of QFlags<Qt::WindowState>(WindowMinimized|WindowMaximized)
56 // thus minimizing window after it just has been restored by WM.
57 // Inability to restore minimized windows has been observed with
58 // KWin 5.19 and Qt 5.15 running under X11.
59 QWindow *win = widget->windowHandle();
60 if ( !win )
61 return QObject::eventFilter( object, event );
62
63 if ( !( win->windowStates() & Qt::WindowMaximized ) )
64 {
65 const QString key = mKeys[name];
66 QgsGuiUtils::restoreGeometry( widget, key );
67 }
68
69 widget->setProperty( "widgetStateHelperWasShown", QVariant( true ) );
70 }
71 return QObject::eventFilter( object, event );
72}
73
74void QgsWidgetStateHelper::registerWidget( QWidget *widget, const QString &key )
75{
76 const QString name = widgetSafeName( widget );
77 mKeys[name] = key;
78 widget->installEventFilter( this );
79}
80
81QString QgsWidgetStateHelper::widgetSafeName( QWidget *widget )
82{
83 if ( widget->objectName().isEmpty() )
84 {
85 return widget->metaObject()->className();
86 }
87 return widget->objectName();
88}
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.