X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fdialogs%2Fopen.cpp;h=3a13ca9e67ecbedc17f71a907cbd0f9dae43338c;hb=33e8266df2b1de424d15506d22d827b297ea65a6;hp=5dbd8bde03fceb06969e384c1bd42067b87410e3;hpb=22101ad94d92fd9af16fae4fbe3a931cdb7cb790;p=vlc diff --git a/modules/gui/qt4/dialogs/open.cpp b/modules/gui/qt4/dialogs/open.cpp index 5dbd8bde03..3a13ca9e67 100644 --- a/modules/gui/qt4/dialogs/open.cpp +++ b/modules/gui/qt4/dialogs/open.cpp @@ -1,8 +1,8 @@ /***************************************************************************** * open.cpp : Advanced open dialog ***************************************************************************** - * Copyright (C) 2006-2007 the VideoLAN team - * $Id: streaminfo.cpp 16816 2006-09-23 20:56:52Z jb $ + * Copyright © 2006-2007 the VideoLAN team + * $Id$ * * Authors: Jean-Baptiste Kempf * @@ -20,181 +20,269 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "input_manager.hpp" + +#include "dialogs/open.hpp" #include #include #include #include #include -#include "dialogs/open.hpp" -#include "components/open.hpp" - -#include "qt4.hpp" -#include "util/qvlcframe.hpp" - -#include "input_manager.hpp" OpenDialog *OpenDialog::instance = NULL; -OpenDialog::OpenDialog( QWidget *parent, intf_thread_t *_p_intf, bool modal, +OpenDialog* OpenDialog::getInstance( QWidget *parent, intf_thread_t *p_intf, + bool b_rawInstance, int _action_flag, bool b_selectMode ) +{ + /* Creation */ + if( !instance ) + instance = new OpenDialog( parent, p_intf, b_selectMode, _action_flag ); + else if( !b_rawInstance ) + { + /* Request the instance but change small details: + - Button menu + - Modality on top of the parent dialog */ + if( b_selectMode ) + { + instance->setWindowModality( Qt::WindowModal ); + _action_flag = SELECT; /* This should be useless, but we never know + if the call is correct */ + } + instance->i_action_flag = _action_flag; + instance->setMenuAction(); + } + return instance; +} + +OpenDialog::OpenDialog( QWidget *parent, + intf_thread_t *_p_intf, + bool b_selectMode, int _action_flag ) : QVLCDialog( parent, _p_intf ) { - setModal( modal ); i_action_flag = _action_flag; + if( b_selectMode ) /* Select mode */ + { + setWindowModality( Qt::WindowModal ); + i_action_flag = SELECT; + } + + /* Basic Creation of the Window */ ui.setupUi( this ); - setWindowTitle( qtr("Open" ) ); - resize( 410, 300); + setWindowTitle( qtr( "Open" ) ); + /* resize( 410, 600 ); */ + setMinimumSize( 520, 460 ); /* Tab definition and creation */ - fileOpenPanel = new FileOpenPanel( ui.Tab, p_intf ); - discOpenPanel = new DiscOpenPanel( ui.Tab, p_intf ); - netOpenPanel = new NetOpenPanel( ui.Tab, p_intf ); + fileOpenPanel = new FileOpenPanel( ui.Tab, p_intf ); + discOpenPanel = new DiscOpenPanel( ui.Tab, p_intf ); + netOpenPanel = new NetOpenPanel( ui.Tab, p_intf ); captureOpenPanel = new CaptureOpenPanel( ui.Tab, p_intf ); + /* Insert the tabs */ ui.Tab->insertTab( OPEN_FILE_TAB, fileOpenPanel, qtr( "&File" ) ); ui.Tab->insertTab( OPEN_DISC_TAB, discOpenPanel, qtr( "&Disc" ) ); ui.Tab->insertTab( OPEN_NETWORK_TAB, netOpenPanel, qtr( "&Network" ) ); ui.Tab->insertTab( OPEN_CAPTURE_TAB, captureOpenPanel, - qtr( "Capture &Device" ) ); + qtr( "Capture &Device" ) ); - /* Hide the advancedPanel */ - ui.advancedFrame->hide(); + /* Hide the Slave input widgets */ + ui.slaveLabel->hide(); + ui.slaveText->hide(); + ui.slaveBrowseButton->hide(); /* Buttons Creation */ - QSizePolicy buttonSizePolicy( static_cast(7), - static_cast(1) ); - buttonSizePolicy.setHorizontalStretch(0); - buttonSizePolicy.setVerticalStretch(0); - - playButton = new QToolButton( this ); - playButton->setText( qtr( "&Play" ) ); - playButton->setSizePolicy( buttonSizePolicy ); - playButton->setMinimumSize( QSize(90, 0) ); - playButton->setPopupMode( QToolButton::MenuButtonPopup ); - playButton->setToolButtonStyle( Qt::ToolButtonTextOnly ); - - cancelButton = new QToolButton(); - cancelButton->setText( qtr( "&Cancel" ) ); - cancelButton->setSizePolicy( buttonSizePolicy ); + /* Play Button */ + playButton = ui.playButton; + /* Cancel Button */ + cancelButton = new QPushButton( qtr( "&Cancel" ) ); + + /* Select Button */ + selectButton = new QPushButton( qtr( "&Select" ) ); + + /* Menu for the Play button */ QMenu * openButtonMenu = new QMenu( "Open" ); - openButtonMenu->addAction( qtr("&Enqueue"), this, SLOT( enqueue() ), - QKeySequence( "Alt+E") ); - openButtonMenu->addAction( qtr("&Play"), this, SLOT( play() ), + openButtonMenu->addAction( qtr( "&Enqueue" ), this, SLOT( enqueue() ), + QKeySequence( "Alt+E" ) ); + openButtonMenu->addAction( qtr( "&Play" ), this, SLOT( play() ), QKeySequence( "Alt+P" ) ); - openButtonMenu->addAction( qtr("&Stream"), this, SLOT( stream() ) , + openButtonMenu->addAction( qtr( "&Stream" ), this, SLOT( stream() ) , QKeySequence( "Alt+S" ) ); - openButtonMenu->addAction( qtr("&Convert"), this, SLOT( transcode( ) ) , + openButtonMenu->addAction( qtr( "&Convert" ), this, SLOT( transcode() ) , QKeySequence( "Alt+C" ) ); - playButton->setMenu( openButtonMenu ); + ui.menuButton->setMenu( openButtonMenu ); - ui.buttonsBox->addButton( playButton, QDialogButtonBox::AcceptRole ); + /* Add the three Buttons */ + ui.buttonsBox->addButton( selectButton, QDialogButtonBox::AcceptRole ); ui.buttonsBox->addButton( cancelButton, QDialogButtonBox::RejectRole ); + /* At creation time, modify the default buttons */ + setMenuAction(); + /* Force MRL update on tab change */ - CONNECT( ui.Tab, currentChanged(int), this, signalCurrent()); + CONNECT( ui.Tab, currentChanged( int ), this, signalCurrent() ); - CONNECT( fileOpenPanel, mrlUpdated( QString ), this, updateMRL(QString) ); - CONNECT( netOpenPanel, mrlUpdated( QString ), this, updateMRL(QString) ); - CONNECT( discOpenPanel, mrlUpdated( QString ), this, updateMRL(QString) ); - CONNECT( captureOpenPanel, mrlUpdated( QString ), this, - updateMRL(QString) ); + CONNECT( fileOpenPanel, mrlUpdated( QString ), this, updateMRL( QString ) ); + CONNECT( netOpenPanel, mrlUpdated( QString ), this, updateMRL( QString ) ); + CONNECT( discOpenPanel, mrlUpdated( QString ), this, updateMRL( QString ) ); + CONNECT( captureOpenPanel, mrlUpdated( QString ), this, updateMRL( QString ) ); CONNECT( fileOpenPanel, methodChanged( QString ), - this, newMethod(QString) ); + this, newCachingMethod( QString ) ); CONNECT( netOpenPanel, methodChanged( QString ), - this, newMethod(QString) ); + this, newCachingMethod( QString ) ); CONNECT( discOpenPanel, methodChanged( QString ), - this, newMethod(QString) ); - /* FIXME CAPTURE */ + this, newCachingMethod( QString ) ); + CONNECT( captureOpenPanel, methodChanged( QString ), + this, newCachingMethod( QString ) ); /* Advanced frame Connects */ - CONNECT( ui.slaveText, textChanged(QString), this, updateMRL()); - CONNECT( ui.cacheSpinBox, valueChanged(int), this, updateMRL()); - CONNECT( ui.startTimeSpinBox, valueChanged(int), this, updateMRL()); - BUTTONACT( ui.advancedCheckBox , toggleAdvancedPanel() ); + CONNECT( ui.slaveText, textChanged( QString ), this, updateMRL() ); + CONNECT( ui.cacheSpinBox, valueChanged( int ), this, updateMRL() ); + CONNECT( ui.startTimeSpinBox, valueChanged( int ), this, updateMRL() ); + BUTTONACT( ui.advancedCheckBox, toggleAdvancedPanel() ); + BUTTONACT( ui.slaveBrowseButton, browseInputSlave() ); /* Buttons action */ - BUTTONACT( playButton, play()); - BUTTONACT( cancelButton, cancel()); - - /* At creation time, modify the default buttons */ - if ( i_action_flag ) setMenuAction(); + BUTTONACT( playButton, selectSlots() ); + BUTTONACT( selectButton, close() ); + BUTTONACT( cancelButton, cancel() ); + /* Hide the advancedPanel */ + if( !config_GetInt( p_intf, "qt-adv-options" ) ) + ui.advancedFrame->hide(); + else + ui.advancedCheckBox->setChecked( true ); /* Initialize caching */ storedMethod = ""; - newMethod("file-caching"); - - mainHeight = advHeight = 0; + newCachingMethod( "file-caching" ); } OpenDialog::~OpenDialog() -{ -} +{} /* Finish the dialog and decide if you open another one after */ void OpenDialog::setMenuAction() { - switch ( i_action_flag ) + if( i_action_flag == SELECT ) { + playButton->hide(); + selectButton->show(); + selectButton->setDefault( true ); + } + else + { + switch ( i_action_flag ) + { case OPEN_AND_STREAM: - playButton->setText( qtr("&Stream") ); - BUTTONACT( playButton, stream() ); + playButton->setText( qtr( "&Stream" ) ); break; case OPEN_AND_SAVE: - playButton->setText( qtr("&Convert / Save") ); - BUTTONACT( playButton, stream( true ) ); + playButton->setText( qtr( "&Convert / Save" ) ); + break; + case OPEN_AND_ENQUEUE: + playButton->setText( qtr( "&Enqueue" ) ); break; case OPEN_AND_PLAY: default: - playButton->setText( qtr("&Play") ); - BUTTONACT( playButton, play() ); - } + playButton->setText( qtr( "&Play" ) ); + } + playButton->show(); + selectButton->hide(); + playButton->setDefault( true ); + } +} + +void OpenDialog::showTab( int i_tab ) +{ + ui.Tab->setCurrentIndex( i_tab ); + show(); } -void OpenDialog::showTab(int i_tab=0) +/* Function called on signal currentChanged triggered */ +void OpenDialog::signalCurrent() { - this->show(); - ui.Tab->setCurrentIndex(i_tab); + if( ui.Tab->currentWidget() != NULL ) + ( dynamic_cast( ui.Tab->currentWidget() ) )->updateMRL(); } -void OpenDialog::signalCurrent() { - if (ui.Tab->currentWidget() != NULL) { - (dynamic_cast(ui.Tab->currentWidget()))->updateMRL(); +void OpenDialog::toggleAdvancedPanel() +{ + if( ui.advancedFrame->isVisible() ) + { + ui.advancedFrame->hide(); + //setMinimumSize( 520, 460 ); + if( size().isValid() ) + resize( size().width(), size().height() + - ui.advancedFrame->height() ); + } + else + { + ui.advancedFrame->show(); + //setMinimumSize( 520, 460 + ui.advancedFrame->height() ); + if( size().isValid() ) + resize( size().width(), size().height() + + ui.advancedFrame->height() ); } } /*********** * Actions * ***********/ - /* If Cancel is pressed or escaped */ void OpenDialog::cancel() { - fileOpenPanel->clear(); - this->toggleVisible(); - if( isModal() ) - reject(); + /* Clear the panels */ + for( int i = 0; i < OPEN_TAB_MAX; i++ ) + dynamic_cast( ui.Tab->widget( i ) )->clear(); + + /* Clear the variables */ + mrl.clear(); + mainMRL.clear(); + + /* If in Select Mode, reject instead of hiding */ + if( i_action_flag == SELECT ) reject(); + else hide(); } /* If EnterKey is pressed */ void OpenDialog::close() { - /* FIXME */ - if ( !i_action_flag ) - { - play(); - } + /* If in Select Mode, accept instead of selecting a Slot */ + if( i_action_flag == SELECT ) + accept(); else + selectSlots(); +} + +/* Play button */ +void OpenDialog::selectSlots() +{ + switch ( i_action_flag ) { + case OPEN_AND_STREAM: stream(); + break; + case OPEN_AND_SAVE: + transcode(); + break; + case OPEN_AND_ENQUEUE: + enqueue(); + break; + case OPEN_AND_PLAY: + default: + play(); } } -/* Play button */ void OpenDialog::play() { finish( false ); @@ -205,78 +293,60 @@ void OpenDialog::enqueue() finish( true ); } -void OpenDialog::transcode() -{ - stream( true ); -} - -void OpenDialog::stream( bool b_transcode_only ) -{ - /* not finished FIXME */ - /* Should go through the finish function */ - THEDP->streamingDialog( mrl, b_transcode_only ); -} void OpenDialog::finish( bool b_enqueue = false ) { - this->toggleVisible(); + toggleVisible(); mrl = ui.advancedLineInput->text(); - if( !isModal() ) + if( i_action_flag != SELECT ) { QStringList tempMRL = SeparateEntries( mrl ); for( size_t i = 0; i < tempMRL.size(); i++ ) { bool b_start = !i && !b_enqueue; input_item_t *p_input; - const char *psz_utf8 = qtu( tempMRL[i] ); - p_input = input_ItemNew( p_intf, psz_utf8, NULL ); + p_input = input_ItemNew( p_intf, qtu( tempMRL[i] ), NULL ); /* Insert options */ while( i + 1 < tempMRL.size() && tempMRL[i + 1].startsWith( ":" ) ) { i++; - psz_utf8 = qtu( tempMRL[i] ); - input_ItemAddOption( p_input, psz_utf8 ); + input_ItemAddOption( p_input, qtu( tempMRL[i] ) ); } - if( b_start ) - { - playlist_AddInput( THEPL, p_input, - PLAYLIST_APPEND | PLAYLIST_GO, - PLAYLIST_END, VLC_TRUE, VLC_FALSE ); - } - else - { - playlist_AddInput( THEPL, p_input, - PLAYLIST_APPEND|PLAYLIST_PREPARSE, - PLAYLIST_END, VLC_TRUE, VLC_FALSE ); - } + /* Switch between enqueuing and starting the item */ + /* FIXME: playlist_AddInput() can fail */ + playlist_AddInput( THEPL, p_input, + PLAYLIST_APPEND | ( b_start ? PLAYLIST_GO : PLAYLIST_PREPARSE ), + PLAYLIST_END, true, pl_Unlocked ); + vlc_gc_decref( p_input ); } } else accept(); } -void OpenDialog::toggleAdvancedPanel() +void OpenDialog::transcode() { - //FIXME does not work under Windows - if (ui.advancedFrame->isVisible()) { - ui.advancedFrame->hide(); - setMinimumHeight(1); - resize( width(), mainHeight ); + stream( true ); +} - } else { - if( mainHeight == 0 ) - mainHeight = height(); +void OpenDialog::stream( bool b_transcode_only ) +{ + mrl = ui.advancedLineInput->text(); + toggleVisible(); + QStringList listMRL = SeparateEntries( mrl ); + if( listMRL.size() > 0 ) + THEDP->streamingDialog( this, SeparateEntries( mrl )[0], b_transcode_only ); +} - ui.advancedFrame->show(); - if( advHeight == 0 ) { - advHeight = height() - mainHeight; - } - resize( width(), mainHeight + advHeight ); - } +/* Update the MRL */ +void OpenDialog::updateMRL( QString tempMRL ) +{ + mainMRL = tempMRL; + updateMRL(); } void OpenDialog::updateMRL() { @@ -284,30 +354,24 @@ void OpenDialog::updateMRL() { if( ui.slaveCheckbox->isChecked() ) { mrl += " :input-slave=" + ui.slaveText->text(); } - int i_cache = config_GetInt( p_intf, qta(storedMethod) ); + int i_cache = config_GetInt( p_intf, qta( storedMethod ) ); if( i_cache != ui.cacheSpinBox->value() ) { - mrl += QString(" :%1=%2").arg(storedMethod). - arg(ui.cacheSpinBox->value()); + mrl += QString( " :%1=%2" ).arg( storedMethod ). + arg( ui.cacheSpinBox->value() ); } - if( ui.startTimeSpinBox->value()) { - mrl += " :start-time=" + QString("%1"). - arg(ui.startTimeSpinBox->value()); + if( ui.startTimeSpinBox->value() ) { + mrl += " :start-time=" + QString( "%1" ). + arg( ui.startTimeSpinBox->value() ); } - ui.advancedLineInput->setText(mrl); -} - -void OpenDialog::updateMRL(QString tempMRL) -{ - mainMRL = tempMRL; - updateMRL(); + ui.advancedLineInput->setText( mrl ); } -void OpenDialog::newMethod(QString method) +void OpenDialog::newCachingMethod( QString method ) { if( method != storedMethod ) { storedMethod = method; - int i_value = config_GetInt( p_intf, qta(storedMethod) ); - ui.cacheSpinBox->setValue(i_value); + int i_value = config_GetInt( p_intf, qta( storedMethod ) ); + ui.cacheSpinBox->setValue( i_value ); } } @@ -358,3 +422,11 @@ QStringList OpenDialog::SeparateEntries( QString entries ) return entries_array; } + +void OpenDialog::browseInputSlave() +{ + OpenDialog *od = new OpenDialog( this, p_intf, true, SELECT ); + od->exec(); + ui.slaveText->setText( od->getMRL() ); + delete od; +}