; Module/File: Menu_ItemDelByTitle&Label.pb ; Function: Removes menu item by title and item label - Linux gtk2/gtk3 ; Author: Omi ; Date: Nov. 04, 2015 ; Version: 0.1 ; Target Compiler: PureBasic 5.22/5.31/5.40 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ;-------------------------------------------------------------- ;works on Menu and ImageMenu ;look @ similar 'Hide'-function (could be more digestible): Menu_ItemHideByTitle&Label.pb EnableExplicit ImportC "" gtk_container_get_children(*container.GtkContainer) gtk_container_remove(*container.GtkContainer, *widget.GtkWidget) ; gtk_menu_shell_insert(*menu_shell.GtkMenuShell, *child.GtkWidget, position) ; gtk_menu_item_new_with_label(label.p-utf8) gtk_menu_item_get_label(*menu_item.GtkMenuItem) gtk_menu_item_get_submenu(*menu_item.GtkMenuItem) gtk_menu_get_attach_widget(*menu.GtkMenu) gtk_widget_get_name(*widget.GtkWidget) EndImport ; Object constants #Win_Main = 0 #But1 = 0 #But2 = 1 Enumeration; Menu #Mn1 #Mn1_Item11 #Mn1_Item12 #Mn1_Item13 #Mn1_Item14 #Mn1_Item141 #Mn1_Item142 #Mn1_Item15 #Mn1_Item21 #Mn1_Item22 #Mn1_Item23 #Mn1_Item24 EndEnumeration Global.i gEvent, gQuit Global.s gGtkSubSytem Procedure.s GetGtkSubSytem() CompilerIf #PB_Compiler_Version < 540 CompilerIf Subsystem("gtk3") gGtkSubSytem= "gtk3" CompilerElse gGtkSubSytem= "gtk2" CompilerEndIf CompilerElse CompilerIf Subsystem("gtk2") gGtkSubSytem= "gtk2" CompilerElse gGtkSubSytem= "gtk3" CompilerEndIf CompilerEndIf ProcedureReturn gGtkSubSytem EndProcedure ;- ;- RecentFile-Library (until PB returns the widgets-adr ;-)_____________ Procedure.s Menu_GetItemLabel(*widget.GtkWidget); works for popups, menus, submenus Protected *subType.GtkImageMenuItem Protected.s ItemType, ItemLabel If *widget ItemType= PeekS(gtk_widget_get_name_(*widget), -1, #PB_UTF8); Menu item type If gGtkSubSytem= "gtk3" If ItemType <> "GtkSeparatorMenuItem"; else separator is harmed ItemLabel= PeekS(gtk_menu_item_get_label(*widget), -1, #PB_UTF8); Label always in item EndIf Else; gtk2 *subType= *widget If *subType\menu_item\item\bin\child If PeekS(gtk_widget_get_name_(*subType\menu_item\item\bin\child), -1, #PB_UTF8) = "GtkAccelLabel"; gtk2 uses subitems for labels ItemLabel= PeekS(gtk_label_get_text_(*subType\menu_item\item\bin\child), -1, #PB_UTF8) EndIf EndIf EndIf ItemLabel= RemoveString(ItemLabel, "_", #PB_String_CaseSensitive, 1, 1); remove "_" EndIf ProcedureReturn ItemLabel EndProcedure Procedure.i Menu_RemoveItemByLabel(*menu, Menu, Title.s, sItemLabel.s) Protected *widget.GtkWidget, *SubMenu.GtkWidget Protected *list.GList= gtk_container_get_children(*menu) Protected *Removed= #Null Protected.s ItemLabel Protected.i I For I= 0 To g_list_length_(*list)- 1 *widget= g_list_nth_data_(*list, I) If *widget *SubMenu= gtk_menu_item_get_submenu(*widget) ItemLabel= Menu_GetItemLabel(*widget) If sItemLabel = ItemLabel If gtk_menu_get_attach_widget(*menu) If Menu_GetItemLabel(gtk_menu_get_attach_widget(*menu)) = Title gtk_container_remove(*menu, *widget) *Removed= *widget Break EndIf EndIf EndIf If *SubMenu *Removed= Menu_RemoveItemByLabel(*SubMenu, Menu, Title, sItemLabel) If *Removed : Break : EndIf EndIf EndIf Next I g_list_free_(*list) ProcedureReturn *Removed EndProcedure ;----------------------- Procedure CreateWindow_Main() OpenWindow(#Win_Main, 0, 0, 400, 300, "Remove MenuItem by labels", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ButtonGadget(#But1, 5, 5, 390, 26, "Remove Menu Item 'Edit / Cut'") ButtonGadget(#But2, 5, 35, 390, 26, "Restore Menu Item 'Edit / Cut'") DisableGadget(#But2, #True) EndProcedure Procedure Create_Mn1() CreateMenu(#Mn1, WindowID(#Win_Main)) MenuTitle("File") MenuItem(#Mn1_Item11, "&New" + #TAB$ + "Ctrl+N") MenuItem(#Mn1_Item12, "&Open" + #TAB$ + "Ctrl+O") MenuItem(#Mn1_Item13, "&Save" + #TAB$ + "Ctrl+S") MenuBar() MenuItem(#Mn1_Item14, "&Print" + #TAB$ + "Ctrl+P") MenuBar() OpenSubMenu("Recent files") MenuItem(#Mn1_Item141, "SubItem 1") MenuItem(#Mn1_Item142, "SubItem 2") CloseSubMenu() MenuBar() MenuItem(#Mn1_Item15, "Quit") MenuTitle("Edit") MenuItem(#Mn1_Item21, "&Copy" + #TAB$ + "Ctrl+C") MenuItem(#Mn1_Item22, "Cut" + #TAB$ + "Ctrl+X") MenuItem(#Mn1_Item23, "Paste" + #TAB$ + "Ctrl+V") MenuBar() MenuItem(#Mn1_Item24, "Select &all" + #TAB$ + "Ctrl+A") DisableMenuItem(#Mn1, #Mn1_Item14, #True) SetMenuItemState(#Mn1, #Mn1_Item23, #True); checked EndProcedure gGtkSubSytem= GetGtkSubSytem() CreateWindow_Main() Create_Mn1() Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Gadget Select EventGadget() Case #But1 Menu_RemoveItemByLabel(MenuID(#Mn1), #Mn1, "Edit", "Cut") Case #But2 ; Menu_RemoveItemByLabel(MenuID(#Mn1), #Mn1, "Edit", "Cut") EndSelect Case #PB_Event_Menu Debug GetMenuItemText(#Mn1, EventMenu()) EndSelect Until gQuit ; IDE Options = PureBasic 5.40 LTS (Linux - x64) ; CursorPosition = 10 ; Folding = -- ; EnableUnicode ; EnableXP