From: Peter Penz Date: Tue, 30 Jan 2007 19:38:44 +0000 (+0000) Subject: Improvements for error messages: X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/7495dabc15d5a3a2c7a1e81657227f936a59144f Improvements for error messages: - increase/decrease size on demand and hide progress bar or space information if required - provide close button TODO: the code is far from being finished (e. g. no queueing of pending error messages, close button looks fugly, ...), but I decided to commit the changes to prevent getting an inconsistent state in combination with other commits... svn path=/trunk/playground/utils/dolphin/; revision=628642 --- diff --git a/src/dolphinstatusbar.cpp b/src/dolphinstatusbar.cpp index c81a01c70..4cdffec94 100644 --- a/src/dolphinstatusbar.cpp +++ b/src/dolphinstatusbar.cpp @@ -52,9 +52,12 @@ DolphinStatusBar::DolphinStatusBar(DolphinView* parent) : m_progressBar->hide(); const QSize size(m_progressBar->sizeHint()); + const int barHeight = size.height(); + m_progressBar->setMaximumWidth(200); - setMinimumHeight(size.height()); - m_messageLabel->setMinimumTextHeight(size.height()); + setMinimumHeight(barHeight); + m_messageLabel->setMinimumTextHeight(barHeight); + m_spaceInfo->setFixedHeight(barHeight); connect(parent, SIGNAL(urlChanged(const KUrl&)), this, SLOT(updateSpaceInfoContent(const KUrl&))); diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 90383348d..93cda320b 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -604,6 +604,8 @@ void DolphinView::loadDirectory(const KUrl& url) startDirLister(url); emit urlChanged(url); + + m_statusBar->clear(); } void DolphinView::triggerItem(const QModelIndex& index) @@ -870,7 +872,7 @@ void DolphinView::createView() // delete current view QAbstractItemView* view = itemView(); if (view != 0) { - m_topLayout->remove(view); + m_topLayout->removeWidget(view); view->close(); view->deleteLater(); m_iconsView = 0; diff --git a/src/statusbarmessagelabel.cpp b/src/statusbarmessagelabel.cpp index 1178a1688..f355189fc 100644 --- a/src/statusbarmessagelabel.cpp +++ b/src/statusbarmessagelabel.cpp @@ -19,15 +19,19 @@ ***************************************************************************/ #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,13 +39,17 @@ 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(KIcon("close"), QString::null, this); + m_closeButton->hide(); } StatusBarMessageLabel::~StatusBarMessageLabel() @@ -50,7 +58,7 @@ StatusBarMessageLabel::~StatusBarMessageLabel() void StatusBarMessageLabel::setType(DolphinStatusBar::Type type) { - if (type != m_type) { + if ((type != m_type) || (type == DolphinStatusBar::Error)) { m_type = type; m_timer->stop(); @@ -62,20 +70,27 @@ void StatusBarMessageLabel::setType(DolphinStatusBar::Type type) 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: break; + default: + m_closeButton->hide(); + break; } m_pixmap = (iconName == 0) ? QPixmap() : SmallIcon(iconName); @@ -121,7 +136,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 +144,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,7 +158,7 @@ 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(); } @@ -164,7 +179,7 @@ void StatusBarMessageLabel::timerDone() } else { m_state = Illuminated; - m_timer->start(1000); + m_timer->start(5000); } break; } @@ -200,6 +215,8 @@ 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, @@ -208,13 +225,38 @@ void StatusBarMessageLabel::assureVisibleText() 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() * 3) - buttonWidth; } QColor StatusBarMessageLabel::mixColors(const QColor& c1, @@ -228,4 +270,11 @@ QColor StatusBarMessageLabel::mixColors(const QColor& c1, return QColor(red, green, blue); } +void StatusBarMessageLabel::updateCloseButtonPosition() +{ + const int x = width() - m_closeButton->width(); + const int y = 2; + m_closeButton->move(x, y); +} + #include "statusbarmessagelabel.moc" diff --git a/src/statusbarmessagelabel.h b/src/statusbarmessagelabel.h index 03683c107..b75e499fb 100644 --- a/src/statusbarmessagelabel.h +++ b/src/statusbarmessagelabel.h @@ -21,13 +21,15 @@ #ifndef STATUSBARMESSAGELABEL_H #define STATUSBARMESSAGELABEL_H -#include -#include -#include -//Added by qt3to4: -#include -#include #include + +#include +#include +#include + +class QPaintEvent; +class QResizeEvent; +class QPushButton; class QTimer; /** @@ -84,6 +86,12 @@ private slots: */ int availableTextWidth() const; + /** + * Moves the close button to the upper right corner + * of the message label. + */ + void updateCloseButtonPosition(); + private: enum State { Default, @@ -101,12 +109,13 @@ private: QTimer* m_timer; QString m_text; QPixmap m_pixmap; + QPushButton* m_closeButton; QColor mixColors(const QColor& c1, const QColor& c2, int percent) const; - int pixmapGap() const { return 3; } + int borderGap() const { return 3; } }; #endif