; Module/File: Menu_AddEmbeddedImageByID.pb ; Function: Add embedded images to menu items by title and MenuItemId - Linux gtk2/gtk3 ; Author: Omi ; Date: Jan. 04, 2016 ; 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 EnableExplicit ImportC "" gtk_image_new_from_pixbuf(*pixbuf) gtk_container_get_children(*container.GtkContainer) gtk_menu_item_get_label(*menu_item.GtkMenuItem) gtk_menu_item_get_submenu(*menu_item.GtkMenuItem) gtk_menu_get_attach_widget(*menu.GtkMenu) gtk_image_menu_item_set_image(*image_menu_item, *image) gtk_widget_get_name(*widget.GtkWidget) EndImport UsePNGImageDecoder() ; Object constants #Win_Main = 0 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 Enumeration #Img1 #Img2 #Img3 #Img4 #Img5 #Img6 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_AddImageByID(*menu, Menu, Title.s, ItemID, Image) Protected *widget.GtkWidget, *SubMenu.GtkWidget Protected *list.GList= gtk_container_get_children(*menu) Protected *Agree= #Null Protected.s ItemLabel, sItemLabel= RemoveString(StringField(GetMenuItemText(Menu, ItemID), 1, #TAB$), "&", 1, 1) 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 *Agree= *widget EndIf Else If Title = "" *Agree= *widget EndIf EndIf If *Agree Protected *image.GtkImage= gtk_image_new_from_pixbuf(ImageID(Image)) gtk_image_menu_item_set_image(*Agree, *image) Break EndIf EndIf If *SubMenu *Agree= Menu_AddImageByID(*SubMenu, Menu, Title, ItemID, Image) If *Agree : Break : EndIf EndIf EndIf Next I g_list_free_(*list) ProcedureReturn *Agree EndProcedure ;----------------------- Procedure CreateWindow_Main() OpenWindow(#Win_Main, 0, 0, 400, 300, "MenuItems w. embedded images", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) EndProcedure Procedure Create_Mn1() CreateImageMenu(#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) EndProcedure gGtkSubSytem= GetGtkSubSytem() CreateWindow_Main() Create_Mn1() If CatchImage(#Img1, ?Img1) : Menu_AddImageByID(MenuID(#Mn1), #Mn1, "File", #Mn1_Item11, #Img1) : EndIf If CatchImage(#Img2, ?Img2) : Menu_AddImageByID(MenuID(#Mn1), #Mn1, "File", #Mn1_Item12, #Img2) : EndIf If CatchImage(#Img3, ?Img3) : Menu_AddImageByID(MenuID(#Mn1), #Mn1, "File", #Mn1_Item13, #Img3) : EndIf If CatchImage(#Img4, ?Img4) : Menu_AddImageByID(MenuID(#Mn1), #Mn1, "Edit", #Mn1_Item21, #Img4) : EndIf If CatchImage(#Img5, ?Img5) : Menu_AddImageByID(MenuID(#Mn1), #Mn1, "Edit", #Mn1_Item22, #Img5) : EndIf If CatchImage(#Img6, ?Img6) : Menu_AddImageByID(MenuID(#Mn1), #Mn1, "Edit", #Mn1_Item23, #Img6) : EndIf Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Menu Debug GetMenuItemText(#Mn1, EventMenu()) EndSelect Until gQuit DataSection ;Choose your pathes and pics here ... Img1: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/document-new.png" Img2: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/document-open.png" Img3: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/document-save.png" Img4: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/edit-copy.png" Img5: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/edit-cut.png" Img6: : IncludeBinary "/usr/share/icons/default.kde4/16x16/actions/edit-paste.png" EndDataSection ; IDE Options = PureBasic 5.45 LTS (Linux - x86) ; CursorPosition = 3 ; Folding = -- ; EnableUnicode ; EnableXP