From 659d91649c41c19b1d457bca9cdc4c0f98cec009 Mon Sep 17 00:00:00 2001 From: Nathan Woodrow Date: Mon, 13 Jun 2016 18:51:57 +1000 Subject: [PATCH] Add missing files --- python/gui/qgspanelwidget.sip | 166 ++++++++++++++++++++++++++ src/gui/qgspanelwidget.cpp | 134 +++++++++++++++++++++ src/gui/qgspanelwidget.h | 211 ++++++++++++++++++++++++++++++++++ 3 files changed, 511 insertions(+) create mode 100644 python/gui/qgspanelwidget.sip create mode 100644 src/gui/qgspanelwidget.cpp create mode 100644 src/gui/qgspanelwidget.h diff --git a/python/gui/qgspanelwidget.sip b/python/gui/qgspanelwidget.sip new file mode 100644 index 00000000000..8fb5eedbc76 --- /dev/null +++ b/python/gui/qgspanelwidget.sip @@ -0,0 +1,166 @@ +/** + * @brief Base class for any widget that can be shown as a inline panel + */ +class QgsPanelWidget : public QWidget +{ +%TypeHeaderCode +#include "qgspanelwidget.h" +%End + public: + /** + * @brief Base class for any widget that can be shown as a inline panel + * @param parent Parent widget. + */ + QgsPanelWidget( QWidget *parent = 0 ); + + /** + * Set the title of the panel when shown in the interface. + * @param panelTitle The panel title. + */ + void setPanelTitle( QString panelTitle ); + + /** + * The title of the panel. + * @return The title pf the panel. + */ + QString panelTitle(); + + /** + * Connect the given sub panel widgets showPanel signals to this current panels + * main showPanel event to bubble up to the user. + * + * Use this method if you have children widgets that need to show a panel to the user. + * @param panels A list of panel widgets to connect. + */ + void connectChildPanels( QList panels ); + + /** + * Connect the given sub panel widgets showPanel signals to this current panels + * main showPanel event to bubble up to the user. + * + * Use this method if you have children widgets that need to show a panel to the user. + * @param panel The panel to connect. + */ + void connectChildPanel( QgsPanelWidget* panel ); + + /** + * Set the widget in dock mode which tells the widget to emit panel + * widgets and not open dialogs + * @param dockMode True to enable dock mode. + */ + virtual void setDockMode( bool dockMode ); + signals: + + /** + * Emiited when the panel is accpeted by the user. + * @param panel The panel widget that was accepted. + * @note This argument is normally raised with emit panelAccpeted(this) + * so that callers can retrive the widget easier in calling code. + */ + void panelAccepted( QgsPanelWidget* panel ); + + /** + * Emit when you require a panel to be show in the interface. + * @param panel The panel widget to show. + * @note If you are connected to this signal you should also connect + * given panels showPanel signal as they can be nested. + */ + void showPanel( QgsPanelWidget* panel ); + + /** + * Emiited when the widget state changes. + * Connect to this to pull any changes off the widget when needed. + * As panels are non blocking "dialogs" you should listen to this signal + * to give the user feedback when something changes. + */ + void widgetChanged(); + + public slots: + + /** + * Accept the panel. Causes panelAccepted to be emiited. + * Widgets are normally removed form the interface using the panel manager or the caller. + */ + void acceptPanel(); + + protected: + + /** + * @brief Overriden key press event to handle the esc event on the widget. + * @param event The key event + */ + void keyPressEvent( QKeyEvent* event ); +}; + + +/** + * A non model panel page that can get shown to the user. Page will contain a close button and trigger the + * internal widgets acceptPanel() on close. + */ +class QgsPanelWidgetPage : public QgsPanelWidget +{ +%TypeHeaderCode +#include "qgspanelwidget.h" +%End + public: + + /** + * A non model panel page that can get shown to the user. + * @param widget The internal widget to show in the page. + * @param parent THe parent widget. + */ + QgsPanelWidgetPage( QgsPanelWidget* widget, QWidget* parent = nullptr ); + + ~QgsPanelWidgetPage(); + + void setTitle( QString title ); +}; + + +/** + * A stack widget to manage panels in the interface. Handles the open and close events + * for added panels. + * Any widgets that want to have a non blocking panel based interface should use this + * class to manage the panels. + */ +class QgsPanelWidgetStackWidget : public QStackedWidget +{ +%TypeHeaderCode +#include "qgspanelwidget.h" +%End + public: + + /** + * A stack widget to manage panels in the interface. Handles the open and close events + * for added panels. + * @param parent + */ + QgsPanelWidgetStackWidget( QWidget* parent = nullptr ); + + void connectPanels( QList panels ); + + void connectPanel( QgsPanelWidget* panel ); + + /** + * Adds the main widget to the stack and selects it for the user + * The main widget can not be closed and only the showPanel signal is attached + * to handle children widget opening panels. + * @param panel The panel to set as the first widget in the stack. + */ + void addMainPanel( QgsPanelWidget* panel ); + + public slots: + /** + * Show a panel in the stack widget. Will connect to the panels showPanel event to handle + * nested panels. Auto switches the the given panel for the user. + * @param panel The panel to show. + */ + void showPanel( QgsPanelWidget* panel ); + + /** + * Closes the panel in the widget. Will also delete the widget. + * This slot is normally auto connected to panelAccepted when a panel is shown. + * @param panel The panel to close. + */ + void closePanel( QgsPanelWidget* panel ); +}; diff --git a/src/gui/qgspanelwidget.cpp b/src/gui/qgspanelwidget.cpp new file mode 100644 index 00000000000..d9160513af3 --- /dev/null +++ b/src/gui/qgspanelwidget.cpp @@ -0,0 +1,134 @@ +/*************************************************************************** + qgspanelwidget.cpp + --------------------- + begin : June 2016 + copyright : (C) 2016 by Nathan Woodrow + email : + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#include +#include + +#include "qgspanelwidget.h" +#include "qgslogger.h" + +QgsPanelWidget::QgsPanelWidget( QWidget *parent ) + : QWidget( parent ) +{ +} + +void QgsPanelWidget::connectChildPanels( QList panels ) +{ + Q_FOREACH ( QgsPanelWidget* widget, panels ) + { + connectChildPanel( widget ); + } +} + +void QgsPanelWidget::connectChildPanel( QgsPanelWidget *panel ) +{ + connect( panel, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SIGNAL( showPanel( QgsPanelWidget* ) ) ); + connect( panel, SIGNAL( widgetChanged() ), this, SIGNAL( widgetChanged() ) ); +} + +void QgsPanelWidget::setDockMode(bool dockMode) +{ + mDockMode = true; +} + +void QgsPanelWidget::acceptPanel() +{ + emit panelAccepted( this ); +} + +void QgsPanelWidget::keyPressEvent( QKeyEvent *event ) +{ + if ( event->key() == Qt::Key_Escape ) + { + acceptPanel(); + } +} + +QgsPanelWidgetPage::QgsPanelWidgetPage( QgsPanelWidget *widget, QWidget *parent ) + : QgsPanelWidget( parent ) + , mWidget( widget ) +{ + setupUi( this ); + mWidgetLayout->addWidget( widget ); + mWidgetLayout->setContentsMargins( 0, 0, 0, 0 ); + mTitleText->setText( widget->panelTitle() ); + + connect( mBackButton, SIGNAL( pressed() ), this, SLOT( acceptPanel() ) ); + connect( widget, SIGNAL( panelAccepted( QgsPanelWidget* ) ), this, SLOT( acceptPanel() ) ); + connect( widget, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SIGNAL( showPanel( QgsPanelWidget* ) ) ); +} + +QgsPanelWidgetPage::~QgsPanelWidgetPage() +{ +} + +void QgsPanelWidgetPage::setTitle( QString title ) +{ + mTitleText->setText( title ); +} + +QgsPanelWidgetStackWidget::QgsPanelWidgetStackWidget( QWidget *parent ) + : QStackedWidget( parent ) +{ + +} + +void QgsPanelWidgetStackWidget::connectPanels( QList panels ) +{ + Q_FOREACH ( QgsPanelWidget* widget, panels ) + { + connectPanel( widget ); + } +} + +void QgsPanelWidgetStackWidget::connectPanel( QgsPanelWidget *panel ) +{ + connect( panel, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SLOT( showPanel( QgsPanelWidget* ) ) ); +} + +void QgsPanelWidgetStackWidget::addMainPanel( QgsPanelWidget *panel ) +{ + // TODO Don't allow adding another main widget or else that would be strange for the user. + connect( panel, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SLOT( showPanel( QgsPanelWidget* ) ) ); + this->insertWidget( 0, panel ); + this->setCurrentIndex( 0 ); +} + +void QgsPanelWidgetStackWidget::showPanel( QgsPanelWidget *panel ) +{ + mTitles.push( panel->panelTitle() ); + QString breadcrumb; + Q_FOREACH ( QString title, mTitles ) + { + breadcrumb += QString( " %1 >" ).arg( title ); + } + breadcrumb.chop( 1 ); + + QgsPanelWidgetPage* page = new QgsPanelWidgetPage( panel, this ); + page->setTitle( breadcrumb ); + + connect( page, SIGNAL( panelAccepted( QgsPanelWidget* ) ), this, SLOT( closePanel( QgsPanelWidget* ) ) ); + connect( page, SIGNAL( showPanel( QgsPanelWidget* ) ), this, SLOT( showPanel( QgsPanelWidget* ) ) ); + + int index = this->addWidget( page ); + this->setCurrentIndex( index ); +} + +void QgsPanelWidgetStackWidget::closePanel( QgsPanelWidget *panel ) +{ + this->setCurrentIndex( this->currentIndex() - 1 ); + this->removeWidget( panel ); + mTitles.pop(); + panel->deleteLater(); +} diff --git a/src/gui/qgspanelwidget.h b/src/gui/qgspanelwidget.h new file mode 100644 index 00000000000..d510daed0b1 --- /dev/null +++ b/src/gui/qgspanelwidget.h @@ -0,0 +1,211 @@ +/*************************************************************************** + qgspanelwidget.h + --------------------- + begin : June 2016 + copyright : (C) 2016 by Nathan Woodrow + email : + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef QGSPANELWIDGET_H +#define QGSPANELWIDGET_H + +#include +#include +#include +#include + +#include "ui_qgsrenderercontainerbase.h" + + +/** + * @brief Base class for any widget that can be shown as a inline panel + */ +class GUI_EXPORT QgsPanelWidget : public QWidget +{ + Q_OBJECT + public: + /** + * @brief Base class for any widget that can be shown as a inline panel + * @param parent Parent widget. + */ + QgsPanelWidget( QWidget *parent = 0 ); + + /** + * Set the title of the panel when shown in the interface. + * @param panelTitle The panel title. + */ + void setPanelTitle( QString panelTitle ) { mPanelTitle = panelTitle; } + + /** + * The title of the panel. + * @return The title pf the panel. + */ + QString panelTitle() { return mPanelTitle; } + + /** + * Connect the given sub panel widgets showPanel signals to this current panels + * main showPanel event to bubble up to the user. + * + * Use this method if you have children widgets that need to show a panel to the user. + * @param panels A list of panel widgets to connect. + */ + void connectChildPanels( QList panels ); + + /** + * Connect the given sub panel widgets showPanel signals to this current panels + * main showPanel event to bubble up to the user. + * + * Use this method if you have children widgets that need to show a panel to the user. + * @param panel The panel to connect. + */ + void connectChildPanel( QgsPanelWidget* panel ); + + /** + * Set the widget in dock mode which tells the widget to emit panel + * widgets and not open dialogs + * @param dockMode True to enable dock mode. + */ + virtual void setDockMode( bool dockMode ); + + signals: + + /** + * Emiited when the panel is accpeted by the user. + * @param panel The panel widget that was accepted. + * @note This argument is normally raised with emit panelAccpeted(this) + * so that callers can retrive the widget easier in calling code. + */ + void panelAccepted( QgsPanelWidget* panel ); + + /** + * Emit when you require a panel to be show in the interface. + * @param panel The panel widget to show. + * @note If you are connected to this signal you should also connect + * given panels showPanel signal as they can be nested. + */ + void showPanel( QgsPanelWidget* panel ); + + /** + * Emiited when the widget state changes. + * Connect to this to pull any changes off the widget when needed. + * As panels are non blocking "dialogs" you should listen to this signal + * to give the user feedback when something changes. + */ + void widgetChanged(); + + public slots: + + /** + * Accept the panel. Causes panelAccepted to be emiited. + * Widgets are normally removed form the interface using the panel manager or the caller. + */ + void acceptPanel(); + + protected: + + /** + * @brief Overriden key press event to handle the esc event on the widget. + * @param event The key event + */ + void keyPressEvent( QKeyEvent* event ); + + private: + QString mPanelTitle; + bool mDockMode; + +}; + + +/** + * A non model panel page that can get shown to the user. Page will contain a back button and trigger the + * internal widgets acceptPanel() on close. + */ +class GUI_EXPORT QgsPanelWidgetPage : public QgsPanelWidget, private Ui::QgsRendererWidgetContainerBase +{ + Q_OBJECT + public: + + /** + * A non model panel page that can get shown to the user. + * @param widget The internal widget to show in the page. + * @param parent THe parent widget. + */ + QgsPanelWidgetPage( QgsPanelWidget* widget, QWidget* parent = nullptr ); + + ~QgsPanelWidgetPage(); + + /** + * Set the current display page for the panel. + * @param title The title to show to the user. + */ + void setTitle( QString title ); + + private: + QWidget* mWidget; +}; + + +/** + * A stack widget to manage panels in the interface. Handles the open and close events + * for added panels. + * Any widgets that want to have a non blocking panel based interface should use this + * class to manage the panels. + */ +class GUI_EXPORT QgsPanelWidgetStackWidget : public QStackedWidget +{ + Q_OBJECT + public: + + /** + * A stack widget to manage panels in the interface. Handles the open and close events + * for added panels. + * @param parent + */ + QgsPanelWidgetStackWidget( QWidget* parent = nullptr ); + + /** + * Shortcut method to connect panel widgets events to this stack widget. + * @param panels The panels to connect. + */ + void connectPanels( QList panels ); + + /** + * Shortcut method to connect panel widgets events to this stack widget. + * @param panel The panel to connect. + */ + void connectPanel( QgsPanelWidget* panel ); + + /** + * Adds the main widget to the stack and selects it for the user + * The main widget can not be closed and only the showPanel signal is attached + * to handle children widget opening panels. + * @param panel The panel to set as the first widget in the stack. + */ + void addMainPanel( QgsPanelWidget* panel ); + + public slots: + /** + * Show a panel in the stack widget. Will connect to the panels showPanel event to handle + * nested panels. Auto switches the the given panel for the user. + * @param panel The panel to show. + */ + void showPanel( QgsPanelWidget* panel ); + + /** + * Closes the panel in the widget. Will also delete the widget. + * This slot is normally auto connected to panelAccepted when a panel is shown. + * @param panel The panel to close. + */ + void closePanel( QgsPanelWidget* panel ); + private: + QStack mTitles; +}; + + +#endif // QGSPANELWIDGET_H