X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fdialogs%2Fopen.cpp;h=e6a996224b8656c990875e806fbc18bc90ec2fc4;hb=a8242d184b5eba6bf4728db1186eff4001be8ad2;hp=56567e5005299f4b6fa608a6e0c77220e8f3c34c;hpb=1cf57a32b81cbacd4546b7442fc521ca709f7061;p=vlc diff --git a/modules/gui/qt4/dialogs/open.cpp b/modules/gui/qt4/dialogs/open.cpp index 56567e5005..e6a996224b 100644 --- a/modules/gui/qt4/dialogs/open.cpp +++ b/modules/gui/qt4/dialogs/open.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * open.cpp : Advanced open dialog ***************************************************************************** - * Copyright © 2006-2007 the VideoLAN team + * Copyright © 2006-2009 the VideoLAN team * $Id$ * * Authors: Jean-Baptiste Kempf @@ -20,28 +20,34 @@ * 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 "dialogs_provider.hpp" + +#include "recents.hpp" +#include "util/qt_dirs.hpp" + #include #include -#include #include #include +#define DEBUG_QT 1 + OpenDialog *OpenDialog::instance = NULL; OpenDialog* OpenDialog::getInstance( QWidget *parent, intf_thread_t *p_intf, - bool b_rawInstance, int _action_flag, bool b_selectMode ) + bool b_rawInstance, int _action_flag, bool b_selectMode, bool _b_pl ) { /* Creation */ if( !instance ) - instance = new OpenDialog( parent, p_intf, b_selectMode, _action_flag ); + instance = new OpenDialog( parent, p_intf, b_selectMode, + _action_flag, _b_pl ); else if( !b_rawInstance ) { /* Request the instance but change small details: @@ -54,6 +60,7 @@ OpenDialog* OpenDialog::getInstance( QWidget *parent, intf_thread_t *p_intf, if the call is correct */ } instance->i_action_flag = _action_flag; + instance->b_pl = _b_pl; instance->setMenuAction(); } return instance; @@ -62,9 +69,11 @@ OpenDialog* OpenDialog::getInstance( QWidget *parent, intf_thread_t *p_intf, OpenDialog::OpenDialog( QWidget *parent, intf_thread_t *_p_intf, bool b_selectMode, - int _action_flag ) : QVLCDialog( parent, _p_intf ) + int _action_flag, + bool _b_pl) : QVLCDialog( parent, _p_intf ) { i_action_flag = _action_flag; + b_pl =_b_pl; /* Workaround the Win32 Vout that put the video on top at regular times */ #ifdef WIN32 @@ -79,15 +88,13 @@ OpenDialog::OpenDialog( QWidget *parent, /* Basic Creation of the Window */ ui.setupUi( this ); - setWindowTitle( qtr( "Open" ) ); - /* resize( 410, 600 ); */ - setMinimumSize( 520, 490 ); + setWindowTitle( qtr( "Open Media" ) ); /* 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 ); - captureOpenPanel = new CaptureOpenPanel( ui.Tab, p_intf ); + fileOpenPanel = new FileOpenPanel( this, p_intf ); + discOpenPanel = new DiscOpenPanel( this, p_intf ); + netOpenPanel = new NetOpenPanel( this, p_intf ); + captureOpenPanel = new CaptureOpenPanel( this, p_intf ); /* Insert the tabs */ ui.Tab->insertTab( OPEN_FILE_TAB, fileOpenPanel, qtr( "&File" ) ); @@ -123,6 +130,7 @@ OpenDialog::OpenDialog( QWidget *parent, QKeySequence( "Alt+C" ) ); ui.menuButton->setMenu( openButtonMenu ); + ui.menuButton->setIcon( QIcon( ":/down_arrow" ) ); /* Add the three Buttons */ ui.buttonsBox->addButton( selectButton, QDialogButtonBox::AcceptRole ); @@ -134,21 +142,26 @@ OpenDialog::OpenDialog( QWidget *parent, /* Force MRL update on tab change */ CONNECT( ui.Tab, currentChanged( int ), this, signalCurrent( int ) ); - 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( QStringList, QString ), + this, updateMRL( const QStringList&, const QString& ) ); + CONNECT( netOpenPanel, mrlUpdated( QStringList, QString ), + this, updateMRL( const QStringList&, const QString& ) ); + CONNECT( discOpenPanel, mrlUpdated( QStringList, QString ), + this, updateMRL( const QStringList&, const QString& ) ); + CONNECT( captureOpenPanel, mrlUpdated( QStringList, QString ), + this, updateMRL( const QStringList&, const QString& ) ); CONNECT( fileOpenPanel, methodChanged( QString ), - this, newCachingMethod( QString ) ); + this, newCachingMethod( const QString& ) ); CONNECT( netOpenPanel, methodChanged( QString ), - this, newCachingMethod( QString ) ); + this, newCachingMethod( const QString& ) ); CONNECT( discOpenPanel, methodChanged( QString ), - this, newCachingMethod( QString ) ); + this, newCachingMethod( const QString& ) ); CONNECT( captureOpenPanel, methodChanged( QString ), - this, newCachingMethod( QString ) ); + this, newCachingMethod( const QString& ) ); /* Advanced frame Connects */ + CONNECT( ui.slaveCheckbox, toggled( bool ), this, updateMRL() ); CONNECT( ui.slaveText, textChanged( QString ), this, updateMRL() ); CONNECT( ui.cacheSpinBox, valueChanged( int ), this, updateMRL() ); CONNECT( ui.startTimeSpinBox, valueChanged( int ), this, updateMRL() ); @@ -170,7 +183,9 @@ OpenDialog::OpenDialog( QWidget *parent, storedMethod = ""; newCachingMethod( "file-caching" ); - resize( getSettings()->value( "opendialog-size", QSize( 520, 490 ) ).toSize() ); + setMinimumSize( sizeHint() ); + setMaximumWidth( 900 ); + resize( getSettings()->value( "opendialog-size", QSize( 500, 490 ) ).toSize() ); } OpenDialog::~OpenDialog() @@ -178,6 +193,14 @@ OpenDialog::~OpenDialog() getSettings()->setValue( "opendialog-size", size() ); } +/* Used by VLM dialog and inputSlave selection */ +QString OpenDialog::getMRL( bool b_all ) +{ + if( itemsMRL.size() == 0 ) return ""; + return b_all ? itemsMRL[0] + ui.advancedLineInput->text() + : itemsMRL[0]; +} + /* Finish the dialog and decide if you open another one after */ void OpenDialog::setMenuAction() { @@ -231,7 +254,6 @@ void OpenDialog::toggleAdvancedPanel() if( ui.advancedFrame->isVisible() ) { ui.advancedFrame->hide(); - //setMinimumSize( 520, 460 ); if( size().isValid() ) resize( size().width(), size().height() - ui.advancedFrame->height() ); @@ -239,7 +261,6 @@ void OpenDialog::toggleAdvancedPanel() else { ui.advancedFrame->show(); - //setMinimumSize( 520, 460 + ui.advancedFrame->height() ); if( size().isValid() ) resize( size().width(), size().height() + ui.advancedFrame->height() ); @@ -257,8 +278,8 @@ void OpenDialog::cancel() dynamic_cast( ui.Tab->widget( i ) )->clear(); /* Clear the variables */ - mrl.clear(); - mainMRL.clear(); + itemsMRL.clear(); + optionsMRL.clear(); /* If in Select Mode, reject instead of hiding */ if( i_action_flag == SELECT ) reject(); @@ -309,35 +330,56 @@ void OpenDialog::enqueue() void OpenDialog::finish( bool b_enqueue = false ) { toggleVisible(); - mrl = ui.advancedLineInput->text(); - if( i_action_flag != SELECT ) + 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; + accept(); + return; + } + + /* Sort alphabetically */ + itemsMRL.sort(); + + /* Go through the item list */ + for( int i = 0; i < itemsMRL.size(); i++ ) + { + bool b_start = !i && !b_enqueue; - p_input = input_item_New( p_intf, qtu( tempMRL[i] ), NULL ); + input_item_t *p_input; + p_input = input_item_New( p_intf, qtu( itemsMRL[i] ), NULL ); + + /* Insert options only for the first element. + We don't know how to edit that anyway. */ + if( i == 0 ) + { + /* Take options from the UI, not from what we stored */ + QStringList optionsList = ui.advancedLineInput->text().split( " :" ); /* Insert options */ - while( i + 1 < tempMRL.size() && tempMRL[i + 1].startsWith( ":" ) ) + for( int j = 0; j < optionsList.size(); j++ ) { - i++; - input_item_AddOption( p_input, qtu( tempMRL[i] ) ); + QString qs = colon_unescape( optionsList[j] ); + if( !qs.isEmpty() ) + { + input_item_AddOption( p_input, qtu( qs ), + VLC_INPUT_OPTION_TRUSTED ); +#ifdef DEBUG_QT + msg_Warn( p_intf, "Input option: %s", qtu( qs ) ); +#endif + } } + } - /* Switch between enqueuing and starting the item */ - /* FIXME: playlist_AddInput() can fail */ - playlist_AddInput( THEPL, p_input, + /* 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 ); - } + PLAYLIST_END, b_pl ? true : false, pl_Unlocked ); + vlc_gc_decref( p_input ); + + /* Do not add the current MRL if playlist_AddInput fail */ + RecentsMRL::getInstance( p_intf )->addRecent( itemsMRL[i] ); } - else - accept(); } void OpenDialog::transcode() @@ -347,47 +389,30 @@ void OpenDialog::transcode() void OpenDialog::stream( bool b_transcode_only ) { - mrl = ui.advancedLineInput->text(); + QString soutMRL = getMRL( false ); + if( soutMRL.isEmpty() ) return; toggleVisible(); - /* Separate the entries */ - QStringList listMRL = SeparateEntries( mrl ); - - /* We can only take the first entry since we have no idea what - to do with many files ? Gather ? */ - if( listMRL.size() > 0 ) - { - /* First item */ - QString soutMRL = listMRL[0]; - - /* Keep all the :xxx options because they are needed see v4l and dshow */ - for( int i = 1; i < listMRL.size(); i++ ) - { - if( listMRL[i].at( 0 ) == ':' ) - soutMRL.append( " " + listMRL[i] ); - else - break; - } - - /* Dbg and send :D */ - msg_Dbg( p_intf, "MRL passed to the Sout: %s", qtu( soutMRL ) ); - THEDP->streamingDialog( this, soutMRL, b_transcode_only ); - } + /* Dbg and send :D */ + msg_Dbg( p_intf, "MRL passed to the Sout: %s", qtu( soutMRL ) ); + THEDP->streamingDialog( this, soutMRL, b_transcode_only, + ui.advancedLineInput->text().split( ":" ) ); } /* Update the MRL */ -void OpenDialog::updateMRL( QString tempMRL ) +void OpenDialog::updateMRL( const QStringList& item, const QString& tempMRL ) { - mainMRL = tempMRL; + optionsMRL = tempMRL; + itemsMRL = item; updateMRL(); } void OpenDialog::updateMRL() { - mrl = mainMRL; + QString mrl = optionsMRL; 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, qtu( storedMethod ) ); if( i_cache != ui.cacheSpinBox->value() ) { mrl += QString( " :%1=%2" ).arg( storedMethod ). arg( ui.cacheSpinBox->value() ); @@ -397,18 +422,19 @@ void OpenDialog::updateMRL() { arg( ui.startTimeSpinBox->value() ); } ui.advancedLineInput->setText( mrl ); + ui.mrlLine->setText( itemsMRL.join( " " ) ); } -void OpenDialog::newCachingMethod( QString method ) +void OpenDialog::newCachingMethod( const QString& method ) { if( method != storedMethod ) { storedMethod = method; - int i_value = config_GetInt( p_intf, qta( storedMethod ) ); + int i_value = config_GetInt( p_intf, qtu( storedMethod ) ); ui.cacheSpinBox->setValue( i_value ); } } -QStringList OpenDialog::SeparateEntries( QString entries ) +QStringList OpenDialog::SeparateEntries( const QString& entries ) { bool b_quotes_mode = false; @@ -460,6 +486,6 @@ void OpenDialog::browseInputSlave() { OpenDialog *od = new OpenDialog( this, p_intf, true, SELECT ); od->exec(); - ui.slaveText->setText( od->getMRL() ); + ui.slaveText->setText( od->getMRL( false ) ); delete od; }