diff options
author | Eike Ziller <eike.ziller@qt.io> | 2019-08-07 12:44:40 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2019-08-12 07:15:27 +0000 |
commit | c67ed4d35b4ff50a05f92a858096372e2a8eb259 (patch) | |
tree | c78f921fcf91de1e410af78d446d10f088196690 | |
parent | eb2f49c39826cb32a00d17c9d37824d54001a3d8 (diff) | |
download | qt-creator-c67ed4d35b4ff50a05f92a858096372e2a8eb259.tar.gz |
Add global notification area and use for UI Tour info
Adds a global info bar display above the main window's status bar that
can be accessed via ICore::infoBar().
Replace the blocking "Take UI Tour" dialog by a notification there.
Fixes: QTCREATORBUG-22819
Change-Id: I733f1bfd2d1db0295754ed2e28bb202f927d0edb
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: André Hartmann <aha_1980@gmx.de>
-rw-r--r-- | src/plugins/coreplugin/coreplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/fancytabwidget.cpp | 10 | ||||
-rw-r--r-- | src/plugins/coreplugin/fancytabwidget.h | 5 | ||||
-rw-r--r-- | src/plugins/coreplugin/icore.cpp | 5 | ||||
-rw-r--r-- | src/plugins/coreplugin/icore.h | 5 | ||||
-rw-r--r-- | src/plugins/coreplugin/infobar.cpp | 14 | ||||
-rw-r--r-- | src/plugins/coreplugin/infobar.h | 5 | ||||
-rw-r--r-- | src/plugins/coreplugin/mainwindow.cpp | 5 | ||||
-rw-r--r-- | src/plugins/coreplugin/mainwindow.h | 2 | ||||
-rw-r--r-- | src/plugins/welcome/introductionwidget.cpp | 39 |
10 files changed, 67 insertions, 25 deletions
diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 9145fabf37..98bab9d216 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -149,6 +149,7 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) Theme *themeFromArg = ThemeEntry::createTheme(args.themeId); setCreatorTheme(themeFromArg ? themeFromArg : ThemeEntry::createTheme(ThemeEntry::themeSetting())); + InfoBar::initialize(ICore::settings(), creatorTheme()); new ActionManager(this); ActionManager::setPresentationModeEnabled(args.presentationMode); m_mainWindow = new MainWindow; @@ -159,7 +160,6 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) m_mainWindow->init(); m_editMode = new EditMode; ModeManager::activateMode(m_editMode->id()); - InfoBar::initialize(ICore::settings(), creatorTheme()); IWizardFactory::initialize(); diff --git a/src/plugins/coreplugin/fancytabwidget.cpp b/src/plugins/coreplugin/fancytabwidget.cpp index 684b47bd15..9bde8cdf3b 100644 --- a/src/plugins/coreplugin/fancytabwidget.cpp +++ b/src/plugins/coreplugin/fancytabwidget.cpp @@ -517,6 +517,9 @@ FancyTabWidget::FancyTabWidget(QWidget *parent) vlayout->addLayout(m_modesStack); vlayout->addWidget(m_statusBar); + m_infoBarDisplay.setTarget(vlayout, 1); + m_infoBarDisplay.setStyle(QFrame::Sunken); + auto mainLayout = new QHBoxLayout; mainLayout->setMargin(0); mainLayout->setSpacing(1); @@ -611,6 +614,13 @@ QStatusBar *FancyTabWidget::statusBar() const return m_statusBar; } +InfoBar *FancyTabWidget::infoBar() +{ + if (!m_infoBarDisplay.infoBar()) + m_infoBarDisplay.setInfoBar(&m_infoBar); + return &m_infoBar; +} + void FancyTabWidget::setCurrentIndex(int index) { m_tabBar->setCurrentIndex(index); diff --git a/src/plugins/coreplugin/fancytabwidget.h b/src/plugins/coreplugin/fancytabwidget.h index c9a7264d80..00d04f376b 100644 --- a/src/plugins/coreplugin/fancytabwidget.h +++ b/src/plugins/coreplugin/fancytabwidget.h @@ -25,6 +25,8 @@ #pragma once +#include "infobar.h" + #include <QIcon> #include <QWidget> @@ -157,6 +159,7 @@ public: int currentIndex() const; QStatusBar *statusBar() const; + InfoBar *infoBar(); void setTabEnabled(int index, bool enable); bool isTabEnabled(int index) const; @@ -183,6 +186,8 @@ private: QStackedLayout *m_modesStack; QWidget *m_selectionWidget; QStatusBar *m_statusBar; + InfoBarDisplay m_infoBarDisplay; + InfoBar m_infoBar; }; } // namespace Internal diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index 63eba664cc..4341a0d20f 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -561,6 +561,11 @@ QStatusBar *ICore::statusBar() return m_mainwindow->statusBar(); } +InfoBar *ICore::infoBar() +{ + return m_mainwindow->infoBar(); +} + void ICore::raiseWindow(QWidget *widget) { if (!widget) diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index 04d501e134..ca07a7844d 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -43,9 +43,10 @@ template <typename T> class QList; QT_END_NAMESPACE namespace Core { -class IWizardFactory; class Context; class IContext; +class InfoBar; +class IWizardFactory; class SettingsDatabase; namespace Internal { class MainWindow; } @@ -107,6 +108,8 @@ public: static QMainWindow *mainWindow(); static QWidget *dialogParent(); static QStatusBar *statusBar(); + static InfoBar *infoBar(); + /* Raises and activates the window for the widget. This contains workarounds for X11. */ static void raiseWindow(QWidget *widget); diff --git a/src/plugins/coreplugin/infobar.cpp b/src/plugins/coreplugin/infobar.cpp index a81a8834d5..eb6496e36a 100644 --- a/src/plugins/coreplugin/infobar.cpp +++ b/src/plugins/coreplugin/infobar.cpp @@ -30,7 +30,6 @@ #include <utils/theme/theme.h> #include <utils/utilsicons.h> -#include <QFrame> #include <QHBoxLayout> #include <QSettings> #include <QVBoxLayout> @@ -207,6 +206,17 @@ void InfoBarDisplay::setInfoBar(InfoBar *infoBar) update(); } +void InfoBarDisplay::setStyle(QFrame::Shadow style) +{ + m_style = style; + update(); +} + +InfoBar *InfoBarDisplay::infoBar() const +{ + return m_infoBar; +} + void InfoBarDisplay::infoBarDestroyed() { m_infoBar = nullptr; @@ -236,7 +246,7 @@ void InfoBarDisplay::update() } infoWidget->setPalette(pal); - infoWidget->setFrameStyle(QFrame::Panel | QFrame::Raised); + infoWidget->setFrameStyle(QFrame::Panel | m_style); infoWidget->setLineWidth(1); infoWidget->setAutoFillBackground(true); diff --git a/src/plugins/coreplugin/infobar.h b/src/plugins/coreplugin/infobar.h index 74a0f8136f..fd8f476c1d 100644 --- a/src/plugins/coreplugin/infobar.h +++ b/src/plugins/coreplugin/infobar.h @@ -28,6 +28,7 @@ #include "core_global.h" #include <coreplugin/id.h> +#include <QFrame> #include <QObject> #include <QSet> @@ -127,6 +128,9 @@ public: InfoBarDisplay(QObject *parent = nullptr); void setTarget(QBoxLayout *layout, int index); void setInfoBar(InfoBar *infoBar); + void setStyle(QFrame::Shadow style); + + InfoBar *infoBar() const; private: void update(); @@ -136,6 +140,7 @@ private: QList<QWidget *> m_infoWidgets; InfoBar *m_infoBar = nullptr; QBoxLayout *m_boxLayout = nullptr; + QFrame::Shadow m_style = QFrame::Raised; int m_boxIndex = 0; bool m_isShowingDetailsWidget = false; }; diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index dd724d9f9c..c55411d5ec 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -365,6 +365,11 @@ QStatusBar *MainWindow::statusBar() const return m_modeStack->statusBar(); } +InfoBar *MainWindow::infoBar() const +{ + return m_modeStack->infoBar(); +} + void MainWindow::registerDefaultContainers() { ActionContainer *menubar = ActionManager::createMenuBar(Constants::MENU_BAR); diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index 8f9939ee8f..26dc607cbe 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -46,6 +46,7 @@ namespace Core { class EditorManager; class ExternalToolManager; class IDocument; +class InfoBar; class JsExpander; class MessageManager; class ModeManager; @@ -93,6 +94,7 @@ public: virtual QPrinter *printer() const; IContext * currentContextObject() const; QStatusBar *statusBar() const; + InfoBar *infoBar() const; void updateAdditionalContexts(const Context &remove, const Context &add, ICore::ContextPriority priority); diff --git a/src/plugins/welcome/introductionwidget.cpp b/src/plugins/welcome/introductionwidget.cpp index 82539fd996..8eb3a268d0 100644 --- a/src/plugins/welcome/introductionwidget.cpp +++ b/src/plugins/welcome/introductionwidget.cpp @@ -25,6 +25,8 @@ #include "introductionwidget.h" +#include <coreplugin/icore.h> +#include <coreplugin/infobar.h> #include <utils/algorithm.h> #include <utils/checkablemessagebox.h> #include <utils/qtcassert.h> @@ -47,29 +49,24 @@ namespace Internal { void IntroductionWidget::askUserAboutIntroduction(QWidget *parent, QSettings *settings) { - if (!CheckableMessageBox::shouldAskAgain(settings, kTakeTourSetting)) + // CheckableMessageBox for compatibility with Qt Creator < 4.11 + if (!CheckableMessageBox::shouldAskAgain(settings, kTakeTourSetting) + || !Core::ICore::infoBar()->canInfoBeAdded(kTakeTourSetting)) return; - auto messageBox = new CheckableMessageBox(parent); - messageBox->setWindowTitle(tr("Take a UI Tour")); - messageBox->setText( - tr("Would you like to take a quick UI tour? This tour highlights important user " - "interface elements and shows how they are used. To take the tour later, " - "select Help > UI Tour.")); - messageBox->setCheckBoxVisible(true); - messageBox->setCheckBoxText(CheckableMessageBox::msgDoNotAskAgain()); - messageBox->setChecked(true); - messageBox->setStandardButtons(QDialogButtonBox::Cancel); - QPushButton *tourButton = messageBox->addButton(tr("Take UI Tour"), QDialogButtonBox::AcceptRole); - connect(messageBox, &QDialog::finished, parent, [parent, settings, messageBox, tourButton]() { - if (messageBox->isChecked()) - CheckableMessageBox::doNotAskAgain(settings, kTakeTourSetting); - if (messageBox->clickedButton() == tourButton) { - auto intro = new IntroductionWidget(parent); - intro->show(); - } - messageBox->deleteLater(); + + Core::InfoBarEntry + info(kTakeTourSetting, + tr("Would you like to take a quick UI tour? This tour highlights important user " + "interface elements and shows how they are used. To take the tour later, " + "select Help > UI Tour."), + Core::InfoBarEntry::GlobalSuppressionEnabled); + info.setCustomButtonInfo(tr("Take UI Tour"), [parent] { + Core::ICore::infoBar()->removeInfo(kTakeTourSetting); + Core::ICore::infoBar()->globallySuppressInfo(kTakeTourSetting); + auto intro = new IntroductionWidget(parent); + intro->show(); }); - messageBox->show(); + Core::ICore::infoBar()->addInfo(info); } IntroductionWidget::IntroductionWidget(QWidget *parent) |