diff options
Diffstat (limited to 'src/statusbarmessagelabel.cpp')
-rw-r--r-- | src/statusbarmessagelabel.cpp | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/src/statusbarmessagelabel.cpp b/src/statusbarmessagelabel.cpp new file mode 100644 index 0000000..3c49c7a --- /dev/null +++ b/src/statusbarmessagelabel.cpp @@ -0,0 +1,215 @@ +/*************************************************************************** + * Copyright (C) 2006 by Peter Penz * + * [email protected] * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "statusbarmessagelabel.h" +#include <qpainter.h> +#include <qtimer.h> +#include <qfontmetrics.h> +#include <kiconloader.h> +#include <kglobalsettings.h> + +StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : + QWidget(parent), + m_type(DolphinStatusBar::Default), + m_state(Default), + m_illumination(0), + m_minTextHeight(-1), + m_timer(0) +{ + setMinimumHeight(KIcon::SizeSmall); + + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), + this, SLOT(timerDone())); +} + +StatusBarMessageLabel::~StatusBarMessageLabel() +{ +} + +void StatusBarMessageLabel::setType(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); + assureVisibleText(); + update(); + } +} + +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; + } + m_text = text; + assureVisibleText(); + update(); + } +} + +void StatusBarMessageLabel::setMinimumTextHeight(int min) +{ + if (min != m_minTextHeight) { + m_minTextHeight = min; + setMinimumHeight(min); + } +} + +void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */) +{ + QPixmap buffer(size()); + QPainter painter(&buffer); + + // draw background + QColor backgroundColor(colorGroup().background()); + QColor foregroundColor(KGlobalSettings::textColor()); + if (m_illumination > 0) { + backgroundColor = mixColors(backgroundColor, QColor(255, 255, 64), m_illumination); + foregroundColor = mixColors(foregroundColor, QColor(0, 0, 0), m_illumination); + } + painter.setBrush(backgroundColor); + painter.setPen(backgroundColor); + painter.drawRect(QRect(0, 0, width(), height())); + + // draw pixmap + int x = pixmapGap(); + int y = (height() - m_pixmap.height()) / 2; + + if (!m_pixmap.isNull()) { + painter.drawPixmap(x, y, m_pixmap); + x += m_pixmap.width() + pixmapGap(); + } + + // draw text + painter.setPen(foregroundColor); + painter.drawText(QRect(x, 0, width() - x, height()), Qt::AlignVCenter | Qt::WordBreak, m_text); + painter.end(); + + bitBlt(this, 0, 0, &buffer); +} + +void StatusBarMessageLabel::resizeEvent(QResizeEvent* event) +{ + QWidget::resizeEvent(event); + QTimer::singleShot(0, 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 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; + } + + default: + break; + } +} + +void StatusBarMessageLabel::assureVisibleText() +{ + if (m_text.isEmpty()) { + return; + } + + + int availableWidth = width() - m_pixmap.width() - pixmapGap() * 2; + + QFontMetrics fontMetrics(font()); + QRect bounds(fontMetrics.boundingRect(0, 0, availableWidth, height(), + Qt::AlignVCenter | Qt::WordBreak, + m_text)); + int requiredHeight = bounds.height(); + if (requiredHeight < m_minTextHeight) { + requiredHeight = m_minTextHeight; + } + setMinimumHeight(requiredHeight); + updateGeometry(); +} + +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); +} |