Notes:
1. Because no callbacks are used, some small code is required in your event loop:
Code: Select all
Case #PB_Event_Gadget
Select EventGadget()
Case Fader\canvas()
Fader\ProcessFaderEvents(Fader)
Any bugs, let me know please. Thanks for testing!
Code: Select all
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;
;Program: Fader Gadget Include - CrossPlatform
;Author: Lloyd Gallant (netmaestro)
;Date: March 6, 2013
;License: Free, Do as you like, NO WARRANTY WHATSOEVER
;
;Usage: <yourfader>.iFADER = New_Fader(x, y) creates a new Fader gadget on the window
;
; <yourfader>\SetColumn(column, level) sets the column to the desired level
;
; <yourfader>\GetColumn(column) returns the currently set level of the column
;
; <yourfader>\RedrawColumn(column) redraws the column (SetColumn() does not redraw)
;
; <yourfader>\Move(x, y) moves the fader gadget to a new location on the window
;
; To set fader levels, hold left mousebutton down while moving mouse over fader
; or click a column to set the level at the mouse position
;
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Interface iFADER
canvas()
SetColumn(column, level)
GetColumn(column)
RedrawColumn(column)
ProcessFaderEvents(*fader.iFADER)
Move(x, y)
Free()
EndInterface
Structure FADER
*vTable
Array iLevel.i(127) ; 127 images, one to render each level
Array columnlevel.i(127) ; 128 memory areas to set/get the state of each column
canvas.i ; gadget# of canvas that contains the 128 columns
EndStructure
Procedure Fader_Canvas(*this.FADER)
ProcedureReturn *this\canvas
EndProcedure
Procedure Fader_SetColumn(*this.FADER, column, newlevel)
If column>=0 And column<=127
If newlevel>=0 And newlevel<=127
*this\columnlevel(column) = newlevel
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure Fader_GetColumn(*this.FADER, column.i)
ProcedureReturn *this\columnlevel(column)
EndProcedure
Procedure Fader_RedrawColumn(*this.FADER, column.i)
StartDrawing(CanvasOutput(*this\canvas))
columnx = 4+6*column
DrawImage(ImageID(*this\iLevel(*this\columnlevel(column))),columnx,4)
StopDrawing()
EndProcedure
Procedure Fader_Free(*this.FADER)
If IsGadget(*this\canvas)
FreeGadget(*this\canvas)
EndIf
For i=0 To 127
If IsImage(*this\iLevel(i))
FreeImage(*this\ilevel(i))
EndIf
Next
ClearStructure(*this, FADER)
FreeMemory(*this)
EndProcedure
Procedure Fader_Move(*this.FADER, x, y)
ResizeGadget(*this\canvas, x, y, #PB_Ignore, #PB_Ignore)
EndProcedure
Procedure Fader_ProcessEvents(*this.FADER, *fader.iFADER)
If EventType() = #PB_EventType_MouseMove Or EventType() = #PB_EventType_LeftButtonDown
If GetGadgetAttribute(*this\canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
foundlevel = 127-GetGadgetAttribute(*this\canvas, #PB_Canvas_MouseY)+4
If foundlevel<0:foundlevel=0:EndIf
If foundlevel>127:foundlevel=127:EndIf
foundcolumn = (GetGadgetAttribute(*this\canvas, #PB_Canvas_MouseX)-4)/6
If foundcolumn<0:foundcolumn=0:EndIf
If foundcolumn>127:foundcolumn=127:EndIf
*Fader\SetColumn(foundcolumn, foundlevel)
*Fader\RedrawColumn(foundcolumn)
EndIf
EndIf
EndProcedure
Procedure New_Fader(x, y)
*this.FADER = AllocateMemory(SizeOf(FADER))
InitializeStructure(*this, FADER)
*this\vTable = ?FADER_Methods
fg_iCol = CreateImage(#PB_Any, 6, 128)
StartDrawing(ImageOutput(fg_iCol))
Box(0,0,6,128,$D1D1D1)
DrawingMode(#PB_2DDrawing_Gradient)
BackColor($D3FFFF)
GradientColor(0.32, $A1FFFF)
GradientColor(0.62, $CE8484)
FrontColor($E6EEEE)
LinearGradient(0, 0, 0, 127)
Box(1,0, 4, 128)
StopDrawing()
For i=0 To 127
temp = GrabImage(fg_iCol, #PB_Any, 0, 127-i, 6, i+1)
*this\iLevel(i) = CreateImage(#PB_Any, 6, 128)
StartDrawing(ImageOutput(*this\iLevel(i)))
Box(0,0,6,128,$D1D1D1)
Box(1,0,4,128,$EFD6AD)
DrawImage(ImageID(temp), 0, 128-i)
FreeImage(temp)
For j=3 To 123 Step 4
Line(0,j,4,1,$EF1010)
Next
StopDrawing()
Next
FreeImage(fg_iCol)
savedlist = UseGadgetList(WindowID(window))
*this\canvas = CanvasGadget(#PB_Any,x,y,776,136)
HideGadget(*this\canvas, 1)
StartDrawing(CanvasOutput(*this\canvas))
Box(0,0,GadgetWidth(*this\canvas),GadgetHeight(*this\canvas),RGB(160,160,180))
For i=0 To 127
DrawImage(ImageID(*this\iLevel(0)),4+6*i,4)
Next
StopDrawing()
SetGadgetData(*this\canvas, *this)
UseGadgetList(savedlist)
HideGadget(*this\canvas, 0)
ProcedureReturn *this
DataSection
FADER_Methods:
Data.i @Fader_Canvas(),
@Fader_SetColumn(),
@Fader_GetColumn(),
@Fader_RedrawColumn(),
@Fader_ProcessEvents(),
@Fader_Move(),
@Fader_Free()
EndDataSection
EndProcedure
;////////////////////////////////////////////////////////////
;
; END OF FADER GADGET INCLUDE
;
;////////////////////////////////////////////////////////////
; Little test proggie:
OpenWindow(0,0,0,900,300,"")
TrackBarGadget(0, 20,50,20,136,0,127,#PB_TrackBar_Vertical)
Fader.iFADER = New_Fader(60,50)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case Fader\canvas()
Fader\ProcessFaderEvents(Fader)
Case 0
For i=0 To 127
Fader\SetColumn(i, GetGadgetState(0))
fader\RedrawColumn(i)
Next
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
Fader\Free()