aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Ui/skinned/display.cpp16
-rw-r--r--src/plugins/Ui/skinned/display.h2
-rw-r--r--src/plugins/Ui/skinned/pixmapwidget.cpp7
-rw-r--r--src/plugins/Ui/skinned/pixmapwidget.h4
-rw-r--r--src/plugins/Ui/skinned/timeindicator.cpp170
-rw-r--r--src/plugins/Ui/skinned/timeindicator.h58
-rw-r--r--src/plugins/Ui/skinned/titlebar.cpp32
-rw-r--r--src/plugins/Ui/skinned/titlebar.h10
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: