X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d71de955f4a0901288d060a2eaceca305d11a203..61a4e8691d600a1d105142ce44570c4107600a04:/src/statusbarmessagelabel.cpp diff --git a/src/statusbarmessagelabel.cpp b/src/statusbarmessagelabel.cpp index 1178a1688..b79448b23 100644 --- a/src/statusbarmessagelabel.cpp +++ b/src/statusbarmessagelabel.cpp @@ -19,83 +19,99 @@ ***************************************************************************/ #include "statusbarmessagelabel.h" -#include -#include -#include -//Added by qt3to4: + +#include +#include +#include +#include + +#include +#include +#include +#include #include #include -#include -#include -#include +#include StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : - QWidget(parent), - m_type(DolphinStatusBar::Default), - m_state(Default), - m_illumination(0), - m_minTextHeight(-1), - m_timer(0) + QWidget(parent), + m_type(DolphinStatusBar::Default), + m_state(Default), + m_illumination(0), + m_minTextHeight(-1), + m_timer(0), + m_closeButton(0) { setMinimumHeight(K3Icon::SizeSmall); m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(timerDone())); + + 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) { - 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"; - break; - - case DolphinStatusBar::Information: - iconName = "info"; - break; - - case DolphinStatusBar::Error: - iconName = "error"; - m_timer->start(100); - m_state = Illuminate; - break; - - case DolphinStatusBar::Default: - default: break; - } - - 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_timer->start(100); - m_illumination = 0; - m_state = Illuminate; + if (m_type == DolphinStatusBar::Error) { + if (type == DolphinStatusBar::Error) { + m_pendingMessages.insert(0, m_text); + } else if ((m_state != Default) || !m_pendingMessages.isEmpty()) { + // a non-error message should not be shown, as there + // are other pending error messages in the queue + return; } - m_text = text; - QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText())); - update(); } + + 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 = "dialog-information"; + m_closeButton->hide(); + break; + + case DolphinStatusBar::Error: + iconName = "dialog-error"; + m_timer->start(100); + m_state = Illuminate; + + 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) @@ -103,6 +119,7 @@ void StatusBarMessageLabel::setMinimumTextHeight(int min) if (min != m_minTextHeight) { m_minTextHeight = min; setMinimumHeight(min); + m_closeButton->setFixedHeight(min - borderGap() * 2); } } @@ -121,7 +138,7 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */) QColor backgroundColor(palette().brush(QPalette::Background).color()); QColor foregroundColor(KGlobalSettings::textColor()); if (m_illumination > 0) { - backgroundColor = mixColors(backgroundColor, QColor(255, 255, 64), m_illumination); + backgroundColor = mixColors(backgroundColor, QColor(255, 255, 128), m_illumination); foregroundColor = mixColors(foregroundColor, QColor(0, 0, 0), m_illumination); } painter.setBrush(backgroundColor); @@ -129,12 +146,12 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */) painter.drawRect(QRect(0, 0, width(), height())); // draw pixmap - int x = pixmapGap(); - int y = (height() - m_pixmap.height()) / 2; + int x = borderGap(); + int y = (m_minTextHeight - m_pixmap.height()) / 2; if (!m_pixmap.isNull()) { painter.drawPixmap(x, y, m_pixmap); - x += m_pixmap.width() + pixmapGap(); + x += m_pixmap.width() + borderGap(); } // draw text @@ -143,54 +160,53 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */) if (height() > m_minTextHeight) { flags = flags | Qt::TextWordWrap; } - painter.drawText(QRect(x, 0, width() - x, height()), flags, m_text); + painter.drawText(QRect(x, 0, availableTextWidth(), height()), flags, m_text); painter.end(); } void StatusBarMessageLabel::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); + updateCloseButtonPosition(); QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText())); } void StatusBarMessageLabel::timerDone() { switch (m_state) { - case Illuminate: { - // increase the illumination - if (m_illumination < 100) { - m_illumination += 20; - update(); - } - else { - m_state = Illuminated; - m_timer->start(1000); - } - break; + case Illuminate: { + // increase the illumination + if (m_illumination < 100) { + m_illumination += 20; + update(); + } else { + m_state = Illuminated; + m_timer->start(5000); } + break; + } - case Illuminated: { - // start desaturation - m_state = Desaturate; - m_timer->start(100); - break; - } + case Illuminated: { + // start desaturation + m_state = Desaturate; + m_timer->start(100); + break; + } - case Desaturate: { - // desaturate - if (m_illumination > 0) { - m_illumination -= 5; - update(); - } - else { - m_state = Default; - m_timer->stop(); - } - break; + case Desaturate: { + // desaturate + if (m_illumination > 0) { + m_illumination -= 5; + update(); + } else { + m_state = Default; + m_timer->stop(); } + break; + } - default: - break; + default: + break; } } @@ -200,21 +216,47 @@ void StatusBarMessageLabel::assureVisibleText() return; } + // calculate the required height of the widget thats + // needed for having a fully visible text QFontMetrics fontMetrics(font()); const QRect bounds(fontMetrics.boundingRect(0, 0, availableTextWidth(), height(), - Qt::AlignVCenter | Qt::TextWordWrap, - m_text)); + Qt::AlignVCenter | Qt::TextWordWrap, + m_text)); int requiredHeight = bounds.height(); if (requiredHeight < m_minTextHeight) { requiredHeight = m_minTextHeight; } - setMinimumHeight(requiredHeight); - updateGeometry(); + + // Increase/decrease the current height of the widget to the + // required height. The increasing/decreasing is done in several + // steps to have an animation if the height is modified + // (see StatusBarMessageLabel::resizeEvent()) + const int gap = m_minTextHeight / 2; + int minHeight = minimumHeight(); + if (minHeight < requiredHeight) { + minHeight += gap; + if (minHeight > requiredHeight) { + minHeight = requiredHeight; + } + setMinimumHeight(minHeight); + updateGeometry(); + } else if (minHeight > requiredHeight) { + minHeight -= gap; + if (minHeight < requiredHeight) { + minHeight = requiredHeight; + } + setMinimumHeight(minHeight); + updateGeometry(); + } + + updateCloseButtonPosition(); } int StatusBarMessageLabel::availableTextWidth() const { - return width() - m_pixmap.width() - pixmapGap() * 2; + const int buttonWidth = (m_type == DolphinStatusBar::Error) ? + m_closeButton->width() + borderGap() : 0; + return width() - m_pixmap.width() - (borderGap() * 4) - buttonWidth; } QColor StatusBarMessageLabel::mixColors(const QColor& c1, @@ -228,4 +270,35 @@ QColor StatusBarMessageLabel::mixColors(const QColor& c1, return QColor(red, green, blue); } +void StatusBarMessageLabel::updateCloseButtonPosition() +{ + 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.clear(); + m_type = DolphinStatusBar::Default; +} + #include "statusbarmessagelabel.moc"