; HyperTreeGadget.pb by Alex W. ; http://www.mevedia.de ; ; Version: 1.2 ; Constants #HyperTree_Selected = 0 ; Is Item selected? (#True/#False) #HyperTree_Node = 1 ; Is Item a Node? (#True/False) #HyperTree_Font = 2 ; Set Item Font. (FontNumber) ; Flags #HyperTree_MultiSelect = 1<<0 #HyperTree_FullRowSelect = 1<<1 Structure HYPERTREE_FIELD_INFO img.i w.i h.i EndStructure Structure HYPERTREE_ITEM_INFO txt.s pos.i sel.i lvl.i exp.i node.i dis.i rect.RECT h.i cBkgnd.i cTitle.i cTitleDis.i cBoxSel.i cBoxSelHi.i cBoxBkgnd.i cBoxBrd.i gdata.i font.i List field.HYPERTREE_FIELD_INFO() EndStructure Structure HYPERTREE_INFO id.l flags.l ml.i pw.f ph.f sx.f sy.f sw.f rsx.f rsy.f sh.f bx.i by.i scroll.i scrollx.i indent.i spacing.i font.i iPlus.i iMinus.i iPlusDis.i iMinusDis.i iOver.i cBkgnd.i cDkBrd.i cBrd.i List item.HYPERTREE_ITEM_INFO() EndStructure Procedure HyperTreeEvent(GadgetID.i) Protected *g.HYPERTREE_INFO = GetGadgetData(GadgetID) Protected w.i, h.i, mx.i, my.i Protected ch.i=4, cw.i=4, ci.i= *g\indent, cl.i, exp.i=#True, sel.i=-1, xw.i Protected scale.i, fOver.i mx = GetGadgetAttribute(GadgetID, #PB_Canvas_MouseX) my = GetGadgetAttribute(GadgetID, #PB_Canvas_MouseY) Select EventType() Case #PB_EventType_LeftButtonDown *g\ml=#True *g\bx=mx-*g\sx *g\by=my-*g\sy Case #PB_EventType_LeftButtonUp *g\scroll=#False *g\scrollx=#False *g\ml=#False EndSelect StartDrawing(CanvasOutput(GadgetID)) w=OutputWidth() h=OutputHeight() Box(0, 0, w, h, *g\cBkgnd) ; Items With *g\item() ForEach *g\item() If \lvl<=expl exp=#True ElseIf \lvl>expl And exp=#False Continue EndIf If \lvl>cl And exp=#True ; Stop stop stoooop! We're a Child now so go back and tell your Parent! PreviousElement(*g\item()) \node=#True If mx>\rect\left-18-*g\rsx And mx<\rect\left-*g\rsx And my>\rect\top-*g\rsy And my<\rect\bottom-*g\rsy fOver=#True Else fOver=#False EndIf ; Fold If \rect\bottom-*g\rsy>0 And \rect\top-*g\rsy0 And \rect\top-*g\rsy\rect\left-18-*g\rsx And mx<\rect\left-*g\rsx And my>\rect\top-*g\rsy And my<\rect\bottom-*g\rsy And \node=#True \exp=\exp!1 ElseIf mx>\rect\left-*g\rsx And mx<\rect\right-*g\rsx And my>\rect\top-*g\rsy And my<\rect\bottom-*g\rsy And \dis=#False \sel=#True ElseIf Not *g\flags & #HyperTree_MultiSelect And GetAsyncKeyState_(#VK_CONTROL)=#False \sel=#False EndIf EndIf EndIf ; Mark If \rect\bottom-*g\rsy>0 And \rect\top-*g\rsy\rect\left-*g\rsx And mx<\rect\right-*g\rsx And my>\rect\top-*g\rsy And my<\rect\bottom-*g\rsy RoundBox(-*g\rsx+\rect\left+1, -*g\rsy+\rect\top+1, \rect\right-\rect\left+2, \h-2, 3, 3, \cBoxSelHi) EndIf EndIf ; Fields ForEach *g\item()\field() If \field()\img<>-1 DrawingMode(#PB_2DDrawing_AlphaBlend) DrawImage(ImageID(\field()\img), -*g\rsx+xw+\rect\left, -*g\rsy+\rect\top, \field()\w, \field()\h) EndIf xw+\field()\w Next If \rect\bottom-*g\rsy>0 And \rect\top-*g\rsyh *g\sh=h-(h/100*((h/100)*(*g\ph))/100) If *g\sh<10 *g\sh=10 EndIf If ((*g\ml=#True And mx>w-22 And my>*g\sy And my<*g\sy+*g\sh) Or *g\scroll=#True) And my>*g\by And myh-(*g\sh-*g\by) And *g\scroll=#True *g\sy=h-(*g\sh) *g\rsy=*g\ph-h EndIf Box(w-22, 2, 20, h+20, #Gray) Box(w-21, 2+*g\sy, 19, *g\sh, RGB($F3,$F3,$F3)) EndIf h=h+24 If *g\pw>w *g\sw=w-((w)/100*(((w)/100)**g\pw)/100) If ((*g\ml=#True And mx>2 And my>h-22 And mx*g\bx And mxw-(*g\sw-*g\bx) And *g\scrollx=#True *g\sx=w-(*g\sw) *g\rsx=*g\pw-w EndIf Box(2, h-22, w-20, 20, #Gray) Box(2+*g\sx, h-21, *g\sw-24, 19, RGB($F3,$F3,$F3)) EndIf If *g\pw>w Or *g\ph>h Box(w-21, h-21, 19, 19, *g\cBrd) EndIf EndWith StopDrawing() EndProcedure Procedure HyperTreeGadget(GadgetID.i, x.i, y.i, Width.i, Height.i, font.i, ImagePlus.i=#PB_Ignore, ImageMinus.i=#PB_Ignore, ImagePlusDisabled.i=#PB_Ignore, ImageMinusDisabled.i=#PB_Ignore, ImageOver.i=#PB_Ignore, flags.l=#Null) Protected *g.HYPERTREE_INFO=AllocateMemory(SizeOf(HYPERTREE_INFO)) If GadgetID=#PB_Any result = CanvasGadget(#PB_Any, x, y, Width, Height) Else result = GadgetID CanvasGadget(GadgetID, x, y, Width, Height) EndIf InitializeStructure(*g, HYPERTREE_INFO) With *g \id = result \flags = flags \cBkgnd = GetSysColor_(#COLOR_WINDOW) \cBrd = GetSysColor_(#COLOR_3DLIGHT) \cDkBrd = GetSysColor_(#COLOR_3DSHADOW) \indent = 32 \spacing = 0 \font = font ; Images If ImagePlus<>#PB_Ignore \iPlus = ImagePlus Else \iPlus = CatchImage(#PB_Any, ?fold0_png_Start, 451) EndIf If ImageMinus<>#PB_Ignore \iMinus = ImageMinus Else \iMinus = CatchImage(#PB_Any, ?fold1_png_Start, 397) EndIf If ImagePlusDisabled<>#PB_Ignore \iPlusDis = ImagePlusDisabled Else \iPlusDis = CatchImage(#PB_Any, ?fold2_png_Start, 462) EndIf If ImageMinusDisabled<>#PB_Ignore \iMinusDis = ImagePlusDisabled Else \iMinusDis = CatchImage(#PB_Any, ?fold3_png_Start, 414) EndIf If ImageOver<>#PB_Ignore \iOver = ImageOver Else \iOver = CatchImage(#PB_Any, ?fold4_png_Start, 296) EndIf EndWith SetGadgetData(result, *g) HyperTreeEvent(GadgetID) ProcedureReturn result EndProcedure Procedure AddHyperTreeItem(GadgetID.i, index.i, text.s, level.i=0, redraw=#True, expanded.i=#True, h.i=20) Protected *g.HYPERTREE_INFO = GetGadgetData(GadgetID) AddElement(*g\item()) With *g\item() \txt = text \pos = index \lvl = level \exp = expanded \h = h \cBkgnd = GetSysColor_(#COLOR_WINDOW) \cTitle = GetSysColor_(#COLOR_BTNTEXT) \cTitleDis = #Gray \cBoxBkgnd = GetSysColor_(#COLOR_WINDOW) \cBoxBrd = GetSysColor_(#COLOR_3DDKSHADOW) \cBoxSel = RGB($DF,$E3,$F2) \cBoxSelHi = RGB($EE,$F3,$F9) \font = *g\font EndWith If redraw=#True HyperTreeEvent(GadgetID) EndIf EndProcedure Procedure RemoveHyperTreeItem(GadgetID.i, index.i, childs.i=#False) Protected *g.HYPERTREE_INFO = GetGadgetData(GadgetID) Protected expl.i, c.i If index>-1 And index<=ListSize(*g\item())-1 With *g\item() SelectElement(*g\item(), index) expl=\lvl DeleteElement(*g\item()) If ListSize(*g\item())>0 NextElement(*g\item()) While \lvl>expl And index0 NextElement(*g\item()) While \lvl>expl And index