]> git.sesse.net Git - vlc/commitdiff
* modules/gui/wxwindows/*: modified the auto-generated menus routines to not
authorGildas Bazin <gbazin@videolan.org>
Wed, 7 Apr 2004 19:48:38 +0000 (19:48 +0000)
committerGildas Bazin <gbazin@videolan.org>
Wed, 7 Apr 2004 19:48:38 +0000 (19:48 +0000)
delete/re-create parent menus. That makes wxWindows a lot happier.

modules/gui/wxwindows/interface.cpp
modules/gui/wxwindows/menus.cpp
modules/gui/wxwindows/wxwindows.h

index 2386b2b2f6943abe53bcd7459f4ad3feebde3e3d..d4ce7555ffa3a162c37844c3abe387423d639504 100644 (file)
@@ -355,21 +355,11 @@ void Interface::CreateOurMenuBar()
                        wxU(_("Stream and Media &info...\tCtrl-I")),
                        wxU(_(HELP_FILEINFO)) );
 
-    /* Create the "Settings" menu */
-    p_settings_menu = new wxMenu;
-    b_settings_menu = 1;
-
-    /* Create the "Audio" menu */
-    p_audio_menu = new wxMenu;
-    b_audio_menu = 1;
-
-    /* Create the "Video" menu */
-    p_video_menu = new wxMenu;
-    b_video_menu = 1;
-
-    /* Create the "Navigation" menu */
-    p_navig_menu = new wxMenu;
-    b_navig_menu = 1;
+    /* Create the "Auto-generated" menus */
+    p_settings_menu = SettingsMenu( p_intf, this );
+    p_audio_menu = AudioMenu( p_intf, this );
+    p_video_menu = VideoMenu( p_intf, this );
+    p_navig_menu = NavigMenu( p_intf, this );
 
     /* Create the "Help" menu */
     wxMenu *help_menu = new wxMenu;
@@ -751,139 +741,44 @@ void Interface::UpdateAcceleratorTable()
 /*****************************************************************************
  * Event Handlers.
  *****************************************************************************/
-/* Work-around helper for buggy wxGTK */
-void RecursiveDestroy( wxMenu *menu )
-{
-    wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst();
-    for( ; node; )
-    {
-        wxMenuItem *item = node->GetData();
-        node = node->GetNext();
-
-        /* Delete the submenus */
-        wxMenu *submenu = item->GetSubMenu();
-        if( submenu )
-        {
-            RecursiveDestroy( submenu );
-        }
-        menu->Delete( item );
-    }
-}
 
 void Interface::OnMenuOpen(wxMenuEvent& event)
 {
 #if !defined( __WXMSW__ )
     if( event.GetEventObject() == p_settings_menu )
+#endif
     {
-        if( b_settings_menu )
-        {
-            p_settings_menu = SettingsMenu( p_intf, this );
-
-            /* Add static items */
-            p_settings_menu->AppendCheckItem( Extended_Event,
-                             wxU(_("&Extended GUI") ), wxU(_(HELP_EXTENDED)) );
-            p_settings_menu->AppendCheckItem( Bookmarks_Event,
-                             wxU(_("&Bookmarks...") ), wxU(_(HELP_BOOKMARKS)) );
-            p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")),
-                                     wxU(_(HELP_PREFS)) );
-
-            /* Work-around for buggy wxGTK */
-            wxMenu *menu = GetMenuBar()->GetMenu( 2 );
-            RecursiveDestroy( menu );
-            /* End work-around */
-
-            menu = GetMenuBar()->Replace( 2, p_settings_menu,
-                                          wxU(_("&Settings")));
-            if( menu ) delete menu;
-
-            b_settings_menu = 0;
-        }
-        else b_settings_menu = 1;
+        p_settings_menu = SettingsMenu( p_intf, this, p_settings_menu );
+
+        /* Add static items */
+        p_settings_menu->AppendCheckItem( Extended_Event,
+            wxU(_("&Extended GUI") ), wxU(_(HELP_EXTENDED)) );
+        p_settings_menu->AppendCheckItem( Bookmarks_Event,
+            wxU(_("&Bookmarks...") ), wxU(_(HELP_BOOKMARKS)) );
+        p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")),
+            wxU(_(HELP_PREFS)) );
     }
+
+#if !defined( __WXMSW__ )
     else if( event.GetEventObject() == p_audio_menu )
+#endif
     {
-        if( b_audio_menu )
-        {
-            p_audio_menu = AudioMenu( p_intf, this );
-
-            /* Work-around for buggy wxGTK */
-            wxMenu *menu = GetMenuBar()->GetMenu( 3 );
-            RecursiveDestroy( menu );
-            /* End work-around */
-
-            menu =
-                GetMenuBar()->Replace( 3, p_audio_menu, wxU(_("&Audio")) );
-            if( menu ) delete menu;
-
-            b_audio_menu = 0;
-        }
-        else b_audio_menu = 1;
+        p_audio_menu = AudioMenu( p_intf, this, p_audio_menu );
     }
+
+#if !defined( __WXMSW__ )
     else if( event.GetEventObject() == p_video_menu )
+#endif
     {
-        if( b_video_menu )
-        {
-            p_video_menu = VideoMenu( p_intf, this );
-
-            /* Work-around for buggy wxGTK */
-            wxMenu *menu = GetMenuBar()->GetMenu( 4 );
-            RecursiveDestroy( menu );
-            /* End work-around */
-
-            menu =
-                GetMenuBar()->Replace( 4, p_video_menu, wxU(_("&Video")) );
-            if( menu ) delete menu;
-
-            b_video_menu = 0;
-        }
-        else b_video_menu = 1;
+        p_video_menu = VideoMenu( p_intf, this, p_video_menu );
     }
+
+#if !defined( __WXMSW__ )
     else if( event.GetEventObject() == p_navig_menu )
+#endif
     {
-        if( b_navig_menu )
-        {
-            p_navig_menu = NavigMenu( p_intf, this );
-
-            /* Work-around for buggy wxGTK */
-            wxMenu *menu = GetMenuBar()->GetMenu( 5 );
-            RecursiveDestroy( menu );
-            /* End work-around */
-
-            menu =
-                GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation")));
-            if( menu ) delete menu;
-
-            b_navig_menu = 0;
-        }
-        else b_navig_menu = 1;
+        p_navig_menu = NavigMenu( p_intf, this, p_navig_menu );
     }
-
-#else
-    p_settings_menu = SettingsMenu( p_intf, this );
-    /* Add static items */
-    p_settings_menu->AppendCheckItem( Extended_Event, wxU(_("&Extended GUI") ),
-                                      wxU(_(HELP_EXTENDED)) );
-    p_settings_menu->AppendCheckItem( Bookmarks_Event, wxU(_("&Bookmarks") ),
-                                      wxU(_(HELP_BOOKMARKS)) );
-    p_settings_menu->Append( Prefs_Event, wxU(_("&Preferences...")),
-                             wxU(_(HELP_PREFS)) );
-    wxMenu *menu =
-        GetMenuBar()->Replace( 2, p_settings_menu, wxU(_("&Settings")) );
-    if( menu ) delete menu;
-
-    p_audio_menu = AudioMenu( p_intf, this );
-    menu = GetMenuBar()->Replace( 3, p_audio_menu, wxU(_("&Audio")) );
-    if( menu ) delete menu;
-
-    p_video_menu = VideoMenu( p_intf, this );
-    menu = GetMenuBar()->Replace( 4, p_video_menu, wxU(_("&Video")) );
-    if( menu ) delete menu;
-
-    p_navig_menu = NavigMenu( p_intf, this );
-    menu = GetMenuBar()->Replace( 5, p_navig_menu, wxU(_("&Navigation")) );
-    if( menu ) delete menu;
-#endif
-
 }
 
 #if defined( __WXMSW__ ) || defined( __WXMAC__ )
index f793aa70525e9189eba8876af99bebb34896b49d..7ed48536b446b42bb22b30224a2568f6513e2b18 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2000-2004 VideoLAN
  * $Id$
  *
- * Authors: Gildas Bazin <gbazin@netcourrier.com>
+ * Authors: Gildas Bazin <gbazin@videolan.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -54,6 +54,34 @@ private:
 
 };
 
+class Menu: public wxMenu
+{
+public:
+    /* Constructor */
+    Menu( intf_thread_t *p_intf, wxWindow *p_parent, int i_start_id );
+    virtual ~Menu();
+
+    void Populate( int i_count, char **ppsz_names, int *pi_objects );
+    void Clear();
+
+private:
+    /* Event handlers (these functions should _not_ be virtual) */
+    void OnClose( wxCommandEvent& event );
+    void OnShowDialog( wxCommandEvent& event );
+    void OnEntrySelected( wxCommandEvent& event );
+
+    wxMenu *Menu::CreateDummyMenu();
+    void   Menu::CreateMenuItem( wxMenu *, char *, vlc_object_t * );
+    wxMenu *Menu::CreateChoicesMenu( char *, vlc_object_t *, bool );
+
+    DECLARE_EVENT_TABLE();
+
+    intf_thread_t *p_intf;
+
+    int i_start_id;
+    int i_item_id;
+};
+
 /*****************************************************************************
  * Event Table.
  *****************************************************************************/
@@ -214,8 +242,8 @@ void PopupMenu( intf_thread_t *p_intf, wxWindow *p_parent,
     }
 
     /* Build menu */
-    Menu popupmenu( p_intf, p_parent, i,
-                     ppsz_varnames, pi_objects, PopupMenu_Events );
+    Menu popupmenu( p_intf, p_parent, PopupMenu_Events );
+    popupmenu.Populate( i, ppsz_varnames, pi_objects );
 
 #if 1
     /* Add static entries */
@@ -229,7 +257,7 @@ void PopupMenu( intf_thread_t *p_intf, wxWindow *p_parent,
     p_intf->p_sys->p_popup_menu = NULL;
 }
 
-wxMenu *AudioMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
+wxMenu *AudioMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
 {
 #define MAX_AUDIO_ITEMS 10
 
@@ -264,11 +292,18 @@ wxMenu *AudioMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
     }
 
     /* Build menu */
-    return new Menu( _p_intf, p_parent, i,
-                     ppsz_varnames, pi_objects, AudioMenu_Events );
+    Menu *p_vlc_menu = (Menu *)p_menu;
+    if( !p_vlc_menu )
+        p_vlc_menu = new Menu( _p_intf, p_parent, AudioMenu_Events );
+    else
+        p_vlc_menu->Clear();
+
+    p_vlc_menu->Populate( i, ppsz_varnames, pi_objects );
+
+    return p_vlc_menu;
 }
 
-wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
+wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
 {
 #define MAX_VIDEO_ITEMS 15
 
@@ -328,11 +363,18 @@ wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
     }
 
     /* Build menu */
-    return new Menu( _p_intf, p_parent, i,
-                     ppsz_varnames, pi_objects, VideoMenu_Events );
+    Menu *p_vlc_menu = (Menu *)p_menu;
+    if( !p_vlc_menu )
+        p_vlc_menu = new Menu( _p_intf, p_parent, VideoMenu_Events );
+    else
+        p_vlc_menu->Clear();
+
+    p_vlc_menu->Populate( i, ppsz_varnames, pi_objects );
+
+    return p_vlc_menu;
 }
 
-wxMenu *NavigMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
+wxMenu *NavigMenu( intf_thread_t *_p_intf, wxWindow *p_parent, wxMenu *p_menu )
 {
 #define MAX_NAVIG_ITEMS 10
 
@@ -374,11 +416,19 @@ wxMenu *NavigMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
     }
 
     /* Build menu */
-    return new Menu( _p_intf, p_parent, i,
-                     ppsz_varnames, pi_objects, NavigMenu_Events );
+    Menu *p_vlc_menu = (Menu *)p_menu;
+    if( !p_vlc_menu )
+        p_vlc_menu = new Menu( _p_intf, p_parent, NavigMenu_Events );
+    else
+        p_vlc_menu->Clear();
+
+    p_vlc_menu->Populate( i, ppsz_varnames, pi_objects );
+
+    return p_vlc_menu;
 }
 
-wxMenu *SettingsMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
+wxMenu *SettingsMenu( intf_thread_t *_p_intf, wxWindow *p_parent,
+                      wxMenu *p_menu )
 {
 #define MAX_SETTINGS_ITEMS 10
 
@@ -402,24 +452,41 @@ wxMenu *SettingsMenu( intf_thread_t *_p_intf, wxWindow *p_parent )
     }
 
     /* Build menu */
-    return new Menu( _p_intf, p_parent, i,
-                     ppsz_varnames, pi_objects, SettingsMenu_Events );
+    Menu *p_vlc_menu = (Menu *)p_menu;
+    if( !p_vlc_menu )
+        p_vlc_menu = new Menu( _p_intf, p_parent, SettingsMenu_Events );
+    else
+        p_vlc_menu->Clear();
+
+    p_vlc_menu->Populate( i, ppsz_varnames, pi_objects );
+
+    return p_vlc_menu;
 }
 
 /*****************************************************************************
  * Constructor.
  *****************************************************************************/
-Menu::Menu( intf_thread_t *_p_intf, wxWindow *p_parent,
-            int i_count, char **ppsz_varnames, int *pi_objects,
-            int i_start_id ): wxMenu( )
+Menu::Menu( intf_thread_t *_p_intf, wxWindow *p_parent, int _i_start_id )
+  : wxMenu( )
+{
+    /* Initializations */
+    p_intf = _p_intf;
+    i_start_id = _i_start_id;
+}
+
+Menu::~Menu()
+{
+}
+
+/*****************************************************************************
+ * Public methods.
+ *****************************************************************************/
+void Menu::Populate( int i_count, char **ppsz_varnames, int *pi_objects )
 {
     vlc_object_t *p_object;
     vlc_bool_t b_section_empty = VLC_FALSE;
     int i;
 
-    /* Initializations */
-    p_intf = _p_intf;
-
     i_item_id = i_start_id;
 
     for( i = 0; i < i_count; i++ )
@@ -460,8 +527,28 @@ Menu::Menu( intf_thread_t *_p_intf, wxWindow *p_parent,
     }
 }
 
-Menu::~Menu()
+/* Work-around helper for buggy wxGTK */
+static void RecursiveDestroy( wxMenu *menu )
+{
+    wxMenuItemList::Node *node = menu->GetMenuItems().GetFirst();
+    for( ; node; )
+    {
+        wxMenuItem *item = node->GetData();
+        node = node->GetNext();
+
+        /* Delete the submenus */
+        wxMenu *submenu = item->GetSubMenu();
+        if( submenu )
+        {
+            RecursiveDestroy( submenu );
+        }
+        menu->Delete( item );
+    }
+}
+
+void Menu::Clear( )
 {
+    RecursiveDestroy( this );
 }
 
 /*****************************************************************************
index 1b13f2fd7b2164f2cfc00139195c14299d963197..9ddc936d52c0ce8bfa15cd95fc78fe461e83cce6 100644 (file)
@@ -262,13 +262,9 @@ private:
 
     /* For auto-generated menus */
     wxMenu *p_settings_menu;
-    vlc_bool_t b_settings_menu;
     wxMenu *p_audio_menu;
-    vlc_bool_t b_audio_menu;
     wxMenu *p_video_menu;
-    vlc_bool_t b_video_menu;
     wxMenu *p_navig_menu;
-    vlc_bool_t b_navig_menu;
 };
 
 /* Dialogs Provider */
@@ -949,12 +945,11 @@ private:
 } // end of wxvlc namespace
 
 /* Menus */
-void PopupMenu( intf_thread_t *_p_intf, wxWindow *p_parent,
-                const wxPoint& pos );
-wxMenu *SettingsMenu( intf_thread_t *_p_intf, wxWindow *p_parent );
-wxMenu *AudioMenu( intf_thread_t *_p_intf, wxWindow *p_parent );
-wxMenu *VideoMenu( intf_thread_t *_p_intf, wxWindow *p_parent );
-wxMenu *NavigMenu( intf_thread_t *_p_intf, wxWindow *p_parent );
+void PopupMenu( intf_thread_t *, wxWindow *, const wxPoint& );
+wxMenu *SettingsMenu( intf_thread_t *, wxWindow *, wxMenu * = NULL );
+wxMenu *AudioMenu( intf_thread_t *, wxWindow *, wxMenu * = NULL );
+wxMenu *VideoMenu( intf_thread_t *, wxWindow *, wxMenu * = NULL );
+wxMenu *NavigMenu( intf_thread_t *, wxWindow *, wxMenu * = NULL );
 
 namespace wxvlc
 {
@@ -975,31 +970,6 @@ private:
     Interface *p_main_interface;
 };
 
-class Menu: public wxMenu
-{
-public:
-    /* Constructor */
-    Menu( intf_thread_t *p_intf, wxWindow *p_parent, int i_count,
-          char **ppsz_names, int *pi_objects, int i_start_id );
-    virtual ~Menu();
-
-private:
-    /* Event handlers (these functions should _not_ be virtual) */
-    void OnClose( wxCommandEvent& event );
-    void OnShowDialog( wxCommandEvent& event );
-    void OnEntrySelected( wxCommandEvent& event );
-
-    wxMenu *Menu::CreateDummyMenu();
-    void   Menu::CreateMenuItem( wxMenu *, char *, vlc_object_t * );
-    wxMenu *Menu::CreateChoicesMenu( char *, vlc_object_t *, bool );
-
-    DECLARE_EVENT_TABLE();
-
-    intf_thread_t *p_intf;
-
-    int  i_item_id;
-};
-
 } // end of wxvlc namespace
 using namespace wxvlc;