Two years later I have finally updated my code to use VectorDrawing to draw the shapes of the steps. I also added a Left click handler procedure to change the current step by clicking on it or use previous and Next button as you see fit. Finally I have added an instruction to resize the gadget.
I'm going to use this gadget in the Tutorial Manager for my game model editor program.
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : StepWizardGadget
; Nom du fichier : StepWizardGadget - Module.pb
; Version du fichier : 1.1.1
; Programmation : OK
; Alias : StarBootics
; Date : 15-11-2019
; Mise à jour : 07-10-2021
; Code PureBasic : V5.73 LTS
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Programming notes
;
; Based on Olivier13 (English forum) original source code.
; See here : https://www.purebasic.fr/english/viewtopic.php?f=12&t=73926
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DeclareModule StepWizard
Declare Gadget(GadgetID.i, x.l, y.l, Width.l, Height.l, Steps.s)
Declare SetSteps(GadgetID.i, Steps.s)
Declare SetSelectedColor(GadgetID.i, BackColor.l, TextColor.l)
Declare SetNonSelectedColor(GadgetID.i, BackColor.l, TextColor.l)
Declare SetStepID(GadgetID.i, StepID.l)
Declare.l GetStepID(GadgetID.i)
Declare PreviousStep(GadgetID.i)
Declare NextStep(GadgetID.i)
Declare Resize(GadgetID.i, x.l, y.l, Width.l, Height.l)
Declare SetUserData(GadgetID.i, P_UserData.i)
Declare.i GetUserData(GadgetID.i)
Declare Free(GadgetID.i)
EndDeclareModule
Module StepWizard
Structure StepWizard
Steps.s
StepID.l
SelectedColor.l
SelectedTextColor.l
NonSelectedColor.l
NonSelectedTextColor.l
TriangleWidth.d
UserData.i
EndStructure
Macro IsBetween(Value, Lower, Upper)
((Value) >= (Lower) And (Value) <= (Upper))
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Constructeur (Private) <<<<<
Procedure.i CreateNewStepWizard()
*StepWizardA.StepWizard = AllocateStructure(StepWizard)
If *StepWizardA = #Null
MessageRequester("Fatal Error", "CreateNewStepWizard() - Impossible to Allocate Structure !")
End
EndIf
ProcedureReturn *StepWizardA
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Draw (Private) <<<<<
Procedure Private_Triangle(X.f, Y.f, Width.f, Height.f, Reverse.i=#False)
If Reverse
AddPathLine(X + Width, Y + Round(Height / 2, #PB_Round_Nearest))
AddPathLine(X, Y)
Else
AddPathLine(X + Width, Y + Round(Height / 2, #PB_Round_Nearest))
AddPathLine(X, Y + Height)
EndIf
EndProcedure
Procedure Private_Draw(GadgetID.i)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
StepCount = CountString(*StepWizardA\Steps, "|") + 1
Width.l = GadgetWidth(GadgetID)
Height.l = GadgetHeight(GadgetID)
StepWidth.d = Width / StepCount
If StartVectorDrawing(CanvasVectorOutput(GadgetID))
For Index = 0 To StepCount - 1
If *StepWizardA\StepID = Index + 1
Color = *StepWizardA\SelectedColor | $FF000000
Else
Color = *StepWizardA\NonSelectedColor | $FF000000
EndIf
If Index = 0
X.d = 1.0
Y.d = 1.0
MovePathCursor(X, Y + Height - 2)
AddPathLine(X, Y)
AddPathLine(X + StepWidth, Y)
Private_Triangle(X + StepWidth, Y, *StepWizardA\TriangleWidth, Height - 2)
ClosePath()
X + StepWidth
ElseIf IsBetween(Index, 1, StepCount - 2)
MovePathCursor(X, Y + Height - 2)
Private_Triangle(X, Y, *StepWizardA\TriangleWidth, Height - 2, #True)
x + StepWidth
AddPathLine(X, Y)
Private_Triangle(X, Y, *StepWizardA\TriangleWidth, Height - 2)
ClosePath()
ElseIf Index = StepCount - 1
StepWidth = Width - StepWidth * (StepCount - 1)
MovePathCursor(X, Y + Height - 2)
Private_Triangle(X, Y, *StepWizardA\TriangleWidth, Height - 2, #True)
AddPathLine(X + StepWidth-2, Y)
AddPathLine(X + StepWidth-2, Y + Height - 2)
ClosePath()
EndIf
VectorSourceColor(Color)
FillPath(#PB_Path_Preserve)
VectorSourceColor(RGBA(000, 000, 000, 255))
StrokePath(2, #PB_Path_RoundCorner)
Next
StopVectorDrawing()
EndIf
StepWidth.d = Width / StepCount
X = 1.0
If StartDrawing(CanvasOutput(GadgetID))
DrawingMode(#PB_2DDrawing_Transparent)
For Index = 0 To StepCount - 1
If *StepWizardA\StepID = Index + 1
Color = *StepWizardA\SelectedColor
TextColor = *StepWizardA\SelectedTextColor
Else
Color = *StepWizardA\NonSelectedColor
TextColor = *StepWizardA\NonSelectedTextColor
EndIf
StepName.s = StringField(*StepWizardA\Steps, Index + 1, "|")
TextWidth = TextWidth(StepName)
TextHeight = TextHeight(StepName)
If IsBetween(Index, 1, StepCount - 2)
DrawText(x+((StepWidth-TextWidth)/2) + *StepWizardA\TriangleWidth/2, (Height - TextHeight)/2, StepName, TextColor, Color)
Else
DrawText(x+((StepWidth-TextWidth)/2), (Height - TextHeight)/2, StepName, TextColor, Color)
EndIf
X + StepWidth
Next
StopDrawing()
EndIf
EndIf
EndIf
EndProcedure
Procedure Private_LeftClickHandler()
GadgetID.i = EventGadget()
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
StepCount = CountString(*StepWizardA\Steps, "|") + 1
Width.l = GadgetWidth(GadgetID)
StepWidth.d = Width / StepCount
X = GetGadgetAttribute(GadgetID, #PB_Canvas_MouseX)
xx.d = 1
For StepID = 0 To StepCount - 1
If X > xx And X < xx + StepWidth + *StepWizardA\TriangleWidth
*StepWizardA\StepID = StepID + 1
Private_Draw(GadgetID)
Break
EndIf
xx + StepWidth
Next
EndIf
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Gadget <<<<<
Procedure Gadget(GadgetID.i, x.l, y.l, Width.l, Height.l, Steps.s)
*StepWizardA.StepWizard = CreateNewStepWizard()
GadgetHandle = CanvasGadget(GadgetID, x, y, Width, Height)
If GadgetID = #PB_Any
GadgetID = GadgetHandle
EndIf
*StepWizardA\Steps = Steps
*StepWizardA\StepID = 1
*StepWizardA\SelectedColor = $00cc99
*StepWizardA\SelectedTextColor = $ffffff
*StepWizardA\NonSelectedColor = $e0e0e0
*StepWizardA\NonSelectedTextColor = $000000
*StepWizardA\TriangleWidth = 15.0
BindGadgetEvent(GadgetID, @Private_LeftClickHandler(), #PB_EventType_LeftClick)
SetGadgetData(GadgetID, *StepWizardA)
Private_Draw(GadgetID)
ProcedureReturn GadgetID
EndProcedure
Procedure SetSteps(GadgetID.i, Steps.s)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
*StepWizardA\Steps = Steps
Private_Draw(GadgetID)
EndIf
EndIf
EndProcedure
Procedure SetSelectedColor(GadgetID.i, BackColor.l, TextColor.l)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
*StepWizardA\SelectedColor = BackColor
*StepWizardA\SelectedTextColor = TextColor
Private_Draw(GadgetID)
EndIf
EndIf
EndProcedure
Procedure SetNonSelectedColor(GadgetID.i, BackColor.l, TextColor.l)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
*StepWizardA\NonSelectedColor = BackColor
*StepWizardA\NonSelectedTextColor = TextColor
Private_Draw(GadgetID)
EndIf
EndIf
EndProcedure
Procedure SetStepID(GadgetID.i, StepID.l)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
If IsBetween(StepID, 1, CountString(*StepWizardA\Steps, "|") + 1)
*StepWizardA\StepID = StepID
Private_Draw(GadgetID)
EndIf
EndIf
EndIf
EndProcedure
Procedure.l GetStepID(GadgetID.i)
CurrentStepID = -1
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
CurrentStepID = *StepWizardA\StepID
EndIf
EndIf
ProcedureReturn CurrentStepID
EndProcedure
Procedure PreviousStep(GadgetID.i)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
*StepWizardA\StepID = *StepWizardA\StepID - 1
If *StepWizardA\StepID < 1
*StepWizardA\StepID = 1
EndIf
Private_Draw(GadgetID)
EndIf
EndIf
EndProcedure
Procedure NextStep(GadgetID.i)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
*StepWizardA\StepID = *StepWizardA\StepID + 1
If *StepWizardA\StepID > CountString(*StepWizardA\Steps, "|") + 1
*StepWizardA\StepID = CountString(*StepWizardA\Steps, "|") + 1
EndIf
Private_Draw(GadgetID)
EndIf
EndIf
EndProcedure
Procedure Resize(GadgetID.i, x.l, y.l, Width.l, Height.l)
ResizeGadget(GadgetID, x, y, Width, Height)
Private_Draw(GadgetID)
EndProcedure
Procedure SetUserData(GadgetID.i, P_UserData.i)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
*StepWizardA\UserData = P_UserData
EndIf
EndIf
EndProcedure
Procedure.i GetUserData(GadgetID.i)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
P_UserData.i = *StepWizardA\UserData
EndIf
EndIf
ProcedureReturn P_UserData
EndProcedure
Procedure Free(GadgetID.i)
If IsGadget(GadgetID)
*StepWizardA.StepWizard = GetGadgetData(GadgetID)
If *StepWizardA <> #Null
UnbindGadgetEvent(GadgetID, @Private_LeftClickHandler(), #PB_EventType_LeftClick)
FreeStructure(*StepWizardA)
FreeGadget(GadgetID)
EndIf
EndIf
EndProcedure
EndModule
CompilerIf #PB_Compiler_IsMainFile
If OpenWindow(0, 0, 0, 800, 250, "Step Wizard", #PB_Window_SizeGadget)
StepWizard::Gadget(0, 2, 2, 800-4, 50, "1st Step|2nd Step|3rd Step|4th Step|5th Step|Finish")
StepWizard::Gadget(1, 2, 55, 800-4, 50, "1ère Étape|2e Étape|3e Étape|4e Étape|5e Étape|Terminé")
StepWizard::Gadget(2, 2, 110, 800-4, 50, "Étape 1|Étape 2|Étape 3|Étape 4|Étape 5|Terminé")
StepWizard::SetSelectedColor(1, RGB(255, 127, 000), RGB(255, 255, 255))
StepWizard::SetSelectedColor(2, RGB(000, 127, 255), RGB(255, 255, 255))
ButtonGadget(3, WindowWidth(0)-110, 165,100,34,"Next")
ButtonGadget(4, GadgetX(3)-110,165,105,34,"Prev")
Repeat
Select WaitWindowEvent()
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case 0
If EventType() = #PB_EventType_LeftClick
Debug "#PB_EventType_LeftClick StepWizard 0 -> " + Str(StepWizard::GetStepID(0))
EndIf
Case 1
If EventType() = #PB_EventType_LeftClick
Debug "#PB_EventType_LeftClick StepWizard 1 -> " + Str(StepWizard::GetStepID(1))
EndIf
Case 2
If EventType() = #PB_EventType_LeftClick
Debug "#PB_EventType_LeftClick StepWizard 2 -> " + Str(StepWizard::GetStepID(2))
EndIf
Case 3
StepWizard::NextStep(0)
StepWizard::NextStep(1)
StepWizard::NextStep(2)
Case 4
StepWizard::PreviousStep(0)
StepWizard::PreviousStep(1)
StepWizard::PreviousStep(2)
EndSelect
Case #PB_Event_SizeWindow
StepWizard::Resize(0, #PB_Ignore, #PB_Ignore, WindowWidth(0)-4, #PB_Ignore)
StepWizard::Resize(1, #PB_Ignore, #PB_Ignore, WindowWidth(0)-4, #PB_Ignore)
StepWizard::Resize(2, #PB_Ignore, #PB_Ignore, WindowWidth(0)-4, #PB_Ignore)
ResizeGadget(3, WindowWidth(0)-110, #PB_Ignore, #PB_Ignore, #PB_Ignore)
ResizeGadget(4, GadgetX(3)-110, #PB_Ignore, #PB_Ignore, #PB_Ignore)
Case #PB_Event_CloseWindow
Select EventWindow()
Case 0
Break
EndSelect
EndSelect
ForEver
EndIf
CompilerEndIf
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<