Page 1 of 1

Buttongadget replacement

Posted: Thu Jun 23, 2011 7:02 am
by jesperbrannmark
Hi.
I had the need for a basic buttongadget, but that could include a icon, a text (and multiline if needed) and be multiplatform.
So I made one.

Code: Select all

;init
Enumeration
  #constant_1
  #constant_2
EndEnumeration
Enumeration
  #font
EndEnumeration
LoadFont(#font,"Arial",12)
UsePNGImageDecoder()
;procedures
Procedure WrapText(x,y,text.s,width,color) 
  If TextWidth(text)<=width 
    Debug "TEXTWRAP:"+text+Str(x)+","+Str(y)
    DrawText((width/2)-(TextWidth(text.s)/2),y,text.s,RGBA($4F,$8C,$A3,255)) 
  Else 
    limit=0 : Repeat : limit+1 : Until TextWidth(Left(text,limit))>width : cut=limit 
    Repeat : cut-1 : Until Mid(text,cut,1)=" " Or Mid(text,cut,1)="-" Or cut=0 
    If cut=0 : cut=limit-1 : EndIf 
    DrawText((width/2)-(TextWidth(Left(text,cut))/2),y,Left(text,cut),RGBA($4F,$8C,$A3,255)) 
    wraptext(x,y+16,Right(text,Len(text)-cut),width,color) 
  EndIf 
EndProcedure 
Procedure.l createicon(icon.l,text.s, width=240,height=40,wrap.b=0)
  iconcount.l+1
  image.l=CreateImage(iconcount.l,width,height,32 | #PB_Image_Transparent)
  If icon.l
    image2.l=CatchImage(#constant_1,icon.l)
  Else
    image2.l=CreateImage(#constant_1,24,24)
  EndIf
  StartDrawing(ImageOutput(iconcount.l))
  If icon.l
    DrawAlphaImage(ImageID(#constant_1),10,(height/2)-(ImageHeight(#constant_1)/2),250) ;-(ImageHeight(ImageID(image2.l))/2),250)
  Else
    DrawingMode(#PB_2DDrawing_Default)
    LineXY(1,1,width-1,1,RGB(128,128,196))
    LineXY(1,1,1,height-1,RGB(128,128,196))
    LineXY(width-1,1,width-1,height-1,RGB(128,128,196))
    LineXY(1,height-1,width-1,height-1,RGB(128,128,196))    
    Box(0,0,width,height,RGB(128,128,128))
  EndIf
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  If width<30
    DrawingFont(FontID(#font)) 
  EndIf
  If wrap.b
    wraptext(20,30,text.s,width,RGBA($4F,$8C,$A3,255))    
  Else        
    DrawText((width/2)-(TextWidth(text.s)/2),(height/2)-(TextHeight(text.s)/2),text.s,RGBA($4F,$8C,$A3,255))
  EndIf
  DrawingMode(#PB_2DDrawing_Default)  
  StopDrawing()
  ProcedureReturn iconcount.l
EndProcedure

;main program
CatchImage(1,?icon)
OpenWindow(0,0,0,640,480,"Buttonimage test")
ButtonImageGadget(0,240,220,240,40,ImageID(createicon(?icon,"Print")))
;loop
While Not a=#PB_Event_CloseWindow
  a=WaitWindowEvent()
Wend
;end
End
;data
DataSection
  icon: 
  Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$3D77E00000000608,$47527301000000F8
  Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$C21E0000C21E0000
  Data.q $0000003E75D06E01,$02DB07454D497407,$18AD50F02D260001,$5441444947040000,$55936C5B969DC748
  Data.q $BB6BAFDB5F7FC01C,$5969585A32AEB76F,$6DCB5BA01BB418C7,$1882444881B78099,$E307D189025183E3
  Data.q $103068CF0C9F180B,$01A2204264912131,$640DD4040B701103,$B2D766C66192E45C,$AFD7EBAC3D6C1BAD
  Data.q $E35B1B2C80687CFD,$FBF39FF879C9393F,$6B9172747491CFDF,$EA633F40C0FA3D1D,$835D69A56E920020
  Data.q $5B7B40326939DD34,$591297451FD03EA7,$B96622B2D28D9325,$3E209644282960E7,$B1B4D8172DEFC232
  Data.q $BAF7DF7FB009CA49,$9DB3217E6B0CBCAB,$4A69B2AC1EDD0A0E,$53B3A9EB4AA4D4EB,$A32350C1378F0C42
  Data.q $F0AB298B75026963,$AD4CCF3980397B4D,$02D3E9AEE7F392BF,$A49B1B4DA5B9166A,$E948D291257E2733
  Data.q $F70D0C7D73ECB4E4,$BCD96E660988D33D,$BCB35E9CFA763A5E,$001DCBC963255C81,$6C81387F724B1860
  Data.q $6F69BA679004E6B5,$AA9CA52BEAEBD4EB,$4BD9F43FC9DF6008,$CDCB02A392013942,$0793948AFB5DAC0B
  Data.q $216E64BE847C5A00,$5387B3DA7E65A74A,$70F84BFC6BD49D1F,$2060C500B4D27BDB,$D18A5AEA13767C9A
  Data.q $1A4DB30F58E45DF0,$5925DAFE09FA7D9F,$D34027B7746FB5EF,$1770A18099E906BA,$A18C3E64F8DA79B1
  Data.q $205952486DC4DEF7,$4F2F559E2E6AB0B3,$BBDDBE76FB75BB38,$4EB6F6839A786817,$43695F2E49EB7CFD
  Data.q $7F1FEC1952A492D3,$75407B538BD03E85,$87CF85419F282C3E,$718B162D86D328A2,$53ADBDA02CD9F8E2
  Data.q $40D86FD669D2EBFF,$BC5CDBEDCEE09122,$B6BEAF37709127F8,$398D1A306BD5C696,$5F95EB4FD03623E5
  Data.q $D80B2648F1133490,$2837E6D6FE80E7BB,$ED704216538F17B5,$E2F8D1BF2DAD076A,$5D3D0169AE1C4A2A
  Data.q $6314F403FBD33877,$14E3462724D9EDD3,$5544307D76EE4E15,$6CB426EF77AF9FB5,$83A5295136C99239
  Data.q $1971D1B9C448F12C,$D1A31D897B0381F5,$7B74BB97D760F594,$D0B1178BB5001171,$8B1604216712781F
  Data.q $28F9B0716EB7DB85,$1953544BE3FD2B73,$7B46483FD7D17488,$2246306861559E44,$DF20F5995C142091
  Data.q $F04210DBEDD6CC5A,$AA883C1F34EB8DF7,$A5FA85E3CD5654AA,$08F0F897AF1E18C0,$E83F8891D146F6FF
  Data.q $183156932617D627,$814AA4B18263A8CD,$3F5AA2C153C78C32,$E5B3A7480B2C4891,$A18252D0C10A28A8
  Data.q $8FC5D5D7B82108A5,$20E5CB8A84210E47,$47A43F7EE448323E,$E6565002A6A4369F,$666A82DF06BF3424
  Data.q $9691A216ACD8EC38,$F8BD78F0514D1A29,$8E11A34410840103,$126A68AAA6863D1C,$557C2A56797900C9
  Data.q $D9B0CB3A710B7D78,$E21C3F0C281414AC,$0167E7B8E665CB5C,$07F1D7EB8DC33A5A,$0421058B1620E302
  Data.q $F70969470BA74E00,$A66389CE7F60F5EE,$F92B150A72ACD71B,$261DD22264C9828A,$E7C766ADEBC2ED12
  Data.q $71F350EEC371A43B,$C68BB76E0FFC37BD,$450210AC949E6BD5,$6817E773B0421051,$A26CB21B15F252C6
  Data.q $FBB848D98B08A4B4,$C271B06091B2792E,$BAF3BF6F4424FD3B,$5267F87A3F71F8F4,$ABAF9E01350243EA
  Data.q $466CD90C8E9ED347,$0ECEEE9519484D96,$4CBBE6F8D87967CA,$4F6700D71CA7AA36,$66CD88B95EAFD25F
  Data.q $00EEFFEC158AD964,$75F53486CC06928F,$55FBFFCB60FFDE21,$1D1DEB8F9B87264C,$CAEFA729786CAC6D
  Data.q $1E1BC99C220FF963,$4900000000B105DB,$00826042AE444E45
EndDataSection

Re: Buttongadget replacement

Posted: Thu Jun 23, 2011 10:54 am
by ts-soft
:D thx

but you should use Integer for handle and mempointer and your code run on x64! :wink:
icon.l = icon.i
image.l = image.l
...

greetings - Thomas

Re: Buttongadget replacement

Posted: Sat Jun 25, 2011 7:48 pm
by Kwai chang caine
Thanks to sharing 8)

Re: Buttongadget replacement

Posted: Sat Jun 25, 2011 9:12 pm
by IdeasVacuum
That's really neat. Thanks for sharing. 8)

Re: Buttongadget replacement

Posted: Sat Jun 25, 2011 10:32 pm
by Michael Vogel
As I have never conflicts with image and gadget numbers (I put them both into a single enumeration list), I use the following for creating buttons with icons.
The main problem still present is, that I found no simple way to draw strings with underlining instead of showing the '&' prefix (it seems, that DrawText uses the #SS_NOPREFIX flag)...

Code: Select all

Global OptIconsActive=#True

#ButtonIconBorder=10
#ButtonIconPadding=10

Enumeration
	#ButtonIcon_Left
	#ButtonIcon_Center
EndEnumeration

#NoTransparency=$ff000000
#FullTransparency=$00000000

Procedure SetGadgetIconText(Gadget,IconHandle,Text.s,IconSize=16,IconPosition=#ButtonIcon_Left)

	Protected Font=GetGadgetFont(#PB_Default)
	Protected BW,BH,IW
	Protected W_,T_

	BW=GadgetWidth(Gadget)
	BH=GadgetHeight(Gadget)
	IW=IconSize+#ButtonIconPadding
	
	CreateImage(Gadget,1,1)
	StartDrawing(ImageOutput(Gadget))
	DrawingFont(Font)
	W_=IW+TextWidth(Text)
	T_=(BH-TextHeight("Wg"))>>1
	StopDrawing()

	Select IconPosition
	Case #ButtonIcon_Left
		W_=#ButtonIconBorder
	Case #ButtonIcon_Center
		W_=(BW-W_)>>1
	EndSelect

	CreateImage(Gadget,BW,BH,32)
	StartDrawing(ImageOutput(Gadget))

	DrawingMode(#PB_2DDrawing_AlphaChannel)
	Box(0,0,BW,BH,#FullTransparency)

	DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
	DrawingFont(Font)
	;Box(0,0,16,16,#NoTransparency|#Red)
	DrawText(W_+IW,T_,Text,#NoTransparency|#Black)
	If IconHandle
		DrawImage(IconHandle,W_,(BH-IconSize)>>1)
	EndIf
	StopDrawing()

	SetGadgetAttribute(Gadget,#PB_Button_Image,ImageID(Gadget))

EndProcedure
Procedure GadgetIconText(Gadget,X,Y,W,H,IconHandle,Text.s,Flags=0)
	
	If OptIconsActive
		ButtonImageGadget(Gadget,X,Y,W,H,0)
		SetGadgetIconText(Gadget,IconHandle,ReplaceString(Text,"&",""),24)
	Else
		ButtonGadget(Gadget,X,Y,W,H,Text)
	EndIf
	
EndProcedure


OpenWindow(0, 0, 0, 512, 384, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

UsePNGImageDecoder()
IconHandle=CatchImage(0,?IconData)
ImageGadget(99,220,200,200,200,0)

GadgetIconText(1,10,20,200,40,IconHandle,"Yes")
GadgetIconText(2,10,120,200,40,IconHandle,"No")
GadgetIconText(3,10,220,200,40,IconHandle,"Maybe")
SetGadgetIconText(2,IconHandle,"No &Prefix ?!",24,#ButtonIcon_Center)

Repeat
	Select WaitWindowEvent()
	Case #PB_Event_Gadget
		DisableGadget(1,Random(1))
	Case #PB_Event_CloseWindow
		Break
	EndSelect
ForEver

 DataSection
      IconData:
      Data.q $0A1A0A0D474E5089,$524448490D000000,$1800000018000000,$3D77E00000000608,$47527301000000F8
      Data.q $0000E91CCEAE0042,$FF0044474B620600,$93A7BDA0FF00FF00,$7359487009000000,$C21E0000C21E0000
      Data.q $0000003E75D06E01,$02DB07454D497407,$18AD50F02D260001,$5441444947040000,$55936C5B969DC748
      Data.q $BB6BAFDB5F7FC01C,$5969585A32AEB76F,$6DCB5BA01BB418C7,$1882444881B78099,$E307D189025183E3
      Data.q $103068CF0C9F180B,$01A2204264912131,$640DD4040B701103,$B2D766C66192E45C,$AFD7EBAC3D6C1BAD
      Data.q $E35B1B2C80687CFD,$FBF39FF879C9393F,$6B9172747491CFDF,$EA633F40C0FA3D1D,$835D69A56E920020
      Data.q $5B7B40326939DD34,$591297451FD03EA7,$B96622B2D28D9325,$3E209644282960E7,$B1B4D8172DEFC232
      Data.q $BAF7DF7FB009CA49,$9DB3217E6B0CBCAB,$4A69B2AC1EDD0A0E,$53B3A9EB4AA4D4EB,$A32350C1378F0C42
      Data.q $F0AB298B75026963,$AD4CCF3980397B4D,$02D3E9AEE7F392BF,$A49B1B4DA5B9166A,$E948D291257E2733
      Data.q $F70D0C7D73ECB4E4,$BCD96E660988D33D,$BCB35E9CFA763A5E,$001DCBC963255C81,$6C81387F724B1860
      Data.q $6F69BA679004E6B5,$AA9CA52BEAEBD4EB,$4BD9F43FC9DF6008,$CDCB02A392013942,$0793948AFB5DAC0B
      Data.q $216E64BE847C5A00,$5387B3DA7E65A74A,$70F84BFC6BD49D1F,$2060C500B4D27BDB,$D18A5AEA13767C9A
      Data.q $1A4DB30F58E45DF0,$5925DAFE09FA7D9F,$D34027B7746FB5EF,$1770A18099E906BA,$A18C3E64F8DA79B1
      Data.q $205952486DC4DEF7,$4F2F559E2E6AB0B3,$BBDDBE76FB75BB38,$4EB6F6839A786817,$43695F2E49EB7CFD
      Data.q $7F1FEC1952A492D3,$75407B538BD03E85,$87CF85419F282C3E,$718B162D86D328A2,$53ADBDA02CD9F8E2
      Data.q $40D86FD669D2EBFF,$BC5CDBEDCEE09122,$B6BEAF37709127F8,$398D1A306BD5C696,$5F95EB4FD03623E5
      Data.q $D80B2648F1133490,$2837E6D6FE80E7BB,$ED704216538F17B5,$E2F8D1BF2DAD076A,$5D3D0169AE1C4A2A
      Data.q $6314F403FBD33877,$14E3462724D9EDD3,$5544307D76EE4E15,$6CB426EF77AF9FB5,$83A5295136C99239
      Data.q $1971D1B9C448F12C,$D1A31D897B0381F5,$7B74BB97D760F594,$D0B1178BB5001171,$8B1604216712781F
      Data.q $28F9B0716EB7DB85,$1953544BE3FD2B73,$7B46483FD7D17488,$2246306861559E44,$DF20F5995C142091
      Data.q $F04210DBEDD6CC5A,$AA883C1F34EB8DF7,$A5FA85E3CD5654AA,$08F0F897AF1E18C0,$E83F8891D146F6FF
      Data.q $183156932617D627,$814AA4B18263A8CD,$3F5AA2C153C78C32,$E5B3A7480B2C4891,$A18252D0C10A28A8
      Data.q $8FC5D5D7B82108A5,$20E5CB8A84210E47,$47A43F7EE448323E,$E6565002A6A4369F,$666A82DF06BF3424
      Data.q $9691A216ACD8EC38,$F8BD78F0514D1A29,$8E11A34410840103,$126A68AAA6863D1C,$557C2A56797900C9
      Data.q $D9B0CB3A710B7D78,$E21C3F0C281414AC,$0167E7B8E665CB5C,$07F1D7EB8DC33A5A,$0421058B1620E302
      Data.q $F70969470BA74E00,$A66389CE7F60F5EE,$F92B150A72ACD71B,$261DD22264C9828A,$E7C766ADEBC2ED12
      Data.q $71F350EEC371A43B,$C68BB76E0FFC37BD,$450210AC949E6BD5,$6817E773B0421051,$A26CB21B15F252C6
      Data.q $FBB848D98B08A4B4,$C271B06091B2792E,$BAF3BF6F4424FD3B,$5267F87A3F71F8F4,$ABAF9E01350243EA
      Data.q $466CD90C8E9ED347,$0ECEEE9519484D96,$4CBBE6F8D87967CA,$4F6700D71CA7AA36,$66CD88B95EAFD25F
      Data.q $00EEFFEC158AD964,$75F53486CC06928F,$55FBFFCB60FFDE21,$1D1DEB8F9B87264C,$CAEFA729786CAC6D
      Data.q $1E1BC99C220FF963,$4900000000B105DB,$00826042AE444E45
EndDataSection