From: Peter Penz Date: Wed, 31 Jan 2007 22:03:35 +0000 (+0000) Subject: Queue error messages so that a currently shown error message is not replaced until... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/cd3df82730865636c92c5bb9f38a0490c0deffaa Queue error messages so that a currently shown error message is not replaced until the user confirmed the reading. If there are no pending error messages and a timeout has been exceeded, the currently shown error messages automatically fades out as soon as the user triggered another action. This behavior should correspond to Ellens suggestions (I hope :-)). svn path=/trunk/playground/utils/dolphin/; revision=628905 --- diff --git a/src/dolphinstatusbar.cpp b/src/dolphinstatusbar.cpp index 4cdffec94..26a373875 100644 --- a/src/dolphinstatusbar.cpp +++ b/src/dolphinstatusbar.cpp @@ -71,8 +71,7 @@ DolphinStatusBar::~DolphinStatusBar() void DolphinStatusBar::setMessage(const QString& msg, Type type) { - m_messageLabel->setText(msg); - m_messageLabel->setType(type); + m_messageLabel->setMessage(msg, type); const int widthGap = m_messageLabel->widthGap(); if (widthGap > 0) { @@ -123,25 +122,29 @@ void DolphinStatusBar::setProgress(int percent) QTimer::singleShot(500, this, SLOT(updateProgressInfo())); } + const QString& defaultText = m_messageLabel->defaultText(); const QString msg(m_messageLabel->text()); if ((percent == 0) && !msg.isEmpty()) { setMessage(QString::null, Default); } - else if ((percent == 100) && (msg != m_defaultText)) { - setMessage(m_defaultText, Default); + else if ((percent == 100) && (msg != defaultText)) { + setMessage(defaultText, Default); } } void DolphinStatusBar::clear() { - // TODO: check for timeout, so that it's prevented that - // a message is cleared too early. - setMessage(m_defaultText, Default); + setMessage(m_messageLabel->defaultText(), Default); } void DolphinStatusBar::setDefaultText(const QString& text) { - m_defaultText = text; + m_messageLabel->setDefaultText(text); +} + +const QString& DolphinStatusBar::defaultText() const +{ + return m_messageLabel->defaultText(); } void DolphinStatusBar::resizeEvent(QResizeEvent* event) diff --git a/src/dolphinstatusbar.h b/src/dolphinstatusbar.h index e98e9e512..5a04b21cb 100644 --- a/src/dolphinstatusbar.h +++ b/src/dolphinstatusbar.h @@ -108,7 +108,7 @@ public: * is cleared by DolphinStatusBar::clear(). */ void setDefaultText(const QString& text); - const QString& defaultText() const { return m_defaultText; } + const QString& defaultText() const; protected: /** @see QWidget::resizeEvent() */ @@ -138,8 +138,6 @@ private: QLabel* m_progressText; QProgressBar* m_progressBar; int m_progress; - - QString m_defaultText; }; #endif diff --git a/src/statusbarmessagelabel.cpp b/src/statusbarmessagelabel.cpp index f355189fc..2efcd2e7d 100644 --- a/src/statusbarmessagelabel.cpp +++ b/src/statusbarmessagelabel.cpp @@ -48,69 +48,73 @@ StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : connect(m_timer, SIGNAL(timeout()), this, SLOT(timerDone())); - m_closeButton = new QPushButton(KIcon("close"), QString::null, this); + m_closeButton = new QPushButton(i18n("Close"), this); m_closeButton->hide(); + connect(m_closeButton, SIGNAL(clicked()), + this, SLOT(closeErrorMessage())); } StatusBarMessageLabel::~StatusBarMessageLabel() { } -void StatusBarMessageLabel::setType(DolphinStatusBar::Type type) +void StatusBarMessageLabel::setMessage(const QString& text, + DolphinStatusBar::Type type) { - if ((type != m_type) || (type == DolphinStatusBar::Error)) { - m_type = type; - - m_timer->stop(); - m_illumination = 0; - m_state = Default; - - const char* iconName = 0; - QPixmap pixmap; - switch (type) { - case DolphinStatusBar::OperationCompleted: - iconName = "ok"; - m_closeButton->hide(); - break; - - case DolphinStatusBar::Information: - iconName = "info"; - m_closeButton->hide(); - break; - - case DolphinStatusBar::Error: - iconName = "error"; - m_timer->start(100); - m_state = Illuminate; - - updateCloseButtonPosition(); - m_closeButton->show(); - break; - - case DolphinStatusBar::Default: - default: - m_closeButton->hide(); - break; + if (m_type == DolphinStatusBar::Error) { + // If an error is shown currently, other error messages get queued. + // Non-error messages are ignored if there are pending error messages. + if (type == DolphinStatusBar::Error) { + m_pendingMessages.append(text); + return; } + if ((m_state != Default) || !m_pendingMessages.isEmpty()) { + return; + } + } - m_pixmap = (iconName == 0) ? QPixmap() : SmallIcon(iconName); - QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText())); - update(); + if ((text == m_text) && (type == m_type)) { + return; } -} -void StatusBarMessageLabel::setText(const QString& text) -{ - if (text != m_text) { - if (m_type == DolphinStatusBar::Error) { + m_text = text; + m_type = type; + + m_timer->stop(); + m_illumination = 0; + m_state = Default; + + const char* iconName = 0; + QPixmap pixmap; + switch (type) { + case DolphinStatusBar::OperationCompleted: + iconName = "ok"; + m_closeButton->hide(); + break; + + case DolphinStatusBar::Information: + iconName = "info"; + m_closeButton->hide(); + break; + + case DolphinStatusBar::Error: + iconName = "error"; m_timer->start(100); - m_illumination = 0; m_state = Illuminate; - } - m_text = text; - QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText())); - update(); + + updateCloseButtonPosition(); + m_closeButton->show(); + break; + + case DolphinStatusBar::Default: + default: + m_closeButton->hide(); + break; } + + m_pixmap = (iconName == 0) ? QPixmap() : SmallIcon(iconName); + QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText())); + update(); } void StatusBarMessageLabel::setMinimumTextHeight(int min) @@ -118,6 +122,7 @@ void StatusBarMessageLabel::setMinimumTextHeight(int min) if (min != m_minTextHeight) { m_minTextHeight = min; setMinimumHeight(min); + m_closeButton->setFixedHeight(min - borderGap() * 2); } } @@ -165,6 +170,7 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */) void StatusBarMessageLabel::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); + updateCloseButtonPosition(); QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText())); } @@ -256,7 +262,7 @@ int StatusBarMessageLabel::availableTextWidth() const { const int buttonWidth = (m_type == DolphinStatusBar::Error) ? m_closeButton->width() + borderGap() : 0; - return width() - m_pixmap.width() - (borderGap() * 3) - buttonWidth; + return width() - m_pixmap.width() - (borderGap() * 4) - buttonWidth; } QColor StatusBarMessageLabel::mixColors(const QColor& c1, @@ -272,9 +278,33 @@ QColor StatusBarMessageLabel::mixColors(const QColor& c1, void StatusBarMessageLabel::updateCloseButtonPosition() { - const int x = width() - m_closeButton->width(); - const int y = 2; + const int x = width() - m_closeButton->width() - borderGap(); + const int y = height() - m_closeButton->height() - borderGap(); m_closeButton->move(x, y); } +void StatusBarMessageLabel::closeErrorMessage() +{ + if (!showPendingMessage()) { + reset(); + setMessage(m_defaultText, DolphinStatusBar::Default); + } +} + +bool StatusBarMessageLabel::showPendingMessage() +{ + if (!m_pendingMessages.isEmpty()) { + reset(); + setMessage(m_pendingMessages.takeFirst(), DolphinStatusBar::Error); + return true; + } + return false; +} + +void StatusBarMessageLabel::reset() +{ + m_text = QString::null; + m_type = DolphinStatusBar::Default; +} + #include "statusbarmessagelabel.moc" diff --git a/src/statusbarmessagelabel.h b/src/statusbarmessagelabel.h index b75e499fb..154915e4c 100644 --- a/src/statusbarmessagelabel.h +++ b/src/statusbarmessagelabel.h @@ -23,6 +23,7 @@ #include +#include #include #include #include @@ -48,12 +49,14 @@ public: explicit StatusBarMessageLabel(QWidget* parent); virtual ~StatusBarMessageLabel(); - void setType(DolphinStatusBar::Type type); - DolphinStatusBar::Type type() const { return m_type; } + void setMessage(const QString& text, DolphinStatusBar::Type type); - void setText(const QString& text); + DolphinStatusBar::Type type() const { return m_type; } const QString& text() const { return m_text; } + void setDefaultText(const QString& text) { m_defaultText = text; } + const QString& defaultText() const { return m_defaultText; } + // TODO: maybe a better approach is possible with the size hint void setMinimumTextHeight(int min); int minimumTextHeight() const { return m_minTextHeight; } @@ -92,6 +95,26 @@ private slots: */ void updateCloseButtonPosition(); + /** + * Closes the currently shown error message and replaces it + * by the next pending message. + */ + void closeErrorMessage(); + +private: + /** + * Shows the next pending error message. If no pending message + * was in the queue, false is returned. + */ + bool showPendingMessage(); + + /** + * Resets the message label properties. This is useful when the + * result of invoking StatusBarMessageLabel::setMessage() should + * not rely on previous states. + */ + void reset(); + private: enum State { Default, @@ -108,6 +131,8 @@ private: int m_minTextHeight; QTimer* m_timer; QString m_text; + QString m_defaultText; + QList m_pendingMessages; QPixmap m_pixmap; QPushButton* m_closeButton; @@ -115,7 +140,7 @@ private: const QColor& c2, int percent) const; - int borderGap() const { return 3; } + int borderGap() const { return 2; } }; #endif diff --git a/src/statusbarspaceinfo.cpp b/src/statusbarspaceinfo.cpp index fca7bdd0b..b61cf3f45 100644 --- a/src/statusbarspaceinfo.cpp +++ b/src/statusbarspaceinfo.cpp @@ -59,8 +59,8 @@ void StatusBarSpaceInfo::paintEvent(QPaintEvent* /* event */) { QPainter painter(this); const int barWidth = width(); - const int barTop = 2; - const int barHeight = height() - 4; + const int barTop = 1; + const int barHeight = height() - 5; QString text; @@ -98,7 +98,7 @@ void StatusBarSpaceInfo::paintEvent(QPaintEvent* /* event */) text = i18n("Getting size..."); } else { - text = ""; + text = QString::null; QTimer::singleShot(0, this, SLOT(hide())); } } diff --git a/src/statusbarspaceinfo.h b/src/statusbarspaceinfo.h index 488465705..bfa1156c3 100644 --- a/src/statusbarspaceinfo.h +++ b/src/statusbarspaceinfo.h @@ -60,7 +60,7 @@ private slots: const QString& mountPoint); void showResult(); - /** Refreshs the space information for the current set Url. */ + /** Refreshs the space information for the current set URL. */ void refresh(); private: