Looking for a control like the one in avidemux

For everything that's not in any way related to PureBasic. General chat etc...
User avatar
Psychophanta
Addict
Addict
Posts: 4975
Joined: Wed Jun 11, 2003 9:33 pm
Location: Lípetsk, Russian Federation
Contact:

Looking for a control like the one in avidemux

Post by Psychophanta »

Hi all.
In the avidemux program there is a horizontal trackbar like control which simulates a "roulette" to emulate physical classic video editors.
Is it easy and short to do that?
http://www.zeitgeistmovie.com

While world=business:world+mafia:Wend
Will never leave this forum until the absolute bugfree PB :mrgreen:
infratec
Always Here
Always Here
Posts: 6817
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: Looking for a control like the one in avidemux

Post by infratec »

A fast programmed version:

Code: Select all

CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
CompilerEndIf


Structure WheelGadgetStructure
  window.i
  gadget.i
  x.i
  y.i
  width.i
  height.i
  min.i
  max.i
  flags.i
  Pos.i
  LeftButtonDown.i
  LastXMouse.i
EndStructure


Procedure WheelGadgetDraw(*WheelGadget.WheelGadgetStructure)
  
  Protected.i i, xStep, x
  
  
  If StartDrawing(CanvasOutput(*WheelGadget\gadget))
    DrawingMode(#PB_2DDrawing_Gradient)
    
    BackColor($808080)
    FrontColor($FFFFFF)
    LinearGradient(0, 0, *WheelGadget\width / 2, 0)
    Box(0, 0, *WheelGadget\width / 2, *WheelGadget\height)
    
    BackColor($FFFFFF)
    FrontColor($808080)
    LinearGradient(*WheelGadget\width / 2,  0, *WheelGadget\width, 0)
    Box(*WheelGadget\width / 2, 0, *WheelGadget\width / 2, *WheelGadget\height) 
    
    DrawingMode(#PB_2DDrawing_Default)
    
    LineXY(*WheelGadget\Pos, 0, *WheelGadget\Pos, *WheelGadget\height, #Red)
    xStep = *WheelGadget\width / 9
    x = *WheelGadget\Pos - xStep
    While x > 0
      LineXY(x, 0, x, *WheelGadget\height, #Gray)
      x - xStep
    Wend
    x = *WheelGadget\Pos + xStep
    While x < *WheelGadget\width
      LineXY(x, 0, x, *WheelGadget\height, #Gray)
      x + xStep
    Wend
    
    If *WheelGadget\Flags & #PB_Text_Border
      LineXY(0, 0, *WheelGadget\width, 0, 0)
      LineXY(*WheelGadget\width - 1, 0, *WheelGadget\width - 1, *WheelGadget\height, 0)
      LineXY(*WheelGadget\width - 1, *WheelGadget\height - 1, 0, *WheelGadget\height - 1, 0)
      LineXY(0, *WheelGadget\height, 0, 0, 0)
    EndIf
    
    StopDrawing() 
  EndIf
  
EndProcedure


Procedure WheelGadgetCB()
  
  Protected xMouse.i, Value.i, Offset.i
  Protected *WheelGadget.WheelGadgetStructure
  
  
  *WheelGadget = GetGadgetData(EventGadget())
  If *WheelGadget
    Select EventType()
      Case #PB_EventType_LeftButtonDown
        *WheelGadget\LeftButtonDown = #True
        *WheelGadget\LastXMouse = GetGadgetAttribute(*WheelGadget\gadget, #PB_Canvas_MouseX)
        
      Case #PB_EventType_LeftButtonUp
        *WheelGadget\LeftButtonDown = #False
        
      Case #PB_EventType_LeftClick
        xMouse = GetGadgetAttribute(*WheelGadget\gadget, #PB_Canvas_MouseX)
        If xMouse < 0
          xMouse = 0
        EndIf
        If xMouse >= *WheelGadget\width
          xMouse = *WheelGadget\width - 2
        EndIf
        If xMouse <= *WheelGadget\Pos
          Offset = 0
        Else
          Offset = 2
        EndIf
        *WheelGadget\Pos = xMouse
        Value = ((*WheelGadget\Pos + Offset) * 100 / *WheelGadget\width) * (*WheelGadget\max - *WheelGadget\Min) / 100 + *WheelGadget\Min
        PostEvent(#PB_Event_Gadget, *WheelGadget\window, *WheelGadget\gadget, #PB_EventType_Change, Value)
        WheelGadgetDraw(*WheelGadget)
        
      Case #PB_EventType_MouseMove
        If *WheelGadget\LeftButtonDown
          xMouse = GetGadgetAttribute(*WheelGadget\gadget, #PB_Canvas_MouseX)
          *WheelGadget\Pos - (*WheelGadget\LastXMouse - xMouse)
          If *WheelGadget\Pos < 1
            *WheelGadget\Pos = 1
          EndIf
          If *WheelGadget\Pos > *WheelGadget\width - 2
            *WheelGadget\Pos = *WheelGadget\width - 2
          EndIf
          *WheelGadget\LastXMouse = xMouse
          WheelGadgetDraw(*WheelGadget)
        EndIf
    EndSelect
  EndIf
  
EndProcedure


Procedure.i WheelGadget(gadget.i, x.i, y.i, width.i, height.i, min.i=-1, max.i=-1, Flags.i=#PB_Text_Border)
  
  Protected gadgetno.i, REsult.i
  Protected *WheelGadget.WheelGadgetStructure
  
  If gadget = #PB_Any
    gadgetno = CanvasGadget(gadget, x, y, width, height)
    Result = gadgetno
  Else
    gadgetno = gadget
    Result = CanvasGadget(gadget, x, y, width, height)
  EndIf
  
  If Result
    
    *WheelGadget = AllocateStructure(WheelGadgetStructure)
    *WheelGadget\window = GetActiveWindow()
    *WheelGadget\gadget = gadgetno
    *WheelGadget\x = x
    *WheelGadget\y = y
    *WheelGadget\width = width
    *WheelGadget\height = height
    If min <> -1 And max > min
      *WheelGadget\min = min
      *WheelGadget\max = max
    Else
      *WheelGadget\min = 0
      *WheelGadget\max = 100
    EndIf
    *WheelGadget\flags = flags
    *WheelGadget\Pos = width / 2
    
    SetGadgetData(gadgetno, *WheelGadget)
    
    WheelGadgetDraw(*WheelGadget)
    
    BindGadgetEvent(gadgetno, @WheelGadgetCB(), #PB_All)
    
  EndIf
  
  ProcedureReturn Result
  
EndProcedure


CompilerIf #PB_Compiler_IsMainFile
  
  Define Event.i
  
  If OpenWindow(0, 0, 0, 320, 80, "WheelGadget example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    WheelGadget(0, 10, 10, 300, 20)
    
    WheelGadget(1, 10, 40, 200, 30, 100, 900)
    
    Repeat
      Event = WaitWindowEvent()
      Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 0
              If EventType() = #PB_EventType_Change
                Debug "0: " + Str(EventData()) + "%"
              EndIf
              
            Case 1
              If EventType() = #PB_EventType_Change
                Debug "1: " + Str(EventData())
              EndIf
              
          EndSelect
          
      EndSelect
    Until Event = #PB_Event_CloseWindow
  EndIf
  
CompilerEndIf
But this was more a 'Coding question' :wink:
User avatar
Psychophanta
Addict
Addict
Posts: 4975
Joined: Wed Jun 11, 2003 9:33 pm
Location: Lípetsk, Russian Federation
Contact:

Re: Looking for a control like the one in avidemux

Post by Psychophanta »

infratec wrote: Fri May 13, 2022 8:00 pm A fast programmed version:
WaW :shock:
You are my hero :shock: :!: :!: :!:
I was looking around into its source, but not time enough for me to find it, so I decided to leave it at the moment and perform it in a native simple way using standard trackbargadget.
Now, this tip is more than enough to do the final control gadget :idea:
http://www.zeitgeistmovie.com

While world=business:world+mafia:Wend
Will never leave this forum until the absolute bugfree PB :mrgreen:
User avatar
Psychophanta
Addict
Addict
Posts: 4975
Joined: Wed Jun 11, 2003 9:33 pm
Location: Lípetsk, Russian Federation
Contact:

Re: Looking for a control like the one in avidemux

Post by Psychophanta »

Replacing this function in your tip, we can get the intention:

Code: Select all

Procedure WheelGadgetCB()
  Protected xMouse.i,*WheelGadget.WheelGadgetStructure
  *WheelGadget=GetGadgetData(EventGadget())
  If *WheelGadget
    Select EventType()
      Case #PB_EventType_LeftButtonDown
        *WheelGadget\LeftButtonDown=1
        *WheelGadget\LastXMouse=GetGadgetAttribute(*WheelGadget\gadget,#PB_Canvas_MouseX)
      Case #PB_EventType_LeftButtonUp
        If *WheelGadget\LastXMouse
          *WheelGadget\LastXMouse=0
          *WheelGadget\LeftButtonDown=0
          xMouse=0
          *WheelGadget\Pos=*WheelGadget\width/2
          PostEvent(#PB_Event_Gadget, *WheelGadget\window, *WheelGadget\gadget, #PB_EventType_Change,0)
          WheelGadgetDraw(*WheelGadget)
        EndIf
      Case #PB_EventType_MouseMove
        If *WheelGadget\LeftButtonDown And *WheelGadget\LastXMouse>0 And *WheelGadget\LastXMouse<*WheelGadget\width
          xMouse = GetGadgetAttribute(*WheelGadget\gadget, #PB_Canvas_MouseX)
          *WheelGadget\Pos-*WheelGadget\LastXMouse+xMouse
          *WheelGadget\LastXMouse=xMouse
          If *WheelGadget\Pos<1:*WheelGadget\Pos=1:EndIf
          If *WheelGadget\Pos>*WheelGadget\width:*WheelGadget\Pos=*WheelGadget\width:EndIf
          PostEvent(#PB_Event_Gadget,*WheelGadget\window,*WheelGadget\gadget, #PB_EventType_Change,-100+(*WheelGadget\Pos-1)*(100+100)/(*WheelGadget\width-1))
          WheelGadgetDraw(*WheelGadget)
        EndIf
    EndSelect
  EndIf
EndProcedure
:wink:
And in the draw function I have replaced:

Code: Select all

    LineXY(*WheelGadget\Pos,0, *WheelGadget\Pos, *WheelGadget\height, #Red)
by

Code: Select all

    Line(*WheelGadget\Pos-1,0,1,*WheelGadget\height, #Red)
    Line(*WheelGadget\Pos,0,1, *WheelGadget\height, #Red)
    Line(*WheelGadget\Pos+1,0,1, *WheelGadget\height, #Red)
http://www.zeitgeistmovie.com

While world=business:world+mafia:Wend
Will never leave this forum until the absolute bugfree PB :mrgreen:
Post Reply