Code archives/BlitzPlus Gui/Gadgets tree

This code has been declared by its author to be Public Domain code.

Download source code

Gadgets tree by Jur2012
This tree can hold other gadgets inside nodes. The nodes can have variable heights. The tree´s structure is simple enough and additional methods for nodes manipulation can be added quite easily.

Currently I have two issues:
- you will probably notice that the tree disappear on update. Take a look at the Update method and you will see "hidegadget" at start and "showgadget" at the end. This is to minimize visual gadgets corruption during repositioning (black squares behind gadgets) as the "redraw" command alone doesnt work well. Try to comment out this hide/show commands and maybe it will work well for you. If somebody has an advice of how to solve that problem, I would love to hear it.
- I am using label gadget as a node selector and this may be a problem on some systems (well, that is written in the docs at least). I would prefer to use the panel gadget as a selector but there is no way to put a label on that panel and keep it active. Only if I disable the label, but then it become grey which is not ok. Any suggestion?

*Edit
I have made some changes in structure and fixed some bugs. Nodes now use generic "AddGadget" method for adding gadgets and proxy gadgets. Node selecting gadget(s) can be now chosen by a flag. Also, there is no need for this to be a proxy gadget, so it is now just an ordinary class.
SuperStrict

Import MaxGui.Drivers
Import MaxGUI.ProxyGadgets

Local window:TGadget = CreateWindow("Gadgets Tree",100,100,420,620, Null, WINDOW_DEFAULT|WINDOW_HIDDEN)
Local GadgetsTree:TGadgetsTree = New TGadgetsTree.Make(10,10,400,500,window) 

Local Gadget:TGadget
Local NodeA:TgtNode[] = New TgtNode[10]
For Local i:Int=0 Until NodeA.length
	NodeA[i] = GadgetsTree.AddNode(22, GadgetsTree.Root)
	Gadget = NodeA[i].AddGadget(CreateButton("",0,0,20,20, NodeA[i].Group, BUTTON_CHECKBOX), CENTER_VERTICALLY)
	Gadget = NodeA[i].AddGadget(CreateButton("Remove"+String(i), GadgetX(Gadget)+GadgetWidth(Gadget)+5,0,70,20,NodeA[i].Group), CENTER_VERTICALLY)
	Gadget = NodeA[i].AddGadget(CreateSlider(GadgetX(Gadget)+GadgetWidth(Gadget)+5,0,100,20,NodeA[i].Group,SLIDER_TRACKBAR|SLIDER_HORIZONTAL), CENTER_VERTICALLY|SELECTING_GADGET)
	Gadget = NodeA[i].AddGadget(CreateLabel("Click here to select node:"+String(i),GadgetX(Gadget)+GadgetWidth(Gadget)+5,0,170,20,NodeA[i].Group), CENTER_VERTICALLY|SELECTING_GADGET)

	If i>5 Then Continue
	
	Local NodeB:TgtNode[] = New TgtNode[3]
	For Local j:Int=0 Until NodeB.length
		NodeB[j] = GadgetsTree.AddNode(34, NodeA[i])
		Gadget = NodeB[j].AddGadget(CreateButton("radio:"+String(i)+String(j),0,0,80,20,NodeB[j].Group, BUTTON_RADIO), CENTER_VERTICALLY)
		'Gadget = NodeB[j].AddGadget(CreateSpinner(0,0,130,20,NodeB[j].Group, SPINNER_TRACKBAR), CENTER_VERTICALLY)
		Gadget = NodeB[j].AddGadget(CreateButton("radio:"+String(i)+String(j),GadgetX(Gadget)+GadgetWidth(Gadget)+5,0,80,20, NodeB[j].Group, BUTTON_RADIO), CENTER_VERTICALLY|SELECTING_GADGET)
		Gadget = NodeB[j].AddGadget(CreatePanel(GadgetX(Gadget)+GadgetWidth(Gadget)+5,0,40,20,NodeB[j].Group), CENTER_VERTICALLY)
		SetGadgetColor(Gadget, Rand(0,255), Rand(0,255), Rand(0,255))
		
		'Rem
		Local NodeC:TgtNode[] = New TgtNode[2]
		For Local k:Int=0 Until NodeC.length
			NodeC[k] = GadgetsTree.AddNode(22, NodeB[j])
			Gadget = NodeC[k].AddGadget(CreateLabel("Enter text: "+String(k),0,0,100,20, NodeC[k].Group, LABEL_RIGHT), CENTER_VERTICALLY)
			Gadget = NodeC[k].AddGadget(CreateTextField(GadgetX(Gadget)+GadgetWidth(Gadget)+5,0,150,20, NodeC[k].Group), CENTER_VERTICALLY)
		Next	
		'EndRem
	Next	
Next

Local NodeD:TgtNode = GadgetsTree.AddNode(50, NodeA[3], 1)   'this will insert node at id=1 of NodeA[3] kids
NodeD.AddGadget(CreateButton("BIG BUTTON", 0,0, 120,40, NodeD.Group), CENTER_VERTICALLY)

GadgetsTree.MoveNode(NodeA[5], NodeA[5].Parent, 8)  'move NodeA[5] to position 8 within the list

Local par:TgtNode = TgtNode(NodeA[1].Kids.First())
GadgetsTree.MoveNode(NodeA[3], par, 0)	'move NodeA[3] to the NodeA[1].Kids at position 0   



GadgetsTree.Refresh()  'redraw nodes at their tree positions
ShowGadget(window)



While True
	WaitEvent 
	Print CurrentEvent.ToString()
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
			
		Case EVENT_GADGETACTION
			
			'identify gadget as a node´s gadget
			Local Gadget:TGadget = TGadget(EventSource())
			Local NodeGadgetExtra:TgtEvent = TgtEvent(Gadget.Extra)
			If NodeGadgetExtra Then
				Print "node id:"+NodeGadgetExtra.Node.id+" depth:"+NodeGadgetExtra.Node.depth+"  gadget action event:"+CurrentEvent.ToString()
				
				Print "gadget text:"+GadgetText(Gadget)
				'a quick test for node removal
				If GadgetText(Gadget).contains("Remove") Then
					GadgetsTree.RemoveNode(NodeGadgetExtra.Node)
				EndIf
			EndIf
	End Select
Wend



Type TGadgetsTree
	Field ScrollPanel:TScrollPanel
	Field Panel:TGadget
	'---
	Field Root:TgtNode
	Field SelectedNode:TgtNode
	
	'---graphics for markers
	Field PixmapKidsExpanded:TPixmap
	Field PixmapKidsCollapsed:TPixmap
	Field PixmapParentByPassLine:TPixmap
	Field MarkerAreaPixmapsBuffer:TgtMarkerAreaPixmaps[]   'index = node´s height - every node with different height needs different pixmaps 
	
	Field markerAreaWidth:Int=20
	Field xBorderOffset:Int=10
	Field yBorderOffset:Int=10
	Field rBack:Int=255, gBack:Int=255, bBack:Int=255
	Field rBackSelected:Int=0, gBackSelected:Int=0, bBackSelected:Int=128
	Field rText:Int=0, gText:Int=0, bText:Int=0
	Field rTextSelected:Int=255, gTextSelected:Int=255, bTextSelected:Int=255
	
	'---
	Field nodesWidth:Int
	Field nodesHeight:Int

	
	Method Make:TGadgetsTree(x:Int,y:Int,width:Int,height:Int,group:TGadget)
		
		ScrollPanel = CreateScrollPanel(x,y,width,height,group,SCROLLPANEL_SUNKEN)
		SetGadgetLayout ScrollPanel,EDGE_ALIGNED,EDGE_ALIGNED,EDGE_ALIGNED,EDGE_ALIGNED
		SetGadgetColor(ScrollPanel, rBack,gBack,bBack)
		
		Panel = ScrollPanelClient(ScrollPanel)
		'SetGadgetColor(Panel, 255,128,255)
		'SetProxy(Panel)
		
		Root = New TgtNode
		Root.Group = CreatePanel(xBorderOffset,yBorderOffset,1,1,Panel)  'dummy panel, for kids to get starting position
		HideGadget(Root.Group)
		
		PixmapKidsExpanded = MakeExpanedMarkerPixmap()
		PixmapKidsCollapsed = MakeCollapsedMarkerPixmap()
		PixmapParentByPassLine = MakeParentByPassLinePixmap()

		AddHook(EmitEventHook,EventHook,Self)
		Return Self
	EndMethod
	
	
	
	Method SetBackColors(_rBack:Int, _gBack:Int, _bBack:Int, _rBackSelected:Int, _gBackSelected:Int, _bBackSelected:Int)
		rBack = _rBack
		gBack = _gBack
		bBack = _bBack
		rBackSelected = _rBackSelected
		gBackSelected = _gBackSelected
		bBackSelected = _bBackSelected
		SetGadgetColor(ScrollPanel, rBack,gBack,bBack)
	EndMethod
	
	Method SetTextColors(_rText:Int, _gText:Int, _bText:Int, _rTextSelected:Int, _gTextSelected:Int, _bTextSelected:Int)
		rText = _rText
		gText = _gText
		bText = _bText
		rTextSelected = _rTextSelected
		gTextSelected = _gTextSelected
		bTextSelected = _bTextSelected
	EndMethod


	
	'Add a new node at position "_pos" (-1 = added at the end); "_height" = height of the node
	Method AddNode:TgtNode(_height:Int, _ParentNode:TgtNode, _pos:Int=-1, _Extra:Object=Null)
		
		Local Node:TgtNode = New TgtNode
		Node.Parent = _ParentNode
		Node.depth = _ParentNode.depth+1
		Node.Extra = _Extra
		Node.GadgetsTree = Self

		Node.Group = CreatePanel(0, 0, 5, _height, Panel)  '5... some value for starting width
		
		Node.MarkerArea = CreatePanel(0, 0, markerAreaWidth, _height, Panel)
		SetGadgetExtra(Node.MarkerArea, New TgtEvent.Make(Self, Null, 0, 1))
		SetGadgetLayout(Node.MarkerArea, EDGE_ALIGNED,EDGE_CENTERED,EDGE_ALIGNED,EDGE_CENTERED)
		If _height>=MarkerAreaPixmapsBuffer.length Then MarkerAreaPixmapsBuffer = MarkerAreaPixmapsBuffer[.._height+1]
		If MarkerAreaPixmapsBuffer[_height]=Null Then
			MarkerAreaPixmapsBuffer[_height] = New TgtMarkerAreaPixmaps.Make(markerAreaWidth, _height, PixmapKidsExpanded.width, PixmapKidsExpanded.height)
		EndIf	
		Node.MarkerAreaPixmaps = MarkerAreaPixmapsBuffer[_height]
		'---
		Node.Marker = CreatePanel(0, (_height-PixmapKidsExpanded.height)/2, PixmapKidsExpanded.width, PixmapKidsExpanded.height, Node.MarkerArea, PANEL_ACTIVE) 
		SetGadgetExtra(Node.Marker, New TgtEvent.Make(Self, Null, 0, 1))
		SetGadgetLayout(Node.Marker, EDGE_ALIGNED,EDGE_CENTERED,EDGE_ALIGNED,EDGE_CENTERED)
		'---
		Node.ParentByPassLine = CreatePanel(0, 0, 1, _height, Panel)
		SetGadgetExtra(Node.ParentByPassLine, New TgtEvent.Make(Self, Null, 0, 1))
		SetGadgetPixmap(Node.ParentByPassLine, PixmapParentByPassLine, PANELPIXMAP_TILE)
		HideGadget(Node.ParentByPassLine)
		
		'---add node to parents kids
		AddNodeToList(Node, _pos) 
		
		Return Node
	EndMethod
	
	
	
	Method AddNodeToList(Node:TgtNode, pos:Int)
	
		If pos=-1 Or pos>Node.Parent.Kids.Count() Then pos=Node.Parent.Kids.Count()
		Node.id = pos
		
		Local Link:TLink = Node.Parent.Kids.FirstLink()
		If Link Then
			Local i:Int
			While i<Node.id
				Link = Link.NextLink()
				i:+1
			Wend
		EndIf
		If Link Then	
			Node.Parent.Kids.InsertBeforeLink(Node,Link)
		Else
			Node.Parent.Kids.AddLast(Node)	
		EndIf
		'update ids
		Local i:Int
		For Local n:TgtNode=EachIn Node.Parent.Kids
			n.id = i
			i:+1
		Next
	EndMethod
	
	
	
	'redraw tree
	Method Refresh()

		HideGadget(Panel)
		nodesWidth = 0
		nodesHeight:Int = RefreshNode(Root)
		SetGadgetShape(Panel, GadgetX(Panel), GadgetY(Panel), nodesWidth+xBorderOffset*2, nodesHeight+yBorderOffset*2)
		RedrawGadget(Panel)
		ShowGadget(Panel)
		
	EndMethod
	

	Method RemoveNode(Node:TgtNode)
		Node.Parent.Kids.Remove(Node)
		'update ids
		Local i:Int
		For Local n:TgtNode=EachIn Node.Parent.Kids
			n.id = i
			i:+1
		Next
		Node.RemoveData()
		Refresh()
	EndMethod
	
	
	Method ClearTree()
		For Local n:TgtNode=EachIn Root.Kids
			RemoveNode(n)
		Next
	EndMethod
	
	
	Method MoveNode(Node:TgtNode, NewParent:TgtNode, pos:Int)
	
		If Node.Parent=NewParent And Node.id=pos Then Return
		
		'remove node
		Node.Parent.Kids.Remove(Node)
		If Node.Parent<>NewParent Then
			'update ids
			Local i:Int
			For Local n:TgtNode=EachIn Node.Parent.Kids
				n.id = i
				i:+1
			Next
		EndIf
		
		'add to the new parent
		Node.Parent = NewParent
		Node.depth = NewParent.depth+1
		AddNodeToList(Node, pos)
	
	EndMethod
	
	
	
	
	'PRIVATE
	
	Method RefreshNode:Int(Node:TgtNode)
		
		Local xParent:Int = GadgetX(Node.Group)
		Local yParent:Int = GadgetY(Node.Group)
		Local x:Int
		Local y:Int = yParent + GadgetHeight(Node.Group)
		For Local n:TgtNode=EachIn Node.Kids
			x = xParent + markerAreaWidth
			'Print "A node id:"+n.id+" depth:"+n.depth+" x:"+x+" y:"+y+"  n.kidsExpanded:"+ n.kidsExpanded+" GadgetHeight(n.Panel):"+GadgetHeight(n.Panel)

			'If n.depth=2 Then Print "x:"+x+" y:"+y+"  n.kidsExpanded:"+ n.kidsExpanded
			SetGadgetShape(n.MarkerArea, x-markerAreaWidth, y, GadgetWidth(n.MarkerArea), GadgetHeight(n.MarkerArea))
			SetGadgetShape(n.Group, x, y, GadgetWidth(n.Group), GadgetHeight(n.Group))
			
			ShowGadget(n.MarkerArea)
			ShowGadget(n.Group)
	
			'----- marker area
			If Node=Root And n=Node.Kids.First() Then
				If n.Kids.IsEmpty()=True Then 
					SetGadgetPixmap(n.MarkerArea, n.MarkerAreaPixmaps.FirstNodeNoKids)
					HideGadget(n.Marker)
				Else
					SetGadgetPixmap(n.MarkerArea, n.MarkerAreaPixmaps.FistNodeKids)
					ShowGadget(n.Marker)
				EndIf
				
			ElseIf n=Node.Kids.Last() Then
				If n.Kids.IsEmpty()=True Then 
					SetGadgetPixmap(n.MarkerArea, n.MarkerAreaPixmaps.LastNodeNoKids)
					HideGadget(n.Marker)
				Else
					SetGadgetPixmap(n.MarkerArea, n.MarkerAreaPixmaps.LastNodeKids)
					ShowGadget(n.Marker)
				EndIf
			Else
				'Print "B node id:"+n.id+" depth:"+n.depth+" x:"+x+" y:"+y+"  n.kidsExpanded:"+ n.kidsExpanded+" GadgetHeight(n.Panel):"+GadgetHeight(n.Panel)
				If n.Kids.IsEmpty()=True Then 
					SetGadgetPixmap(n.MarkerArea, n.MarkerAreaPixmaps.IntermediateNodeNoKids)
					HideGadget(n.Marker)
				Else
					SetGadgetPixmap(n.MarkerArea, n.MarkerAreaPixmaps.IntermediateNodeKids)
					ShowGadget(n.Marker)
				EndIf
			EndIf
				
			If n.kidsExpanded=True Then
				'If n.depth=2 Then Print "B x:"+x+" y:"+y
				SetGadgetPixmap(n.Marker, PixmapKidsExpanded)
				y:+RefreshNode(n)
			Else
				SetGadgetPixmap(n.Marker, PixmapKidsCollapsed)
				HideKids(n)
				y:+GadgetHeight(n.Group)
			EndIf
			
			'n.Redraw()
			
			nodesWidth = Max(nodesWidth, GadgetX(n.Group)+GadgetWidth(n.Group))
		Next
		
		Local hKids:Int = y-yparent   'height of kids
		
		If Node.ParentByPassLine Then
			If Node.kidsExpanded=True Then
				SetGadgetShape(Node.ParentByPassLine, GadgetX(Node.Group)-markerAreaWidth+PixmapKidsExpanded.width/2+1, GadgetY(Node.Group), GadgetWidth(Node.ParentByPassLine), hKids)
				ShowGadget(Node.ParentByPassLine)
			EndIf
		EndIf
		
		Return hKids   
	EndMethod
	

	
	Method HideKids(Node:TgtNode)
	
		HideGadget(Node.ParentByPassLine)
		For Local n:TgtNode=EachIn Node.Kids
			'Print" hide"
			HideGadget(n.Group)
			HideGadget(n.MarkerArea)
			HideGadget(n.ParentByPassLine)
			HideKids(n)
		Next
	EndMethod
	

	Method OnEvent:Int(Event:TEvent, Gadget:TGadget)
		OnEventNode(Root, Event, Gadget)
	EndMethod
	
	
	Method OnEventNode:Int(Node:TgtNode, Event:TEvent, Gadget:TGadget)
		
		For Local n:TgtNode=EachIn Node.Kids
			If TgtEvent(Gadget.Extra).Node=n Then
				If TgtEvent(Gadget.Extra).nodeSelector=True Then
					If n<>SelectedNode Then
						If Event.id=EVENT_MOUSEDOWN Or Event.id=EVENT_GADGETACTION Then
							n.MarkAsSelected()
							If SelectedNode Then
								SelectedNode.MarkAsUnselected()
							EndIf
							SelectedNode=n
						EndIf
					EndIf
				EndIf
				Return True
				
			ElseIf Event.Source=n.Marker Then
				If Event.id=EVENT_MOUSEDOWN Then
					n.kidsExpanded = Not n.kidsExpanded
					Refresh()
					Return True
				EndIf
			EndIf
			
			Local gadgetFound:Int = OnEventNode(n, Event, Gadget)
			If gadgetFound=True Then Return True
		Next
		
		Return False
	EndMethod
			

	Function EventHook:Object(id:Int,data:Object,context:Object)

		Local event:TEvent = TEvent(data)
		If event Then
			Local Gadget:TGadget = TGadget(event.Source)
			If Gadget Then
				If TgtEvent(Gadget.Extra) Then
					TgtEvent(Gadget.Extra).GadgetsTree.OnEvent(event, Gadget)  'perform tree operations if needed
				EndIf
			EndIf
		EndIf
		Return data
	End Function
	
EndType



Const CENTER_VERTICALLY:Int=1
Const SELECTING_GADGET:Int=2


Type TgtNode
	'node information
	Field GadgetsTree:TGadgetsTree
	Field Parent:TgtNode
	Field Kids:TList=New TList
	Field id:Int
	Field depth:Int
	Field kidsExpanded:Int
	
	'gadgets
	Field Group:TGadget
	Field Gadgets:TList=New TList

	'marker
	Field MarkerArea:TGadget
	Field Marker:TGadget
	Field ParentByPassLine:TGadget
	Field MarkerAreaPixmaps:TgtMarkerAreaPixmaps
	
	Field Extra:Object  'use this to connect nodes to your classes
	
	
	
	Method AddGadget:TGadget(Gadget:TGadget, flags:Int=CENTER_VERTICALLY)
		'DebugStop()
		
		SetGadgetLayout(Gadget, EDGE_ALIGNED,EDGE_CENTERED,EDGE_ALIGNED,EDGE_CENTERED)
		If flags & CENTER_VERTICALLY Then 
			SetGadgetShape(Gadget, GadgetX(Gadget), (GadgetHeight(Group)-GadgetHeight(Gadget))/2, GadgetWidth(Gadget), GadgetHeight(Gadget))
		EndIf
		
		Local groupWidth:Int = Max(GadgetWidth(Group), GadgetX(Gadget)+GadgetWidth(Gadget))
		SetGadgetShape(Group, GadgetX(Group), GadgetY(Group), groupWidth, GadgetHeight(Group))
		
		Local selectingGadget:Int
		If flags & SELECTING_GADGET Then
			selectingGadget=True
			If GadgetClass(Gadget)=GADGET_LABEL Then
				SetGadgetSensitivity(Gadget, SENSITIZE_MOUSE)
			EndIf
		EndIf
		SetGadgetExtra(Gadget, New TgtEvent.Make(GadgetsTree, Self, selectingGadget, 0))
		Gadgets.AddLast(Gadget)
		
		Return Gadget
	EndMethod

	
	Method MarkAsSelected()
		SetGadgetColor(Group, GadgetsTree.rBackSelected, GadgetsTree.gBackSelected, GadgetsTree.bBackSelected)
		For Local g:TGadget=EachIn Gadgets
			If GadgetClass(g)=GADGET_LABEL Then
				SetGadgetColor(g, GadgetsTree.rBackSelected, GadgetsTree.gBackSelected, GadgetsTree.bBackSelected)
				SetGadgetTextColor(g,  GadgetsTree.rTextSelected, GadgetsTree.gTextSelected, GadgetsTree.bTextSelected)
			EndIf
		Next	 
	EndMethod
	
	
	Method MarkAsUnselected()
		SetGadgetColor(Group, GadgetsTree.rBack, GadgetsTree.gBack, GadgetsTree.bBack)
		For Local g:TGadget=EachIn Gadgets
			If GadgetClass(g)=GADGET_LABEL Then
				SetGadgetColor(g, GadgetsTree.rBack, GadgetsTree.gBack, GadgetsTree.bBack)
				SetGadgetTextColor(g, GadgetsTree.rText, GadgetsTree.gText, GadgetsTree.bText)
			EndIf
		Next	 
	EndMethod
	
	

	Method Redraw()
		'Print "redraw"
		RedrawGadget(MarkerArea)
		RedrawGadget(Marker)
		RedrawGadget(ParentByPassLine)
		RedrawGadget(Group)
		For Local g:Tgadget=EachIn gadgets
			RedrawGadget(g)
		Next
	EndMethod
	
	
	Method RemoveData()
		For Local g:Tgadget=EachIn gadgets
			FreeGadget(g)
		Next
		FreeGadget(Group)
		FreeGadget(MarkerArea)
		FreeGadget(Marker)
		FreeGadget(ParentByPassLine)
		GadgetsTree = Null
		Parent = Null
		Extra = Null

		For Local n:TgtNode=EachIn Kids
			n.RemoveData()
		Next
		Kids = Null
		Gadgets = Null
	EndMethod
	
EndType	



Type TgtEvent
	Field GadgetsTree:TGadgetsTree
	Field Node:TgtNode
	Field nodeSelector:Int
	Field marker:Int
	
	
	Method Make:TgtEvent(_GadgetsTree:TGadgetsTree, _Node:TgtNode, _nodeSelector:Int, _marker:Int)
		GadgetsTree = _GadgetsTree
		Node = _Node
		nodeSelector = _nodeSelector
		marker = _marker
		Return Self
	EndMethod
EndType	
	








Type TgtMarkerAreaPixmaps
	Field FirstNodeNoKids:TPixmap
	Field FistNodeKids:TPixmap
	Field IntermediateNodeNoKids:TPixmap
	Field IntermediateNodeKids:TPixmap
	Field LastNodeNoKids:TPixmap
	Field LastNodeKids:TPixmap
	
	
	Method Make:TgtMarkerAreaPixmaps(width:Int, height:Int, markerWidth:Int, markerHeight:Int)
		
		Local MarkerEmpty:TPixmap = CreatePixmap(markerWidth, markerHeight, PF_RGBA8888)
		MarkerEmpty.ClearPixels(0)
		
		Local xPos:Int = markerWidth/2+1
		Local yPos:Int = height/2
		
		'-----
		FirstNodeNoKids = CreatePixmap(width, height, PF_RGBA8888)
		FirstNodeNoKids.ClearPixels(0)
		
		For Local x:Int=xPos Until width Step 2
			WritePixel(FirstNodeNoKids, x, yPos, $FF000000)
		Next
		For Local y:Int=yPos Until height Step 2
			WritePixel(FirstNodeNoKids, xPos, y, $FF000000)
		Next 
		'with kids - cleared area for marker
		FistNodeKids =FirstNodeNoKids.Copy()
		FistNodeKids.Paste(MarkerEmpty, xPos-markerWidth/2, yPos-markerHeight/2)
		
		'-----
		IntermediateNodeNoKids = CreatePixmap(width, height, PF_RGBA8888)
		IntermediateNodeNoKids.ClearPixels(0)
		For Local x:Int=xPos Until width Step 2
			WritePixel(IntermediateNodeNoKids, x, yPos, $FF000000)
		Next
		For Local y:Int=0 Until height Step 2
			WritePixel(IntermediateNodeNoKids, xPos, y, $FF000000)
		Next 
		'with kids - cleared area for marker
		IntermediateNodeKids =IntermediateNodeNoKids.Copy()
		IntermediateNodeKids.Paste(MarkerEmpty, xPos-markerWidth/2, yPos-markerHeight/2)
		
		'-----
		LastNodeNoKids = CreatePixmap(width, height, PF_RGBA8888)
		LastNodeNoKids.ClearPixels(0)
		For Local x:Int=xPos Until width Step 2
			WritePixel(LastNodeNoKids, x, yPos, $FF000000)
		Next
		For Local y:Int=0 To yPos Step 2
			WritePixel(LastNodeNoKids, xPos, y, $FF000000)
		Next
		
		'with kids - cleared area for marker
		LastNodeKids = LastNodeNoKids.Copy()
		LastNodeKids.Paste(MarkerEmpty, xPos-markerWidth/2, yPos-markerHeight/2)
		
		Return Self
	EndMethod
EndType




Function MakeParentByPassLinePixmap:TPixmap()

	Local Pixmap:TPixmap = CreatePixmap(1, 20, PF_RGBA8888)
	Pixmap.ClearPixels(0)
	For Local y:Int=0 Until Pixmap.height-1 Step 2
		WritePixel(Pixmap, 0, y, $FF000000) 
	Next	

	Return Pixmap
EndFunction	



Function MakeExpanedMarkerPixmap:TPixmap()
	
	Local mask:Int[][]
	mask = mask[..11]
	'For Local i:Int=0 Until mask.length
	'	mask[i] = mask[i][..11]
	'Next
	mask[0] = [1,1,1,1,1,1,1,1,1,1,1]
	mask[1] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[2] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[3] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[4] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[5] = [1,0,1,1,1,1,1,1,1,0,1]
	mask[6] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[7] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[8] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[9] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[10] = [1,1,1,1,1,1,1,1,1,1,1]
	
	Local Pixmap:TPixmap = CreatePixmap(mask.length, mask[0].length, PF_RGBA8888)
	Pixmap.ClearPixels(0)
	For Local x:Int=0 Until Pixmap.width
		For Local y:Int=0 Until Pixmap.height
			If mask[y][x]=1 Then WritePixel(Pixmap, x, y, $FF000000)
		Next
	Next
	
	Return Pixmap
	
EndFunction


Function MakeCollapsedMarkerPixmap:TPixmap()
	
	Local mask:Int[][]
	mask = mask[..11]
	'For Local i:Int=0 Until mask.length
	'	mask[i] = mask[i][..11]
	'Next
	mask[0] = [1,1,1,1,1,1,1,1,1,1,1]
	mask[1] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[2] = [1,0,0,0,0,1,0,0,0,0,1]
	mask[3] = [1,0,0,0,0,1,0,0,0,0,1]
	mask[4] = [1,0,0,0,0,1,0,0,0,0,1]
	mask[5] = [1,0,1,1,1,1,1,1,1,0,1]
	mask[6] = [1,0,0,0,0,1,0,0,0,0,1]
	mask[7] = [1,0,0,0,0,1,0,0,0,0,1]
	mask[8] = [1,0,0,0,0,1,0,0,0,0,1]
	mask[9] = [1,0,0,0,0,0,0,0,0,0,1]
	mask[10] = [1,1,1,1,1,1,1,1,1,1,1]
	
	Local Pixmap:TPixmap = CreatePixmap(mask.length, mask[0].length, PF_RGBA8888)
	Pixmap.ClearPixels(0)
	For Local x:Int=0 Until Pixmap.width
		For Local y:Int=0 Until Pixmap.height
			If mask[y][x]=1 Then WritePixel(Pixmap, x, y, $FF000000)
		Next
	Next
	
	Return Pixmap
	
EndFunction

Comments

None.

Code Archives Forum