delete/re-create parent menus. That makes wxWindows a lot happier.
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;
/*****************************************************************************
* 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__ )
* 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
};
+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.
*****************************************************************************/
}
/* 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 */
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
}
/* 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
}
/* 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
}
/* 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
}
/* 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++ )
}
}
-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 );
}
/*****************************************************************************
/* 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 */
} // 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
{
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;