Page 1 of 1

ResizeGadget + flag

Posted: Wed Jul 24, 2024 1:28 pm
by AZJIO
Simulates resizing gadgets like in AutoIt3 (GUICtrlSetResizing)

Code: Select all

Structure GadgetsSizesList
	id.i
	x.i
	y.i
	w.i
	h.i
	flag.i
EndStructure

Structure WH
	w.i
	h.i
	w2.i
	h2.i
EndStructure

Global NewList GadgetsSizesList.GadgetsSizesList()
Global GUI.WH

Procedure GetNewXYWH(ID)
	Protected x, y, w, h
	ForEach GadgetsSizesList()
		If GadgetsSizesList()\id = ID ; исправить на случай если не найдено
			Break
		EndIf
	Next
	
	With GadgetsSizesList()
		If \flag = 0 ; по умолчанию, всё остаётся на месте
			ProcedureReturn
		EndIf
		If \flag & 1 ; изменяется размер и отступы пропорционально новым размерам окна
			x = \x * GUI\w2 / GUI\w
			y = \y * GUI\h2 / GUI\h
			w = \w * GUI\w2 / GUI\w
			h = \h * GUI\h2 / GUI\h
		Else
			x = \x
			y = \y
			w = \w
			h = \h
		EndIf
		If \flag & 2 ; левый отступ не изменяется
			x = #PB_Ignore
		EndIf
		If \flag & 4 ; правый отступ не изменяется
			tmp = GUI\w - \x - \w
			If \flag & 2 ; левый отступ не изменяется
; 				x = #PB_Ignore
				w = GUI\w2 - \x - tmp
			Else
				x = GUI\w2 - w - tmp
			EndIf
		EndIf
; 		If \flag & 16
; 		EndIf
		If \flag & 32 ; верхний отступ не изменяется
			y = #PB_Ignore
		EndIf
		If \flag & 64 ; нижний отступ не изменяется
			tmp = GUI\h - \y - \h
			If \flag & 32 ; верхний отступ не изменяется
; 				y = #PB_Ignore
				h = GUI\h2 - \y - tmp
			Else
				y = GUI\h2 - h - tmp
			EndIf
		EndIf
		If \flag & 256 ; ширина не изменяется
			w = #PB_Ignore
		EndIf
		If \flag & 512 ; высота не изменяется
			h = #PB_Ignore
		EndIf
		If \flag & 8 ; не перемещается относительно горизонтального центра
			x = (\x + \w / 2) - w / 2
		EndIf
		If \flag & 128 ; не перемещается относительно вертикального центра
			y = (\y + \h / 2) - h / 2
		EndIf
	EndWith
	ResizeGadget(ID, x, y, w, h)
EndProcedure


Procedure SizeWindowHandler()
	With GUI
		\w2 = WindowWidth(0)
		\h2 = WindowHeight(0)
	EndWith
	GetNewXYWH(1)
	GetNewXYWH(2)
	
EndProcedure

Procedure AddGadgetSize(ID, flag)
	AddElement(GadgetsSizesList())
	With GadgetsSizesList()
		\id = ID
		\x = GadgetX(ID)
		\y = GadgetY(ID)
		\w = GadgetWidth(ID)
		\h = GadgetHeight(ID)
		\flag = flag
	EndWith
EndProcedure

;   Объединённые стили
; SIZE 768 (256+512) размер не изменяется
; MENUBAR 544 (512+32) элементы остаются в верхней части окна и без изменения высоты
; STATEBAR 576 (512+64) элементы остаются в нижней части окна и без изменения высоты
; ALL 802 (2+32+256+512) элемент не изменяется и не перемещается
; BORDERS 102 (2+4+32+64) размеры изменяются на величину изменения окна.

;-┌──GUI──┐
If OpenWindow(0, 0, 0, 720, 400, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
	With GUI
		\w = 720
		\h = 400
	EndWith
	ButtonGadget(1, 10, 10, 100, 30, "Button")
	AddGadgetSize(1, 1)
	EditorGadget(2, 10, 70, 700, 320)
	AddGadgetSize(2, 32 + 64 + 2 + 4)
	BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
;-┌──Loop──┐
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_Gadget
				Select EventGadget()
					Case 1
						Debug 1
				EndSelect
			Case #PB_Event_CloseWindow
				CloseWindow(0)
				End
		EndSelect
	ForEver
;-└──Loop──┘
EndIf
Instead of searching I used SetGadgetData(), GetGadgetData()

Code: Select all

Structure GadgetsSizesList
	id.i
	x.i
	y.i
	w.i
	h.i
	flag.i
EndStructure

Structure WH
	w.i
	h.i
	w2.i
	h2.i
EndStructure

Global NewList GadgetsSizesList.GadgetsSizesList()
Global GUI.WH

Procedure GetNewXYWH(ID)
	Protected x, y, w, h, *GadgetSize.GadgetsSizesList
	*GadgetSize = GetGadgetData(ID)
	
	With *GadgetSize
		If \flag = 0 ; по умолчанию, всё остаётся на месте
			ProcedureReturn
		EndIf
		If \flag & 1 ; изменяется размер и отступы пропорционально новым размерам окна
			x = \x * GUI\w2 / GUI\w
			y = \y * GUI\h2 / GUI\h
			w = \w * GUI\w2 / GUI\w
			h = \h * GUI\h2 / GUI\h
		Else
			x = \x
			y = \y
			w = \w
			h = \h
		EndIf
		If \flag & 2 ; левый отступ не изменяется
			x = #PB_Ignore
		EndIf
		If \flag & 4 ; правый отступ не изменяется
			tmp = GUI\w - \x - \w
			If \flag & 2 ; левый отступ не изменяется
; 				x = #PB_Ignore
				w = GUI\w2 - \x - tmp
			Else
				x = GUI\w2 - w - tmp
			EndIf
		EndIf
; 		If \flag & 16
; 		EndIf
		If \flag & 32 ; верхний отступ не изменяется
			y = #PB_Ignore
		EndIf
		If \flag & 64 ; нижний отступ не изменяется
			tmp = GUI\h - \y - \h
			If \flag & 32 ; верхний отступ не изменяется
; 				y = #PB_Ignore
				h = GUI\h2 - \y - tmp
			Else
				y = GUI\h2 - h - tmp
			EndIf
		EndIf
		If \flag & 256 ; ширина не изменяется
			w = #PB_Ignore
		EndIf
		If \flag & 512 ; высота не изменяется
			h = #PB_Ignore
		EndIf
		If \flag & 8 ; не перемещается относительно горизонтального центра
			x = (\x + \w / 2) - w / 2
		EndIf
		If \flag & 128 ; не перемещается относительно вертикального центра
			y = (\y + \h / 2) - h / 2
		EndIf
	EndWith
	ResizeGadget(ID, x, y, w, h)
EndProcedure


Procedure SizeWindowHandler()
	With GUI
		\w2 = WindowWidth(0)
		\h2 = WindowHeight(0)
	EndWith
	GetNewXYWH(1)
	GetNewXYWH(2)
	
EndProcedure

Procedure AddGadgetSize(ID, flag)
	Protected *item
	*item = AddElement(GadgetsSizesList())
	If *item
		With GadgetsSizesList()
			\id = ID
			\x = GadgetX(ID)
			\y = GadgetY(ID)
			\w = GadgetWidth(ID)
			\h = GadgetHeight(ID)
			\flag = flag
		EndWith
		SetGadgetData(ID, *item)
	EndIf
EndProcedure

;   Объединённые стили
; SIZE 768 (256+512) размер не изменяется
; MENUBAR 544 (512+32) элементы остаются в верхней части окна и без изменения высоты
; STATEBAR 576 (512+64) элементы остаются в нижней части окна и без изменения высоты
; ALL 802 (2+32+256+512) элемент не изменяется и не перемещается
; BORDERS 102 (2+4+32+64) размеры изменяются на величину изменения окна.

;-┌──GUI──┐
If OpenWindow(0, 0, 0, 720, 400, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
	With GUI
		\w = 720
		\h = 400
	EndWith
	ButtonGadget(1, 10, 10, 100, 30, "Button")
	AddGadgetSize(1, 1)
; 	EditorGadget(2, 10, 70, 700, 320)
; 	AddGadgetSize(2, 32 + 64 + 2 + 4)
	EditorGadget(2, 160, 100, 400, 200)
	AddGadgetSize(2, 1 + 8 + 128)
	BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
;-┌──Loop──┐
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_Gadget
				Select EventGadget()
					Case 1
						Debug 1
				EndSelect
			Case #PB_Event_CloseWindow
				CloseWindow(0)
				End
		EndSelect
	ForEver
;-└──Loop──┘
EndIf

Re: ResizeGadget + flag

Posted: Wed Jul 24, 2024 4:57 pm
by Mindphazer
Interesting
But what is the flag if i want a gadget to be stick on the right side when resizing the window, keeping the same width ?

Re: ResizeGadget + flag

Posted: Thu Jul 25, 2024 4:33 am
by AZJIO
4
I corrected it because it was wrong.

Re: ResizeGadget + flag

Posted: Thu Jul 25, 2024 8:53 am
by Mindphazer
Thanks a lot

A little variation using a map... And I defined constants, it's a bit more readable 8)

Code: Select all

#GUI_DOCKAUTO    = 1
#GUI_DOCKLEFT    = 2
#GUI_DOCKRIGHT   = 4
#GUI_DOCKHCENTER = 8
#GUI_DOCKTOP     = 32
#GUI_DOCKBOTTOM  = 64
#GUI_DOCKVCENTER = 128
#GUI_DOCKWIDTH   = 256
#GUI_DOCKHEIGHT  = 512

Structure GadgetsSizesList
;	id.i
	x.i
	y.i
	w.i
	h.i
	flag.i
EndStructure

Structure WH
	w.i
	h.i
	w2.i
	h2.i
EndStructure

Global NewMap GadgetsSizesList.GadgetsSizesList()
Global GUI.WH

Procedure GetNewXYWH(ID)
	Protected x, y, w, h

	FindMapElement(GadgetsSizesList(), Str(ID))
	
	With GadgetsSizesList()
		If \flag = 0 ; по умолчанию, всё остаётся на месте
			ProcedureReturn
		EndIf
		If \flag & 1 ; изменяется размер и отступы пропорционально новым размерам окна
			x = \x * GUI\w2 / GUI\w
			y = \y * GUI\h2 / GUI\h
			w = \w * GUI\w2 / GUI\w
			h = \h * GUI\h2 / GUI\h
		Else
			x = \x
			y = \y
			w = \w
			h = \h
		EndIf
		If \flag & 2 ; левый отступ не изменяется
			x = #PB_Ignore
		EndIf
		If \flag & 4 ; правый отступ не изменяется
			tmp = GUI\w - \x - \w
			If \flag & 2 ; левый отступ не изменяется
; 				x = #PB_Ignore
				w = GUI\w2 - \x - tmp
			Else
				x = GUI\w2 - w - tmp
			EndIf
		EndIf
; 		If \flag & 16
; 		EndIf
		If \flag & 32 ; верхний отступ не изменяется
			y = #PB_Ignore
		EndIf
		If \flag & 64 ; нижний отступ не изменяется
			tmp = GUI\h - \y - \h
			If \flag & 32 ; верхний отступ не изменяется
; 				y = #PB_Ignore
				h = GUI\h2 - \y - tmp
			Else
				y = GUI\h2 - h - tmp
			EndIf
		EndIf
		If \flag & 256 ; ширина не изменяется
			w = #PB_Ignore
		EndIf
		If \flag & 512 ; высота не изменяется
			h = #PB_Ignore
		EndIf
		If \flag & 8 ; не перемещается относительно горизонтального центра
			x = (\x + \w / 2) - w / 2
		EndIf
		If \flag & 128 ; не перемещается относительно вертикального центра
			y = (\y + \h / 2) - h / 2
		EndIf
	EndWith
	ResizeGadget(ID, x, y, w, h)
EndProcedure


Procedure SizeWindowHandler()
	With GUI
		\w2 = WindowWidth(0)
		\h2 = WindowHeight(0)
	EndWith
	
	ResetMap(GadgetsSizesList())
	While NextMapElement(GadgetsSizesList())
	  GetNewXYWH(Val(MapKey(GadgetsSizesList())))
	Wend
	
	;GetNewXYWH(1)
	;GetNewXYWH(2)
	
EndProcedure

Procedure AddGadgetSize(ID, flag)
  AddMapElement(GadgetsSizesList(), Str(ID))
	;AddElement(GadgetsSizesList())
	With GadgetsSizesList()
;		\id = ID
		\x = GadgetX(ID)
		\y = GadgetY(ID)
		\w = GadgetWidth(ID)
		\h = GadgetHeight(ID)
		\flag = flag
	EndWith
EndProcedure

;   Объединённые стили
; SIZE 768 (256+512) размер не изменяется
; MENUBAR 544 (512+32) элементы остаются в верхней части окна и без изменения высоты
; STATEBAR 576 (512+64) элементы остаются в нижней части окна и без изменения высоты
; ALL 802 (2+32+256+512) элемент не изменяется и не перемещается
; BORDERS 102 (2+4+32+64) размеры изменяются на величину изменения окна.

;-┌──GUI──┐
If OpenWindow(0, 0, 0, 720, 400, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
	With GUI
		\w = WindowWidth(0)
		\h = WindowHeight(0)
	EndWith
	Button1 = ButtonGadget(#PB_Any, 10, 10, 100, 30, "Button")
	Button2 = ButtonGadget(#PB_Any, 610, 10, 100, 30, "Button")
	AddGadgetSize(Button2, #GUI_DOCKRIGHT)
	AddGadgetSize(Button1, #GUI_DOCKAUTO)
	Editor = EditorGadget(#PB_Any, 10, 70, 700, 290)
	String = StringGadget(#PB_Any, 10, 370, 700, 20, "String...")
	AddGadgetSize(String, #GUI_DOCKBOTTOM | #GUI_DOCKLEFT | #GUI_DOCKRIGHT)
	AddGadgetSize(Editor, #GUI_DOCKBOTTOM | #GUI_DOCKTOP | #GUI_DOCKLEFT | #GUI_DOCKRIGHT)
	BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
;-┌──Loop──┐
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_Gadget
				Select EventGadget()
					;Case 1
					;	Debug 1
				EndSelect
			Case #PB_Event_CloseWindow
				CloseWindow(0)
				End
		EndSelect
	ForEver
;-└──Loop──┘
EndIf

Re: ResizeGadget + flag

Posted: Thu Jul 25, 2024 5:58 pm
by AZJIO
Mindphazer
If you added constants, then they also need to be added to the GetNewXYWH() function.

Re: ResizeGadget + flag

Posted: Thu Jul 25, 2024 11:30 pm
by boddhi
Hi guys,

Why not use the Dialog library, which does just as well (if not better) without making things so "complicated"?

Just for the fun of coding, maybe? :mrgreen: :wink:

Re: ResizeGadget + flag

Posted: Fri Jul 26, 2024 8:41 am
by Mindphazer
AZJIO wrote: Thu Jul 25, 2024 5:58 pm Mindphazer
If you added constants, then they also need to be added to the GetNewXYWH() function.
That's right !
Here's the modified version. I also attempted to proportionally resize each column of a ListIcon. It's not perfect and needs to be re-worked, but it works...

Code: Select all

#GUI_DOCKAUTO    = 1
#GUI_DOCKLEFT    = 2
#GUI_DOCKRIGHT   = 4
#GUI_DOCKHCENTER = 8
#GUI_DOCKTOP     = 32
#GUI_DOCKBOTTOM  = 64
#GUI_DOCKVCENTER = 128
#GUI_DOCKWIDTH   = 256
#GUI_DOCKHEIGHT  = 512

Structure GadgetsSizesList
	x.i
	y.i
	w.i
	h.i
	flag.i
EndStructure

Structure WH
	w.i
	h.i
	w2.i
	h2.i
EndStructure

Global NewMap GadgetsSizesList.GadgetsSizesList()
Global GUI.WH

Procedure GetNewXYWH(ID)
	Protected x, y, w, h, Oldw, tmp, FacX.f, i
	If FindMapElement(GadgetsSizesList(), Str(ID))
	  With GadgetsSizesList()
  		If \flag = 0 ; по умолчанию, всё остаётся на месте  
			  ProcedureReturn
		  EndIf
	  	If \flag & #GUI_DOCKAUTO ; изменяется размер и отступы пропорционально новым размерам окна
  			x = \x * GUI\w2 / GUI\w
  			y = \y * GUI\h2 / GUI\h
  			w = \w * GUI\w2 / GUI\w
	  		h = \h * GUI\h2 / GUI\h
  		Else
  			x = \x
  			y = \y
  			w = \w
  			h = \h
  		EndIf
  		If \flag & #GUI_DOCKLEFT ; левый отступ не изменяется
  			x = #PB_Ignore
  		EndIf
	  	If \flag & #GUI_DOCKRIGHT ; правый отступ не изменяется
  			tmp = GUI\w - \x - \w
  			If \flag & #GUI_DOCKLEFT ; левый отступ не изменяется
; 				x = #PB_Ignore
	  			w = GUI\w2 - \x - tmp
	  		Else
  				x = GUI\w2 - w - tmp
  			EndIf
	  	EndIf
; 		If \flag & 16
; 		EndIf
  		If \flag & #GUI_DOCKTOP ; верхний отступ не изменяется
  			y = #PB_Ignore
  		EndIf
  		If \flag & #GUI_DOCKBOTTOM ; нижний отступ не изменяется
  			tmp = GUI\h - \y - \h
  			If \flag & #GUI_DOCKTOP ; верхний отступ не изменяется
;   				y = #PB_Ignore
	  			h = GUI\h2 - \y - tmp
	  		Else
	  			y = GUI\h2 - h - tmp
	  		EndIf
  		EndIf
  		If \flag & #GUI_DOCKWIDTH ; ширина не изменяется
  			w = #PB_Ignore
  		EndIf
  		If \flag & #GUI_DOCKHEIGHT ; высота не изменяется
  			h = #PB_Ignore
  		EndIf
  		If \flag & #GUI_DOCKHCENTER ; не перемещается относительно горизонтального центра
  			x = (\x + \w / 2) - w / 2
  		EndIf
  		If \flag & #GUI_DOCKVCENTER ; не перемещается относительно вертикального центра
  			y = (\y + \h / 2) - h / 2
  		EndIf
  		
  	EndWith
  	Oldw = GadgetWidth(ID)
  	ResizeGadget(ID, x, y, w, h)
  	If GadgetType(ID) = #PB_GadgetType_ListIcon
  	  FacX = GadgetWidth(ID) / Oldw
  	  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  	    SendMessage_(GadgetID(ID), #WM_SETREDRAW, 0, 0)  
  	  CompilerEndIf
  	  For i = 0 To  GetGadgetAttribute(ID, #PB_ListIcon_ColumnCount) - 1
  	    SetGadgetItemAttribute(ID, 0, #PB_ListIcon_ColumnWidth, GetGadgetItemAttribute(ID, 0, #PB_ListIcon_ColumnWidth, i) * FacX, i)
  	  Next i
  	  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
        SendMessage_(GadgetID(ID),#WM_SETREDRAW, 1, 0)
        InvalidateRect_(GadgetID(ID), 0, 1)
        UpdateWindow_(GadgetID(ID)) 
  	  CompilerEndIf
  	EndIf 	  
	EndIf
EndProcedure

Procedure SizeWindowHandler()
	With GUI
		\w2 = WindowWidth(0)
		\h2 = WindowHeight(0)
	EndWith
	
	ResetMap(GadgetsSizesList())
	While NextMapElement(GadgetsSizesList())
	  GetNewXYWH(Val(MapKey(GadgetsSizesList())))
	Wend
	
EndProcedure

Procedure AddGadgetSize(ID, Flag)
  AddMapElement(GadgetsSizesList(), Str(ID))
	With GadgetsSizesList()
		\x = GadgetX(ID)
		\y = GadgetY(ID)
		\w = GadgetWidth(ID)
		\h = GadgetHeight(ID)
		\flag = Flag
	EndWith
EndProcedure

;   Объединённые стили
; SIZE 768 (256+512) размер не изменяется
; MENUBAR 544 (512+32) элементы остаются в верхней части окна и без изменения высоты
; STATEBAR 576 (512+64) элементы остаются в нижней части окна и без изменения высоты
; ALL 802 (2+32+256+512) элемент не изменяется и не перемещается
; BORDERS 102 (2+4+32+64) размеры изменяются на величину изменения окна.

CompilerIf #PB_Compiler_IsMainFile

;-┌──GUI──┐
  If OpenWindow(0, 0, 0, 720, 400, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  	With GUI
  		\w = WindowWidth(0)
  		\h = WindowHeight(0)
  	EndWith
  	Button1 = ButtonGadget(#PB_Any, 10, 10, 100, 30, "Button")
  	Button2 = ButtonGadget(#PB_Any, 610, 10, 100, 30, "Button")
  	AddGadgetSize(Button2, #GUI_DOCKRIGHT)
  	AddGadgetSize(Button1, #GUI_DOCKAUTO)
  	Editor = EditorGadget(#PB_Any, 10, 70, 200, 290)
  	ListIcon = ListIconGadget(#PB_Any, 220, 70, 490, 290, "Colonne 1", 150, #PB_ListIcon_GridLines)
  	String = StringGadget(#PB_Any, 10, 370, 700, 20, "String...")
  	AddGadgetColumn(ListIcon, 1, "Colonne 2", 100)
  	AddGadgetColumn(ListIcon, 2, "Colonne 3", 80)
  	AddGadgetColumn(ListIcon, 3, "Colonne 4", 150)
  	AddGadgetSize(ListIcon, #GUI_DOCKBOTTOM | #GUI_DOCKTOP | #GUI_DOCKRIGHT | #GUI_DOCKLEFT )
  	AddGadgetSize(String, #GUI_DOCKBOTTOM | #GUI_DOCKLEFT | #GUI_DOCKRIGHT)
  	AddGadgetSize(Editor, #GUI_DOCKBOTTOM | #GUI_DOCKTOP | #GUI_DOCKLEFT); | #GUI_DOCKRIGHT)
  	BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
;-┌──Loop──┐
  	Repeat
   		Select WaitWindowEvent()
	;  		Case #PB_Event_Gadget

	  		Case #PB_Event_CloseWindow
	  			CloseWindow(0)
	  			End
	  	EndSelect
	  ForEver
;-└──Loop──┘
  EndIf
CompilerEndIf

Re: ResizeGadget + flag

Posted: Fri Jul 26, 2024 8:43 am
by Mindphazer
boddhi wrote: Thu Jul 25, 2024 11:30 pm Hi guys,

Why not use the Dialog library, which does just as well (if not better) without making things so "complicated"?

Just for the fun of coding, maybe? :mrgreen: :wink:
I know :D
But I'm really not comfortable with Dialog Library !

Re: ResizeGadget + flag

Posted: Fri Jul 26, 2024 11:21 am
by boddhi
Mindphazer wrote: But I'm really not comfortable with Dialog Library !
If you only knew how it makes life easier! :mrgreen:
It's not very complicated. I did it, that's for sure! :mrgreen:

In first times, It could be a little difficult to understand how to build your UI directly in XML, but there's Hex0r's very useful, shall I say excellent! DialogDesign0r tool.

So, use the Dialog library, at least to create the dialog box. After, you can use Dialog library or directly PB window/gadget libraries instruction sets, it depends how you've built your XML string.