Commit 2e6b2114 authored by Clément Stenac's avatar Clément Stenac

Advanced controls bar

Make some sttings persistent
parent 19f019c7
......@@ -30,7 +30,7 @@ TOMOC = main_interface \
dialogs/streaminfo \
dialogs/extended \
dialogs/interaction \
components/equalizer \
components/extended_panels \
components/infopanels \
components/preferences_widgets \
components/preferences \
......@@ -56,7 +56,7 @@ nodist_SOURCES_qt4 = \
dialogs/errors.moc.cpp \
dialogs/prefs_dialog.moc.cpp \
dialogs/interaction.moc.cpp \
components/equalizer.moc.cpp \
components/extended_panels.moc.cpp \
components/infopanels.moc.cpp \
components/preferences_widgets.moc.cpp \
components/preferences.moc.cpp \
......@@ -102,7 +102,7 @@ SOURCES_qt4 = qt4.cpp \
dialogs/messages.cpp \
dialogs/errors.cpp \
dialogs/interaction.cpp \
components/equalizer.cpp \
components/extended_panels.cpp \
components/infopanels.cpp \
components/preferences_widgets.cpp \
components/preferences.cpp \
......@@ -130,7 +130,7 @@ EXTRA_DIST += \
dialogs/errors.hpp \
dialogs/prefs_dialog.hpp \
dialogs/interaction.hpp \
components/equalizer.hpp \
components/extended_panels.hpp \
components/infopanels.hpp \
components/preferences_widgets.hpp \
components/preferences.hpp \
......
/*****************************************************************************
* equalizer.cpp : Equalizer
* extended_panels.cpp : Extended controls panels
****************************************************************************
* Copyright (C) 2006 the VideoLAN team
* $Id: preferences.cpp 16643 2006-09-13 12:45:46Z zorglub $
......@@ -27,7 +27,7 @@
#include <QFont>
#include <QGridLayout>
#include "components/equalizer.hpp"
#include "components/extended_panels.hpp"
#include "qt4.hpp"
#include "../../audio_filter/equalizer_presets.h"
......@@ -36,6 +36,10 @@
#include <vlc_intf_strings.h>
#include <assert.h>
/**********************************************************************
* Equalizer
**********************************************************************/
static const QString band_frequencies[] =
{
" 60Hz ", " 170 Hz " , " 310 Hz ", " 600 Hz ", " 1 kHz ",
......@@ -257,3 +261,16 @@ void Equalizer::addCallbacks( aout_instance_t *p_aout )
// var_AddCallback( p_aout, "equalizer-bands", EqzCallback, this );
// var_AddCallback( p_aout, "equalizer-preamp", EqzCallback, this );
}
/**********************************************************************
* Video filters / Adjust
**********************************************************************/
/**********************************************************************
* Audio filters
**********************************************************************/
/**********************************************************************
* Extended playbak controls
**********************************************************************/
......@@ -56,4 +56,20 @@ private slots:
void setPreset(int);
};
class ExtendedControls: public QWidget
{
Q_OBJECT
public:
ExtendedControls( intf_thread_t *, QWidget * ) {};
virtual ~ExtendedControls() {};
private:
intf_thread_t *p_intf;
private slots:
void slower() {};
void faster() {};
void normal() {};
void snapshot() {};
};
#endif
......@@ -30,6 +30,8 @@
#include "pixmaps/art.xpm"
#include <vlc/vout.h>
#include <QLabel>
#include <QSpacerItem>
#include <QCursor>
#include <QPushButton>
#include <QHBoxLayout>
......@@ -154,6 +156,17 @@ VisualSelector::VisualSelector( intf_thread_t *_p_i ) :
QPushButton *nextButton = new QPushButton( "Next");
layout->addWidget( prevButton );
layout->addWidget( nextButton );
layout->addItem( new QSpacerItem( 40,20,
QSizePolicy::Expanding, QSizePolicy::Minimum) );
layout->addWidget( new QLabel( qtr("Current visualization:") ) );
current = new QLabel( qtr( "None" ) );
layout->addWidget( current );
BUTTONACT( prevButton, prev() );
BUTTONACT( nextButton, next() );
setLayout( layout );
setMaximumHeight( 35 );
}
......@@ -162,6 +175,103 @@ VisualSelector::~VisualSelector()
{
}
void VisualSelector::prev()
{
char *psz_new = aout_VisualPrev( p_intf );
if( psz_new )
{
current->setText( qfu( psz_new ) );
free( psz_new );
}
}
void VisualSelector::next()
{
char *psz_new = aout_VisualNext( p_intf );
if( psz_new )
{
current->setText( qfu( psz_new ) );
free( psz_new );
}
}
/**********************************************************************
* More controls
**********************************************************************/
ControlsWidget::ControlsWidget( intf_thread_t *_p_i ) :
QFrame( NULL ), p_intf( _p_i )
{
QHBoxLayout *layout = new QHBoxLayout( this );
layout->setMargin( 0 );
slowerButton = new QPushButton( "S" );
BUTTON_SET_ACT( slowerButton, "S", qtr("Slower" ), slower() );
layout->addWidget( slowerButton );
slowerButton->setMaximumWidth( 35 );
normalButton = new QPushButton( "N" );
BUTTON_SET_ACT( normalButton, "N", qtr("Normal rate"), normal() );
layout->addWidget( normalButton );
normalButton->setMaximumWidth( 35 );
fasterButton = new QPushButton( "F" );
BUTTON_SET_ACT( fasterButton, "F", qtr("Faster" ), faster() );
layout->addWidget( fasterButton );
fasterButton->setMaximumWidth( 35 );
layout->addItem( new QSpacerItem( 100,20,
QSizePolicy::Expanding, QSizePolicy::Minimum) );
snapshotButton = new QPushButton( "S" );
BUTTON_SET_ACT( snapshotButton, "S", qtr("Take a snapshot"), snapshot() );
layout->addWidget( snapshotButton );
snapshotButton->setMaximumWidth( 35 );
fullscreenButton = new QPushButton( "F" );
BUTTON_SET_ACT( fullscreenButton, "F", qtr("Fullscreen"), fullscreen() );
layout->addWidget( fullscreenButton );
fullscreenButton->setMaximumWidth( 35 );
}
ControlsWidget::~ControlsWidget()
{
}
void ControlsWidget::enableInput( bool enable )
{
slowerButton->setEnabled( enable );
normalButton->setEnabled( enable );
fasterButton->setEnabled( enable );
}
void ControlsWidget::enableVideo( bool enable )
{
snapshotButton->setEnabled( enable );
fullscreenButton->setEnabled( enable );
}
void ControlsWidget::slower()
{
THEMIM->getIM()->slower();
}
void ControlsWidget::faster()
{
THEMIM->getIM()->faster();
}
void ControlsWidget::normal()
{
THEMIM->getIM()->normalRate();
}
void ControlsWidget::snapshot()
{
}
void ControlsWidget::fullscreen()
{
}
/**********************************************************************
* Playlist Widget. The embedded playlist
**********************************************************************/
......
......@@ -89,8 +89,34 @@ public:
virtual ~VisualSelector();
private:
intf_thread_t *p_intf;
QLabel *current;
private slots:
void prev();
void next();
};
class QPushButton;
class ControlsWidget : public QFrame
{
Q_OBJECT
public:
ControlsWidget( intf_thread_t *);
virtual ~ControlsWidget();
void enableInput( bool );
void enableVideo( bool );
private:
intf_thread_t *p_intf;
QPushButton *slowerButton, *normalButton, *fasterButton;
QPushButton *fullscreenButton, *snapshotButton;
private slots:
void faster();
void slower();
void normal();
void snapshot();
void fullscreen();
};
/******************** Playlist Widgets ****************/
#include <QModelIndex>
class QSignalMapper;
......
......@@ -26,7 +26,7 @@
#include "dialogs/extended.hpp"
#include "dialogs_provider.hpp"
#include "util/qvlcframe.hpp"
#include "components/equalizer.hpp"
#include "components/extended_panels.hpp"
#include "qt4.hpp"
ExtendedDialog *ExtendedDialog::instance = NULL;
......
......@@ -55,6 +55,11 @@ void InputManager::setInput( input_thread_t *_p_input )
b_had_audio = b_had_video = b_has_audio = b_has_video = false;
if( p_input )
{
vlc_value_t val;
var_Change( p_input, "video-es", VLC_VAR_CHOICESCOUNT, &val, NULL );
b_has_video = val.i_int > 0;
var_Change( p_input, "audio-es", VLC_VAR_CHOICESCOUNT, &val, NULL );
b_has_audio = val.i_int > 0;
var_AddCallback( p_input, "audio-es", ChangeAudio, this );
var_AddCallback( p_input, "video-es", ChangeVideo, this );
}
......@@ -139,7 +144,7 @@ void InputManager::update()
void InputManager::sliderUpdate( float new_pos )
{
if( p_input && !p_input->b_die && !p_input->b_dead )
if( hasInput() )
var_SetFloat( p_input, "position", new_pos );
}
......@@ -161,6 +166,24 @@ void InputManager::togglePlayPause()
emit statusChanged( state.i_int );
}
void InputManager::slower()
{
if( hasInput() )
var_SetVoid( p_input, "rate-slower" );
}
void InputManager::faster()
{
if( hasInput() )
var_SetVoid( p_input, "rate-faster" );
}
void InputManager::normalRate()
{
if( hasInput() )
var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );
}
/**********************************************************************
* MainInputManager implementation. Wrap an input manager and
* take care of updating the main playlist input
......
......@@ -26,6 +26,7 @@
#include <QObject>
#include <vlc/vlc.h>
#include <vlc/input.h>
class InputManager : public QObject
{
......@@ -35,6 +36,7 @@ public:
virtual ~InputManager();
void delInput();
bool hasInput() { return p_input && !p_input->b_dead && !p_input->b_die; }
bool hasAudio() { return b_has_audio; }
bool hasVideo() { return b_has_video; }
bool b_has_audio, b_has_video, b_had_audio, b_had_video;
......@@ -48,6 +50,9 @@ public slots:
void update(); ///< Periodic updates
void setInput( input_thread_t * ); ///< Our controlled input changed
void sliderUpdate( float ); ///< User dragged the slider. We get new pos
void slower();
void faster();
void normalRate();
signals:
/// Send new position, new time and new length
void positionUpdated( float , int, int );
......
......@@ -39,6 +39,7 @@
#include <assert.h>
#include <vlc_keys.h>
#include <vlc/vout.h>
#include <aout_internal.h>
#ifdef WIN32
#define PREF_W 410
......@@ -48,10 +49,6 @@
#define PREF_H 125
#endif
#define BUTTON_SET( button, image, tooltip ) ui.button##Button->setText(""); \
ui.button##Button->setIcon( QIcon( ":/pixmaps/"#image ) ); \
ui.button##Button->setToolTip( tooltip );
#define VISIBLE(i) (i && i->isVisible())
#define SET_WIDTH(i,j) i->widgetSize.setWidth(j)
......@@ -90,10 +87,24 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL;
embeddedPlaylistWasActive = videoIsActive = false;
/* Fetch configuration from settings and vlc config */
videoEmbeddedFlag = false;
if( config_GetInt( p_intf, "embedded-video" ) )
videoEmbeddedFlag = true;
alwaysVideoFlag = false;
if( videoEmbeddedFlag && config_GetInt( p_intf, "qt-always-video" ))
alwaysVideoFlag = true;
playlistEmbeddedFlag = settings->value( "playlist-embedded", true ).
toBool();
advControlsEnabled= settings->value( "adv-controls", false ).toBool();
setWindowTitle( QString::fromUtf8( _("VLC media player") ) );
handleMainUi( settings );
QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag );
QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag,
advControlsEnabled );
/* Status bar */
timeLabel = new QLabel( 0 );
......@@ -126,7 +137,11 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
MainInterface::~MainInterface()
{
/// \todo Save everything
settings->setValue( "playlist-embedded", playlistEmbeddedFlag );
settings->setValue( "adv-controls", advControlsEnabled );
settings->setValue( "pos", pos() );
settings->endGroup();
delete settings;
p_intf->b_interaction = VLC_FALSE;
var_DelCallback( p_intf, "interaction", InteractCallback, this );
......@@ -144,17 +159,13 @@ void MainInterface::handleMainUi( QSettings *settings )
slider = new InputSlider( Qt::Horizontal, NULL );
ui.hboxLayout->insertWidget( 0, slider );
BUTTON_SET( prev, previous.png, qtr( "Previous" ) );
BUTTONACT( ui.prevButton, prev() );
BUTTON_SET( next, next.png , qtr( "Next" ) );
BUTTONACT( ui.nextButton, next() );
BUTTON_SET( play, play.png , qtr( "Play" ) );
BUTTONACT( ui.playButton, play() );
BUTTON_SET( stop, stop.png , qtr( "Stop" ) );
BUTTONACT( ui.stopButton, stop() );
BUTTON_SET( visual, stop.png, qtr( "Audio visualizations" ) );
BUTTONACT( ui.visualButton, visual() );
BUTTON_SET_ACT_I( ui.prevButton, "" , previous.png,
qtr("Previous"), prev() );
BUTTON_SET_ACT_I( ui.nextButton, "", next.png, qtr("Next"), next() );
BUTTON_SET_ACT_I( ui.playButton, "", play.png, qtr("Play"), play() );
BUTTON_SET_ACT_I( ui.stopButton, "", stop.png, qtr("Stop"), stop() );
BUTTON_SET_ACT_I( ui.visualButton, "", stop.png,
qtr( "Audio visualizations" ), visual() );
/* Volume */
ui.volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) );
......@@ -164,20 +175,8 @@ void MainInterface::handleMainUi( QSettings *settings )
ui.volMuteLabel->installEventFilter(h);
ui.volumeSlider->setFocusPolicy( Qt::NoFocus );
/* Fetch configuration from settings and vlc config */
videoEmbeddedFlag = false;
if( config_GetInt( p_intf, "embedded-video" ) )
videoEmbeddedFlag = true;
alwaysVideoFlag = false;
if( videoEmbeddedFlag && config_GetInt( p_intf, "qt-always-video" ))
alwaysVideoFlag = true;
playlistEmbeddedFlag = true;
/// \todo fetch playlist settings
BUTTON_SET( playlist, volume-low.png, playlistEmbeddedFlag ?
qtr( "Show playlist" ) :
BUTTON_SET_IMG( ui.playlistButton, "" ,volume-low.png,
playlistEmbeddedFlag ? qtr( "Show playlist" ) :
qtr( "Open playlist" ) );
BUTTONACT( ui.playlistButton, playlist() );
......@@ -186,6 +185,12 @@ void MainInterface::handleMainUi( QSettings *settings )
addSize = QSize( ui.vboxLayout->margin() * 2, PREF_H );
advControls = new ControlsWidget( p_intf );
ui.vboxLayout->insertWidget( 0, advControls );
advControls->updateGeometry();
if( !advControlsEnabled ) advControls->hide();
need_components_update = true;
visualSelector = new VisualSelector( p_intf );
ui.vboxLayout->insertWidget( 0, visualSelector );
visualSelector->hide();
......@@ -211,10 +216,6 @@ void MainInterface::handleMainUi( QSettings *settings )
p_intf->pf_release_window = ::DoRelease;
p_intf->pf_control_window = ::DoControl;
}
calculateInterfaceSize();
resize( mainSize );
setMinimumSize( PREF_W, addSize.height() );
}
......@@ -249,7 +250,14 @@ void MainInterface::calculateInterfaceSize()
}
if( VISIBLE( visualSelector ) )
height += visualSelector->height();
fprintf( stderr, "Adv %p - visible %i\n", advControls, advControls->isVisible() );
if( VISIBLE( advControls) )
{
fprintf( stderr, "visible\n" );
height += advControls->sizeHint().height();
}
fprintf( stderr, "Adv height %i\n", advControls->sizeHint().height() );
fprintf( stderr, "Setting to %ix%i\n",
width + addSize.width() , height + addSize.height() );
......@@ -265,14 +273,12 @@ void MainInterface::resizeEvent( QResizeEvent *e )
SET_WH( videoWidget, e->size().width() - addSize.width(),
e->size().height() - addSize.height() );
videoWidget->updateGeometry();
fprintf( stderr, "Video set to %ix%i\n", DS( videoWidget->widgetSize) );
}
if( VISIBLE( playlistWidget ) )
{
SET_WH( playlistWidget , e->size().width() - addSize.width(),
e->size().height() - addSize.height() );
playlistWidget->updateGeometry();
fprintf( stderr, "PL set to %ix%i\n",DS(playlistWidget->widgetSize ) );
}
}
......@@ -361,6 +367,21 @@ int MainInterface::controlVideo( void *p_window, int i_query, va_list args )
return i_ret;
}
void MainInterface::advanced()
{
if( !VISIBLE( advControls ) )
{
advControls->show();
advControlsEnabled = true;
}
else
{
advControls->hide();
advControlsEnabled = false;
}
doComponentsUpdate();
}
void MainInterface::visual()
{
if( !VISIBLE( visualSelector) )
......@@ -404,7 +425,6 @@ void MainInterface::playlist()
/// Todo, reset its size ?
if( VISIBLE( playlistWidget) )
{
fprintf( stderr, "hiding playlist\n" );
playlistWidget->hide();
if( videoIsActive )
{
......@@ -415,7 +435,6 @@ void MainInterface::playlist()
}
else
{
fprintf( stderr, "showing playlist\n" );
playlistWidget->show();
if( videoIsActive )
{
......@@ -448,7 +467,7 @@ void MainInterface::undockPlaylist()
playlistEmbeddedFlag = false;
menuBar()->clear();
QVLCMenu::createMenuBar( this, p_intf, false );
QVLCMenu::createMenuBar( this, p_intf, false, advControlsEnabled );
if( videoIsActive )
{
......@@ -469,7 +488,7 @@ void MainInterface::customEvent( QEvent *event )
PlaylistDialog::killInstance();
playlistEmbeddedFlag = true;
menuBar()->clear();
QVLCMenu::createMenuBar(this, p_intf, true );
QVLCMenu::createMenuBar(this, p_intf, true, advControlsEnabled );
playlist();
}
}
......@@ -587,6 +606,21 @@ static bool b_my_volume;
void MainInterface::updateOnTimer()
{
aout_instance_t *p_aout = (aout_instance_t *)vlc_object_find( p_intf,
VLC_OBJECT_AOUT, FIND_ANYWHERE );
/* Todo: make this event-driven */
if( p_aout )
{
ui.visualButton->setEnabled( true );
vlc_object_release( p_aout );
}
else
ui.visualButton->setEnabled( false );
/* And this too */
advControls->enableInput( THEMIM->getIM()->hasInput() );
advControls->enableVideo( THEMIM->getIM()->hasVideo() );
if( p_intf->b_die )
{
QApplication::closeAllWindows();
......@@ -634,8 +668,6 @@ static int InteractCallback( vlc_object_t *p_this,
{
intf_dialog_args_t *p_arg = new intf_dialog_args_t;
p_arg->p_dialog = (interaction_dialog_t *)(new_val.p_address);
MainInterface *p_interface = (MainInterface*)param;
DialogEvent *event = new DialogEvent( INTF_DIALOG_INTERACTION, 0, p_arg );
QApplication::postEvent( THEDP, static_cast<QEvent*>(event) );
return VLC_SUCCESS;
......
......@@ -42,6 +42,7 @@ class BackgroundWidget;
class PlaylistWidget;
class VolumeClickHandler;
class VisualSelector;
class ControlsWidget;
class MainInterface : public QVLCMW
{
......@@ -74,11 +75,13 @@ private:
BackgroundWidget *bgWidget;
VisualSelector *visualSelector;
ControlsWidget *advControls;
PlaylistWidget *playlistWidget;
bool playlistEmbeddedFlag;
bool videoEmbeddedFlag;
bool alwaysVideoFlag;
bool advControlsEnabled;
InputManager *main_input_manager;
InputSlider *slider;
......@@ -101,6 +104,7 @@ private slots:
void next();
void playlist();
void visual();
void advanced();
void updateVolume( int sliderVolume );
};
......
......@@ -120,15 +120,15 @@ static int AudioAutoMenuBuilder( vlc_object_t *p_object,
THEDP->menusUpdateMapper->setMapping( menu, f ); }
void QVLCMenu::createMenuBar( MainInterface *mi, intf_thread_t *p_intf,
bool playlist )
bool playlist, bool adv_controls_enabled )
{
QMenuBar *bar = mi->menuBar();
BAR_ADD( FileMenu(), qtr("File") );
BAR_ADD( FileMenu(), qtr("Media") );
if( playlist )
{
BAR_ADD( PlaylistMenu( mi,p_intf ), qtr("Playlist" ) );
}
BAR_ADD( ToolsMenu( p_intf ), qtr("Tools") );
BAR_ADD( ToolsMenu( p_intf, mi, adv_controls_enabled ), qtr("Tools") );
BAR_DADD( VideoMenu( p_intf, NULL ), qtr("Video"), 1 );
BAR_DADD( AudioMenu( p_intf, NULL ), qtr("Audio"), 2 );
BAR_DADD( NavigMenu( p_intf, NULL ), qtr("Navigation"), 3 );
......@@ -161,7 +161,8 @@ QMenu *QVLCMenu::PlaylistMenu( MainInterface *mi, intf_thread_t *p_intf )
return menu;
}
QMenu *QVLCMenu::ToolsMenu( intf_thread_t *p_intf, bool with_intf )
QMenu *QVLCMenu::ToolsMenu( intf_thread_t *p_intf, MainInterface *mi,
bool adv_controls_enabled, bool with_intf )
{
QMenu *menu = new QMenu();
if( with_intf )
......@@ -169,15 +170,22 @@ QMenu *QVLCMenu::ToolsMenu( intf_thread_t *p_intf, bool with_intf )