X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Finterface_widgets.cpp;h=5da79af8b216a4138444890ace1668ac8c07db51;hb=7692ffe0ad8baebd01487e06495942e9f853df5f;hp=56987d123b43487a8a74cfa4085b1339e5eeb000;hpb=9ba4d0ff87e47d06ed1242bf3d4a36ac468aa3fc;p=vlc diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp index 56987d123b..5da79af8b2 100644 --- a/modules/gui/qt4/components/interface_widgets.cpp +++ b/modules/gui/qt4/components/interface_widgets.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * interface_widgets.cpp : Custom widgets for the main interface **************************************************************************** - * Copyright ( C ) 2006 the VideoLAN team + * Copyright (C) 2006-2008 the VideoLAN team * $Id$ * * Authors: Clément Stenac @@ -28,26 +28,19 @@ # include "config.h" #endif -#include - -#include "dialogs_provider.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 "menus.hpp" /* Popup menu on bgWidget */ + +#include #include -#include -#include -#include #include -#include -#include #include #include #include +#include +#include #ifdef Q_WS_X11 # include @@ -56,8 +49,6 @@ #include -#define I_PLAY_TOOLTIP N_("Play\nIf the playlist is empty, open a media") - /********************************************************************** * Video Widget. A simple frame on which video is drawn * This class handles resize issues @@ -66,14 +57,14 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i ) { /* Init */ - i_vout = 0; + p_vout = NULL; videoSize.rwidth() = -1; videoSize.rheight() = -1; hide(); /* Set the policy to expand in both directions */ - setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); +// setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); /* Black background is more coherent for a Video Widget */ QPalette plt = palette(); @@ -85,17 +76,6 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i ) Widgets with this attribute set do not participate in composition management */ setAttribute( Qt::WA_PaintOnScreen, true ); - - /* The core can ask through a callback to show the video. */ -#if HAS_QT43 - connect( this, SIGNAL(askVideoWidgetToShow( unsigned int, unsigned int)), - this, SLOT(SetSizing(unsigned int, unsigned int )), - Qt::BlockingQueuedConnection ); -#else -#warning This is broken. Fix it with a QEventLoop with a processEvents () - connect( this, SIGNAL(askVideoWidgetToShow( unsigned int, unsigned int)), - this, SLOT(SetSizing(unsigned int, unsigned int )) ); -#endif } void VideoWidget::paintEvent(QPaintEvent *ev) @@ -106,56 +86,55 @@ void VideoWidget::paintEvent(QPaintEvent *ev) #endif } -/* Kill the vout at Destruction */ VideoWidget::~VideoWidget() { - vout_thread_t *p_vout = i_vout ? - (vout_thread_t *)vlc_object_get( i_vout ) : NULL; - - if( p_vout ) - { - if( vout_Control( p_vout, VOUT_CLOSE ) != VLC_SUCCESS ) - vout_Control( p_vout, VOUT_REPARENT ); - vlc_object_release( p_vout ); - } + /* Ensure we are not leaking the video output. This would crash. */ + assert( !p_vout ); } /** * 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 ) +WId VideoWidget::request( vout_thread_t *p_nvout, int *pi_x, int *pi_y, + unsigned int *pi_width, unsigned int *pi_height, + bool b_keep_size ) { msg_Dbg( p_intf, "Video was requested %i, %i", *pi_x, *pi_y ); - emit askVideoWidgetToShow( *pi_width, *pi_height ); - if( i_vout ) + + if( b_keep_size ) + { + *pi_width = size().width(); + *pi_height = size().height(); + } + + if( p_vout ) { msg_Dbg( p_intf, "embedded video already in use" ); return NULL; } - i_vout = p_nvout->i_object_id; + p_vout = p_nvout; #ifndef NDEBUG - msg_Dbg( p_intf, "embedded video ready (handle %p)", winId() ); + msg_Dbg( p_intf, "embedded video ready (handle %p)", (void *)winId() ); #endif - return ( void* )winId(); + return winId(); } /* Set the Widget to the correct Size */ /* Function has to be called by the parent - Parent has to care about resizing himself*/ + Parent has to care about resizing itself */ void VideoWidget::SetSizing( unsigned int w, unsigned int h ) { msg_Dbg( p_intf, "Video is resizing to: %i %i", w, h ); videoSize.rwidth() = w; videoSize.rheight() = h; - if( isHidden() ) show(); + if( !isVisible() ) show(); updateGeometry(); // Needed for deinterlace } -void VideoWidget::release( void *p_win ) +void VideoWidget::release( void ) { msg_Dbg( p_intf, "Video is not needed anymore" ); - i_vout = 0; + p_vout = NULL; videoSize.rwidth() = 0; videoSize.rheight() = 0; updateGeometry(); @@ -205,7 +184,8 @@ BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) backgroundLayout->setColumnStretch( 0, 1 ); backgroundLayout->setColumnStretch( 2, 1 ); - CONNECT( THEMIM->getIM(), artChanged( QString ), this, updateArt( QString ) ); + CONNECT( THEMIM->getIM(), artChanged( QString ), + this, updateArt( const QString& ) ); } BackgroundWidget::~BackgroundWidget() @@ -219,7 +199,7 @@ void BackgroundWidget::resizeEvent( QResizeEvent * event ) label->show(); } -void BackgroundWidget::updateArt( QString url ) +void BackgroundWidget::updateArt( const QString& url ) { if( url.isEmpty() ) { @@ -227,7 +207,6 @@ void BackgroundWidget::updateArt( QString url ) label->setPixmap( QPixmap( ":/vlc128-christmas.png" ) ); else label->setPixmap( QPixmap( ":/vlc128.png" ) ); - return; } else { @@ -238,9 +217,13 @@ void BackgroundWidget::updateArt( QString url ) void BackgroundWidget::contextMenuEvent( QContextMenuEvent *event ) { QVLCMenu::PopupMenu( p_intf, true ); + event->accept(); } #if 0 +#include +#include + /********************************************************************** * Visualization selector panel **********************************************************************/ @@ -291,1145 +274,228 @@ void VisualSelector::next() } #endif -/********************************************************************** - * TEH controls - **********************************************************************/ - -#define setupSmallButton( aButton ){ \ - aButton->setMaximumSize( QSize( 26, 26 ) ); \ - aButton->setMinimumSize( QSize( 26, 26 ) ); \ - aButton->setIconSize( QSize( 20, 20 ) ); } - -/* init static variables in advanced controls */ -mtime_t AdvControlsWidget::timeA = 0; -mtime_t AdvControlsWidget::timeB = 0; - -AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i, bool b_fsCreation = false ) : - QFrame( NULL ), p_intf( _p_i ) -{ - QHBoxLayout *advLayout = new QHBoxLayout( this ); - advLayout->setMargin( 0 ); - advLayout->setSpacing( 0 ); - advLayout->setAlignment( Qt::AlignBottom ); - - /* A to B Button */ - ABButton = new QPushButton; - setupSmallButton( ABButton ); - advLayout->addWidget( ABButton ); - BUTTON_SET_ACT_I( ABButton, "", atob_nob, - qtr( "Loop from point A to point B continuously.\nClick to set point A" ), - fromAtoB() ); - timeA = timeB = 0; - i_last_input_id = 0; - /* in FS controller we skip this, because we dont want to have it double - controlled */ - if( !b_fsCreation ) - CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), - this, AtoBLoop( float, int, int ) ); - /* set up synchronization between main controller and fs controller */ - CONNECT( THEMIM->getIM(), advControlsSetIcon(), this, setIcon() ); - connect( this, SIGNAL( timeChanged() ), - THEMIM->getIM(), SIGNAL( advControlsSetIcon())); -#if 0 - 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() ); -#endif - - /* Record Button */ - recordButton = new QPushButton; - setupSmallButton( recordButton ); - advLayout->addWidget( recordButton ); - BUTTON_SET_ACT_I( recordButton, "", record, - qtr( "Record" ), record() ); - - /* Snapshot Button */ - snapshotButton = new QPushButton; - setupSmallButton( snapshotButton ); - advLayout->addWidget( snapshotButton ); - BUTTON_SET_ACT_I( snapshotButton, "", snapshot, - qtr( "Take a snapshot" ), snapshot() ); -} - -AdvControlsWidget::~AdvControlsWidget() -{} - -void AdvControlsWidget::enableInput( bool enable ) +SpeedLabel::SpeedLabel( intf_thread_t *_p_intf, const QString& text, + QWidget *parent ) + : QLabel( text, parent ), p_intf( _p_intf ) { - int i_input_id = 0; - if( THEMIM->getInput() != NULL ) - { - input_item_t *p_item = input_GetItem( THEMIM->getInput() ); - i_input_id = p_item->i_id; - - recordButton->setVisible( var_GetBool( THEMIM->getInput(), "can-record" ) ); - } - else - { - recordButton->setVisible( false ); - } + setToolTip( qtr( "Current playback speed.\nClick to adjust" ) ); - ABButton->setEnabled( enable ); - recordButton->setEnabled( enable ); + /* Create the Speed Control Widget */ + speedControl = new SpeedControlWidget( p_intf, this ); + speedControlMenu = new QMenu( this ); - if( enable && ( i_last_input_id != i_input_id ) ) - { - timeA = timeB = 0; - i_last_input_id = i_input_id; - emit timeChanged(); - } -} + QWidgetAction *widgetAction = new QWidgetAction( speedControl ); + widgetAction->setDefaultWidget( speedControl ); + speedControlMenu->addAction( widgetAction ); -void AdvControlsWidget::enableVideo( bool enable ) -{ - snapshotButton->setEnabled( enable ); -#if 0 - frameButton->setEnabled( enable ); -#endif -} + /* Change the SpeedRate in the Status Bar */ + CONNECT( THEMIM->getIM(), rateChanged( int ), this, setRate( int ) ); -void AdvControlsWidget::snapshot() -{ - 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 ); -} + CONNECT( THEMIM, inputChanged( input_thread_t * ), + speedControl, activateOnState() ); -/* Function called when the button is clicked() */ -void AdvControlsWidget::fromAtoB() -{ - if( !timeA ) - { - timeA = var_GetTime( THEMIM->getInput(), "time" ); - emit timeChanged(); - return; - } - if( !timeB ) - { - timeB = var_GetTime( THEMIM->getInput(), "time" ); - var_SetTime( THEMIM->getInput(), "time" , timeA ); - emit timeChanged(); - return; - } - timeA = 0; - timeB = 0; - emit timeChanged(); } - -/* setting/synchro icons after click on main or fs controller */ -void AdvControlsWidget::setIcon() +SpeedLabel::~SpeedLabel() { - if( !timeA && !timeB) - { - ABButton->setIcon( QIcon( ":/atob_nob" ) ); - ABButton->setToolTip( qtr( "Loop from point A to point B continuously\nClick to set point A" ) ); - } - else if( timeA && !timeB ) - { - ABButton->setIcon( QIcon( ":/atob_noa" ) ); - ABButton->setToolTip( qtr( "Click to set point B" ) ); - } - else if( timeA && timeB ) - { - ABButton->setIcon( QIcon( ":/atob" ) ); - ABButton->setToolTip( qtr( "Stop the A to B loop" ) ); - } + delete speedControl; + delete speedControlMenu; } - -/* Function called regularly when in an AtoB loop */ -void AdvControlsWidget::AtoBLoop( float f_pos, int i_time, int i_length ) +/**************************************************************************** + * Small right-click menu for rate control + ****************************************************************************/ +void SpeedLabel::showSpeedMenu( QPoint pos ) { - if( timeB ) - { - if( ( i_time >= (int)( timeB/1000000 ) ) - || ( i_time < (int)( timeA/1000000 ) ) ) - var_SetTime( THEMIM->getInput(), "time" , timeA ); - } + speedControlMenu->exec( QCursor::pos() - pos + + QPoint( 0, height() ) ); } -void AdvControlsWidget::record() +void SpeedLabel::setRate( int rate ) { - input_thread_t *p_input = THEMIM->getInput(); - if( p_input ) - { - /* This method won't work fine if the stream can't be cut anywhere */ - const bool b_recording = var_GetBool( p_input, "record" ); - var_SetBool( p_input, "record", !b_recording ); -#if 0 - else - { - /* 'record' access-filter is not loaded, we open Save dialog */ - input_item_t *p_item = input_GetItem( p_input ); - if( !p_item ) - return; - - char *psz = input_item_GetURI( p_item ); - if( psz ) - THEDP->streamingDialog( NULL, psz, true ); - } -#endif - } + QString str; + str.setNum( ( 1000 / (double)rate ), 'f', 2 ); + str.append( "x" ); + setText( str ); + setToolTip( str ); + speedControl->updateControls( rate ); } -#if 0 -//FIXME Frame by frame function -void AdvControlsWidget::frame(){} -#endif - -/***************************** - * DA Control Widget ! - *****************************/ -ControlsWidget::ControlsWidget( intf_thread_t *_p_i, - MainInterface *_p_mi, - bool b_advControls, - bool b_shiny, - bool b_fsCreation) : - QFrame( _p_mi ), p_intf( _p_i ) +/********************************************************************** + * Speed control widget + **********************************************************************/ +SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i, QWidget *_parent ) + : QFrame( _parent ), p_intf( _p_i ) { - setSizePolicy( QSizePolicy::Preferred , QSizePolicy::Maximum ); - - /** The main Slider **/ - slider = new InputSlider( Qt::Horizontal, NULL ); - /* Update the position when the IM has changed */ - CONNECT( THEMIM->getIM(), positionUpdated( 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 QToolButton; - slowerButton->setAutoRaise( true ); - slowerButton->setMaximumSize( QSize( 26, 20 ) ); - - BUTTON_SET_ACT( slowerButton, "-", qtr( "Slower" ), slower() ); - - fasterButton = new QToolButton; - fasterButton->setAutoRaise( true ); - fasterButton->setMaximumSize( QSize( 26, 20 ) ); - - BUTTON_SET_ACT( fasterButton, "+", qtr( "Faster" ), faster() ); - - /* advanced Controls handling */ - b_advancedVisible = b_advControls; - - advControls = new AdvControlsWidget( p_intf, b_fsCreation ); - if( !b_advancedVisible ) advControls->hide(); - - /** Disc and Menus handling */ - discFrame = new QWidget( this ); - - QHBoxLayout *discLayout = new QHBoxLayout( discFrame ); - discLayout->setSpacing( 0 ); - discLayout->setMargin( 0 ); - - prevSectionButton = new QPushButton( discFrame ); - setupSmallButton( prevSectionButton ); - discLayout->addWidget( prevSectionButton ); - - menuButton = new QPushButton( discFrame ); - setupSmallButton( menuButton ); - discLayout->addWidget( menuButton ); - - nextSectionButton = new QPushButton( discFrame ); - setupSmallButton( nextSectionButton ); - discLayout->addWidget( nextSectionButton ); - - BUTTON_SET_IMG( prevSectionButton, "", dvd_prev, "" ); - BUTTON_SET_IMG( nextSectionButton, "", dvd_next, "" ); - BUTTON_SET_IMG( menuButton, "", dvd_menu, qtr( "Menu" ) ); - - discFrame->hide(); - - /* Change the navigation button display when the IM navigation changes */ - CONNECT( THEMIM->getIM(), navigationChanged( int ), - this, setNavigation( int ) ); - /* Changes the IM navigation when triggered on the nav buttons */ - CONNECT( prevSectionButton, clicked(), THEMIM->getIM(), - sectionPrev() ); - CONNECT( nextSectionButton, clicked(), THEMIM->getIM(), - sectionNext() ); - CONNECT( menuButton, clicked(), THEMIM->getIM(), - sectionMenu() ); - - /** - * Telextext QFrame - * TODO: Merge with upper menu in a StackLayout - **/ - telexFrame = new QWidget( this ); - QHBoxLayout *telexLayout = new QHBoxLayout( telexFrame ); - telexLayout->setSpacing( 0 ); - telexLayout->setMargin( 0 ); - - telexOn = new QPushButton; - setupSmallButton( telexOn ); - telexLayout->addWidget( telexOn ); - - telexTransparent = new QPushButton; - setupSmallButton( telexTransparent ); - telexLayout->addWidget( telexTransparent ); - b_telexTransparent = false; - - telexPage = new QSpinBox; - telexPage->setRange( 0, 999 ); - telexPage->setValue( 100 ); - telexPage->setAccelerated( true ); - telexPage->setWrapping( true ); - telexPage->setAlignment( Qt::AlignRight ); - telexPage->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Minimum ); - telexLayout->addWidget( telexPage ); - - telexFrame->hide(); /* default hidden */ - - CONNECT( telexPage, valueChanged( int ), THEMIM->getIM(), - telexGotoPage( int ) ); - CONNECT( THEMIM->getIM(), setNewTelexPage( int ), - telexPage, setValue( int ) ); - - BUTTON_SET_IMG( telexOn, "", tv, qtr( "Teletext on" ) ); - - CONNECT( telexOn, clicked(), THEMIM->getIM(), - telexToggleButtons() ); - CONNECT( telexOn, clicked( bool ), THEMIM->getIM(), - telexToggle( bool ) ); - CONNECT( THEMIM->getIM(), toggleTelexButtons(), - this, toggleTeletext() ); - b_telexEnabled = false; - telexTransparent->setEnabled( false ); - telexPage->setEnabled( false ); - - BUTTON_SET_IMG( telexTransparent, "", tvtelx, qtr( "Teletext" ) ); - CONNECT( telexTransparent, clicked( bool ), - THEMIM->getIM(), telexSetTransparency() ); - CONNECT( THEMIM->getIM(), toggleTelexTransparency(), - this, toggleTeletextTransparency() ); - CONNECT( THEMIM->getIM(), teletextEnabled( bool ), - this, enableTeletext( bool ) ); - - /** Play Buttons **/ - QSizePolicy sizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); + QSizePolicy sizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed ); sizePolicy.setHorizontalStretch( 0 ); sizePolicy.setVerticalStretch( 0 ); - /* Play */ - playButton = new QPushButton; - playButton->setSizePolicy( sizePolicy ); - playButton->setMaximumSize( QSize( 36, 36 ) ); - playButton->setMinimumSize( QSize( 36, 36 ) ); - playButton->setIconSize( QSize( 30, 30 ) ); - - - /** Prev + Stop + Next Block **/ - controlButLayout = new QHBoxLayout; - controlButLayout->setSpacing( 0 ); /* Don't remove that, will be useful */ - - /* Prev */ - QPushButton *prevButton = new QPushButton; - prevButton->setSizePolicy( sizePolicy ); - setupSmallButton( prevButton ); - - controlButLayout->addWidget( prevButton ); - - /* Stop */ - QPushButton *stopButton = new QPushButton; - stopButton->setSizePolicy( sizePolicy ); - setupSmallButton( stopButton ); - - controlButLayout->addWidget( stopButton ); - - /* next */ - QPushButton *nextButton = new QPushButton; - nextButton->setSizePolicy( sizePolicy ); - setupSmallButton( nextButton ); - - controlButLayout->addWidget( nextButton ); - - /* Add this block to the main layout */ - - BUTTON_SET_ACT_I( playButton, "", play_b, qtr( I_PLAY_TOOLTIP ), play() ); - BUTTON_SET_ACT_I( prevButton, "" , previous_b, - qtr( "Previous media in the playlist" ), prev() ); - BUTTON_SET_ACT_I( nextButton, "", next_b, - qtr( "Next media in the playlist" ), next() ); - BUTTON_SET_ACT_I( stopButton, "", stop_b, qtr( "Stop playback" ), stop() ); - - /* - * Other first Line buttons - */ - /** Fullscreen/Visualisation **/ - fullscreenButton = new QPushButton; - BUTTON_SET_ACT_I( fullscreenButton, "", fullscreen, - qtr( "Toggle the video in fullscreen" ), fullscreen() ); - setupSmallButton( fullscreenButton ); - - if( !b_fsCreation ) - { - /** Playlist Button **/ - playlistButton = new QPushButton; - setupSmallButton( playlistButton ); - BUTTON_SET_IMG( playlistButton, "" , playlist, qtr( "Show playlist" ) ); - CONNECT( playlistButton, clicked(), _p_mi, togglePlaylist() ); - - /** extended Settings **/ - extSettingsButton = new QPushButton; - BUTTON_SET_ACT_I( extSettingsButton, "", extended, - qtr( "Show extended settings" ), extSettings() ); - setupSmallButton( extSettingsButton ); - } - - /* Volume */ - hVolLabel = new VolumeClickHandler( p_intf, this ); - - volMuteLabel = new QLabel; - volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) ); - volMuteLabel->installEventFilter( hVolLabel ); - - if( b_shiny ) - { - volumeSlider = new SoundSlider( this, - config_GetInt( p_intf, "volume-step" ), - config_GetInt( p_intf, "qt-volume-complete" ), - config_GetPsz( p_intf, "qt-slider-colours" ) ); - } - else - { - volumeSlider = new QSlider( this ); - volumeSlider->setOrientation( Qt::Horizontal ); - } - volumeSlider->setMaximumSize( QSize( 200, 40 ) ); - volumeSlider->setMinimumSize( QSize( 85, 30 ) ); - volumeSlider->setFocusPolicy( Qt::NoFocus ); - - /* Set the volume from the config */ - volumeSlider->setValue( ( config_GetInt( p_intf, "volume" ) ) * - VOLUME_MAX / (AOUT_VOLUME_MAX/2) ); - - /* Force the update at build time in order to have a muted icon if needed */ - updateVolume( volumeSlider->value() ); - - /* Volume control connection */ - CONNECT( volumeSlider, valueChanged( int ), this, updateVolume( int ) ); - CONNECT( THEMIM, volumeChanged( void ), this, updateVolume( void ) ); - - if( !b_fsCreation ) - { - controlLayout = new QGridLayout( this ); - - controlLayout->setSpacing( 0 ); - controlLayout->setLayoutMargins( 7, 5, 7, 3, 6 ); - - controlLayout->addWidget( slider, 0, 1, 1, 18 ); - controlLayout->addWidget( slowerButton, 0, 0 ); - controlLayout->addWidget( fasterButton, 0, 19 ); - - controlLayout->addWidget( discFrame, 1, 8, 2, 3, Qt::AlignBottom ); - controlLayout->addWidget( telexFrame, 1, 8, 2, 5, Qt::AlignBottom ); - - controlLayout->addWidget( playButton, 2, 0, 2, 2, Qt::AlignBottom ); - controlLayout->setColumnMinimumWidth( 2, 10 ); - controlLayout->setColumnStretch( 2, 0 ); - - controlLayout->addLayout( controlButLayout, 3, 3, 1, 3, Qt::AlignBottom ); - /* Column 6 is unused */ - controlLayout->setColumnStretch( 6, 0 ); - controlLayout->setColumnStretch( 7, 0 ); - controlLayout->setColumnMinimumWidth( 7, 10 ); - - controlLayout->addWidget( fullscreenButton, 3, 8, Qt::AlignBottom ); - controlLayout->addWidget( playlistButton, 3, 9, Qt::AlignBottom ); - controlLayout->addWidget( extSettingsButton, 3, 10, Qt::AlignBottom ); - controlLayout->setColumnStretch( 11, 0 ); /* telex alignment */ - - controlLayout->setColumnStretch( 12, 0 ); - controlLayout->setColumnMinimumWidth( 12, 10 ); - - controlLayout->addWidget( advControls, 3, 13, 1, 3, Qt::AlignBottom ); - - controlLayout->setColumnStretch( 16, 10 ); - controlLayout->setColumnMinimumWidth( 16, 10 ); - - controlLayout->addWidget( volMuteLabel, 3, 17, Qt::AlignBottom ); - controlLayout->addWidget( volumeSlider, 3, 18, 1 , 2, Qt::AlignBottom ); - } - - updateInput(); -} - -ControlsWidget::~ControlsWidget() -{} - -void ControlsWidget::toggleTeletext() -{ - bool b_enabled = THEMIM->teletextState(); - if( b_telexEnabled ) - { - telexTransparent->setEnabled( false ); - telexPage->setEnabled( false ); - b_telexEnabled = false; - } - else if( b_enabled ) - { - telexTransparent->setEnabled( true ); - telexPage->setEnabled( true ); - b_telexEnabled = true; - } -} - -void ControlsWidget::enableTeletext( bool b_enable ) -{ - telexFrame->setVisible( b_enable ); - bool b_on = THEMIM->teletextState(); + speedSlider = new QSlider( this ); + speedSlider->setSizePolicy( sizePolicy ); + speedSlider->setMaximumSize( QSize( 80, 200 ) ); + speedSlider->setOrientation( Qt::Vertical ); + speedSlider->setTickPosition( QSlider::TicksRight ); - telexOn->setChecked( b_on ); - telexTransparent->setEnabled( b_on ); - telexPage->setEnabled( b_on ); - b_telexEnabled = b_on; -} + speedSlider->setRange( -34, 34 ); + speedSlider->setSingleStep( 1 ); + speedSlider->setPageStep( 1 ); + speedSlider->setTickInterval( 17 ); -void ControlsWidget::toggleTeletextTransparency() -{ - if( b_telexTransparent ) - { - telexTransparent->setIcon( QIcon( ":/tvtelx" ) ); - telexTransparent->setToolTip( qtr( "Teletext" ) ); - b_telexTransparent = false; - } - else - { - telexTransparent->setIcon( QIcon( ":/tvtelx-transparent" ) ); - telexTransparent->setToolTip( qtr( "Transparent" ) ); - b_telexTransparent = true; - } -} + CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) ); -void ControlsWidget::stop() -{ - THEMIM->stop(); -} + QToolButton *normalSpeedButton = new QToolButton( this ); + normalSpeedButton->setMaximumSize( QSize( 26, 20 ) ); + normalSpeedButton->setAutoRaise( true ); + normalSpeedButton->setText( "1x" ); + normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) ); -void ControlsWidget::play() -{ - if( THEPL->current.i_size == 0 ) - { - /* The playlist is empty, open a file requester */ - THEDP->openFileDialog(); - setStatus( 0 ); - return; - } - THEMIM->togglePlayPause(); -} + CONNECT( normalSpeedButton, clicked(), this, resetRate() ); -void ControlsWidget::prev() -{ - THEMIM->prev(); -} + QVBoxLayout *speedControlLayout = new QVBoxLayout( this ); + speedControlLayout->setLayoutMargins( 4, 4, 4, 4, 4 ); + speedControlLayout->setSpacing( 4 ); + speedControlLayout->addWidget( speedSlider ); + speedControlLayout->addWidget( normalSpeedButton ); -void ControlsWidget::next() -{ - THEMIM->next(); + activateOnState(); } -void ControlsWidget::setNavigation( int navigation ) +void SpeedControlWidget::activateOnState() { -#define HELP_PCH N_( "Previous chapter" ) -#define HELP_NCH N_( "Next chapter" ) - - // 1 = chapter, 2 = title, 0 = no - if( navigation == 0 ) - { - discFrame->hide(); - } else if( navigation == 1 ) { - prevSectionButton->setToolTip( qtr( HELP_PCH ) ); - nextSectionButton->setToolTip( qtr( HELP_NCH ) ); - menuButton->show(); - discFrame->show(); - } else { - prevSectionButton->setToolTip( qtr( HELP_PCH ) ); - nextSectionButton->setToolTip( qtr( HELP_NCH ) ); - menuButton->hide(); - discFrame->show(); - } + speedSlider->setEnabled( THEMIM->getIM()->hasInput() ); } -static bool b_my_volume; -void ControlsWidget::updateVolume( int i_sliderVolume ) +void SpeedControlWidget::updateControls( int rate ) { - if( !b_my_volume ) - { - int i_res = i_sliderVolume * (AOUT_VOLUME_MAX / 2) / VOLUME_MAX; - aout_VolumeSet( p_intf, i_res ); - } - if( i_sliderVolume == 0 ) + if( speedSlider->isSliderDown() ) { - volMuteLabel->setPixmap( QPixmap(":/volume-muted" ) ); - volMuteLabel->setToolTip( qtr( "Unmute" ) ); + //We don't want to change anything if the user is using the slider return; } - if( i_sliderVolume < VOLUME_MAX / 3 ) - volMuteLabel->setPixmap( QPixmap( ":/volume-low" ) ); - else if( i_sliderVolume > (VOLUME_MAX * 2 / 3 ) ) - volMuteLabel->setPixmap( QPixmap( ":/volume-high" ) ); - else volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) ); - volMuteLabel->setToolTip( qtr( "Mute" ) ); -} - -void ControlsWidget::updateVolume() -{ - /* Audio part */ - audio_volume_t i_volume; - aout_VolumeGet( p_intf, &i_volume ); - 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 ) - { - b_my_volume = true; - volumeSlider->setValue( i_volume ); - b_my_volume = false; - } -} - -void ControlsWidget::updateInput() -{ - /* Activate the interface buttons according to the presence of the input */ - enableInput( THEMIM->getIM()->hasInput() ); - enableVideo( THEMIM->getIM()->hasVideo() && THEMIM->getIM()->hasInput() ); -} + double value = 17 * log( (double)INPUT_RATE_DEFAULT / rate ) / log( 2 ); + int sliderValue = (int) ( ( value > 0 ) ? value + .5 : value - .5 ); -void ControlsWidget::setStatus( int status ) -{ - if( status == PLAYING_S ) /* Playing */ - { - playButton->setIcon( QIcon( ":/pause_b" ) ); - playButton->setToolTip( qtr( "Pause the playback" ) ); - } - else + if( sliderValue < speedSlider->minimum() ) { - playButton->setIcon( QIcon( ":/play_b" ) ); - playButton->setToolTip( qtr( I_PLAY_TOOLTIP ) ); + sliderValue = speedSlider->minimum(); } -} - -/** - * TODO - * This functions toggle the fullscreen mode - * If there is no video, it should first activate Visualisations... - * This has also to be fixed in enableVideo() - */ -void ControlsWidget::fullscreen() -{ - vout_thread_t *p_vout = - (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - if( p_vout) + else if( sliderValue > speedSlider->maximum() ) { - var_SetBool( p_vout, "fullscreen", !var_GetBool( p_vout, "fullscreen" ) ); - vlc_object_release( p_vout ); + sliderValue = speedSlider->maximum(); } -} - -void ControlsWidget::extSettings() -{ - THEDP->extendedDialog(); -} - -void ControlsWidget::slower() -{ - THEMIM->getIM()->slower(); -} - -void ControlsWidget::faster() -{ - THEMIM->getIM()->faster(); -} - -void ControlsWidget::enableInput( bool enable ) -{ - slowerButton->setEnabled( enable ); - slider->setEnabled( enable ); - slider->setSliderPosition ( 0 ); - 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( advControls && !b_advancedVisible ) - { - advControls->show(); - b_advancedVisible = true; - } - else - { - advControls->hide(); - b_advancedVisible = false; - } - emit advancedControlsToggled( b_advancedVisible ); + //Block signals to avoid feedback loop + speedSlider->blockSignals( true ); + speedSlider->setValue( sliderValue ); + speedSlider->blockSignals( false ); } - -/********************************************************************** - * Fullscrenn control widget - **********************************************************************/ -FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, - MainInterface *_p_mi, bool b_advControls, bool b_shiny ) - : ControlsWidget( _p_i, _p_mi, b_advControls, b_shiny, true ), - i_mouse_last_x( -1 ), i_mouse_last_y( -1 ), b_mouse_over(false), - b_slow_hide_begin(false), i_slow_hide_timeout(1), - b_fullscreen( false ), i_hide_timeout( 1 ), p_vout(NULL) +void SpeedControlWidget::updateRate( int sliderValue ) { - setWindowFlags( Qt::ToolTip ); - - setFrameShape( QFrame::StyledPanel ); - setFrameStyle( QFrame::Sunken ); - setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); - - QGridLayout *fsLayout = new QGridLayout( this ); - fsLayout->setLayoutMargins( 5, 2, 5, 2, 5 ); - - /* First line */ - slider->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum); - slider->setMinimumWidth( 220 ); - fsLayout->addWidget( slowerButton, 0, 0 ); - fsLayout->addWidget( slider, 0, 1, 1, 9 ); - fsLayout->addWidget( fasterButton, 0, 10 ); - - fsLayout->addWidget( playButton, 1, 0, 1, 2 ); - fsLayout->addLayout( controlButLayout, 1, 2 ); - - fsLayout->addWidget( discFrame, 1, 3 ); - fsLayout->addWidget( telexFrame, 1, 4 ); - fsLayout->addWidget( fullscreenButton, 1, 5 ); - fsLayout->addWidget( advControls, 1, 6, Qt::AlignVCenter ); - - fsLayout->setColumnStretch( 7, 10 ); - fsLayout->addWidget( volMuteLabel, 1, 8 ); - fsLayout->addWidget( volumeSlider, 1, 9, 1, 2 ); - - /* hiding timer */ - p_hideTimer = new QTimer( this ); - CONNECT( p_hideTimer, timeout(), this, hideFSC() ); - p_hideTimer->setSingleShot( true ); - - /* slow hiding timer */ -#if HAVE_TRANSPARENCY - p_slowHideTimer = new QTimer( this ); - CONNECT( p_slowHideTimer, timeout(), this, slowHideFSC() ); -#endif - - adjustSize (); /* need to get real width and height for moving */ - - /* center down */ - QDesktopWidget * p_desktop = QApplication::desktop(); - - move( p_desktop->width() / 2 - width() / 2, - p_desktop->height() - height() ); - -#ifdef WIN32TRICK - setWindowOpacity( 0.0 ); - b_fscHidden = true; - adjustSize(); - show(); -#endif - - fullscreenButton->setIcon( QIcon( ":/defullscreen" ) ); + double speed = pow( 2, (double)sliderValue / 17 ); + int rate = INPUT_RATE_DEFAULT / speed; - vlc_mutex_init_recursive( &lock ); + THEMIM->getIM()->setRate(rate); } -FullscreenControllerWidget::~FullscreenControllerWidget() +void SpeedControlWidget::resetRate() { - detachVout(); - vlc_mutex_destroy( &lock ); + THEMIM->getIM()->setRate( INPUT_RATE_DEFAULT ); } -/** - * Show fullscreen controller - */ -void FullscreenControllerWidget::showFSC() +CoverArtLabel::CoverArtLabel( QWidget *parent, intf_thread_t *_p_i ) + : QLabel( parent ), p_intf( _p_i ) { - adjustSize(); -#ifdef WIN32TRICK - // after quiting and going to fs, we need to call show() - if( isHidden() ) - show(); - - if( b_fscHidden ) - { - b_fscHidden = false; - setWindowOpacity( 1.0 ); - } -#else - show(); -#endif + setContextMenuPolicy( Qt::ActionsContextMenu ); + CONNECT( this, updateRequested(), this, doUpdate() ); + CONNECT( THEMIM->getIM(), artChanged( QString ), + this, doUpdate( const QString& ) ); -#if HAVE_TRANSPARENCY - setWindowOpacity( DEFAULT_OPACITY ); -#endif -} + setMinimumHeight( 128 ); + setMinimumWidth( 128 ); + setMaximumHeight( 128 ); + setMaximumWidth( 128 ); + setScaledContents( true ); + QList< QAction* > artActions = actions(); + QAction *action = new QAction( qtr( "Download cover art" ), this ); + addAction( action ); + CONNECT( action, triggered(), this, doUpdate() ); -/** - * Hide fullscreen controller - * FIXME: under windows it have to be done by moving out of screen - * because hide() doesnt work - */ -void FullscreenControllerWidget::hideFSC() -{ -#ifdef WIN32TRICK - b_fscHidden = true; - setWindowOpacity( 0.0 ); // simulate hidding -#else - hide(); -#endif + doUpdate(); } -/** - * Plane to hide fullscreen controller - */ -void FullscreenControllerWidget::planHideFSC() +CoverArtLabel::~CoverArtLabel() { - vlc_mutex_lock( &lock ); - int i_timeout = i_hide_timeout; - vlc_mutex_unlock( &lock ); - - p_hideTimer->start( i_timeout ); - -#if HAVE_TRANSPARENCY - b_slow_hide_begin = true; - i_slow_hide_timeout = i_timeout; - p_slowHideTimer->start( i_slow_hide_timeout / 2 ); -#endif + QList< QAction* > artActions = actions(); + foreach( QAction *act, artActions ) + removeAction( act ); } -/** - * Hidding fullscreen controller slowly - * Linux: need composite manager - * Windows: it is blinking, so it can be enabled by define TRASPARENCY - */ -void FullscreenControllerWidget::slowHideFSC() +void CoverArtLabel::doUpdate( const QString& url ) { -#if HAVE_TRANSPARENCY - if( b_slow_hide_begin ) + QPixmap pix; + if( !url.isEmpty() && pix.load( url ) ) { - b_slow_hide_begin = false; - - p_slowHideTimer->stop(); - /* the last part of time divided to 100 pieces */ - p_slowHideTimer->start( (int)( i_slow_hide_timeout / 2 / ( windowOpacity() * 100 ) ) ); - + setPixmap( pix ); } else { -#ifdef WIN32TRICK - if ( windowOpacity() > 0.0 && !b_fscHidden ) -#else - if ( windowOpacity() > 0.0 ) -#endif - { - /* we should use 0.01 because of 100 pieces ^^^ - but than it cannt be done in time */ - setWindowOpacity( windowOpacity() - 0.02 ); - } - - if ( windowOpacity() <= 0.0 ) - p_slowHideTimer->stop(); - } -#endif -} - -/** - * event handling - * events: show, hide, start timer for hidding - */ -void FullscreenControllerWidget::customEvent( QEvent *event ) -{ - bool b_fs; - - switch( event->type() ) - { - case FullscreenControlToggle_Type: - vlc_mutex_lock( &lock ); - b_fs = b_fullscreen; - vlc_mutex_unlock( &lock ); - if( b_fs ) -#ifdef WIN32TRICK - if( b_fscHidden ) -#else - if( isHidden() ) -#endif - { - p_hideTimer->stop(); - showFSC(); - } - else - hideFSC(); - break; - case FullscreenControlShow_Type: - vlc_mutex_lock( &lock ); - b_fs = b_fullscreen; - vlc_mutex_unlock( &lock ); - - if( b_fs ) // FIXME I am not sure about that one - showFSC(); - break; - case FullscreenControlHide_Type: - hideFSC(); - break; - case FullscreenControlPlanHide_Type: - if( !b_mouse_over ) // Only if the mouse is not over FSC - planHideFSC(); - break; - } -} - -/** - * On mouse move - * moving with FSC - */ -void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event ) -{ - if ( event->buttons() == Qt::LeftButton ) - { - int i_moveX = event->globalX() - i_mouse_last_x; - int i_moveY = event->globalY() - i_mouse_last_y; - - move( x() + i_moveX, y() + i_moveY ); - - i_mouse_last_x = event->globalX(); - i_mouse_last_y = event->globalY(); + setPixmap( QPixmap( ":/noart.png" ) ); } } -/** - * On mouse press - * store position of cursor - */ -void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event ) +void CoverArtLabel::doUpdate() { - i_mouse_last_x = event->globalX(); - i_mouse_last_y = event->globalY(); + THEMIM->getIM()->requestArtUpdate(); } -/** - * On mouse go above FSC - */ -void FullscreenControllerWidget::enterEvent( QEvent *event ) +TimeLabel::TimeLabel( intf_thread_t *_p_intf ) :QLabel(), p_intf( _p_intf ) { - b_mouse_over = true; - - p_hideTimer->stop(); -#if HAVE_TRANSPARENCY - p_slowHideTimer->stop(); -#endif -} + b_remainingTime = false; + setText( " --:--/--:-- " ); + setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + setToolTip( qtr( "Toggle between elapsed and remaining time" ) ); -/** - * On mouse go out from FSC - */ -void FullscreenControllerWidget::leaveEvent( QEvent *event ) -{ - planHideFSC(); - b_mouse_over = false; + CONNECT( THEMIM->getIM(), cachingChanged( float ), + this, setCaching( float ) ); + CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), + this, setDisplayPosition( float, int, int ) ); } -/** - * When you get pressed key, send it to video output - * FIXME: clearing focus by clearFocus() to not getting - * key press events didnt work - */ -void FullscreenControllerWidget::keyPressEvent( QKeyEvent *event ) +void TimeLabel::setDisplayPosition( float pos, int time, int length ) { - int i_vlck = qtEventToVLCKey( event ); - if( i_vlck > 0 ) + if( pos == -1.f ) { - var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck ); - event->accept(); - } - else - event->ignore(); -} - -/* */ -static int FullscreenControllerWidgetFullscreenChanged( vlc_object_t *vlc_object, const char *variable, - vlc_value_t old_val, vlc_value_t new_val, - void *data ) -{ - vout_thread_t *p_vout = (vout_thread_t *) vlc_object; - FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data; - - p_fs->fullscreenChanged( p_vout, new_val.b_bool, var_GetInteger( p_vout, "mouse-hide-timeout" ) ); - - return VLC_SUCCESS; -} -/* */ -static int FullscreenControllerWidgetMouseMoved( vlc_object_t *vlc_object, const char *variable, - vlc_value_t old_val, vlc_value_t new_val, - void *data ) -{ - FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data; - - /* Show event */ - IMEvent *eShow = new IMEvent( FullscreenControlShow_Type, 0 ); - QApplication::postEvent( p_fs, static_cast(eShow) ); - - /* Plan hide event */ - IMEvent *eHide = new IMEvent( FullscreenControlPlanHide_Type, 0 ); - QApplication::postEvent( p_fs, static_cast(eHide) ); - - return VLC_SUCCESS; -} - - -/** - * It is called when video start - */ -void FullscreenControllerWidget::attachVout( vout_thread_t *p_nvout ) -{ - assert( p_nvout && !p_vout ); - - p_vout = p_nvout; - - vlc_mutex_lock( &lock ); - var_AddCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this ); /* I miss a add and fire */ - fullscreenChanged( p_vout, var_GetBool( p_vout, "fullscreen" ), var_GetInteger( p_vout, "mouse-hide-timeout" ) ); - vlc_mutex_unlock( &lock ); -} -/** - * It is called after turn off video. - */ -void FullscreenControllerWidget::detachVout() -{ - if( p_vout ) - { - var_DelCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this ); - vlc_mutex_lock( &lock ); - fullscreenChanged( p_vout, false, 0 ); - vlc_mutex_unlock( &lock ); - p_vout = NULL; - } -} - -/** - * Register and unregister callback for mouse moving - */ -void FullscreenControllerWidget::fullscreenChanged( vout_thread_t *p_vout, bool b_fs, int i_timeout ) -{ - vlc_mutex_lock( &lock ); - if( b_fs && !b_fullscreen ) - { - b_fullscreen = true; - i_hide_timeout = i_timeout; - var_AddCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this ); - } - else if( !b_fs && b_fullscreen ) - { - b_fullscreen = false; - i_hide_timeout = i_timeout; - var_DelCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this ); - - /* Force fs hidding */ - IMEvent *eHide = new IMEvent( FullscreenControlHide_Type, 0 ); - QApplication::postEvent( this, static_cast(eHide) ); + setText( " --:--/--:-- " ); + return; } - vlc_mutex_unlock( &lock ); -} - -/********************************************************************** - * Speed control widget - **********************************************************************/ -SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i ) : - QFrame( NULL ), p_intf( _p_i ) -{ - 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 ); + char psz_length[MSTRTIME_MAX_SIZE], psz_time[MSTRTIME_MAX_SIZE]; + secstotimestr( psz_length, length ); + secstotimestr( psz_time, ( b_remainingTime && length ) ? length - time + : time ); - speedSlider->setRange( -24, 24 ); - speedSlider->setSingleStep( 1 ); - speedSlider->setPageStep( 1 ); - speedSlider->setTickInterval( 12 ); + QString timestr; + timestr.sprintf( "%s/%s", psz_time, + ( !length && time ) ? "--:--" : psz_length ); - CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) ); - - QToolButton *normalSpeedButton = new QToolButton( this ); - normalSpeedButton->setMaximumSize( QSize( 26, 20 ) ); - normalSpeedButton->setAutoRaise( true ); - normalSpeedButton->setText( "1x" ); - normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) ); - - CONNECT( normalSpeedButton, clicked(), this, resetRate() ); - - QVBoxLayout *speedControlLayout = new QVBoxLayout; - speedControlLayout->setLayoutMargins( 4, 4, 4, 4, 4 ); - speedControlLayout->setSpacing( 4 ); - speedControlLayout->addWidget( speedSlider ); - speedControlLayout->addWidget( normalSpeedButton ); - setLayout( speedControlLayout ); + /* Add a minus to remaining time*/ + if( b_remainingTime && length ) setText( " -"+timestr+" " ); + else setText( " "+timestr+" " ); } -SpeedControlWidget::~SpeedControlWidget() -{} - -void SpeedControlWidget::setEnable( bool b_enable ) +void TimeLabel::toggleTimeDisplay() { - speedSlider->setEnabled( b_enable ); + b_remainingTime = !b_remainingTime; } -void SpeedControlWidget::updateControls( int rate ) +void TimeLabel::setCaching( float f_cache ) { - if( speedSlider->isSliderDown() ) - { - //We don't want to change anything if the user is using the slider - return; - } - - double value = 12 * log( (double)INPUT_RATE_DEFAULT / rate ) / log( 2 ); - int sliderValue = (int) ( ( value > 0 ) ? value + .5 : value - .5 ); - - if( sliderValue < speedSlider->minimum() ) - { - sliderValue = speedSlider->minimum(); - } - else if( sliderValue > speedSlider->maximum() ) - { - sliderValue = speedSlider->maximum(); - } - - //Block signals to avoid feedback loop - speedSlider->blockSignals( true ); - speedSlider->setValue( sliderValue ); - speedSlider->blockSignals( false ); + QString amount; + amount.setNum( (int)(100 * f_cache) ); + msg_Dbg( p_intf, "New caching: %d", (int)(100*f_cache)); + setText( "Buff: " + amount + "%" ); } -void SpeedControlWidget::updateRate( int sliderValue ) -{ - double speed = pow( 2, (double)sliderValue / 12 ); - int rate = INPUT_RATE_DEFAULT / speed; - THEMIM->getIM()->setRate(rate); -} - -void SpeedControlWidget::resetRate() -{ - THEMIM->getIM()->setRate(INPUT_RATE_DEFAULT); -}