vlc | branch: master | Francois Cartegnie <[email protected]> | Sun Jul 3 21:33:06 2011 +0200| [c0670fd9ce5c2b0629f427e251fb6ab35bf5eaf9] | committer: Francois Cartegnie
Qt: Make chapters marks clickable > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c0670fd9ce5c2b0629f427e251fb6ab35bf5eaf9 --- modules/gui/qt4/util/input_slider.cpp | 47 +++++++++++++++++++++++++++++++- modules/gui/qt4/util/input_slider.hpp | 1 + 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/modules/gui/qt4/util/input_slider.cpp b/modules/gui/qt4/util/input_slider.cpp index 1ea5b5d..d8de45a 100644 --- a/modules/gui/qt4/util/input_slider.cpp +++ b/modules/gui/qt4/util/input_slider.cpp @@ -31,6 +31,8 @@ #include "util/input_slider.hpp" #include "adapters/seekpoints.hpp" +#include <stdlib.h> + #include <QPaintEvent> #include <QPainter> #include <QBitmap> @@ -42,6 +44,7 @@ #define MINIMUM 0 #define MAXIMUM 1000 +#define CHAPTERSSPOTSIZE 3 SeekSlider::SeekSlider( QWidget *_parent ) : QSlider( _parent ) { @@ -145,6 +148,11 @@ void SeekSlider::mouseReleaseEvent( QMouseEvent *event ) event->accept(); b_isSliding = false; seekLimitTimer->stop(); /* We're not sliding anymore: only last seek on release */ + if ( b_is_jumping ) + { + b_is_jumping = false; + return; + } QSlider::mouseReleaseEvent( event ); updatePos(); } @@ -159,6 +167,41 @@ void SeekSlider::mousePressEvent( QMouseEvent* event ) return; } + b_is_jumping = false; + /* handle chapter clicks */ + int i_width = size().width(); + if ( chapters && inputLength && i_width) + { + if ( orientation() == Qt::Horizontal ) /* TODO: vertical */ + { + /* only on chapters zone */ + if ( event->y() < CHAPTERSSPOTSIZE || + event->y() > ( size().height() - CHAPTERSSPOTSIZE ) ) + { + QList<SeekPoint> points = chapters->getPoints(); + int i_selected = -1; + int i_min_diff = i_width + 1; + for( int i = 0 ; i < points.count() ; i++ ) + { + int x = points.at(i).time / 1000000.0 / inputLength * i_width; + int diff_x = abs( x - event->x() ); + if ( diff_x < i_min_diff ) + { + i_min_diff = diff_x; + i_selected = i; + } else break; + } + if ( i_selected && i_min_diff < 4 ) // max 4px around mark + { + chapters->jumpTo( i_selected ); + event->accept(); + b_is_jumping = true; + return; + } + } + } + } + b_isSliding = true ; setValue( QStyle::sliderValueFromPosition( MINIMUM, MAXIMUM, event->x(), width(), false ) ); event->accept(); @@ -362,8 +405,8 @@ void SeekSlider::paintEvent( QPaintEvent *event ) int x = point.time / 1000000.0 / inputLength * size().width(); painter.setPen( QColor( 80, 80, 80 ) ); painter.setBrush( Qt::NoBrush ); - painter.drawLine( x, 0, x, 3 ); - painter.drawLine( x, height(), x, height() - 3 ); + painter.drawLine( x, 0, x, CHAPTERSSPOTSIZE ); + painter.drawLine( x, height(), x, height() - CHAPTERSSPOTSIZE ); } } } diff --git a/modules/gui/qt4/util/input_slider.hpp b/modules/gui/qt4/util/input_slider.hpp index 354bc28..f64dcc3 100644 --- a/modules/gui/qt4/util/input_slider.hpp +++ b/modules/gui/qt4/util/input_slider.hpp @@ -65,6 +65,7 @@ protected: private: bool b_isSliding; /* Whether we are currently sliding by user action */ + bool b_is_jumping; /* if we requested a jump to another chapter */ int inputLength; /* InputLength that can change */ char psz_length[MSTRTIME_MAX_SIZE]; /* Used for the ToolTip */ QTimer *seekLimitTimer; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
