Git commit 64055232b202328252e3bea28524614968453372 by Jan Kundrát. Committed on 21/05/2016 at 16:12. Pushed by gerrit into branch 'master'.
GUI: Update zoom mode for all parts in sync This is similar to that Ctrl-F shortcut handling -- if we have more than a single part in an e-mail, multiple actions with the same shortcut are going to be active, which is a Bad Thing™. Let's handle this centrally, then. Provisions are still in place for a possibility of no enclosing MessageView. Change-Id: I778f479877b830824e0556220ae8d3a0d50819c7 M +3 -0 src/Gui/AbstractPartWidget.h M +10 -4 src/Gui/AttachmentView.cpp M +3 -0 src/Gui/AttachmentView.h M +0 -28 src/Gui/EmbeddedWebView.cpp M +1 -5 src/Gui/EmbeddedWebView.h M +10 -4 src/Gui/LoadablePartWidget.cpp M +6 -3 src/Gui/LoadablePartWidget.h M +42 -7 src/Gui/MessageView.cpp M +6 -2 src/Gui/MessageView.h M +30 -19 src/Gui/PartWidget.cpp M +19 -7 src/Gui/PartWidget.h M +37 -17 src/Gui/SimplePartWidget.cpp M +6 -3 src/Gui/SimplePartWidget.h http://commits.kde.org/trojita/64055232b202328252e3bea28524614968453372 diff --git a/src/Gui/AbstractPartWidget.h b/src/Gui/AbstractPartWidget.h index e0a1c15..78e1cbd 100644 --- a/src/Gui/AbstractPartWidget.h +++ b/src/Gui/AbstractPartWidget.h @@ -34,6 +34,9 @@ public: virtual QString quoteMe() const = 0; virtual ~AbstractPartWidget() {} virtual void reloadContents() = 0; + virtual void zoomIn() = 0; + virtual void zoomOut() = 0; + virtual void zoomOriginal() = 0; }; } diff --git a/src/Gui/AttachmentView.cpp b/src/Gui/AttachmentView.cpp index dee7ead..10043e9 100644 --- a/src/Gui/AttachmentView.cpp +++ b/src/Gui/AttachmentView.cpp @@ -373,12 +373,18 @@ QString AttachmentView::quoteMe() const return widget && !m_contentWidget->isHidden() ? widget->quoteMe() : QString(); } -void AttachmentView::reloadContents() -{ - if (AbstractPartWidget *w = dynamic_cast<AbstractPartWidget*>(m_contentWidget)) - w->reloadContents(); +#define IMPL_PART_FORWARD_ONE_METHOD(METHOD) \ +void AttachmentView::METHOD() \ +{\ + if (AbstractPartWidget *w = dynamic_cast<AbstractPartWidget*>(m_contentWidget)) \ + w->METHOD(); \ } +IMPL_PART_FORWARD_ONE_METHOD(reloadContents) +IMPL_PART_FORWARD_ONE_METHOD(zoomIn) +IMPL_PART_FORWARD_ONE_METHOD(zoomOut) +IMPL_PART_FORWARD_ONE_METHOD(zoomOriginal) + void AttachmentView::showMessageSource() { auto w = MainWindow::messageSourceWidget(m_partIndex); diff --git a/src/Gui/AttachmentView.h b/src/Gui/AttachmentView.h index 3abf1d4..1c40441 100644 --- a/src/Gui/AttachmentView.h +++ b/src/Gui/AttachmentView.h @@ -61,6 +61,9 @@ public: MessageView *messageView, QWidget *contentWidget); virtual QString quoteMe() const; virtual void reloadContents(); + virtual void zoomIn(); + virtual void zoomOut(); + virtual void zoomOriginal(); protected: virtual void mouseMoveEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event); diff --git a/src/Gui/EmbeddedWebView.cpp b/src/Gui/EmbeddedWebView.cpp index 9e0128e..103849c 100644 --- a/src/Gui/EmbeddedWebView.cpp +++ b/src/Gui/EmbeddedWebView.cpp @@ -234,34 +234,6 @@ void EmbeddedWebView::mouseReleaseEvent(QMouseEvent *e) QWebView::mouseReleaseEvent(e); } -void EmbeddedWebView::wheelEvent(QWheelEvent *e) -{ - if (e->modifiers() == Qt::ControlModifier) { - if (e->delta() > 0) { - zoomIn(); - } else { - zoomOut(); - } - e->accept(); - } else { - e->ignore(); - } -} - -const auto zoomConstant = 1.1; - -void EmbeddedWebView::zoomIn() -{ - setZoomFactor(zoomFactor() * zoomConstant); - constrainSize(); -} - -void EmbeddedWebView::zoomOut() -{ - setZoomFactor(zoomFactor() / zoomConstant); - constrainSize(); -} - void EmbeddedWebView::findScrollParent() { if (m_scrollParent) diff --git a/src/Gui/EmbeddedWebView.h b/src/Gui/EmbeddedWebView.h index 283a6e9..9ac83d1 100644 --- a/src/Gui/EmbeddedWebView.h +++ b/src/Gui/EmbeddedWebView.h @@ -69,19 +69,15 @@ protected: bool eventFilter(QObject *o, QEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); - void wheelEvent(QWheelEvent *e); void showEvent(QShowEvent *se); void addCustomStylesheet(const QString &css); -protected slots: - void zoomIn(); - void zoomOut(); + void constrainSize(); private: void findScrollParent(); private slots: void autoScroll(); void slotLinkClicked(const QUrl &url); void handlePageLoadFinished(); - void constrainSize(); private: QWidget *m_scrollParent; int m_scrollParentPadding; diff --git a/src/Gui/LoadablePartWidget.cpp b/src/Gui/LoadablePartWidget.cpp index 31dce1e..211acb4 100644 --- a/src/Gui/LoadablePartWidget.cpp +++ b/src/Gui/LoadablePartWidget.cpp @@ -89,10 +89,16 @@ void LoadablePartWidget::showEvent(QShowEvent *event) } } -void LoadablePartWidget::reloadContents() -{ - if (AbstractPartWidget *w = dynamic_cast<AbstractPartWidget*>(realPart)) - w->reloadContents(); +#define IMPL_PART_FORWARD_ONE_METHOD(METHOD) \ +void LoadablePartWidget::METHOD() \ +{\ + if (AbstractPartWidget *w = dynamic_cast<AbstractPartWidget*>(realPart)) \ + w->METHOD(); \ } +IMPL_PART_FORWARD_ONE_METHOD(reloadContents) +IMPL_PART_FORWARD_ONE_METHOD(zoomIn) +IMPL_PART_FORWARD_ONE_METHOD(zoomOut) +IMPL_PART_FORWARD_ONE_METHOD(zoomOriginal) + } diff --git a/src/Gui/LoadablePartWidget.h b/src/Gui/LoadablePartWidget.h index 58ed280..a4cc7de 100644 --- a/src/Gui/LoadablePartWidget.h +++ b/src/Gui/LoadablePartWidget.h @@ -49,10 +49,13 @@ public: LoadablePartWidget(QWidget *parent, Imap::Network::MsgPartNetAccessManager *manager, const QModelIndex &part, PartWidgetFactory *factory, int recursionDepth, const UiUtils::PartLoadingOptions loadingMode); - QString quoteMe() const; - virtual void reloadContents(); + QString quoteMe() const override; + virtual void reloadContents() override; + virtual void zoomIn() override; + virtual void zoomOut() override; + virtual void zoomOriginal() override; protected: - virtual void showEvent(QShowEvent *event); + virtual void showEvent(QShowEvent *event) override; private slots: void loadClicked(); private: diff --git a/src/Gui/MessageView.cpp b/src/Gui/MessageView.cpp index 829164c..5532b79 100644 --- a/src/Gui/MessageView.cpp +++ b/src/Gui/MessageView.cpp @@ -62,6 +62,7 @@ #include "Imap/Model/Utils.h" #include "Imap/Network/MsgPartNetAccessManager.h" #include "Plugins/PluginManager.h" +#include "UiUtils/IconLoader.h" namespace Gui { @@ -85,6 +86,21 @@ MessageView::MessageView(QWidget *parent, QSettings *settings, Plugins::PluginMa setFocusPolicy(Qt::StrongFocus); // not by the wheel + m_zoomIn = new QAction(UiUtils::loadIcon(QStringLiteral("zoom-in")), tr("Zoom In"), this); + m_zoomIn->setShortcut(QKeySequence::ZoomIn); + addAction(m_zoomIn); + connect(m_zoomIn, &QAction::triggered, this, &MessageView::zoomIn); + + m_zoomOut = new QAction(UiUtils::loadIcon(QStringLiteral("zoom-out")), tr("Zoom Out"), this); + m_zoomOut->setShortcut(QKeySequence::ZoomOut); + addAction(m_zoomOut); + connect(m_zoomOut, &QAction::triggered, this, &MessageView::zoomOut); + + m_zoomOriginal = new QAction(UiUtils::loadIcon(QStringLiteral("zoom-original")), tr("Original Size"), this); + addAction(m_zoomOriginal); + connect(m_zoomOriginal, &QAction::triggered, this, &MessageView::zoomOriginal); + + // The homepage widget -- our poor man's splashscreen m_homePage = new EmbeddedWebView(this, new QNetworkAccessManager(this)); m_homePage->setFixedSize(450,300); @@ -302,13 +318,21 @@ void MessageView::stopAutoMarkAsRead() bool MessageView::eventFilter(QObject *object, QEvent *event) { - if (event->type() == QEvent::Wheel && static_cast<QWheelEvent*>(event)->modifiers() == Qt::NoModifier) { - // while the containing scrollview has Qt::StrongFocus, the event forwarding breaks that - // -> completely disable focus for the following wheel event ... - parentWidget()->setFocusPolicy(Qt::NoFocus); - MessageView::event(event); - // ... set reset it - parentWidget()->setFocusPolicy(Qt::StrongFocus); + if (event->type() == QEvent::Wheel) { + if (static_cast<QWheelEvent *>(event)->modifiers() == Qt::ControlModifier) { + if (static_cast<QWheelEvent *>(event)->delta() > 0) { + zoomIn(); + } else { + zoomOut(); + } + } else { + // while the containing scrollview has Qt::StrongFocus, the event forwarding breaks that + // -> completely disable focus for the following wheel event ... + parentWidget()->setFocusPolicy(Qt::NoFocus); + MessageView::event(event); + // ... set reset it + parentWidget()->setFocusPolicy(Qt::StrongFocus); + } return true; } else if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); @@ -351,6 +375,17 @@ QString MessageView::quoteText() const return QString(); } +#define FORWARD_METHOD(METHOD) \ +void MessageView::METHOD() \ +{ \ + if (auto w = bodyWidget()) { \ + w->METHOD(); \ + } \ +} +FORWARD_METHOD(zoomIn) +FORWARD_METHOD(zoomOut) +FORWARD_METHOD(zoomOriginal) + void MessageView::setNetworkWatcher(Imap::Mailbox::NetworkWatcher *netWatcher) { m_netWatcher = netWatcher; diff --git a/src/Gui/MessageView.h b/src/Gui/MessageView.h index 12ffa9d..2cc2028 100644 --- a/src/Gui/MessageView.h +++ b/src/Gui/MessageView.h @@ -92,8 +92,11 @@ public slots: void setEmpty(); void setHomepageUrl(const QUrl &homepage); void stopAutoMarkAsRead(); + void zoomIn(); + void zoomOut(); + void zoomOriginal(); protected: - void showEvent(QShowEvent *se); + void showEvent(QShowEvent *se) override; private slots: void markAsRead(); void externalsRequested(const QUrl &url); @@ -112,7 +115,7 @@ signals: void searchRequestedBy(EmbeddedWebView *webView); void transferError(const QString &errorString); private: - bool eventFilter(QObject *object, QEvent *event); + bool eventFilter(QObject *object, QEvent *event) override; Imap::Message::Envelope envelope() const; QString quoteText() const; void showMessageNow(); @@ -134,6 +137,7 @@ private: QPointer<Imap::Mailbox::NetworkWatcher> m_netWatcher; QTimer *markAsReadTimer; QWidget *m_bodyWidget; + QAction *m_zoomIn, *m_zoomOut, *m_zoomOriginal; std::unique_ptr<PartWidgetFactory> factory; Spinner *m_loadingSpinner; diff --git a/src/Gui/PartWidget.cpp b/src/Gui/PartWidget.cpp index 41e2f24..9adc8f5 100644 --- a/src/Gui/PartWidget.cpp +++ b/src/Gui/PartWidget.cpp @@ -157,18 +157,6 @@ QString MultipartAlternativeWidget::quoteMe() const return w ? w->quoteMe() : QString(); } -void MultipartAlternativeWidget::reloadContents() -{ - if (count()) { - for (int i = 0; i < count(); ++i) { - AbstractPartWidget *w = dynamic_cast<AbstractPartWidget *>(widget(i)); - if (w) { - w->reloadContents(); - } - } - } -} - bool MultipartAlternativeWidget::eventFilter(QObject *o, QEvent *e) { if (e->type() == QEvent::Wheel && qobject_cast<QTabBar*>(o)) { // don't alter part while wheeling @@ -417,25 +405,48 @@ QString Message822Widget::quoteMe() const return quoteMeHelper(children()); } -#define IMPL_RELOAD(CLASS) void CLASS::reloadContents() \ +#define IMPL_PART_FORWARD_ONE_METHOD(CLASS, METHOD) \ +void CLASS::METHOD() \ {\ /*qDebug() << metaObject()->className() << children().size();*/\ Q_FOREACH( QObject* const obj, children() ) {\ /*qDebug() << obj->metaObject()->className();*/\ AbstractPartWidget* w = dynamic_cast<AbstractPartWidget*>( obj );\ if ( w ) {\ - /*qDebug() << "reloadContents:" << w;*/\ - w->reloadContents();\ + /*qDebug() << METHOD ":" << w;*/\ + w->METHOD();\ }\ }\ } -IMPL_RELOAD(MultipartSignedEncryptedWidget) -IMPL_RELOAD(GenericMultipartWidget) -IMPL_RELOAD(Message822Widget) +#define IMPL_PART_FORWARDED_METHODS(CLASS) \ + IMPL_PART_FORWARD_ONE_METHOD(CLASS, reloadContents) \ + IMPL_PART_FORWARD_ONE_METHOD(CLASS, zoomIn) \ + IMPL_PART_FORWARD_ONE_METHOD(CLASS, zoomOut) \ + IMPL_PART_FORWARD_ONE_METHOD(CLASS, zoomOriginal) + +IMPL_PART_FORWARDED_METHODS(MultipartSignedEncryptedWidget) +IMPL_PART_FORWARDED_METHODS(GenericMultipartWidget) +IMPL_PART_FORWARDED_METHODS(Message822Widget) + +#undef IMPL_PART_FORWARD_ONE_METHOD +#define IMPL_PART_FORWARD_ONE_METHOD(CLASS, METHOD) \ +void CLASS::METHOD() \ +{\ + if (count()) { \ + for (int i = 0; i < count(); ++i) { \ + AbstractPartWidget *w = dynamic_cast<AbstractPartWidget *>(widget(i)); \ + if (w) { \ + w->METHOD(); \ + } \ + } \ + } \ +} -#undef IMPL_RELOAD +IMPL_PART_FORWARDED_METHODS(MultipartAlternativeWidget) +#undef IMPL_PART_FORWARD_ONE_METHOD +#undef IMPL_PART_FORWARDED_METHODS } diff --git a/src/Gui/PartWidget.h b/src/Gui/PartWidget.h index 3709d75..4712132 100644 --- a/src/Gui/PartWidget.h +++ b/src/Gui/PartWidget.h @@ -45,10 +45,13 @@ public: MultipartAlternativeWidget(QWidget *parent, PartWidgetFactory *factory, const QModelIndex &partIndex, const int recursionDepth, const UiUtils::PartLoadingOptions options); - virtual QString quoteMe() const; - virtual void reloadContents(); + virtual QString quoteMe() const override; + virtual void reloadContents() override; + virtual void zoomIn() override; + virtual void zoomOut() override; + virtual void zoomOriginal() override; protected: - bool eventFilter(QObject *o, QEvent *e); + bool eventFilter(QObject *o, QEvent *e) override; }; /** @short Widget to display status information when processing message parts */ @@ -107,6 +110,9 @@ public: const UiUtils::PartLoadingOptions loadingOptions); virtual QString quoteMe() const override; virtual void reloadContents() override; + virtual void zoomIn() override; + virtual void zoomOut() override; + virtual void zoomOriginal() override; protected slots: virtual void updateStatusIndicator() override; protected: @@ -121,8 +127,11 @@ public: GenericMultipartWidget(QWidget *parent, PartWidgetFactory *factory, const QModelIndex &partIndex, const int recursionDepth, const UiUtils::PartLoadingOptions loadingOptions); - virtual QString quoteMe() const; - virtual void reloadContents(); + virtual QString quoteMe() const override; + virtual void reloadContents() override; + virtual void zoomIn() override; + virtual void zoomOut() override; + virtual void zoomOriginal() override; }; /** @short Message quoting support for generic multipart/ * */ @@ -133,8 +142,11 @@ public: Message822Widget(QWidget *parent, PartWidgetFactory *factory, const QModelIndex &partIndex, const int recursionDepth, const UiUtils::PartLoadingOptions loadingOptions); - virtual QString quoteMe() const; - virtual void reloadContents(); + virtual QString quoteMe() const override; + virtual void reloadContents() override; + virtual void zoomIn() override; + virtual void zoomOut() override; + virtual void zoomOriginal() override; }; diff --git a/src/Gui/SimplePartWidget.cpp b/src/Gui/SimplePartWidget.cpp index c9b388f..e9f8592 100644 --- a/src/Gui/SimplePartWidget.cpp +++ b/src/Gui/SimplePartWidget.cpp @@ -25,6 +25,7 @@ #include <QMenu> #include <QNetworkReply> #include <QWebFrame> +#include <QWheelEvent> #include "SimplePartWidget.h" #include "Common/MetaTypes.h" @@ -84,20 +85,6 @@ SimplePartWidget::SimplePartWidget(QWidget *parent, Imap::Network::MsgPartNetAcc connect(m_findAction, &QAction::triggered, this, &SimplePartWidget::searchDialogRequested); addAction(m_findAction); - m_zoomIn = new QAction(UiUtils::loadIcon(QStringLiteral("zoom-in")), tr("Zoom In"), this); - m_zoomIn->setShortcut(QKeySequence::ZoomIn); - addAction(m_zoomIn); - connect(m_zoomIn, &QAction::triggered, this, &SimplePartWidget::zoomIn); - - m_zoomOut = new QAction(UiUtils::loadIcon(QStringLiteral("zoom-out")), tr("Zoom Out"), this); - m_zoomOut->setShortcut(QKeySequence::ZoomOut); - addAction(m_zoomOut); - connect(m_zoomOut, &QAction::triggered, this, &SimplePartWidget::zoomOut); - - m_zoomReset = new QAction(UiUtils::loadIcon(QStringLiteral("zoom-original")), tr("Original Size"), this); - addAction(m_zoomReset); - connect(m_zoomReset, &QAction::triggered, this, [this]() { setZoomFactor(1); }); - setContextMenuPolicy(Qt::CustomContextMenu); // It is actually OK to construct this widget without any connection to a messageView -- this is often used when @@ -154,6 +141,26 @@ void SimplePartWidget::reloadContents() EmbeddedWebView::reload(); } +const auto zoomConstant = 1.1; + +void SimplePartWidget::zoomIn() +{ + setZoomFactor(zoomFactor() * zoomConstant); + constrainSize(); +} + +void SimplePartWidget::zoomOut() +{ + setZoomFactor(zoomFactor() / zoomConstant); + constrainSize(); +} + +void SimplePartWidget::zoomOriginal() +{ + setZoomFactor(1); + constrainSize(); +} + void SimplePartWidget::buildContextMenu(const QPoint &point, QMenu &menu) const { menu.addAction(m_findAction); @@ -193,9 +200,22 @@ void SimplePartWidget::buildContextMenu(const QPoint &point, QMenu &menu) const } auto zoomMenu = menu.addMenu(UiUtils::loadIcon(QStringLiteral("zoom")), tr("Zoom")); - zoomMenu->addAction(m_zoomIn); - zoomMenu->addAction(m_zoomOut); - zoomMenu->addAction(m_zoomReset); + if (m_messageView) { + zoomMenu->addAction(m_messageView->m_zoomIn); + zoomMenu->addAction(m_messageView->m_zoomOut); + zoomMenu->addAction(m_messageView->m_zoomOriginal); + } else { + auto zoomIn = zoomMenu->addAction(UiUtils::loadIcon(QStringLiteral("zoom-in")), tr("Zoom In")); + zoomIn->setShortcut(QKeySequence::ZoomIn); + connect(zoomIn, &QAction::triggered, this, &SimplePartWidget::zoomIn); + + auto zoomOut = zoomMenu->addAction(UiUtils::loadIcon(QStringLiteral("zoom-out")), tr("Zoom Out")); + zoomOut->setShortcut(QKeySequence::ZoomOut); + connect(zoomOut, &QAction::triggered, this, &SimplePartWidget::zoomOut); + + auto zoomOriginal = zoomMenu->addAction(UiUtils::loadIcon(QStringLiteral("zoom-original")), tr("Original Size")); + connect(zoomOriginal, &QAction::triggered, this, &SimplePartWidget::zoomOriginal); + } } void SimplePartWidget::slotDownloadPart() diff --git a/src/Gui/SimplePartWidget.h b/src/Gui/SimplePartWidget.h index 7c6f12d..d04370c 100644 --- a/src/Gui/SimplePartWidget.h +++ b/src/Gui/SimplePartWidget.h @@ -57,8 +57,11 @@ class SimplePartWidget : public EmbeddedWebView, public AbstractPartWidget public: SimplePartWidget(QWidget *parent, Imap::Network::MsgPartNetAccessManager *manager, const QModelIndex &partIndex, MessageView *messageView); - virtual QString quoteMe() const; - virtual void reloadContents(); + virtual QString quoteMe() const override; + virtual void reloadContents() override; + virtual void zoomIn() override; + virtual void zoomOut() override; + virtual void zoomOriginal() override; void buildContextMenu(const QPoint &point, QMenu &menu) const; private slots: void slotFileNameRequested(QString *fileName); @@ -66,6 +69,7 @@ private slots: void slotDownloadPart(); void slotDownloadMessage(); void slotDownloadImage(const QNetworkRequest &req); +protected: signals: void linkHovered(const QString &link, const QString &title, const QString &textContent); void searchDialogRequested(); @@ -74,7 +78,6 @@ private: QAction *m_savePart; QAction *m_saveMessage; QAction *m_findAction; - QAction *m_zoomIn, *m_zoomOut, *m_zoomReset; MessageView *m_messageView; Imap::Network::MsgPartNetAccessManager *m_netAccessManager; _______________________________________________ kde-doc-english mailing list [email protected] https://mail.kde.org/mailman/listinfo/kde-doc-english
