Git commit 7c30b4ea1848cb836352ee8034dbf4f3d29a4650 by Jan Kundr?t. Committed on 30/05/2013 at 23:24. Pushed by jkt into branch 'master'.
GUI: use RAII for the one-at-time layout instead of manual slot setup and other stuff M +4 -2 src/Gui/Gui.pro A +96 -0 src/Gui/OnePanelAtTimeWidget.cpp [License: GPL (v2/3)] A +63 -0 src/Gui/OnePanelAtTimeWidget.h [License: GPL (v2/3)] M +2 -56 src/Gui/Window.cpp M +0 -3 src/Gui/Window.h http://commits.kde.org/trojita/7c30b4ea1848cb836352ee8034dbf4f3d29a4650 diff --git a/src/Gui/Gui.pro b/src/Gui/Gui.pro index 13bd104..4b6ca50 100644 --- a/src/Gui/Gui.pro +++ b/src/Gui/Gui.pro @@ -56,7 +56,8 @@ SOURCES += \ ProgressPopUp.cpp \ OverlayWidget.cpp \ EnvelopeView.cpp \ - ReplaceCharValidator.cpp + ReplaceCharValidator.cpp \ + OnePanelAtTimeWidget.cpp HEADERS += \ ../Imap/Model/ModelTest/modeltest.h \ ComposeWidget.h \ @@ -98,7 +99,8 @@ HEADERS += \ ProgressPopUp.h \ OverlayWidget.h \ EnvelopeView.h \ - ReplaceCharValidator.h + ReplaceCharValidator.h \ + OnePanelAtTimeWidget.h FORMS += CreateMailboxDialog.ui \ ComposeWidget.ui \ SettingsImapPage.ui \ diff --git a/src/Gui/OnePanelAtTimeWidget.cpp b/src/Gui/OnePanelAtTimeWidget.cpp new file mode 100644 index 0000000..b6c0ca7 --- /dev/null +++ b/src/Gui/OnePanelAtTimeWidget.cpp @@ -0,0 +1,96 @@ +/* Copyright (C) 2006 - 2013 Jan Kundr?t <jkt at flaska.net> + + This file is part of the Trojita Qt IMAP e-mail client, + http://trojita.flaska.net/ + + 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) version 3 or any later version + accepted by the membership of KDE e.V. (or its successor approved + by the membership of KDE e.V.), which shall act as a proxy + defined in Section 14 of version 3 of the license. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "OnePanelAtTimeWidget.h" +#include <QAction> +#include <QMainWindow> +#include <QToolBar> +#include "CompleteMessageWidget.h" +#include "MailBoxTreeView.h" +#include "MessageListWidget.h" +#include "MsgListView.h" + +namespace Gui { + +OnePanelAtTimeWidget::OnePanelAtTimeWidget(QMainWindow *mainWindow, MailBoxTreeView *mboxTree, MessageListWidget *msgListWidget, + CompleteMessageWidget *messageWidget, QToolBar *toolbar, QAction *actionGoBack): + QStackedWidget(mainWindow), m_mainWindow(mainWindow), m_mboxTree(mboxTree), m_msgListWidget(msgListWidget), + m_messageWidget(messageWidget), m_toolbar(toolbar), m_actionGoBack(actionGoBack) +{ + addWidget(m_mboxTree); + addWidget(m_msgListWidget); + addWidget(m_messageWidget); + setCurrentWidget(m_mboxTree); + + connect(m_msgListWidget->tree, SIGNAL(clicked(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); + connect(m_msgListWidget->tree, SIGNAL(activated(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); + connect(m_mboxTree, SIGNAL(clicked(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); + connect(m_mboxTree, SIGNAL(activated(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); + connect(m_actionGoBack, SIGNAL(triggered()), this, SLOT(slotOneAtTimeGoBack())); + + // The list view is configured to auto-emit activated(QModelIndex) after a short while when the user has navigated + // to an index through keyboard. Of course, this doesn't play terribly well with this layout. + m_msgListWidget->tree->setAutoActivateAfterKeyNavigation(false); + + m_toolbar->addAction(m_actionGoBack); +} + +OnePanelAtTimeWidget::~OnePanelAtTimeWidget() +{ + while (count()) { + QWidget *w = widget(0); + removeWidget(w); + w->show(); + } + m_msgListWidget->tree->setAutoActivateAfterKeyNavigation(false); + + m_toolbar->removeAction(m_actionGoBack); + + // The size of the widgets is still wrong. Let's fix this. + if (m_mainWindow->isMaximized()) { + m_mainWindow->showNormal(); + m_mainWindow->showMaximized(); + } else { + m_mainWindow->resize(m_mainWindow->sizeHint()); + } +} + +void OnePanelAtTimeWidget::slotOneAtTimeGoBack() +{ + if (currentIndex() > 0) + setCurrentIndex(currentIndex() - 1); + + m_actionGoBack->setEnabled(currentIndex() > 0); +} + +void OnePanelAtTimeWidget::slotOneAtTimeGoDeeper() +{ + // Careful here: some of the events are, unfortunately, emitted twice (one for clicked(), another time for activated()) + if (sender() == m_msgListWidget->tree) + setCurrentIndex(indexOf(m_msgListWidget) + 1); + else if (sender() == m_mboxTree) + setCurrentIndex(indexOf(static_cast<QWidget*>(sender())) + 1); + + m_actionGoBack->setEnabled(currentIndex() > 0); +} + +} diff --git a/src/Gui/OnePanelAtTimeWidget.h b/src/Gui/OnePanelAtTimeWidget.h new file mode 100644 index 0000000..47ed96b --- /dev/null +++ b/src/Gui/OnePanelAtTimeWidget.h @@ -0,0 +1,63 @@ +/* Copyright (C) 2006 - 2013 Jan Kundr?t <jkt at flaska.net> + + This file is part of the Trojita Qt IMAP e-mail client, + http://trojita.flaska.net/ + + 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) version 3 or any later version + accepted by the membership of KDE e.V. (or its successor approved + by the membership of KDE e.V.), which shall act as a proxy + defined in Section 14 of version 3 of the license. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ +#ifndef GUI_ONEPANELATTIME_H +#define GUI_ONEPANELATTIME_H + +#include <QStackedWidget> + +class QAction; +class QMainWindow; +class QToolBar; + +namespace Gui +{ + +class CompleteMessageWidget; +class MailBoxTreeView; +class MessageListWidget; + +/** @short Implementation of the "show one panel at a time" mode */ +class OnePanelAtTimeWidget: public QStackedWidget +{ + Q_OBJECT +public: + OnePanelAtTimeWidget(QMainWindow *mainWindow, MailBoxTreeView *mboxTree, MessageListWidget *msgListWidget, + CompleteMessageWidget *messageWidget, QToolBar *toolbar, QAction* toolbarActions); + virtual ~OnePanelAtTimeWidget(); + +public slots: + void slotOneAtTimeGoBack(); + void slotOneAtTimeGoDeeper(); + +private: + QMainWindow *m_mainWindow; + MailBoxTreeView *m_mboxTree; + MessageListWidget *m_msgListWidget; + CompleteMessageWidget *m_messageWidget; + + QToolBar *m_toolbar; + QAction *m_actionGoBack; +}; + +} + +#endif // GUI_ONEPANELATTIME_H diff --git a/src/Gui/Window.cpp b/src/Gui/Window.cpp index aec57b5..c4fd429 100644 --- a/src/Gui/Window.cpp +++ b/src/Gui/Window.cpp @@ -70,6 +70,7 @@ #include "MessageView.h" #include "MessageSourceWidget.h" #include "MsgListView.h" +#include "OnePanelAtTimeWidget.h" #include "PasswordDialog.h" #include "ProtocolLoggerWidget.h" #include "SettingsDialog.h" @@ -275,7 +276,6 @@ void MainWindow::createActions() m_oneAtTimeGoBack = new QAction(loadIcon(QLatin1String("go-previous")), tr("Navigate Back"), this); m_oneAtTimeGoBack->setShortcut(QKeySequence::Back); m_oneAtTimeGoBack->setEnabled(false); - connect(m_oneAtTimeGoBack, SIGNAL(triggered()), this, SLOT(slotOneAtTimeGoBack())); composeMail = ShortcutHandler::instance()->createAction("action_compose_mail", this, SLOT(slotComposeMail()), this); m_editDraft = ShortcutHandler::instance()->createAction("action_compose_draft", this, SLOT(slotEditDraft()), this); @@ -2091,7 +2091,6 @@ void MainWindow::slotLayoutCompact() setMinimumWidth(MINIMUM_WIDTH_NORMAL); delete m_mainStack; - undoLayoutOneAtTimeCraziness(); m_layoutMode = LAYOUT_COMPACT; QSettings().setValue(Common::SettingsNames::guiMainWindowLayout, Common::SettingsNames::guiMainWindowLayoutCompact); @@ -2123,7 +2122,6 @@ void MainWindow::slotLayoutWide() delete m_mainStack; delete m_mainVSplitter; - undoLayoutOneAtTimeCraziness(); m_layoutMode = LAYOUT_WIDE; QSettings().setValue(Common::SettingsNames::guiMainWindowLayout, Common::SettingsNames::guiMainWindowLayoutWide); @@ -2136,70 +2134,18 @@ void MainWindow::slotLayoutOneAtTime() if (m_mainStack) return; - m_mainStack = new QStackedWidget(); - m_mainStack->addWidget(mboxTree); - m_mainStack->addWidget(msgListWidget); - m_mainStack->addWidget(m_messageWidget); - m_mainStack->setCurrentWidget(mboxTree); + m_mainStack = new OnePanelAtTimeWidget(this, mboxTree, msgListWidget, m_messageWidget, m_mainToolbar, m_oneAtTimeGoBack); setCentralWidget(m_mainStack); setMinimumWidth(MINIMUM_WIDTH_NORMAL); delete m_mainHSplitter; delete m_mainVSplitter; - // The list view is configured to auto-emit activated(QModelIndex) after a short while when the user has navigated - // to an index through keyboard. Of course, this doesn't play terribly well with this layout. - msgListWidget->tree->setAutoActivateAfterKeyNavigation(false); - - connect(msgListWidget->tree, SIGNAL(clicked(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - connect(msgListWidget->tree, SIGNAL(activated(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - connect(mboxTree, SIGNAL(clicked(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - connect(mboxTree, SIGNAL(activated(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - m_mainToolbar->addAction(m_oneAtTimeGoBack); - m_layoutMode = LAYOUT_ONE_AT_TIME; QSettings().setValue(Common::SettingsNames::guiMainWindowLayout, Common::SettingsNames::guiMainWindowLayoutOneAtTime); applySizesAndState(); } -/** @short Undo whatever crazy modification were required for the "one at a time" layout madness */ -void MainWindow::undoLayoutOneAtTimeCraziness() -{ - disconnect(msgListWidget->tree, SIGNAL(clicked(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - disconnect(msgListWidget->tree, SIGNAL(activated(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - disconnect(mboxTree, SIGNAL(clicked(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - disconnect(mboxTree, SIGNAL(activated(QModelIndex)), this, SLOT(slotOneAtTimeGoDeeper())); - m_mainToolbar->removeAction(m_oneAtTimeGoBack); - msgListWidget->tree->setAutoActivateAfterKeyNavigation(true); - - // The size of the widgets is still wrong. Let's fix this. - if (isMaximized()) { - showNormal(); - showMaximized(); - } else { - resize(sizeHint()); - } -} - -void MainWindow::slotOneAtTimeGoBack() -{ - if (m_mainStack->currentIndex() > 0) - m_mainStack->setCurrentIndex(m_mainStack->currentIndex() - 1); - - m_oneAtTimeGoBack->setEnabled(m_mainStack->currentIndex() > 0); -} - -void MainWindow::slotOneAtTimeGoDeeper() -{ - // Careful here: some of the events are, unfortunately, emitted twice (one for clicked(), another time for activated()) - if (sender() == msgListWidget->tree) - m_mainStack->setCurrentIndex(m_mainStack->indexOf(msgListWidget) + 1); - else if (sender() == mboxTree) - m_mainStack->setCurrentIndex(m_mainStack->indexOf(static_cast<QWidget*>(sender())) + 1); - - m_oneAtTimeGoBack->setEnabled(m_mainStack->currentIndex() > 0); -} - Imap::Mailbox::Model *MainWindow::imapModel() const { return model; diff --git a/src/Gui/Window.h b/src/Gui/Window.h index 5f30b0f..698cc00 100644 --- a/src/Gui/Window.h +++ b/src/Gui/Window.h @@ -174,8 +174,6 @@ private slots: void slotLayoutCompact(); void slotLayoutWide(); void slotLayoutOneAtTime(); - void slotOneAtTimeGoBack(); - void slotOneAtTimeGoDeeper(); void saveSizesAndState(const LayoutMode oldMode); void saveSizesAndState(); @@ -205,7 +203,6 @@ private: void migrateSettings(); void applySizesAndState(); QString settingsKeyForLayout(const LayoutMode layout); - void undoLayoutOneAtTimeCraziness(); void recoverDrafts(); void createSysTray();
