From: Jean-Baptiste Kempf Date: Fri, 23 Nov 2007 06:47:30 +0000 (+0000) Subject: Qt4 - New kind of volume slider. X-Git-Tag: 0.9.0-test0~4435 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=604c18022c6cc8d7b038726a6daaed319a8ff95f;p=vlc Qt4 - New kind of volume slider. Need a lot of graphic tweaking. --- diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp index 29fee59f39..f95b3785bb 100644 --- a/modules/gui/qt4/components/interface_widgets.cpp +++ b/modules/gui/qt4/components/interface_widgets.cpp @@ -29,6 +29,7 @@ #include "input_manager.hpp" #include "menus.hpp" #include "util/input_slider.hpp" +#include "util/customwidgets.hpp" #include #include @@ -486,29 +487,20 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_advControls ) : controlLayout->setColumnStretch( 14, 5 ); /* Volume */ - VolumeClickHandler *h = new VolumeClickHandler( p_intf, this ); + VolumeClickHandler *hVolLabel = new VolumeClickHandler( p_intf, this ); volMuteLabel = new QLabel; volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-high.png" ) ); volMuteLabel->setToolTip( qtr( "Mute" ) ); - volMuteLabel->installEventFilter( h ); - - /** TODO: - * Change this slider to use a nice Amarok-like one - * **/ - /** FIXME - * THis percerntage thing has to be handled correctly - * This has to match to the OSD - **/ - volumeSlider = new QSlider; - volumeSlider->setSizePolicy( sizePolicy ); - volumeSlider->setMaximumSize( QSize( 80, 200 ) ); - volumeSlider->setOrientation( Qt::Horizontal ); + volMuteLabel->installEventFilter( hVolLabel ); + controlLayout->addWidget( volMuteLabel, 3, 15 ); + volumeSlider = new SoundSlider( this ); + volumeSlider->setMaximumSize( QSize( 200, 40 ) ); + volumeSlider->setMinimumSize( QSize( 80, 20 ) ); + controlLayout->addWidget( volumeSlider, 3, 16, 1, 2 ); volumeSlider->setMaximum( VOLUME_MAX ); volumeSlider->setFocusPolicy( Qt::NoFocus ); - controlLayout->addWidget( volMuteLabel, 3, 15 ); - controlLayout->addWidget( volumeSlider, 3, 16, 1, 2 ); /* Volume control connection */ CONNECT( volumeSlider, valueChanged( int ), this, updateVolume( int ) ); @@ -863,3 +855,5 @@ void SpeedControlWidget::resetRate() { THEMIM->getIM()->setRate(INPUT_RATE_DEFAULT); } + + diff --git a/modules/gui/qt4/components/interface_widgets.hpp b/modules/gui/qt4/components/interface_widgets.hpp index 2bd25cdbfc..7edde5e54a 100644 --- a/modules/gui/qt4/components/interface_widgets.hpp +++ b/modules/gui/qt4/components/interface_widgets.hpp @@ -140,6 +140,8 @@ class InputSlider; class QSlider; class QGridLayout; class VolumeClickHandler; +class SoundSlider; + class ControlsWidget : public QFrame { Q_OBJECT @@ -148,7 +150,7 @@ public: virtual ~ControlsWidget(); QPushButton *playlistButton; - QSlider *volumeSlider; + SoundSlider *volumeSlider; void setStatus( int ); void enableInput( bool ); void enableVideo( bool ); @@ -226,6 +228,7 @@ signals: void timeLabelDoubleClicked(); }; + /******************** Playlist Widgets ****************/ #include #include @@ -273,5 +276,4 @@ private slots: void resetRate(); }; - #endif diff --git a/modules/gui/qt4/util/customwidgets.cpp b/modules/gui/qt4/util/customwidgets.cpp index 2ef11193a3..1fbaec2abc 100644 --- a/modules/gui/qt4/util/customwidgets.cpp +++ b/modules/gui/qt4/util/customwidgets.cpp @@ -194,4 +194,5 @@ QString VLCKeyToString( int val ) } } return r; -} \ No newline at end of file +} + diff --git a/modules/gui/qt4/util/customwidgets.hpp b/modules/gui/qt4/util/customwidgets.hpp index 869e4bbb8c..6c2be011ac 100644 --- a/modules/gui/qt4/util/customwidgets.hpp +++ b/modules/gui/qt4/util/customwidgets.hpp @@ -56,6 +56,7 @@ private: bool mDrawClickMsg; }; + /***************************************************************** * Custom views *****************************************************************/ diff --git a/modules/gui/qt4/util/input_slider.cpp b/modules/gui/qt4/util/input_slider.cpp index c71770f62d..85e1d6ba27 100644 --- a/modules/gui/qt4/util/input_slider.cpp +++ b/modules/gui/qt4/util/input_slider.cpp @@ -24,6 +24,10 @@ #include "qt4.hpp" #include "util/input_slider.hpp" +#include +#include + +#include InputSlider::InputSlider( QWidget *_parent ) : DirectSlider( _parent ) { InputSlider::InputSlider( Qt::Horizontal, _parent ); @@ -66,7 +70,123 @@ void InputSlider::userDrag( int new_value ) void InputSlider::mouseMoveEvent(QMouseEvent *event) { char psz_length[MSTRTIME_MAX_SIZE]; - secstotimestr( psz_length, (int)((float)event->x()/size().width()*inputLength) ); + secstotimestr( psz_length, ( event->x() * inputLength) / size().width() ); setToolTip( psz_length ); } +#define WLENGTH 100 // px +#define WHEIGHT 25 // px +#define SOUNDMIN 0 // % +#define SOUNDMAX 200 // % OR 400 ? +#define SOUNDSTEP 5 // % + +SoundSlider::SoundSlider( QWidget *_parent ) : QAbstractSlider( _parent ) +{ + padding = 5; + setRange( SOUNDMIN, SOUNDMAX ); + + pixGradient = QPixmap( QSize( WLENGTH, WHEIGHT ) ); +// QBixmap mask = QBitmap( QPixmap ); + + QPainter p( &pixGradient ); + QLinearGradient gradient( 0, 0, WLENGTH, WHEIGHT ); + gradient.setColorAt( 0.0, Qt::white ); + gradient.setColorAt( 1.0, Qt::blue ); + p.setPen( Qt::NoPen ); + p.setBrush( gradient ); + +//static const QPointF points[3] = { QPointF( 0.0, WHEIGHT ), + // QPointF( WLENGTH, WHEIGHT ), QPointF( WLENGTH, 0.0 ) }; + + // p.drawConvexPolygon( points, 3 ); + + p.drawRect( pixGradient.rect() ); + p.end(); + + // pixGradient.setMask( mask ); +} + +void SoundSlider::wheelEvent( QWheelEvent *event ) +{ + int newvalue = value() + event->delta() / ( 8 * 15 ) * SOUNDSTEP; + setValue( __MIN( __MAX( minimum(), newvalue ), maximum() ) ); + + emit sliderReleased(); +} + +void SoundSlider::mousePressEvent( QMouseEvent *event ) +{ + if( event->button() != Qt::RightButton ) + { + /* We enter the sliding mode */ + b_sliding = true; + i_oldvalue = value(); + emit sliderPressed(); + } +} + +void SoundSlider::mouseReleaseEvent( QMouseEvent *event ) +{ + if( event->button() != Qt::RightButton ) + { + if( !b_outside && value() != i_oldvalue ) + { + emit sliderReleased(); + setValue( value() ); + } + b_sliding = false; + b_outside = false; + } +} + +void SoundSlider::mouseMoveEvent( QMouseEvent *event ) +{ + if( b_sliding ) + { + QRect rect( padding - 15, padding - 1, + WLENGTH + 15 * 2, WHEIGHT + 2 ); + if( !rect.contains( event->pos() ) ) + { /* We are outside */ + if ( !b_outside ) + setValue( i_oldvalue ); + b_outside = true; + } + else + { /* We are inside */ + b_outside = false; + changeValue( event->x() - padding ); + emit sliderMoved( value() ); + } + } + else + event->ignore(); +} + +void SoundSlider::changeValue( int x ) +{ + setValue( QStyle::sliderValueFromPosition( + minimum(), maximum(), x, width() - 2 * padding ) ); +} + +void SoundSlider::paintEvent(QPaintEvent *e) +{ + QPainter painter( this ); + const int offset = int( double( ( width() - 2 * padding ) * value() ) / maximum() ); + const QRectF boundsG( padding, 0, offset , pixGradient.height() ); + painter.drawPixmap( boundsG, pixGradient, boundsG ); + + painter.end(); +/* QPainter painter( this ); + printf( "%i\n", value() ); + + QLinearGradient gradient( 0.0, 0.0, WLENGTH, WHEIGHT ); + gradient.setColorAt( 0.0, Qt::white ); + gradient.setColorAt( 1.0, Qt::blue ); + + painter.setPen( QPen( QBrush( Qt::black ), 0, Qt::SolidLine, Qt::RoundCap ) ); + painter.setBrush( gradient ); + painter.setRenderHint( QPainter::Antialiasing ); + + painter.end();*/ +} + diff --git a/modules/gui/qt4/util/input_slider.hpp b/modules/gui/qt4/util/input_slider.hpp index 30ab21e863..fc07341f4e 100644 --- a/modules/gui/qt4/util/input_slider.hpp +++ b/modules/gui/qt4/util/input_slider.hpp @@ -45,4 +45,31 @@ private slots: signals: void sliderDragged( float ); }; + + +class QPaintEvent; +#include + +class SoundSlider : public QAbstractSlider +{ + Q_OBJECT +public: + SoundSlider( QWidget *_parent ); + virtual ~SoundSlider() {}; +protected: + int padding; + virtual void paintEvent(QPaintEvent *); + virtual void wheelEvent( QWheelEvent *event ); + virtual void mousePressEvent( QMouseEvent * ); + virtual void mouseMoveEvent( QMouseEvent * ); + virtual void mouseReleaseEvent( QMouseEvent * ); +private: + bool b_sliding; + bool b_outside; + int i_oldvalue; + void changeValue( int x ); + QPixmap pixGradient; + QPixmap pixLimit; +}; + #endif