X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Finterface_widgets.cpp;h=6ab38a191442a85df9c9f631b134f17e3e5f3ebc;hb=72f13c9d9548e84e49e57f3ee707ad641854ac15;hp=6188f368d5f46a3c93485c011af84f87a8df0e04;hpb=fc63146c8032cc927aca5e2e21d08f2b32135c79;p=vlc diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp index 6188f368d5..6ab38a1914 100644 --- a/modules/gui/qt4/components/interface_widgets.cpp +++ b/modules/gui/qt4/components/interface_widgets.cpp @@ -6,6 +6,7 @@ * * Authors: Clément Stenac * Jean-Baptiste Kempf + * Rafaël Carré * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,12 +24,12 @@ *****************************************************************************/ #include "dialogs_provider.hpp" -#include "qt4.hpp" #include "components/interface_widgets.hpp" #include "main_interface.hpp" #include "input_manager.hpp" - +#include "menus.hpp" #include "util/input_slider.hpp" +#include "util/customwidgets.hpp" #include #include @@ -40,7 +41,8 @@ #include #include -#define ICON_SIZE 300 +#define ICON_SIZE 128 +#define MAX_BG_SIZE 300 /********************************************************************** * Video Widget. A simple frame on which video is drawn @@ -56,6 +58,7 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i ) vlc_mutex_init( p_intf, &lock ); p_vout = NULL; CONNECT( this, askResize(), this, SetMinSize() ); + CONNECT( this, askVideoToShow(), this, show() ); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); } @@ -87,6 +90,7 @@ QSize VideoWidget::sizeHint() const void *VideoWidget::request( vout_thread_t *p_nvout, int *pi_x, int *pi_y, unsigned int *pi_width, unsigned int *pi_height ) { + emit askVideoToShow(); if( p_vout ) { msg_Dbg( p_intf, "embedded video already in use" ); @@ -120,7 +124,7 @@ BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) : plt.setColor( QPalette::Inactive, QPalette::Window , Qt::black ); setPalette( plt ); - label = new QLabel( "" ); + label = new QLabel; label->setMaximumHeight( ICON_SIZE ); label->setMaximumWidth( ICON_SIZE ); label->setScaledContents( true ); @@ -157,6 +161,10 @@ void BackgroundWidget::resizeEvent( QResizeEvent *e ) label->setMaximumWidth( ICON_SIZE ); } +void BackgroundWidget::contextMenuEvent( QContextMenuEvent *event ) +{ + QVLCMenu::PopupMenu( p_intf, true ); +} /********************************************************************** * Visualization selector panel **********************************************************************/ @@ -230,12 +238,10 @@ AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i ) : ABButton->setIconSize( QSize( 20, 20 ) ); advLayout->addWidget( ABButton ); BUTTON_SET_ACT( ABButton, "AB", qtr( "A to B" ), fromAtoB() ); - - snapshotButton = new QPushButton( "S" ); - snapshotButton->setMaximumSize( QSize( 26, 26 ) ); - snapshotButton->setIconSize( QSize( 20, 20 ) ); - advLayout->addWidget( snapshotButton ); - BUTTON_SET_ACT( snapshotButton, "S", qtr( "Take a snapshot" ), snapshot() ); + timeA = 0; + timeB = 0; + CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), + this, AtoBLoop( float, int, int ) ); //FIXME Frame by frame function frameButton = new QPushButton( "Fr" ); @@ -249,13 +255,14 @@ AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i ) : recordButton->setMaximumSize( QSize( 26, 26 ) ); recordButton->setIconSize( QSize( 20, 20 ) ); advLayout->addWidget( recordButton ); - BUTTON_SET_ACT( recordButton, "R", qtr( "Record" ), record() ); + BUTTON_SET_ACT_I( recordButton, "", record_16px.png, + qtr( "Record" ), record() ); - normalButton = new QPushButton( "N" ); - normalButton->setMaximumSize( QSize( 26, 26 ) ); - normalButton->setIconSize( QSize( 20, 20 ) ); - advLayout->addWidget( normalButton ); - BUTTON_SET_ACT( normalButton, "N", qtr( "Normal rate" ), normal() ); + snapshotButton = new QPushButton( "S" ); + snapshotButton->setMaximumSize( QSize( 26, 26 ) ); + snapshotButton->setIconSize( QSize( 20, 20 ) ); + advLayout->addWidget( snapshotButton ); + BUTTON_SET_ACT( snapshotButton, "S", qtr( "Take a snapshot" ), snapshot() ); } @@ -265,47 +272,65 @@ AdvControlsWidget::~AdvControlsWidget() void AdvControlsWidget::enableInput( bool enable ) { -// slowerButton->setEnabled( enable ); ABButton->setEnabled( enable ); recordButton->setEnabled( enable ); - normalButton->setEnabled( enable ); -// fasterButton->setEnabled( enable ); } void AdvControlsWidget::enableVideo( bool enable ) { snapshotButton->setEnabled( enable ); frameButton->setEnabled( enable ); - //fullscreenButton->setEnabled( enable ); } -void AdvControlsWidget::normal() +void AdvControlsWidget::snapshot() { - THEMIM->getIM()->normalRate(); + vout_thread_t *p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); + if( p_vout ) vout_Control( p_vout, VOUT_SNAPSHOT ); } -void AdvControlsWidget::snapshot() +void AdvControlsWidget::frame() { } -void AdvControlsWidget::frame(){} -void AdvControlsWidget::fromAtoB(){} +void AdvControlsWidget::fromAtoB() +{ + if( !timeA ) + { + timeA = var_GetTime( THEMIM->getInput(), "time" ); + ABButton->setText( "A->..." ); + return; + } + if( !timeB ) + { + timeB = var_GetTime( THEMIM->getInput(), "time" ); + var_SetTime( THEMIM->getInput(), "time" , timeA ); + ABButton->setText( "A<=>B" ); + return; + } + timeA = 0; + timeB = 0; + ABButton->setText( "AB" ); +} + void AdvControlsWidget::record(){} +void AdvControlsWidget::AtoBLoop( float f_pos, int i_time, int i_length ) +{ + if( timeB ) + { + if( i_time >= (int)(timeB/1000000) ) + var_SetTime( THEMIM->getInput(), "time" , timeA ); + } +} + /***************************** * DA Control Widget ! *****************************/ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_advControls ) : QFrame( NULL ), p_intf( _p_i ) { - //QSize size( 500, 200 ); - //resize( size ); controlLayout = new QGridLayout( this ); - -#if DEBUG_COLOR - QPalette palette2; - palette2.setColor(this->backgroundRole(), Qt::magenta); - setPalette(palette2); -#endif + controlLayout->setSpacing( 0 ); + setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Minimum ); /** The main Slider **/ slider = new InputSlider( Qt::Horizontal, NULL ); @@ -318,26 +343,26 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_advControls ) : THEMIM->getIM(), sliderUpdate( float ) ); /** Slower and faster Buttons **/ - slowerButton = new QPushButton( "S" ); - BUTTON_SET_ACT( slowerButton, "S", qtr( "Slower" ), slower() ); - controlLayout->addWidget( slowerButton, 0, 0 ); + slowerButton = new QPushButton; + slowerButton->setFlat( true ); slowerButton->setMaximumSize( QSize( 26, 20 ) ); - fasterButton = new QPushButton( "F" ); - BUTTON_SET_ACT( fasterButton, "F", qtr( "Faster" ), faster() ); - controlLayout->addWidget( fasterButton, 0, 17 ); + BUTTON_SET_ACT( slowerButton, "-", qtr( "Slower" ), slower() ); + controlLayout->addWidget( slowerButton, 0, 0 ); + + fasterButton = new QPushButton; + fasterButton->setFlat( true ); fasterButton->setMaximumSize( QSize( 26, 20 ) ); - /** TODO: Insert here the AdvControls Widget - * Then fix all the size issues in main_interface.cpp - **/ + BUTTON_SET_ACT( fasterButton, "+", qtr( "Faster" ), faster() ); + controlLayout->addWidget( fasterButton, 0, 17 ); + /* advanced Controls handling */ b_advancedVisible = b_advControls; advControls = new AdvControlsWidget( p_intf ); - controlLayout->addWidget( advControls, 1, 3, 2, 5, Qt::AlignBottom ); + controlLayout->addWidget( advControls, 1, 3, 2, 4, Qt::AlignBottom ); if( !b_advancedVisible ) advControls->hide(); -//THIS should be removed. need_components_update = true; /** Disc and Menus handling */ discFrame = new QFrame( this ); @@ -379,22 +404,23 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_advControls ) : /** TODO * Telextext QFrame + * Merge with upper menu in a StackLayout **/ /** Play Buttons **/ - QSizePolicy sizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed ); + QSizePolicy sizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); sizePolicy.setHorizontalStretch( 0 ); sizePolicy.setVerticalStretch( 0 ); -// sizePolicy.setHeightForWidth( playButton->sizePolicy().hasHeightForWidth() ); /* Play */ playButton = new QPushButton; playButton->setSizePolicy( sizePolicy ); - playButton->setMaximumSize( QSize( 45, 45 ) ); + playButton->setMaximumSize( QSize( 38, 38 ) ); + playButton->setMinimumSize( QSize( 45, 45 ) ); playButton->setIconSize( QSize( 30, 30 ) ); - controlLayout->addWidget( playButton, 2, 0, 2, 2, Qt::AlignBottom ); - + controlLayout->addWidget( playButton, 2, 0, 2, 2 ); + controlLayout->setColumnMinimumWidth( 2, 20 ); controlLayout->setColumnStretch( 2, 0 ); @@ -432,9 +458,8 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_advControls ) : BUTTON_SET_ACT_I( nextButton, "", next.png, qtr( "Next" ), next() ); BUTTON_SET_ACT_I( stopButton, "", stop.png, qtr( "Stop" ), stop() ); - controlLayout->setColumnStretch( 8 , 10 ); - controlLayout->setColumnStretch( 9, 0 ); - + controlLayout->setColumnStretch( 7 , 2 ); + /* * Other first Line buttons * Might need to be inside a frame to avoid a few resizing pb @@ -449,8 +474,8 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_advControls ) : /** Playlist Button **/ playlistButton = new QPushButton; setupSmallButton( playlistButton ); - controlLayout->addWidget( playlistButton, 3, 11 ); + BUTTON_SET_IMG( playlistButton, "" , playlist.png, qtr( "Show playlist" ) ); /** extended Settings **/ QPushButton *extSettingsButton = new QPushButton( "F" ); @@ -459,44 +484,29 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_advControls ) : setupSmallButton( extSettingsButton ); controlLayout->addWidget( extSettingsButton, 3, 12 ); - /** Preferences **/ - QPushButton *prefsButton = new QPushButton( "P" ); - BUTTON_SET_ACT( prefsButton, "P", qtr( "Preferences / Settings" ), - prefs() ); - setupSmallButton( prefsButton ); - controlLayout->addWidget( prefsButton, 3, 13 ); - controlLayout->setColumnStretch( 14, 5 ); /* Volume */ - VolumeClickHandler *h = new VolumeClickHandler( p_intf, this ); + VolumeClickHandler *hVolLabel = new VolumeClickHandler( p_intf, this ); - QLabel *volMuteLabel = new QLabel; - volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) ); + 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 - * Add a Context menu to change to the most useful % - * **/ - /** 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->setMaximum( 100 ); + volumeSlider = new SoundSlider( this, config_GetInt( p_intf, "qt-volume-complete" ) ); + volumeSlider->setMaximumSize( QSize( 200, 40 ) ); + volumeSlider->setMinimumSize( QSize( 80, 20 ) ); volumeSlider->setFocusPolicy( Qt::NoFocus ); - controlLayout->addWidget( volMuteLabel, 3, 15 ); controlLayout->addWidget( volumeSlider, 3, 16, 1, 2 ); + + /* Set the volume from the config */ + volumeSlider->setValue( (config_GetInt( p_intf, "volume" ) )* VOLUME_MAX / (AOUT_VOLUME_MAX/2) ); /* Volume control connection */ CONNECT( volumeSlider, valueChanged( int ), this, updateVolume( int ) ); - + msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); } ControlsWidget::~ControlsWidget() { @@ -508,9 +518,7 @@ void ControlsWidget::stop() void ControlsWidget::play() { - if( THEPL ) - msg_Dbg( p_intf, "Nothing to play yet, open a file %i", THEPL->items.i_size ); - if( playlist_IsEmpty( THEPL ) ) + if( THEPL->current.i_size == 0 ) { /* The playlist is empty, open a file requester */ THEDP->openFileDialog(); @@ -556,14 +564,18 @@ void ControlsWidget::setNavigation( int navigation ) } static bool b_my_volume; -void ControlsWidget::updateVolume( int sliderVolume ) +void ControlsWidget::updateVolume( int i_sliderVolume ) { if( !b_my_volume ) { - int i_res = sliderVolume * AOUT_VOLUME_MAX / - ( 2*volumeSlider->maximum() ); + int i_res = i_sliderVolume * (AOUT_VOLUME_MAX / 2) / VOLUME_MAX; aout_VolumeSet( p_intf, i_res ); } + if( i_sliderVolume == 0 ) + volMuteLabel->setPixmap( QPixmap(":/pixmaps/volume-muted.png" ) ); + else if( i_sliderVolume < VOLUME_MAX / 2 ) + volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) ); + else volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-high.png" ) ); } void ControlsWidget::updateOnTimer() @@ -571,7 +583,7 @@ void ControlsWidget::updateOnTimer() /* Audio part */ audio_volume_t i_volume; aout_VolumeGet( p_intf, &i_volume ); - i_volume = ( i_volume * 200 )/ AOUT_VOLUME_MAX ; + i_volume = ( i_volume * VOLUME_MAX )/ (AOUT_VOLUME_MAX/2) ; int i_gauge = volumeSlider->value(); b_my_volume = false; if( i_volume - i_gauge > 1 || i_gauge - i_volume > 1 ) @@ -583,7 +595,8 @@ void ControlsWidget::updateOnTimer() /* Activate the interface buttons according to the presence of the input */ enableInput( THEMIM->getIM()->hasInput() ); - enableVideo( THEMIM->getIM()->hasVideo() ); + //enableVideo( THEMIM->getIM()->hasVideo() ); + enableVideo( true ); } void ControlsWidget::setStatus( int status ) @@ -597,26 +610,23 @@ void ControlsWidget::setStatus( int status ) /** * TODO * This functions toggle the fullscreen mode - * If there is no video, it should first activate Visualisations... + * If there is no video, it should first activate Visualisations... * This has also to be fixed in enableVideo() */ void ControlsWidget::fullscreen() { - vlc_object_t *p_vout = (vlc_object_t *)vlc_object_find( p_intf, - VLC_OBJECT_VOUT, FIND_CHILD ); + vout_thread_t *p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout) - var_SetBool( p_vout, "fullscreen", VLC_TRUE ); - //msg_Dbg( p_intf, "Not implemented yet" ); + { + var_SetBool( p_vout, "fullscreen", !var_GetBool( p_vout, "fullscreen" ) ); + vlc_object_release( p_vout ); + } } void ControlsWidget::extSettings() { THEDP->extendedDialog(); } -void ControlsWidget::prefs() -{ - THEDP->prefsDialog(); -} void ControlsWidget::slower() { @@ -639,7 +649,7 @@ void ControlsWidget::enableInput( bool enable ) } void ControlsWidget::enableVideo( bool enable ) -{ +{ // TODO Later make the fullscreenButton toggle Visualisation and so on. fullscreenButton->setEnabled( enable ); @@ -669,8 +679,8 @@ void ControlsWidget::toggleAdvanced() #include "components/playlist/panels.hpp" #include "components/playlist/selector.hpp" -PlaylistWidget::PlaylistWidget( intf_thread_t *_p_intf ) : - p_intf ( _p_intf ) +PlaylistWidget::PlaylistWidget( intf_thread_t *_p_i ) : + p_intf ( _p_i ) { /* Left Part and design */ QWidget *leftW = new QWidget( this ); @@ -728,17 +738,124 @@ void PlaylistWidget::setArt( QString url ) if( url.isNull() ) art->setPixmap( QPixmap( ":/noart.png" ) ); else if( prevArt != url ) + { art->setPixmap( QPixmap( url ) ); - prevArt = url; - emit artSet( url ); + prevArt = url; + emit artSet( url ); + } } PlaylistWidget::~PlaylistWidget() { } -QSize PlaylistWidget::sizeHint() const +/********************************************************************** + * Speed control widget + **********************************************************************/ +SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i ) : + QFrame( NULL ), p_intf( _p_i ) { - return widgetSize; + QSizePolicy sizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed ); + sizePolicy.setHorizontalStretch( 0 ); + sizePolicy.setVerticalStretch( 0 ); + + speedSlider = new QSlider; + speedSlider->setSizePolicy( sizePolicy ); + speedSlider->setMaximumSize( QSize( 80, 200 ) ); + speedSlider->setOrientation( Qt::Vertical ); + speedSlider->setTickPosition( QSlider::TicksRight ); + + speedSlider->setRange( -100, 100 ); + speedSlider->setSingleStep( 10 ); + speedSlider->setPageStep( 20 ); + speedSlider->setTickInterval( 20 ); + + CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) ); + + normalSpeedButton = new QPushButton( "N" ); + normalSpeedButton->setMaximumSize( QSize( 26, 20 ) ); + normalSpeedButton->setFlat( true ); + normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) ); + + CONNECT( normalSpeedButton, clicked(), this, resetRate() ); + + QVBoxLayout *speedControlLayout = new QVBoxLayout; + speedControlLayout->addWidget(speedSlider); + speedControlLayout->addWidget(normalSpeedButton); + setLayout(speedControlLayout); +} + +SpeedControlWidget::~SpeedControlWidget() +{ +} + +#define RATE_SLIDER_MAXIMUM 3.0 +#define RATE_SLIDER_MINIMUM 0.3 +#define RATE_SLIDER_LENGTH 100.0 + +void SpeedControlWidget::updateControls( int rate ) +{ + if( speedSlider->isSliderDown() ) + { + //We don't want to change anything if the user is using the slider + return; + } + + int sliderValue; + double speed = INPUT_RATE_DEFAULT / (double)rate; + + if( rate >= INPUT_RATE_DEFAULT ) + { + if( speed < RATE_SLIDER_MINIMUM ) + { + sliderValue = speedSlider->minimum(); + } + else + { + sliderValue = (int)( ( speed - 1.0 ) * RATE_SLIDER_LENGTH + / ( 1.0 - RATE_SLIDER_MAXIMUM ) ); + } + } + else + { + if( speed > RATE_SLIDER_MAXIMUM ) + { + sliderValue = speedSlider->maximum(); + } + else + { + sliderValue = (int)( ( speed - 1.0 ) * RATE_SLIDER_LENGTH + / ( RATE_SLIDER_MAXIMUM - 1.0 ) ); + } + } + + //Block signals to avoid feedback loop + speedSlider->blockSignals( true ); + speedSlider->setValue( sliderValue ); + speedSlider->blockSignals( false ); } +void SpeedControlWidget::updateRate( int sliderValue ) +{ + int rate; + + if( sliderValue < 0.0 ) + { + rate = INPUT_RATE_DEFAULT* RATE_SLIDER_LENGTH / + ( sliderValue * ( 1.0 - RATE_SLIDER_MINIMUM ) + RATE_SLIDER_LENGTH ) ; + } + else + { + rate = INPUT_RATE_DEFAULT* RATE_SLIDER_LENGTH / + ( sliderValue * ( RATE_SLIDER_MAXIMUM - 1.0 ) + RATE_SLIDER_LENGTH ); + } + + THEMIM->getIM()->setRate(rate); +} + +void SpeedControlWidget::resetRate() +{ + THEMIM->getIM()->setRate(INPUT_RATE_DEFAULT); +} + +