Commit 604c1802 authored by Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf

Qt4 - New kind of volume slider.

Need a lot of graphic tweaking.
parent d919d75e
......@@ -29,6 +29,7 @@
#include "input_manager.hpp"
#include "menus.hpp"
#include "util/input_slider.hpp"
#include "util/customwidgets.hpp"
#include <vlc_vout.h>
#include <QLabel>
......@@ -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);
}
......@@ -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 <QModelIndex>
#include <QSplitter>
......@@ -273,5 +276,4 @@ private slots:
void resetRate();
};
#endif
......@@ -195,3 +195,4 @@ QString VLCKeyToString( int val )
}
return r;
}
......@@ -56,6 +56,7 @@ private:
bool mDrawClickMsg;
};
/*****************************************************************
* Custom views
*****************************************************************/
......
......@@ -24,6 +24,10 @@
#include "qt4.hpp"
#include "util/input_slider.hpp"
#include <QPaintEvent>
#include <QPainter>
#include <QStyle>
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();*/
}
......@@ -45,4 +45,31 @@ private slots:
signals:
void sliderDragged( float );
};
class QPaintEvent;
#include <QAbstractSlider>
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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment