
Ein Pfeil unterhalb des Gadgets ziehen um ihn zu löschen. Ist #GradientGadget_Adding verwendet wird durch klick in den Farbverlauf ein neuer hinzugefügt.
Code: Alles auswählen
;
; GradientGadget.pb
;/ Constant
#GradientGadget_Adding = 1<<0
#GradientGadget_CanvasSize = 5
#GradientGadget_CanvasFront = #Gray
#GradientGadget_CanvasBack = #white
;/ Colors
Global GradientGadget_BackColor = GetSysColor_(#COLOR_3DFACE)
Global GradientGadget_ArrowColor = GetSysColor_(#COLOR_BTNFACE)
Global GradientGadget_ArrowShadowColor = GetSysColor_(#COLOR_BTNSHADOW)
Global GradientGadget_ArrowHighlightColor = GetSysColor_(#COLOR_BTNHILIGHT)
Global GradientGadget_BorderShadowColor = GetSysColor_(#COLOR_3DSHADOW)
Global GradientGadget_BorderHighlightColor = GetSysColor_(#COLOR_3DHILIGHT)
Structure GRADIENTCHILD_INFO
drag.i
remove.i
over.i
pos.f
color.i
EndStructure
Structure GRADIENT_INFO
id.l
img.i
flags.l
index.i
ac.i
ml.i
mr.i
drag.i
List gradient.GRADIENTCHILD_INFO()
EndStructure
;-
Procedure DrawGradientGadget(GadgetID.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
Protected w.i=GadgetWidth(GadgetID), h.i=GadgetHeight(GadgetID), px.i
Protected mx.i, my.i
Protected x.i, y.i, s.i = #GradientGadget_CanvasSize
mx = GetGadgetAttribute(GadgetID, #PB_Canvas_MouseX)
my = GetGadgetAttribute(GadgetID, #PB_Canvas_MouseY)
ResizeImage(*GG\img, w-10, h-10, #PB_Image_Raw)
StartDrawing(ImageOutput(*GG\img))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0, 0, w, h, RGBA(255,255,255,0))
If ListSize(*GG\gradient())>=2
DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)
ForEach *GG\gradient()
If *GG\gradient()\remove=#False
GradientColor(*GG\gradient()\pos, *GG\gradient()\color)
EndIf
Next
LinearGradient(0, 0, OutputWidth(), 0)
Box(0, 0, OutputWidth(), OutputHeight())
If mx>5 And mx<w-10
*GG\ac=Point(mx+5, 2)
Debug *GG\ac
EndIf
EndIf
StopDrawing()
StartDrawing(CanvasOutput(GadgetID))
;/ Canvas
Box(0, 0, w, h, #GradientGadget_CanvasBack)
For x=0 To (w-10)/s+1
For y=0 To (h-10)/s+1
Box(x*(s*2), y*(s*2), s, s, #GradientGadget_CanvasFront)
Box(s+x*(s*2), s+y*(s*2), s, s, #GradientGadget_CanvasFront)
Next
Next
Box(0, 0, 5, h, GradientGadget_BackColor)
Box(w-5, 0, 5, h, GradientGadget_BackColor)
Box(0, h-10, w, 10, GradientGadget_BackColor)
;/ Gadients
If ListSize(*GG\gradient())>=2
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawImage(ImageID(*GG\img), 5, 2)
Else
Box(5, 0, w-10, h-10, GradientGadget_BackColor)
EndIf
ForEach *GG\gradient()
If *GG\gradient()\drag=#True And mx>3 And mx<w-6
*GG\gradient()\pos= (((100/(w-10))*(mx-4)))/100
EndIf
If *GG\gradient()\drag=#True And my>h And ListSize(*GG\gradient())>2
*GG\gradient()\remove=#True
ElseIf *GG\gradient()\drag=#True And my<h
*GG\gradient()\remove=#False
EndIf
px =5+(*GG\gradient()\pos*(w-10))
If *GG\gradient()\remove=#False
DrawingMode(#PB_2DDrawing_Default)
;/ Arrow
Select *GG\gradient()\over
Case 0
Box(px-4, h-9, 8, 8, GradientGadget_ArrowColor)
Case 1
Box(px-4, h-9, 8, 8, GradientGadget_ArrowHighlightColor)
EndSelect
DrawingMode(#PB_2DDrawing_Outlined)
Box(px-4, h-9, 8, 8, GradientGadget_ArrowShadowColor)
If *GG\index=ListIndex(*GG\gradient())
DrawingMode(#PB_2DDrawing_XOr)
Box(px-2, h-7, 4, 4, GradientGadget_ArrowShadowColor)
EndIf
EndIf
Next
;/ Border
DrawingMode(#PB_2DDrawing_Outlined)
Box(4, 1, w-9, h-9, GradientGadget_BorderShadowColor)
Box(3, 0, w-8, h-8, GradientGadget_BorderHighlightColor)
StopDrawing()
EndProcedure
Procedure GradientGadget(GadgetID.i, x.i, y.i, Width.i, Height.i, flags.l=#Null)
Protected *GradientGadget.GRADIENT_INFO=AllocateMemory(SizeOf(GRADIENT_INFO))
If GadgetID=#PB_Any
result = CanvasGadget(#PB_Any, x, y, Width, Height, #PB_Canvas_DrawFocus)
Else
result = GadgetID
CanvasGadget(GadgetID, x, y, Width, Height)
EndIf
InitializeStructure(*GradientGadget, GRADIENT_INFO)
With *GradientGadget
\img = CreateImage(#PB_Any, Width-10, Height-10, 32|#PB_Image_Transparent)
\id = result
\flags = flags
\index = -1
EndWith
SetGadgetData(result, *GradientGadget)
DrawGradientGadget(result)
ProcedureReturn result
EndProcedure
Procedure AddGradientGadgetItem(GadgetID, pos.f, color.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
AddElement(*GG\gradient())
With *GG\gradient()
\pos = pos
\color = color
EndWith
DrawGradientGadget(GadgetID)
EndProcedure
Procedure RemoveGradientGadgetItem(GadgetID.i, index.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
SelectElement(*GG\gradient(), index)
DeleteElement(*GG\gradient())
DrawGradientGadget(GadgetID)
EndProcedure
Procedure GetGradientGadgetState(GadgetID.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
ProcedureReturn *GG\index
EndProcedure
Procedure SetGradientGadgetState(GadgetID.i, index.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
*GG\index=index
DrawGradientGadget(GadgetID)
EndProcedure
Procedure GetGradientGadgetItemColor(GadgetID.i, index.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
SelectElement(*GG\gradient(), index)
ProcedureReturn *GG\gradient()\color
EndProcedure
Procedure.f GetGradientGadgetItemPosition(GadgetID.i, index.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
SelectElement(*GG\gradient(), index)
ProcedureReturn *GG\gradient()\pos
EndProcedure
Procedure SetGradientGadgetItemColor(GadgetID.i, index.i, color.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
SelectElement(*GG\gradient(), index)
*GG\gradient()\color=color
EndProcedure
Procedure SetGradientGadgetItemPosition(GadgetID.i, index.i, Position.f)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
SelectElement(*GG\gradient(), index)
*GG\gradient()\pos=Position
EndProcedure
Procedure CountGradientGadgetItems(GadgetID.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
ProcedureReturn ListSize(*GG\gradient())
EndProcedure
Procedure CheckGradientGadget(GadgetID.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
Protected mx.i, my.i, w.i=GadgetWidth(GadgetID), h.i=GadgetHeight(GadgetID)
Protected ac.i, f.i
If EventType()=#PB_EventType_LeftButtonDown Or EventType()=#PB_EventType_LeftDoubleClick
*GG\ml=#True
ElseIf EventType()=#PB_EventType_LeftButtonUp
*GG\ml=#False
EndIf
mx = GetGadgetAttribute(GadgetID, #PB_Canvas_MouseX)
my = GetGadgetAttribute(GadgetID, #PB_Canvas_MouseY)
With *GG\gradient()
ForEach *GG\gradient()
px = 5+(*GG\gradient()\pos*(w-10))
If mx> px-4 And mx<px+8 And my>h-10
\over=#True
If *GG\ml=#True And *GG\drag=#False
\drag=#True
*GG\drag=#True
*GG\index=ListIndex(*GG\gradient())
Break
EndIf
Else
;/ Adding
If *GG\flags & #GradientGadget_Adding And *GG\ml=#True And my<h-10 And my>2 And *GG\drag=#False
AddGradientGadgetItem(GadgetID, (((100/(w-10))*(mx-4)))/100, *GG\ac)
*GG\ml=#False
*GG\index=-1
EndIf
;/ Removing
If \remove=#True And ListSize(*GG\gradient())>2
RemoveGradientGadgetItem(GadgetID, ListIndex(*GG\gradient()))
*GG\index=-1
EndIf
\over=#False
EndIf
If *GG\ml=#False
\drag=#False
*GG\drag=#False
EndIf
Next
ForEach *GG\gradient()
px = 5+(*GG\gradient()\pos*(w-10))
If *GG\ml=#True
If \drag=#True
f=#True
EndIf
EndIf
Next
If f=#False And *GG\ml=#True
*GG\index=-1
EndIf
EndWith
DrawGradientGadget(GadgetID)
EndProcedure
Procedure GetGradientGadgetImage(GadgetID.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
ProcedureReturn *GG\img
EndProcedure
Procedure FreeGradientGadget(GadgetID.i)
Protected *GG.GRADIENT_INFO = GetGadgetData(GadgetID)
If IsImage(*GG\img)
FreeImage(*GG\img)
EndIf
FreeGadget(*GG\id)
EndProcedure
;- Example
OpenWindow(0, 0, 0, 400, 250, "GradientGadget", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
GradientGadget(0, 50, 40, 300, 30, #GradientGadget_Adding)
AddGradientGadgetItem(0, 0, RGBA(0,0,0,128))
AddGradientGadgetItem(0, 0.3, RGBA(0,100,128,64))
AddGradientGadgetItem(0, 0.8, RGBA(0,64,128,255))
AddGradientGadgetItem(0, 1, RGBA(255,255,255,128))
SetGradientGadgetState(0, 2)
Procedure DrawExample()
Protected GradientImage.i=GetGradientGadgetImage(0)
StartDrawing(CanvasOutput(1))
Box(0, 0, OutputWidth(), OutputHeight(), GetSysColor_(#COLOR_3DFACE))
DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
; Readout Gradients
For c=0 To CountGradientGadgetItems(0)-1
GradientColor(GetGradientGadgetItemPosition(0, c), GetGradientGadgetItemColor(0, c))
Next
LinearGradient(0, 0, OutputWidth(), OutputHeight())
Ellipse(OutputWidth()/2, OutputHeight()/2, OutputWidth()/2, OutputHeight()/2-30)
DrawingMode(#PB_2DDrawing_AlphaBlend)
; The Image of the Gadget
DrawImage(ImageID(GradientImage), 35, 70)
DrawingMode(#PB_2DDrawing_XOr)
DrawText(OutputWidth()/2-(TextWidth("Example")/2), OutputHeight()/2, "Example")
StopDrawing()
EndProcedure
;- Use the Gradient
CanvasGadget(1, 10, 100, 380, 90)
DrawExample()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
CheckGradientGadget(0)
DrawExample()
EndSelect
ForEver