]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/dialogs_provider.cpp
New recently played menu.
[vlc] / modules / gui / qt4 / dialogs_provider.cpp
index 22c81fed2e22d0750028ec104c13bfb6a62ef909..53970ecf119de31146d5e2b4eeedb9e6faf5c1ac 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
- * main_inteface.cpp : Main interface
+ * dialogs_provider.cpp : Dialog Provider
  *****************************************************************************
- * Copyright (C) 2006-2007 the VideoLAN team
+ * Copyright (C) 2006-2008 the VideoLAN team
  * $Id$
  *
  * Authors: ClĂ©ment Stenac <zorglub@videolan.org>
@@ -37,6 +37,7 @@
 #include "menus.hpp"
 #include <vlc_intf_strings.h>
 #include "input_manager.hpp"
+#include "recents.hpp"
 
 /* The dialogs */
 #include "dialogs/playlist.hpp"
@@ -57,8 +58,7 @@ DialogsProvider* DialogsProvider::instance = NULL;
 DialogsProvider::DialogsProvider( intf_thread_t *_p_intf ) :
                                   QObject( NULL ), p_intf( _p_intf )
 {
-    fixed_timer = new QTimer( this );
-    fixed_timer->start( 150 /* milliseconds */ );
+    b_isDying = false;
 
     menusMapper = new QSignalMapper();
     CONNECT( menusMapper, mapped(QObject *), this, menuAction( QObject *) );
@@ -84,11 +84,16 @@ DialogsProvider::~DialogsProvider()
     UpdateDialog::killInstance();
 #endif
 
-    fixed_timer->stop();
+    delete menusMapper;
+    delete menusUpdateMapper;
+    delete SDMapper;
 }
 
 void DialogsProvider::quit()
 {
+    /* Stop the playlist */
+    playlist_Stop( THEPL );
+    b_isDying = true;
     vlc_object_kill( p_intf->p_libvlc );
     QApplication::closeAllWindows();
     QApplication::quit();
@@ -272,7 +277,7 @@ void DialogsProvider::openFileGenericDialog( intf_dialog_args_t *p_arg )
         {
             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 ) );
+            p_arg->psz_results[0] = strdup( qtu( toNativeSepNoSlash( file ) ) );
         }
         else
             p_arg->i_results = 0;
@@ -286,7 +291,7 @@ void DialogsProvider::openFileGenericDialog( intf_dialog_args_t *p_arg )
         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 ) );
+            p_arg->psz_results[i++] = strdup( qtu( toNativeSepNoSlash( file ) ) );
     }
 
     /* Callback */
@@ -329,14 +334,15 @@ void DialogsProvider::PLAppendDialog()
                             ->showTab( OPEN_FILE_TAB );
 }
 
-/* Unimplemmented yet - Usefull ? */
 void DialogsProvider::MLAppendDialog()
-{}
+{
+    OpenDialog::getInstance( p_intf->p_sys->p_mi, p_intf, false,
+                            OPEN_AND_ENQUEUE, false, false )
+                                    ->showTab( OPEN_FILE_TAB );
+}
 
 /**
  * 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,
@@ -360,9 +366,10 @@ QStringList DialogsProvider::showSimpleOpen( QString help,
     }
     ADD_FILTER_ALL( fileTypes );
     fileTypes.replace(QString(";*"), QString(" *"));
+
     return QFileDialog::getOpenFileNames( NULL,
-        help.isNull() ? qfu(I_OP_SEL_FILES ) : help,
-        path.isNull() ? qfu( p_intf->p_sys->psz_filepath ) : path,
+        help.isEmpty() ? qfu(I_OP_SEL_FILES ) : help,
+        path.isEmpty() ? qfu( p_intf->p_sys->psz_filepath ) : path,
         fileTypes );
 }
 
@@ -377,13 +384,14 @@ void DialogsProvider::addFromSimple( bool pl, bool go)
     int i = 0;
     foreach( QString file, files )
     {
-        const char * psz_utf8 = qtu( file );
-        playlist_Add( THEPL, psz_utf8, NULL,
+        playlist_Add( THEPL, qtu( toNativeSeparators( file ) ), NULL,
                       go ? ( PLAYLIST_APPEND | ( i ? 0 : PLAYLIST_GO ) |
                                                ( i ? PLAYLIST_PREPARSE : 0 ) )
                          : ( PLAYLIST_APPEND | PLAYLIST_PREPARSE ),
                       PLAYLIST_END,
                       pl ? true : false, false );
+        RecentsMRL::getInstance( p_intf )->addRecent(
+                toNativeSeparators( file ) );
         i++;
     }
 }
@@ -411,21 +419,32 @@ void DialogsProvider::simpleMLAppendDialog()
  **/
 static void openDirectory( intf_thread_t *p_intf, bool pl, bool go )
 {
-    QString dir = QFileDialog::getExistingDirectory( 0, qtr("Open Directory") );
-    if (!dir.isEmpty()) {
-        input_item_t *p_input = input_ItemNewExt( THEPL,
-                                        qtu( "directory://" + dir ), NULL,
-                                        0, NULL, -1 );
+    QString dir = QFileDialog::getExistingDirectory( NULL, qtr("Open Directory") );
+
+    if (!dir.isEmpty() )
+    {
+        QString mrl = dir.endsWith( "VIDEO_TS", Qt::CaseInsensitive )
+            ? "dvd://" : "directory://" + toNativeSeparators( dir );
+        msg_Dbg( p_intf, "Directory opening: %s", qtu( dir ) );
+        input_item_t *p_input = input_item_NewExt( THEPL, qtu( mrl ),
+                              NULL, 0, NULL, -1 );
 
         /* FIXME: playlist_AddInput() can fail */
         playlist_AddInput( THEPL, p_input,
                        go ? ( PLAYLIST_APPEND | PLAYLIST_GO ) : PLAYLIST_APPEND,
                        PLAYLIST_END, pl, pl_Unlocked );
-        input_Read( THEPL, p_input, false );
+        RecentsMRL::getInstance( p_intf )->addRecent( mrl );
+        if( !go )
+            input_Read( THEPL, p_input, true );
         vlc_gc_decref( p_input );
     }
 }
 
+void DialogsProvider::PLOpenDir()
+{
+    openDirectory( p_intf, true, true );
+}
+
 void DialogsProvider::PLAppendDir()
 {
     openDirectory( p_intf, true, false );
@@ -441,18 +460,18 @@ void DialogsProvider::MLAppendDir()
  ****************/
 void DialogsProvider::openAPlaylist()
 {
-    QStringList files = showSimpleOpen( qtr( "Open playlist file" ),
+    QStringList files = showSimpleOpen( qtr( "Open playlist..." ),
                                         EXT_FILTER_PLAYLIST );
     foreach( QString file, files )
     {
-        playlist_Import( THEPL, qtu(file) );
+        playlist_Import( THEPL, qtu( toNativeSeparators( file ) ) );
     }
 }
 
 void DialogsProvider::saveAPlaylist()
 {
     QFileDialog *qfd = new QFileDialog( NULL,
-                                   qtr( "Choose a filename to save playlist" ),
+                                   qtr( "Save playlist as..." ),
                                    qfu( p_intf->p_sys->psz_filepath ),
                                    qtr( "XSPF playlist (*.xspf);; " ) +
                                    qtr( "M3U playlist (*.m3u);; Any (*.*) " ) );
@@ -485,8 +504,8 @@ void DialogsProvider::saveAPlaylist()
                     file.append( ".m3u" );
             }
 
-            playlist_Export( THEPL, qtu( file ), THEPL->p_local_category,
-                             psz_module);
+            playlist_Export( THEPL, qtu( toNativeSeparators( file ) ),
+                        THEPL->p_local_category, psz_module);
         }
     }
     delete qfd;
@@ -513,6 +532,7 @@ void DialogsProvider::streamingDialog( QWidget *parent, QString mrl,
         playlist_AddExt( THEPL, qtu( mrl ), "Streaming",
                          PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END,
                         -1, &psz_option, 1, true, pl_Unlocked );
+        RecentsMRL::getInstance( p_intf )->addRecent( mrl );
     }
 }
 
@@ -582,12 +602,14 @@ void DialogsProvider::doInteraction( intf_dialog_args_t *p_arg )
         }
         break;
     case INTERACT_HIDE:
+        msg_Dbg( p_intf, "Hide the Interaction Dialog" );
         qdialog = (InteractionDialog*)(p_dialog->p_private);
         if( qdialog )
             qdialog->hide();
         p_dialog->i_status = HIDDEN_DIALOG;
         break;
     case INTERACT_DESTROY:
+        msg_Dbg( p_intf, "Destroy the Interaction Dialog" );
         qdialog = (InteractionDialog*)(p_dialog->p_private);
         if( !p_dialog->i_flags & DIALOG_NONBLOCKING_ERROR )
             delete qdialog;
@@ -601,12 +623,39 @@ 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..." ),
+                                      EXT_FILTER_SUBTITLE,
+                                      path );
+    free( path );
+    QString qsFile;
+    foreach( qsFile, qsl )
+    {
+        if( !input_AddSubtitles( p_input, qtu( toNativeSeparators( qsFile ) ),
+                    true ) )
+            msg_Warn( p_intf, "unable to load subtitles from '%s'",
+                      qtu( qsFile ) );
+    }
+}
+
+/**
+ * Play the MRL contained in the Recently played menu.
+ **/
+void DialogsProvider::playMRL( const QString &mrl )
+{
+    input_item_t *p_input = input_item_New( p_intf, 
+            qtu( mrl ), NULL );
+    playlist_AddInput( THEPL, p_input, PLAYLIST_GO,
+            PLAYLIST_END, true, pl_Unlocked );
+    vlc_gc_decref( p_input );
+
+    RecentsMRL::getInstance( p_intf )->addRecent( mrl );
 }