X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Finterface_widgets.cpp;h=f78e9fda278171600e4b39ceefeb8edca6c16466;hb=23916ae45f4e540ef9cf53daf05e0d237570f8d8;hp=4779bd43bef4d4f0fdc2d7e55ef94111d4e62048;hpb=733ac09f085cfdcfb827b578e357fdd2894c5126;p=vlc diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp index 4779bd43be..f78e9fda27 100644 --- a/modules/gui/qt4/components/interface_widgets.cpp +++ b/modules/gui/qt4/components/interface_widgets.cpp @@ -6,6 +6,8 @@ * * Authors: Clément Stenac * Jean-Baptiste Kempf + * Rafaël Carré + * Ilkka Ollakka * * 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 +25,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,8 +42,6 @@ #include #include -#define ICON_SIZE 300 - /********************************************************************** * Video Widget. A simple frame on which video is drawn * This class handles resize issues @@ -55,7 +55,10 @@ 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() ); + hide(); setMinimumSize( 16, 16 ); + + // CONNECT( this, askResize( int, int ), this, SetSizing( int, int ) ); + CONNECT( this, askVideoWidgetToShow(), this, show() ); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); } @@ -84,84 +87,134 @@ QSize VideoWidget::sizeHint() const return widgetSize; } +/** + * Request the video to avoid the conflicts + **/ void *VideoWidget::request( vout_thread_t *p_nvout, int *pi_x, int *pi_y, unsigned int *pi_width, unsigned int *pi_height ) { + emit askVideoWidgetToShow(); if( p_vout ) { msg_Dbg( p_intf, "embedded video already in use" ); return NULL; } p_vout = p_nvout; - emit askResize(); return ( void* )winId(); } -void VideoWidget::SetMinSize() +/* Set the Widget to the correct Size */ +void VideoWidget::SetSizing( unsigned int w, unsigned int h ) { - setMinimumSize( 16, 16 ); + resize( w, h ); + //updateGeometry(); // Needed for deinterlace + msg_Dbg( p_intf, "%i %i", sizeHint().height(), sizeHint().width() ); + emit askResize(); } void VideoWidget::release( void *p_win ) { p_vout = NULL; } + + /********************************************************************** * Background Widget. Show a simple image background. Currently, * it's a static cone. **********************************************************************/ +#define ICON_SIZE 128 +#define MAX_BG_SIZE 400 +#define MIN_BG_SIZE 64 + BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i ) { + /* We should use that one to take the more size it can */ + setSizePolicy( QSizePolicy::Preferred, QSizePolicy::MinimumExpanding ); + /* A dark background */ setAutoFillBackground( true ); plt = palette(); plt.setColor( QPalette::Active, QPalette::Window , Qt::black ); plt.setColor( QPalette::Inactive, QPalette::Window , Qt::black ); setPalette( plt ); - label = new QLabel( "" ); - label->setMaximumHeight( ICON_SIZE ); - label->setMaximumWidth( ICON_SIZE ); + /* A cone in the middle */ + label = new QLabel; label->setScaledContents( true ); + label->setMargin( 5 ); + label->setMaximumHeight( MAX_BG_SIZE ); + label->setMaximumWidth( MAX_BG_SIZE ); + label->setMinimumHeight( MIN_BG_SIZE ); + label->setMinimumWidth( MIN_BG_SIZE ); label->setPixmap( QPixmap( ":/vlc128.png" ) ); - backgroundLayout = new QHBoxLayout; + + QHBoxLayout *backgroundLayout = new QHBoxLayout( this ); backgroundLayout->addWidget( label ); - setLayout( backgroundLayout ); + + resize( 300, 150 ); + updateGeometry(); + CONNECT( THEMIM, inputChanged( input_thread_t *), this, update( input_thread_t * ) ); } BackgroundWidget::~BackgroundWidget() { - backgroundLayout->takeAt( 0 ); - delete backgroundLayout; } -void BackgroundWidget::setArt( QString url ) + +void BackgroundWidget::update( input_thread_t *p_input ) { - if( url.isNull() ) + if( !p_input || p_input->b_dead ) + { + label->setPixmap( QPixmap( ":/vlc128.png" ) ); + return; + } + + + vlc_object_yield( p_input ); + char *psz_arturl = input_item_GetArtURL( input_GetItem(p_input) ); + vlc_object_release( p_input ); + QString url = qfu( psz_arturl ); + QString arturl = url.replace( "file://",QString("" ) ); + if( arturl.isNull() ) label->setPixmap( QPixmap( ":/vlc128.png" ) ); else - label->setPixmap( QPixmap( url ) ); + { + label->setPixmap( QPixmap( arturl ) ); + msg_Dbg( p_intf, "changing input b_need_update done %s", psz_arturl ); + } + free( psz_arturl ); } QSize BackgroundWidget::sizeHint() const { - return widgetSize; + return label->size(); } void BackgroundWidget::resizeEvent( QResizeEvent *e ) { - if( e->size().height() < ICON_SIZE -1 ) + if( e->size().height() < MAX_BG_SIZE -1 ) + { label->setMaximumWidth( e->size().height() ); + label->setMaximumHeight( e->size().width() ); + } else - label->setMaximumWidth( ICON_SIZE ); + { + label->setMaximumHeight( MAX_BG_SIZE ); + label->setMaximumWidth( MAX_BG_SIZE ); + } +} + +void BackgroundWidget::contextMenuEvent( QContextMenuEvent *event ) +{ + QVLCMenu::PopupMenu( p_intf, true ); } /********************************************************************** * Visualization selector panel **********************************************************************/ VisualSelector::VisualSelector( intf_thread_t *_p_i ) : - QFrame( NULL ), p_intf( _p_i ) + QFrame( NULL ), p_intf( _p_i ) { QHBoxLayout *layout = new QHBoxLayout( this ); layout->setMargin( 0 ); @@ -209,108 +262,182 @@ void VisualSelector::next() } /********************************************************************** - * More controls + * TEH controls **********************************************************************/ + +#define setupSmallButton( aButton ){ \ + aButton->setMaximumSize( QSize( 26, 26 ) ); \ + aButton->setMinimumSize( QSize( 26, 26 ) ); \ + aButton->setIconSize( QSize( 20, 20 ) ); } + AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i ) { - QHBoxLayout *layout = new QHBoxLayout( this ); - layout->setMargin( 0 ); - - normalButton = new QPushButton( "N" ); - BUTTON_SET_ACT( normalButton, "N", qtr( "Normal rate" ), normal() ); - layout->addWidget( normalButton ); - normalButton->setMaximumWidth( 35 ); - - - layout->addItem( new QSpacerItem( 100,20, - QSizePolicy::Expanding, QSizePolicy::Minimum ) ); - + QHBoxLayout *advLayout = new QHBoxLayout( this ); + advLayout->setMargin( 0 ); + advLayout->setSpacing( 0 ); + + /* A to B Button */ + ABButton = new QPushButton( "AB" ); + ABButton->setMaximumSize( QSize( 26, 26 ) ); + ABButton->setIconSize( QSize( 20, 20 ) ); + advLayout->addWidget( ABButton ); + BUTTON_SET_ACT( ABButton, "AB", qtr( "A to B" ), fromAtoB() ); + timeA = timeB = 0; + CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), + this, AtoBLoop( float, int, int ) ); + + frameButton = new QPushButton( "Fr" ); + frameButton->setMaximumSize( QSize( 26, 26 ) ); + frameButton->setIconSize( QSize( 20, 20 ) ); + advLayout->addWidget( frameButton ); + BUTTON_SET_ACT( frameButton, "Fr", qtr( "Frame by Frame" ), frame() ); + + recordButton = new QPushButton( "R" ); + recordButton->setMaximumSize( QSize( 26, 26 ) ); + recordButton->setIconSize( QSize( 20, 20 ) ); + advLayout->addWidget( recordButton ); + BUTTON_SET_ACT_I( recordButton, "", record_16px.png, + qtr( "Record" ), record() ); + + /* Snapshot Button */ 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() ); - layout->addWidget( snapshotButton ); - snapshotButton->setMaximumWidth( 35 ); } AdvControlsWidget::~AdvControlsWidget() -{ -} +{} void AdvControlsWidget::enableInput( bool enable ) { -// slowerButton->setEnabled( enable ); - normalButton->setEnabled( enable ); -// fasterButton->setEnabled( enable ); + ABButton->setEnabled( enable ); + recordButton->setEnabled( enable ); } + void AdvControlsWidget::enableVideo( bool enable ) { snapshotButton->setEnabled( enable ); - //fullscreenButton->setEnabled( enable ); + frameButton->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() +/* Function called when the button is clicked() */ +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::fullscreen() +/* Function called regularly when in an AtoB loop */ +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 ); + } } -ControlsWidget::ControlsWidget( intf_thread_t *_p_i ) : - QFrame( NULL ), p_intf( _p_i ) +/* FIXME Record function */ +void AdvControlsWidget::record(){} + +//FIXME Frame by frame function +void AdvControlsWidget::frame(){} + +/***************************** + * DA Control Widget ! + *****************************/ +ControlsWidget::ControlsWidget( intf_thread_t *_p_i, + MainInterface *_p_mi, + bool b_advControls, + bool b_shiny ) : + QFrame( NULL ), p_intf( _p_i ) { - //QSize size( 500, 200 ); - //resize( size ); controlLayout = new QGridLayout( this ); + controlLayout->setSpacing( 0 ); +#if QT43 + controlLayout->setContentsMargins( 9, 6, 9, 6 ); +#else + controlLayout->setMargin( 6 ); +#endif + + setSizePolicy( QSizePolicy::Preferred , QSizePolicy::Maximum ); /** The main Slider **/ slider = new InputSlider( Qt::Horizontal, NULL ); - controlLayout->addWidget( slider, 0, 1, 1, 15 ); + controlLayout->addWidget( slider, 0, 1, 1, 16 ); /* Update the position when the IM has changed */ CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), - slider, setPosition( float,int, int ) ); + slider, setPosition( float, int, int ) ); /* And update the IM, when the position has changed */ CONNECT( slider, sliderDragged( float ), 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, 16 ); + 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 - * and add - A->B button - * - frame by frame - * - record button - * and put the snapshot in the same QFrame - * 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, 4, Qt::AlignBottom ); + if( !b_advancedVisible ) advControls->hide(); + /** Disc and Menus handling */ discFrame = new QFrame( this ); - QHBoxLayout *discLayout = new QHBoxLayout( discFrame ); - QPushButton *menuButton = new QPushButton( discFrame ); - discLayout->addWidget( menuButton ); + QHBoxLayout *discLayout = new QHBoxLayout( discFrame ); + discLayout->setSpacing( 0 ); + discLayout->setMargin( 0 ); - QPushButton *prevSectionButton = new QPushButton( discFrame ); + prevSectionButton = new QPushButton( discFrame ); + setupSmallButton( prevSectionButton ); discLayout->addWidget( prevSectionButton ); - QPushButton *nextSectionButton = new QPushButton( discFrame ); + menuButton = new QPushButton( discFrame ); + setupSmallButton( menuButton ); + discLayout->addWidget( menuButton ); + + nextSectionButton = new QPushButton( discFrame ); + setupSmallButton( nextSectionButton ); discLayout->addWidget( nextSectionButton ); - controlLayout->addWidget( discFrame, 1, 13, 1, 4 ); + controlLayout->addWidget( discFrame, 1, 10, 2, 3, Qt::AlignBottom ); BUTTON_SET_IMG( prevSectionButton, "", previous.png, "" ); BUTTON_SET_IMG( nextSectionButton, "", next.png, "" ); @@ -331,22 +458,26 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i ) : /** 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 */ - QPushButton *playButton = new QPushButton; + playButton = new QPushButton; playButton->setSizePolicy( sizePolicy ); - playButton->setMaximumSize( QSize( 45, 45 ) ); + playButton->setMaximumSize( QSize( 36, 36 ) ); + playButton->setMinimumSize( QSize( 36, 36 ) ); playButton->setIconSize( QSize( 30, 30 ) ); controlLayout->addWidget( playButton, 2, 0, 2, 2 ); + controlLayout->setColumnMinimumWidth( 2, 20 ); + controlLayout->setColumnStretch( 2, 0 ); + /** Prev + Stop + Next Block **/ QHBoxLayout *controlButLayout = new QHBoxLayout; controlButLayout->setSpacing( 0 ); /* Don't remove that, will be useful */ @@ -354,29 +485,26 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i ) : /* Prev */ QPushButton *prevButton = new QPushButton; prevButton->setSizePolicy( sizePolicy ); - prevButton->setMaximumSize( QSize( 26, 26 ) ); - prevButton->setIconSize( QSize( 20, 20 ) ); + setupSmallButton( prevButton ); controlButLayout->addWidget( prevButton ); /* Stop */ QPushButton *stopButton = new QPushButton; stopButton->setSizePolicy( sizePolicy ); - stopButton->setMaximumSize( QSize( 26, 26 ) ); - stopButton->setIconSize( QSize( 20, 20 ) ); + setupSmallButton( stopButton ); controlButLayout->addWidget( stopButton ); /* next */ QPushButton *nextButton = new QPushButton; nextButton->setSizePolicy( sizePolicy ); - nextButton->setMaximumSize( QSize( 26, 26 ) ); - nextButton->setIconSize( QSize( 20, 20 ) ); + setupSmallButton( nextButton ); controlButLayout->addWidget( nextButton ); /* Add this block to the main layout */ - controlLayout->addLayout( controlButLayout, 3, 3, 1, 3 ); + controlLayout->addLayout( controlButLayout, 3, 3, 1, 3, Qt::AlignBottom ); BUTTON_SET_ACT_I( playButton, "", play.png, qtr( "Play" ), play() ); BUTTON_SET_ACT_I( prevButton, "" , previous.png, @@ -384,70 +512,83 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i ) : BUTTON_SET_ACT_I( nextButton, "", next.png, qtr( "Next" ), next() ); BUTTON_SET_ACT_I( stopButton, "", stop.png, qtr( "Stop" ), stop() ); + controlLayout->setColumnMinimumWidth( 7, 20 ); + controlLayout->setColumnStretch( 7, 0 ); + controlLayout->setColumnStretch( 8, 0 ); + controlLayout->setColumnStretch( 9, 0 ); + /* * Other first Line buttons - * Might need to be inside a frame to avoid a few resizing pb - * FIXME */ /** Fullscreen/Visualisation **/ fullscreenButton = new QPushButton( "F" ); BUTTON_SET_ACT( fullscreenButton, "F", qtr( "Fullscreen" ), fullscreen() ); - fullscreenButton->setMaximumSize( QSize( 26, 26 ) ); - controlLayout->addWidget( fullscreenButton, 3, 10 ); + setupSmallButton( fullscreenButton ); + controlLayout->addWidget( fullscreenButton, 3, 10, Qt::AlignBottom ); /** Playlist Button **/ playlistButton = new QPushButton; - playlistButton->setMaximumSize( QSize( 26, 26 ) ); - playlistButton->setIconSize( QSize( 20, 20 ) ); - - controlLayout->addWidget( playlistButton, 3, 11 ); + setupSmallButton( playlistButton ); + controlLayout->addWidget( playlistButton, 3, 11, Qt::AlignBottom ); + BUTTON_SET_IMG( playlistButton, "" , playlist.png, qtr( "Show playlist" ) ); + CONNECT( playlistButton, clicked(), _p_mi, togglePlaylist() ); /** extended Settings **/ QPushButton *extSettingsButton = new QPushButton( "F" ); BUTTON_SET_ACT( extSettingsButton, "Ex", qtr( "Extended Settings" ), extSettings() ); - extSettingsButton->setMaximumSize( QSize( 26, 26 ) ); - controlLayout->addWidget( extSettingsButton, 3, 12 ); + setupSmallButton( extSettingsButton ); + controlLayout->addWidget( extSettingsButton, 3, 12, Qt::AlignBottom ); - /** Preferences **/ - QPushButton *prefsButton = new QPushButton( "P" ); - BUTTON_SET_ACT( prefsButton, "P", qtr( "Preferences / Settings" ), prefs() ); - prefsButton->setMaximumSize( QSize( 26, 26 ) ); - controlLayout->addWidget( prefsButton, 3, 13 ); + controlLayout->setColumnStretch( 13, 0 ); + controlLayout->setColumnMinimumWidth( 13, 24 ); + 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, Qt::AlignBottom ); - volumeSlider->setMaximum( 100 ); + if( b_shiny ) + { + volumeSlider = new SoundSlider( this, + config_GetInt( p_intf, "volume-step" ), + config_GetInt( p_intf, "qt-volume-complete" ) ); + } + else + { + volumeSlider = new QSlider( this ); + volumeSlider->setOrientation( Qt::Horizontal ); + } + volumeSlider->setMaximumSize( QSize( 200, 40 ) ); + volumeSlider->setMinimumSize( QSize( 106, 30 ) ); volumeSlider->setFocusPolicy( Qt::NoFocus ); - controlLayout->addWidget( volMuteLabel, 3, 14 ); - controlLayout->addWidget( volumeSlider, 3, 15, 1, 2 ); + controlLayout->addWidget( volumeSlider, 2, 16, 2 , 2, Qt::AlignBottom ); + + /* Set the volume from the config */ + volumeSlider->setValue( ( config_GetInt( p_intf, "volume" ) ) * + VOLUME_MAX / (AOUT_VOLUME_MAX/2) ); /* Volume control connection */ + //resize( QSize( 300, 60 ) ); CONNECT( volumeSlider, valueChanged( int ), this, updateVolume( int ) ); - + msg_Dbg( p_intf, "controls size: %i - %i", size().width(), size().height() ); } + ControlsWidget::~ControlsWidget() +{} + +/* +QSize ControlsWidget::sizeHint() const { + return QSize( 300, 50 ); } +*/ + void ControlsWidget::stop() { THEMIM->stop(); @@ -455,7 +596,7 @@ void ControlsWidget::stop() void ControlsWidget::play() { - if( playlist_IsEmpty( THEPL ) ) + if( THEPL->current.i_size == 0 ) { /* The playlist is empty, open a file requester */ THEDP->openFileDialog(); @@ -488,16 +629,12 @@ void ControlsWidget::setNavigation( int navigation ) { discFrame->hide(); } else if( navigation == 1 ) { - prevSectionButton->show(); prevSectionButton->setToolTip( qfu( HELP_PCH ) ); - nextSectionButton->show(); nextSectionButton->setToolTip( qfu( HELP_NCH ) ); menuButton->show(); discFrame->show(); } else { - prevSectionButton->show(); prevSectionButton->setToolTip( qfu( HELP_PCH ) ); - nextSectionButton->show(); nextSectionButton->setToolTip( qfu( HELP_NCH ) ); menuButton->hide(); discFrame->show(); @@ -505,21 +642,26 @@ 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() { + /* 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 ) @@ -528,42 +670,42 @@ void ControlsWidget::updateOnTimer() volumeSlider->setValue( i_volume ); b_my_volume = false; } + + /* Activate the interface buttons according to the presence of the input */ + enableInput( THEMIM->getIM()->hasInput() ); + //enableVideo( THEMIM->getIM()->hasVideo() ); + enableVideo( true ); } -/* FIXME */ void ControlsWidget::setStatus( int status ) { - if( status == 1 ) // Playing - { - msg_Dbg( p_intf, "I was here %i", status ); - // playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) ); - } + if( status == PLAYING_S ) // Playing + playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) ); else - { - msg_Dbg( p_intf, "I was here %i", status ); - // playButton->setIcon( QIcon( ":/pixmaps/play.png" ) ); - } + playButton->setIcon( QIcon( ":/pixmaps/play.png" ) ); } /** * 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() { - msg_Dbg( p_intf, "Not implemented yet" ); + 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", !var_GetBool( p_vout, "fullscreen" ) ); + vlc_object_release( p_vout ); + } } void ControlsWidget::extSettings() { THEDP->extendedDialog(); } -void ControlsWidget::prefs() -{ - THEDP->prefsDialog(); -} void ControlsWidget::slower() { @@ -580,91 +722,140 @@ void ControlsWidget::enableInput( bool enable ) slowerButton->setEnabled( enable ); slider->setEnabled( enable ); fasterButton->setEnabled( enable ); + + /* Advanced Buttons too */ + advControls->enableInput( enable ); } void ControlsWidget::enableVideo( bool enable ) { // TODO Later make the fullscreenButton toggle Visualisation and so on. fullscreenButton->setEnabled( enable ); + + /* Advanced Buttons too */ + advControls->enableVideo( enable ); +} + +void ControlsWidget::toggleAdvanced() +{ + if( !VISIBLE( advControls ) ) + { + advControls->show(); + b_advancedVisible = true; + } + else + { + advControls->hide(); + b_advancedVisible = false; + } + emit advancedControlsToggled( b_advancedVisible ); } /********************************************************************** - * Playlist Widget. The embedded playlist + * Speed control widget **********************************************************************/ -#include "components/playlist/panels.hpp" -#include "components/playlist/selector.hpp" - -PlaylistWidget::PlaylistWidget( intf_thread_t *_p_intf ) : - p_intf ( _p_intf ) +SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i ) : + QFrame( NULL ), p_intf( _p_i ) { - /* Left Part and design */ - QWidget *leftW = new QWidget( this ); - QVBoxLayout *left = new QVBoxLayout( leftW ); + QSizePolicy sizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed ); + sizePolicy.setHorizontalStretch( 0 ); + sizePolicy.setVerticalStretch( 0 ); - /* Source Selector */ - selector = new PLSelector( this, p_intf, THEPL ); - left->addWidget( selector ); + speedSlider = new QSlider; + speedSlider->setSizePolicy( sizePolicy ); + speedSlider->setMaximumSize( QSize( 80, 200 ) ); + speedSlider->setOrientation( Qt::Vertical ); + speedSlider->setTickPosition( QSlider::TicksRight ); - /* Art label */ - art = new QLabel( "" ); - art->setMinimumHeight( 128 ); - art->setMinimumWidth( 128 ); - art->setMaximumHeight( 128 ); - art->setMaximumWidth( 128 ); - art->setScaledContents( true ); - art->setPixmap( QPixmap( ":/noart.png" ) ); - left->addWidget( art ); + speedSlider->setRange( -100, 100 ); + speedSlider->setSingleStep( 10 ); + speedSlider->setPageStep( 20 ); + speedSlider->setTickInterval( 20 ); - /* Initialisation of the playlist */ - playlist_item_t *p_root = playlist_GetPreferredNode( THEPL, - THEPL->p_local_category ); + CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) ); - rightPanel = qobject_cast( new StandardPLPanel( this, - p_intf, THEPL, p_root ) ); + normalSpeedButton = new QPushButton( "N" ); + normalSpeedButton->setMaximumSize( QSize( 26, 20 ) ); + normalSpeedButton->setFlat( true ); + normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) ); - /* Connects */ - CONNECT( selector, activated( int ), rightPanel, setRoot( int ) ); + CONNECT( normalSpeedButton, clicked(), this, resetRate() ); - CONNECT( qobject_cast( rightPanel )->model, - artSet( QString ) , this, setArt( QString ) ); - /* Forward removal requests from the selector to the main panel */ - CONNECT( qobject_cast( selector )->model, - shouldRemove( int ), - qobject_cast( rightPanel ), removeItem( int ) ); + QVBoxLayout *speedControlLayout = new QVBoxLayout; + speedControlLayout->addWidget(speedSlider); + speedControlLayout->addWidget(normalSpeedButton); + setLayout(speedControlLayout); +} - connect( selector, SIGNAL( activated( int ) ), - this, SIGNAL( rootChanged( int ) ) ); - emit rootChanged( p_root->i_id ); +SpeedControlWidget::~SpeedControlWidget() +{} - /* Add the two sides of the QSplitter */ - addWidget( leftW ); - addWidget( rightPanel ); +#define RATE_SLIDER_MAXIMUM 3.0 +#define RATE_SLIDER_MINIMUM 0.3 +#define RATE_SLIDER_LENGTH 100.0 - leftW->setMaximumWidth( 250 ); - setCollapsible( 1, false ); +void SpeedControlWidget::updateControls( int rate ) +{ + if( speedSlider->isSliderDown() ) + { + //We don't want to change anything if the user is using the slider + return; + } - QList sizeList; - sizeList << 180 << 520 ; - setSizes( sizeList ); -} + int sliderValue; + double speed = INPUT_RATE_DEFAULT / (double)rate; -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 ); + 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 ); } -PlaylistWidget::~PlaylistWidget() +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); } -QSize PlaylistWidget::sizeHint() const +void SpeedControlWidget::resetRate() { - return widgetSize; + THEMIM->getIM()->setRate(INPUT_RATE_DEFAULT); } -