]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/dialogs_provider.cpp
New recently played menu.
[vlc] / modules / gui / qt4 / dialogs_provider.cpp
index 2bb90cb899571140f04bd9a2a9550b16aae83425..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,7 +84,6 @@ DialogsProvider::~DialogsProvider()
     UpdateDialog::killInstance();
 #endif
 
-    fixed_timer->stop();
     delete menusMapper;
     delete menusUpdateMapper;
     delete SDMapper;
@@ -92,6 +91,9 @@ DialogsProvider::~DialogsProvider()
 
 void DialogsProvider::quit()
 {
+    /* Stop the playlist */
+    playlist_Stop( THEPL );
+    b_isDying = true;
     vlc_object_kill( p_intf->p_libvlc );
     QApplication::closeAllWindows();
     QApplication::quit();
@@ -275,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;
@@ -289,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 */
@@ -332,9 +334,12 @@ 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
@@ -361,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 );
 }
 
@@ -378,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++;
     }
 }
@@ -412,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_item_NewExt( 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 );
@@ -442,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 (*.*) " ) );
@@ -486,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;
@@ -514,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 );
     }
 }
 
@@ -613,15 +632,30 @@ void DialogsProvider::loadSubtitlesFile()
     char *sep = strrchr( path, DIR_SEP_CHAR );
     if( sep )
         *sep = '\0';
-    QStringList qsl = showSimpleOpen( qtr( "Open subtitles file" ),
+    QStringList qsl = showSimpleOpen( qtr( "Open subtitles..." ),
                                       EXT_FILTER_SUBTITLE,
                                       path );
     free( path );
     QString qsFile;
     foreach( qsFile, qsl )
     {
-        if( !input_AddSubtitles( p_input, qtu( qsFile ), true ) )
+        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 );
+}