#include "statusbarmessagelabel.h"
#include <kglobalsettings.h>
+#include <kcolorutils.h>
#include <kiconloader.h>
#include <kicon.h>
#include <klocale.h>
-#include <QFontMetrics>
-#include <QPainter>
-#include <QPaintEvent>
-#include <QPushButton>
-#include <QPixmap>
-#include <QResizeEvent>
-#include <QTimer>
+#include <QtGui/QFontMetrics>
+#include <QtGui/QPainter>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QPushButton>
+#include <QtGui/QPixmap>
+#include <QtCore/QTimer>
StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) :
QWidget(parent),
{
setMinimumHeight(K3Icon::SizeSmall);
+ QPalette palette;
+ palette.setColor(QPalette::Background, Qt::transparent);
+ setPalette(palette);
+
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()),
this, SLOT(timerDone()));
}
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;
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;
+ 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);
QColor backgroundColor(palette().brush(QPalette::Background).color());
QColor foregroundColor(KGlobalSettings::textColor());
if (m_illumination > 0) {
- backgroundColor = mixColors(backgroundColor, QColor(255, 255, 128), m_illumination);
- foregroundColor = mixColors(foregroundColor, QColor(0, 0, 0), m_illumination);
+ // TODO: are there foreground and background colors available for
+ // "error messages"?
+ backgroundColor.setRgb(255, 255, 0, m_illumination);
+ QColor mixColor(0, 0, 0, m_illumination);
+ foregroundColor = KColorUtils::overlayColors(foregroundColor, mixColor);
}
painter.setBrush(backgroundColor);
painter.setPen(backgroundColor);
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(5000);
+ 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;
}
- 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;
}
}
// 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(minHeight);
updateGeometry();
- }
- else if (minHeight > requiredHeight) {
+ } else if (minHeight > requiredHeight) {
minHeight -= gap;
if (minHeight < requiredHeight) {
minHeight = requiredHeight;
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);
-}
-
void StatusBarMessageLabel::updateCloseButtonPosition()
{
const int x = width() - m_closeButton->width() - borderGap();