]> 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 5bb55b4b70b2f0e75ffeb78aceaeb271d05aa667..28be14dafca37eebbcbb08fb169824ecf392dfe4 100644 (file)
@@ -43,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>
@@ -220,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" );
@@ -293,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
@@ -325,7 +326,7 @@ 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 );
@@ -374,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" );
@@ -393,19 +397,40 @@ 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 )
 {
     QAction *action;
 
-    assert( mi );
+    QMenu *menu;
+    if( !with_intf )
+        menu = new QMenu( qtr( "&View" ), current );
+    else
+    {
+        menu = current;
+        menu->clear();
+    }
 
-    QMenu *menu = new QMenu( qtr( "V&iew" ), mi );
+    MainInterface *mi = p_intf->p_sys->p_mi;
+    assert( mi );
 
     menu->addAction( QIcon( ":/menu/playlist_menu" ),
             qtr( "Play&list" ), mi,
@@ -420,9 +445,6 @@ 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();
     }
 
@@ -469,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;
 }
@@ -487,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
  **/
@@ -561,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" ) );
@@ -660,7 +708,7 @@ 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;
 
@@ -986,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 );
     }