]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/menus.cpp
Qt: v4l2 control: drop v4l2.ui. auto-detect instance.
[vlc] / modules / gui / qt4 / menus.cpp
index 310dcc70046bfbd4a4b3fe12075b00f1652193de..3e682e081984791198296b4e508e1bcaec1d7ba2 100644 (file)
@@ -27,6 +27,9 @@
  * - Remove static currentGroup
  */
 
+#define __STDC_FORMAT_MACROS 1
+#define __STDC_CONSTANT_MACROS 1
+
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
@@ -122,7 +125,7 @@ QAction* addMIMStaticEntry( intf_thread_t *p_intf,
                             bool bStatic = false )
 {
     QAction *action;
-    if( strlen( icon ) > 0 )
+    if( !EMPTY_STR( icon ) )
     {
         action = menu->addAction( text, THEMIM,  member );
         action->setIcon( QIcon( icon ) );
@@ -219,7 +222,6 @@ static int VideoAutoMenuBuilder( vout_thread_t *p_object,
 {
     PUSH_INPUTVAR( "video-es" );
     PUSH_INPUTVAR( "spu-es" );
-#warning This is wrong:
     PUSH_VAR( "fullscreen" );
     PUSH_VAR( "video-on-top" );
     PUSH_VAR( "video-wallpaper" );
@@ -295,8 +297,12 @@ 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, bar ), qtr( "V&iew" ) );
+    QMenu *_menu = ViewMenu( p_intf, bar );
+    _menu->setTitle( qtr( "V&iew" ) );
+    bar->addMenu( _menu );
+    ViewMenu( p_intf, _menu, mi );
     BAR_ADD( HelpMenu( bar ), qtr( "&Help" ) );
+
 }
 #undef BAR_ADD
 #undef BAR_DADD
@@ -415,24 +421,33 @@ QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf, QWidget* parent )
  * View Menu
  * Interface modification, load other interfaces, activate Extensions
  **/
-QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf, QMenu *current )
+QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf, QMenu *current, MainInterface *_mi )
 {
     QAction *action;
     QMenu *menu;
 
+    MainInterface *mi = _mi ? _mi : p_intf->p_sys->p_mi;
+    assert( mi );
+
     if( !current )
     {
-        menu = new QMenu( qtr( "&View" ) );
+        menu = new QMenu( qtr( "&View" ), mi );
     }
     else
     {
         menu = current;
-        menu->clear();
+        //menu->clear();
+        //HACK menu->clear() does not delete submenus
+        QList<QAction*> actions = menu->actions();
+        foreach( QAction *a, actions )
+        {
+            QMenu *m = a->menu();
+            if( a->parent() == menu ) delete a;
+            else menu->removeAction( a );
+            if( m && m->parent() == menu ) delete m;
+        }
     }
 
-    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" ) );
@@ -453,15 +468,15 @@ QMenu *QVLCMenu::ViewMenu( intf_thread_t *p_intf, QMenu *current )
 
     /* FullScreen View */
     action = menu->addAction( qtr( "&Fullscreen Interface" ), mi,
-            SLOT( toggleFullScreen() ), QString( "F11" ) );
+            SLOT( toggleInterfaceFullScreen() ), QString( "F11" ) );
     action->setCheckable( true );
-    action->setChecked( mi->isFullScreen() );
+    action->setChecked( mi->isInterfaceFullScreen() );
     CONNECT( mi, fullscreenInterfaceToggled( bool ),
              action, setChecked( bool ) );
 
     /* Advanced Controls */
     action = menu->addAction( qtr( "&Advanced Controls" ), mi,
-            SLOT( toggleAdvanced() ) );
+            SLOT( toggleAdvancedButtons() ) );
     action->setCheckable( true );
     if( mi->getControlsVisibilityStatus() & CONTROLS_ADVANCED )
         action->setChecked( true );
@@ -751,16 +766,19 @@ QMenu *QVLCMenu::HelpMenu( QWidget *parent )
  * Popup menus - Right Click menus                                           *
  *****************************************************************************/
 #define POPUP_BOILERPLATE \
+    static QMenu* menu = NULL;  \
+    delete menu; menu = NULL; \
+    if( !show ) \
+        return; \
     unsigned int i_last_separator = 0; \
     vector<vlc_object_t *> objects; \
     vector<const char *> varnames; \
     input_thread_t *p_input = THEMIM->getInput();
 
 #define CREATE_POPUP \
+    menu = new QMenu(); \
     Populate( p_intf, menu, varnames, objects ); \
-    p_intf->p_sys->p_popup_menu = menu; \
     menu->popup( QCursor::pos() ); \
-    p_intf->p_sys->p_popup_menu = NULL; \
     i_last_separator = 0;
 
 void QVLCMenu::PopupPlayEntries( QMenu *menu,
@@ -873,9 +891,9 @@ void QVLCMenu::PopupMenuStaticEntries( QMenu *menu )
 }
 
 /* Video Tracks and Subtitles tracks */
-void QVLCMenu::VideoPopupMenu( intf_thread_t *p_intf )
+void QVLCMenu::VideoPopupMenu( intf_thread_t *p_intf, bool show )
 {
-    POPUP_BOILERPLATE;
+    POPUP_BOILERPLATE
     if( p_input )
     {
         vout_thread_t *p_vout = THEMIM->getVout();
@@ -885,14 +903,13 @@ void QVLCMenu::VideoPopupMenu( intf_thread_t *p_intf )
             vlc_object_release( p_vout );
         }
     }
-    QMenu *menu = new QMenu();
-    CREATE_POPUP;
+    CREATE_POPUP
 }
 
 /* Audio Tracks */
-void QVLCMenu::AudioPopupMenu( intf_thread_t *p_intf )
+void QVLCMenu::AudioPopupMenu( intf_thread_t *p_intf, bool show )
 {
-    POPUP_BOILERPLATE;
+    POPUP_BOILERPLATE
     if( p_input )
     {
         aout_instance_t *p_aout = THEMIM->getAout();
@@ -900,14 +917,13 @@ void QVLCMenu::AudioPopupMenu( intf_thread_t *p_intf )
         if( p_aout )
             vlc_object_release( p_aout );
     }
-    QMenu *menu = new QMenu();
-    CREATE_POPUP;
+    CREATE_POPUP
 }
 
 /* Navigation stuff, and general menus ( open ), used only for skins */
-void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf )
+void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf, bool show )
 {
-    POPUP_BOILERPLATE;
+    POPUP_BOILERPLATE
 
     if( p_input )
     {
@@ -916,7 +932,7 @@ void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf )
         PUSH_SEPARATOR;
     }
 
-    QMenu *menu = new QMenu();
+    menu = new QMenu();
     Populate( p_intf, menu, varnames, objects );
 
     menu->addSeparator();
@@ -929,31 +945,20 @@ void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf )
     menu->addSeparator();
     PopupMenuStaticEntries( menu );
 
-    p_intf->p_sys->p_popup_menu = menu;
     menu->popup( QCursor::pos() );
-    p_intf->p_sys->p_popup_menu = NULL;
 }
 
 /* Main Menu that sticks everything together  */
 void QVLCMenu::PopupMenu( intf_thread_t *p_intf, bool show )
 {
-    /* Delete old popup if there is one */
-    delete p_intf->p_sys->p_popup_menu;
-
-    if( !show )
-    {
-        p_intf->p_sys->p_popup_menu = NULL;
-        return;
-    }
+    POPUP_BOILERPLATE
 
     /* */
-    QMenu *menu = new QMenu();
+    menu = new QMenu( );
     QAction *action;
     bool b_isFullscreen = false;
     MainInterface *mi = p_intf->p_sys->p_mi;
 
-    POPUP_BOILERPLATE;
-
     PopupPlayEntries( menu, p_intf, p_input );
     PopupMenuPlaylistControlEntries( menu, p_intf );
     menu->addSeparator();
@@ -970,9 +975,12 @@ void QVLCMenu::PopupMenu( intf_thread_t *p_intf, bool show )
 
             b_isFullscreen = !( !val.b_bool );
             if( b_isFullscreen )
+            {
+                val.b_bool = false;
                 CreateAndConnect( menu, "fullscreen",
                         qtr( "Leave Fullscreen" ),"" , ITEM_NORMAL,
                         VLC_OBJECT(p_vout), val, VLC_VAR_BOOL, b_isFullscreen );
+            }
             vlc_object_release( p_vout );
 
             menu->addSeparator();
@@ -1033,7 +1041,10 @@ 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, (QMenu *)NULL ) );
+        {
+            QMenu *viewmenu = menu->addMenu( qtr( "V&iew" ) );
+            ViewMenu( p_intf, viewmenu );
+        }
 
         menu->addMenu( submenu );
     }
@@ -1041,14 +1052,16 @@ void QVLCMenu::PopupMenu( intf_thread_t *p_intf, bool show )
     /* Static entries for ending, like open */
     PopupMenuStaticEntries( menu );
 
-    p_intf->p_sys->p_popup_menu = menu;
-    p_intf->p_sys->p_popup_menu->popup( QCursor::pos() );
+    menu->popup( QCursor::pos() );
 }
 
 #undef ACT_ADD
 #undef ACT_ADDMENU
 #undef ACT_ADDCHECK
 
+#undef CREATE_POPUP
+#undef POPUP_BOILERPLATE
+
 #ifndef HAVE_MAEMO
 /************************************************************************
  * Systray Menu                                                         *
@@ -1058,12 +1071,16 @@ void QVLCMenu::updateSystrayMenu( MainInterface *mi,
                                   intf_thread_t *p_intf,
                                   bool b_force_visible )
 {
-    POPUP_BOILERPLATE;
+    unsigned int i_last_separator = 0;
+    vector<vlc_object_t *> objects;
+    vector<const char *> varnames;
+    input_thread_t *p_input = THEMIM->getInput();
 
     /* Get the systray menu and clean it */
     QMenu *sysMenu = mi->getSysTrayMenu();
     sysMenu->clear();
 
+#ifndef Q_WS_MAC
     /* Hide / Show VLC and cone */
     if( mi->isVisible() || b_force_visible )
     {
@@ -1077,13 +1094,13 @@ void QVLCMenu::updateSystrayMenu( MainInterface *mi,
                             qtr( "Show VLC media player" ), mi,
                             SLOT( toggleUpdateSystrayMenu() ) );
     }
-
     sysMenu->addSeparator();
+#endif
+
     PopupPlayEntries( sysMenu, p_intf, p_input );
     PopupMenuPlaylistControlEntries( sysMenu, p_intf);
     PopupMenuControlEntries( sysMenu, p_intf);
 
-    sysMenu->addSeparator();
     addDPStaticEntry( sysMenu, qtr( "&Open Media" ),
             ":/type/file-wide", SLOT( openFileDialog() ) );
     addDPStaticEntry( sysMenu, qtr( "&Quit" ) ,
@@ -1094,8 +1111,6 @@ void QVLCMenu::updateSystrayMenu( MainInterface *mi,
 }
 #endif
 
-#undef CREATE_POPUP
-#undef POPUP_BOILERPLATE
 
 #undef PUSH_VAR
 #undef PUSH_SEPARATOR
@@ -1378,7 +1393,7 @@ int QVLCMenu::CreateChoicesMenu( QMenu *submenu, const char *psz_var,
             case VLC_VAR_INTEGER:
                 var_Get( p_object, psz_var, &val );
                 if( CURTEXT ) menutext = qfu( CURTEXT );
-                else menutext.sprintf( "%d", CURVAL.i_int );
+                else menutext.sprintf( "%"PRId64, CURVAL.i_int );
                 CreateAndConnect( submenu, psz_var, menutext, "", ITEM_RADIO,
                         p_object, CURVAL, i_type,
                         ( CURVAL.i_int == val.i_int )
@@ -1441,8 +1456,9 @@ void QVLCMenu::CreateAndConnect( QMenu *menu, const char *psz_var,
 
     action->setChecked( checked );
 
-    MenuItemData *itemData = new MenuItemData( THEDP->menusMapper, p_obj, i_val_type,
-            val, psz_var );
+    MenuItemData *itemData = qFindChild<MenuItemData*>( action, QString() );
+    delete itemData;
+    itemData = new MenuItemData( action, p_obj, i_val_type, val, psz_var );
 
     /* remove previous signal-slot connection(s) if any */
     action->disconnect( );
@@ -1460,6 +1476,11 @@ void QVLCMenu::DoAction( QObject *data )
     vlc_object_t *p_object = itemData->p_obj;
     if( p_object == NULL ) return;
 
+    /* Preserve settings across vouts via the playlist object: */
+    if( !strcmp( itemData->psz_var, "fullscreen" )
+     || !strcmp( itemData->psz_var, "video-on-top" ) )
+        var_Set( pl_Get( p_object ), itemData->psz_var, itemData->val );
+
     var_Set( p_object, itemData->psz_var, itemData->val );
 }