Simple NumGadget (Example)

Share your advanced PureBasic knowledge/code with the community.
User avatar
mk-soft
Always Here
Always Here
Posts: 6245
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Simple NumGadget (Example)

Post by mk-soft »

Here is a small example how to create a simple small input gadget with the CanvasGadget.

Module NumGadget

Update v1.10.0
- Optimized

Code: Select all

;-TOP

; Comment : Module Simple NumGadget
; Author  : mk-soft
; Version : v1.10.0
; Update  : 06.01.2020

DeclareModule MyGadget
  
  Declare NumGadget(Gadget, x, y, Width, Height, Number.s, Point.s = ".", Sufix.s = "")
  Declare FreeNumGadget(Gadget)
  
  Declare SetNumGadget(Gadget, Number.s)
  Declare.s GetNumGadget(Gadget)
  
  Declare SetNumGadgetFont(Gadget, FontID)
  Declare GetNumGadgetFont(Gadget)
  
  Declare SetNumGadgetColor(Gadget, ColorType, Color)
  Declare GetNumGadgetColor(Gadget, ColorType)
  
EndDeclareModule

Module MyGadget
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      #PB_Shortcut_Enter = 13
    CompilerCase #PB_OS_Linux
      #PB_Shortcut_Enter = 65421
    CompilerCase #PB_OS_MacOS
      #PB_Shortcut_Enter = 3
  CompilerEndSelect
  
  Structure udtNumGadgetData
    Gadget.i
    x.i
    y.i
    Width.i
    Height.i
    Number.s
    Point.s
    Sufix.s
    FrontColor.i
    BackColor.i
    LineColor.i
    FontID.i
    IsFocus.i
    IsEdit.i
    Edit.s
  EndStructure
  
  Global NewMap NumGadgetData.udtNumGadgetData()
  
  ; ----
  
  Procedure DrawNumGadget(*this.udtNumGadgetData)
    Protected text.s, text_width.i, text_height
    With *this
      If StartDrawing(CanvasOutput(\Gadget))
        If \FontID
          DrawingFont(\FontID)
        EndIf
        Box(0, 0, \Width, \Height, \BackColor)
        If \IsFocus
          Box(0, 0, \Width, \Height, \LineColor)
          Box(2, 2, \Width - 4, \Height- 4, \BackColor)
        Else
          Box(0, 0, \Width, \Height, #Gray)
          Box(1, 1, \Width - 2, \Height- 2, \BackColor)
        EndIf
        If \IsEdit
          text = \Edit + "_"
        Else
          text = \Number
        EndIf
        text + \Sufix
        DrawingMode(#PB_2DDrawing_Default)
        text_width = TextWidth(text)
        text_height = TextHeight(text)
        DrawText(\Width - text_width - 4, \Height / 2 - text_height / 2, text, \FrontColor, \BackColor)
        StopDrawing()
      EndIf
    EndWith
  EndProcedure
  
  Procedure DoNumGadgetEvent()
    Protected *this.udtNumGadgetData = GetGadgetData(EventGadget())
    Protected key.i, len
    With *this
      If *this
        Select EventType()
          Case #PB_EventType_Focus
            \IsFocus = #True
            DrawNumGadget(*this)
            
          Case #PB_EventType_LostFocus
            \IsFocus = #False
            If \IsEdit
              \IsEdit = #False
              \Number = \Edit
              PostEvent(#PB_Event_Gadget, GetActiveWindow(), \Gadget, #PB_EventType_Change)
            EndIf
            DrawNumGadget(*this)
            
          Case #PB_EventType_Input
            key = GetGadgetAttribute(\Gadget, #PB_Canvas_Input)
            Select key
              Case '-' , '+'
                If Not \IsEdit
                  \Edit = Chr(key)
                  \IsEdit = #True
                  DrawNumGadget(*this)
                ElseIf \IsEdit And Len(\Edit) = 0
                  \Edit = Chr(key)
                  DrawNumGadget(*this)
                EndIf
                
              Case '0' To '9'
                If Not \IsEdit
                  \Edit = Chr(key)
                  \IsEdit = #True
                  DrawNumGadget(*this)
                Else
                  \Edit + Chr(key)
                  DrawNumGadget(*this)
                EndIf
                
              Case '.', ','
                If \IsEdit And Not FindString(\Edit, \Point)
                  \Edit + \Point
                  DrawNumGadget(*this)
                EndIf
                
            EndSelect
            
          Case #PB_EventType_KeyDown
            key = GetGadgetAttribute(\Gadget, #PB_Canvas_Key)
            Select key
              Case #PB_Shortcut_Right, #PB_Shortcut_Left
                If Not \IsEdit
                  \Edit = \Number
                  \IsEdit = #True
                  DrawNumGadget(*this)
                EndIf
                
              Case #PB_Shortcut_Back
                If Not \IsEdit
                  \Edit = \Number
                  \IsEdit = #True
                EndIf
                len = Len(\Edit)
                If len
                  \Edit = Left(\Edit, len - 1)
                  DrawNumGadget(*this)
                EndIf
                
              Case #PB_Shortcut_Tab, #PB_Shortcut_Return, #PB_Shortcut_Enter
                If \IsEdit
                  \IsEdit = #False
                  \Number = \Edit
                  DrawNumGadget(*this)
                  PostEvent(#PB_Event_Gadget, GetActiveWindow(), \Gadget, #PB_EventType_Change)
                EndIf
                PostEvent(#PB_Event_Gadget, GetActiveWindow(), \Gadget, #PB_EventType_ReturnKey)
                
                
              Case #PB_Shortcut_Escape
                If \IsEdit
                  \IsEdit = #False
                  DrawNumGadget(*this)
                EndIf
                
            EndSelect
            
          Case #PB_EventType_Resize
            \x = GadgetX(\Gadget)
            \y = GadgetY(\Gadget)
            \Width = GadgetWidth(\Gadget)
            \Height = GadgetHeight(\Gadget)
            DrawNumGadget(*this)
          
        EndSelect
        
      EndIf
    EndWith
  EndProcedure
  
  ;-- Public
  
  Procedure SetNumGadget(Gadget, Number.s)
    If FindMapElement(NumGadgetData(), Str(Gadget))
      NumGadgetData()\Number = Number
      DrawNumGadget(@NumGadgetData())
    EndIf
  EndProcedure
  
  Procedure.s GetNumGadget(Gadget)
    If FindMapElement(NumGadgetData(), Str(Gadget))
      ProcedureReturn NumGadgetData()\Number
    Else
      ProcedureReturn ""
    EndIf
  EndProcedure
  
  ; ----
  
  Procedure SetNumGadgetFont(Gadget, FontID)
    If FindMapElement(NumGadgetData(), Str(Gadget))
      NumGadgetData()\FontID = FontID
      DrawNumGadget(@NumGadgetData())
    EndIf
  EndProcedure
  
  Procedure GetNumGadgetFont(Gadget)
    If FindMapElement(NumGadgetData(), Str(Gadget))
      ProcedureReturn NumGadgetData()\FontID
    Else
      ProcedureReturn 0
    EndIf
  EndProcedure
  
  ; ----
  
  Procedure SetNumGadgetColor(Gadget, ColorType, Color)
    If FindMapElement(NumGadgetData(), Str(Gadget))
      Select ColorType
        Case #PB_Gadget_FrontColor
          NumGadgetData()\FrontColor = Color
        Case #PB_Gadget_BackColor
          NumGadgetData()\BackColor = Color
        Case #PB_Gadget_LineColor
          NumGadgetData()\LineColor = Color
      EndSelect    
      DrawNumGadget(@NumGadgetData())
    EndIf
  EndProcedure
  
  Procedure GetNumGadgetColor(Gadget, ColorType)
    If FindMapElement(NumGadgetData(), Str(Gadget))
      Select ColorType
        Case #PB_Gadget_FrontColor
          ProcedureReturn NumGadgetData()\FrontColor
        Case #PB_Gadget_BackColor
          ProcedureReturn NumGadgetData()\BackColor
        Case #PB_Gadget_LineColor
          ProcedureReturn NumGadgetData()\LineColor
      EndSelect    
    EndIf
  EndProcedure
  
  ; ---- 
  
  Procedure NumGadget(Gadget, x, y, Width, Height, Number.s, Point.s = ".", Sufix.s = "")
    Protected id, key.s, *this.udtNumGadgetData
    id = CanvasGadget(Gadget, x, y, Width, Height, #PB_Canvas_Keyboard)
    If Not id
      ProcedureReturn 0
    EndIf
    
    If Gadget = #PB_Any
      Gadget = id
    EndIf
    
    key = Str(Gadget)
    If Not FindMapElement(NumGadgetData(), key)
      AddMapElement(NumGadgetData(), key)
    EndIf
    
    *this = @NumGadgetData()
    With *this
      \Gadget = Gadget
      \x = x
      \y = y
      \Width = Width
      \Height = Height
      \Number = Number
      \Point = Point
      \Sufix = Sufix
      \FrontColor = #Blue
      \BackColor = #White
      \LineColor = #Blue
      \FontID = 0
      \IsEdit = #False
      SetGadgetData(Gadget, *this)
      DrawNumGadget(*this)
      BindGadgetEvent(Gadget, @DoNumGadgetEvent())
    EndWith
    
    ProcedureReturn id
    
  EndProcedure
  
  Procedure FreeNumGadget(Gadget)
    If FindMapElement(NumGadgetData(), Str(Gadget))
      UnbindGadgetEvent(Gadget, @DoNumGadgetEvent())
      DeleteMapElement(NumGadgetData())
      FreeGadget(Gadget)
    EndIf
  EndProcedure
  
EndModule

; ****

CompilerIf #PB_Compiler_IsMainFile
  
  LoadFont(0, "Courier New", 14, #PB_Font_Italic)
  
  Procedure Main()
    
    If OpenWindow(0, 100, 100, 300, 200, "MyGadget", #PB_Window_SystemMenu)
      MyGadget::NumGadget(0, 10, 10, 280, 30, "", ",", " €")
      MyGadget::SetNumGadget(0, "10,5")
      MyGadget::SetNumGadgetColor(0, #PB_Gadget_LineColor, #Red)
      MyGadget::SetNumGadgetFont(0, FontID(0))
      
      
      MyGadget::NumGadget(1, 10, 50, 280, 30, "", ".", " kg")
      MyGadget::SetNumGadget(1, "0.3")
      MyGadget::SetNumGadgetColor(1, #PB_Gadget_BackColor, #Green)
      
      MyGadget::NumGadget(2, 10, 90, 280, 30, "", "", " km/h")
      MyGadget::SetNumGadget(2, "120")
      MyGadget::SetNumGadgetColor(2, #PB_Gadget_FrontColor, #Red)
      MyGadget::SetNumGadgetColor(2, #PB_Gadget_BackColor, #Yellow)
      
      SetActiveGadget(0)
      
      Repeat
        Select WaitWindowEvent()
          Case #PB_Event_CloseWindow
            Break
          Case #PB_Event_Gadget
            Select EventGadget()
              Case 0
                If EventType() = #PB_EventType_Change
                  Debug "NumGadget 0 = " + MyGadget::GetNumGadget(0)
                EndIf
                If EventType() = #PB_EventType_ReturnKey
                  SetActiveGadget(1)
                EndIf
              Case 1
                If EventType() = #PB_EventType_Change
                  Debug "NumGadget 1 = " + MyGadget::GetNumGadget(1)
                EndIf
                If EventType() = #PB_EventType_ReturnKey
                  SetActiveGadget(2)
                EndIf
                
              Case 2
                If EventType() = #PB_EventType_Change
                  Debug "NumGadget 2 = " + MyGadget::GetNumGadget(2)
                EndIf
                If EventType() = #PB_EventType_ReturnKey
                  SetActiveGadget(0)
                EndIf
              
            EndSelect
            
        EndSelect
      ForEver
      
    EndIf
    
  EndProcedure : Main()
  
CompilerEndIf
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Simple NumGadget (Example)

Post by Kwai chang caine »

Works fine here :D
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply