Seite 1 von 1

ProgressBarEx - Progressbar via ImageGadget

Verfasst: 07.07.2011 11:46
von Morty
Mahlzeit :D

So, da will ich auch mal meinen Beitrag zur Gesellschaft leisten.
Für ein Projekt wollte ich mal fix ein eigenes ProgressBarGadget machen, welches besser
meinen Vorstellungen entspricht.
Nebenbei fällt mir noch auf, dass es CrossPlatform sein sollte (kann's nicht testen).

Vorteile / Warum:
- Text auf dem Gadget
- Text - Handling (Align / Font / Color)
- Farbverlauf im Balken (optional)
- Rahmenfarbe (optional)
- Hintergrundfarbe

Unterschied:
Der Unterschied zu einem PB - ProgressBarGadget liegt darin, dass meines mit Prozenten arbeitet.
Das liegt einfach daran, dass ich so arbeite 8)

Okay, hier nun der Code ... inklusive Beispiel:

Code: Alles auswählen

#PB_Text_Left = 0     ;Gibt's in PB nicht

Structure __my_progressbar_ex_drawing_structure__
  bordercolor.i       ; -1 -> kein Rand
  bgcolor.i
  color1.i  
  color2.i            ; -1 -> kein Farbverlauf -> ansonsten Gradiant
EndStructure

Structure __my_progressbar_ex_text_structure__
  text.s
  color.i
  align.i     
  fontid.i
EndStructure

Structure __my_progressbar_ex_structure__
  gadgetid.i
  imageid.i
  prozentd.d
  text.__my_progressbar_ex_text_structure__
  drawing.__my_progressbar_ex_drawing_structure__
EndStructure
Global NewList ProgressBarEx.__my_progressbar_ex_structure__()

Procedure _ProgressBarEx_Select(gadid.i)
  tmp_return_value.i=#False
  ForEach ProgressBarEx()
    If ProgressBarEx()\gadgetid=gadid.i
      tmp_return_value.i=#True
      Break
    EndIf
  Next
  
  ProcedureReturn tmp_return_value.i
EndProcedure

Procedure ProgressBarEx_Render(gadid.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
  
  Protected boxpart.d, textx.i, texty.i, iw.i, ih.i
  ;GrößenCheck
  If GadgetWidth(gadid.i) <> ImageWidth(ProgressBarEx()\imageid) Or GadgetHeight(gadid.i) <> ImageHeight(ProgressBarEx()\imageid)
    ResizeImage(ProgressBarEx()\imageid,GadgetWidth(gadid.i), GadgetHeight(gadid.i))
  EndIf
  ;Rendering
  If StartDrawing(ImageOutput(ProgressBarEx()\imageid))
    iw.i=ImageWidth(ProgressBarEx()\imageid)
    ih.i=ImageHeight(ProgressBarEx()\imageid)
    ;Hintergrund
    Box(0,0,iw,ih,ProgressBarEx()\drawing\bgcolor)
    ;Balken
    boxpart.d = (ProgressBarEx()\prozentd * iw.i) / 100
    If ProgressBarEx()\drawing\color2 = -1
      Box(0,0,Int(boxpart.d),ih,ProgressBarEx()\drawing\color1)
    Else
      DrawingMode(#PB_2DDrawing_Gradient)
      FrontColor(ProgressBarEx()\drawing\color2)
      BackColor(ProgressBarEx()\drawing\color1)
      LinearGradient(0,0,0,ih)
      Box(0,0,Int(boxpart.d),ih)
    EndIf
    ;Text
    If IsFont(ProgressBarEx()\text\fontid)
      DrawingFont(FontID(ProgressBarEx()\text\fontid))
    EndIf
    texty.i= ((ih.i / 2) - (TextHeight(ProgressBarEx()\text\text) / 2))
    If ProgressBarEx()\text\align = #PB_Text_Left
      textx.i = 3
    EndIf
    If ProgressBarEx()\text\align = #PB_Text_Center
      textx.i = ((iw.i / 2) - (TextWidth(ProgressBarEx()\text\text) / 2))
    EndIf
    If ProgressBarEx()\text\align = #PB_Text_Right
      textx.i = iw.i - 3 - TextWidth(ProgressBarEx()\text\text)
    EndIf
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(textx.i, texty.i, ProgressBarEx()\text\text, ProgressBarEx()\text\color)
    ;Rahmen
    If ProgressBarEx()\drawing\bordercolor>-1
      DrawingMode(#PB_2DDrawing_Default)
      LineXY(0,0,iw-1,0,ProgressBarEx()\drawing\bordercolor)
      LineXY(iw-1,0,iw-1,ih,ProgressBarEx()\drawing\bordercolor)
      LineXY(iw-1,ih-1,0,ih-1,ProgressBarEx()\drawing\bordercolor)
      LineXY(0,ih-1,0,0,ProgressBarEx()\drawing\bordercolor)
    EndIf
    StopDrawing()
    SetGadgetState(ProgressBarEx()\gadgetid, ImageID(ProgressBarEx()\imageid))
  EndIf
EndProcedure

Procedure ProgressBarEx_Create(gadid.i, x.i, y.i, w.i, h.i)
  AddElement(ProgressBarEx())
    ProgressBarEx()\gadgetid=gadid.i
    ProgressBarEx()\imageid=CreateImage(#PB_Any, w.i, h.i)
    
    ;Defaults setzen
    ProgressBarEx()\prozentd = 0.0
    
    ProgressBarEx()\text\align = #PB_Text_Left
    ProgressBarEx()\text\color = 0
    ProgressBarEx()\drawing\bgcolor = RGB(255,255,255)
    ProgressBarEx()\drawing\bordercolor = 0
    ProgressBarEx()\drawing\color1 = RGB(0, 255, 0)
    ProgressBarEx()\drawing\color2 = RGB(0, 200, 0)
    
    
    If gadid.i=#PB_Any  
      ProgressBarEx()\gadgetid=ImageGadget(#PB_Any,x,y,w,h,ImageID(ProgressBarEx()\imageid))
    Else
      ImageGadget(ProgressBarEx()\gadgetid,x,y,w,h,ImageID(ProgressBarEx()\imageid))
    EndIf
    
    ProgressBarEx_Render(ProgressBarEx()\gadgetid)
    ProcedureReturn ProgressBarEx()\gadgetid
EndProcedure

Procedure ProgressBarEx_SetState(gadid.i, pbg_state.d = -1.0, pgb_text.s="")
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf

  If pbg_state.d > -1.0
    ProgressBarEx()\prozentd = pbg_state.d
  EndIf
  If pgb_text.s<>""
    ProgressBarEx()\text\text = pgb_text.s
  EndIf
  ProgressBarEx_Render(gadid.i)
  
EndProcedure

Procedure ProgressBarEx_SetTextAlign(gadid.i, pgb_textalign.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
  
  ProgressBarEx()\text\align = pgb_textalign.i
  ProgressBarEx_Render(gadid.i)
  
EndProcedure

Procedure ProgressBarEx_SetTextFont(gadid.i, pgb_font.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf

  ProgressBarEx()\text\fontid = pgb_font.i
  ProgressBarEx_Render(gadid.i)

EndProcedure

Procedure ProgressBarEx_SetTextColor(gadid.i, pgb_textcolor.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf

  ProgressBarEx()\text\color = pgb_textcolor.i
  ProgressBarEx_Render(gadid.i)

EndProcedure

Procedure ProgressBarEx_SetBGColor(gadid.i, pgb_bgcolor.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf

  ProgressBarEx()\drawing\bgcolor = pgb_bgcolor.i
  ProgressBarEx_Render(gadid.i)

EndProcedure

Procedure ProgressBarEx_SetColors(gadid.i, pgb_color1.i, pgb_color2.i = -2)

  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf

  ProgressBarEx()\drawing\color1 = pgb_color1.i
  If pgb_color2.i>-2
    ProgressBarEx()\drawing\color2 = pgb_color2.i
  EndIf
  
  ProgressBarEx_Render(gadid.i)

EndProcedure

Procedure ProgressBarEx_SetBorderColor(gadid.i, pgb_bcolor.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
  ;BorderColor = -1     --> Kein Rahmen

  ProgressBarEx()\drawing\bordercolor = pgb_bcolor.i
  ProgressBarEx_Render(gadid.i)

EndProcedure

Procedure.d ProgressBarExGetState(gadid.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn 0.0:EndIf

  ProcedureReturn ProgressBarEx()\prozentd
EndProcedure

Procedure ProgressBarEx_Free(gadid.i)
  If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
  
  If IsImage(ProgressBarEx()\imageid):FreeImage(ProgressBarEx()\imageid):EndIf
  If IsGadget(ProgressBarEx()\gadgetid):FreeGadget(ProgressBarEx()\gadgetid):EndIf
  
  DeleteElement(ProgressBarEx())
  
EndProcedure

;##########################
; TEST
;##########################

test_font.i=LoadFont(#PB_Any,"Verdana",8)

OpenWindow(0,#PB_Ignore,#PB_Ignore,400,80,"ProgressBarEx",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)

ProgressBarEx_Create(1, 10,10,380,20)
  ProgressBarEx_SetState(1, 65.96, "Der Text")
  ProgressBarEx_SetBorderColor(1, RGB(150,150,150))
  
ButtonGadget(2, 10,40,80,20,"Text -> Center")
ButtonGadget(3, 100,40,80,20,"Text -> Font")
ButtonGadget(4, 190,40,80,20,"BG Color")
ButtonGadget(5, 280,40,80,20,"Color")
quit=0
Repeat
  event=WaitWindowEvent()
  If event
    Select event
      Case #PB_Event_CloseWindow
        If EventWindow()=0:quit=1:EndIf
      Case #PB_Event_Gadget
        If EventGadget()=2
          ProgressBarEx_SetTextAlign(1, #PB_Text_Center)
        EndIf
        If EventGadget()=3
          ProgressBarEx_SetTextFont(1, test_font.i)
        EndIf
        If EventGadget()=4
          ProgressBarEx_SetBGColor(1, RGB(200,200,240))
        EndIf
        If EventGadget()=5
;           ProgressBarEx_SetColors(1, RGB(0,0,255))    ;ändert nur die erste Farbe -> Farbverlauf bleibt
;           ProgressBarEx_SetColors(1, RGB(0,0,255), -1)    ;ändert die erste Farbe -> Farbverlauf wird deaktiviert
          ProgressBarEx_SetColors(1, RGB(100,100,255), RGB(0,0,200))   
        EndIf
      Case #PB_Event_SizeWindow
        ResizeGadget(1,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,#PB_Ignore)
        ProgressBarEx_Render(1)
    EndSelect
  Else
    Delay(5)
    
  EndIf
Until quit=1

Debug ProgressBarExGetState(1)
ProgressBarEx_Free(1)

CloseWindow(0)
End 


Ich weiß selbst, dass es noch nicht 100% ist. Man sollte noch das Erstellen prüfen und ggf. entsprechende Rückgabewerte setzen.
Aber für mich reicht es erstmal so ... und ansonsten .. feel free ... man kann es ja selbst erweitern :wink:

Gruß, Morty