Image Priority

Blitz3D Forums/Blitz3D Programming/Image Priority

Here's some code, it's pretty ancient, so probably not the best example but it should give you some sort of idea...
;Window Z order

Type window
	Field win_id, win_title$
	Field win_x, win_y, win_w, win_h
	Field gad_num, gad_id[99]
End Type

Type gadget
	Field parent, gad_id, gad_type, gad_state
	Field gad_x, gad_y, gad_w, gad_h
	Field gad_r, gad_g, gad_b
End Type
 
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

SeedRnd MilliSecs()

example_windows(10)

winfont = LoadFont("arial bold", 16)
SetFont winfont

omx = MouseX()
omy = MouseY()
drag = 0
focus = 1
w.window = Last window

Repeat
	mx = MouseX()
	my = MouseY()
	lmb_click = MouseHit(1)
	lmb_down = MouseDown(1)
		
	; get focus
	If lmb_click Or drag
		If drag = 0
			focus = update_windows_z(mx, my, lmb_down)
			If focus
				w.window = Last window
				If (focus = 2)
					drag = 1
				EndIf
			EndIf
		Else
			w\win_x = w\win_x + (mx - omx)
			w\win_y = w\win_y + (my - omy)
			If (Not lmb_down) Then drag = 0
		EndIf
		omx = mx
		omy = my
	EndIf
	
	;get gadget
	If focus = 1
		g.gadget = update_gadgets(w, mx, my, lmb_down)
	EndIf
	
	If g <> Null Then gad_ret = g\gad_id
	
	Cls
	
	draw_windows(focus)
	
	Color 0, 200, 0
	Text 0, 0, "Window : " + w\win_id
	Text 0, 10, "Focus : " + focus
	Text 0, 30, "Down : " + lmb_down
	Text 0, 50, "Clicked : " + gad_ret
	
	Flip
Until KeyDown(1)

End


Function example_windows(num)
	Local wh
	For x = 1 To num
		wh = create_window(Rand(600), Rand(400), 200, 200, "Window No " + x)
		create_gadget(wh, 0, Rand(2, 138), Rand(20, 178), 60, 20)
	Next
End Function

Function create_gadget(wh, gt, gx, gy, gw, gh)
	Local g.gadget, w.window
	g.gadget = New gadget
	g\parent = wh
	g\gad_id = Handle(g)
	g\gad_type = gt
	g\gad_x = gx
	g\gad_y = gy
	g\gad_w = gw
	g\gad_h = gh
	g\gad_state = 0
	w.window = Object.window(wh)
	w\gad_id[w\gad_num] = g\gad_id
	w\gad_num = w\gad_num + 1
	Return g\gad_id
End Function

Function update_gadgets.gadget(w.window, mx, my, l_down)
	Local g.gadget, gc
	If l_down
		If w\gad_num
			For gc=0 To w\gad_num - 1
				g = Object.gadget(w\gad_id[gc])
				If RectsOverlap(mx, my, 1, 1, w\win_x + g\gad_x, w\win_y + g\gad_y, g\gad_w, g\gad_h)
					g\gad_state = 1
				Else
					g\gad_state = 0
				EndIf	
			Next
		EndIf
	Else
		If w\gad_num
			For gc=0 To w\gad_num - 1
				g = Object.gadget(w\gad_id[gc])
				If g\gad_state = 1 
					g\gad_state = 0
					Return g
				EndIf	
			Next
		EndIf
	EndIf
End Function

Function draw_gadget(w.window, g.gadget)
	Select g\gad_type
		Case 0
			If g\gad_state = 0
				Color 75, 75, 75
				Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 1, g\gad_h - 1, 0		
				Color 200, 200, 200
				Rect w\win_x + g\gad_x, w\win_y + g\gad_y, g\gad_w - 1, g\gad_h - 1, 0
				Color 150, 150, 150
				Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 2, g\gad_h - 2, 1	
			Else	
				Color 75, 75, 75
				Rect w\win_x + g\gad_x, w\win_y + g\gad_y, g\gad_w - 1, g\gad_h - 1, 0
				Color 200, 200, 200
				Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 1, g\gad_h - 1, 0
				Color 145, 145, 145
				Rect w\win_x + g\gad_x + 1, w\win_y + g\gad_y + 1, g\gad_w - 2, g\gad_h - 2, 1
			EndIf
	End Select
End Function
								
Function create_window(wx, wy, ww, wh, wt$)
	Local w.window
	w.window = New window
	w\win_id = Handle(w)
	w\win_title$ = wt$
	w\win_x = wx
	w\win_y = wy
	w\win_w = ww
	w\win_h = wh
	w\gad_num = 0
	Return w\win_id
End Function

Function draw_windows(f)
	Local g, l.window
	l.window = Last window
	For w.window = Each window
		Color 100, 100, 100 
		Rect w\win_x, w\win_y, w\win_w, w\win_h, 1
		Color 75, 75, 75
		Rect w\win_x + 1, w\win_y + 18, w\win_w - 1, w\win_h - 18, 0		
		Color 200, 200, 200
		Rect w\win_x, w\win_y, w\win_w - 1, w\win_h - 1, 0
		If (l = w) And (f > 0) ; top window and focus
			Color 150, 150, 170
			Rect w\win_x + 1, w\win_y + 1, w\win_w - 2, 17, 1
			Color 220, 220, 220
			Text w\win_x + 4, w\win_y + 1, w\win_title$
		Else	
			Color 150, 150, 150
			Rect w\win_x + 1, w\win_y + 1, w\win_w - 2, 17, 1
			Color 120, 120, 120
			Text w\win_x + 4, w\win_y + 1, w\win_title$
		EndIf
		If w\gad_num
			For g=0 To w\gad_num - 1
				draw_gadget(w, Object.gadget(w\gad_id[g]))
			Next
		EndIf
	Next
End Function

Function update_windows_z(x, y, l_down)
	Local w.window
	w.window = Last window
	While w <> Null
		If RectsOverlap(x, y, 1, 1, w\win_x, w\win_y, w\win_w, w\win_h)
			Insert w After Last window
			If l_down
				If (y >= w\win_y) And (y <= (w\win_y + 18))
					Return 2 ; drag
				Else
					Return 1 ; focus
				EndIf
			EndIf
		EndIf
		w = Before w
	Wend
End Function