X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/3759f51a1315f7517aa4e8a80c582ea602e18c08..d6488887ecf69d7f192b94de8dce34fae0b7eb76:/src/statusbarmessagelabel.cpp diff --git a/src/statusbarmessagelabel.cpp b/src/statusbarmessagelabel.cpp index 6b528d802..4db953750 100644 --- a/src/statusbarmessagelabel.cpp +++ b/src/statusbarmessagelabel.cpp @@ -20,17 +20,16 @@ #include "statusbarmessagelabel.h" -#include +#include #include #include #include #include #include -#include +#include #include #include -#include #include StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : @@ -42,13 +41,17 @@ StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : m_timer(0), m_closeButton(0) { - setMinimumHeight(K3Icon::SizeSmall); + setMinimumHeight(KIconLoader::SizeSmall); + + QPalette palette; + palette.setColor(QPalette::Background, Qt::transparent); + setPalette(palette); m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(timerDone())); - m_closeButton = new QPushButton(i18n("Close"), this); + m_closeButton = new QPushButton(i18nc("@action:button", "Close"), this); m_closeButton->hide(); connect(m_closeButton, SIGNAL(clicked()), this, SLOT(closeErrorMessage())); @@ -61,22 +64,20 @@ StatusBarMessageLabel::~StatusBarMessageLabel() void StatusBarMessageLabel::setMessage(const QString& text, DolphinStatusBar::Type type) { + if ((text == m_text) && (type == m_type)) { + return; + } + 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()) { + 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; } } - if ((text == m_text) && (type == m_type)) { - return; - } - m_text = text; m_type = type; @@ -87,29 +88,28 @@ void StatusBarMessageLabel::setMessage(const QString& text, const char* iconName = 0; QPixmap pixmap; switch (type) { - case DolphinStatusBar::OperationCompleted: - iconName = "ok"; - m_closeButton->hide(); - break; - - case DolphinStatusBar::Information: - iconName = "document-properties"; - 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; + case DolphinStatusBar::OperationCompleted: + iconName = "ok"; + m_closeButton->hide(); + break; + + case DolphinStatusBar::Information: + iconName = "dialog-information"; + m_closeButton->hide(); + break; + + case DolphinStatusBar::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); @@ -122,7 +122,9 @@ void StatusBarMessageLabel::setMinimumTextHeight(int min) if (min != m_minTextHeight) { m_minTextHeight = min; setMinimumHeight(min); - m_closeButton->setFixedHeight(min - borderGap() * 2); + if (m_closeButton->height() > min) { + m_closeButton->setFixedHeight(min); + } } } @@ -138,27 +140,30 @@ void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */) QPainter painter(this); // draw background - QColor backgroundColor(palette().brush(QPalette::Background).color()); - QColor foregroundColor(KGlobalSettings::textColor()); + QColor backgroundColor = palette().window().color(); if (m_illumination > 0) { - backgroundColor = mixColors(backgroundColor, QColor(255, 255, 128), m_illumination); - foregroundColor = mixColors(foregroundColor, QColor(0, 0, 0), m_illumination); + // at this point, a: we are a second label being drawn over the already + // painted status area, so we can be translucent, and b: our palette's + // window color (bg only) seems to be wrong (always black) + KColorScheme scheme(palette().currentColorGroup(), KColorScheme::Window); + backgroundColor = scheme.background(KColorScheme::NegativeBackground).color(); + backgroundColor.setAlpha(qMin(255, m_illumination*2)); } painter.setBrush(backgroundColor); - painter.setPen(backgroundColor); + painter.setPen(Qt::NoPen); painter.drawRect(QRect(0, 0, width(), height())); // draw pixmap - int x = borderGap(); + 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() + borderGap(); + x += m_pixmap.width() + BorderGap; } // draw text - painter.setPen(foregroundColor); + painter.setPen(palette().windowText().color()); int flags = Qt::AlignVCenter; if (height() > m_minTextHeight) { flags = flags | Qt::TextWordWrap; @@ -177,41 +182,43 @@ void StatusBarMessageLabel::resizeEvent(QResizeEvent* event) void StatusBarMessageLabel::timerDone() { switch (m_state) { - case Illuminate: { - // increase the illumination - if (m_illumination < 100) { - m_illumination += 20; - update(); + case Illuminate: { + // increase the illumination + const int illumination_max = 128; + if (m_illumination < illumination_max) { + m_illumination += 32; + if (m_illumination > illumination_max) { + m_illumination = illumination_max; } - else { - m_state = Illuminated; - m_timer->start(5000); - } - break; + 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; } } @@ -225,8 +232,8 @@ void StatusBarMessageLabel::assureVisibleText() // 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; @@ -245,8 +252,7 @@ void StatusBarMessageLabel::assureVisibleText() } setMinimumHeight(minHeight); updateGeometry(); - } - else if (minHeight > requiredHeight) { + } else if (minHeight > requiredHeight) { minHeight -= gap; if (minHeight < requiredHeight) { minHeight = requiredHeight; @@ -261,25 +267,14 @@ void StatusBarMessageLabel::assureVisibleText() int StatusBarMessageLabel::availableTextWidth() const { 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, - const QColor& c2, - int percent) const -{ - const int recip = 100 - percent; - const int red = (c1.red() * recip + c2.red() * percent) / 100; - const int green = (c1.green() * recip + c2.green() * percent) / 100; - const int blue = (c1.blue() * recip + c2.blue() * percent) / 100; - return QColor(red, green, blue); + m_closeButton->width() + BorderGap : 0; + return width() - m_pixmap.width() - (BorderGap * 4) - buttonWidth; } void StatusBarMessageLabel::updateCloseButtonPosition() { - const int x = width() - m_closeButton->width() - borderGap(); - const int y = height() - m_closeButton->height() - borderGap(); + const int x = width() - m_closeButton->width() - BorderGap; + const int y = (height() - m_closeButton->height()) / 2; m_closeButton->move(x, y); }