]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/recents.cpp
Qt: correctly handle Unicode in Win7 jump lists
[vlc] / modules / gui / qt4 / recents.cpp
index 46a1fa00516bd4b07a0914c3403d2fc7d892d3eb..5112c99f7f0d09efb9d7c36a8067b4707bfbaad7 100644 (file)
 
 #include "recents.hpp"
 #include "dialogs_provider.hpp"
+#include "menus.hpp"
 
-#include <QList>
-#include <QString>
+#include <QStringList>
 #include <QAction>
 #include <QSettings>
 #include <QRegExp>
 #include <QSignalMapper>
 
+#ifdef WIN32
+    #include <shlobj.h>
+    /* typedef enum  {
+        SHARD_PIDL              = 0x00000001,
+        SHARD_PATHA             = 0x00000002,
+        SHARD_PATHW             = 0x00000003,
+        SHARD_APPIDINFO         = 0x00000004,
+        SHARD_APPIDINFOIDLIST   = 0x00000005,
+        SHARD_LINK              = 0x00000006,
+        SHARD_APPIDINFOLINK     = 0x00000007,
+        SHARD_SHELLITEM         = 0x00000008 
+    } SHARD; */
+    #define SHARD_PATHW 0x00000003
+#endif
+
+
 RecentsMRL* RecentsMRL::instance = NULL;
 
 RecentsMRL::RecentsMRL( intf_thread_t *_p_intf ) : p_intf( _p_intf )
 {
-    stack = new QList<QString>;
-    signalMapper = new QSignalMapper(this);
+    stack = new QStringList;
+
+    signalMapper = new QSignalMapper( this );
     CONNECT( signalMapper,
             mapped(const QString & ),
             DialogsProvider::getInstance( p_intf ),
             playMRL( const QString & ) );
 
-    isActive = config_GetInt( p_intf, "qt-recentplay" );
-    filter = new QRegExp(
-            qfu( config_GetPsz( p_intf, "qt-recentplay-filter" ) ),
-            Qt::CaseInsensitive );
+    /* Load the filter psz */
+    char* psz_tmp = var_InheritString( p_intf, "qt-recentplay-filter" );
+    if( psz_tmp && *psz_tmp )
+        filter = new QRegExp( psz_tmp, Qt::CaseInsensitive );
+    else
+        filter = NULL;
+    free( psz_tmp );
 
     load();
-    if ( !isActive ) clear();
+    isActive = var_InheritBool( p_intf, "qt-recentplay" );
+    if( !isActive ) clear();
 }
 
 RecentsMRL::~RecentsMRL()
 {
+    delete filter;
     delete stack;
 }
 
 void RecentsMRL::addRecent( const QString &mrl )
 {
-    if ( !isActive || filter->indexIn( mrl ) >= 0 )
+    if ( !isActive || ( filter && filter->indexIn( mrl ) >= 0 ) )
         return;
 
     msg_Dbg( p_intf, "Adding a new MRL to recent ones: %s", qtu( mrl ) );
+
+#ifdef WIN32
+    /* Add to the Windows 7 default list in taskbar */
+    SHAddToRecentDocs( SHARD_PATHW, qtu( mrl ) );
+#endif
+
     int i_index = stack->indexOf( mrl );
     if( 0 <= i_index )
     {
@@ -75,7 +103,7 @@ void RecentsMRL::addRecent( const QString &mrl )
         if( stack->size() > RECENTS_LIST_SIZE )
             stack->takeLast();
     }
-    emit updated();
+    QVLCMenu::updateRecents( p_intf );
     save();
 }
 
@@ -83,34 +111,32 @@ void RecentsMRL::clear()
 {
     if ( stack->isEmpty() )
         return;
+
     stack->clear();
-    emit updated();
+    if( isActive ) QVLCMenu::updateRecents( p_intf );
     save();
 }
 
-QList<QString> RecentsMRL::recents()
+QStringList RecentsMRL::recents()
 {
-    return QList<QString>(*stack);
+    return *stack;
 }
 
 void RecentsMRL::load()
 {
+    /* Load from the settings */
     QStringList list = getSettings()->value( "RecentsMRL/list" ).toStringList();
 
+    /* And filter the regexp on the list */
     for( int i = 0; i < list.size(); ++i )
     {
-        if (filter->indexIn( list.at(i) ) == -1)
+        if ( !filter || filter->indexIn( list.at(i) ) == -1 )
             stack->append( list.at(i) );
     }
 }
 
 void RecentsMRL::save()
 {
-    QStringList list;
-
-    for( int i = 0; i < stack->size(); ++i )
-        list << stack->at(i);
-
-    getSettings()->setValue( "RecentsMRL/list", list );
+    getSettings()->setValue( "RecentsMRL/list", *stack );
 }