1
0
mirror of https://invent.kde.org/system/dolphin synced 2024-07-04 17:30:55 +00:00

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
This commit is contained in:
Peter Penz 2007-01-30 19:38:44 +00:00
parent e181654494
commit 7495dabc15
4 changed files with 92 additions and 29 deletions

View File

@ -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&)));

View File

@ -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;

View File

@ -19,15 +19,19 @@
***************************************************************************/
#include "statusbarmessagelabel.h"
#include <qpainter.h>
#include <qtimer.h>
#include <qfontmetrics.h>
//Added by qt3to4:
#include <kglobalsettings.h>
#include <kiconloader.h>
#include <kicon.h>
#include <klocale.h>
#include <QFontMetrics>
#include <QPainter>
#include <QPaintEvent>
#include <QPushButton>
#include <QPixmap>
#include <QResizeEvent>
#include <QPaintEvent>
#include <kiconloader.h>
#include <kglobalsettings.h>
#include <QTimer>
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"

View File

@ -21,13 +21,15 @@
#ifndef STATUSBARMESSAGELABEL_H
#define STATUSBARMESSAGELABEL_H
#include <qwidget.h>
#include <qpixmap.h>
#include <qstring.h>
//Added by qt3to4:
#include <QPaintEvent>
#include <QResizeEvent>
#include <dolphinstatusbar.h>
#include <QPixmap>
#include <QString>
#include <QWidget>
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