Page 1 of 1

Rotating Button Text Matching Progressbar update

Posted: Thu Mar 23, 2017 1:18 am
by Zebuddi123
Hi to all I had thought about doing something like this for a while, having a matching rotating button text "Working..." etc while a statusbar progress was upating. Tonight ShadowStorm & infratec`s post
http://www.purebasic.fr/english/viewtop ... 13&t=68164 gave insperation to have a go. And I came up with this and yes i know its gimmicky but it was fun to do and as usual with PB very easy with a few lines of code :). Updated to DisableGadget(Buttongadget) whilst updating...

Requires ThreadSafe Option in Compiler Option`s Switched ON !!!!

Zebuddi.

Code: Select all

CompilerIf Not #PB_Compiler_Thread
	MessageRequester("Thread Error", "Turn on ThreadSafe Mode in Compiler Option")
	End
CompilerEndIf	

Enumeration
	#Fenetre
	#ButonImageGadget
	#Image
	#RotateStart
	#RotateStop
	#StatusBarID
EndEnumeration


Global *iEvData = AllocateStructure(integer)

Procedure DrawIt(TexteBouton.s, AngleTexte.f)
	If CreateImage(#Image, 150, 150, 32, #PB_Image_Transparent) And StartDrawing(ImageOutput(#Image))
		DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
		
		LineXY(70, 75, 80, 75, $FF000000)
		LineXY(75, 70, 75, 80, $FF000000)
		
		X.i = (ImageWidth(#Image) - TextWidth(TexteBouton.s) * Cos(Radian(AngleTexte)) - TextHeight(TexteBouton) * Sin(Radian(AngleTexte))) / 2
		Y.i = (ImageHeight(#Image) + TextWidth(TexteBouton.s) * Sin(Radian(AngleTexte)) - TextHeight(TexteBouton) * Cos(Radian(AngleTexte))) / 2
		
		DrawRotatedText(X.i, Y.i, TexteBouton, AngleTexte, RGBA(150, 75, 200, 255))
		StopDrawing()
		
		SetGadgetAttribute(#ButonImageGadget, #PB_Button_Image, ImageID(#Image))
		
		FreeImage(#Image)
		
	EndIf
EndProcedure

Procedure draw(dummy.i)
	Protected Angle.f = 360, fSlowDown.f,  iFinnished = #False
	Repeat
		Angle.f - 1
		If Angle = 0
			Angle = 360
		EndIf
		DrawIt("Working", Angle)
		If *iEvData = #RotateStop
			Debug "rotatestop " + Str(Angle)
			Repeat	
				Angle.f - 1
				DrawIt("Working", Angle)
				Delay(iSlowDown) : iSlowDown + 0.25
			Until  Angle => 0
			iFinnished = #True
		EndIf
	Until iFinnished = #True	
	*iEvData =#RotateStart
	Delay(100)
	DisableGadget(#ButonImageGadget, #False)
	DrawIt("Process Data", 0)	
	
EndProcedure

Procedure UpdateStatBarProgess(dummy.i)
	Protected iProgressDone.i = 0
	Repeat
		iProgressDone + 2
		StatusBarProgress(#StatusBarID, 1, iProgressDone)
		StatusBarText(#StatusBarID, 0, Str(iProgressDone) + "%", #PB_StatusBar_Center)
		Delay(150);  dummy to test with
		Select iProgressDone
			Case 97,98 
				*iEvData = #RotateStop
		EndSelect	
	Until iProgressDone = 100
	StatusBarProgress(#StatusBarID, 1, 0)
	StatusBarText(#StatusBarID, 0, "0%", #PB_StatusBar_Center)
	*iEvData = #RotateStart
EndProcedure

Procedure ProcessGadgetUpdates()
	DisableGadget(#ButonImageGadget, #True)
	StatusBarProgress(#StatusBarID, 1, 0)
	CreateThread(@draw(), 0)
	CreateThread(@UpdateStatBarProgess(),0)
EndProcedure


OpenWindow(#Fenetre, 327, 177, 500, 300, "Exemple Texte Rotation Centré...",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)

If CreateStatusBar(#StatusBarID, WindowID(#Fenetre))
	AddStatusBarField(300)
	AddStatusBarField(200)
EndIf

ButtonImageGadget(#ButonImageGadget, 10, 10, 150, 150, 0)
DrawIt("Process Data", 0)
Repeat
	
	Event = WaitWindowEvent()
	EventGadget = EventGadget()
	EventType = EventType()
		
	Select Event

	Case #PB_Event_Gadget
			Select EventGadget
				Case #ButonImageGadget
					ProcessGadgetUpdates()
			EndSelect
			
	EndSelect
	
Until Event = #PB_Event_CloseWindow

Re: Rotating Button Text Matching Progressbar update

Posted: Thu Mar 23, 2017 2:17 am
by ShadowStorm
Nice :D