Page 2 of 3

Re: Gauge display

Posted: Mon Feb 21, 2011 6:52 pm
by Kwai chang caine
Cool too 8)
But just for information, on my old PC your code is less fluid.
Perhaps much more calculations to perform ...
Thanks for sharing 8)

Re: Gauge display

Posted: Mon Feb 21, 2011 9:01 pm
by Guimauve
Kwaï chang caïne wrote:Cool too 8)
But just for information, on my old PC your code is less fluid.
Perhaps much more calculations to perform ...
Thanks for sharing 8)
Hello everyone,

A little update. The Luis's Image Rotation routine library are not needed anymore. So this version will probably much faster than the previous one.

Best Regards
Guimauve.

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : GaugeGadget
; File Name : GaugeGadget.pb
; File version: 1.1.0
; Programmation : OK
; Programmed by : Trond
; Modified by : Guimauve
; Date : 20-02-2011
; Mise à jour : 21-02-2011
; PureBasic code : 4.51
; Plateform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes :
;
; Some field in the Gauge Structure has been 
; renamed or suppressed.
; 
; A layer has been added for the Needle. The size 
; for this layer is 4 times larger than other 
; layer. This is needed to draw the needle more 
; smootly. 
;
; Finally, the GaugeGadget shape can be square
; only.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Gauge

  PosX.w
  PosY.w
  Size.w
  Center.w
  ScaleRadius.w
  Min.l
  Max.l
  BigStep.l
  SmallStep.l
  SectorDegrees.w
  Value.l
  Text.s
  SubText.s
  GadgetID.l
  GadgetHandle.l
  BackGroundColor.l
  ScaleColor.l
  ScaleBackGroundColor.l
  TextColor.l
  SubTextColor.l
  NeedleColor.l
  ScaleFontHandle.i
  TextFontHandle.i
  SubTextFontHandle.i
  LayerSize.w
  NeedleLength.l
  NeedlePivotRadius.l
  NeedleTipWidth.l
  NeedleCenWidth.l
  BackGroundLayer.l
  ScaleLayer.l
  DescriptionLayer.l
  NeedleLayer.l
  ComposedLayer.l

EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetGaugePosX(GaugeA)

  GaugeA\PosX

EndMacro

Macro GetGaugePosY(GaugeA)

  GaugeA\PosY

EndMacro

Macro GetGaugeSize(GaugeA)

  GaugeA\Size

EndMacro

Macro GetGaugeCenter(GaugeA)

  GaugeA\Center

EndMacro

Macro GetGaugeScaleRadius(GaugeA)

  GaugeA\ScaleRadius

EndMacro

Macro GetGaugeMin(GaugeA)

  GaugeA\Min

EndMacro

Macro GetGaugeMax(GaugeA)

  GaugeA\Max

EndMacro

Macro GetGaugeBigStep(GaugeA)

  GaugeA\BigStep

EndMacro

Macro GetGaugeSmallStep(GaugeA)

  GaugeA\SmallStep

EndMacro

Macro GetGaugeSectorDegrees(GaugeA)

  GaugeA\SectorDegrees

EndMacro

Macro GetGaugeValue(GaugeA)

  GaugeA\Value

EndMacro

Macro GetGaugeText(GaugeA)

  GaugeA\Text

EndMacro

Macro GetGaugeSubText(GaugeA)

  GaugeA\SubText

EndMacro

Macro GetGaugeGadgetID(GaugeA)

  GaugeA\GadgetID

EndMacro

Macro GetGaugeGadgetHandle(GaugeA)

  GaugeA\GadgetHandle

EndMacro

Macro GetGaugeBackGroundColor(GaugeA)

  GaugeA\BackGroundColor

EndMacro

Macro GetGaugeScaleColor(GaugeA)

  GaugeA\ScaleColor

EndMacro

Macro GetGaugeScaleBackGroundColor(GaugeA)

  GaugeA\ScaleBackGroundColor

EndMacro

Macro GetGaugeTextColor(GaugeA)

  GaugeA\TextColor

EndMacro

Macro GetGaugeSubTextColor(GaugeA)

  GaugeA\SubTextColor

EndMacro

Macro GetGaugeNeedleColor(GaugeA)

  GaugeA\NeedleColor

EndMacro

Macro GetGaugeScaleFontHandle(GaugeA)

  GaugeA\ScaleFontHandle

EndMacro

Macro GetGaugeTextFontHandle(GaugeA)

  GaugeA\TextFontHandle

EndMacro

Macro GetGaugeSubTextFontHandle(GaugeA)

  GaugeA\SubTextFontHandle

EndMacro

Macro GetGaugeLayerSize(GaugeA)

  GaugeA\LayerSize

EndMacro

Macro GetGaugeNeedleLength(GaugeA)

  GaugeA\NeedleLength

EndMacro

Macro GetGaugeNeedlePivotRadius(GaugeA)

  GaugeA\NeedlePivotRadius

EndMacro

Macro GetGaugeNeedleTipWidth(GaugeA)

  GaugeA\NeedleTipWidth

EndMacro

Macro GetGaugeNeedleCenWidth(GaugeA)

  GaugeA\NeedleCenWidth

EndMacro

Macro GetGaugeBackGroundLayer(GaugeA)

  GaugeA\BackGroundLayer

EndMacro

Macro GetGaugeScaleLayer(GaugeA)

  GaugeA\ScaleLayer

EndMacro

Macro GetGaugeDescriptionLayer(GaugeA)

  GaugeA\DescriptionLayer

EndMacro

Macro GetGaugeNeedleLayer(GaugeA)

  GaugeA\NeedleLayer

EndMacro

Macro GetGaugeComposedLayer(GaugeA)

  GaugeA\ComposedLayer

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetGaugePosX(GaugeA, P_PosX)

  GetGaugePosX(GaugeA) = P_PosX

EndMacro

Macro SetGaugePosY(GaugeA, P_PosY)

  GetGaugePosY(GaugeA) = P_PosY

EndMacro

Macro SetGaugeSize(GaugeA, P_Size)

  GetGaugeSize(GaugeA) = P_Size

EndMacro

Macro SetGaugeCenter(GaugeA, P_Center)

  GetGaugeCenter(GaugeA) = P_Center

EndMacro

Macro SetGaugeScaleRadius(GaugeA, P_ScaleRadius)

  GetGaugeScaleRadius(GaugeA) = P_ScaleRadius

EndMacro

Macro SetGaugeMin(GaugeA, P_Min)

  GetGaugeMin(GaugeA) = P_Min

EndMacro

Macro SetGaugeMax(GaugeA, P_Max)

  GetGaugeMax(GaugeA) = P_Max

EndMacro

Macro SetGaugeBigStep(GaugeA, P_BigStep)

  GetGaugeBigStep(GaugeA) = P_BigStep

EndMacro

Macro SetGaugeSmallStep(GaugeA, P_SmallStep)

  GetGaugeSmallStep(GaugeA) = P_SmallStep

EndMacro

Macro SetGaugeSectorDegrees(GaugeA, P_SectorDegrees)

  GetGaugeSectorDegrees(GaugeA) = P_SectorDegrees

EndMacro

Macro SetGaugeValue(GaugeA, P_Value)

  GetGaugeValue(GaugeA) = P_Value

EndMacro

Macro SetGaugeText(GaugeA, P_Text)

  GetGaugeText(GaugeA) = P_Text

EndMacro

Macro SetGaugeSubText(GaugeA, P_SubText)

  GetGaugeSubText(GaugeA) = P_SubText

EndMacro

Macro SetGaugeGadgetID(GaugeA, P_GadgetID)

  GetGaugeGadgetID(GaugeA) = P_GadgetID

EndMacro

Macro SetGaugeGadgetHandle(GaugeA, P_GadgetHandle)

  GetGaugeGadgetHandle(GaugeA) = P_GadgetHandle

EndMacro

Macro SetGaugeBackGroundColor(GaugeA, P_BackGroundColor)

  GetGaugeBackGroundColor(GaugeA) = P_BackGroundColor

EndMacro

Macro SetGaugeScaleColor(GaugeA, P_ScaleColor)

  GetGaugeScaleColor(GaugeA) = P_ScaleColor

EndMacro

Macro SetGaugeScaleBackGroundColor(GaugeA, P_ScaleBackGroundColor)

  GetGaugeScaleBackGroundColor(GaugeA) = P_ScaleBackGroundColor

EndMacro

Macro SetGaugeTextColor(GaugeA, P_TextColor)

  GetGaugeTextColor(GaugeA) = P_TextColor

EndMacro

Macro SetGaugeSubTextColor(GaugeA, P_SubTextColor)

  GetGaugeSubTextColor(GaugeA) = P_SubTextColor

EndMacro

Macro SetGaugeNeedleColor(GaugeA, P_NeedleColor)

  GetGaugeNeedleColor(GaugeA) = P_NeedleColor

EndMacro

Macro SetGaugeScaleFontHandle(GaugeA, P_ScaleFontHandle)

  GetGaugeScaleFontHandle(GaugeA) = P_ScaleFontHandle

EndMacro

Macro SetGaugeTextFontHandle(GaugeA, P_TextFontHandle)

  GetGaugeTextFontHandle(GaugeA) = P_TextFontHandle

EndMacro

Macro SetGaugeSubTextFontHandle(GaugeA, P_SubTextFontHandle)

  GetGaugeSubTextFontHandle(GaugeA) = P_SubTextFontHandle

EndMacro

Macro SetGaugeLayerSize(GaugeA, P_LayerSize)

  GetGaugeLayerSize(GaugeA) = P_LayerSize

EndMacro

Macro SetGaugeNeedleLength(GaugeA, P_NeedleLength)

  GetGaugeNeedleLength(GaugeA) = P_NeedleLength

EndMacro

Macro SetGaugeNeedlePivotRadius(GaugeA, P_NeedlePivotRadius)

  GetGaugeNeedlePivotRadius(GaugeA) = P_NeedlePivotRadius

EndMacro

Macro SetGaugeNeedleTipWidth(GaugeA, P_NeedleTipWidth)

  GetGaugeNeedleTipWidth(GaugeA) = P_NeedleTipWidth

EndMacro

Macro SetGaugeNeedleCenWidth(GaugeA, P_NeedleCenWidth)

  GetGaugeNeedleCenWidth(GaugeA) = P_NeedleCenWidth

EndMacro

Macro SetGaugeBackGroundLayer(GaugeA, P_BackGroundLayer)

  GetGaugeBackGroundLayer(GaugeA) = P_BackGroundLayer

EndMacro

Macro SetGaugeScaleLayer(GaugeA, P_ScaleLayer)

  GetGaugeScaleLayer(GaugeA) = P_ScaleLayer

EndMacro

Macro SetGaugeDescriptionLayer(GaugeA, P_DescriptionLayer)

  GetGaugeDescriptionLayer(GaugeA) = P_DescriptionLayer

EndMacro

Macro SetGaugeNeedleLayer(GaugeA, P_NeedleLayer)

  GetGaugeNeedleLayer(GaugeA) = P_NeedleLayer

EndMacro

Macro SetGaugeComposedLayer(GaugeA, P_ComposedLayer)

  GetGaugeComposedLayer(GaugeA) = P_ComposedLayer

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.021 secondes (22571.43 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetGauge(GaugeA)
  
  SetGaugePosX(GaugeA, 0)
  SetGaugePosY(GaugeA, 0)
  SetGaugeSize(GaugeA, 0)
  SetGaugeScaleRadius(GaugeA, 0)
  SetGaugeMin(GaugeA, 0)
  SetGaugeMax(GaugeA, 0)
  SetGaugeBigStep(GaugeA, 0)
  SetGaugeSmallStep(GaugeA, 0)
  SetGaugeValue(GaugeA, 0)
  SetGaugeText(GaugeA, "")
  SetGaugeSubText(GaugeA, "")
  SetGaugeGadgetID(GaugeA, 0)
  SetGaugeGadgetHandle(GaugeA, 0)
  SetGaugeBackGroundColor(GaugeA, 0)
  SetGaugeScaleColor(GaugeA, 0)
  SetGaugeScaleBackGroundColor(GaugeA, 0)
  SetGaugeTextColor(GaugeA, 0)
  SetGaugeSubTextColor(GaugeA, 0)
  SetGaugeNeedleColor(GaugeA, 0)
  SetGaugeLayerSize(GaugeA, 0)
  SetGaugeNeedleLength(GaugeA, 0)
  SetGaugeNeedlePivotRadius(GaugeA, 0)
  SetGaugeNeedleTipWidth(GaugeA, 0)
  SetGaugeNeedleCenWidth(GaugeA, 0)
  
  If GetGaugeScaleFontHandle(GaugeA)
    FreeFont(GetGaugeScaleFontHandle(GaugeA))
    SetGaugeScaleFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeTextFontHandle(GaugeA)
    FreeFont(GetGaugeTextFontHandle(GaugeA))
    SetGaugeTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeSubTextFontHandle(GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(GaugeA))
    SetGaugeSubTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeBackGroundLayer(GaugeA)
    FreeImage(GetGaugeBackGroundLayer(GaugeA))
    SetGaugeBackGroundLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeScaleLayer(GaugeA)
    FreeImage(GetGaugeScaleLayer(GaugeA))
    SetGaugeScaleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeDescriptionLayer(GaugeA)
    FreeImage(GetGaugeDescriptionLayer(GaugeA))
    SetGaugeDescriptionLayer(GaugeA, 0)
  EndIf
  
  If GetGaugeNeedleLayer(GaugeA)
    FreeImage(GetGaugeNeedleLayer(GaugeA))
    SetGaugeNeedleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeComposedLayer(GaugeA)
    FreeImage(GetGaugeComposedLayer(GaugeA))
    SetGaugeComposedLayer(GaugeA, 0)
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Initialize <<<<<

Procedure InitializeGauge(*GaugeA.Gauge)
  
  SetGaugePosX(*GaugeA, 0)
  SetGaugePosY(*GaugeA, 0)
  SetGaugeSize(*GaugeA, 0)
  SetGaugeScaleRadius(*GaugeA, 0)
  SetGaugeMin(*GaugeA, 0)
  SetGaugeMax(*GaugeA, 0)
  SetGaugeBigStep(*GaugeA, 0)
  SetGaugeSmallStep(*GaugeA, 0)
  SetGaugeValue(*GaugeA, 0)
  SetGaugeText(*GaugeA, "")
  SetGaugeSubText(*GaugeA, "")
  SetGaugeGadgetID(*GaugeA, 0)
  SetGaugeGadgetHandle(*GaugeA, 0)
  SetGaugeBackGroundColor(*GaugeA, 0)
  SetGaugeScaleColor(*GaugeA, 0)
  SetGaugeScaleBackGroundColor(*GaugeA, 0)
  SetGaugeTextColor(*GaugeA, 0)
  SetGaugeSubTextColor(*GaugeA, 0)
  SetGaugeNeedleColor(*GaugeA, 0)
  SetGaugeScaleFontHandle(*GaugeA, 0)
  SetGaugeTextFontHandle(*GaugeA, 0)
  SetGaugeSubTextFontHandle(*GaugeA, 0)
  SetGaugeLayerSize(*GaugeA, 0)
  SetGaugeBackGroundLayer(*GaugeA, 0)
  SetGaugeScaleLayer(*GaugeA, 0)
  SetGaugeDescriptionLayer(*GaugeA, 0)
  SetGaugeNeedleLayer(*GaugeA, 0)
  SetGaugeComposedLayer(*GaugeA, 0)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.018 secondes (26111.11 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Macro ResizeGaugeGadget(GaugeA)
  
  If GetGaugeGadgetID(GaugeA) <> #PB_Any
    ResizeGadget(GetGaugeGadgetID(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  Else     
    ResizeGadget(GetGaugeGadgetHandle(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Dessiner un texte centré en x, y <<<<<

Macro DrawTextCentered(x, y, Text, FrontColor, BackColor)
  
  DrawText(x - TextWidth(Text) >> 1, y - TextHeight("Wg") >> 1, Text, FrontColor, BackColor)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type double <<<<<

Procedure.d MaxDouble(P_Number01.d, P_Number02.d)
  
  Biggest_Double.d = P_Number01
  
  If P_Number02 > Biggest_Double
    Biggest_Double = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Double
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type long <<<<<

Procedure.l MaxLong(P_Number01.l, P_Number02.l)
  
  Biggest_Long.l = P_Number01
  
  If P_Number02 > Biggest_Long
    Biggest_Long = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Long
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs spéciaux <<<<<

Macro SetGaugePositionSize(GaugeA, P_X, P_Y, P_Size)
  
  SetGaugePosX(GaugeA, P_X)
  SetGaugePosY(GaugeA, P_Y)
  SetGaugeSize(GaugeA, P_Size)
  
EndMacro 

Macro SetGaugeTextEx(GaugeA, Text, Color_RGBA)
  
  SetGaugeText(GaugeA, Text)
  SetGaugeTextColor(GaugeA, Color_RGBA)
  
EndMacro 

Macro SetGaugeSubTextEx(GaugeA, SubText, Color_RGBA)
  
  SetGaugeSubText(GaugeA, SubText)
  SetGaugeSubTextColor(GaugeA, Color_RGBA)
  
EndMacro 

Macro SetGaugeMinMaxSteps(GaugeA, P_Min, P_Max, P_BigStep, P_SmallStep)
  
  SetGaugeMin(GaugeA, P_Min)
  SetGaugeMax(GaugeA, P_Max)
  SetGaugeBigStep(GaugeA, P_BigStep)
  SetGaugeSmallStep(GaugeA, P_SmallStep)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeBackground <<<<<

Macro PaintGaugeBackground(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), GetGaugeBackGroundColor(GaugeA))
  
  ; DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_Outlined)
  ; Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), RGBA(0, 0, 0, 32))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeScale <<<<<

Macro PaintGaugeScale(GaugeA)
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  
  wpx = GetGaugeSize(GaugeA) / 33
  wpx2 = wpx / 4.0 * 3 - 1
  
  SmallStepDegrees.d = GetGaugeSmallStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  BigStepDegrees.d = GetGaugeBigStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx, GetGaugeScaleColor(GaugeA))
  Next
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx2, GetGaugeScaleBackGroundColor(GaugeA))
  Next
  
  dI.d = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA)
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + SmallStepDegrees
  Wend
  
  dI = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ;?!
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + BigStepDegrees
  Wend
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeScaleFontHandle(GaugeA)))
  
  dI = 0
  I = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ; not sure why that is needed
    
    Offset.w = MaxLong(3, Len(Str(GetGaugeMax(GaugeA) - I)))
    
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    DrawTextCentered(x, y, Str(GetGaugeMax(GaugeA) - I), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
    dI + BigStepDegrees
    I + GetGaugeBigStep(GaugeA)
    
  Wend
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeDescription <<<<<

Macro PaintGaugeDescription(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeTextFontHandle(GaugeA)))
  
  x = GetGaugeCenter(GaugeA)
  y = 8 * GetGaugeSize(GaugeA) / 10
  
  DrawTextCentered(x, y, GetGaugeText(GaugeA), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
  y + TextHeight("Wg")
  
  DrawingFont(FontID(GetGaugeSubTextFontHandle(GaugeA)))
  DrawTextCentered(x, y, GetGaugeSubText(GaugeA), GetGaugeSubTextColor(GaugeA), RGBA(0, 0, 0, 0))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeHand <<<<<

Macro PaintGaugeNeedle(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  HalfSize = GetGaugeLayerSize(GaugeA) >> 1

  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  DirDegrees.d = StartDegree + (GetGaugeMax(GaugeA) - GetGaugeValue(GaugeA)) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)

  SinAngle.d = Sin(Radian(-DirDegrees))
  CosAngle.d = Cos(Radian(-DirDegrees))

  x1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)

  x2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)

  x3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)

  x4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x5 = HalfSize + (-15 * SinAngle); + 0 * CosAngle)
  y5 = HalfSize + (15 * CosAngle); + 0 * SinAngle)
  
  LineXY(x1, y1, x2, y2, GetGaugeNeedleColor(GaugeA))
  LineXY(x2, y2, x3, y3, GetGaugeNeedleColor(GaugeA))
  LineXY(x3, y3, x4, y4, GetGaugeNeedleColor(GaugeA))
  LineXY(x4, y4, x1, y1, GetGaugeNeedleColor(GaugeA))
  
  FillArea(x5, y5, GetGaugeNeedleColor(GaugeA), GetGaugeNeedleColor(GaugeA))
  
  Circle(HalfSize, HalfSize, GetGaugeNeedlePivotRadius(GaugeA), GetGaugeNeedleColor(GaugeA))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur LoadGaugeFont <<<<<

Procedure LoadGaugeFont(*GaugeA.Gauge, FontName.s)
  
  If GetGaugeScaleFontHandle(*GaugeA)
    FreeFont(GetGaugeScaleFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeTextFontHandle(*GaugeA)
    FreeFont(GetGaugeTextFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeSubTextFontHandle(*GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(*GaugeA))
  EndIf
  
  SetGaugeScaleFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  SetGaugeTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(9, 0.056 * GetGaugeSize(*GaugeA)), #PB_Font_Bold))
  SetGaugeSubTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur GaugeGadget <<<<<

Procedure GaugeGadget(*GaugeA.Gauge, GaugeID.l, x.w, y.w, Size.w, FontName.s = "", Options.l = 0)
  
  SetGaugeGadgetID(*GaugeA, GaugeID)
  SetGaugeGadgetHandle(*GaugeA, ImageGadget(GetGaugeGadgetID(*GaugeA), x, y, Size, Size, 0, Options))
  SetGaugePositionSize(*GaugeA, x, y, Size)
  
  SetGaugeCenter(*GaugeA, Size >> 1)
  SetGaugeScaleRadius(*GaugeA, Size * 3 / 10)
  
  SetGaugeLayerSize(*GaugeA, Size * 4)
  
  SetGaugeNeedleLength(*GaugeA, (1 + GetGaugeScaleRadius(*GaugeA)) * 4)
  SetGaugeNeedlePivotRadius(*GaugeA, GetGaugeNeedleLength(*GaugeA) / 10)
  SetGaugeNeedleTipWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 7)
  SetGaugeNeedleCenWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 2)
  
  If FontName <> ""
    SetGaugeScaleFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
    SetGaugeTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(9, 0.056 * GetGaugeSize(*GaugeA)), #PB_Font_Bold))
    SetGaugeSubTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  EndIf 
  
  SetGaugeSectorDegrees(*GaugeA, 270)
  
  SetGaugeBackGroundColor(*GaugeA, RGBA(0, 0, 0, 0))
  SetGaugeScaleColor(*GaugeA, RGBA(62, 62, 128, 192))
  SetGaugeScaleBackGroundColor(*GaugeA, RGBA(64, 64, 64, 32))
  SetGaugeTextColor(*GaugeA, RGBA(0, 0, 0, 255))
  SetGaugeSubTextColor(*GaugeA, RGBA(92, 92, 92, 255))
  SetGaugeNeedleColor(*GaugeA, RGBA(255, 000, 000, 255))
  SetGaugeMin(*GaugeA, 0)
  SetGaugeMax(*GaugeA, 100)
  SetGaugeBigStep(*GaugeA, 10)
  SetGaugeSmallStep(*GaugeA, 5)
  SetGaugeValue(*GaugeA, 0)
  SetGaugeText(*GaugeA, "Value")
  SetGaugeSubText(*GaugeA, "in units")
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefreshGaugeGadget <<<<<

Procedure RefreshGaugeGadget(*GaugeA.Gauge)
  
  If GetGaugeBackGroundLayer(*GaugeA)
    FreeImage(GetGaugeBackGroundLayer(*GaugeA))
  EndIf 
  
  SetGaugeBackGroundLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeBackGroundLayer(*GaugeA)))
    PaintGaugeBackground(*GaugeA)
    StopDrawing()
  EndIf   
  
  If GetGaugeNeedleLayer(*GaugeA)
    FreeImage(GetGaugeNeedleLayer(*GaugeA))
  EndIf 
  
  SetGaugeNeedleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeNeedleLayer(*GaugeA)))
    PaintGaugeNeedle(*GaugeA)
    StopDrawing()
  EndIf 
  
  ResizeImage(GetGaugeNeedleLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
  
  If GetGaugeScaleLayer(*GaugeA)
    FreeImage(GetGaugeScaleLayer(*GaugeA))
  EndIf 
  
  SetGaugeScaleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeScaleLayer(*GaugeA)))
    PaintGaugeScale(*GaugeA)
    StopDrawing()
  EndIf 
  
  If GetGaugeDescriptionLayer(*GaugeA)
    FreeImage(GetGaugeDescriptionLayer(*GaugeA))
  EndIf 
  
  SetGaugeDescriptionLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeDescriptionLayer(*GaugeA)))
    PaintGaugeDescription(*GaugeA)
    StopDrawing()
  EndIf 

  If GetGaugeComposedLayer(*GaugeA)
    FreeImage(GetGaugeComposedLayer(*GaugeA))
  EndIf
  
  SetGaugeComposedLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeComposedLayer(*GaugeA)))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(GetGaugeBackGroundLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeScaleLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeDescriptionLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeNeedleLayer(*GaugeA)), 0, 0)
    StopDrawing()
    
  EndIf 
    
  If GetGaugeGadgetID(*GaugeA) <> #PB_Any
    SetGadgetState(GetGaugeGadgetID(*GaugeA), ImageID(GetGaugeComposedLayer(*GaugeA)))
  Else     
    SetGadgetState(GetGaugeGadgetHandle(*GaugeA), ImageID(GetGaugeComposedLayer(*GaugeA)))
  EndIf 
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

#W = 425
#H = 375

CompilerSelect #PB_Compiler_OS
    
  CompilerCase #PB_OS_Linux
    FontName.s = "Liberation Sans"
    
  CompilerCase #PB_OS_Windows
    FontName.s = "Tahoma"
    
CompilerEndSelect



If OpenWindow(0, 0, 0, #W, #H, "Gauge Gadget Demo", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  
  TrackBarGadget(0, 5, 5, 20, 360, 0, 360, #PB_TrackBar_Vertical)
  TrackBarGadget(1, 30, 5, 20, 360, 1, 360, #PB_TrackBar_Vertical)
  
  GaugeGadget(GaugeA.Gauge, 5, 55, 5, 360, FontName, 1)
  
  SetGaugeMinMaxSteps(GaugeA, 0, 360, 60, 15)
  SetGaugeText(GaugeA, "Pressure")
  SetGaugeSubText(GaugeA, "in kPa")
  
  RefreshGaugeGadget(GaugeA)
  
  SetGadgetState(0, 0)
  SetGadgetState(1, 270)

  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_Gadget 
        
        Select EventGadget()
            
          Case 0 ; Change value
            SetGaugeValue(GaugeA, GetGadgetState(0))
;             Debug GetGadgetState(0)
            RefreshGaugeGadget(GaugeA)
            
          Case 1 ; Change size in degrees
            SetGaugeSectorDegrees(GaugeA, GetGadgetState(1))
            RefreshGaugeGadget(GaugeA)
            
        EndSelect
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
    
  ForEver
  
  ResetGauge(GaugeA)
  
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<

Re: Gauge display

Posted: Tue Feb 22, 2011 3:51 pm
by Kwai chang caine
Always for info and help you...that jerk again :oops:
But i'm on a recent notebook, but just for working, not for graphics application, it's perhaps the reason :wink:

Re: Gauge display

Posted: Tue Feb 22, 2011 7:18 pm
by Guimauve
Kwaï chang caïne wrote:Always for info and help you...that jerk again :oops:
But i'm on a recent notebook, but just for working, not for graphics application, it's perhaps the reason :wink:
Can you try this new version (without an oversized Needle layer) ?

Best regards.
Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : GaugeGadget
; File Name : GaugeGadget.pb
; File version: 1.1.1
; Programmation : OK
; Programmed by : Trond
; Modified by : Guimauve
; Date : 20-02-2011
; Mise à jour : 22-02-2011
; PureBasic code : 4.51
; Plateform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes :
;
; Some field in the Gauge Structure has been 
; renamed or suppressed.
;
; Finally, the GaugeGadget shape can be square
; only.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Gauge

  PosX.w
  PosY.w
  Size.w
  Center.w
  ScaleRadius.w
  Min.l
  Max.l
  BigStep.l
  SmallStep.l
  SectorDegrees.w
  Value.l
  Text.s
  SubText.s
  GadgetID.l
  GadgetHandle.l
  BackGroundColor.l
  ScaleColor.l
  ScaleBackGroundColor.l
  TextColor.l
  SubTextColor.l
  NeedleColor.l
  ScaleFontHandle.i
  TextFontHandle.i
  SubTextFontHandle.i
  LayerSize.w
  NeedleLength.l
  NeedlePivotRadius.l
  NeedleTipWidth.l
  NeedleCenWidth.l
  BackGroundLayer.l
  ScaleLayer.l
  DescriptionLayer.l
  NeedleLayer.l
  ComposedLayer.l

EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetGaugePosX(GaugeA)

  GaugeA\PosX

EndMacro

Macro GetGaugePosY(GaugeA)

  GaugeA\PosY

EndMacro

Macro GetGaugeSize(GaugeA)

  GaugeA\Size

EndMacro

Macro GetGaugeCenter(GaugeA)

  GaugeA\Center

EndMacro

Macro GetGaugeScaleRadius(GaugeA)

  GaugeA\ScaleRadius

EndMacro

Macro GetGaugeMin(GaugeA)

  GaugeA\Min

EndMacro

Macro GetGaugeMax(GaugeA)

  GaugeA\Max

EndMacro

Macro GetGaugeBigStep(GaugeA)

  GaugeA\BigStep

EndMacro

Macro GetGaugeSmallStep(GaugeA)

  GaugeA\SmallStep

EndMacro

Macro GetGaugeSectorDegrees(GaugeA)

  GaugeA\SectorDegrees

EndMacro

Macro GetGaugeValue(GaugeA)

  GaugeA\Value

EndMacro

Macro GetGaugeText(GaugeA)

  GaugeA\Text

EndMacro

Macro GetGaugeSubText(GaugeA)

  GaugeA\SubText

EndMacro

Macro GetGaugeGadgetID(GaugeA)

  GaugeA\GadgetID

EndMacro

Macro GetGaugeGadgetHandle(GaugeA)

  GaugeA\GadgetHandle

EndMacro

Macro GetGaugeBackGroundColor(GaugeA)

  GaugeA\BackGroundColor

EndMacro

Macro GetGaugeScaleColor(GaugeA)

  GaugeA\ScaleColor

EndMacro

Macro GetGaugeScaleBackGroundColor(GaugeA)

  GaugeA\ScaleBackGroundColor

EndMacro

Macro GetGaugeTextColor(GaugeA)

  GaugeA\TextColor

EndMacro

Macro GetGaugeSubTextColor(GaugeA)

  GaugeA\SubTextColor

EndMacro

Macro GetGaugeNeedleColor(GaugeA)

  GaugeA\NeedleColor

EndMacro

Macro GetGaugeScaleFontHandle(GaugeA)

  GaugeA\ScaleFontHandle

EndMacro

Macro GetGaugeTextFontHandle(GaugeA)

  GaugeA\TextFontHandle

EndMacro

Macro GetGaugeSubTextFontHandle(GaugeA)

  GaugeA\SubTextFontHandle

EndMacro

Macro GetGaugeLayerSize(GaugeA)

  GaugeA\LayerSize

EndMacro

Macro GetGaugeNeedleLength(GaugeA)

  GaugeA\NeedleLength

EndMacro

Macro GetGaugeNeedlePivotRadius(GaugeA)

  GaugeA\NeedlePivotRadius

EndMacro

Macro GetGaugeNeedleTipWidth(GaugeA)

  GaugeA\NeedleTipWidth

EndMacro

Macro GetGaugeNeedleCenWidth(GaugeA)

  GaugeA\NeedleCenWidth

EndMacro

Macro GetGaugeBackGroundLayer(GaugeA)

  GaugeA\BackGroundLayer

EndMacro

Macro GetGaugeScaleLayer(GaugeA)

  GaugeA\ScaleLayer

EndMacro

Macro GetGaugeDescriptionLayer(GaugeA)

  GaugeA\DescriptionLayer

EndMacro

Macro GetGaugeNeedleLayer(GaugeA)

  GaugeA\NeedleLayer

EndMacro

Macro GetGaugeComposedLayer(GaugeA)

  GaugeA\ComposedLayer

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetGaugePosX(GaugeA, P_PosX)

  GetGaugePosX(GaugeA) = P_PosX

EndMacro

Macro SetGaugePosY(GaugeA, P_PosY)

  GetGaugePosY(GaugeA) = P_PosY

EndMacro

Macro SetGaugeSize(GaugeA, P_Size)

  GetGaugeSize(GaugeA) = P_Size

EndMacro

Macro SetGaugeCenter(GaugeA, P_Center)

  GetGaugeCenter(GaugeA) = P_Center

EndMacro

Macro SetGaugeScaleRadius(GaugeA, P_ScaleRadius)

  GetGaugeScaleRadius(GaugeA) = P_ScaleRadius

EndMacro

Macro SetGaugeMin(GaugeA, P_Min)

  GetGaugeMin(GaugeA) = P_Min

EndMacro

Macro SetGaugeMax(GaugeA, P_Max)

  GetGaugeMax(GaugeA) = P_Max

EndMacro

Macro SetGaugeBigStep(GaugeA, P_BigStep)

  GetGaugeBigStep(GaugeA) = P_BigStep

EndMacro

Macro SetGaugeSmallStep(GaugeA, P_SmallStep)

  GetGaugeSmallStep(GaugeA) = P_SmallStep

EndMacro

Macro SetGaugeSectorDegrees(GaugeA, P_SectorDegrees)

  GetGaugeSectorDegrees(GaugeA) = P_SectorDegrees

EndMacro

Macro SetGaugeValue(GaugeA, P_Value)

  GetGaugeValue(GaugeA) = P_Value

EndMacro

Macro SetGaugeText(GaugeA, P_Text)

  GetGaugeText(GaugeA) = P_Text

EndMacro

Macro SetGaugeSubText(GaugeA, P_SubText)

  GetGaugeSubText(GaugeA) = P_SubText

EndMacro

Macro SetGaugeGadgetID(GaugeA, P_GadgetID)

  GetGaugeGadgetID(GaugeA) = P_GadgetID

EndMacro

Macro SetGaugeGadgetHandle(GaugeA, P_GadgetHandle)

  GetGaugeGadgetHandle(GaugeA) = P_GadgetHandle

EndMacro

Macro SetGaugeBackGroundColor(GaugeA, P_BackGroundColor)

  GetGaugeBackGroundColor(GaugeA) = P_BackGroundColor

EndMacro

Macro SetGaugeScaleColor(GaugeA, P_ScaleColor)

  GetGaugeScaleColor(GaugeA) = P_ScaleColor

EndMacro

Macro SetGaugeScaleBackGroundColor(GaugeA, P_ScaleBackGroundColor)

  GetGaugeScaleBackGroundColor(GaugeA) = P_ScaleBackGroundColor

EndMacro

Macro SetGaugeTextColor(GaugeA, P_TextColor)

  GetGaugeTextColor(GaugeA) = P_TextColor

EndMacro

Macro SetGaugeSubTextColor(GaugeA, P_SubTextColor)

  GetGaugeSubTextColor(GaugeA) = P_SubTextColor

EndMacro

Macro SetGaugeNeedleColor(GaugeA, P_NeedleColor)

  GetGaugeNeedleColor(GaugeA) = P_NeedleColor

EndMacro

Macro SetGaugeScaleFontHandle(GaugeA, P_ScaleFontHandle)

  GetGaugeScaleFontHandle(GaugeA) = P_ScaleFontHandle

EndMacro

Macro SetGaugeTextFontHandle(GaugeA, P_TextFontHandle)

  GetGaugeTextFontHandle(GaugeA) = P_TextFontHandle

EndMacro

Macro SetGaugeSubTextFontHandle(GaugeA, P_SubTextFontHandle)

  GetGaugeSubTextFontHandle(GaugeA) = P_SubTextFontHandle

EndMacro

Macro SetGaugeLayerSize(GaugeA, P_LayerSize)

  GetGaugeLayerSize(GaugeA) = P_LayerSize

EndMacro

Macro SetGaugeNeedleLength(GaugeA, P_NeedleLength)

  GetGaugeNeedleLength(GaugeA) = P_NeedleLength

EndMacro

Macro SetGaugeNeedlePivotRadius(GaugeA, P_NeedlePivotRadius)

  GetGaugeNeedlePivotRadius(GaugeA) = P_NeedlePivotRadius

EndMacro

Macro SetGaugeNeedleTipWidth(GaugeA, P_NeedleTipWidth)

  GetGaugeNeedleTipWidth(GaugeA) = P_NeedleTipWidth

EndMacro

Macro SetGaugeNeedleCenWidth(GaugeA, P_NeedleCenWidth)

  GetGaugeNeedleCenWidth(GaugeA) = P_NeedleCenWidth

EndMacro

Macro SetGaugeBackGroundLayer(GaugeA, P_BackGroundLayer)

  GetGaugeBackGroundLayer(GaugeA) = P_BackGroundLayer

EndMacro

Macro SetGaugeScaleLayer(GaugeA, P_ScaleLayer)

  GetGaugeScaleLayer(GaugeA) = P_ScaleLayer

EndMacro

Macro SetGaugeDescriptionLayer(GaugeA, P_DescriptionLayer)

  GetGaugeDescriptionLayer(GaugeA) = P_DescriptionLayer

EndMacro

Macro SetGaugeNeedleLayer(GaugeA, P_NeedleLayer)

  GetGaugeNeedleLayer(GaugeA) = P_NeedleLayer

EndMacro

Macro SetGaugeComposedLayer(GaugeA, P_ComposedLayer)

  GetGaugeComposedLayer(GaugeA) = P_ComposedLayer

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.021 secondes (22571.43 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetGauge(GaugeA)
  
  SetGaugePosX(GaugeA, 0)
  SetGaugePosY(GaugeA, 0)
  SetGaugeSize(GaugeA, 0)
  SetGaugeScaleRadius(GaugeA, 0)
  SetGaugeMin(GaugeA, 0)
  SetGaugeMax(GaugeA, 0)
  SetGaugeBigStep(GaugeA, 0)
  SetGaugeSmallStep(GaugeA, 0)
  SetGaugeValue(GaugeA, 0)
  SetGaugeText(GaugeA, "")
  SetGaugeSubText(GaugeA, "")
  SetGaugeGadgetID(GaugeA, 0)
  SetGaugeGadgetHandle(GaugeA, 0)
  SetGaugeBackGroundColor(GaugeA, 0)
  SetGaugeScaleColor(GaugeA, 0)
  SetGaugeScaleBackGroundColor(GaugeA, 0)
  SetGaugeTextColor(GaugeA, 0)
  SetGaugeSubTextColor(GaugeA, 0)
  SetGaugeNeedleColor(GaugeA, 0)
  SetGaugeLayerSize(GaugeA, 0)
  SetGaugeNeedleLength(GaugeA, 0)
  SetGaugeNeedlePivotRadius(GaugeA, 0)
  SetGaugeNeedleTipWidth(GaugeA, 0)
  SetGaugeNeedleCenWidth(GaugeA, 0)
  
  If GetGaugeScaleFontHandle(GaugeA)
    FreeFont(GetGaugeScaleFontHandle(GaugeA))
    SetGaugeScaleFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeTextFontHandle(GaugeA)
    FreeFont(GetGaugeTextFontHandle(GaugeA))
    SetGaugeTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeSubTextFontHandle(GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(GaugeA))
    SetGaugeSubTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeBackGroundLayer(GaugeA)
    FreeImage(GetGaugeBackGroundLayer(GaugeA))
    SetGaugeBackGroundLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeScaleLayer(GaugeA)
    FreeImage(GetGaugeScaleLayer(GaugeA))
    SetGaugeScaleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeDescriptionLayer(GaugeA)
    FreeImage(GetGaugeDescriptionLayer(GaugeA))
    SetGaugeDescriptionLayer(GaugeA, 0)
  EndIf
  
  If GetGaugeNeedleLayer(GaugeA)
    FreeImage(GetGaugeNeedleLayer(GaugeA))
    SetGaugeNeedleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeComposedLayer(GaugeA)
    FreeImage(GetGaugeComposedLayer(GaugeA))
    SetGaugeComposedLayer(GaugeA, 0)
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Initialize <<<<<

Procedure InitializeGauge(*GaugeA.Gauge)
  
  SetGaugePosX(*GaugeA, 0)
  SetGaugePosY(*GaugeA, 0)
  SetGaugeSize(*GaugeA, 0)
  SetGaugeScaleRadius(*GaugeA, 0)
  SetGaugeMin(*GaugeA, 0)
  SetGaugeMax(*GaugeA, 0)
  SetGaugeBigStep(*GaugeA, 0)
  SetGaugeSmallStep(*GaugeA, 0)
  SetGaugeValue(*GaugeA, 0)
  SetGaugeText(*GaugeA, "")
  SetGaugeSubText(*GaugeA, "")
  SetGaugeGadgetID(*GaugeA, 0)
  SetGaugeGadgetHandle(*GaugeA, 0)
  SetGaugeBackGroundColor(*GaugeA, 0)
  SetGaugeScaleColor(*GaugeA, 0)
  SetGaugeScaleBackGroundColor(*GaugeA, 0)
  SetGaugeTextColor(*GaugeA, 0)
  SetGaugeSubTextColor(*GaugeA, 0)
  SetGaugeNeedleColor(*GaugeA, 0)
  SetGaugeScaleFontHandle(*GaugeA, 0)
  SetGaugeTextFontHandle(*GaugeA, 0)
  SetGaugeSubTextFontHandle(*GaugeA, 0)
  SetGaugeLayerSize(*GaugeA, 0)
  SetGaugeBackGroundLayer(*GaugeA, 0)
  SetGaugeScaleLayer(*GaugeA, 0)
  SetGaugeDescriptionLayer(*GaugeA, 0)
  SetGaugeNeedleLayer(*GaugeA, 0)
  SetGaugeComposedLayer(*GaugeA, 0)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.018 secondes (26111.11 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Macro ResizeGaugeGadget(GaugeA)
  
  If GetGaugeGadgetID(GaugeA) <> #PB_Any
    ResizeGadget(GetGaugeGadgetID(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  Else     
    ResizeGadget(GetGaugeGadgetHandle(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Dessiner un texte centré en x, y <<<<<

Macro DrawTextCentered(x, y, Text, FrontColor, BackColor)
  
  DrawText(x - TextWidth(Text) >> 1, y - TextHeight("Wg") >> 1, Text, FrontColor, BackColor)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type double <<<<<

Procedure.d MaxDouble(P_Number01.d, P_Number02.d)
  
  Biggest_Double.d = P_Number01
  
  If P_Number02 > Biggest_Double
    Biggest_Double = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Double
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type long <<<<<

Procedure.l MaxLong(P_Number01.l, P_Number02.l)
  
  Biggest_Long.l = P_Number01
  
  If P_Number02 > Biggest_Long
    Biggest_Long = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Long
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs spéciaux <<<<<

Macro SetGaugePositionSize(GaugeA, P_X, P_Y, P_Size)
  
  SetGaugePosX(GaugeA, P_X)
  SetGaugePosY(GaugeA, P_Y)
  SetGaugeSize(GaugeA, P_Size)
  
EndMacro 

Macro SetGaugeTextEx(GaugeA, Text, Color_RGBA)
  
  SetGaugeText(GaugeA, Text)
  SetGaugeTextColor(GaugeA, Color_RGBA)
  
EndMacro 

Macro SetGaugeSubTextEx(GaugeA, SubText, Color_RGBA)
  
  SetGaugeSubText(GaugeA, SubText)
  SetGaugeSubTextColor(GaugeA, Color_RGBA)
  
EndMacro 

Macro SetGaugeMinMaxSteps(GaugeA, P_Min, P_Max, P_BigStep, P_SmallStep)
  
  SetGaugeMin(GaugeA, P_Min)
  SetGaugeMax(GaugeA, P_Max)
  SetGaugeBigStep(GaugeA, P_BigStep)
  SetGaugeSmallStep(GaugeA, P_SmallStep)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeBackground <<<<<

Macro PaintGaugeBackground(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), GetGaugeBackGroundColor(GaugeA))
  
  ; DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_Outlined)
  ; Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), RGBA(0, 0, 0, 32))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeScale <<<<<

Macro PaintGaugeScale(GaugeA)
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  
  wpx = GetGaugeSize(GaugeA) / 33
  wpx2 = wpx / 4.0 * 3 - 1
  
  SmallStepDegrees.d = GetGaugeSmallStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  BigStepDegrees.d = GetGaugeBigStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx, GetGaugeScaleColor(GaugeA))
  Next
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx2, GetGaugeScaleBackGroundColor(GaugeA))
  Next
  
  dI.d = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA)
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + SmallStepDegrees
  Wend
  
  dI = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ;?!
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + BigStepDegrees
  Wend
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeScaleFontHandle(GaugeA)))
  
  dI = 0
  I = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ; not sure why that is needed
    
    Offset.w = MaxLong(3, Len(Str(GetGaugeMax(GaugeA) - I)))
    
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    DrawTextCentered(x, y, Str(GetGaugeMax(GaugeA) - I), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
    dI + BigStepDegrees
    I + GetGaugeBigStep(GaugeA)
    
  Wend
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeDescription <<<<<

Macro PaintGaugeDescription(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeTextFontHandle(GaugeA)))
  
  x = GetGaugeCenter(GaugeA)
  y = 8 * GetGaugeSize(GaugeA) / 10
  
  DrawTextCentered(x, y, GetGaugeText(GaugeA), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
  y + TextHeight("Wg")
  
  DrawingFont(FontID(GetGaugeSubTextFontHandle(GaugeA)))
  DrawTextCentered(x, y, GetGaugeSubText(GaugeA), GetGaugeSubTextColor(GaugeA), RGBA(0, 0, 0, 0))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeHand <<<<<

Macro PaintGaugeNeedle(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  HalfSize = GetGaugeLayerSize(GaugeA) >> 1
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  DirDegrees.d = StartDegree + (GetGaugeMax(GaugeA) - GetGaugeValue(GaugeA)) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  SinAngle.d = Sin(Radian(-DirDegrees))
  CosAngle.d = Cos(Radian(-DirDegrees))
  
  x1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)
  
  x2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)
  
  x3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x5 = HalfSize + (-15 * SinAngle); + 0 * CosAngle)
  y5 = HalfSize + (15 * CosAngle); + 0 * SinAngle)
  
  LineXY(x1, y1, x2, y2, GetGaugeNeedleColor(GaugeA))
  LineXY(x2, y2, x3, y3, GetGaugeNeedleColor(GaugeA))
  LineXY(x3, y3, x4, y4, GetGaugeNeedleColor(GaugeA))
  LineXY(x4, y4, x1, y1, GetGaugeNeedleColor(GaugeA))
  
  FillArea(x5, y5, GetGaugeNeedleColor(GaugeA), GetGaugeNeedleColor(GaugeA))
  
  Circle(HalfSize, HalfSize, GetGaugeNeedlePivotRadius(GaugeA), GetGaugeNeedleColor(GaugeA))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur LoadGaugeFont <<<<<

Procedure LoadGaugeFont(*GaugeA.Gauge, FontName.s)
  
  If GetGaugeScaleFontHandle(*GaugeA)
    FreeFont(GetGaugeScaleFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeTextFontHandle(*GaugeA)
    FreeFont(GetGaugeTextFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeSubTextFontHandle(*GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(*GaugeA))
  EndIf
  
  SetGaugeScaleFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  SetGaugeTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(9, 0.056 * GetGaugeSize(*GaugeA)), #PB_Font_Bold))
  SetGaugeSubTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur GaugeGadget <<<<<

Procedure GaugeGadget(*GaugeA.Gauge, GaugeID.l, x.w, y.w, Size.w, FontName.s = "", Options.l = 0)
  
  SetGaugeGadgetID(*GaugeA, GaugeID)
  SetGaugeGadgetHandle(*GaugeA, ImageGadget(GetGaugeGadgetID(*GaugeA), x, y, Size, Size, 0, Options))
  SetGaugePositionSize(*GaugeA, x, y, Size)
  
  SetGaugeCenter(*GaugeA, Size >> 1)
  SetGaugeScaleRadius(*GaugeA, Size * 3 / 10)
  
  SetGaugeLayerSize(*GaugeA, Size)
  
  SetGaugeNeedleLength(*GaugeA, (1 + GetGaugeScaleRadius(*GaugeA)))
  SetGaugeNeedlePivotRadius(*GaugeA, GetGaugeNeedleLength(*GaugeA) / 10)
  SetGaugeNeedleTipWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 7)
  SetGaugeNeedleCenWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 2)
  
  If FontName <> ""
    SetGaugeScaleFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
    SetGaugeTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(9, 0.056 * GetGaugeSize(*GaugeA)), #PB_Font_Bold))
    SetGaugeSubTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  EndIf 
  
  SetGaugeSectorDegrees(*GaugeA, 270)
  
  SetGaugeBackGroundColor(*GaugeA, RGBA(0, 0, 0, 0))
  SetGaugeScaleColor(*GaugeA, RGBA(62, 62, 128, 192))
  SetGaugeScaleBackGroundColor(*GaugeA, RGBA(64, 64, 64, 32))
  SetGaugeTextColor(*GaugeA, RGBA(0, 0, 0, 255))
  SetGaugeSubTextColor(*GaugeA, RGBA(92, 92, 92, 255))
  SetGaugeNeedleColor(*GaugeA, RGBA(255, 000, 000, 255))
  SetGaugeMin(*GaugeA, 0)
  SetGaugeMax(*GaugeA, 100)
  SetGaugeBigStep(*GaugeA, 10)
  SetGaugeSmallStep(*GaugeA, 5)
  SetGaugeValue(*GaugeA, 0)
  SetGaugeText(*GaugeA, "Value")
  SetGaugeSubText(*GaugeA, "in units")
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefreshGaugeGadget <<<<<

Procedure RefreshGaugeGadget(*GaugeA.Gauge)
  
  If GetGaugeBackGroundLayer(*GaugeA)
    FreeImage(GetGaugeBackGroundLayer(*GaugeA))
  EndIf 
  
  SetGaugeBackGroundLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeBackGroundLayer(*GaugeA)))
    PaintGaugeBackground(*GaugeA)
    StopDrawing()
  EndIf   
  
  If GetGaugeNeedleLayer(*GaugeA)
    FreeImage(GetGaugeNeedleLayer(*GaugeA))
  EndIf 
  
  SetGaugeNeedleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeNeedleLayer(*GaugeA)))
    PaintGaugeNeedle(*GaugeA)
    StopDrawing()
  EndIf 

  If GetGaugeScaleLayer(*GaugeA)
    FreeImage(GetGaugeScaleLayer(*GaugeA))
  EndIf 
  
  SetGaugeScaleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeScaleLayer(*GaugeA)))
    PaintGaugeScale(*GaugeA)
    StopDrawing()
  EndIf 
  
  If GetGaugeDescriptionLayer(*GaugeA)
    FreeImage(GetGaugeDescriptionLayer(*GaugeA))
  EndIf 
  
  SetGaugeDescriptionLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeDescriptionLayer(*GaugeA)))
    PaintGaugeDescription(*GaugeA)
    StopDrawing()
  EndIf 

  If GetGaugeComposedLayer(*GaugeA)
    FreeImage(GetGaugeComposedLayer(*GaugeA))
  EndIf
  
  SetGaugeComposedLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeComposedLayer(*GaugeA)))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(GetGaugeBackGroundLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeScaleLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeDescriptionLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeNeedleLayer(*GaugeA)), 0, 0)
    StopDrawing()
    
  EndIf 
    
  If GetGaugeGadgetID(*GaugeA) <> #PB_Any
    SetGadgetState(GetGaugeGadgetID(*GaugeA), ImageID(GetGaugeComposedLayer(*GaugeA)))
  Else     
    SetGadgetState(GetGaugeGadgetHandle(*GaugeA), ImageID(GetGaugeComposedLayer(*GaugeA)))
  EndIf 
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

#W = 425
#H = 375

CompilerSelect #PB_Compiler_OS
    
  CompilerCase #PB_OS_Linux
    FontName.s = "Liberation Sans"
    
  CompilerCase #PB_OS_Windows
    FontName.s = "Tahoma"
    
CompilerEndSelect



If OpenWindow(0, 0, 0, #W, #H, "Gauge Gadget Demo", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  
  TrackBarGadget(0, 5, 5, 20, 360, 0, 360, #PB_TrackBar_Vertical)
  TrackBarGadget(1, 30, 5, 20, 360, 1, 360, #PB_TrackBar_Vertical)
  
  GaugeGadget(GaugeA.Gauge, 5, 55, 5, 360, FontName, 1)
  
  SetGaugeMinMaxSteps(GaugeA, 0, 360, 60, 15)
  SetGaugeText(GaugeA, "Pressure")
  SetGaugeSubText(GaugeA, "in kPa")
  
  RefreshGaugeGadget(GaugeA)
  
  SetGadgetState(0, 0)
  SetGadgetState(1, 270)

  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_Gadget 
        
        Select EventGadget()
            
          Case 0 ; Change value
            SetGaugeValue(GaugeA, GetGadgetState(0))
;             Debug GetGadgetState(0)
            RefreshGaugeGadget(GaugeA)
            
          Case 1 ; Change size in degrees
            SetGaugeSectorDegrees(GaugeA, GetGadgetState(1))
            RefreshGaugeGadget(GaugeA)
            
        EndSelect
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
    
  ForEver
  
  ResetGauge(GaugeA)
  
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<

Re: Gauge display

Posted: Tue Feb 22, 2011 10:43 pm
by Kwai chang caine
KCC wrote:RGBA() is missed :oops:
Edit: Excuse me i have several PC and several place for works, and i'm not always at the same place.
On this PC, it's surely an old PB, that's the reason why.

But i have tested your new version with the same PC than yesterday and obviously the same PB, and this time it's perfect, also fluid that the code of TROND 8)

And you have rigt to say needle seems more real 8)
Furthermore for to be sure, i have again tested the last version, and it's again not fluid, like before

So this time, i can say, your new code is at the top

Excuse me again for the story of RGBA()

Re: Gauge display

Posted: Sun May 22, 2011 2:52 am
by Guimauve
Hello everyone,

Just a little update for the GaugeGadget()

Best regards
Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : GaugeGadget
; File Name : GaugeGadget.pb
; File version: 2.0.0
; Programmation : OK
; Programmed by : Trond
; Modified by : Guimauve
; Date : 20-02-2011
; Mise à jour : 21-05-2011
; PureBasic code : 4.51
; Plateform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes :
;
; Some field in the Gauge Structure has been 
; renamed or suppressed.
; 
; A layer has been added for the Needle. The size 
; for this layer is 4 times larger than other 
; layer. This is needed to draw the needle more 
; smootly. 
;
; Finally, the GaugeGadget shape can be square
; only.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Gauge
  
  PosX.w
  PosY.w
  Size.w
  Center.w
  ScaleRadius.w
  Min.l
  Max.l
  BigStep.l
  SmallStep.l
  SectorDegrees.w
  Value.l
  Text.s
  SubText.s
  GadgetID.l
  GadgetHandle.l
  BackGroundColor.l
  ScaleColor.l
  ScaleBackGroundColor.l
  TextColor.l
  SubTextColor.l
  NeedleColor.l
  ScaleFontHandle.i
  TextFontHandle.i
  SubTextFontHandle.i
  LayerSize.w
  NeedleLength.l
  NeedlePivotRadius.l
  NeedleTipWidth.l
  NeedleCenWidth.l
  BackGroundLayer.l
  ScaleLayer.l
  DescriptionLayer.l
  NeedleLayer.l
  ComposedLayer.l
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetGaugePosX(GaugeA)
  
  GaugeA\PosX
  
EndMacro

Macro GetGaugePosY(GaugeA)
  
  GaugeA\PosY
  
EndMacro

Macro GetGaugeSize(GaugeA)
  
  GaugeA\Size
  
EndMacro

Macro GetGaugeCenter(GaugeA)
  
  GaugeA\Center
  
EndMacro

Macro GetGaugeScaleRadius(GaugeA)
  
  GaugeA\ScaleRadius
  
EndMacro

Macro GetGaugeMin(GaugeA)
  
  GaugeA\Min
  
EndMacro

Macro GetGaugeMax(GaugeA)
  
  GaugeA\Max
  
EndMacro

Macro GetGaugeBigStep(GaugeA)
  
  GaugeA\BigStep
  
EndMacro

Macro GetGaugeSmallStep(GaugeA)
  
  GaugeA\SmallStep
  
EndMacro

Macro GetGaugeSectorDegrees(GaugeA)
  
  GaugeA\SectorDegrees
  
EndMacro

Macro GetGaugeValue(GaugeA)
  
  GaugeA\Value
  
EndMacro

Macro GetGaugeText(GaugeA)
  
  GaugeA\Text
  
EndMacro

Macro GetGaugeSubText(GaugeA)
  
  GaugeA\SubText
  
EndMacro

Macro GetGaugeGadgetID(GaugeA)
  
  GaugeA\GadgetID
  
EndMacro

Macro GetGaugeGadgetHandle(GaugeA)
  
  GaugeA\GadgetHandle
  
EndMacro

Macro GetGaugeBackGroundColor(GaugeA)
  
  GaugeA\BackGroundColor
  
EndMacro

Macro GetGaugeScaleColor(GaugeA)
  
  GaugeA\ScaleColor
  
EndMacro

Macro GetGaugeScaleBackGroundColor(GaugeA)
  
  GaugeA\ScaleBackGroundColor
  
EndMacro

Macro GetGaugeTextColor(GaugeA)
  
  GaugeA\TextColor
  
EndMacro

Macro GetGaugeSubTextColor(GaugeA)
  
  GaugeA\SubTextColor
  
EndMacro

Macro GetGaugeNeedleColor(GaugeA)
  
  GaugeA\NeedleColor
  
EndMacro

Macro GetGaugeScaleFontHandle(GaugeA)
  
  GaugeA\ScaleFontHandle
  
EndMacro

Macro GetGaugeTextFontHandle(GaugeA)
  
  GaugeA\TextFontHandle
  
EndMacro

Macro GetGaugeSubTextFontHandle(GaugeA)
  
  GaugeA\SubTextFontHandle
  
EndMacro

Macro GetGaugeLayerSize(GaugeA)
  
  GaugeA\LayerSize
  
EndMacro

Macro GetGaugeNeedleLength(GaugeA)
  
  GaugeA\NeedleLength
  
EndMacro

Macro GetGaugeNeedlePivotRadius(GaugeA)
  
  GaugeA\NeedlePivotRadius
  
EndMacro

Macro GetGaugeNeedleTipWidth(GaugeA)
  
  GaugeA\NeedleTipWidth
  
EndMacro

Macro GetGaugeNeedleCenWidth(GaugeA)
  
  GaugeA\NeedleCenWidth
  
EndMacro

Macro GetGaugeBackGroundLayer(GaugeA)
  
  GaugeA\BackGroundLayer
  
EndMacro

Macro GetGaugeScaleLayer(GaugeA)
  
  GaugeA\ScaleLayer
  
EndMacro

Macro GetGaugeDescriptionLayer(GaugeA)
  
  GaugeA\DescriptionLayer
  
EndMacro

Macro GetGaugeNeedleLayer(GaugeA)
  
  GaugeA\NeedleLayer
  
EndMacro

Macro GetGaugeComposedLayer(GaugeA)
  
  GaugeA\ComposedLayer
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetGaugePosX(GaugeA, P_PosX)
  
  GetGaugePosX(GaugeA) = P_PosX
  
EndMacro

Macro SetGaugePosY(GaugeA, P_PosY)
  
  GetGaugePosY(GaugeA) = P_PosY
  
EndMacro

Macro SetGaugeSize(GaugeA, P_Size)
  
  GetGaugeSize(GaugeA) = P_Size
  
EndMacro

Macro SetGaugeCenter(GaugeA, P_Center)
  
  GetGaugeCenter(GaugeA) = P_Center
  
EndMacro

Macro SetGaugeScaleRadius(GaugeA, P_ScaleRadius)
  
  GetGaugeScaleRadius(GaugeA) = P_ScaleRadius
  
EndMacro

Macro SetGaugeMin(GaugeA, P_Min)
  
  GetGaugeMin(GaugeA) = P_Min
  
EndMacro

Macro SetGaugeMax(GaugeA, P_Max)
  
  GetGaugeMax(GaugeA) = P_Max
  
EndMacro

Macro SetGaugeBigStep(GaugeA, P_BigStep)
  
  GetGaugeBigStep(GaugeA) = P_BigStep
  
EndMacro

Macro SetGaugeSmallStep(GaugeA, P_SmallStep)
  
  GetGaugeSmallStep(GaugeA) = P_SmallStep
  
EndMacro

Macro SetGaugeSectorDegrees(GaugeA, P_SectorDegrees)
  
  GetGaugeSectorDegrees(GaugeA) = P_SectorDegrees
  
EndMacro

Macro SetGaugeValue(GaugeA, P_Value)
  
  GetGaugeValue(GaugeA) = P_Value
  
EndMacro

Macro SetGaugeText(GaugeA, P_Text)
  
  GetGaugeText(GaugeA) = P_Text
  
EndMacro

Macro SetGaugeSubText(GaugeA, P_SubText)
  
  GetGaugeSubText(GaugeA) = P_SubText
  
EndMacro

Macro SetGaugeGadgetID(GaugeA, P_GadgetID)
  
  GetGaugeGadgetID(GaugeA) = P_GadgetID
  
EndMacro

Macro SetGaugeGadgetHandle(GaugeA, P_GadgetHandle)
  
  GetGaugeGadgetHandle(GaugeA) = P_GadgetHandle
  
EndMacro

Macro SetGaugeBackGroundColor(GaugeA, P_BackGroundColor)
  
  GetGaugeBackGroundColor(GaugeA) = P_BackGroundColor
  
EndMacro

Macro SetGaugeScaleColor(GaugeA, P_ScaleColor)
  
  GetGaugeScaleColor(GaugeA) = P_ScaleColor
  
EndMacro

Macro SetGaugeScaleBackGroundColor(GaugeA, P_ScaleBackGroundColor)
  
  GetGaugeScaleBackGroundColor(GaugeA) = P_ScaleBackGroundColor
  
EndMacro

Macro SetGaugeTextColor(GaugeA, P_TextColor)
  
  GetGaugeTextColor(GaugeA) = P_TextColor
  
EndMacro

Macro SetGaugeSubTextColor(GaugeA, P_SubTextColor)
  
  GetGaugeSubTextColor(GaugeA) = P_SubTextColor
  
EndMacro

Macro SetGaugeNeedleColor(GaugeA, P_NeedleColor)
  
  GetGaugeNeedleColor(GaugeA) = P_NeedleColor
  
EndMacro

Macro SetGaugeScaleFontHandle(GaugeA, P_ScaleFontHandle)
  
  GetGaugeScaleFontHandle(GaugeA) = P_ScaleFontHandle
  
EndMacro

Macro SetGaugeTextFontHandle(GaugeA, P_TextFontHandle)
  
  GetGaugeTextFontHandle(GaugeA) = P_TextFontHandle
  
EndMacro

Macro SetGaugeSubTextFontHandle(GaugeA, P_SubTextFontHandle)
  
  GetGaugeSubTextFontHandle(GaugeA) = P_SubTextFontHandle
  
EndMacro

Macro SetGaugeLayerSize(GaugeA, P_LayerSize)
  
  GetGaugeLayerSize(GaugeA) = P_LayerSize
  
EndMacro

Macro SetGaugeNeedleLength(GaugeA, P_NeedleLength)
  
  GetGaugeNeedleLength(GaugeA) = P_NeedleLength
  
EndMacro

Macro SetGaugeNeedlePivotRadius(GaugeA, P_NeedlePivotRadius)
  
  GetGaugeNeedlePivotRadius(GaugeA) = P_NeedlePivotRadius
  
EndMacro

Macro SetGaugeNeedleTipWidth(GaugeA, P_NeedleTipWidth)
  
  GetGaugeNeedleTipWidth(GaugeA) = P_NeedleTipWidth
  
EndMacro

Macro SetGaugeNeedleCenWidth(GaugeA, P_NeedleCenWidth)
  
  GetGaugeNeedleCenWidth(GaugeA) = P_NeedleCenWidth
  
EndMacro

Macro SetGaugeBackGroundLayer(GaugeA, P_BackGroundLayer)
  
  GetGaugeBackGroundLayer(GaugeA) = P_BackGroundLayer
  
EndMacro

Macro SetGaugeScaleLayer(GaugeA, P_ScaleLayer)
  
  GetGaugeScaleLayer(GaugeA) = P_ScaleLayer
  
EndMacro

Macro SetGaugeDescriptionLayer(GaugeA, P_DescriptionLayer)
  
  GetGaugeDescriptionLayer(GaugeA) = P_DescriptionLayer
  
EndMacro

Macro SetGaugeNeedleLayer(GaugeA, P_NeedleLayer)
  
  GetGaugeNeedleLayer(GaugeA) = P_NeedleLayer
  
EndMacro

Macro SetGaugeComposedLayer(GaugeA, P_ComposedLayer)
  
  GetGaugeComposedLayer(GaugeA) = P_ComposedLayer
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.010 secondes (49500.00 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetGauge(GaugeA)
  
  SetGaugePosX(GaugeA, 0)
  SetGaugePosY(GaugeA, 0)
  SetGaugeSize(GaugeA, 0)
  SetGaugeScaleRadius(GaugeA, 0)
  SetGaugeMin(GaugeA, 0)
  SetGaugeMax(GaugeA, 0)
  SetGaugeBigStep(GaugeA, 0)
  SetGaugeSmallStep(GaugeA, 0)
  SetGaugeValue(GaugeA, 0)
  SetGaugeText(GaugeA, "")
  SetGaugeSubText(GaugeA, "")
  SetGaugeGadgetID(GaugeA, 0)
  SetGaugeGadgetHandle(GaugeA, 0)
  SetGaugeBackGroundColor(GaugeA, 0)
  SetGaugeScaleColor(GaugeA, 0)
  SetGaugeScaleBackGroundColor(GaugeA, 0)
  SetGaugeTextColor(GaugeA, 0)
  SetGaugeSubTextColor(GaugeA, 0)
  SetGaugeNeedleColor(GaugeA, 0)
  SetGaugeLayerSize(GaugeA, 0)
  SetGaugeNeedleLength(GaugeA, 0)
  SetGaugeNeedlePivotRadius(GaugeA, 0)
  SetGaugeNeedleTipWidth(GaugeA, 0)
  SetGaugeNeedleCenWidth(GaugeA, 0)
  
  If GetGaugeScaleFontHandle(GaugeA)
    FreeFont(GetGaugeScaleFontHandle(GaugeA))
    SetGaugeScaleFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeTextFontHandle(GaugeA)
    FreeFont(GetGaugeTextFontHandle(GaugeA))
    SetGaugeTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeSubTextFontHandle(GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(GaugeA))
    SetGaugeSubTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeBackGroundLayer(GaugeA)
    FreeImage(GetGaugeBackGroundLayer(GaugeA))
    SetGaugeBackGroundLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeScaleLayer(GaugeA)
    FreeImage(GetGaugeScaleLayer(GaugeA))
    SetGaugeScaleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeDescriptionLayer(GaugeA)
    FreeImage(GetGaugeDescriptionLayer(GaugeA))
    SetGaugeDescriptionLayer(GaugeA, 0)
  EndIf
  
  If GetGaugeNeedleLayer(GaugeA)
    FreeImage(GetGaugeNeedleLayer(GaugeA))
    SetGaugeNeedleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeComposedLayer(GaugeA)
    FreeImage(GetGaugeComposedLayer(GaugeA))
    SetGaugeComposedLayer(GaugeA, 0)
  EndIf 
  
EndMacro

Macro ResizeGaugeGadget(GaugeA)
  
  If GetGaugeGadgetID(GaugeA) <> #PB_Any
    ResizeGadget(GetGaugeGadgetID(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  Else     
    ResizeGadget(GetGaugeGadgetHandle(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Dessiner un texte centré en x, y <<<<<

Macro DrawTextCentered(x, y, Text, FrontColor, BackColor)
  
  DrawText(x - TextWidth(Text) >> 1, y - TextHeight("Wg") >> 1, Text, FrontColor, BackColor)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type double <<<<<

Procedure.d MaxDouble(P_Number01.d, P_Number02.d)
  
  Biggest_Double.d = P_Number01
  
  If P_Number02 > Biggest_Double
    Biggest_Double = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Double
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type long <<<<<

Procedure.l MaxLong(P_Number01.l, P_Number02.l)
  
  Biggest_Long.l = P_Number01
  
  If P_Number02 > Biggest_Long
    Biggest_Long = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Long
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs spéciaux <<<<<

Macro SetGaugePositionSize(GaugeA, P_X, P_Y, P_Size)
  
  SetGaugePosX(GaugeA, P_X)
  SetGaugePosY(GaugeA, P_Y)
  SetGaugeSize(GaugeA, P_Size)
  
EndMacro 

Macro SetGaugeTextEx(GaugeA, Text, Color_RGBA)
  
  SetGaugeText(GaugeA, Text)
  SetGaugeTextColor(GaugeA, Color_RGBA)
  
EndMacro 

Macro SetGaugeSubTextEx(GaugeA, SubText, Color_RGBA)
  
  SetGaugeSubText(GaugeA, SubText)
  SetGaugeSubTextColor(GaugeA, Color_RGBA)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeBackground <<<<<

Macro PaintGaugeBackground(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), GetGaugeBackGroundColor(GaugeA))
  
  ; DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_Outlined)
  ; Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), RGBA(0, 0, 0, 32))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeScale <<<<<

Macro PaintGaugeScale(GaugeA)
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  
  wpx = GetGaugeLayerSize(GaugeA) / 33
  wpx2 = wpx / 4.0 * 3 - 1
  
  SmallStepDegrees.d = GetGaugeSmallStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  BigStepDegrees.d = GetGaugeBigStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx, GetGaugeScaleColor(GaugeA))
  Next
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx2, GetGaugeScaleBackGroundColor(GaugeA))
  Next
  
  dI.d = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA)
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + SmallStepDegrees
  Wend
  
  dI = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ;?!
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + BigStepDegrees
  Wend
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeScaleFontHandle(GaugeA)))
  
  dI = 0
  I = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ; not sure why that is needed
    
    Offset.w = MaxLong(3, Len(Str(GetGaugeMax(GaugeA) - I)))
    
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    DrawTextCentered(x, y, Str(GetGaugeMax(GaugeA) - I), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
    dI + BigStepDegrees
    I + GetGaugeBigStep(GaugeA)
    
  Wend
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeDescription <<<<<

Macro PaintGaugeDescription(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeTextFontHandle(GaugeA)))
  
  x = GetGaugeCenter(GaugeA)
  y = 32 * GetGaugeSize(GaugeA) / 10
  
  DrawTextCentered(x, y, GetGaugeText(GaugeA), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
  y + TextHeight("Wg")
  
  DrawingFont(FontID(GetGaugeSubTextFontHandle(GaugeA)))
  DrawTextCentered(x, y, GetGaugeSubText(GaugeA), GetGaugeSubTextColor(GaugeA), RGBA(0, 0, 0, 0))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeHand <<<<<

Macro PaintGaugeNeedle(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  HalfSize = GetGaugeLayerSize(GaugeA) >> 1
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  DirDegrees.d = StartDegree + (GetGaugeMax(GaugeA) - GetGaugeValue(GaugeA)) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  SinAngle.d = Sin(Radian(-DirDegrees))
  CosAngle.d = Cos(Radian(-DirDegrees))
  
  x1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)
  
  x2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)
  
  x3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x5 = HalfSize + (-15 * SinAngle); + 0 * CosAngle)
  y5 = HalfSize + (15 * CosAngle); + 0 * SinAngle)
  
  LineXY(x1, y1, x2, y2, GetGaugeNeedleColor(GaugeA))
  LineXY(x2, y2, x3, y3, GetGaugeNeedleColor(GaugeA))
  LineXY(x3, y3, x4, y4, GetGaugeNeedleColor(GaugeA))
  LineXY(x4, y4, x1, y1, GetGaugeNeedleColor(GaugeA))
  
  FillArea(x5, y5, GetGaugeNeedleColor(GaugeA), GetGaugeNeedleColor(GaugeA))
  
  Circle(HalfSize, HalfSize, GetGaugeNeedlePivotRadius(GaugeA), GetGaugeNeedleColor(GaugeA))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur LoadGaugeFont <<<<<

Procedure LoadGaugeFont(*GaugeA.Gauge, FontName.s)
  
  If GetGaugeScaleFontHandle(*GaugeA)
    FreeFont(GetGaugeScaleFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeTextFontHandle(*GaugeA)
    FreeFont(GetGaugeTextFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeSubTextFontHandle(*GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(*GaugeA))
  EndIf
  
  SetGaugeScaleFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, 4 * MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  SetGaugeTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, 4 * MaxDouble(9, 0.056 * GetGaugeSize(*GaugeA)), #PB_Font_Bold))
  SetGaugeSubTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, 4 * MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RepaintGaugeLayer <<<<<

Procedure RepaintGaugeLayer(*GaugeA.Gauge, Needle.b, Scale.b, Description.b, BackGround.b)
  
  If BackGround = #True 
    
    If GetGaugeBackGroundLayer(*GaugeA)
      FreeImage(GetGaugeBackGroundLayer(*GaugeA))
    EndIf 
    
    SetGaugeBackGroundLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeBackGroundLayer(*GaugeA)))
      PaintGaugeBackground(*GaugeA)
      StopDrawing()
    EndIf   
    
    ResizeImage(GetGaugeBackGroundLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf
  
  If Needle = #True
    
    If GetGaugeNeedleLayer(*GaugeA)
      FreeImage(GetGaugeNeedleLayer(*GaugeA))
    EndIf 
    
    SetGaugeNeedleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeNeedleLayer(*GaugeA)))
      PaintGaugeNeedle(*GaugeA)
      StopDrawing()
    EndIf 
    
    ResizeImage(GetGaugeNeedleLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf
  
  If Scale = #True 
    
    If GetGaugeScaleLayer(*GaugeA)
      FreeImage(GetGaugeScaleLayer(*GaugeA))
    EndIf 
    
    SetGaugeScaleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeScaleLayer(*GaugeA)))
      PaintGaugeScale(*GaugeA)
      StopDrawing()
    EndIf 
    
    ResizeImage(GetGaugeScaleLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf
  
  If Description = #True 
    
    If GetGaugeDescriptionLayer(*GaugeA)
      FreeImage(GetGaugeDescriptionLayer(*GaugeA))
    EndIf 
    
    SetGaugeDescriptionLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeDescriptionLayer(*GaugeA)))
      PaintGaugeDescription(*GaugeA)
      StopDrawing()
    EndIf 
    
    ResizeImage(GetGaugeDescriptionLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf 
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefreshGaugeGadget <<<<<

Macro RefreshGaugeGadget(GaugeA)
  
  If GetGaugeComposedLayer(GaugeA)
    FreeImage(GetGaugeComposedLayer(GaugeA))
  EndIf
  
  SetGaugeComposedLayer(GaugeA, CreateImage(#PB_Any, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeComposedLayer(GaugeA)))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(GetGaugeBackGroundLayer(GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeScaleLayer(GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeDescriptionLayer(GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeNeedleLayer(GaugeA)), 0, 0)
    StopDrawing()
    
  EndIf 
  
  If GetGaugeGadgetID(GaugeA) <> #PB_Any
    SetGadgetState(GetGaugeGadgetID(GaugeA), ImageID(GetGaugeComposedLayer(GaugeA)))
  Else     
    SetGadgetState(GetGaugeGadgetHandle(GaugeA), ImageID(GetGaugeComposedLayer(GaugeA)))
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur GaugeGadget <<<<<

Procedure GaugeGadget(*GaugeA.Gauge, GaugeID.l, x.w, y.w, Size.w, FontName.s = "", Options.l = 0)
  
  SetGaugeGadgetID(*GaugeA, GaugeID)
  SetGaugeGadgetHandle(*GaugeA, ImageGadget(GetGaugeGadgetID(*GaugeA), x, y, Size, Size, 0, Options))
  SetGaugePositionSize(*GaugeA, x, y, Size)
  
  SetGaugeCenter(*GaugeA, (4*Size) >> 1)
  SetGaugeScaleRadius(*GaugeA, 4 * Size * 3 / 10)
  
  SetGaugeLayerSize(*GaugeA, Size * 4)
  
  SetGaugeNeedleLength(*GaugeA, (1 + GetGaugeScaleRadius(*GaugeA)))
  SetGaugeNeedlePivotRadius(*GaugeA, GetGaugeNeedleLength(*GaugeA) / 10)
  SetGaugeNeedleTipWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 7)
  SetGaugeNeedleCenWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 2)
  
  If FontName <> ""
    LoadGaugeFont(*GaugeA, FontName)
  EndIf 
  
  SetGaugeSectorDegrees(*GaugeA, 270)
  
  SetGaugeBackGroundColor(*GaugeA, RGBA(0, 0, 0, 0))
  SetGaugeScaleColor(*GaugeA, RGBA(62, 62, 128, 192))
  SetGaugeScaleBackGroundColor(*GaugeA, RGBA(64, 64, 64, 32))
  SetGaugeTextColor(*GaugeA, RGBA(0, 0, 0, 255))
  SetGaugeSubTextColor(*GaugeA, RGBA(92, 92, 92, 255))
  SetGaugeNeedleColor(*GaugeA, RGBA(255, 000, 000, 255))
  SetGaugeMin(*GaugeA, 0)
  SetGaugeMax(*GaugeA, 100)
  SetGaugeBigStep(*GaugeA, 10)
  SetGaugeSmallStep(*GaugeA, 5)
  SetGaugeValue(*GaugeA, 0)
  SetGaugeText(*GaugeA, "Value")
  SetGaugeSubText(*GaugeA, "in units")
  
  RepaintGaugeLayer(*GaugeA, #True, #True, #True, #True)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur ChangeGaugeGadgetValue <<<<<

Procedure ChangeGaugeGadgetValue(*GaugeA.Gauge, P_Value.l)
  
  SetGaugeValue(*GaugeA, P_Value)
  RepaintGaugeLayer(*GaugeA, #True, #False, #False, #False)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

Procedure ChangeGaugeGadgetSectorDegrees(*GaugeA.Gauge, P_SectorDegrees.l)
  
  SetGaugeSectorDegrees(*GaugeA, P_SectorDegrees)
  RepaintGaugeLayer(*GaugeA, #True, #True, #False, #False)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

Procedure ChangeGaugeGadgetMinMaxSteps(*GaugeA.Gauge, P_Min.l, P_Max.l, P_BigStep.l, P_SmallStep.l)
  
  SetGaugeMin(*GaugeA, P_Min)
  SetGaugeMax(*GaugeA, P_Max)
  SetGaugeBigStep(*GaugeA, P_BigStep)
  SetGaugeSmallStep(*GaugeA, P_SmallStep)
  RepaintGaugeLayer(*GaugeA, #False, #True, #False, #False)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

Procedure ChangeGaugeGadgetDescription(*GaugeA.Gauge, P_Text.s, P_SubText.s)
  
  SetGaugeText(*GaugeA, P_Text)
  SetGaugeSubText(*GaugeA, P_SubText)
  RepaintGaugeLayer(*GaugeA, #False, #False, #True, #False)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

#W = 425
#H = 375

CompilerSelect #PB_Compiler_OS
    
  CompilerCase #PB_OS_Linux
    FontName.s = "Liberation Sans"
    
  CompilerCase #PB_OS_Windows
    FontName.s = "Tahoma"
    
CompilerEndSelect

If OpenWindow(0, 0, 0, #W, #H, "Gauge Gadget Demo", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  
  TrackBarGadget(0, 5, 5, 20, 360, 0, 360, #PB_TrackBar_Vertical)
  TrackBarGadget(1, 30, 5, 20, 360, 1, 360, #PB_TrackBar_Vertical)
  
  GaugeGadget(GaugeA.Gauge, 5, 55, 5, 360, FontName, 1)
  ChangeGaugeGadgetMinMaxSteps(GaugeA, 0, 360, 60, 15)
  ChangeGaugeGadgetDescription(GaugeA, "Pressure", "in kPa")
  
  SetGadgetState(0, 0)
  SetGadgetState(1, 270)
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_Gadget 
        
        Select EventGadget()
            
          Case 0 ; Change value
            ChangeGaugeGadgetValue(GaugeA, GetGadgetState(0))
            
          Case 1 ; Change size in degrees
            ChangeGaugeGadgetSectorDegrees(GaugeA, GetGadgetState(1))
            
        EndSelect
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
    
  ForEver
  
  ResetGauge(GaugeA)
  
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<

Re: Gauge display

Posted: Sun May 22, 2011 5:42 am
by Guimauve
Hello again !

This the version 2.1.0.

Best regards.
Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : GaugeGadget
; File Name : GaugeGadget.pb
; File version: 2.1.0
; Programmation : OK
; Programmed by : Trond
; Modified by : Guimauve
; Date : 20-02-2011
; Mise à jour : 22-05-2011
; PureBasic code : 4.51
; Plateform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes :
;
; Some field in the Gauge Structure has been 
; renamed or suppressed.
; 
; A layer has been added for the Needle. The size 
; for this layer is 4 times larger than other 
; layer. This is needed to draw the needle more 
; smootly. 
;
; Finally, the GaugeGadget shape can be square
; only.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Gauge
  
  PosX.w
  PosY.w
  Size.w
  Center.w
  ScaleRadius.w
  Min.l
  Max.l
  BigStep.l
  SmallStep.l
  SectorDegrees.w
  Value.l
  Text.s
  SubText.s
  GadgetID.l
  GadgetHandle.l
  BackGroundColor.l
  ScaleColor.l
  ScaleBackGroundColor.l
  TextColor.l
  SubTextColor.l
  NeedleColor.l
  ScaleFontHandle.i
  TextFontHandle.i
  SubTextFontHandle.i
  LayerSize.w
  NeedleLength.l
  NeedlePivotRadius.l
  NeedleTipWidth.l
  NeedleCenWidth.l
  ScaleLayer.l
  NeedleLayer.l
  ComposedLayer.l
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetGaugePosX(GaugeA)
  
  GaugeA\PosX
  
EndMacro

Macro GetGaugePosY(GaugeA)
  
  GaugeA\PosY
  
EndMacro

Macro GetGaugeSize(GaugeA)
  
  GaugeA\Size
  
EndMacro

Macro GetGaugeCenter(GaugeA)
  
  GaugeA\Center
  
EndMacro

Macro GetGaugeScaleRadius(GaugeA)
  
  GaugeA\ScaleRadius
  
EndMacro

Macro GetGaugeMin(GaugeA)
  
  GaugeA\Min
  
EndMacro

Macro GetGaugeMax(GaugeA)
  
  GaugeA\Max
  
EndMacro

Macro GetGaugeBigStep(GaugeA)
  
  GaugeA\BigStep
  
EndMacro

Macro GetGaugeSmallStep(GaugeA)
  
  GaugeA\SmallStep
  
EndMacro

Macro GetGaugeSectorDegrees(GaugeA)
  
  GaugeA\SectorDegrees
  
EndMacro

Macro GetGaugeValue(GaugeA)
  
  GaugeA\Value
  
EndMacro

Macro GetGaugeText(GaugeA)
  
  GaugeA\Text
  
EndMacro

Macro GetGaugeSubText(GaugeA)
  
  GaugeA\SubText
  
EndMacro

Macro GetGaugeGadgetID(GaugeA)
  
  GaugeA\GadgetID
  
EndMacro

Macro GetGaugeGadgetHandle(GaugeA)
  
  GaugeA\GadgetHandle
  
EndMacro

Macro GetGaugeBackGroundColor(GaugeA)
  
  GaugeA\BackGroundColor
  
EndMacro

Macro GetGaugeScaleColor(GaugeA)
  
  GaugeA\ScaleColor
  
EndMacro

Macro GetGaugeScaleBackGroundColor(GaugeA)
  
  GaugeA\ScaleBackGroundColor
  
EndMacro

Macro GetGaugeTextColor(GaugeA)
  
  GaugeA\TextColor
  
EndMacro

Macro GetGaugeSubTextColor(GaugeA)
  
  GaugeA\SubTextColor
  
EndMacro

Macro GetGaugeNeedleColor(GaugeA)
  
  GaugeA\NeedleColor
  
EndMacro

Macro GetGaugeScaleFontHandle(GaugeA)
  
  GaugeA\ScaleFontHandle
  
EndMacro

Macro GetGaugeTextFontHandle(GaugeA)
  
  GaugeA\TextFontHandle
  
EndMacro

Macro GetGaugeSubTextFontHandle(GaugeA)
  
  GaugeA\SubTextFontHandle
  
EndMacro

Macro GetGaugeLayerSize(GaugeA)
  
  GaugeA\LayerSize
  
EndMacro

Macro GetGaugeNeedleLength(GaugeA)
  
  GaugeA\NeedleLength
  
EndMacro

Macro GetGaugeNeedlePivotRadius(GaugeA)
  
  GaugeA\NeedlePivotRadius
  
EndMacro

Macro GetGaugeNeedleTipWidth(GaugeA)
  
  GaugeA\NeedleTipWidth
  
EndMacro

Macro GetGaugeNeedleCenWidth(GaugeA)
  
  GaugeA\NeedleCenWidth
  
EndMacro

Macro GetGaugeScaleLayer(GaugeA)
  
  GaugeA\ScaleLayer
  
EndMacro

Macro GetGaugeNeedleLayer(GaugeA)
  
  GaugeA\NeedleLayer
  
EndMacro

Macro GetGaugeComposedLayer(GaugeA)
  
  GaugeA\ComposedLayer
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetGaugePosX(GaugeA, P_PosX)
  
  GetGaugePosX(GaugeA) = P_PosX
  
EndMacro

Macro SetGaugePosY(GaugeA, P_PosY)
  
  GetGaugePosY(GaugeA) = P_PosY
  
EndMacro

Macro SetGaugeSize(GaugeA, P_Size)
  
  GetGaugeSize(GaugeA) = P_Size
  
EndMacro

Macro SetGaugeCenter(GaugeA, P_Center)
  
  GetGaugeCenter(GaugeA) = P_Center
  
EndMacro

Macro SetGaugeScaleRadius(GaugeA, P_ScaleRadius)
  
  GetGaugeScaleRadius(GaugeA) = P_ScaleRadius
  
EndMacro

Macro SetGaugeMin(GaugeA, P_Min)
  
  GetGaugeMin(GaugeA) = P_Min
  
EndMacro

Macro SetGaugeMax(GaugeA, P_Max)
  
  GetGaugeMax(GaugeA) = P_Max
  
EndMacro

Macro SetGaugeBigStep(GaugeA, P_BigStep)
  
  GetGaugeBigStep(GaugeA) = P_BigStep
  
EndMacro

Macro SetGaugeSmallStep(GaugeA, P_SmallStep)
  
  GetGaugeSmallStep(GaugeA) = P_SmallStep
  
EndMacro

Macro SetGaugeSectorDegrees(GaugeA, P_SectorDegrees)
  
  GetGaugeSectorDegrees(GaugeA) = P_SectorDegrees
  
EndMacro

Macro SetGaugeValue(GaugeA, P_Value)
  
  GetGaugeValue(GaugeA) = P_Value
  
EndMacro

Macro SetGaugeText(GaugeA, P_Text)
  
  GetGaugeText(GaugeA) = P_Text
  
EndMacro

Macro SetGaugeSubText(GaugeA, P_SubText)
  
  GetGaugeSubText(GaugeA) = P_SubText
  
EndMacro

Macro SetGaugeGadgetID(GaugeA, P_GadgetID)
  
  GetGaugeGadgetID(GaugeA) = P_GadgetID
  
EndMacro

Macro SetGaugeGadgetHandle(GaugeA, P_GadgetHandle)
  
  GetGaugeGadgetHandle(GaugeA) = P_GadgetHandle
  
EndMacro

Macro SetGaugeBackGroundColor(GaugeA, P_BackGroundColor)
  
  GetGaugeBackGroundColor(GaugeA) = P_BackGroundColor
  
EndMacro

Macro SetGaugeScaleColor(GaugeA, P_ScaleColor)
  
  GetGaugeScaleColor(GaugeA) = P_ScaleColor
  
EndMacro

Macro SetGaugeScaleBackGroundColor(GaugeA, P_ScaleBackGroundColor)
  
  GetGaugeScaleBackGroundColor(GaugeA) = P_ScaleBackGroundColor
  
EndMacro

Macro SetGaugeTextColor(GaugeA, P_TextColor)
  
  GetGaugeTextColor(GaugeA) = P_TextColor
  
EndMacro

Macro SetGaugeSubTextColor(GaugeA, P_SubTextColor)
  
  GetGaugeSubTextColor(GaugeA) = P_SubTextColor
  
EndMacro

Macro SetGaugeNeedleColor(GaugeA, P_NeedleColor)
  
  GetGaugeNeedleColor(GaugeA) = P_NeedleColor
  
EndMacro

Macro SetGaugeScaleFontHandle(GaugeA, P_ScaleFontHandle)
  
  GetGaugeScaleFontHandle(GaugeA) = P_ScaleFontHandle
  
EndMacro

Macro SetGaugeTextFontHandle(GaugeA, P_TextFontHandle)
  
  GetGaugeTextFontHandle(GaugeA) = P_TextFontHandle
  
EndMacro

Macro SetGaugeSubTextFontHandle(GaugeA, P_SubTextFontHandle)
  
  GetGaugeSubTextFontHandle(GaugeA) = P_SubTextFontHandle
  
EndMacro

Macro SetGaugeLayerSize(GaugeA, P_LayerSize)
  
  GetGaugeLayerSize(GaugeA) = P_LayerSize
  
EndMacro

Macro SetGaugeNeedleLength(GaugeA, P_NeedleLength)
  
  GetGaugeNeedleLength(GaugeA) = P_NeedleLength
  
EndMacro

Macro SetGaugeNeedlePivotRadius(GaugeA, P_NeedlePivotRadius)
  
  GetGaugeNeedlePivotRadius(GaugeA) = P_NeedlePivotRadius
  
EndMacro

Macro SetGaugeNeedleTipWidth(GaugeA, P_NeedleTipWidth)
  
  GetGaugeNeedleTipWidth(GaugeA) = P_NeedleTipWidth
  
EndMacro

Macro SetGaugeNeedleCenWidth(GaugeA, P_NeedleCenWidth)
  
  GetGaugeNeedleCenWidth(GaugeA) = P_NeedleCenWidth
  
EndMacro

Macro SetGaugeScaleLayer(GaugeA, P_ScaleLayer)
  
  GetGaugeScaleLayer(GaugeA) = P_ScaleLayer
  
EndMacro

Macro SetGaugeNeedleLayer(GaugeA, P_NeedleLayer)
  
  GetGaugeNeedleLayer(GaugeA) = P_NeedleLayer
  
EndMacro

Macro SetGaugeComposedLayer(GaugeA, P_ComposedLayer)
  
  GetGaugeComposedLayer(GaugeA) = P_ComposedLayer
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.010 secondes (49500.00 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetGauge(GaugeA)
  
  SetGaugePosX(GaugeA, 0)
  SetGaugePosY(GaugeA, 0)
  SetGaugeSize(GaugeA, 0)
  SetGaugeScaleRadius(GaugeA, 0)
  SetGaugeMin(GaugeA, 0)
  SetGaugeMax(GaugeA, 0)
  SetGaugeBigStep(GaugeA, 0)
  SetGaugeSmallStep(GaugeA, 0)
  SetGaugeValue(GaugeA, 0)
  SetGaugeText(GaugeA, "")
  SetGaugeSubText(GaugeA, "")
  SetGaugeGadgetID(GaugeA, 0)
  SetGaugeGadgetHandle(GaugeA, 0)
  SetGaugeBackGroundColor(GaugeA, 0)
  SetGaugeScaleColor(GaugeA, 0)
  SetGaugeScaleBackGroundColor(GaugeA, 0)
  SetGaugeTextColor(GaugeA, 0)
  SetGaugeSubTextColor(GaugeA, 0)
  SetGaugeNeedleColor(GaugeA, 0)
  SetGaugeLayerSize(GaugeA, 0)
  SetGaugeNeedleLength(GaugeA, 0)
  SetGaugeNeedlePivotRadius(GaugeA, 0)
  SetGaugeNeedleTipWidth(GaugeA, 0)
  SetGaugeNeedleCenWidth(GaugeA, 0)
  
  If GetGaugeScaleFontHandle(GaugeA)
    FreeFont(GetGaugeScaleFontHandle(GaugeA))
    SetGaugeScaleFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeTextFontHandle(GaugeA)
    FreeFont(GetGaugeTextFontHandle(GaugeA))
    SetGaugeTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeSubTextFontHandle(GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(GaugeA))
    SetGaugeSubTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeScaleLayer(GaugeA)
    FreeImage(GetGaugeScaleLayer(GaugeA))
    SetGaugeScaleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeNeedleLayer(GaugeA)
    FreeImage(GetGaugeNeedleLayer(GaugeA))
    SetGaugeNeedleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeComposedLayer(GaugeA)
    FreeImage(GetGaugeComposedLayer(GaugeA))
    SetGaugeComposedLayer(GaugeA, 0)
  EndIf 
  
EndMacro

Macro ResizeGaugeGadget(GaugeA)
  
  If GetGaugeGadgetID(GaugeA) <> #PB_Any
    ResizeGadget(GetGaugeGadgetID(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  Else     
    ResizeGadget(GetGaugeGadgetHandle(GaugeA), GetGaugePosX(GaugeA), GetGaugePosY(GaugeA), #PB_Ignore, #PB_Ignore)
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Dessiner un texte centré en x, y <<<<<

Macro DrawTextCentered(x, y, Text, FrontColor, BackColor)
  
  DrawText(x - TextWidth(Text) >> 1, y - TextHeight("Wg") >> 1, Text, FrontColor, BackColor)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type double <<<<<

Procedure.d MaxDouble(P_Number01.d, P_Number02.d)
  
  Biggest_Double.d = P_Number01
  
  If P_Number02 > Biggest_Double
    Biggest_Double = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Double
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type long <<<<<

Procedure.l MaxLong(P_Number01.l, P_Number02.l)
  
  Biggest_Long.l = P_Number01
  
  If P_Number02 > Biggest_Long
    Biggest_Long = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Long
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs spéciaux <<<<<

Macro SetGaugePositionSize(GaugeA, P_X, P_Y, P_Size)
  
  SetGaugePosX(GaugeA, P_X)
  SetGaugePosY(GaugeA, P_Y)
  SetGaugeSize(GaugeA, P_Size)
  
EndMacro 

Macro SetGaugeTextEx(GaugeA, Text, Color_RGBA)
  
  SetGaugeText(GaugeA, Text)
  SetGaugeTextColor(GaugeA, Color_RGBA)
  
EndMacro 

Macro SetGaugeSubTextEx(GaugeA, SubText, Color_RGBA)
  
  SetGaugeSubText(GaugeA, SubText)
  SetGaugeSubTextColor(GaugeA, Color_RGBA)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeBackground <<<<<

Macro PaintGaugeBackground(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  Box(0, 0, GetGaugeLayerSize(GaugeA), GetGaugeLayerSize(GaugeA), GetGaugeBackGroundColor(GaugeA))
  
  ; DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_Outlined)
  ; Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), RGBA(0, 0, 0, 32))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeScale <<<<<

Macro PaintGaugeScale(GaugeA)
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  
  wpx = GetGaugeLayerSize(GaugeA) / 33
  wpx2 = wpx / 4.0 * 3 - 1
  
  SmallStepDegrees.d = GetGaugeSmallStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  BigStepDegrees.d = GetGaugeBigStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx, GetGaugeScaleColor(GaugeA))
  Next
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx2, GetGaugeScaleBackGroundColor(GaugeA))
  Next
  
  dI.d = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA)
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + SmallStepDegrees
  Wend
  
  dI = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ;?!
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + BigStepDegrees
  Wend
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeScaleFontHandle(GaugeA)))
  
  dI = 0
  I = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ; not sure why that is needed
    
    Offset.w = MaxLong(3, Len(Str(GetGaugeMax(GaugeA) - I)))
    
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    DrawTextCentered(x, y, Str(GetGaugeMax(GaugeA) - I), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
    dI + BigStepDegrees
    I + GetGaugeBigStep(GaugeA)
    
  Wend
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeDescription <<<<<

Macro PaintGaugeDescription(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeTextFontHandle(GaugeA)))
  
  x = GetGaugeCenter(GaugeA)
  y = 32 * GetGaugeSize(GaugeA) / 10
  
  DrawTextCentered(x, y, GetGaugeText(GaugeA), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
  y + TextHeight("Wg")
  
  DrawingFont(FontID(GetGaugeSubTextFontHandle(GaugeA)))
  DrawTextCentered(x, y, GetGaugeSubText(GaugeA), GetGaugeSubTextColor(GaugeA), RGBA(0, 0, 0, 0))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeHand <<<<<

Macro PaintGaugeNeedle(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  HalfSize = GetGaugeLayerSize(GaugeA) >> 1
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  DirDegrees.d = StartDegree + (GetGaugeMax(GaugeA) - GetGaugeValue(GaugeA)) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  SinAngle.d = Sin(Radian(-DirDegrees))
  CosAngle.d = Cos(Radian(-DirDegrees))
  
  x1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)
  
  x2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * CosAngle); - 0 * SinAngle)
  y2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * SinAngle); + 0 * CosAngle)
  
  x3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x5 = HalfSize + (-15 * SinAngle); + 0 * CosAngle)
  y5 = HalfSize + (15 * CosAngle); + 0 * SinAngle)
  
  LineXY(x1, y1, x2, y2, GetGaugeNeedleColor(GaugeA))
  LineXY(x2, y2, x3, y3, GetGaugeNeedleColor(GaugeA))
  LineXY(x3, y3, x4, y4, GetGaugeNeedleColor(GaugeA))
  LineXY(x4, y4, x1, y1, GetGaugeNeedleColor(GaugeA))
  
  FillArea(x5, y5, GetGaugeNeedleColor(GaugeA), GetGaugeNeedleColor(GaugeA))
  
  Circle(HalfSize, HalfSize, GetGaugeNeedlePivotRadius(GaugeA), GetGaugeNeedleColor(GaugeA))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur LoadGaugeFont <<<<<

Procedure LoadGaugeFont(*GaugeA.Gauge, FontName.s)
  
  If GetGaugeScaleFontHandle(*GaugeA)
    FreeFont(GetGaugeScaleFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeTextFontHandle(*GaugeA)
    FreeFont(GetGaugeTextFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeSubTextFontHandle(*GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(*GaugeA))
  EndIf
  
  SetGaugeScaleFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, 4 * MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  SetGaugeTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, 4 * MaxDouble(9, 0.056 * GetGaugeSize(*GaugeA)), #PB_Font_Bold))
  SetGaugeSubTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, 4 * MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RepaintGaugeLayer <<<<<

Procedure RepaintGaugeLayer(*GaugeA.Gauge, Needle.b, Scale.b)
  
  If Needle = #True
    
    If GetGaugeNeedleLayer(*GaugeA)
      FreeImage(GetGaugeNeedleLayer(*GaugeA))
    EndIf 
    
    SetGaugeNeedleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeNeedleLayer(*GaugeA)))
      PaintGaugeNeedle(*GaugeA)
      StopDrawing()
    EndIf 
    
    ResizeImage(GetGaugeNeedleLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf
  
  If Scale = #True 
    
    If GetGaugeScaleLayer(*GaugeA)
      FreeImage(GetGaugeScaleLayer(*GaugeA))
    EndIf 
    
    SetGaugeScaleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeScaleLayer(*GaugeA)))
      PaintGaugeBackground(*GaugeA)
      PaintGaugeScale(*GaugeA)
      PaintGaugeDescription(*GaugeA)
      StopDrawing()
    EndIf 
    
    ResizeImage(GetGaugeScaleLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefreshGaugeGadget <<<<<

Procedure RefreshGaugeGadget(*GaugeA.Gauge)
  
  If GetGaugeComposedLayer(*GaugeA)
    FreeImage(GetGaugeComposedLayer(*GaugeA))
  EndIf
  
  SetGaugeComposedLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeComposedLayer(*GaugeA)))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(GetGaugeScaleLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeNeedleLayer(*GaugeA)), 0, 0)
    StopDrawing()
    
  EndIf 
  
  If GetGaugeGadgetID(*GaugeA) <> #PB_Any
    SetGadgetState(GetGaugeGadgetID(*GaugeA), ImageID(GetGaugeComposedLayer(*GaugeA)))
  Else     
    SetGadgetState(GetGaugeGadgetHandle(*GaugeA), ImageID(GetGaugeComposedLayer(*GaugeA)))
  EndIf 
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur GaugeGadget <<<<<

Procedure GaugeGadget(*GaugeA.Gauge, GaugeID.l, x.w, y.w, Size.w, FontName.s = "", Options.l = 0)
  
  SetGaugeGadgetID(*GaugeA, GaugeID)
  SetGaugeGadgetHandle(*GaugeA, ImageGadget(GetGaugeGadgetID(*GaugeA), x, y, Size, Size, 0, Options))
  
  If GetGaugeGadgetID(*GaugeA) <> #PB_Any
    SetGadgetData(GetGaugeGadgetID(*GaugeA), *GaugeA)
  Else
    
  EndIf 
  
  SetGaugePositionSize(*GaugeA, x, y, Size)
  
  SetGaugeCenter(*GaugeA, (4*Size) >> 1)
  SetGaugeScaleRadius(*GaugeA, 4 * Size * 3 / 10)
  
  SetGaugeLayerSize(*GaugeA, Size * 4)
  
  SetGaugeNeedleLength(*GaugeA, (1 + GetGaugeScaleRadius(*GaugeA)))
  SetGaugeNeedlePivotRadius(*GaugeA, GetGaugeNeedleLength(*GaugeA) / 10)
  SetGaugeNeedleTipWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 7)
  SetGaugeNeedleCenWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 2)
  
  If FontName <> ""
    LoadGaugeFont(*GaugeA, FontName)
  EndIf 
  
  SetGaugeSectorDegrees(*GaugeA, 270)
  
  SetGaugeBackGroundColor(*GaugeA, RGBA(0, 0, 0, 0))
  SetGaugeScaleColor(*GaugeA, RGBA(62, 62, 128, 192))
  SetGaugeScaleBackGroundColor(*GaugeA, RGBA(64, 64, 64, 32))
  SetGaugeTextColor(*GaugeA, RGBA(0, 0, 0, 255))
  SetGaugeSubTextColor(*GaugeA, RGBA(92, 92, 92, 255))
  SetGaugeNeedleColor(*GaugeA, RGBA(255, 000, 000, 255))
  SetGaugeMin(*GaugeA, 0)
  SetGaugeMax(*GaugeA, 100)
  SetGaugeBigStep(*GaugeA, 10)
  SetGaugeSmallStep(*GaugeA, 5)
  SetGaugeValue(*GaugeA, 0)
  SetGaugeText(*GaugeA, "Value")
  SetGaugeSubText(*GaugeA, "in units")
  
  RepaintGaugeLayer(*GaugeA, #True, #True)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur ChangeGaugeGadgetValue <<<<<

Procedure ChangeGaugeGadgetValue(*GaugeA.Gauge, P_Value.l)
  
  SetGaugeValue(*GaugeA, P_Value)
  RepaintGaugeLayer(*GaugeA, #True, #False)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

Procedure ChangeGaugeGadgetSectorDegrees(*GaugeA.Gauge, P_SectorDegrees.l)
  
  SetGaugeSectorDegrees(*GaugeA, P_SectorDegrees)
  RepaintGaugeLayer(*GaugeA, #True, #True)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

Procedure ChangeGaugeGadgetMinMaxSteps(*GaugeA.Gauge, P_Min.l, P_Max.l, P_BigStep.l, P_SmallStep.l)
  
  SetGaugeMin(*GaugeA, P_Min)
  SetGaugeMax(*GaugeA, P_Max)
  SetGaugeBigStep(*GaugeA, P_BigStep)
  SetGaugeSmallStep(*GaugeA, P_SmallStep)
  RepaintGaugeLayer(*GaugeA, #False, #True)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

Procedure ChangeGaugeGadgetDescription(*GaugeA.Gauge, P_Text.s, P_SubText.s)
  
  SetGaugeText(*GaugeA, P_Text)
  SetGaugeSubText(*GaugeA, P_SubText)
  RepaintGaugeLayer(*GaugeA, #False, #True)
  RefreshGaugeGadget(*GaugeA)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

#Size = 200

#W = 2 * #Size + 145
#H = 2 * #Size + 25

CompilerSelect #PB_Compiler_OS
    
  CompilerCase #PB_OS_Linux
    FontName.s = "Liberation Sans"
    
  CompilerCase #PB_OS_Windows
    FontName.s = "Tahoma"
    
CompilerEndSelect

If OpenWindow(0, 0, 0, #W, #H, "Gauge Gadget Demo", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

  TrackBarGadget(0, 5, 5, 20, #Size, 0, 3600, #PB_TrackBar_Vertical)
  TrackBarGadget(1, 30, 5, 20, #Size, 1, 360, #PB_TrackBar_Vertical)  
  SetGadgetState(0, 0)
  SetGadgetState(1, 270)
  
  GaugeGadget(Pressure.Gauge, 3, 55, 5, #Size, FontName, 1)
  ChangeGaugeGadgetMinMaxSteps(Pressure, 0, 3600, 300, 150)
  ChangeGaugeGadgetDescription(Pressure, "Pressure", "in kPa")
  
  
  TrackBarGadget(4, 85 + #Size, 5, 20, #Size, 0, 200, #PB_TrackBar_Vertical)
  TrackBarGadget(5, 110 + #Size, 5, 20, #Size, 1, 360, #PB_TrackBar_Vertical)
  SetGadgetState(4, 0)
  SetGadgetState(5, 250)
  
  GaugeGadget(Temperature.Gauge, 6, 135 + #Size, 5, #Size, FontName, 1)
  ChangeGaugeGadgetMinMaxSteps(Temperature, 0, 200, 20, 5)
  ChangeGaugeGadgetDescription(Temperature, "Temperature", "in K")
  ChangeGaugeGadgetSectorDegrees(Temperature, 250)
  
  
  
  TrackBarGadget(7, 5 , 15 + #Size, 20, #Size, 0, 100, #PB_TrackBar_Vertical)
  TrackBarGadget(8, 30, 15 + #Size, 20, #Size, 1, 360, #PB_TrackBar_Vertical)
  SetGadgetState(7, 0)
  SetGadgetState(8, 270)
  
  GaugeGadget(Humidity.Gauge, 9, 55, 15 + #Size, #Size, FontName, 1)
  ChangeGaugeGadgetMinMaxSteps(Humidity, 0, 100, 10, 5)
  ChangeGaugeGadgetDescription(Humidity, "Humidity", "in %")
  

  

  TrackBarGadget(10, 85 + #Size, 15 + #Size, 20, #Size, 0, 50, #PB_TrackBar_Vertical)
  TrackBarGadget(11, 110 + #Size, 15 + #Size, 20, #Size, 1, 360, #PB_TrackBar_Vertical)
  SetGadgetState(10, 0)
  SetGadgetState(11, 250)
  
  GaugeGadget(Density.Gauge, 12, 135 + #Size, 15 + #Size, #Size, FontName, 1)
  ChangeGaugeGadgetMinMaxSteps(Density, 0, 50, 5, 1)
  ChangeGaugeGadgetDescription(Density, "Density", "kg/m³")
  

    
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_Gadget 
        
        Select EventGadget()
            
          Case 0 ; Change value
            ChangeGaugeGadgetValue(Pressure, GetGadgetState(0))
            
          Case 1 ; Change size in degrees
            ChangeGaugeGadgetSectorDegrees(Pressure, GetGadgetState(1))
            
          Case 4 ; Change value
            ChangeGaugeGadgetValue(Temperature, GetGadgetState(4))
            
          Case 5 ; Change size in degrees
            ChangeGaugeGadgetSectorDegrees(Temperature, GetGadgetState(5))
            
          Case 7 ; Change value
            ChangeGaugeGadgetValue(Humidity, GetGadgetState(7))
            
          Case 8 ; Change size in degrees
            ChangeGaugeGadgetSectorDegrees(Humidity, GetGadgetState(8))
            
          Case 10 ; Change value
            ChangeGaugeGadgetValue(Density, GetGadgetState(10))
            
          Case 11 ; Change size in degrees
            ChangeGaugeGadgetSectorDegrees(Density, GetGadgetState(11)) 
            
        EndSelect
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
    
  ForEver
  
  ResetGauge(Pressure)
  ResetGauge(Temperature)
  ResetGauge(Humidity)
  ResetGauge(Density)
  
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<

Re: Gauge display

Posted: Sun May 22, 2011 1:00 pm
by yrreti
Nice job Guimauve
Thanks for sharing.

Re: Gauge display

Posted: Fri May 11, 2012 3:00 pm
by Guimauve
Hello everyone,

A little update to my previous code. Now the Gadget can be managed like any standard PureBasic Gadget.
Including the use of #PB_Any for the GadgetID. The drawback, the GaugeGadget() no longer have GadgetData.
The GadgetData are used to store the Gadget related information.

Best regards.
Guimauve

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : GaugeGadget
; File Name : GaugeGadget.pb
; File version: 3.0.0
; Programmation : OK
; Programmed by : Trond
; Modified by : Guimauve
; Date : 20-02-2011
; Mise à jour : 10-05-2012
; PureBasic code : 4.61
; Plateform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Notes :
;
; Some field in the Gauge Structure has been 
; renamed or suppressed.
; 
; A layer has been added for the Needle. The size 
; for this layer is 4 times larger than other 
; layer. This is needed to draw the needle more 
; smootly. 
;
; Finally, the GaugeGadget shape can be square
; only.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure <<<<<

Structure Gauge

  PosX.w
  PosY.w
  Size.w
  Center.w
  ScaleRadius.w
  Min.l
  Max.l
  BigStep.l
  SmallStep.l
  SectorDegrees.w
  Value.l
  Text.s
  SubText.s
  GadgetID.l
  GadgetHandle.l
  BackGroundColor.l
  ScaleColor.l
  ScaleBackGroundColor.l
  TextColor.l
  SubTextColor.l
  NeedleColor.l
  ScaleFontHandle.i
  TextFontHandle.i
  SubTextFontHandle.i
  DrawingScale.b
  LayerSize.w
  NeedleLength.l
  NeedlePivotRadius.l
  NeedleTipWidth.l
  NeedleCenWidth.l
  ScaleLayer.l
  NeedleLayer.l
  ComposedLayer.l

EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs <<<<<

Macro GetGaugePosX(GaugeA)

  GaugeA\PosX

EndMacro

Macro GetGaugePosY(GaugeA)

  GaugeA\PosY

EndMacro

Macro GetGaugeSize(GaugeA)

  GaugeA\Size

EndMacro

Macro GetGaugeCenter(GaugeA)

  GaugeA\Center

EndMacro

Macro GetGaugeScaleRadius(GaugeA)

  GaugeA\ScaleRadius

EndMacro

Macro GetGaugeMin(GaugeA)

  GaugeA\Min

EndMacro

Macro GetGaugeMax(GaugeA)

  GaugeA\Max

EndMacro

Macro GetGaugeBigStep(GaugeA)

  GaugeA\BigStep

EndMacro

Macro GetGaugeSmallStep(GaugeA)

  GaugeA\SmallStep

EndMacro

Macro GetGaugeSectorDegrees(GaugeA)

  GaugeA\SectorDegrees

EndMacro

Macro GetGaugeValue(GaugeA)

  GaugeA\Value

EndMacro

Macro GetGaugeText(GaugeA)

  GaugeA\Text

EndMacro

Macro GetGaugeSubText(GaugeA)

  GaugeA\SubText

EndMacro

Macro GetGaugeGadgetID(GaugeA)

  GaugeA\GadgetID

EndMacro

Macro GetGaugeGadgetHandle(GaugeA)

  GaugeA\GadgetHandle

EndMacro

Macro GetGaugeBackGroundColor(GaugeA)

  GaugeA\BackGroundColor

EndMacro

Macro GetGaugeScaleColor(GaugeA)

  GaugeA\ScaleColor

EndMacro

Macro GetGaugeScaleBackGroundColor(GaugeA)

  GaugeA\ScaleBackGroundColor

EndMacro

Macro GetGaugeTextColor(GaugeA)

  GaugeA\TextColor

EndMacro

Macro GetGaugeSubTextColor(GaugeA)

  GaugeA\SubTextColor

EndMacro

Macro GetGaugeNeedleColor(GaugeA)

  GaugeA\NeedleColor

EndMacro

Macro GetGaugeScaleFontHandle(GaugeA)

  GaugeA\ScaleFontHandle

EndMacro

Macro GetGaugeTextFontHandle(GaugeA)

  GaugeA\TextFontHandle

EndMacro

Macro GetGaugeSubTextFontHandle(GaugeA)

  GaugeA\SubTextFontHandle

EndMacro

Macro GetGaugeDrawingScale(GaugeA)

  GaugeA\DrawingScale

EndMacro

Macro GetGaugeLayerSize(GaugeA)

  GaugeA\LayerSize

EndMacro

Macro GetGaugeNeedleLength(GaugeA)

  GaugeA\NeedleLength

EndMacro

Macro GetGaugeNeedlePivotRadius(GaugeA)

  GaugeA\NeedlePivotRadius

EndMacro

Macro GetGaugeNeedleTipWidth(GaugeA)

  GaugeA\NeedleTipWidth

EndMacro

Macro GetGaugeNeedleCenWidth(GaugeA)

  GaugeA\NeedleCenWidth

EndMacro

Macro GetGaugeScaleLayer(GaugeA)

  GaugeA\ScaleLayer

EndMacro

Macro GetGaugeNeedleLayer(GaugeA)

  GaugeA\NeedleLayer

EndMacro

Macro GetGaugeComposedLayer(GaugeA)

  GaugeA\ComposedLayer

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs <<<<<

Macro SetGaugePosX(GaugeA, P_PosX)

  GetGaugePosX(GaugeA) = P_PosX

EndMacro

Macro SetGaugePosY(GaugeA, P_PosY)

  GetGaugePosY(GaugeA) = P_PosY

EndMacro

Macro SetGaugeSize(GaugeA, P_Size)

  GetGaugeSize(GaugeA) = P_Size

EndMacro

Macro SetGaugeCenter(GaugeA, P_Center)

  GetGaugeCenter(GaugeA) = P_Center

EndMacro

Macro SetGaugeScaleRadius(GaugeA, P_ScaleRadius)

  GetGaugeScaleRadius(GaugeA) = P_ScaleRadius

EndMacro

Macro SetGaugeMin(GaugeA, P_Min)

  GetGaugeMin(GaugeA) = P_Min

EndMacro

Macro SetGaugeMax(GaugeA, P_Max)

  GetGaugeMax(GaugeA) = P_Max

EndMacro

Macro SetGaugeBigStep(GaugeA, P_BigStep)

  GetGaugeBigStep(GaugeA) = P_BigStep

EndMacro

Macro SetGaugeSmallStep(GaugeA, P_SmallStep)

  GetGaugeSmallStep(GaugeA) = P_SmallStep

EndMacro

Macro SetGaugeSectorDegrees(GaugeA, P_SectorDegrees)

  GetGaugeSectorDegrees(GaugeA) = P_SectorDegrees

EndMacro

Macro SetGaugeValue(GaugeA, P_Value)

  GetGaugeValue(GaugeA) = P_Value

EndMacro

Macro SetGaugeText(GaugeA, P_Text)

  GetGaugeText(GaugeA) = P_Text

EndMacro

Macro SetGaugeSubText(GaugeA, P_SubText)

  GetGaugeSubText(GaugeA) = P_SubText

EndMacro

Macro SetGaugeGadgetID(GaugeA, P_GadgetID)

  GetGaugeGadgetID(GaugeA) = P_GadgetID

EndMacro

Macro SetGaugeGadgetHandle(GaugeA, P_GadgetHandle)

  GetGaugeGadgetHandle(GaugeA) = P_GadgetHandle

EndMacro

Macro SetGaugeBackGroundColor(GaugeA, P_BackGroundColor)

  GetGaugeBackGroundColor(GaugeA) = P_BackGroundColor

EndMacro

Macro SetGaugeScaleColor(GaugeA, P_ScaleColor)

  GetGaugeScaleColor(GaugeA) = P_ScaleColor

EndMacro

Macro SetGaugeScaleBackGroundColor(GaugeA, P_ScaleBackGroundColor)

  GetGaugeScaleBackGroundColor(GaugeA) = P_ScaleBackGroundColor

EndMacro

Macro SetGaugeTextColor(GaugeA, P_TextColor)

  GetGaugeTextColor(GaugeA) = P_TextColor

EndMacro

Macro SetGaugeSubTextColor(GaugeA, P_SubTextColor)

  GetGaugeSubTextColor(GaugeA) = P_SubTextColor

EndMacro

Macro SetGaugeNeedleColor(GaugeA, P_NeedleColor)

  GetGaugeNeedleColor(GaugeA) = P_NeedleColor

EndMacro

Macro SetGaugeScaleFontHandle(GaugeA, P_ScaleFontHandle)

  GetGaugeScaleFontHandle(GaugeA) = P_ScaleFontHandle

EndMacro

Macro SetGaugeTextFontHandle(GaugeA, P_TextFontHandle)

  GetGaugeTextFontHandle(GaugeA) = P_TextFontHandle

EndMacro

Macro SetGaugeSubTextFontHandle(GaugeA, P_SubTextFontHandle)

  GetGaugeSubTextFontHandle(GaugeA) = P_SubTextFontHandle

EndMacro

Macro SetGaugeDrawingScale(GaugeA, P_DrawingScale)

  GetGaugeDrawingScale(GaugeA) = P_DrawingScale

EndMacro

Macro SetGaugeLayerSize(GaugeA, P_LayerSize)

  GetGaugeLayerSize(GaugeA) = P_LayerSize

EndMacro

Macro SetGaugeNeedleLength(GaugeA, P_NeedleLength)

  GetGaugeNeedleLength(GaugeA) = P_NeedleLength

EndMacro

Macro SetGaugeNeedlePivotRadius(GaugeA, P_NeedlePivotRadius)

  GetGaugeNeedlePivotRadius(GaugeA) = P_NeedlePivotRadius

EndMacro

Macro SetGaugeNeedleTipWidth(GaugeA, P_NeedleTipWidth)

  GetGaugeNeedleTipWidth(GaugeA) = P_NeedleTipWidth

EndMacro

Macro SetGaugeNeedleCenWidth(GaugeA, P_NeedleCenWidth)

  GetGaugeNeedleCenWidth(GaugeA) = P_NeedleCenWidth

EndMacro

Macro SetGaugeScaleLayer(GaugeA, P_ScaleLayer)

  GetGaugeScaleLayer(GaugeA) = P_ScaleLayer

EndMacro

Macro SetGaugeNeedleLayer(GaugeA, P_NeedleLayer)

  GetGaugeNeedleLayer(GaugeA) = P_NeedleLayer

EndMacro

Macro SetGaugeComposedLayer(GaugeA, P_ComposedLayer)

  GetGaugeComposedLayer(GaugeA) = P_ComposedLayer

EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 00.009 secondes (49222.22 lignes/seconde) <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Reset <<<<<

Macro ResetGauge(GaugeA)
  
  SetGaugePosX(GaugeA, 0)
  SetGaugePosY(GaugeA, 0)
  SetGaugeSize(GaugeA, 0)
  SetGaugeScaleRadius(GaugeA, 0)
  SetGaugeMin(GaugeA, 0)
  SetGaugeMax(GaugeA, 0)
  SetGaugeBigStep(GaugeA, 0)
  SetGaugeSmallStep(GaugeA, 0)
  SetGaugeValue(GaugeA, 0)
  SetGaugeText(GaugeA, "")
  SetGaugeSubText(GaugeA, "")
  SetGaugeGadgetID(GaugeA, 0)
  SetGaugeGadgetHandle(GaugeA, 0)
  SetGaugeBackGroundColor(GaugeA, 0)
  SetGaugeScaleColor(GaugeA, 0)
  SetGaugeScaleBackGroundColor(GaugeA, 0)
  SetGaugeTextColor(GaugeA, 0)
  SetGaugeSubTextColor(GaugeA, 0)
  SetGaugeNeedleColor(GaugeA, 0)
  SetGaugeDrawingScale(GaugeA, 0)
  SetGaugeLayerSize(GaugeA, 0)
  SetGaugeNeedleLength(GaugeA, 0)
  SetGaugeNeedlePivotRadius(GaugeA, 0)
  SetGaugeNeedleTipWidth(GaugeA, 0)
  SetGaugeNeedleCenWidth(GaugeA, 0)
  
  If GetGaugeScaleFontHandle(GaugeA)
    FreeFont(GetGaugeScaleFontHandle(GaugeA))
    SetGaugeScaleFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeTextFontHandle(GaugeA)
    FreeFont(GetGaugeTextFontHandle(GaugeA))
    SetGaugeTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeSubTextFontHandle(GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(GaugeA))
    SetGaugeSubTextFontHandle(GaugeA, 0)
  EndIf
  
  If GetGaugeScaleLayer(GaugeA)
    FreeImage(GetGaugeScaleLayer(GaugeA))
    SetGaugeScaleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeNeedleLayer(GaugeA)
    FreeImage(GetGaugeNeedleLayer(GaugeA))
    SetGaugeNeedleLayer(GaugeA, 0)
  EndIf 
  
  If GetGaugeComposedLayer(GaugeA)
    FreeImage(GetGaugeComposedLayer(GaugeA))
    SetGaugeComposedLayer(GaugeA, 0)
  EndIf 
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Le Constructeur <<<<<

Procedure.i CreateNewGauge()

  *GaugeA.Gauge = AllocateMemory(SizeOf(Gauge))

  If *GaugeA = #Null
    MessageRequester("Fatal Error", "CreateNewGauge() - Impossible to Allocate Memory !")
    End
  EndIf

  ProcedureReturn *GaugeA
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Dessiner un texte centré en x, y <<<<<

Macro DrawTextCentered(x, y, Text, FrontColor, BackColor)
  
  DrawText(x - TextWidth(Text) >> 1, y - TextHeight("Wg") >> 1, Text, FrontColor, BackColor)
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type double <<<<<

Procedure.d MaxDouble(P_Number01.d, P_Number02.d)
  
  Biggest_Double.d = P_Number01
  
  If P_Number02 > Biggest_Double
    Biggest_Double = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Double
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Trouver la plus grande valeur de type long <<<<<

Procedure.l MaxLong(P_Number01.l, P_Number02.l)
  
  Biggest_Long.l = P_Number01
  
  If P_Number02 > Biggest_Long
    Biggest_Long = P_Number02
  EndIf
  
  ProcedureReturn Biggest_Long
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs spéciaux <<<<<

Macro SetGaugePositionSize(GaugeA, P_X, P_Y, P_Size)
  
  SetGaugePosX(GaugeA, P_X)
  SetGaugePosY(GaugeA, P_Y)
  SetGaugeSize(GaugeA, P_Size)
  
EndMacro 

Macro SetGaugeTextEx(GaugeA, Text, Color_RGBA)
  
  SetGaugeText(GaugeA, Text)
  SetGaugeTextColor(GaugeA, Color_RGBA)
  
EndMacro 

Macro SetGaugeSubTextEx(GaugeA, SubText, Color_RGBA)
  
  SetGaugeSubText(GaugeA, SubText)
  SetGaugeSubTextColor(GaugeA, Color_RGBA)
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeBackground <<<<<

Macro PaintGaugeBackground(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  Box(0, 0, GetGaugeLayerSize(GaugeA), GetGaugeLayerSize(GaugeA), GetGaugeBackGroundColor(GaugeA))
  
  ; DrawingMode(#PB_2DDrawing_AllChannels | #PB_2DDrawing_Outlined)
  ; Box(0, 0, GetGaugeSize(GaugeA), GetGaugeSize(GaugeA), RGBA(0, 0, 0, 32))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeScale <<<<<

Macro PaintGaugeScale(GaugeA)
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  
  wpx = GetGaugeLayerSize(GaugeA) / 33
  wpx2 = wpx / GetGaugeDrawingScale(GaugeA) * 3 - 1
  
  SmallStepDegrees.d = GetGaugeSmallStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  BigStepDegrees.d = GetGaugeBigStep(GaugeA) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx, GetGaugeScaleColor(GaugeA))
  Next
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  For I = 0 To GetGaugeSectorDegrees(GaugeA)
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + I)) * GetGaugeScaleRadius(GaugeA)
    Circle(x, y, wpx2, GetGaugeScaleBackGroundColor(GaugeA))
  Next
  
  dI.d = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA)
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx2)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - (wpx2 / 2))
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + SmallStepDegrees
  Wend
  
  dI = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ;?!
    x1 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    y1 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) - wpx)
    x2 = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    y2 = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx)
    LineXY(x1, y1, x2, y2, GetGaugeScaleColor(GaugeA))
    dI + BigStepDegrees
  Wend
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeScaleFontHandle(GaugeA)))
  
  dI = 0
  I = 0
  
  While dI <= GetGaugeSectorDegrees(GaugeA) + 1 ; not sure why that is needed
    
    Offset.w = MaxLong(3, Len(Str(GetGaugeMax(GaugeA) - I)))
    
    x = GetGaugeCenter(GaugeA) + Sin(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    y = GetGaugeCenter(GaugeA) + Cos(Radian(StartDegree + dI)) * (GetGaugeScaleRadius(GaugeA) + wpx * Offset)
    DrawTextCentered(x, y, Str(GetGaugeMax(GaugeA) - I), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
    dI + BigStepDegrees
    I + GetGaugeBigStep(GaugeA)
    
  Wend
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeDescription <<<<<

Macro PaintGaugeDescription(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
  DrawingFont(FontID(GetGaugeTextFontHandle(GaugeA)))
  
  x = GetGaugeCenter(GaugeA)
  y = GetGaugeDrawingScale(GaugeA) * 8 * GetGaugeSize(GaugeA) / 10
  
  DrawTextCentered(x, y, GetGaugeText(GaugeA), GetGaugeTextColor(GaugeA), RGBA(0, 0, 0, 0))
  y + TextHeight("Wg")
  
  DrawingFont(FontID(GetGaugeSubTextFontHandle(GaugeA)))
  DrawTextCentered(x, y, GetGaugeSubText(GaugeA), GetGaugeSubTextColor(GaugeA), RGBA(0, 0, 0, 0))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur PaintGaugeHand <<<<<

Macro PaintGaugeNeedle(GaugeA)
  
  DrawingMode(#PB_2DDrawing_AllChannels)
  
  HalfSize = GetGaugeLayerSize(GaugeA) >> 1
  
  StartDegree.i = ((360 - GetGaugeSectorDegrees(GaugeA)) >> 1)
  DirDegrees.d = StartDegree + (GetGaugeMax(GaugeA) - GetGaugeValue(GaugeA)) / GetGaugeMax(GaugeA) * GetGaugeSectorDegrees(GaugeA)
  
  SinAngle.d = Sin(Radian(-DirDegrees))
  CosAngle.d = Cos(Radian(-DirDegrees))
  
  x1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * CosAngle)
  y1 = HalfSize + (GetGaugeNeedleCenWidth(GaugeA) * SinAngle)
  
  x2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * CosAngle)
  y2 = HalfSize + (-GetGaugeNeedleCenWidth(GaugeA) * SinAngle)
  
  x3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y3 = HalfSize + (-GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * CosAngle - GetGaugeNeedleLength(GaugeA) * SinAngle)
  y4 = HalfSize + (GetGaugeNeedleTipWidth(GaugeA) * SinAngle + GetGaugeNeedleLength(GaugeA) * CosAngle)
  
  x5 = HalfSize + (-15 * SinAngle)
  y5 = HalfSize + (15 * CosAngle)
  
  LineXY(x1, y1, x2, y2, GetGaugeNeedleColor(GaugeA))
  LineXY(x2, y2, x3, y3, GetGaugeNeedleColor(GaugeA))
  LineXY(x3, y3, x4, y4, GetGaugeNeedleColor(GaugeA))
  LineXY(x4, y4, x1, y1, GetGaugeNeedleColor(GaugeA))
  
  FillArea(x5, y5, GetGaugeNeedleColor(GaugeA), GetGaugeNeedleColor(GaugeA))
  
  Circle(HalfSize, HalfSize, GetGaugeNeedlePivotRadius(GaugeA), GetGaugeNeedleColor(GaugeA))
  
EndMacro

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur LoadGaugeFont <<<<<

Procedure Private_LoadGaugeFont(*GaugeA.Gauge, FontName.s)
  
  If GetGaugeScaleFontHandle(*GaugeA)
    FreeFont(GetGaugeScaleFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeTextFontHandle(*GaugeA)
    FreeFont(GetGaugeTextFontHandle(*GaugeA))
  EndIf
  
  If GetGaugeSubTextFontHandle(*GaugeA)
    FreeFont(GetGaugeSubTextFontHandle(*GaugeA))
  EndIf
  
  SetGaugeScaleFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, GetGaugeDrawingScale(*GaugeA) * MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  SetGaugeTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, GetGaugeDrawingScale(*GaugeA) * MaxDouble(9, 0.056 * GetGaugeSize(*GaugeA)), #PB_Font_Bold))
  SetGaugeSubTextFontHandle(*GaugeA, LoadFont(#PB_Any, FontName, GetGaugeDrawingScale(*GaugeA) * MaxDouble(8, 0.04 * GetGaugeSize(*GaugeA))))
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RepaintGaugeLayer <<<<<

Procedure Private_RepaintGaugeLayer(*GaugeA.Gauge, Needle.b, Scale.b)
  
  If Needle = #True
    
    If GetGaugeNeedleLayer(*GaugeA)
      FreeImage(GetGaugeNeedleLayer(*GaugeA))
    EndIf 
    
    SetGaugeNeedleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeNeedleLayer(*GaugeA)))
      PaintGaugeNeedle(*GaugeA)
      StopDrawing()
    EndIf 
    
    ResizeImage(GetGaugeNeedleLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf
  
  If Scale = #True 
    
    If GetGaugeScaleLayer(*GaugeA)
      FreeImage(GetGaugeScaleLayer(*GaugeA))
    EndIf 
    
    SetGaugeScaleLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeLayerSize(*GaugeA), GetGaugeLayerSize(*GaugeA), 32 | #PB_Image_Transparent))
    
    If StartDrawing(ImageOutput(GetGaugeScaleLayer(*GaugeA)))
      PaintGaugeBackground(*GaugeA)
      PaintGaugeScale(*GaugeA)
      PaintGaugeDescription(*GaugeA)
      StopDrawing()
    EndIf 
    
    ResizeImage(GetGaugeScaleLayer(*GaugeA), GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA))
    
  EndIf
  
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur RefreshGaugeGadget <<<<<

Procedure Private_RefreshGaugeGadget(*GaugeA.Gauge)
  
  If GetGaugeComposedLayer(*GaugeA)
    FreeImage(GetGaugeComposedLayer(*GaugeA))
  EndIf
  
  SetGaugeComposedLayer(*GaugeA, CreateImage(#PB_Any, GetGaugeSize(*GaugeA), GetGaugeSize(*GaugeA), 32 | #PB_Image_Transparent))
  
  If StartDrawing(ImageOutput(GetGaugeComposedLayer(*GaugeA)))
    
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    DrawImage(ImageID(GetGaugeScaleLayer(*GaugeA)), 0, 0)
    DrawImage(ImageID(GetGaugeNeedleLayer(*GaugeA)), 0, 0)
    StopDrawing()
    
  EndIf 
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur GaugeGadget <<<<<

Procedure GaugeGadget(GadgetID.l, x.w, y.w, Size.w, FontName.s = "", Options.l = 0)
  
  *GaugeA.Gauge = CreateNewGauge()
  
  If *GaugeA <> #Null
    
    GadgetHandle = ImageGadget(GadgetID, x, y, Size, Size, 0, Options)
    
    If GadgetID = #PB_Any
      GadgetID = GadgetHandle
    EndIf

    SetGaugePositionSize(*GaugeA, x, y, Size)
    SetGaugeDrawingScale(*GaugeA, 4)
    
    SetGaugeCenter(*GaugeA, (GetGaugeDrawingScale(*GaugeA) * Size) >> 1)
    SetGaugeScaleRadius(*GaugeA, GetGaugeDrawingScale(*GaugeA) * Size * 3 / 10)
    
    SetGaugeLayerSize(*GaugeA, Size * GetGaugeDrawingScale(*GaugeA))
    
    SetGaugeNeedleLength(*GaugeA, (1 + GetGaugeScaleRadius(*GaugeA)))
    SetGaugeNeedlePivotRadius(*GaugeA, GetGaugeNeedleLength(*GaugeA) / 10)
    SetGaugeNeedleTipWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 7)
    SetGaugeNeedleCenWidth(*GaugeA, GetGaugeNeedlePivotRadius(*GaugeA) / 2)
    
    If FontName <> ""
      Private_LoadGaugeFont(*GaugeA, FontName)
    EndIf 
    
    SetGaugeSectorDegrees(*GaugeA, 270)
    
    SetGaugeBackGroundColor(*GaugeA, RGBA(0, 0, 0, 0))
    SetGaugeScaleColor(*GaugeA, RGBA(62, 62, 128, 192))
    SetGaugeScaleBackGroundColor(*GaugeA, RGBA(64, 64, 64, 32))
    SetGaugeTextColor(*GaugeA, RGBA(0, 0, 0, 255))
    SetGaugeSubTextColor(*GaugeA, RGBA(92, 92, 92, 255))
    SetGaugeNeedleColor(*GaugeA, RGBA(255, 000, 000, 255))
    SetGaugeMin(*GaugeA, 0)
    SetGaugeMax(*GaugeA, 100)
    SetGaugeBigStep(*GaugeA, 10)
    SetGaugeSmallStep(*GaugeA, 5)
    SetGaugeValue(*GaugeA, 0)
    SetGaugeText(*GaugeA, "Value")
    SetGaugeSubText(*GaugeA, "in units")
    
    Private_RepaintGaugeLayer(*GaugeA, #True, #True)
    Private_RefreshGaugeGadget(*GaugeA)
    
    SetGadgetData(GadgetID, *GaugeA)
    
  EndIf
  
  ProcedureReturn GadgetID
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur SetGaugeGadgetValue <<<<<

Procedure SetGaugeGadgetValue(GadgetID, P_Value.l)
  
  If IsGadget(GadgetID)
    
    *GaugeA.Gauge = GetGadgetData(GadgetID)
    
    If *GaugeA <> #Null
      
      SetGaugeValue(*GaugeA, P_Value)
      Private_RepaintGaugeLayer(*GaugeA, #True, #False)
      Private_RefreshGaugeGadget(*GaugeA)
      
      SetGadgetState(GadgetID, ImageID(GetGaugeComposedLayer(*GaugeA)))
      
    EndIf
    
  EndIf
  
EndProcedure

Procedure SetGaugeGadgetSectorDegrees(GadgetID, P_SectorDegrees.l)
  
  If IsGadget(GadgetID)
    
    *GaugeA.Gauge = GetGadgetData(GadgetID)
    
    If *GaugeA <> #Null
      
      SetGaugeSectorDegrees(*GaugeA, P_SectorDegrees)
      Private_RepaintGaugeLayer(*GaugeA, #True, #True)
      Private_RefreshGaugeGadget(*GaugeA)
      SetGadgetState(GadgetID, ImageID(GetGaugeComposedLayer(*GaugeA)))
      
    EndIf
    
  EndIf
  
EndProcedure

Procedure SetGaugeGadgetMinMaxSteps(GadgetID, P_Min.l, P_Max.l, P_BigStep.l, P_SmallStep.l)
  
  If IsGadget(GadgetID)
    
    *GaugeA.Gauge = GetGadgetData(GadgetID)
    
    If *GaugeA <> #Null
      
      SetGaugeMin(*GaugeA, P_Min)
      SetGaugeMax(*GaugeA, P_Max)
      SetGaugeBigStep(*GaugeA, P_BigStep)
      SetGaugeSmallStep(*GaugeA, P_SmallStep)
      Private_RepaintGaugeLayer(*GaugeA, #False, #True)
      Private_RefreshGaugeGadget(*GaugeA)
      SetGadgetState(GadgetID, ImageID(GetGaugeComposedLayer(*GaugeA)))
      
    EndIf
    
  EndIf
  
EndProcedure

Procedure SetGaugeGadgetDescription(GadgetID, P_Text.s, P_SubText.s)
  
  If IsGadget(GadgetID)
    
    *GaugeA.Gauge = GetGadgetData(GadgetID)
    
    If *GaugeA <> #Null
      
      SetGaugeText(*GaugeA, P_Text)
      SetGaugeSubText(*GaugeA, P_SubText)
      Private_RepaintGaugeLayer(*GaugeA, #False, #True)
      Private_RefreshGaugeGadget(*GaugeA)
      SetGadgetState(GadgetID, ImageID(GetGaugeComposedLayer(*GaugeA)))
      
    EndIf
    
  EndIf
  
EndProcedure

Procedure FreeGaugeGadget(GadgetID)
  
  If IsGadget(GadgetID)
    
    *GaugeA.Gauge = GetGadgetData(GadgetID)
    
    If *GaugeA <> #Null
      ResetGauge(*GaugeA)
      FreeMemory(*GaugeA)
      FreeGadget(GadgetID)
    EndIf
    
  EndIf
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<< 
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<< 
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<< 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

#Size = 200

#W = 2 * #Size + 145
#H = 2 * #Size + 25

CompilerSelect #PB_Compiler_OS
    
  CompilerCase #PB_OS_Linux
    FontName.s = "Mint Spirit"
    
  CompilerCase #PB_OS_Windows
    FontName.s = "Tahoma"

  CompilerCase #PB_OS_MacOS
    FontName.s = "Arial"    

CompilerEndSelect

If OpenWindow(0, 0, 0, #W, #H, "Gauge Gadget Demo", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

  TrackBarGadget(0, 5, 5, 20, #Size, 0, 3600, #PB_TrackBar_Vertical)
  TrackBarGadget(1, 30, 5, 20, #Size, 1, 360, #PB_TrackBar_Vertical)  
  SetGadgetState(0, 0)
  SetGadgetState(1, 270)
  
  GaugeGadget(3, 55, 5, #Size, FontName, 1)
  SetGaugeGadgetMinMaxSteps(3, 0, 3600, 300, 150)
  SetGaugeGadgetDescription(3, "Pressure", "in kPa")

  TrackBarGadget(4, 85 + #Size, 5, 20, #Size, 0, 200, #PB_TrackBar_Vertical)
  TrackBarGadget(5, 110 + #Size, 5, 20, #Size, 1, 360, #PB_TrackBar_Vertical)
  SetGadgetState(4, 0)
  SetGadgetState(5, 250)
  
  GaugeGadget(6, 135 + #Size, 5, #Size, FontName, 1)
  SetGaugeGadgetMinMaxSteps(6, 0, 200, 20, 5)
  SetGaugeGadgetDescription(6, "Temperature", "in K")
  SetGaugeGadgetSectorDegrees(6, 250)

  TrackBarGadget(7, 5 , 15 + #Size, 20, #Size, 0, 100, #PB_TrackBar_Vertical)
  TrackBarGadget(8, 30, 15 + #Size, 20, #Size, 1, 360, #PB_TrackBar_Vertical)
  SetGadgetState(7, 0)
  SetGadgetState(8, 270)
  
  GaugeGadget(9, 55, 15 + #Size, #Size, FontName, 1)
  SetGaugeGadgetMinMaxSteps(9, 0, 100, 10, 5)
  SetGaugeGadgetDescription(9, "Humidity", "in %")
  
  TrackBarGadget(10, 85 + #Size, 15 + #Size, 20, #Size, 0, 50, #PB_TrackBar_Vertical)
  TrackBarGadget(11, 110 + #Size, 15 + #Size, 20, #Size, 1, 360, #PB_TrackBar_Vertical)
  SetGadgetState(10, 0)
  SetGadgetState(11, 250)
  
  GaugeGadget(12, 135 + #Size, 15 + #Size, #Size, FontName, 1)
  SetGaugeGadgetMinMaxSteps(12, 0, 50, 5, 1)
  SetGaugeGadgetDescription(12, "Density", "kg/m³")
  
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_Gadget 
        
        Select EventGadget()
            
          Case 0 ; Change value
            SetGaugeGadgetValue(3, GetGadgetState(0))
            
          Case 1 ; Change size in degrees
            SetGaugeGadgetSectorDegrees(3, GetGadgetState(1))
            
          Case 4 ; Change value
            SetGaugeGadgetValue(6, GetGadgetState(4))
            
          Case 5 ; Change size in degrees
            SetGaugeGadgetSectorDegrees(6, GetGadgetState(5))
            
          Case 7 ; Change value
            SetGaugeGadgetValue(9, GetGadgetState(7))
            
          Case 8 ; Change size in degrees
            SetGaugeGadgetSectorDegrees(9, GetGadgetState(8))
            
          Case 10 ; Change value
            SetGaugeGadgetValue(12, GetGadgetState(10))
            
          Case 11 ; Change size in degrees
            SetGaugeGadgetSectorDegrees(12, GetGadgetState(11)) 
            
        EndSelect
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
    
  ForEver
  
  FreeGaugeGadget(3)
  FreeGaugeGadget(6)
  FreeGaugeGadget(9)
  FreeGaugeGadget(12)

EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<

Re: Gauge display

Posted: Sat May 12, 2012 1:26 pm
by dige
Pretty cool - I love it! Thx Guimauve!!

Re: Gauge display

Posted: Sat May 12, 2012 7:36 pm
by jamirokwai
Hey Guimauve,

thanks for sharing

Just add this in line 1026 / the example ...

Code: Select all

  CompilerCase #PB_OS_MacOS
    FontName.s = "Arial"    
to make it work on Mac OS X :-)

Re: Gauge display

Posted: Sun May 13, 2012 1:30 am
by Guimauve
jamirokwai wrote:Hey Guimauve,

thanks for sharing

Just add this in line 1026 / the example ...

Code: Select all

  CompilerCase #PB_OS_MacOS
    FontName.s = "Arial"    
to make it work on Mac OS X :-)
Done. And sorry about that.

By the way I think the Default font selection should be hard coded inside the GaugeGadget() command then a specific command to change the font should be added. Maybe for the next update.

Best regards
Guimauve

Re: Gauge display

Posted: Mon May 14, 2012 12:34 pm
by RichardL
Hi,
I tried these gauges out and they are certainly good looking items; just the thing to improve the looks of an application I'm working on. However I was alarmed to see just how processor intensive they are; way over the top for a practical instrumentation job, clocking about 24% on a fairly well endowed four core machine when changing just one value.

Putting this in context, my application, a radio receiver back-end, is importing stereo sound channels, carrying out Fourier transforms, filtering functions, inverse FFT, demodulation functions, gain control management, running a spectrum display (about 16 refreshes a second) and an oscilloscope waveform display (ditto), recording to disk, playing out real time voice via the sound card, managing USB control functions and providing a user interface... for a total CPU loading of about 7%.

I would dearly like to put one or two of these gauges in the corner of my display but think they would break the CPU budget, so here is a challenge. At a refresh rate of 10 a second get the CPU loading down to a percent or two. Any takers? :D

(Reducing the gauge size with '#Size=100' helps a bit, and is closer to my size requirement.)

RichardL

Re: Gauge display

Posted: Mon May 14, 2012 2:51 pm
by Guimauve
Hello everyone,

The only way to reduce the CPU workload is to avoid the use of large (4 times) size drawing and image resize. But doing this will make the Needle and the Scale with bad looking because the PureBasic drawing command has not anti-aliasing capabilities. If you wish I can add fast and horrible looking mode to this gadget so for those who the speed is more important than the graphics smooth rendering.

Best regards
Guimauve

Re: Gauge display

Posted: Mon May 14, 2012 3:54 pm
by Tenaja
Another option would be to precalculate and store the graphics so you don't have to do it on the fly. Sure, much more memory intensive, but all of the heavy CPU work would be done at creation.

BTW, I like your use of Macros. I just don't understand why somebody would create a one-line procedure! (Except for the ctrl-double-click benefit of reading the proc.)