From 7eb73963a2c1c5e4f4860fb91054c3adfb6ef530 Mon Sep 17 00:00:00 2001 From: APTX Date: Fri, 1 May 2009 16:58:23 +0200 Subject: [PATCH] - Basic, working version of the new SeekSlider --- src/menu.cpp | 37 ++++++++---- src/menu.h | 3 +- src/menu.ui | 18 +++++- src/seekslider.cpp | 144 +++++++++++++++++++++++++++++++++++++++++--- src/seekslider.h | 52 +++++++++++++--- src/videowindow.cpp | 1 + 6 files changed, 222 insertions(+), 33 deletions(-) diff --git a/src/menu.cpp b/src/menu.cpp index e47c05a..e231089 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -27,23 +27,31 @@ Menu::Menu(QWidget *parent) 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"); @@ -64,6 +72,11 @@ SeekSlider *Menu::seekSlider() const return m_seekSlider; } +Phonon::SeekSlider *Menu::oldSeekSlider() const +{ + return m_oldSeekSlider; +} + Phonon::VolumeSlider *Menu::volumeSlider() const { return m_volumeSlider; diff --git a/src/menu.h b/src/menu.h index 9b2a2ff..0be72d7 100644 --- a/src/menu.h +++ b/src/menu.h @@ -30,6 +30,7 @@ public: void addActions(QList actions); SeekSlider *seekSlider() const; + Phonon::SeekSlider *oldSeekSlider() const; Phonon::VolumeSlider *volumeSlider() const; public slots: @@ -49,7 +50,7 @@ protected: private: Ui::MenuClass *ui; -// Phonon::SeekSlider *m_seekSlider; + Phonon::SeekSlider *m_oldSeekSlider; SeekSlider *m_seekSlider; Phonon::VolumeSlider *m_volumeSlider; diff --git a/src/menu.ui b/src/menu.ui index 907dfaf..46919dd 100644 --- a/src/menu.ui +++ b/src/menu.ui @@ -7,7 +7,7 @@ 0 0 395 - 67 + 77 @@ -59,6 +59,9 @@ + + Main Bar + TopToolBarArea @@ -69,7 +72,18 @@ - toolBar + Play Bar + + + TopToolBarArea + + + true + + + + + Seek Bar TopToolBarArea diff --git a/src/seekslider.cpp b/src/seekslider.cpp index 313952f..f02f182 100644 --- a/src/seekslider.cpp +++ b/src/seekslider.cpp @@ -1,27 +1,73 @@ #include "seekslider.h" +#include #include #include #include "aniplayer.h" -SeekSlider::SeekSlider(QWidget *parent) : QSlider(parent) +#include + +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) @@ -49,12 +95,74 @@ void SeekSlider::setMediaObject(Phonon::MediaObject *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) { @@ -72,7 +180,7 @@ void SeekSlider::tick(qint64 msec) void SeekSlider::length(qint64 msec) { ticking = true; - setRange(0, msec); + setLength(msec); ticking = false; } @@ -146,3 +254,19 @@ void SeekSlider::stateChanged(Phonon::State newState) break; } } + +void SeekSlider::setLength(qint64 length) +{ + m_length = length; + update(); +} + +int SeekSlider::pxFromValue() +{ + +} + +qint64 SeekSlider::valueFromPx() +{ + +} diff --git a/src/seekslider.h b/src/seekslider.h index 0077502..7b8a100 100644 --- a/src/seekslider.h +++ b/src/seekslider.h @@ -4,12 +4,15 @@ #include #include #include +#include -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) @@ -21,6 +24,11 @@ public: 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; @@ -32,39 +40,67 @@ public: 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 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 previuousPos; + int maxPreviousPos; + + // Seeker Geometry + int seekerTop; + int seekerLeft; + int seekerHeight; + int seekerWidth; + + int markerWidth; }; #endif // SEEKSLIDER_H diff --git a/src/videowindow.cpp b/src/videowindow.cpp index 15310ab..38a171e 100644 --- a/src/videowindow.cpp +++ b/src/videowindow.cpp @@ -161,6 +161,7 @@ VideoWindow::VideoWindow(QWidget *parent) : QMainWindow(parent) 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 -- 2.52.0