Git commit 6fd4529e23f127308a3e178b1c3089aba9dcabdf by Jan Kundrát. Committed on 03/06/2016 at 17:33. Pushed by gerrit into branch 'master'.
GUI: remember expanded/collapsed mailboxes The code now remembers the expanded/collapsed state of the mailbox tree view, and will restore them upon network reconnect and/or application restart. Change-Id: I08e2eb397f1f286962eb0fda7fd47c607b9ffd27 M +1 -0 src/Common/SettingsNames.cpp M +1 -0 src/Common/SettingsNames.h M +60 -2 src/Gui/MailBoxTreeView.cpp M +22 -3 src/Gui/MailBoxTreeView.h M +4 -0 src/Gui/Window.cpp M +3 -3 src/Imap/Model/MailboxFinder.cpp M +2 -2 src/Imap/Model/MailboxFinder.h http://commits.kde.org/trojita/6fd4529e23f127308a3e178b1c3089aba9dcabdf diff --git a/src/Common/SettingsNames.cpp b/src/Common/SettingsNames.cpp index e07ad61..de4117d 100644 --- a/src/Common/SettingsNames.cpp +++ b/src/Common/SettingsNames.cpp @@ -98,6 +98,7 @@ const QString SettingsNames::guiSizesInMainWinWhenCompact = QStringLiteral("gui/ const QString SettingsNames::guiSizesInMainWinWhenWide = QStringLiteral("gui/sizeInMainWinWhenWide-%1"); const QString SettingsNames::guiSizesInaMainWinWhenOneAtATime = QStringLiteral("gui/sizeInMainWinWhenOneAtATime-%1"); const QString SettingsNames::guiAllowRawSearch = QStringLiteral("gui/allowRawSearch"); +const QString SettingsNames::guiExpandedMailboxes = QStringLiteral("gui/expandedMailboxes"); const QString SettingsNames::appLoadHomepage = QStringLiteral("app.updates.checkEnabled"); const QString SettingsNames::knownEmailsKey = QStringLiteral("addressBook/knownEmails"); const QString SettingsNames::addressbookPlugin = QStringLiteral("plugin/addressbook"); diff --git a/src/Common/SettingsNames.h b/src/Common/SettingsNames.h index 0402cfa..45c3d9d 100644 --- a/src/Common/SettingsNames.h +++ b/src/Common/SettingsNames.h @@ -49,6 +49,7 @@ struct SettingsNames { static const QString guiMainWindowLayout, guiMainWindowLayoutCompact, guiMainWindowLayoutWide, guiMainWindowLayoutOneAtTime; static const QString guiSizesInMainWinWhenCompact, guiSizesInMainWinWhenWide, guiSizesInaMainWinWhenOneAtATime; static const QString guiAllowRawSearch; + static const QString guiExpandedMailboxes; static const QString appLoadHomepage; static const QString guiShowSystray, guiOnSystrayClose, guiStartMinimized; static const QString knownEmailsKey; diff --git a/src/Gui/MailBoxTreeView.cpp b/src/Gui/MailBoxTreeView.cpp index 3d9565c..8cec5cc 100644 --- a/src/Gui/MailBoxTreeView.cpp +++ b/src/Gui/MailBoxTreeView.cpp @@ -1,4 +1,5 @@ /* Copyright (C) 2012 Thomas Gahr <[email protected]> + Copyright (C) 2006 - 2016 Jan Kundrát <[email protected]> This file is part of the Trojita Qt IMAP e-mail client, http://trojita.flaska.net/ @@ -20,17 +21,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "MailBoxTreeView.h" - #include <QDragMoveEvent> #include <QDropEvent> #include <QMenu> +#include "Gui/MailBoxTreeView.h" +#include "Imap/Model/ItemRoles.h" +#include "Imap/Model/MailboxFinder.h" #include "UiUtils/IconLoader.h" namespace Gui { MailBoxTreeView::MailBoxTreeView(QWidget *parent) : QTreeView(parent) + , m_mailboxFinder(nullptr) { setUniformRowHeights(true); setContextMenuPolicy(Qt::CustomContextMenu); @@ -41,6 +44,40 @@ MailBoxTreeView::MailBoxTreeView(QWidget *parent) setHeaderHidden(true); // I wonder what's the best value to use here. Unfortunately, the default is to disable auto expanding. setAutoExpandDelay(800); + + // Track expansion/collapsing so that we remember this state despite the asynchronous nature of mailbox loading + connect(this, &QTreeView::expanded, this, [this](const QModelIndex &what) { + auto name = what.data(Imap::Mailbox::RoleMailboxName).toString(); + if (!m_desiredExpansionState.contains(name)) { + m_desiredExpansionState.insert(name); + emit mailboxExpansionChanged(m_desiredExpansionState.toList()); + } + }); + connect(this, &QTreeView::collapsed, this, [this](const QModelIndex &what) { + auto name = what.data(Imap::Mailbox::RoleMailboxName).toString(); + if (m_desiredExpansionState.remove(name)) { + emit mailboxExpansionChanged(m_desiredExpansionState.toList()); + } + }); +} + +/** \reimp + +The MailboxFinder has to be kept up-to-speed about these changes. +*/ +void MailBoxTreeView::setModel(QAbstractItemModel *model) +{ + delete m_mailboxFinder; + m_mailboxFinder = new Imap::Mailbox::MailboxFinder(this, model); + connect(m_mailboxFinder, &Imap::Mailbox::MailboxFinder::mailboxFound, + this, [this](const QString &, const QModelIndex &index) { + expand(index); + }); + connect(model, &QAbstractItemModel::layoutChanged, this, &MailBoxTreeView::resetWatchedMailboxes); + connect(model, &QAbstractItemModel::rowsRemoved, this, &MailBoxTreeView::resetWatchedMailboxes); + connect(model, &QAbstractItemModel::modelReset, this, &MailBoxTreeView::resetWatchedMailboxes); + QTreeView::setModel(model); + resetWatchedMailboxes(); } /** @short Reimplemented for more consistent handling of modifiers @@ -95,4 +132,25 @@ void MailBoxTreeView::dropEvent(QDropEvent *event) QTreeView::dropEvent(event); } +/** @short Specify which mailboxes should be expanded + +The mailboxes might appear and disappear at any time, so let's make sure that +they are properly expanded/collapsed once they pop in. +*/ +void MailBoxTreeView::setDesiredExpansion(const QStringList &mailboxNames) +{ + m_desiredExpansionState = mailboxNames.toSet(); + resetWatchedMailboxes(); +} + +/** @short Ensure that we watch stuff that we need to watch */ +void MailBoxTreeView::resetWatchedMailboxes() +{ + if (m_mailboxFinder) { + for (const auto &mailbox: m_desiredExpansionState) { + m_mailboxFinder->addMailbox(mailbox); + } + } +} + } diff --git a/src/Gui/MailBoxTreeView.h b/src/Gui/MailBoxTreeView.h index ddff392..7bbe8a2 100644 --- a/src/Gui/MailBoxTreeView.h +++ b/src/Gui/MailBoxTreeView.h @@ -1,4 +1,5 @@ /* Copyright (C) 2012 Thomas Gahr <[email protected]> + Copyright (C) 2006 - 2016 Jan Kundrát <[email protected]> This file is part of the Trojita Qt IMAP e-mail client, http://trojita.flaska.net/ @@ -25,18 +26,36 @@ #include <QTreeView> -namespace Gui{ +namespace Imap { +namespace Mailbox { +class MailboxFinder; +} +} -/** @short Subclassed for more consistent and intuitive handling of Drag&Drop -*/ +namespace Gui { + +/** @short Show mailboxes in a tree view */ class MailBoxTreeView : public QTreeView { Q_OBJECT public: explicit MailBoxTreeView(QWidget *parent = nullptr); + void setDesiredExpansion(const QStringList &mailboxNames); + void setModel(QAbstractItemModel *model) override; +signals: + /** @short User has changed their mind about the expanded/collapsed state of the mailbox tree + + Stuff which gets reported here might refer to mailboxes which do not even exist. At the same time, + the code will not forget about those mailboxes which "aren't there yet". + */ + void mailboxExpansionChanged(const QStringList &mailboxNames); protected: void dragMoveEvent(QDragMoveEvent *event) override; void dropEvent(QDropEvent *event) override; + void resetWatchedMailboxes(); +private: + Imap::Mailbox::MailboxFinder *m_mailboxFinder; + QSet<QString> m_desiredExpansionState; }; } diff --git a/src/Gui/Window.cpp b/src/Gui/Window.cpp index 0845a7e..18390ba 100644 --- a/src/Gui/Window.cpp +++ b/src/Gui/Window.cpp @@ -718,7 +718,11 @@ void MainWindow::createWidgets() connect(m_delayedStateSaving, &QTimer::timeout, this, &MainWindow::saveSizesAndState); mboxTree = new MailBoxTreeView(); + mboxTree->setDesiredExpansion(m_settings->value(Common::SettingsNames::guiExpandedMailboxes).toStringList()); connect(mboxTree, &QWidget::customContextMenuRequested, this, &MainWindow::showContextMenuMboxTree); + connect(mboxTree, &MailBoxTreeView::mailboxExpansionChanged, this, [this](const QStringList &mailboxNames) { + m_settings->setValue(Common::SettingsNames::guiExpandedMailboxes, mailboxNames); + }); msgListWidget = new MessageListWidget(); msgListWidget->tree->setContextMenuPolicy(Qt::CustomContextMenu); diff --git a/src/Imap/Model/MailboxFinder.cpp b/src/Imap/Model/MailboxFinder.cpp index aa7844b..c6a627c 100644 --- a/src/Imap/Model/MailboxFinder.cpp +++ b/src/Imap/Model/MailboxFinder.cpp @@ -49,13 +49,13 @@ MailboxFinder::MailboxFinder(QObject *parent, QAbstractItemModel *model) void MailboxFinder::addMailbox(const QString &mailbox) { - m_watchedNames.append(mailbox); + m_pending.insert(mailbox); EMIT_LATER_NOARG(this, checkArrivals); } void MailboxFinder::checkArrivals() { - Q_FOREACH(const QString &mailbox, m_watchedNames) { + Q_FOREACH(const QString &mailbox, m_pending) { QModelIndex root; bool cont = false; @@ -77,7 +77,7 @@ void MailboxFinder::checkArrivals() if (possibleName == mailbox) { // found it - m_watchedNames.removeAll(mailbox); + m_pending.remove(mailbox); emit mailboxFound(mailbox, index); break; } else if (mailbox.startsWith(possibleName + separator)) { diff --git a/src/Imap/Model/MailboxFinder.h b/src/Imap/Model/MailboxFinder.h index ebe66b6..d6d8104 100644 --- a/src/Imap/Model/MailboxFinder.h +++ b/src/Imap/Model/MailboxFinder.h @@ -31,7 +31,7 @@ #define TROJITA_IMAP_MAILBOXFINDER_H #include <QModelIndex> -#include <QStringList> +#include <QSet> namespace Imap { @@ -74,7 +74,7 @@ private slots: private: QAbstractItemModel *m_model; - QStringList m_watchedNames; + QSet<QString> m_pending; }; } _______________________________________________ kde-doc-english mailing list [email protected] https://mail.kde.org/mailman/listinfo/kde-doc-english
