]> Some of my projects - aniplayer-old.git/commitdiff
- Basic, working version of the new SeekSlider
authorAPTX <APTX@.(none)>
Fri, 1 May 2009 14:58:23 +0000 (16:58 +0200)
committerAPTX <APTX@.(none)>
Fri, 1 May 2009 14:58:23 +0000 (16:58 +0200)
src/menu.cpp
src/menu.h
src/menu.ui
src/seekslider.cpp
src/seekslider.h
src/videowindow.cpp

index e47c05a308a9f588c5df7011da4fe784478965da..e231089adcaea2a1c28fd55f42c3cf17ff0009ab 100644 (file)
@@ -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;
index 9b2a2ffb60be5c672c0f9a5f0e2ce9a3e60f8699..0be72d74d676258436cb747265a4b0b1c474cdd4 100644 (file)
@@ -30,6 +30,7 @@ public:
        void addActions(QList<QAction *> 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;
 
index 907dfafcbc80c69870237fdf7d61299fbc0a7307..46919ddd2e408fea298a6e96705519680b26e9e3 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>395</width>
-    <height>67</height>
+    <height>77</height>
    </rect>
   </property>
   <property name="minimumSize">
@@ -59,6 +59,9 @@
    </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>
index 313952f57cde742e0fa6ac3f89bca8595d139200..f02f1829bc25cb39bbf081fedf338a7059a24f56 100644 (file)
@@ -1,27 +1,73 @@
 #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)
@@ -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()
+{
+
+}
index 00775024cb7da46ee39d7c30e91447da4fc5b17e..7b8a100086ac25cbc9dec80b94b2b5f54db3a5e3 100644 (file)
@@ -4,12 +4,15 @@
 #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)
@@ -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<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
index 15310abfef69f63cc118c43b0adbc77f974167a3..38a171e9144c3f365f0d6e6a06d95effdaa105ab 100644 (file)
@@ -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