[vlc-commits] commit: qt4: rework popupmenus (Erwan Tulou )

git at videolan.org git at videolan.org
Wed Apr 7 17:53:39 CEST 2010


vlc | branch: master | Erwan Tulou <erwan10 at videolan.org> | Wed Apr  7 17:07:41 2010 +0200| [0ccd492a9352fe1c8ac5114bbd337e7060ddea7f] | committer: Erwan Tulou 

qt4: rework popupmenus

This patch
   - ensures no accumulation of QMenus
   - removes the root Widget for dialog_provider
   - unifies all four popupmenus in term of API

For skins, it also fixes bugs when trying to hide popupmenus
(Video, Audio and Misc). These were never implemented at the
 qt4 level, but used at the skins level.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0ccd492a9352fe1c8ac5114bbd337e7060ddea7f
---

 modules/gui/qt4/dialogs_provider.cpp |   20 +++++-------
 modules/gui/qt4/menus.cpp            |   57 +++++++++++++++-------------------
 modules/gui/qt4/menus.hpp            |    8 ++--
 modules/gui/qt4/qt4.cpp              |    1 -
 modules/gui/qt4/qt4.hpp              |    1 -
 5 files changed, 37 insertions(+), 50 deletions(-)

diff --git a/modules/gui/qt4/dialogs_provider.cpp b/modules/gui/qt4/dialogs_provider.cpp
index 9fb00cd..13dbbfa 100644
--- a/modules/gui/qt4/dialogs_provider.cpp
+++ b/modules/gui/qt4/dialogs_provider.cpp
@@ -83,13 +83,6 @@ DialogsProvider::DialogsProvider( intf_thread_t *_p_intf ) :
     CONNECT( SDMapper, mapped (QString), this, SDMenuAction( QString ) );
 
     new DialogHandler (p_intf, this );
-
-    /* a root widget intended to be the ancestor of all
-       menus/actions created by the dialog_provider methods.
-       At destruction time, deleting this fake widget ensures
-       all child menus/actions are also deleted
-     */
-    root = new QWidget();
 }
 
 DialogsProvider::~DialogsProvider()
@@ -109,7 +102,10 @@ DialogsProvider::~DialogsProvider()
     delete menusUpdateMapper;
     delete SDMapper;
 
-    delete root;
+    QVLCMenu::PopupMenu( p_intf, false );
+    QVLCMenu::AudioPopupMenu( p_intf, false );
+    QVLCMenu::VideoPopupMenu( p_intf, false );
+    QVLCMenu::MiscPopupMenu( p_intf, false );
 }
 
 void DialogsProvider::quit()
@@ -156,13 +152,13 @@ void DialogsProvider::customEvent( QEvent *event )
            vlmDialog(); break;
 #endif
         case INTF_DIALOG_POPUPMENU:
-           QVLCMenu::PopupMenu( p_intf, (de->i_arg != 0), root ); break;
+           QVLCMenu::PopupMenu( p_intf, (de->i_arg != 0) ); break;
         case INTF_DIALOG_AUDIOPOPUPMENU:
-           QVLCMenu::AudioPopupMenu( p_intf, root ); break;
+           QVLCMenu::AudioPopupMenu( p_intf, (de->i_arg != 0) ); break;
         case INTF_DIALOG_VIDEOPOPUPMENU:
-           QVLCMenu::VideoPopupMenu( p_intf, root ); break;
+           QVLCMenu::VideoPopupMenu( p_intf, (de->i_arg != 0) ); break;
         case INTF_DIALOG_MISCPOPUPMENU:
-           QVLCMenu::MiscPopupMenu( p_intf, root ); break;
+           QVLCMenu::MiscPopupMenu( p_intf, (de->i_arg != 0) ); break;
         case INTF_DIALOG_WIZARD:
         case INTF_DIALOG_STREAMWIZARD:
             openAndStreamingDialogs(); break;
diff --git a/modules/gui/qt4/menus.cpp b/modules/gui/qt4/menus.cpp
index 5991d01..da1b3fb 100644
--- a/modules/gui/qt4/menus.cpp
+++ b/modules/gui/qt4/menus.cpp
@@ -763,16 +763,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,
@@ -885,9 +888,9 @@ void QVLCMenu::PopupMenuStaticEntries( QMenu *menu )
 }
 
 /* Video Tracks and Subtitles tracks */
-void QVLCMenu::VideoPopupMenu( intf_thread_t *p_intf, QWidget *parent  )
+void QVLCMenu::VideoPopupMenu( intf_thread_t *p_intf, bool show )
 {
-    POPUP_BOILERPLATE;
+    POPUP_BOILERPLATE
     if( p_input )
     {
         vout_thread_t *p_vout = THEMIM->getVout();
@@ -897,14 +900,13 @@ void QVLCMenu::VideoPopupMenu( intf_thread_t *p_intf, QWidget *parent  )
             vlc_object_release( p_vout );
         }
     }
-    QMenu *menu = new QMenu( parent );
-    CREATE_POPUP;
+    CREATE_POPUP
 }
 
 /* Audio Tracks */
-void QVLCMenu::AudioPopupMenu( intf_thread_t *p_intf, QWidget *parent )
+void QVLCMenu::AudioPopupMenu( intf_thread_t *p_intf, bool show )
 {
-    POPUP_BOILERPLATE;
+    POPUP_BOILERPLATE
     if( p_input )
     {
         aout_instance_t *p_aout = THEMIM->getAout();
@@ -912,14 +914,13 @@ void QVLCMenu::AudioPopupMenu( intf_thread_t *p_intf, QWidget *parent )
         if( p_aout )
             vlc_object_release( p_aout );
     }
-    QMenu *menu = new QMenu( parent );
-    CREATE_POPUP;
+    CREATE_POPUP
 }
 
 /* Navigation stuff, and general menus ( open ), used only for skins */
-void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf, QWidget *parent )
+void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf, bool show )
 {
-    POPUP_BOILERPLATE;
+    POPUP_BOILERPLATE
 
     if( p_input )
     {
@@ -928,7 +929,7 @@ void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf, QWidget *parent )
         PUSH_SEPARATOR;
     }
 
-    QMenu *menu = new QMenu( parent );
+    menu = new QMenu();
     Populate( p_intf, menu, varnames, objects );
 
     menu->addSeparator();
@@ -941,31 +942,20 @@ void QVLCMenu::MiscPopupMenu( intf_thread_t *p_intf, QWidget *parent )
     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, QWidget *parent )
+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( parent );
+    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();
@@ -1056,14 +1046,16 @@ void QVLCMenu::PopupMenu( intf_thread_t *p_intf, bool show, QWidget *parent )
     /* 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                                                         *
@@ -1073,7 +1065,10 @@ 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();
@@ -1109,8 +1104,6 @@ void QVLCMenu::updateSystrayMenu( MainInterface *mi,
 }
 #endif
 
-#undef CREATE_POPUP
-#undef POPUP_BOILERPLATE
 
 #undef PUSH_VAR
 #undef PUSH_SEPARATOR
diff --git a/modules/gui/qt4/menus.hpp b/modules/gui/qt4/menus.hpp
index 1ed4228..f1d89f2 100644
--- a/modules/gui/qt4/menus.hpp
+++ b/modules/gui/qt4/menus.hpp
@@ -79,10 +79,10 @@ public:
     static void createMenuBar( MainInterface *mi, intf_thread_t * );
 
     /* Popups Menus */
-    static void PopupMenu( intf_thread_t *, bool, QWidget * );
-    static void AudioPopupMenu( intf_thread_t *, QWidget * );
-    static void VideoPopupMenu( intf_thread_t *, QWidget * );
-    static void MiscPopupMenu( intf_thread_t *, QWidget * );
+    static void PopupMenu( intf_thread_t *, bool );
+    static void AudioPopupMenu( intf_thread_t *, bool );
+    static void VideoPopupMenu( intf_thread_t *, bool );
+    static void MiscPopupMenu( intf_thread_t *, bool );
 
     /* Systray */
     static void updateSystrayMenu( MainInterface *, intf_thread_t  *,
diff --git a/modules/gui/qt4/qt4.cpp b/modules/gui/qt4/qt4.cpp
index 4be129b..fe7ea7d 100644
--- a/modules/gui/qt4/qt4.cpp
+++ b/modules/gui/qt4/qt4.cpp
@@ -315,7 +315,6 @@ static int Open( vlc_object_t *p_this, bool isDialogProvider )
     /* Allocations of p_sys */
     intf_sys_t *p_sys = p_intf->p_sys = new intf_sys_t;
     p_intf->p_sys->b_isDialogProvider = isDialogProvider;
-    p_sys->p_popup_menu = NULL;
     p_sys->p_mi = NULL;
     p_sys->p_playlist = pl_Get( p_intf );
 
diff --git a/modules/gui/qt4/qt4.hpp b/modules/gui/qt4/qt4.hpp
index 15c0a34..64f5821 100644
--- a/modules/gui/qt4/qt4.hpp
+++ b/modules/gui/qt4/qt4.hpp
@@ -74,7 +74,6 @@ struct intf_sys_t
 
     QString filepath;        /* Last path used in dialogs */
 
-    QMenu * p_popup_menu;    /* The right click menu */
 };
 
 #define THEPL p_intf->p_sys->p_playlist



More information about the vlc-commits mailing list