diff options
| -rw-r--r-- | src/plugins/Ui/skinned/display.cpp | 16 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/display.h | 2 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/pixmapwidget.cpp | 7 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/pixmapwidget.h | 4 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/timeindicator.cpp | 170 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/timeindicator.h | 58 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/titlebar.cpp | 32 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/titlebar.h | 10 |
8 files changed, 201 insertions, 98 deletions
diff --git a/src/plugins/Ui/skinned/display.cpp b/src/plugins/Ui/skinned/display.cpp index 8fb28c48b..2c02e7c68 100644 --- a/src/plugins/Ui/skinned/display.cpp +++ b/src/plugins/Ui/skinned/display.cpp @@ -51,7 +51,9 @@ MainDisplay::MainDisplay (MainWindow *parent) setPixmap (m_skin->getMain()); setCursor(m_skin->getCursor(Skin::CUR_NORMAL)); m_mw = parent; - m_titlebar = new TitleBar(this); + + m_timeIndicatorModel = new TimeIndicatorModel(this); + m_titlebar = new TitleBar(m_timeIndicatorModel, this); m_titlebar->move(0,0); m_titlebar->setActive(true); m_previous = new Button (this, Skin::BT_PREVIOUS_N, Skin::BT_PREVIOUS_P, Skin::CUR_NORMAL); @@ -115,7 +117,7 @@ MainDisplay::MainDisplay (MainWindow *parent) connect(m_posbar, SIGNAL(sliderMoved(qint64)),SLOT(showPosition())); connect(m_posbar, SIGNAL(sliderReleased()),SLOT(updatePosition())); - m_timeIndicator = new TimeIndicator(this); + m_timeIndicator = new TimeIndicator(m_timeIndicatorModel, this); m_aboutWidget = new QWidget(this); m_core = SoundCore::instance(); connect(m_core, SIGNAL(elapsedChanged(qint64)), SLOT(setTime(qint64))); @@ -125,7 +127,6 @@ MainDisplay::MainDisplay (MainWindow *parent) connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(setState(Qmmp::State))); connect(m_core, SIGNAL(volumeChanged(int)), m_volumeBar, SLOT(setValue(int))); connect(m_core, SIGNAL(balanceChanged(int)), m_balanceBar, SLOT(setValue(int))); - connect(m_core, SIGNAL(elapsedChanged(qint64)),m_titlebar, SLOT(setTime(qint64))); connect(m_balanceBar, SIGNAL(sliderMoved(int)), m_core, SLOT(setBalance(int))); connect(m_volumeBar, SIGNAL(sliderMoved(int)), m_core, SLOT(setVolume(int))); m_volumeBar->setValue(m_core->volume()); @@ -175,12 +176,12 @@ void MainDisplay::updatePositions() void MainDisplay::setTime (qint64 t) { m_posbar->setValue (t); - m_timeIndicator->setTime(t/1000); + m_timeIndicatorModel->setPosition(t/1000); } void MainDisplay::setDuration(qint64 t) { m_posbar->setMaximum (t); - m_timeIndicator->setSongDuration(t/1000); + m_timeIndicatorModel->setDuration(t/1000); } void MainDisplay::setState(Qmmp::State state) @@ -189,7 +190,7 @@ void MainDisplay::setState(Qmmp::State state) { case Qmmp::Playing: m_playstatus->setStatus(PlayStatus::PLAY); - m_timeIndicator->setNeedToShowTime(true); + m_timeIndicatorModel->setVisible(true); setDuration(m_core->totalTime()); break; case Qmmp::Paused: @@ -198,10 +199,9 @@ void MainDisplay::setState(Qmmp::State state) case Qmmp::Stopped: m_playstatus->setStatus(PlayStatus::STOP); m_monoster->setChannels (0); - m_timeIndicator->setNeedToShowTime(false); + m_timeIndicatorModel->setVisible(false); m_posbar->setValue (0); m_posbar->setMaximum (0); - m_titlebar->setTime(-1); } } diff --git a/src/plugins/Ui/skinned/display.h b/src/plugins/Ui/skinned/display.h index e394a440d..ec6084e9a 100644 --- a/src/plugins/Ui/skinned/display.h +++ b/src/plugins/Ui/skinned/display.h @@ -25,6 +25,7 @@ #include "pixmapwidget.h" class TimeIndicator; +class TimeIndicatorModel; class PositionBar; class Skin; class ToggleButton; @@ -111,6 +112,7 @@ private: BalanceBar* m_balanceBar; MainWindow* m_mw; MainVisual* m_vis; + TimeIndicatorModel* m_timeIndicatorModel; TimeIndicator* m_timeIndicator; TitleBar *m_titlebar; SoundCore *m_core; diff --git a/src/plugins/Ui/skinned/pixmapwidget.cpp b/src/plugins/Ui/skinned/pixmapwidget.cpp index 400cb67b7..0a4b9f8ae 100644 --- a/src/plugins/Ui/skinned/pixmapwidget.cpp +++ b/src/plugins/Ui/skinned/pixmapwidget.cpp @@ -44,3 +44,10 @@ void PixmapWidget::paintEvent (QPaintEvent *e) QPainter paint(this); style()->drawItemPixmap(&paint, rect(), Qt::AlignCenter, m_pixmap); } + +void PixmapWidget::mousePressEvent(QMouseEvent *e) +{ + if (e->button() & Qt::LeftButton) { + emit mouseClicked(); + } +} diff --git a/src/plugins/Ui/skinned/pixmapwidget.h b/src/plugins/Ui/skinned/pixmapwidget.h index 8272fbc9a..bfaa564d4 100644 --- a/src/plugins/Ui/skinned/pixmapwidget.h +++ b/src/plugins/Ui/skinned/pixmapwidget.h @@ -39,6 +39,10 @@ public: protected: void paintEvent ( QPaintEvent * event ); + virtual void mousePressEvent(QMouseEvent*); + +signals: + void mouseClicked(); private: QPixmap m_pixmap; diff --git a/src/plugins/Ui/skinned/timeindicator.cpp b/src/plugins/Ui/skinned/timeindicator.cpp index 30eed148e..fb6b84d81 100644 --- a/src/plugins/Ui/skinned/timeindicator.cpp +++ b/src/plugins/Ui/skinned/timeindicator.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov * + * Copyright (C) 2006-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -20,93 +20,89 @@ #include <QPainter> #include <QSettings> #include <QMouseEvent> -#include <QTimer> #include <qmmp/qmmp.h> #include "skin.h" #include "timeindicator.h" -TimeIndicator::TimeIndicator (QWidget *parent) - : PixmapWidget (parent) + +TimeIndicatorModel::TimeIndicatorModel(QObject *parent) + : QObject (parent) + , m_position (0) + , m_duration (0) + , m_elapsed (true) + , m_visible (false) { - m_skin = Skin::instance(); - m_pixmap = QPixmap (65 * m_skin->ratio(),13 * m_skin->ratio()); - m_elapsed = true; - m_time = m_songDuration = 0; readSettings(); - m_needToShowTime = false; - updateSkin(); - reset(); - connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin())); - m_timer = new QTimer(this); - m_timer->setInterval(125); - m_timer->setSingleShot (true); - connect(m_timer, SIGNAL(timeout()),SLOT(reset())); } -void TimeIndicator::setTime (int t) +TimeIndicatorModel::~TimeIndicatorModel() { - m_time = t; - m_pixmap.fill (Qt::transparent); - int r = m_skin->ratio(); - QPainter paint (&m_pixmap); + writeSettings(); +} - if (!m_elapsed) +void TimeIndicatorModel::setPosition(int position) +{ + if (m_position != position) { - t = m_songDuration - t; - paint.drawPixmap(r*2,0,m_skin->getNumber(10)); + m_position = position; + emit changed(); } - if (t < 0) - t = 0; - - if(t >= 3600) - t /= 60; - - paint.drawPixmap(r*13,0,m_skin->getNumber(t/600%10)); - paint.drawPixmap(r*26,0,m_skin->getNumber(t/60%10)); - paint.drawPixmap(r*43,0,m_skin->getNumber(t%60/10)); - paint.drawPixmap(r*56,0,m_skin->getNumber(t%60%10)); - - setPixmap (m_pixmap); - } -void TimeIndicator::reset() +void TimeIndicatorModel::setDuration(int duration) { - m_pixmap.fill (Qt::transparent); - QPainter paint (&m_pixmap); - setPixmap (m_pixmap ); + if (m_duration != duration) { + m_duration = duration; + emit changed(); + } } -void TimeIndicator::mousePressEvent(QMouseEvent* e) +void TimeIndicatorModel::setElapsed(bool elapsed) { - if (m_needToShowTime && e->button() & Qt::LeftButton) - { - m_elapsed = m_elapsed ? false : true; - setTime(m_time); + if (m_elapsed != elapsed) { + m_elapsed = elapsed; + emit changed(); } - PixmapWidget::mousePressEvent(e); } -void TimeIndicator::setSongDuration(int d) +void TimeIndicatorModel::setVisible(bool visible) { - m_songDuration = d; + if (m_visible != visible) + { + m_visible = visible; + emit changed(); + } } -TimeIndicator::~TimeIndicator() +int TimeIndicatorModel::displayTime() { - writeSettings(); -} + int t = m_position; + + if (t < 0) + { + return 0; + } + if (!m_elapsed) + { + t = m_position - m_duration; + } -void TimeIndicator::updateSkin() + if(qAbs(t) >= 3600) + { + t /= 60; + } + + return t; +} + +void TimeIndicatorModel::toggleElapsed() { - m_pixmap = QPixmap (65 * m_skin->ratio(),13 * m_skin->ratio()); - if (m_needToShowTime) - setTime(m_time); + setElapsed(!elapsed()); } -void TimeIndicator::readSettings() +void TimeIndicatorModel::readSettings() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("Skinned"); @@ -114,7 +110,7 @@ void TimeIndicator::readSettings() settings.endGroup(); } -void TimeIndicator::writeSettings() +void TimeIndicatorModel::writeSettings() { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("Skinned"); @@ -122,13 +118,59 @@ void TimeIndicator::writeSettings() settings.endGroup(); } -void TimeIndicator::setNeedToShowTime(bool need) + +TimeIndicator::TimeIndicator (TimeIndicatorModel *model, QWidget *parent) + : PixmapWidget (parent) + , m_model (model) { - m_needToShowTime = need; - if (!need) - m_timer->start(); - else - m_timer->stop(); + m_skin = Skin::instance(); + updateSkin(); + connect(m_skin, SIGNAL(skinChanged()), this, SLOT(updateSkin())); + connect(m_model, SIGNAL(changed()), this, SLOT(modelChanged())); +} + +void TimeIndicator::modelChanged() +{ + m_pixmap.fill (Qt::transparent); + + if (m_model->visible()) { + int r = m_skin->ratio(); + QPainter paint (&m_pixmap); + + if (!m_model->elapsed()) + { + paint.drawPixmap(r*2,0,m_skin->getNumber(10)); + } + + int t = qAbs(m_model->displayTime()); + + paint.drawPixmap(r*13,0,m_skin->getNumber(t/600%10)); + paint.drawPixmap(r*26,0,m_skin->getNumber(t/60%10)); + paint.drawPixmap(r*43,0,m_skin->getNumber(t%60/10)); + paint.drawPixmap(r*56,0,m_skin->getNumber(t%60%10)); + } + + setPixmap (m_pixmap); +} + +void TimeIndicator::mousePressEvent(QMouseEvent* e) +{ + if (m_model->visible() && e->button() & Qt::LeftButton) + { + m_model->toggleElapsed(); + } + PixmapWidget::mousePressEvent(e); +} + +TimeIndicator::~TimeIndicator() +{ +} + + +void TimeIndicator::updateSkin() +{ + m_pixmap = QPixmap (65 * m_skin->ratio(),13 * m_skin->ratio()); + modelChanged(); } void TimeIndicator::mouseMoveEvent(QMouseEvent *) diff --git a/src/plugins/Ui/skinned/timeindicator.h b/src/plugins/Ui/skinned/timeindicator.h index 38d8e898e..526583688 100644 --- a/src/plugins/Ui/skinned/timeindicator.h +++ b/src/plugins/Ui/skinned/timeindicator.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov * + * Copyright (C) 2006-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -23,11 +23,50 @@ #include "pixmapwidget.h" class QMouseEvent; -class QTimer; class Skin; +/** Class TimeIndicatorModel + * @author Thomas Perl <m@thp.io> + * + * Encapsulates state and settings for the time indicator + */ +class TimeIndicatorModel : public QObject { + Q_OBJECT +public: + TimeIndicatorModel(QObject *parent = 0); + ~TimeIndicatorModel(); + + int position() { return m_position; } + int duration() { return m_duration; } + bool elapsed() { return m_elapsed; } + bool visible() { return m_visible; } + + void setPosition(int position); + void setDuration(int duration); + void setElapsed(bool elapsed); + void setVisible(bool visible); + + int displayTime(); + +public slots: + void toggleElapsed(); + +signals: + void changed(); + +private: + void readSettings(); + void writeSettings(); + + int m_position; + int m_duration; + bool m_elapsed; + bool m_visible; +}; + + /** Class TimeIndicator * @author Vladimir Kuznetsov <vovanec@gmail.com> * @@ -38,31 +77,22 @@ class TimeIndicator : public PixmapWidget { Q_OBJECT public: - TimeIndicator(QWidget *parent = 0); + TimeIndicator(TimeIndicatorModel *model, QWidget *parent = 0); ~TimeIndicator(); - void setTime ( int t ); - void setSongDuration(int); - void setNeedToShowTime(bool); protected: virtual void mousePressEvent(QMouseEvent*); virtual void mouseMoveEvent(QMouseEvent*); virtual void mouseReleaseEvent(QMouseEvent*); - void writeSettings(); - void readSettings(); private slots: + void modelChanged(); void updateSkin(); - void reset(); private: + TimeIndicatorModel *m_model; QPixmap m_pixmap; Skin *m_skin; - int m_time; - int m_songDuration; - bool m_elapsed; - bool m_needToShowTime; - QTimer *m_timer; }; #endif diff --git a/src/plugins/Ui/skinned/titlebar.cpp b/src/plugins/Ui/skinned/titlebar.cpp index 9bf3a6531..68f147dff 100644 --- a/src/plugins/Ui/skinned/titlebar.cpp +++ b/src/plugins/Ui/skinned/titlebar.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007-2014 by Ilya Kotov * + * Copyright (C) 2007-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -33,10 +33,12 @@ #include "display.h" #include "titlebar.h" #include "mainwindow.h" +#include "timeindicator.h" // TODO skin cursor with shade mode -TitleBar::TitleBar(QWidget *parent) +TitleBar::TitleBar(TimeIndicatorModel *model, QWidget *parent) : PixmapWidget(parent) + , m_model(model) { m_align = false; m_skin = Skin::instance(); @@ -65,6 +67,7 @@ TitleBar::TitleBar(QWidget *parent) m_align = true; setCursor(m_skin->getCursor(Skin::CUR_TITLEBAR)); updatePositions(); + connect(m_model, SIGNAL(changed()), this, SLOT(onModelChanged())); } TitleBar::~TitleBar() @@ -160,7 +163,7 @@ void TitleBar::shade() m_shade2->show(); m_currentTime = new SymbolDisplay(this, 6); m_currentTime->show(); - m_currentTime->display("--:--"); + connect (m_currentTime, SIGNAL (mouseClicked()), m_model, SLOT (toggleElapsed())); m_control = new TitleBarControl(this); m_control->show(); connect (m_control, SIGNAL (nextClicked()), m_mw, SLOT (next())); @@ -190,6 +193,7 @@ void TitleBar::shade() qobject_cast<MainDisplay *> (parent())->setMinimalMode(m_shaded); if (m_align) Dock::instance()->align(m_mw, m_shaded? -r*102: r*102); + onModelChanged(); updatePositions(); } @@ -200,6 +204,11 @@ void TitleBar::mouseDoubleClickEvent (QMouseEvent *) QString TitleBar::formatTime (int sec) { + bool sign = false; + if (sec < 0) { + sign = true; + sec = -sec; + } int minutes = sec / 60; int seconds = sec % 60; @@ -209,15 +218,24 @@ QString TitleBar::formatTime (int sec) if (minutes < 10) str_minutes.prepend ("0"); if (seconds < 10) str_seconds.prepend ("0"); - return str_minutes + ":" + str_seconds; + return (sign ? "-" : "") + str_minutes + ":" + str_seconds; } -void TitleBar::setTime(qint64 time) +void TitleBar::onModelChanged() { if (!m_currentTime) return; - if (time < 0) + + if (!m_model->visible()) + { + m_currentTime->display(" : "); + } + else if (m_model->position() < 0) + { m_currentTime->display("--:--"); + } else - m_currentTime->display(formatTime(time/1000)); + { + m_currentTime->display(formatTime(m_model->displayTime())); + } } diff --git a/src/plugins/Ui/skinned/titlebar.h b/src/plugins/Ui/skinned/titlebar.h index d624ea69e..241ccc6bf 100644 --- a/src/plugins/Ui/skinned/titlebar.h +++ b/src/plugins/Ui/skinned/titlebar.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007-2012 by Ilya Kotov * + * Copyright (C) 2007-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -33,6 +33,7 @@ class Button; class SymbolDisplay; class TitleBarControl; class ShadedVisual; +class TimeIndicatorModel; /** @author Ilya Kotov <forkotov02@hotmail.ru> @@ -41,16 +42,14 @@ class TitleBar : public PixmapWidget { Q_OBJECT public: - TitleBar(QWidget *parent = 0); + TitleBar(TimeIndicatorModel *model, QWidget *parent = 0); ~TitleBar(); void setActive(bool); -public slots: - void setTime(qint64 time); - private slots: + void onModelChanged(); void updateSkin(); void showMainMenu(); void shade(); @@ -70,6 +69,7 @@ private: bool m_align; TitleBarControl *m_control; ShadedVisual *m_visual; + TimeIndicatorModel *m_model; void updatePositions(); protected: |
