; Module/File: TV_GetParentPathes.pb ; Function: Query the parent pathes (indices) hierarchical from TreeGadget item - Linux gtk2/gtk3 ; Author: Omi ; Date: Feb. 12, 2016 ; Version: 0.1 ; Target Compiler: PureBasic 5.22/5.31/5.4/5.6 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ;-------------------------------------------------------------- EnableExplicit ImportC "" gtk_tree_view_set_level_indentation(*tree_view.GtkTreeView, indentation) EndImport ;Object constants #MainWin= 0 #TG1 = 0 Global.i gEvent, gQuit Global.i gI, gSelItem, gParentItem Global.s gSelPath Structure TREEVIEWDATA Path.l SearchIndex.l ItemIndex.l PathString.s EndStructure Global TreeForEach_Data.TREEVIEWDATA ; ***** ProcedureC Callback_TreeForEach2String(*Model, *Path, *Iter, *userdata.TREEVIEWDATA) If *userdata\ItemIndex= *userdata\SearchIndex *userdata\PathString= PeekS(gtk_tree_path_to_string_(*Path), -1 ,#PB_UTF8) ProcedureReturn #True Else *userdata\ItemIndex + 1 *userdata\PathString= "" ProcedureReturn #False EndIf EndProcedure ProcedureC Callback_TreeForEach2Index(*Model, *Path, *Iter, *userdata.TREEVIEWDATA);! If PeekS(gtk_tree_path_to_string_(*Path), -1 ,#PB_UTF8)= *userdata\PathString ProcedureReturn #True Else *userdata\ItemIndex + 1 ProcedureReturn #False EndIf EndProcedure ;- Procedure.s TV_PathStringFromItemIndex(Gadget, ItemIndex); path-string from TV-item, native Protected iter.GtkTreeIter Protected tPath Protected *tModel= gtk_tree_view_get_model_(GadgetID(Gadget)) gtk_tree_model_get_iter_first_(*tModel, @iter) tPath= gtk_tree_model_get_path_(*tModel, iter) If tPath TreeForEach_Data\ItemIndex = 0 TreeForEach_Data\Path = tPath TreeForEach_Data\SearchIndex = ItemIndex gtk_tree_model_foreach_(*tModel, @Callback_TreeForEach2String(), @TreeForEach_Data) gtk_tree_path_free_(tPath); ??? EndIf ProcedureReturn TreeForEach_Data\PathString EndProcedure Procedure.i TV_ItemIndexFromPathString(Gadget, PathString.s); item index from TV-path-string, native Protected iter.GtkTreeIter Protected tPath Protected *tModel= gtk_tree_view_get_model_(GadgetID(Gadget)) gtk_tree_model_get_iter_first_(*tModel, @iter) tPath= gtk_tree_model_get_path_(*tModel, iter) If tPath TreeForEach_Data\ItemIndex = 0 TreeForEach_Data\Path = tPath TreeForEach_Data\PathString = PathString gtk_tree_model_foreach_(*tModel, @Callback_TreeForEach2Index(), TreeForEach_Data) gtk_tree_path_free_(tPath); ??? EndIf If TreeForEach_Data\ItemIndex >= CountGadgetItems(Gadget) TreeForEach_Data\ItemIndex= -1 EndIf ProcedureReturn TreeForEach_Data\ItemIndex EndProcedure Procedure.i TV_GetParentIndex(Gadget, PathString.s, ItemDepth); parent item index from whole path string on depth Protected.s PathParent Protected.i I, Depth= CountString(PathString, ":")+ 1 If ItemDepth <= Depth For I= 1 To ItemDepth+ 1 PathParent+ StringField(PathString, I, ":") + ":" Next I PathParent= RTrim(PathParent, ":") EndIf ProcedureReturn TV_ItemIndexFromPathString(Gadget, PathParent) EndProcedure Procedure CreateWindow_Main() Protected.i I If OpenWindow(#MainWin, 200, 200, 450, 335, "TreeGadget - Parent pathes", #PB_Window_SystemMenu) TextGadget(#PB_Any, 5, 5, 400, 22, "Click on items to query all path parts ...") TreeGadget(#TG1, 5, 30, 440, 300) For I = 0 To 2 AddGadgetItem(#TG1, -1, "Main Node " + Str(I), 0, 0) AddGadgetItem(#TG1, -1, "Sub Item " + Str(I) + ":0", 0, 1) AddGadgetItem(#TG1, -1, "Sub Item " + Str(I) + ":1", 0, 1) AddGadgetItem(#TG1, -1, "Sub Item " + Str(I) + ":2", 0, 1) If I= 1 AddGadgetItem(#TG1, -1, "Sub Node " + Str(I) + ":3", 0, 1) AddGadgetItem(#TG1, -1, "Sub Item " + Str(I) + ":3:0", 0, 2) AddGadgetItem(#TG1, -1, "Sub Node " + Str(I) + ":3:1", 0, 2) AddGadgetItem(#TG1, -1, "Sub Item " + Str(I) + ":3:1:0", 0, 3) AddGadgetItem(#TG1, -1, "Sub Item " + Str(I) + ":3:1:1", 0, 3) Else AddGadgetItem(#TG1, -1, "Sub Item " + Str(I) + ":3", 0, 1) EndIf Next I EndIf gtk_tree_view_set_level_indentation(GadgetID(#TG1), 10) gtk_tree_view_expand_all_(GadgetID(#TG1)) EndProcedure CreateWindow_Main() Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Gadget If EventGadget() = #TG1 If EventType() = #PB_EventType_Change gSelItem= GetGadgetState(#TG1) If gSelItem > -1 gSelPath= TV_PathStringFromItemIndex(#TG1, gSelItem); current selection path-string like "1:2:0" Debug "Selected item: " + Str(gSelItem) + " = path: " + gSelPath ; current PathString and PB index For gI = 0 To GetGadgetItemAttribute(#TG1, gSelItem, #PB_Tree_SubLevel)- 1; 0 to depth - 1 gParentItem= TV_GetParentIndex(#TG1, gSelPath, gI); Index of parent with depth gI Debug Space(gI) + "Parent item :" + RSet(Str(gParentItem), 3) + " = path: " + ; Path PB index & -string from 0 ... Depth + TV_PathStringFromItemIndex(#TG1, gParentItem); + parent item path-string Next gI Debug "---" EndIf EndIf EndIf EndSelect Until gQuit ; IDE Options = PureBasic 5.45 LTS (Linux - x86) ; CursorPosition = 33 ; FirstLine = 26 ; Folding = -- ; EnableUnicode ; EnableXP