X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fdialogs_provider.cpp;h=93bfe8cfae911c006f74c74a2e0237d62dd3128a;hb=924bda6286af1120d86a3b70f98aa06e1c7106ae;hp=67002ded710c7ee1bbdb586c06113c1aaa93f160;hpb=e825ac8648c1bf443f0778491a19488d407fc4f6;p=vlc diff --git a/modules/gui/qt4/dialogs_provider.cpp b/modules/gui/qt4/dialogs_provider.cpp index 67002ded71..93bfe8cfae 100644 --- a/modules/gui/qt4/dialogs_provider.cpp +++ b/modules/gui/qt4/dialogs_provider.cpp @@ -104,6 +104,8 @@ void DialogsProvider::customEvent( QEvent *event ) case INTF_DIALOG_FILE_SIMPLE: case INTF_DIALOG_FILE: openDialog(); break; + case INTF_DIALOG_FILE_GENERIC: + openFileGenericDialog( de->p_arg ); break; case INTF_DIALOG_DISC: openDiscDialog(); break; case INTF_DIALOG_NET: @@ -240,6 +242,69 @@ void DialogsProvider::openDialog() { openDialog( OPEN_FILE_TAB ); } +void DialogsProvider::openFileGenericDialog( intf_dialog_args_t *p_arg ) +{ + if( p_arg == NULL ) + { + msg_Warn( p_intf, "openFileGenericDialog() called with NULL arg" ); + return; + } + + /* Replace the extensions to a Qt format */ + int i = 0; + QString extensions = qfu( p_arg->psz_extensions ); + while ( ( i = extensions.indexOf( "|", i ) ) != -1 ) + { + if( ( extensions.count( "|" ) % 2 ) == 0 ) + extensions.replace( i, 1, ");;" ); + else + extensions.replace( i, 1, "(" ); + } + extensions.replace(QString(";*"), QString(" *")); + extensions.append( ")" ); + + /* Save */ + if( p_arg->b_save ) + { + QString file = QFileDialog::getSaveFileName( NULL, p_arg->psz_title, + qfu( p_intf->p_sys->psz_filepath ), extensions ); + if( !file.isEmpty() ) + { + p_arg->i_results = 1; + p_arg->psz_results = (char **)malloc( p_arg->i_results * sizeof( char * ) ); + p_arg->psz_results[0] = strdup( qtu( file ) ); + } + else + p_arg->i_results = 0; + } + else /* non-save mode */ + { + QStringList files = QFileDialog::getOpenFileNames( NULL, + p_arg->psz_title, qfu( p_intf->p_sys->psz_filepath ), + extensions ); + p_arg->i_results = files.count(); + p_arg->psz_results = (char **)malloc( p_arg->i_results * sizeof( char * ) ); + i = 0; + foreach( QString file, files ) + p_arg->psz_results[i++] = strdup( qtu( file ) ); + } + + /* Callback */ + if( p_arg->pf_callback ) + p_arg->pf_callback( p_arg ); + + /* Clean afterwards */ + if( p_arg->psz_results ) + { + for( i = 0; i < p_arg->i_results; i++ ) + free( p_arg->psz_results[i] ); + free( p_arg->psz_results ); + } + free( p_arg->psz_title ); + free( p_arg->psz_extensions ); + free( p_arg ); +} + void DialogsProvider::openFileDialog() { openDialog( OPEN_FILE_TAB ); @@ -260,7 +325,7 @@ void DialogsProvider::openCaptureDialog() /* Same as the open one, but force the enqueue */ void DialogsProvider::PLAppendDialog() { - OpenDialog::getInstance( p_intf->p_sys->p_mi , p_intf, OPEN_AND_ENQUEUE) + OpenDialog::getInstance( p_intf->p_sys->p_mi, p_intf, false, OPEN_AND_ENQUEUE) ->showTab( OPEN_FILE_TAB ); } @@ -270,8 +335,6 @@ void DialogsProvider::MLAppendDialog() /** * Simple open - * Not used anymore. Let the code until we are sure we don't want it - * Two opens make it confusing for the user. ***/ QStringList DialogsProvider::showSimpleOpen( QString help, int filters, @@ -346,7 +409,7 @@ void DialogsProvider::simpleMLAppendDialog() **/ static void openDirectory( intf_thread_t *p_intf, bool pl, bool go ) { - QString dir = QFileDialog::getExistingDirectory( 0, qtr(I_OP_OPDIR) ); + QString dir = QFileDialog::getExistingDirectory( 0, qtr("Open Directory") ); if (!dir.isEmpty()) { input_item_t *p_input = input_ItemNewExt( THEPL, qtu( "directory://" + dir ), NULL, @@ -355,7 +418,7 @@ static void openDirectory( intf_thread_t *p_intf, bool pl, bool go ) /* FIXME: playlist_AddInput() can fail */ playlist_AddInput( THEPL, p_input, go ? ( PLAYLIST_APPEND | PLAYLIST_GO ) : PLAYLIST_APPEND, - PLAYLIST_END, pl, false ); + PLAYLIST_END, pl, pl_Unlocked ); input_Read( THEPL, p_input, false ); vlc_gc_decref( p_input ); } @@ -447,20 +510,20 @@ void DialogsProvider::streamingDialog( QWidget *parent, QString mrl, playlist_AddExt( THEPL, qtu( mrl ), "Streaming", PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END, - -1, &psz_option, 1, true, false ); + -1, &psz_option, 1, true, pl_Unlocked ); } } void DialogsProvider::openThenStreamingDialogs() { - OpenDialog::getInstance( p_intf->p_sys->p_mi , p_intf, OPEN_AND_STREAM ) - ->showTab( 0 ); + OpenDialog::getInstance( p_intf->p_sys->p_mi, p_intf, false, OPEN_AND_STREAM ) + ->showTab( OPEN_FILE_TAB ); } void DialogsProvider::openThenTranscodingDialogs() { - OpenDialog::getInstance( p_intf->p_sys->p_mi , p_intf, OPEN_AND_SAVE ) - ->showTab( 0 ); + OpenDialog::getInstance( p_intf->p_sys->p_mi , p_intf, false, OPEN_AND_SAVE ) + ->showTab( OPEN_FILE_TAB ); } /**************************************************************************** @@ -536,12 +599,24 @@ void DialogsProvider::loadSubtitlesFile() input_thread_t *p_input = THEMIM->getInput(); if( !p_input ) return; - QString qsFile = QFileDialog::getOpenFileName( - NULL, - qtr( "Choose subtitles file" ), - "", - qtr( "Subtitles files (*.cdg *.idx *.srt *.sub *.utf);;" - "All files (*)" ) ); - if( !input_AddSubtitles( p_input, qtu( qsFile ), true ) ) - msg_Warn( p_intf, "unable to load subtitles file..." ); + input_item_t *p_item = input_GetItem( p_input ); + if( !p_item ) + return; + char *path = input_item_GetURI( p_item ); + if( !path ) + path = strdup( "" ); + char *sep = strrchr( path, DIR_SEP_CHAR ); + if( sep ) + *sep = '\0'; + QStringList qsl = showSimpleOpen( qtr( "Open subtitles file" ), + EXT_FILTER_SUBTITLE, + path ); + free( path ); + QString qsFile; + foreach( qsFile, qsl ) + { + if( !input_AddSubtitles( p_input, qtu( qsFile ), true ) ) + msg_Warn( p_intf, "unable to load subtitles from '%s'", + qtu( qsFile ) ); + } }