Git commit 93c40eae89cc5f919750ae0d15800bd2a6cd02a8 by Jan Kundr?t. Committed on 21/02/2013 at 20:17. Pushed by jkt into branch 'master'.
GUI: make it possible to inline-search a message A +58 -0 src/Gui/CompleteMessageWidget.cpp [License: GPL (v2/3)] A +57 -0 src/Gui/CompleteMessageWidget.h [License: GPL (v2/3)] M +4 -2 src/Gui/Gui.pro M +5 -0 src/Gui/MessageView.cpp M +2 -0 src/Gui/MessageView.h M +8 -1 src/Gui/SimplePartWidget.cpp M +2 -0 src/Gui/SimplePartWidget.h M +26 -31 src/Gui/Window.cpp M +2 -2 src/Gui/Window.h http://commits.kde.org/trojita/93c40eae89cc5f919750ae0d15800bd2a6cd02a8 diff --git a/src/Gui/CompleteMessageWidget.cpp b/src/Gui/CompleteMessageWidget.cpp new file mode 100644 index 0000000..6eb25d1 --- /dev/null +++ b/src/Gui/CompleteMessageWidget.cpp @@ -0,0 +1,58 @@ +/* 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 "CompleteMessageWidget.h" +#include <QScrollArea> +#include <QVBoxLayout> +#include "FindBar.h" +#include "MessageView.h" + +namespace Gui { + +CompleteMessageWidget::CompleteMessageWidget(QWidget *parent): QWidget(parent) +{ + messageView = new MessageView(); + area = new QScrollArea(); + area->setWidget(messageView); + area->setWidgetResizable(true); + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(area); + + m_findBar = new FindBar(this); + layout->addWidget(m_findBar); + + connect(messageView, SIGNAL(searchRequestedBy(QWebView*)), this, SLOT(searchRequestedBy(QWebView*))); +} + +void CompleteMessageWidget::searchRequestedBy(QWebView *webView) +{ + if (m_findBar->isVisible() || !webView) { + m_findBar->setAssociatedWebView(0); + m_findBar->hide(); + } else { + m_findBar->setAssociatedWebView(webView); + m_findBar->show(); + } +} + +} diff --git a/src/Gui/CompleteMessageWidget.h b/src/Gui/CompleteMessageWidget.h new file mode 100644 index 0000000..1d662d6 --- /dev/null +++ b/src/Gui/CompleteMessageWidget.h @@ -0,0 +1,57 @@ +/* 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_COMPLETEMESSAGEWIDGET_H +#define GUI_COMPLETEMESSAGEWIDGET_H + +#include <QWidget> + +class QScrollArea; +class QWebView; + +namespace Gui +{ + +class FindBar; +class MessageView; + +class CompleteMessageWidget: public QWidget +{ + Q_OBJECT +public: + explicit CompleteMessageWidget(QWidget *parent=0); + + MessageView *messageView; + QScrollArea *area; + +private slots: + void searchRequestedBy(QWebView *webView); + +private: + CompleteMessageWidget(const CompleteMessageWidget &); // don't implement + CompleteMessageWidget &operator=(const CompleteMessageWidget &); // don't implement + + FindBar *m_findBar; +}; + +} + +#endif // GUI_COMPLETEMESSAGEWIDGET_H diff --git a/src/Gui/Gui.pro b/src/Gui/Gui.pro index d2e55b0..08bde9f 100644 --- a/src/Gui/Gui.pro +++ b/src/Gui/Gui.pro @@ -49,7 +49,8 @@ SOURCES += \ ComposerAttachments.cpp \ FromAddressProxyModel.cpp \ MessageSourceWidget.cpp \ - FindBar.cpp + FindBar.cpp \ + CompleteMessageWidget.cpp HEADERS += \ ../Imap/Model/ModelTest/modeltest.h \ ComposeWidget.h \ @@ -84,7 +85,8 @@ HEADERS += \ ComposerAttachments.h \ FromAddressProxyModel.h \ MessageSourceWidget.h \ - FindBar.h + FindBar.h \ + CompleteMessageWidget.h FORMS += CreateMailboxDialog.ui \ ComposeWidget.ui \ SettingsImapPage.ui \ diff --git a/src/Gui/MessageView.cpp b/src/Gui/MessageView.cpp index 343bf61..27abc4f 100644 --- a/src/Gui/MessageView.cpp +++ b/src/Gui/MessageView.cpp @@ -573,6 +573,11 @@ void MessageView::partLinkHovered(const QString &link, const QString &title, con emit linkHovered(link); } +void MessageView::triggerSearchDialog() +{ + emit searchRequestedBy(qobject_cast<QWebView*>(sender())); +} + QModelIndex MessageView::currentMessage() const { return message; diff --git a/src/Gui/MessageView.h b/src/Gui/MessageView.h index 62f0adb..41dcf15 100644 --- a/src/Gui/MessageView.h +++ b/src/Gui/MessageView.h @@ -85,9 +85,11 @@ private slots: void headerLinkActivated(QString); void partContextMenuRequested(const QPoint &point); void partLinkHovered(const QString &link, const QString &title, const QString &textContent); + void triggerSearchDialog(); signals: void messageChanged(); void linkHovered(const QString &url); + void searchRequestedBy(QWebView *webView); private: bool eventFilter(QObject *object, QEvent *event); Imap::Message::Envelope envelope() const; diff --git a/src/Gui/SimplePartWidget.cpp b/src/Gui/SimplePartWidget.cpp index 0610243..b4c0a0b 100644 --- a/src/Gui/SimplePartWidget.cpp +++ b/src/Gui/SimplePartWidget.cpp @@ -57,6 +57,11 @@ SimplePartWidget::SimplePartWidget(QWidget *parent, Imap::Network::MsgPartNetAcc connect(saveAction, SIGNAL(triggered()), fileDownloadManager, SLOT(slotDownloadNow())); this->addAction(saveAction); + m_findAction = new QAction(tr("Search..."), this); + m_findAction->setShortcut(tr("Ctrl+F")); + connect(m_findAction, SIGNAL(triggered()), this, SIGNAL(searchDialogRequested())); + addAction(m_findAction); + setContextMenuPolicy(Qt::CustomContextMenu); } @@ -143,7 +148,7 @@ void SimplePartWidget::reloadContents() QList<QAction *> SimplePartWidget::contextMenuSpecificActions() const { - return QList<QAction*>() << saveAction; + return QList<QAction*>() << saveAction << m_findAction; } /** @short Connect various signals which require a certain reaction from the rest of the GUI */ @@ -156,6 +161,8 @@ void SimplePartWidget::connectGuiInteractionEvents(QObject *guiInteractionTarget connect(page(), SIGNAL(linkHovered(QString,QString,QString)), this, SIGNAL(linkHovered(QString,QString,QString))); connect(this, SIGNAL(linkHovered(QString,QString,QString)), guiInteractionTarget, SLOT(partLinkHovered(QString,QString,QString))); + + connect(this, SIGNAL(searchDialogRequested()), guiInteractionTarget, SLOT(triggerSearchDialog())); } } diff --git a/src/Gui/SimplePartWidget.h b/src/Gui/SimplePartWidget.h index 36a5532..ee25246 100644 --- a/src/Gui/SimplePartWidget.h +++ b/src/Gui/SimplePartWidget.h @@ -64,8 +64,10 @@ private slots: void slotMarkupPlainText(); signals: void linkHovered(const QString &link, const QString &title, const QString &textContent); + void searchDialogRequested(); private: QAction *saveAction; + QAction *m_findAction; Imap::Network::FileDownloadManager *fileDownloadManager; Composer::Util::FlowedFormat flowedFormat; diff --git a/src/Gui/Window.cpp b/src/Gui/Window.cpp index 89b5d7d..07fed94 100644 --- a/src/Gui/Window.cpp +++ b/src/Gui/Window.cpp @@ -59,6 +59,7 @@ #include "Imap/Model/Utils.h" #include "Imap/Network/FileDownloadManager.h" #include "AbookAddressbook.h" +#include "CompleteMessageWidget.h" #include "ComposeWidget.h" #include "IconLoader.h" #include "MailBoxTreeView.h" @@ -225,13 +226,13 @@ void MainWindow::createActions() m_nextMessage = new QAction(tr("Next Unread Message"), this); m_nextMessage->setShortcut(Qt::Key_N); msgListWidget->tree->addAction(m_nextMessage); - msgView->addAction(m_nextMessage); + m_messageWidget->messageView->addAction(m_nextMessage); connect(m_nextMessage, SIGNAL(triggered()), this, SLOT(slotNextUnread())); m_previousMessage = new QAction(tr("Previous Unread Message"), this); m_previousMessage->setShortcut(Qt::Key_P); msgListWidget->tree->addAction(m_previousMessage); - msgView->addAction(m_previousMessage); + m_messageWidget->messageView->addAction(m_previousMessage); connect(m_previousMessage, SIGNAL(triggered()), this, SLOT(slotPreviousUnread())); markAsDeleted = new QAction(loadIcon(QLatin1String("list-remove")), tr("Mark as Deleted"), this); @@ -496,23 +497,20 @@ void MainWindow::createWidgets() connect(msgListWidget->tree, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(msgListDoubleClicked(const QModelIndex &))); connect(msgListWidget, SIGNAL(requestingSearch(QStringList)), this, SLOT(slotSearchRequested(QStringList))); - msgView = new MessageView(); - area = new QScrollArea(); - area->setWidget(msgView); - area->setWidgetResizable(true); - connect(msgView, SIGNAL(messageChanged()), this, SLOT(scrollMessageUp())); - connect(msgView, SIGNAL(messageChanged()), this, SLOT(slotUpdateMessageActions())); - connect(msgView, SIGNAL(linkHovered(QString)), this, SLOT(slotShowLinkTarget(QString))); + m_messageWidget = new CompleteMessageWidget(this); + connect(m_messageWidget->messageView, SIGNAL(messageChanged()), this, SLOT(scrollMessageUp())); + connect(m_messageWidget->messageView, SIGNAL(messageChanged()), this, SLOT(slotUpdateMessageActions())); + connect(m_messageWidget->messageView, SIGNAL(linkHovered(QString)), this, SLOT(slotShowLinkTarget(QString))); if (QSettings().value(Common::SettingsNames::appLoadHomepage, QVariant(true)).toBool() && !QSettings().value(Common::SettingsNames::imapStartOffline).toBool()) { - msgView->setHomepageUrl(QUrl(QString::fromUtf8("http://welcome.trojita.flaska.net/%1").arg(QCoreApplication::applicationVersion()))); + m_messageWidget->messageView->setHomepageUrl(QUrl(QString::fromUtf8("http://welcome.trojita.flaska.net/%1").arg(QCoreApplication::applicationVersion()))); } m_mainHSplitter = new QSplitter(); m_mainVSplitter = new QSplitter(); m_mainVSplitter->setOrientation(Qt::Vertical); m_mainVSplitter->addWidget(msgListWidget); - m_mainVSplitter->addWidget(area); + m_mainVSplitter->addWidget(m_messageWidget); m_mainHSplitter->addWidget(mboxTree); m_mainHSplitter->addWidget(m_mainVSplitter); @@ -718,7 +716,7 @@ void MainWindow::msgListActivated(const QModelIndex &index) return; if (index.column() != Imap::Mailbox::MsgListModel::SEEN) { - msgView->setMessage(index); + m_messageWidget->messageView->setMessage(index); msgListWidget->tree->setCurrentIndex(index); } } @@ -751,19 +749,16 @@ void MainWindow::msgListDoubleClicked(const QModelIndex &index) if (! index.data(Imap::Mailbox::RoleMessageUid).isValid()) return; - MessageView *newView = new MessageView(0); QModelIndex realIndex; const Imap::Mailbox::Model *realModel; Imap::Mailbox::TreeItemMessage *message = dynamic_cast<Imap::Mailbox::TreeItemMessage *>( Imap::Mailbox::Model::realTreeItem(index, &realModel, &realIndex)); Q_ASSERT(message); Q_ASSERT(realModel == model); - newView->setMessage(index); - QScrollArea *widget = new QScrollArea(); + CompleteMessageWidget *widget = new CompleteMessageWidget(); + widget->messageView->setMessage(index); widget->setFocusPolicy(Qt::StrongFocus); - widget->setWidget(newView); - widget->setWidgetResizable(true); widget->setWindowTitle(message->envelope(model).subject); widget->setAttribute(Qt::WA_DeleteOnClose); widget->resize(800, 600); @@ -989,7 +984,7 @@ void MainWindow::sslErrors(const QList<QSslCertificate> &certificateChain, const void MainWindow::nukeModels() { - msgView->setEmpty(); + m_messageWidget->messageView->setEmpty(); mboxTree->setModel(0); msgListWidget->tree->setModel(0); allTree->setModel(0); @@ -1076,7 +1071,7 @@ void MainWindow::slotNextUnread() bool wrapped = false; while (current.isValid()) { if (!current.data(Imap::Mailbox::RoleMessageIsMarkedRead).toBool() && msgListWidget->tree->currentIndex() != current) { - msgView->setMessage(current); + m_messageWidget->messageView->setMessage(current); msgListWidget->tree->setCurrentIndex(current); return; } @@ -1112,7 +1107,7 @@ void MainWindow::slotPreviousUnread() bool wrapped = false; while (current.isValid()) { if (!current.data(Imap::Mailbox::RoleMessageIsMarkedRead).toBool() && msgListWidget->tree->currentIndex() != current) { - msgView->setMessage(current); + m_messageWidget->messageView->setMessage(current); msgListWidget->tree->setCurrentIndex(current); return; } @@ -1253,13 +1248,13 @@ void MainWindow::slotUpdateMessageActions() { Composer::RecipientList dummy; m_replyPrivate->setEnabled(Composer::Util::replyRecipientList(Composer::REPLY_PRIVATE, senderIdentitiesModel(), - msgView->currentMessage(), dummy)); + m_messageWidget->messageView->currentMessage(), dummy)); m_replyAllButMe->setEnabled(Composer::Util::replyRecipientList(Composer::REPLY_ALL_BUT_ME, senderIdentitiesModel(), - msgView->currentMessage(), dummy)); + m_messageWidget->messageView->currentMessage(), dummy)); m_replyAll->setEnabled(Composer::Util::replyRecipientList(Composer::REPLY_ALL, senderIdentitiesModel(), - msgView->currentMessage(), dummy)); + m_messageWidget->messageView->currentMessage(), dummy)); m_replyList->setEnabled(Composer::Util::replyRecipientList(Composer::REPLY_LIST, senderIdentitiesModel(), - msgView->currentMessage(), dummy)); + m_messageWidget->messageView->currentMessage(), dummy)); m_replyGuess->setEnabled(m_replyPrivate->isEnabled() || m_replyAllButMe->isEnabled() || m_replyAll->isEnabled() || m_replyList->isEnabled()); @@ -1276,27 +1271,27 @@ void MainWindow::slotUpdateMessageActions() void MainWindow::scrollMessageUp() { - area->ensureVisible(0, 0, 0, 0); + m_messageWidget->area->ensureVisible(0, 0, 0, 0); } void MainWindow::slotReplyTo() { - msgView->reply(this, Composer::REPLY_PRIVATE); + m_messageWidget->messageView->reply(this, Composer::REPLY_PRIVATE); } void MainWindow::slotReplyAll() { - msgView->reply(this, Composer::REPLY_ALL); + m_messageWidget->messageView->reply(this, Composer::REPLY_ALL); } void MainWindow::slotReplyAllButMe() { - msgView->reply(this, Composer::REPLY_ALL_BUT_ME); + m_messageWidget->messageView->reply(this, Composer::REPLY_ALL_BUT_ME); } void MainWindow::slotReplyList() { - msgView->reply(this, Composer::REPLY_LIST); + m_messageWidget->messageView->reply(this, Composer::REPLY_LIST); } void MainWindow::slotReplyGuess() @@ -1833,14 +1828,14 @@ void MainWindow::slotUpdateWindowTitle() void MainWindow::slotLayoutCompact() { - m_mainVSplitter->addWidget(area); + m_mainVSplitter->addWidget(m_messageWidget); QSettings().setValue(Common::SettingsNames::guiMainWindowLayout, Common::SettingsNames::guiMainWindowLayoutCompact); setMinimumWidth(800); } void MainWindow::slotLayoutWide() { - m_mainHSplitter->addWidget(area); + m_mainHSplitter->addWidget(m_messageWidget); m_mainHSplitter->setStretchFactor(0, 0); m_mainHSplitter->setStretchFactor(1, 1); m_mainHSplitter->setStretchFactor(2, 1); diff --git a/src/Gui/Window.h b/src/Gui/Window.h index a1b2c37..25ba905 100644 --- a/src/Gui/Window.h +++ b/src/Gui/Window.h @@ -63,6 +63,7 @@ namespace Gui { class AbstractAddressbook; +class CompleteMessageWidget; class ComposeWidget; class MailBoxTreeView; class MessageView; @@ -189,12 +190,11 @@ private: MailBoxTreeView *mboxTree; MessageListWidget *msgListWidget; QTreeView *allTree; - MessageView *msgView; QDockWidget *allDock; QTreeView *taskTree; QDockWidget *taskDock; - QScrollArea *area; + CompleteMessageWidget *m_messageWidget; ProtocolLoggerWidget *imapLogger; QDockWidget *imapLoggerDock;
