ui->setupUi(this);
- QWidget *playBarContents = new QWidget(ui->playBar);
+ {
+ QWidget *seekBarContents = new QWidget(ui->seekBar);
+ m_seekSlider = new SeekSlider(seekBarContents);
-// m_seekSlider = new Phonon::SeekSlider(playBarContents);
- m_seekSlider = new SeekSlider(playBarContents);
- m_volumeSlider = new Phonon::VolumeSlider(playBarContents);
+ QHBoxLayout *layout = new QHBoxLayout(seekBarContents);
+ layout->addWidget(m_seekSlider);
+ ui->seekBar->addWidget(seekBarContents);
+ }
+ {
+ QWidget *playBarContents = new QWidget(ui->playBar);
- m_seekSlider->setMinimumWidth(100);
- m_volumeSlider->setMinimumWidth(50);
+ m_oldSeekSlider = new Phonon::SeekSlider(playBarContents);
+ m_volumeSlider = new Phonon::VolumeSlider(playBarContents);
- timeLabel = new QLabel("0:00:00 / 0:00:00", this);
+ m_oldSeekSlider->setMinimumWidth(100);
+ m_volumeSlider->setMinimumWidth(50);
- QHBoxLayout *layout = new QHBoxLayout(playBarContents);
- layout->addWidget(m_seekSlider, 5);
- layout->addWidget(timeLabel, 1);
- layout->addWidget(m_volumeSlider, 2);
- ui->playBar->addWidget(playBarContents);
+ timeLabel = new QLabel("0:00:00 / 0:00:00", this);
+ QHBoxLayout *layout = new QHBoxLayout(playBarContents);
+ layout->addWidget(m_oldSeekSlider, 5);
+ layout->addWidget(timeLabel, 1);
+ layout->addWidget(m_volumeSlider, 2);
+ ui->playBar->addWidget(playBarContents);
+ }
setWindowTitle(tr("%1 Control Panel").arg(qApp->applicationName()));
totalTime = " / " + QTime(0, 0, 0, 0).toString("h:mm:ss");
return m_seekSlider;
}
+Phonon::SeekSlider *Menu::oldSeekSlider() const
+{
+ return m_oldSeekSlider;
+}
+
Phonon::VolumeSlider *Menu::volumeSlider() const
{
return m_volumeSlider;
void addActions(QList<QAction *> actions);
SeekSlider *seekSlider() const;
+ Phonon::SeekSlider *oldSeekSlider() const;
Phonon::VolumeSlider *volumeSlider() const;
public slots:
private:
Ui::MenuClass *ui;
-// Phonon::SeekSlider *m_seekSlider;
+ Phonon::SeekSlider *m_oldSeekSlider;
SeekSlider *m_seekSlider;
Phonon::VolumeSlider *m_volumeSlider;
<x>0</x>
<y>0</y>
<width>395</width>
- <height>67</height>
+ <height>77</height>
</rect>
</property>
<property name="minimumSize">
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
+ <property name="windowTitle">
+ <string>Main Bar</string>
+ </property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<widget class="QStatusBar" name="statusBar"/>
<widget class="QToolBar" name="playBar">
<property name="windowTitle">
- <string>toolBar</string>
+ <string>Play Bar</string>
+ </property>
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>true</bool>
+ </attribute>
+ </widget>
+ <widget class="QToolBar" name="seekBar">
+ <property name="windowTitle">
+ <string>Seek Bar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
#include "seekslider.h"
+#include <QPainter>
#include <QEvent>
#include <QMouseEvent>
#include "aniplayer.h"
-SeekSlider::SeekSlider(QWidget *parent) : QSlider(parent)
+#include <QDebug>
+
+SeekSlider::SeekSlider(QWidget *parent) : QWidget(parent)
{
- ticking = false;
- setOrientation(Qt::Horizontal);
+ init();
}
-SeekSlider::SeekSlider(Phonon::MediaObject *mo, QWidget *parent) : QSlider(parent)
+SeekSlider::SeekSlider(Phonon::MediaObject *mo, QWidget *parent) : QWidget(parent)
{
- ticking = false;
- setOrientation(Qt::Horizontal);
+ init();
setMediaObject(mo);
}
+void SeekSlider::init()
+{
+ ticking = false;
+ m_length = 1000;
+ m_value = 20;
+ markerWidth = 2;
+ drawMarkerShadow = false;
+ markerShadowEnabled = true;
+ maxPreviousPos = 3;
+
+ setMouseTracking(true);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+}
+
SeekSlider::~SeekSlider()
{
}
+bool SeekSlider::isMarkerShadowEnabled() const
+{
+ return markerShadowEnabled;
+}
+
+void SeekSlider::setMarkerShadowEnabled(bool enable)
+{
+ markerShadowEnabled = enable;
+}
+
+QSize SeekSlider::sizeHint() const
+{
+ return QSize();
+}
+
+QSize SeekSlider::minimumSizeHint() const
+{
+ return QSize(100, 20);
+}
+
+void SeekSlider::setValue(qint64 value)
+{
+ m_value = value;
+ update();
+}
+
+Phonon::MediaObject *SeekSlider::mediaObject() const
+{
+ return m_media;
+}
+
void SeekSlider::setMediaObject(Phonon::MediaObject *media)
{
if (m_media)
}
}
-Phonon::MediaObject *SeekSlider::mediaObject() const
+void SeekSlider::paintEvent(QPaintEvent *event)
{
- return m_media;
+ QPainter p(this);
+
+ seekerTop = 0;//height() / 3;
+ seekerLeft = 0;
+ seekerHeight = height() - 1;//height() / 3;
+ seekerWidth = width() - 1;
+
+ const int markerWidth = 2;
+ const int markerPos = seekerLeft + 1 + markerWidth / 2 + qRound(double(m_value) / double(m_length) * double(seekerWidth - markerWidth / 2 - 1));
+ const QColor markerColor(255, 0, 0);
+ const QColor markerShadowColor(255, 0, 0, 100);
+ const QColor watchedPartColor(0, 0, 255, 100);
+
+ // border
+ p.drawRect(seekerLeft, seekerTop, seekerWidth, seekerHeight);
+
+ // watched part
+ p.fillRect(seekerLeft + 1, seekerTop + 1, markerPos - 1, seekerHeight - 1, watchedPartColor);
+
+ // marker bar
+ p.fillRect(markerPos - markerWidth / 2, seekerTop + 1, markerWidth, seekerHeight - 1, markerColor);
+
+qDebug() << markerShadowPos;
+ // marker shadow (where the marker would move when mouse is clicked)
+ if (drawMarkerShadow)
+ {
+ markerShadowPos = qBound(seekerLeft + 1 + markerWidth / 2, markerShadowPos, seekerLeft + seekerWidth - markerWidth / 2);
+ p.fillRect(markerShadowPos - markerWidth / 2, seekerTop + 1, markerWidth, seekerHeight - 1, markerShadowColor);
+ }
}
-void SeekSlider::seek(int msec)
+void SeekSlider::mouseMoveEvent(QMouseEvent *event)
+{
+ markerShadowPos = event->pos().x();
+ update();
+}
+
+void SeekSlider::enterEvent(QEvent *event)
+{
+ drawMarkerShadow = true;
+ update();
+}
+
+void SeekSlider::leaveEvent(QEvent *event)
+{
+ drawMarkerShadow = false;
+ update();
+}
+
+void SeekSlider::mouseReleaseEvent(QMouseEvent *event)
+{
+ if (event->button() != Qt::LeftButton)
+ return;
+
+ int newMarkerPos = qBound(seekerLeft + 1, event->pos().x(), seekerLeft + seekerWidth);
+ qint64 newSeekPos = double(newMarkerPos) / double(seekerLeft + seekerWidth) * double(m_length);
+
+ ticking = true;
+ setValue(newSeekPos);
+ ticking = false;
+ seek(newSeekPos);
+
+ event->accept();
+}
+
+void SeekSlider::seek(qint64 msec)
{
if (!ticking && m_media)
{
void SeekSlider::length(qint64 msec)
{
ticking = true;
- setRange(0, msec);
+ setLength(msec);
ticking = false;
}
break;
}
}
+
+void SeekSlider::setLength(qint64 length)
+{
+ m_length = length;
+ update();
+}
+
+int SeekSlider::pxFromValue()
+{
+
+}
+
+qint64 SeekSlider::valueFromPx()
+{
+
+}
#include <QSlider>
#include <QPointer>
#include <Phonon/MediaObject>
+#include <QQueue>
-class SeekSlider : public QSlider
+class SeekSlider : public QWidget
{
Q_OBJECT
Q_DISABLE_COPY(SeekSlider);
+
+ Q_PROPERTY(bool markerShadowEnabled READ isMarkerShadowEnabled WRITE setMarkerShadowEnabled);
/*
Q_PROPERTY(bool tracking READ hasTracking WRITE setTracking)
Q_PROPERTY(int pageStep READ pageStep WRITE setPageStep)
explicit SeekSlider(Phonon::MediaObject *media, QWidget *parent = 0);
~SeekSlider();
+ bool isMarkerShadowEnabled() const;
+ void setMarkerShadowEnabled(bool enable = true);
+
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
/* bool hasTracking() const;
void setTracking(bool tracking);
int pageStep() const;
Phonon::MediaObject *mediaObject() const;
-/* QSize sizeHint() const;
- QSize minimumSizeHint() const;
+/*
bool event(QEvent *event);
*/
public slots:
// void setOrientation(Qt::Orientation o);
+ void setValue(qint64 value);
void setMediaObject(Phonon::MediaObject *m);
-/*
+
protected:
- void paintEvent(QPaintEvent *ev);
- void mousePressEvent(QMouseEvent *ev);
+ void paintEvent(QPaintEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
+ void enterEvent(QEvent *event);
+ void leaveEvent(QEvent *event);
void mouseReleaseEvent(QMouseEvent *ev);
- void mouseMoveEvent(QMouseEvent *ev);
+
+/* void mousePressEvent(QMouseEvent *ev);
+
void initStyleOption(QStyleOptionSlider *option) const;
*/
private slots:
void stateChanged(Phonon::State newState);
- void seek(int msec);
+ void seek(qint64 msec);
void tick(qint64 msec);
void length(qint64 msec);
void seekableChanged(bool isSeekable);
void currentSourceChanged();
private:
+ void init();
+ void setLength(qint64 length);
+
+ int pxFromValue();
+ qint64 valueFromPx();
+
QPointer<Phonon::MediaObject> m_media;
bool ticking;
+ bool markerShadowEnabled;
+
+ qint64 m_value;
+ qint64 m_length;
bool m_tracking;
int m_pageStep;
int m_singleStep;
Qt::Orientation m_orientation;
+
+ bool drawMarkerShadow;
+ int markerShadowPos;
+
+ QQueue<int> previuousPos;
+ int maxPreviousPos;
+
+ // Seeker Geometry
+ int seekerTop;
+ int seekerLeft;
+ int seekerHeight;
+ int seekerWidth;
+
+ int markerWidth;
};
#endif // SEEKSLIDER_H
connect(mediaObject, SIGNAL(totalTimeChanged(qint64)), menu, SLOT(setTotalTime(qint64)));
connect(mediaObject, SIGNAL(tick(qint64)), this, SLOT(tick(qint64)));
+ menu->oldSeekSlider()->setMediaObject(mediaObject);
menu->seekSlider()->setMediaObject(mediaObject);
menu->volumeSlider()->setAudioOutput(audioOutput);
#ifdef GRAPHICS_VIEW_VIDEO