To the selected pattern back into place (Z-order).
Code: Select all
EnableExplicit
Structure canvasitem
img.i
X.w
Y.w
Width.w
Height.w
drag_x.w
drag_y.w
alphatest.b
IsGrid.i
Index.i
EndStructure
Enumeration
#MyCanvas = 1 ; just to test whether a number different from 0 works now
EndEnumeration
Define Event.i, X.i, Y.i, Drag.i, hole.i, Grid.i
Define *currentItem.canvasitem
NewList Images.canvasitem()
Procedure AddImage (List Images.canvasitem(), X, Y, img, alphatest = #False, Grid = #False)
If AddElement(Images())
If alphatest And ImageDepth(img) < 32
alphatest = #False
EndIf
Images()\IsGrid = Grid
Images()\Index = ListIndex(Images())
Images()\img = img
Images()\x = X
Images()\y = Y
Images()\width = ImageWidth(img)
Images()\height = ImageHeight(img)
Images()\alphatest = alphatest
If Grid
MoveElement(Images(), #PB_List_First)
EndIf
EndIf
EndProcedure
Procedure DrawCanvas (canvas.i, List Images.canvasitem(), bgColor.l = $ffffff)
Shared *currentItem, Drag
Protected shadow, *i.canvasitem = *currentItem
If Drag And *i
shadow = CopyImage(*i\img, #PB_Any)
StartDrawing(ImageOutput(shadow))
Box(0, 0, *i\width, *i\height, 0)
StopDrawing()
EndIf
If StartDrawing(CanvasOutput(canvas))
Box(0, 0, GadgetWidth(canvas), GadgetHeight(canvas), bgColor)
DrawingMode(#PB_2DDrawing_AlphaBlend)
ForEach Images()
*i = Images()
If Drag And *i = *currentItem
DrawAlphaImage(ImageID(shadow), *i\x + 3, *i\y + 3, 30)
EndIf
DrawImage(ImageID(*i\img), *i\x, *i\y) ; draw all images with z-order
Next
StopDrawing()
EndIf
If shadow
FreeImage(shadow)
EndIf
EndProcedure
Procedure.i HitTest (List Images.canvasitem(), X, Y) ; search for hit, starting from end (z-order)
Protected hit_x.w, hit_y.w, alpha.b, *i.canvasitem
*i = LastElement(Images())
PushListPosition(Images())
While *i
If *i And Not *i\IsGrid
hit_x = X - *i\x
hit_y = Y - *i\y
If hit_x >= 0 And hit_y >= 0 And hit_x < *i\width And hit_y < *i\height
alpha = 255
If *i\alphatest And StartDrawing(ImageOutput(*i\img))
DrawingMode(#PB_2DDrawing_AlphaChannel)
alpha = Point(hit_x, hit_y) >> 24 ; get alpha
StopDrawing()
EndIf
If alpha
Select EventType()
Case #PB_EventType_LeftButtonDown
MoveElement(Images(), #PB_List_Last)
*i\drag_x = hit_x
*i\drag_y = hit_y
Case #PB_EventType_LeftButtonUp
PushListPosition(Images())
Protected *Prev = SelectElement(Images(), Images()\Index)
PopListPosition(Images())
MoveElement(Images(), #PB_List_After, *Prev)
EndSelect
Break
EndIf
EndIf
EndIf
*i = PreviousElement(Images())
Wend
PopListPosition(Images())
ProcedureReturn *i
EndProcedure
AddImage(Images(), 10, 10, LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/PureBasic.bmp"))
AddImage(Images(), 100,100, LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/GeeBee2.bmp"))
AddImage(Images(), 50,200, LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/Sources/Data/AlphaChannel.bmp"))
hole = CreateImage(#PB_Any,100,100,32)
If StartDrawing(ImageOutput(hole))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,100,100,RGBA($00,$00,$00,$00))
Circle(50,50,48,RGBA($00,$FF,$FF,$FF))
Circle(50,50,30,RGBA($00,$00,$00,$00))
StopDrawing()
EndIf
AddImage(Images(),170,70,hole,#True)
If OpenWindow(0, 0, 0, 420, 420, "Move/drag Canvas Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) = 0
MessageRequester("Fatal error", "Program terminated.")
End
EndIf
CanvasGadget(#MyCanvas, 10, 10, 400, 400)
Define Y,X, Steps = 5
Grid = CreateImage(#PB_Any, 400, 400,32,#PB_Image_Transparent)
If StartDrawing(ImageOutput(Grid))
DrawingMode(#PB_2DDrawing_AlphaChannel|#PB_2DDrawing_Transparent)
;Box(0, 0, OutputWidth(),OutputHeight(), RGBA(0, 0, 0, 0))
For X = 0 To OutputWidth()-1
For Y = 0 To OutputHeight()-1
Plot(X,Y,RGBA(0,0,0,255))
Y+Steps
Next
X+Steps
Next
StopDrawing()
EndIf
AddImage(Images(),0,0,Grid,#True, #True)
DrawCanvas(#MyCanvas, Images(), $f0fff0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = #MyCanvas
Select EventType()
Case #PB_EventType_LeftButtonDown
X = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseX)
Y = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseY)
*currentItem = HitTest(Images(), X, Y)
If *currentItem
Debug *currentItem\Index
Drag = #True
DrawCanvas(#MyCanvas, Images(), $f0fff0)
EndIf
Case #PB_EventType_LeftButtonUp
Drag = #False
*currentItem = HitTest(Images(), X, Y)
If *currentItem
DrawCanvas(#MyCanvas, Images(), $f0fff0)
ResizeImage(Images()\img, Images()\width, Images()\height)
EndIf
Case #PB_EventType_MouseMove
X = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseX)
Y = GetGadgetAttribute(#MyCanvas, #PB_Canvas_MouseY)
If Drag
*currentItem\x = X - *currentItem\drag_x
*currentItem\y = Y - *currentItem\drag_y
DrawCanvas(#MyCanvas, Images(), $f0fff0)
ElseIf HitTest(Images(), X, Y)
SetGadgetAttribute(#MyCanvas, #PB_Canvas_Cursor, #PB_Cursor_Hand)
Else
SetGadgetAttribute(#MyCanvas, #PB_Canvas_Cursor, #PB_Cursor_Default)
EndIf
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow