From bdec7c03b5d462290c874384f4e2c851ec419d7f Mon Sep 17 00:00:00 2001 From: "craig.p.drummond" Date: Fri, 1 Jun 2012 16:24:54 +0000 Subject: [PATCH] Implement a basic spinner widget for item views in Qt-only builds. --- ChangeLog | 1 + widgets/itemview.cpp | 90 ++++++++++++++++++++++++++++++++++++++------ widgets/itemview.h | 34 ++++++++++++++++- 3 files changed, 113 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 24c8c682a..035c469cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,7 @@ 6. No need to check if playqueue song exists in MPD dir whe performing a 'locate in library'. Its possible that the configured MPD dir does not exist - but 'locate in library' should still work. +7. Implement a basic spinner widgets for item views in Qt-only builds. 0.7.1 ----- diff --git a/widgets/itemview.cpp b/widgets/itemview.cpp index 9411fb707..611cf34a8 100644 --- a/widgets/itemview.cpp +++ b/widgets/itemview.cpp @@ -65,6 +65,76 @@ bool EscapeKeyEventHandler::eventFilter(QObject *obj, QEvent *event) return QObject::eventFilter(obj, event); } +#ifndef ENABLE_KDE_SUPPORT +Spinner::Spinner() + : QWidget(0) + , timer(0) + , value(0) +{ + setVisible(false); + setMinimumSize(32, 32); + setMaximumSize(32, 32); +} + +void Spinner::start() +{ + value=0; + setVisible(true); + setPosition(); + if (!timer) { + timer=new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); + } + timer->start(100); +} + +void Spinner::stop() +{ + setVisible(false); + if (timer) { + timer->stop(); + } +} + +static const int constSpinnerSteps=64; + +void Spinner::paintEvent(QPaintEvent *event) +{ + static const int constParts=8; + QPainter p(this); + QRectF rectangle(1.5, 1.5, size().width()-3, size().height()-3); + QColor col(palette().color(QPalette::Text)); + p.setRenderHint(QPainter::Antialiasing, true); + p.setClipRect(event->rect()); + double size=(360*16)/(2.0*constParts); + for (int i=0; i=constSpinnerSteps) { + value=0; + } +} + +void Spinner::setPosition() +{ + QPoint current=pos(); + QPoint desired=QPoint(parentWidget()->size().width()-(size().width()+4), 4); + + if (current!=desired) { + move(desired); + } +} +#endif + static const int constImageSize=22; static const int constDevImageSize=32; @@ -343,12 +413,10 @@ ItemView::ItemView(QWidget *p) , currentLevel(0) , mode(Mode_Tree) , groupedView(0) + , spinnerActive(false) + , spinner(0) { setupUi(this); - #ifdef ENABLE_KDE_SUPPORT - spinner=0; - spinnerActive=false; - #endif backAction = new QAction(i18n("Back"), this); backAction->setIcon(QIcon::fromTheme("go-previous")); backButton->setDefaultAction(backAction); @@ -474,14 +542,12 @@ void ItemView::setMode(Mode m) } stackedWidget->setCurrentIndex(Mode_Tree==mode || Mode_GroupedTree==mode ? 0 : 1); - #ifdef ENABLE_KDE_SUPPORT if (spinner) { spinner->setWidget(view()->viewport()); if (spinnerActive) { spinner->start(); } } - #endif } void ItemView::hideBackButton() @@ -724,26 +790,28 @@ void ItemView::expandAll() void ItemView::showSpinner() { - #ifdef ENABLE_KDE_SUPPORT if (!spinner) { + #ifdef ENABLE_KDE_SUPPORT spinner=new KPixmapSequenceOverlayPainter(this); spinner->setSequence(KPixmapSequence("process-working", KIconLoader::SizeSmallMedium)); + #else + spinner=new Spinner(); + #endif } spinnerActive=true; spinner->setWidget(view()->viewport()); + #ifdef ENABLE_KDE_SUPPORT spinner->setAlignment(Qt::AlignTop | (Qt::RightToLeft==QApplication::layoutDirection() ? Qt::AlignLeft : Qt::AlignRight)); - spinner->start(); #endif + spinner->start(); } void ItemView::hideSpinner() { - #ifdef ENABLE_KDE_SUPPORT if (spinner) { spinnerActive=false; - spinner->stop(); + //spinner->stop(); } - #endif } void ItemView::collectionRemoved(quint32 key) diff --git a/widgets/itemview.h b/widgets/itemview.h index a68724893..91ad9fd13 100644 --- a/widgets/itemview.h +++ b/widgets/itemview.h @@ -51,6 +51,36 @@ private: QAction *act; }; +#ifndef ENABLE_KDE_SUPPORT +class Spinner : public QWidget +{ + Q_OBJECT + +public: + Spinner(); + virtual ~Spinner() { + } + + void setWidget(QWidget *widget) { + setParent(widget); + } + + void start(); + void stop(); + void paintEvent(QPaintEvent *event); + +private Q_SLOTS: + void timeout(); + +private: + void setPosition(); + +private: + QTimer *timer; + int value; +}; +#endif + class ItemView : public QWidget, public Ui::ItemView { Q_OBJECT @@ -152,9 +182,11 @@ private: QSize iconGridSize; QSize listGridSize; GroupedView *groupedView; - #ifdef ENABLE_KDE_SUPPORT bool spinnerActive; + #ifdef ENABLE_KDE_SUPPORT KPixmapSequenceOverlayPainter *spinner; + #else + Spinner *spinner; #endif };