QGIS API Documentation 4.1.0-Master (60fea48833c)
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.
44 connect(
45 panel,
47 this,
49 // using unique connection because addMainPanel() may be called multiple times
50 // for a panel, so showPanel() slot could be invoked more times from one signal
51 Qt::UniqueConnection
52 );
53 mStackedWidget->insertWidget( 0, panel );
54 mStackedWidget->setCurrentIndex( 0 );
55 updateMenuButton();
56}
57
59{
60 return qobject_cast<QgsPanelWidget *>( mStackedWidget->widget( 0 ) );
61}
62
64{
65 // clear out the current stack
67
68 QWidget *widget = mStackedWidget->widget( 0 );
69 if ( widget )
70 {
71 mStackedWidget->removeWidget( widget );
72 return qobject_cast<QgsPanelWidget *>( widget );
73 }
74 else
75 {
76 return nullptr;
77 }
78}
79
81{
82 for ( int i = mStackedWidget->count() - 1; i >= 0; i-- )
83 {
84 if ( QgsPanelWidget *panelWidget = qobject_cast<QgsPanelWidget *>( mStackedWidget->widget( i ) ) )
85 {
86 mStackedWidget->removeWidget( panelWidget );
87 if ( panelWidget->autoDelete() )
88 {
89 panelWidget->deleteLater();
90 }
91 }
92 else if ( QWidget *widget = mStackedWidget->widget( i ) )
93 {
94 mStackedWidget->removeWidget( widget );
95 widget->deleteLater();
96 }
97 }
98 mTitles.clear();
99 mTitleText->hide();
100 mBackButton->hide();
101 mMenuButton->hide();
102 this->updateBreadcrumb();
103}
104
106{
107 return qobject_cast<QgsPanelWidget *>( mStackedWidget->currentWidget() );
108}
109
111{
112 if ( const QgsPanelWidget *widget = qobject_cast<const QgsPanelWidget *>( mStackedWidget->currentWidget() ) )
113 {
114 if ( widget->applySizeConstraintsToStack() )
115 return widget->sizeHint();
116 }
117 return QWidget::sizeHint();
118}
119
121{
122 if ( const QgsPanelWidget *widget = qobject_cast<const QgsPanelWidget *>( mStackedWidget->currentWidget() ) )
123 {
124 if ( widget->applySizeConstraintsToStack() )
125 return widget->minimumSizeHint();
126 }
127
128 return QWidget::minimumSizeHint();
129}
130
132{
133 // You can't accept the main panel.
134 if ( mStackedWidget->currentIndex() <= 0 )
135 return;
136
137 QgsPanelWidget *widget = currentPanel();
138 widget->acceptPanel();
139}
140
142{
143 //avoid messy multiple redraws
144 setUpdatesEnabled( false );
145 mStackedWidget->setUpdatesEnabled( false );
146
147 for ( int i = mStackedWidget->count() - 1; i > 0; --i )
148 {
149 if ( QgsPanelWidget *panelWidget = qobject_cast<QgsPanelWidget *>( mStackedWidget->widget( i ) ) )
150 {
151 panelWidget->acceptPanel();
152 }
153 }
154 setUpdatesEnabled( true );
155 mStackedWidget->setUpdatesEnabled( true );
156}
157
159{
160 mTitles.push( panel->panelTitle() );
161
164
165 const int index = mStackedWidget->addWidget( panel );
166 mStackedWidget->setCurrentIndex( index );
167 mBackButton->show();
168 mTitleText->show();
169
170 updateMenuButton();
171 updateBreadcrumb();
172}
173
175{
176 mTitles.pop();
177 mStackedWidget->setCurrentIndex( mStackedWidget->currentIndex() - 1 );
178 mStackedWidget->removeWidget( panel );
179 if ( panel->autoDelete() )
180 {
181 panel->deleteLater();
182 }
183
184 if ( mStackedWidget->currentIndex() == 0 )
185 {
186 mBackButton->hide();
187 mTitleText->hide();
188 mMenuButton->hide();
189 }
190 else
191 {
192 updateMenuButton();
193 }
194 this->updateBreadcrumb();
195}
196
198{
199 if ( e->button() == Qt::BackButton )
200 {
202 }
203}
204
206{
207 if ( e->key() == Qt::Key_Escape )
208 {
210 }
211}
212
213void QgsPanelWidgetStack::updateBreadcrumb()
214{
215 QString breadcrumb;
216 const auto constMTitles = mTitles;
217 for ( const QString &title : constMTitles )
218 {
219 breadcrumb += u" %1 >"_s.arg( title );
220 }
221 // Remove the last
222 breadcrumb.chop( 1 );
223 mTitleText->setText( breadcrumb );
224}
225
226void QgsPanelWidgetStack::updateMenuButton()
227{
228 if ( QMenu *menu = currentPanel()->menuButtonMenu() )
229 {
230 mMenuButton->setVisible( true );
231 mMenuButton->setToolTip( currentPanel()->menuButtonTooltip() );
232 mMenuButton->setMenu( menu );
233 }
234 else
235 {
236 mMenuButton->setVisible( false );
237 }
238}
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.