]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/menus.cpp
Qt: fix a leaking QSignalmapper in PL
[vlc] / modules / gui / qt4 / menus.cpp
index 96a2395f54b45607559b904efd0b16065bbf8ba3..28be14dafca37eebbcbb08fb169824ecf392dfe4 100644 (file)
@@ -34,6 +34,7 @@
 #include <vlc_intf_strings.h>
 #include <vlc_services_discovery.h>
 #include <vlc_aout.h>
+#include <vlc_vout.h>
 
 #include "menus.hpp"
 
@@ -42,6 +43,7 @@
 #include "input_manager.hpp"     /* Input Management */
 #include "recents.hpp"           /* Recent Items */
 #include "actions_manager.hpp"
+#include "extensions_manager.hpp"
 
 #include <QMenu>
 #include <QMenuBar>
@@ -219,8 +221,8 @@ static int VideoAutoMenuBuilder( vout_thread_t *p_object,
     PUSH_INPUTVAR( "spu-es" );
     PUSH_VAR( "fullscreen" );
     PUSH_VAR( "video-on-top" );
+    PUSH_VAR( "video-wallpaper" );
 #ifdef WIN32
-    PUSH_VAR( "directx-wallpaper" );
     PUSH_VAR( "direct3d-desktop" );
 #endif
     PUSH_VAR( "video-snapshot" );
@@ -229,6 +231,7 @@ static int VideoAutoMenuBuilder( vout_thread_t *p_object,
     PUSH_VAR( "aspect-ratio" );
     PUSH_VAR( "crop" );
     PUSH_VAR( "deinterlace" );
+    PUSH_VAR( "deinterlace-mode" );
     PUSH_VAR( "postprocess" );
 
     return VLC_SUCCESS;
@@ -291,7 +294,7 @@ void QVLCMenu::createMenuBar( MainInterface *mi,
     BAR_DADD( VideoMenu( p_intf, bar ), qtr( "&Video" ), 2 );
 
     BAR_ADD( ToolsMenu( bar ), qtr( "&Tools" ) );
-    BAR_ADD( ViewMenu( p_intf, mi ), qtr( "V&iew" ) );
+    BAR_ADD( ViewMenu( p_intf, bar ), qtr( "V&iew" ) );
     BAR_ADD( HelpMenu( bar ), qtr( "&Help" ) );
 }
 #undef BAR_ADD
@@ -323,13 +326,12 @@ QMenu *QVLCMenu::FileMenu( intf_thread_t *p_intf, QWidget *parent )
     addDPStaticEntry( menu, qtr( "Open &Location from clipboard" ),
                       NULL, SLOT( openUrlDialog() ), "Ctrl+V" );
 
-    if( config_GetInt( p_intf, "qt-recentplay" ) )
+    if( var_InheritBool( p_intf, "qt-recentplay" ) )
     {
         recentsMenu = new QMenu( qtr( "&Recent Media" ), menu );
         updateRecents( p_intf );
         menu->addMenu( recentsMenu );
     }
-    menu->addMenu( SDMenu( p_intf, menu ) );
     menu->addSeparator();
 
     addDPStaticEntry( menu, qtr( I_PL_SAVE ), "", SLOT( saveAPlaylist() ),
@@ -373,6 +375,9 @@ QMenu *QVLCMenu::ToolsMenu( QMenu *menu )
         "Ctrl+W" );
 #endif
 
+    addDPStaticEntry( menu, qtr( "Program Guide" ), "", SLOT( epgDialog() ),
+        "" );
+
     addDPStaticEntry( menu, qtr( I_MENU_MSG ),
         ":/menu/messages", SLOT( messagesDialog() ),
         "Ctrl+M" );
@@ -392,19 +397,42 @@ QMenu *QVLCMenu::ToolsMenu( QWidget *parent )
     return ToolsMenu( new QMenu( parent ) );
 }
 
+/**
+ * Dynamic View Menu
+ * Connect signal "aboutToShow" to the creation of the View Menu
+ **/
+QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf, QWidget* parent )
+{
+    QMenu *viewMenu = new QMenu( parent );
+    MenuFunc *f = new MenuFunc( viewMenu, 4 );
+    CONNECT( viewMenu, aboutToShow(), THEDP->menusUpdateMapper, map() );
+    THEDP->menusUpdateMapper->setMapping( viewMenu, f );
+    return viewMenu;
+}
+
 /**
  * View Menu
- * Interface Modification
+ * Interface modification, load other interfaces, activate Extensions
  **/
 QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf,
-                            MainInterface *mi,
-                            bool with_intf )
+                           QMenu *current,
+                           bool with_intf )
 {
-    assert( mi );
+    QAction *action;
 
-    QMenu *menu = new QMenu( qtr( "V&iew" ), mi );
+    QMenu *menu;
+    if( !with_intf )
+        menu = new QMenu( qtr( "&View" ), current );
+    else
+    {
+        menu = current;
+        menu->clear();
+    }
 
-    QAction *act = menu->addAction( QIcon( ":/menu/playlist_menu" ),
+    MainInterface *mi = p_intf->p_sys->p_mi;
+    assert( mi );
+
+    menu->addAction( QIcon( ":/menu/playlist_menu" ),
             qtr( "Play&list" ), mi,
             SLOT( togglePlaylist() ), qtr( "Ctrl+L" ) );
 
@@ -417,14 +445,11 @@ QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf,
     if( with_intf )
     {
         QMenu *intfmenu = InterfacesMenu( p_intf, menu );
-        MenuFunc *f = new MenuFunc( intfmenu, 4 );
-        CONNECT( intfmenu, aboutToShow(), THEDP->menusUpdateMapper, map() );
-        THEDP->menusUpdateMapper->setMapping( intfmenu, f );
         menu->addSeparator();
     }
 
     /* Minimal View */
-    QAction *action = menu->addAction( qtr( "Mi&nimal View" ) );
+    action = menu->addAction( qtr( "Mi&nimal View" ) );
     action->setShortcut( qtr( "Ctrl+H" ) );
     action->setCheckable( true );
     action->setChecked( !with_intf &&
@@ -466,7 +491,9 @@ QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf,
     menu->addSeparator();
     addDPStaticEntry( menu, qtr( "Customi&ze Interface..." ),
         ":/menu/preferences", SLOT( toolbarDialog() ) );
-    menu->addSeparator();
+
+    /* Extensions */
+    ExtensionsMenu( p_intf, menu );
 
     return menu;
 }
@@ -484,6 +511,30 @@ QMenu *QVLCMenu::InterfacesMenu( intf_thread_t *p_intf, QMenu *current )
     return Populate( p_intf, current, varnames, objects );
 }
 
+/**
+ * Extensions menu: populate the current menu with extensions
+ **/
+void QVLCMenu::ExtensionsMenu( intf_thread_t *p_intf, QMenu *extMenu )
+{
+    /* Get ExtensionsManager and load extensions if needed */
+    ExtensionsManager *extMgr = ExtensionsManager::getInstance( p_intf );
+
+    if( !var_InheritBool( p_intf, "qt-autoload-extensions")
+        && !extMgr->isLoaded() )
+    {
+        return;
+    }
+
+    if( !extMgr->isLoaded() && !extMgr->cannotLoad() )
+    {
+        extMgr->loadExtensions();
+    }
+
+    /* Let the ExtensionsManager build itself the menu */
+    extMenu->addSeparator();
+    extMgr->menu( extMenu );
+}
+
 /**
  * Main Audio Menu
  **/
@@ -558,8 +609,8 @@ QMenu *QVLCMenu::VideoMenu( intf_thread_t *p_intf, QMenu *current )
 
         ACT_ADDCHECK( current, "fullscreen", qtr( "&Fullscreen" ) );
         ACT_ADDCHECK( current, "video-on-top", qtr( "Always &On Top" ) );
+        ACT_ADDCHECK( current, "video-wallpaper", qtr( "DirectX Wallpaper" ) );
 #ifdef WIN32
-        ACT_ADDCHECK( current, "directx-wallpaper", qtr( "DirectX Wallpaper" ) );
         ACT_ADDCHECK( current, "direct3d-desktop", qtr( "Direct3D Desktop mode" ) );
 #endif
         ACT_ADD( current, "video-snapshot", qtr( "Sna&pshot" ) );
@@ -571,6 +622,7 @@ QMenu *QVLCMenu::VideoMenu( intf_thread_t *p_intf, QMenu *current )
         ACT_ADDMENU( current, "aspect-ratio", qtr( "&Aspect Ratio" ) );
         ACT_ADDMENU( current, "crop", qtr( "&Crop" ) );
         ACT_ADDMENU( current, "deinterlace", qtr( "&Deinterlace" ) );
+        ACT_ADDMENU( current, "deinterlace-mode", qtr( "&Deinterlace mode" ) );
         ACT_ADDMENU( current, "postprocess", qtr( "&Post processing" ) );
     }
 
@@ -656,22 +708,13 @@ QMenu *QVLCMenu::SDMenu( intf_thread_t *p_intf, QWidget *parent )
     menu->setTitle( qtr( I_PL_SD ) );
 
     char **ppsz_longnames;
-    char **ppsz_names = vlc_sd_GetNames( &ppsz_longnames );
+    char **ppsz_names = vlc_sd_GetNames( p_intf, &ppsz_longnames );
     if( !ppsz_names )
         return menu;
 
     char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames;
     for( ; *ppsz_name; ppsz_name++, ppsz_longname++ )
     {
-        QAction *a = new QAction( qfu( *ppsz_longname ), menu );
-        a->setCheckable( true );
-        if( playlist_IsServicesDiscoveryLoaded( THEPL, *ppsz_name ) )
-            a->setChecked( true );
-        CONNECT( a, triggered(), THEDP->SDMapper, map() );
-        THEDP->SDMapper->setMapping( a, QString( *ppsz_name ) );
-        menu->addAction( a );
-
-        /* Special case for podcast */
         if( !strcmp( *ppsz_name, "podcast" ) )
         {
             QAction *b = new QAction( qtr( "Configure podcasts..." ), menu );
@@ -967,7 +1010,7 @@ void QVLCMenu::PopupMenu( intf_thread_t *p_intf, bool show )
     if( !b_isFullscreen )
     {
         QMenu *submenu = new QMenu( qtr( "Interface" ), menu );
-        QMenu *tools = ToolsMenu( submenu );
+        /*QMenu *tools =*/ ToolsMenu( submenu );
         submenu->addSeparator();
 
         /* In skins interface, append some items */
@@ -991,7 +1034,7 @@ void QVLCMenu::PopupMenu( intf_thread_t *p_intf, bool show )
                 msg_Warn( p_intf, "could not find parent interface" );
         }
         else
-            menu->addMenu( ViewMenu( p_intf, mi, false ));
+            menu->addMenu( ViewMenu( p_intf, menu, false ));
 
         menu->addMenu( submenu );
     }
@@ -1007,6 +1050,7 @@ void QVLCMenu::PopupMenu( intf_thread_t *p_intf, bool show )
 #undef ACT_ADDMENU
 #undef ACT_ADDCHECK
 
+#ifndef HAVE_MAEMO
 /************************************************************************
  * Systray Menu                                                         *
  ************************************************************************/
@@ -1049,6 +1093,7 @@ void QVLCMenu::updateSystrayMenu( MainInterface *mi,
     /* Set the menu */
     mi->getSysTray()->setContextMenu( sysMenu );
 }
+#endif
 
 #undef CREATE_POPUP
 #undef POPUP_BOILERPLATE
@@ -1421,11 +1466,11 @@ void QVLCMenu::DoAction( QObject *data )
 
 void QVLCMenu::updateRecents( intf_thread_t *p_intf )
 {
-    if (recentsMenu)
+    if( recentsMenu )
     {
         QAction* action;
         RecentsMRL* rmrl = RecentsMRL::getInstance( p_intf );
-        QList<QString> l = rmrl->recents();
+        QStringList l = rmrl->recents();
 
         recentsMenu->clear();
 
@@ -1440,8 +1485,8 @@ void QVLCMenu::updateRecents( intf_thread_t *p_intf )
             {
                 action = recentsMenu->addAction(
                         QString( "&%1: " ).arg( i + 1 ) + l.at( i ),
-                        rmrl->signalMapper,
-                        SLOT( map() ) );
+                        rmrl->signalMapper, SLOT( map() ),
+                        i <= 9 ? QString( "Ctrl+%1" ).arg( i + 1 ) : "" );
                 rmrl->signalMapper->setMapping( action, l.at( i ) );
             }