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 }