X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/9a5f54d83ddc84aa68348058acfcb385ef621577..abf17941f7:/src/statusbarmessagelabel.cpp diff --git a/src/statusbarmessagelabel.cpp b/src/statusbarmessagelabel.cpp index 0604b2633..2efcd2e7d 100644 --- a/src/statusbarmessagelabel.cpp +++ b/src/statusbarmessagelabel.cpp @@ -15,19 +15,23 @@ * 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., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #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), @@ -35,67 +39,82 @@ StatusBarMessageLabel::StatusBarMessageLabel(QWidget* parent) : m_state(Default), m_illumination(0), m_minTextHeight(-1), - m_timer(0) + 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; + 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); - 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; - 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) @@ -103,19 +122,26 @@ void StatusBarMessageLabel::setMinimumTextHeight(int min) if (min != m_minTextHeight) { m_minTextHeight = min; setMinimumHeight(min); + m_closeButton->setFixedHeight(min - borderGap() * 2); } } +int StatusBarMessageLabel::widthGap() const +{ + QFontMetrics fontMetrics(font()); + const int defaultGap = 10; + return fontMetrics.width(m_text) - availableTextWidth() + defaultGap; +} + void StatusBarMessageLabel::paintEvent(QPaintEvent* /* event */) { - QPixmap buffer(size()); - QPainter painter(&buffer); + QPainter painter(this); // draw background - QColor backgroundColor(colorGroup().background()); + 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); @@ -123,26 +149,29 @@ 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 painter.setPen(foregroundColor); - painter.drawText(QRect(x, 0, width() - x, height()), Qt::AlignVCenter | Qt::TextWordWrap, m_text); + int flags = Qt::AlignVCenter; + if (height() > m_minTextHeight) { + flags = flags | Qt::TextWordWrap; + } + painter.drawText(QRect(x, 0, availableTextWidth(), height()), flags, m_text); painter.end(); - - bitBlt(this, 0, 0, &buffer); } void StatusBarMessageLabel::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); - QTimer::singleShot(0, this, SLOT(assureVisibleText())); + updateCloseButtonPosition(); + QTimer::singleShot(GeometryTimeout, this, SLOT(assureVisibleText())); } void StatusBarMessageLabel::timerDone() @@ -156,7 +185,7 @@ void StatusBarMessageLabel::timerDone() } else { m_state = Illuminated; - m_timer->start(1000); + m_timer->start(5000); } break; } @@ -192,19 +221,48 @@ void StatusBarMessageLabel::assureVisibleText() return; } - - int availableWidth = width() - m_pixmap.width() - pixmapGap() * 2; - + // calculate the required height of the widget thats + // needed for having a fully visible text QFontMetrics fontMetrics(font()); - QRect bounds(fontMetrics.boundingRect(0, 0, availableWidth, height(), - Qt::AlignVCenter | Qt::TextWordWrap, - m_text)); + const QRect bounds(fontMetrics.boundingRect(0, 0, availableTextWidth(), height(), + 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 +{ + 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, @@ -218,4 +276,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 = QString::null; + m_type = DolphinStatusBar::Default; +} + #include "statusbarmessagelabel.moc"