From 2b9a06ca1c19d8049457c78fe915ba8baa23e135 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Wed, 7 Apr 2004 19:48:38 +0000 Subject: [PATCH] * modules/gui/wxwindows/*: modified the auto-generated menus routines to not delete/re-create parent menus. That makes wxWindows a lot happier. --- modules/gui/wxwindows/interface.cpp | 159 +++++----------------------- modules/gui/wxwindows/menus.cpp | 131 +++++++++++++++++++---- modules/gui/wxwindows/wxwindows.h | 40 +------ 3 files changed, 141 insertions(+), 189 deletions(-) diff --git a/modules/gui/wxwindows/interface.cpp b/modules/gui/wxwindows/interface.cpp index 2386b2b2f6..d4ce7555ff 100644 --- a/modules/gui/wxwindows/interface.cpp +++ b/modules/gui/wxwindows/interface.cpp @@ -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__ ) diff --git a/modules/gui/wxwindows/menus.cpp b/modules/gui/wxwindows/menus.cpp index f793aa7052..7ed48536b4 100644 --- a/modules/gui/wxwindows/menus.cpp +++ b/modules/gui/wxwindows/menus.cpp @@ -4,7 +4,7 @@ * Copyright (C) 2000-2004 VideoLAN * $Id$ * - * Authors: Gildas Bazin + * Authors: Gildas Bazin * * 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 ); } /***************************************************************************** diff --git a/modules/gui/wxwindows/wxwindows.h b/modules/gui/wxwindows/wxwindows.h index 1b13f2fd7b..9ddc936d52 100644 --- a/modules/gui/wxwindows/wxwindows.h +++ b/modules/gui/wxwindows/wxwindows.h @@ -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; -- GitLab