Mercurial > audlegacy
comparison src/audacious/ui_manager.c @ 3369:676bfd7b6586 trunk
simplified the custom plugin menuentries system, expecially for ui files
author | Giacomo Lozito <james@develia.org> |
---|---|
date | Sun, 19 Aug 2007 13:57:53 +0200 |
parents | 7a4fcf84a34f |
children | 973cf1ae043a |
comparison
equal
deleted
inserted
replaced
3368:1521e3a16e40 | 3369:676bfd7b6586 |
---|---|
372 }; | 372 }; |
373 | 373 |
374 static GtkActionEntry action_entries_others[] = { | 374 static GtkActionEntry action_entries_others[] = { |
375 | 375 |
376 { "dummy", NULL, "dummy" }, | 376 { "dummy", NULL, "dummy" }, |
377 | |
378 { "plugins-menu", NULL, N_("Plugins") }, | |
377 | 379 |
378 { "current track info", AUD_STOCK_INFO , N_("View Track Details"), "I", | 380 { "current track info", AUD_STOCK_INFO , N_("View Track Details"), "I", |
379 N_("View track details"), G_CALLBACK(action_current_track_info) }, | 381 N_("View track details"), G_CALLBACK(action_current_track_info) }, |
380 | 382 |
381 { "playlist track info", AUD_STOCK_INFO , N_("View Track Details"), "<Alt>I", | 383 { "playlist track info", AUD_STOCK_INFO , N_("View Track Details"), "<Alt>I", |
625 | 627 |
626 | 628 |
627 static void | 629 static void |
628 ui_manager_create_menus_init_pmenu( gchar * path ) | 630 ui_manager_create_menus_init_pmenu( gchar * path ) |
629 { | 631 { |
630 GtkWidget *plugins_menu, *plugins_menu_item, *plugins_dummy_item; | 632 GtkWidget *plugins_menu_item; |
631 GList *plugins_menu_children = NULL; | |
632 gchar *path_dummy = g_strjoin( NULL , path , "/plugins-menu-dummy" , NULL ); | |
633 /* remove the dummy item placed in plugins-menu as a workaround */ | |
634 plugins_dummy_item = gtk_ui_manager_get_widget( ui_manager , path_dummy ); | |
635 if ( plugins_dummy_item ) | |
636 gtk_widget_destroy( plugins_dummy_item ); | |
637 /* take note of the initial count of items in the "empty" plugins-menu */ | |
638 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , path ); | 633 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , path ); |
639 plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) ); | 634 /* initially set count of items under plugins_menu_item to 0 */ |
640 plugins_menu_children = gtk_container_get_children( GTK_CONTAINER(plugins_menu) ); | 635 g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(0) ); |
641 g_object_set_data( G_OBJECT(plugins_menu) , "ic" , GINT_TO_POINTER(g_list_length(plugins_menu_children)) ); | 636 /* and since it's 0, hide the plugins_menu_item */ |
642 g_list_free( plugins_menu_children ); | |
643 /* last, hide the plugins-menu by default */ | |
644 gtk_widget_hide( plugins_menu_item ); | 637 gtk_widget_hide( plugins_menu_item ); |
645 g_free( path_dummy ); | |
646 return; | 638 return; |
647 } | 639 } |
648 | 640 |
649 | 641 |
650 void | 642 void |
795 return -1; | 787 return -1; |
796 } | 788 } |
797 | 789 |
798 if ( plugins_menu_item ) | 790 if ( plugins_menu_item ) |
799 { | 791 { |
800 plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) ); | 792 gint ic = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(plugins_menu_item),"ic")); |
801 if ( plugins_menu ) | 793 if ( ic == 0 ) /* no items under plugins_menu_item, create the submenu */ |
802 { | 794 { |
803 gtk_menu_shell_append( GTK_MENU_SHELL(plugins_menu) , item ); | 795 plugins_menu = gtk_menu_new(); |
804 gtk_widget_show( plugins_menu_item ); | 796 gtk_menu_item_set_submenu( GTK_MENU_ITEM(plugins_menu_item), plugins_menu ); |
805 return 0; /* success */ | 797 } |
798 else /* items available under plugins_menu_item, pick the existing submenu */ | |
799 { | |
800 plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) ); | |
801 if ( !plugins_menu ) return -1; | |
802 } | |
803 gtk_menu_shell_append( GTK_MENU_SHELL(plugins_menu) , item ); | |
804 gtk_widget_show( plugins_menu_item ); | |
805 g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(++ic) ); | |
806 return 0; /* success */ | |
807 } | |
808 else | |
809 return -1; | |
810 } | |
811 else | |
812 return -1; | |
813 } | |
814 | |
815 | |
816 gint | |
817 audacious_menu_plugin_item_remove( gint menu_id , GtkWidget * item ) | |
818 { | |
819 if ( menu_created ) | |
820 { | |
821 GtkWidget *plugins_menu = NULL; | |
822 GtkWidget *plugins_menu_item = NULL; | |
823 | |
824 switch (menu_id) | |
825 { | |
826 case AUDACIOUS_MENU_MAIN: | |
827 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , | |
828 "/mainwin-menus/main-menu/plugins-menu" ); | |
829 break; | |
830 | |
831 case AUDACIOUS_MENU_PLAYLIST: | |
832 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , | |
833 "/playlist-menus/playlist-menu/plugins-menu" ); | |
834 break; | |
835 | |
836 case AUDACIOUS_MENU_PLAYLIST_RCLICK: | |
837 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , | |
838 "/playlist-menus/playlist-rightclick-menu/plugins-menu" ); | |
839 break; | |
840 | |
841 default: | |
842 return -1; | |
843 } | |
844 | |
845 if ( plugins_menu_item ) | |
846 { | |
847 gint ic = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(plugins_menu_item),"ic")); | |
848 if ( ic > 0 ) | |
849 { | |
850 plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) ); | |
851 if ( plugins_menu ) | |
852 { | |
853 /* remove the plugin-added entry */ | |
854 gtk_container_remove( GTK_CONTAINER(plugins_menu) , item ); | |
855 g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(--ic) ); | |
856 if ( ic == 0 ) /* if the menu is empty now, destroy it */ | |
857 { | |
858 gtk_menu_item_remove_submenu( GTK_MENU_ITEM(plugins_menu_item) ); | |
859 gtk_widget_destroy( plugins_menu ); | |
860 gtk_widget_hide( plugins_menu_item ); | |
861 } | |
862 return 0; /* success */ | |
863 } | |
864 else | |
865 return -1; | |
806 } | 866 } |
807 else | 867 else |
808 return -1; | 868 return -1; |
809 } | 869 } |
810 else | 870 else |
811 return -1; | 871 return -1; |
812 } | 872 } |
813 else | 873 else |
814 return -1; | 874 return -1; |
815 } | 875 } |
816 | |
817 | |
818 gint | |
819 audacious_menu_plugin_item_remove( gint menu_id , GtkWidget * item ) | |
820 { | |
821 if ( menu_created ) | |
822 { | |
823 GtkWidget *plugins_menu = NULL; | |
824 GtkWidget *plugins_menu_item = NULL; | |
825 GList *plugins_menu_children = NULL; | |
826 | |
827 switch (menu_id) | |
828 { | |
829 case AUDACIOUS_MENU_MAIN: | |
830 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , | |
831 "/mainwin-menus/main-menu/plugins-menu" ); | |
832 break; | |
833 | |
834 case AUDACIOUS_MENU_PLAYLIST: | |
835 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , | |
836 "/playlist-menus/playlist-menu/plugins-menu" ); | |
837 break; | |
838 | |
839 case AUDACIOUS_MENU_PLAYLIST_RCLICK: | |
840 plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , | |
841 "/playlist-menus/playlist-rightclick-menu/plugins-menu" ); | |
842 break; | |
843 | |
844 default: | |
845 return -1; | |
846 } | |
847 | |
848 if ( plugins_menu_item ) | |
849 { | |
850 plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) ); | |
851 if ( plugins_menu ) | |
852 { | |
853 /* remove the plugin-added entry */ | |
854 gtk_container_remove( GTK_CONTAINER(plugins_menu) , item ); | |
855 /* check the current number of items in plugins-menu against its initial count | |
856 of items; if these are equal, it means that the menu is "empty", so hide it */ | |
857 gint ic = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(plugins_menu),"ic")); | |
858 plugins_menu_children = gtk_container_get_children( GTK_CONTAINER(plugins_menu) ); | |
859 if ( ic == g_list_length(plugins_menu_children) ) | |
860 gtk_widget_hide( plugins_menu_item ); | |
861 g_list_free( plugins_menu_children ); | |
862 return 0; /* success */ | |
863 } | |
864 else | |
865 return -1; | |
866 } | |
867 else | |
868 return -1; | |
869 } | |
870 else | |
871 return -1; | |
872 } |