QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgspanelwidgetstack.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgspanelwidget.cpp
3 ---------------------
4 begin : June 2016
5 copyright : (C) 2016 by Nathan Woodrow
6 email :
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15#include "qgspanelwidgetstack.h"
16
17#include "qgslogger.h"
18#include "qgspanelwidget.h"
19
20#include <QDialog>
21#include <QDialogButtonBox>
22#include <QPushButton>
23#include <QSettings>
24#include <QString>
25
26#include "moc_qgspanelwidgetstack.cpp"
27
28using namespace Qt::StringLiterals;
29
31 : QWidget( parent )
32{
33 setupUi( this );
34 clear();
35
36 connect( mBackButton, &QAbstractButton::clicked, this, &QgsPanelWidgetStack::acceptCurrentPanel );
37
38 mMenuButton->setStyleSheet( u"QToolButton::menu-indicator { image: none; }"_s );
39}
40
42{
43 // TODO Don't allow adding another main widget or else that would be strange for the user.
45 // using unique connection because addMainPanel() may be called multiple times
46 // for a panel, so showPanel() slot could be invoked more times from one signal
47 Qt::UniqueConnection );
48 mStackedWidget->insertWidget( 0, panel );
49 mStackedWidget->setCurrentIndex( 0 );
50 updateMenuButton();
51}
52
54{
55 return qobject_cast<QgsPanelWidget *>( mStackedWidget->widget( 0 ) );
56}
57
59{
60 // clear out the current stack
62
63 QWidget *widget = mStackedWidget->widget( 0 );
64 if ( widget )
65 {
66 mStackedWidget->removeWidget( widget );
67 return qobject_cast<QgsPanelWidget *>( widget );
68 }
69 else
70 {
71 return nullptr;
72 }
73}
74
76{
77 for ( int i = mStackedWidget->count() - 1; i >= 0; i-- )
78 {
79 if ( QgsPanelWidget *panelWidget = qobject_cast<QgsPanelWidget *>( mStackedWidget->widget( i ) ) )
80 {
81 mStackedWidget->removeWidget( panelWidget );
82 if ( panelWidget->autoDelete() )
83 {
84 panelWidget->deleteLater();
85 }
86 }
87 else if ( QWidget *widget = mStackedWidget->widget( i ) )
88 {
89 mStackedWidget->removeWidget( widget );
90 widget->deleteLater();
91 }
92 }
93 mTitles.clear();
94 mTitleText->hide();
95 mBackButton->hide();
96 mMenuButton->hide();
97 this->updateBreadcrumb();
98}
99
101{
102 return qobject_cast<QgsPanelWidget *>( mStackedWidget->currentWidget() );
103}
104
106{
107 if ( const QgsPanelWidget *widget = qobject_cast<const QgsPanelWidget *>( mStackedWidget->currentWidget() ) )
108 {
109 if ( widget->applySizeConstraintsToStack() )
110 return widget->sizeHint();
111 }
112 return QWidget::sizeHint();
113}
114
116{
117 if ( const QgsPanelWidget *widget = qobject_cast<const QgsPanelWidget *>( mStackedWidget->currentWidget() ) )
118 {
119 if ( widget->applySizeConstraintsToStack() )
120 return widget->minimumSizeHint();
121 }
122
123 return QWidget::minimumSizeHint();
124}
125
127{
128 // You can't accept the main panel.
129 if ( mStackedWidget->currentIndex() <= 0 )
130 return;
131
132 QgsPanelWidget *widget = currentPanel();
133 widget->acceptPanel();
134}
135
137{
138 //avoid messy multiple redraws
139 setUpdatesEnabled( false );
140 mStackedWidget->setUpdatesEnabled( false );
141
142 for ( int i = mStackedWidget->count() - 1; i > 0; --i )
143 {
144 if ( QgsPanelWidget *panelWidget = qobject_cast<QgsPanelWidget *>( mStackedWidget->widget( i ) ) )
145 {
146 panelWidget->acceptPanel();
147 }
148 }
149 setUpdatesEnabled( true );
150 mStackedWidget->setUpdatesEnabled( true );
151}
152
154{
155 mTitles.push( panel->panelTitle() );
156
159
160 const int index = mStackedWidget->addWidget( panel );
161 mStackedWidget->setCurrentIndex( index );
162 mBackButton->show();
163 mTitleText->show();
164
165 updateMenuButton();
166 updateBreadcrumb();
167}
168
170{
171 mTitles.pop();
172 mStackedWidget->setCurrentIndex( mStackedWidget->currentIndex() - 1 );
173 mStackedWidget->removeWidget( panel );
174 if ( panel->autoDelete() )
175 {
176 panel->deleteLater();
177 }
178
179 if ( mStackedWidget->currentIndex() == 0 )
180 {
181 mBackButton->hide();
182 mTitleText->hide();
183 mMenuButton->hide();
184 }
185 else
186 {
187 updateMenuButton();
188 }
189 this->updateBreadcrumb();
190}
191
193{
194 if ( e->button() == Qt::BackButton )
195 {
197 }
198}
199
201{
202 if ( e->key() == Qt::Key_Escape )
203 {
205 }
206}
207
208void QgsPanelWidgetStack::updateBreadcrumb()
209{
210 QString breadcrumb;
211 const auto constMTitles = mTitles;
212 for ( const QString &title : constMTitles )
213 {
214 breadcrumb += u" %1 >"_s.arg( title );
215 }
216 // Remove the last
217 breadcrumb.chop( 1 );
218 mTitleText->setText( breadcrumb );
219}
220
221void QgsPanelWidgetStack::updateMenuButton()
222{
223 if ( QMenu *menu = currentPanel()->menuButtonMenu() )
224 {
225 mMenuButton->setVisible( true );
226 mMenuButton->setToolTip( currentPanel()->menuButtonTooltip() );
227 mMenuButton->setMenu( menu );
228 }
229 else
230 {
231 mMenuButton->setVisible( false );
232 }
233}
QgsPanelWidget * currentPanel()
Returns the panel currently shown in the stack.
void closePanel(QgsPanelWidget *panel)
Closes the panel in the widget.
QSize sizeHint() const override
void acceptAllPanels()
Accepts all panel widgets open in the stack in turn until only the mainPanel() remains.
QgsPanelWidgetStack(QWidget *parent=nullptr)
A stack widget to manage panels in the interface.
QgsPanelWidget * mainPanel()
The main panel widget that is set in the stack.
QSize minimumSizeHint() const override
void showPanel(QgsPanelWidget *panel)
Show a panel in the stack widget.
void acceptCurrentPanel()
Accept the current active widget in the stack.
void setMainPanel(QgsPanelWidget *panel SIP_TRANSFER)
Sets the main panel widget for the stack and selects it for the user.
QgsPanelWidget * takeMainPanel() SIP_TRANSFERBACK
Removes the main panel widget from the stack and transfers ownsership to the caller.
void clear()
Clear the stack of all widgets.
void mouseReleaseEvent(QMouseEvent *e) override
void keyPressEvent(QKeyEvent *e) override
Base class for any widget that can be shown as an inline panel.
bool autoDelete() const
The the auto delete property on the widget.
QString panelTitle() const
The title of the panel.
void showPanel(QgsPanelWidget *panel)
Emit when you require a panel to be show in the interface.
void panelAccepted(QgsPanelWidget *panel)
Emitted when the panel is accepted by the user.
void acceptPanel()
Accept the panel.