From 287e95ac58f39bde102eb8b374c1af160498428c Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Fri, 19 Apr 2024 07:03:12 +0300 Subject: [PATCH] gwenview: use specialized widget for messages Signed-off-by: Ivailo Monev --- gwenview/lib/document/document.cpp | 2 +- gwenview/lib/documentview/messageview.ui | 93 -------- .../lib/documentview/messageviewadapter.cpp | 207 +++++++++++++----- .../lib/documentview/messageviewadapter.h | 8 +- 4 files changed, 152 insertions(+), 158 deletions(-) delete mode 100644 gwenview/lib/documentview/messageview.ui diff --git a/gwenview/lib/document/document.cpp b/gwenview/lib/document/document.cpp index 115b53a8..0fb490bc 100644 --- a/gwenview/lib/document/document.cpp +++ b/gwenview/lib/document/document.cpp @@ -293,7 +293,7 @@ DocumentJob* Document::save(const KUrl& url, const QByteArray& format) void Document::slotSaveResult(KJob* job) { - if (job->error()) { + if (job->error() != KJob::NoError) { setErrorString(job->errorString()); } else { d->mUndoStack.setClean(); diff --git a/gwenview/lib/documentview/messageview.ui b/gwenview/lib/documentview/messageview.ui deleted file mode 100644 index 929d740b..00000000 --- a/gwenview/lib/documentview/messageview.ui +++ /dev/null @@ -1,93 +0,0 @@ - - - MessageView - - - - 0 - 0 - 400 - 300 - - - - - - - Qt::Vertical - - - - 20 - 125 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 120 - 20 - - - - - - - - - 0 - 0 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 120 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 125 - - - - - - - - - KMessageWidget - QWidget -
kmessagewidget.h
- 1 -
-
- -
diff --git a/gwenview/lib/documentview/messageviewadapter.cpp b/gwenview/lib/documentview/messageviewadapter.cpp index d9ada452..53569c05 100644 --- a/gwenview/lib/documentview/messageviewadapter.cpp +++ b/gwenview/lib/documentview/messageviewadapter.cpp @@ -21,43 +21,165 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA // Self #include "moc_messageviewadapter.cpp" -// Qt -#include +// Katie +#include +#include +#include +#include // KDE -#include #include +#include +#include // Local #include -#include namespace Gwenview { -struct MessageViewAdapterPrivate : Ui_MessageView +static const qreal s_roundness = 4; +static const qreal s_bordersize = 0.6; +static const qreal s_margin = 4; + +class MessageViewWidget : public QGraphicsWidget +{ + Q_OBJECT +public: + enum MessageType { + InformationType, + ErrorType + }; + + MessageViewWidget(MessageViewAdapter *adapter); + + void setMessage(const MessageType type, const QString &main, const QString &detail); + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) final; + void keyPressEvent(QKeyEvent *event) final; + void changeEvent(QEvent *event) final; + +private: + void updateColors(); + + MessageViewAdapter* mAdapter; + MessageType mMessageType; + QString mText; + QTextOption mTextOptions; + QColor mInfoBg; + QColor mInfoBorder; + QColor mErrorBg; + QColor mErrorBorder; +}; + +MessageViewWidget::MessageViewWidget(MessageViewAdapter *adapter) + : QGraphicsWidget(), + mAdapter(adapter) +{ + mTextOptions.setAlignment(Qt::AlignCenter); + mTextOptions.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); + updateColors(); +} + +void MessageViewWidget::setMessage(const MessageType type, const QString &main, const QString &detail) +{ + mMessageType = type; + mText = main; + if (!detail.isEmpty()) { + mText.append(QLatin1String(":\n")); + mText.append(detail); + } + update(); +} + +void MessageViewWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget); + const QRectF boundingrect = boundingRect(); + QRectF mainrect = painter->boundingRect(boundingrect, mText, mTextOptions); + mainrect = mainrect.adjusted(-s_margin, -s_margin, s_margin, s_margin); + QBrush bgbrush; + QPen borderpen; + switch (mMessageType) { + case MessageViewWidget::InformationType: { + bgbrush = QBrush(mInfoBg); + borderpen = QPen(mInfoBorder); + break; + } + case MessageViewWidget::ErrorType: { + bgbrush = QBrush(mErrorBg); + borderpen = QPen(mErrorBorder); + break; + } + } + painter->setRenderHint(QPainter::Antialiasing); + borderpen.setWidth(s_bordersize * 2); + painter->setPen(borderpen); + painter->drawRoundedRect(mainrect, s_roundness, s_roundness, Qt::AbsoluteSize); + painter->setBrush(bgbrush); + const QRectF subrect = mainrect.adjusted(s_bordersize, s_bordersize, -s_bordersize, -s_bordersize); + painter->drawRoundedRect(subrect, s_roundness, s_roundness, Qt::AbsoluteSize); + painter->setPen(option->palette.color(QPalette::Text)); + painter->drawText(mainrect, mText, mTextOptions); +} + +void MessageViewWidget::updateColors() +{ + const KColorScheme scheme(QPalette::Active, KColorScheme::Window); + mInfoBg = scheme.background(KColorScheme::PositiveBackground).color(); + mInfoBorder = KColorScheme::shade(mInfoBg, KColorScheme::DarkShade); + mErrorBg = scheme.background(KColorScheme::NegativeBackground).color(); + mErrorBorder = KColorScheme::shade(mErrorBg, KColorScheme::DarkShade); +} + +void MessageViewWidget::keyPressEvent(QKeyEvent *event) +{ + if (event->modifiers() != Qt::NoModifier) { + QGraphicsWidget::keyPressEvent(event); + return; + } + + switch (event->key()) { + case Qt::Key_Left: + case Qt::Key_Up: { + event->accept(); + mAdapter->previousImageRequested(); + break; + } + case Qt::Key_Right: + case Qt::Key_Down: { + event->accept(); + mAdapter->nextImageRequested(); + break; + } + default: { + break; + } + } + QGraphicsWidget::keyPressEvent(event); +} + +void MessageViewWidget::changeEvent(QEvent *event) +{ + QGraphicsWidget::changeEvent(event); + if (event->type() == QEvent::PaletteChange) { + updateColors(); + } +} + +struct MessageViewAdapterPrivate { Document::Ptr mDocument; + MessageViewWidget* mMessageViewWidget; }; MessageViewAdapter::MessageViewAdapter() -: d(new MessageViewAdapterPrivate) +: d(new MessageViewAdapterPrivate()) { - QWidget* widget = new QWidget; - widget->installEventFilter(this); - d->setupUi(widget); - d->mMessageWidget->setCloseButtonVisible(false); - d->mMessageWidget->setWordWrap(true); + d->mMessageViewWidget = new MessageViewWidget(this); + setWidget(d->mMessageViewWidget); setInfoMessage(i18n("No document selected")); - - widget->setAutoFillBackground(true); - widget->setBackgroundRole(QPalette::Base); - widget->setForegroundRole(QPalette::Text); - - QGraphicsProxyWidget* proxy = new QGraphicsProxyWidget; - proxy->setWidget(widget); - setWidget(proxy); } MessageViewAdapter::~MessageViewAdapter() @@ -68,29 +190,21 @@ MessageViewAdapter::~MessageViewAdapter() void MessageViewAdapter::setErrorMessage(const QString& main, const QString& detail) { if (main.isEmpty()) { - d->mMessageWidget->hide(); + d->mMessageViewWidget->hide(); return; } - d->mMessageWidget->show(); - d->mMessageWidget->setMessageType(KMessageWidget::Error); - QString message; - if (detail.isEmpty()) { - message = main; - } else { - message = QString("%1
%2").arg(main).arg(detail); - } - d->mMessageWidget->setText(message); + d->mMessageViewWidget->show(); + d->mMessageViewWidget->setMessage(MessageViewWidget::ErrorType, main, detail); } void MessageViewAdapter::setInfoMessage(const QString& message) { if (message.isEmpty()) { - d->mMessageWidget->hide(); + d->mMessageViewWidget->hide(); return; } - d->mMessageWidget->show(); - d->mMessageWidget->setMessageType(KMessageWidget::Information); - d->mMessageWidget->setText(message); + d->mMessageViewWidget->show(); + d->mMessageViewWidget->setMessage(MessageViewWidget::InformationType, message, QString()); } Document::Ptr MessageViewAdapter::document() const @@ -103,28 +217,7 @@ void MessageViewAdapter::setDocument(Document::Ptr doc) d->mDocument = doc; } -bool MessageViewAdapter::eventFilter(QObject*, QEvent* ev) -{ - if (ev->type() == QEvent::KeyPress) { - QKeyEvent* event = static_cast(ev); - if (event->modifiers() != Qt::NoModifier) { - return false; - } - - switch (event->key()) { - case Qt::Key_Left: - case Qt::Key_Up: - previousImageRequested(); - break; - case Qt::Key_Right: - case Qt::Key_Down: - nextImageRequested(); - break; - default: - break; - } - } - return false; -} - } // namespace + +#include "messageviewadapter.moc" + diff --git a/gwenview/lib/documentview/messageviewadapter.h b/gwenview/lib/documentview/messageviewadapter.h index 5bd2af41..288a6622 100644 --- a/gwenview/lib/documentview/messageviewadapter.h +++ b/gwenview/lib/documentview/messageviewadapter.h @@ -21,10 +21,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA #ifndef MESSAGEVIEWADAPTER_H #define MESSAGEVIEWADAPTER_H -// Qt - -// KDE - // Local #include @@ -52,10 +48,8 @@ public: void setErrorMessage(const QString& main, const QString& detail = QString()); -protected: - bool eventFilter(QObject*, QEvent*); - private: + friend class MessageViewWidget; MessageViewAdapterPrivate* const d; };