-
Notifications
You must be signed in to change notification settings - Fork 77
/
Copy pathsample13_drag_and_drop.nim
92 lines (69 loc) · 3.2 KB
/
sample13_drag_and_drop.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import variant
import sample_registry
import nimx / [ view, view_event_handling, drag_and_drop, text_field, expanding_view,
view_render_to_image ]
import nimx/pasteboard/pasteboard_item
type DragAndDropView = ref object of View
type MyDropDelegate* = ref object of DragDestinationDelegate
type DraggedView* = ref object of View
const PboardSampleDrag* = "nimx.sample.drag"
method onTouchEv*(v: DraggedView, e: var Event): bool =
if e.buttonState == bsDown:
let dpi = newPasteboardItem(PboardSampleDrag, v.name)
let image = v.screenShot()
startDrag(dpi, image)
#============= MyDropDelegate ==============
method onDragEnter*(dd: MyDropDelegate, target: View, i: PasteboardItem) =
target.backgroundColor.a = 0.5
let label = target.subviews[1].TextField
label.text = "drag over: " & i.data
method onDragExit*(dd: MyDropDelegate, target: View, i: PasteboardItem) =
target.backgroundColor.a = 1.0
let label = target.subviews[1].TextField
label.text = "drag over: "
method onDrop*(dd: MyDropDelegate, target: View, i: PasteboardItem) =
let label = target.subviews[1].TextField
label.text = "drag over: "
if i.data == "yellow":
target.backgroundColor = newColor(1.0, 1.0, 0.0, 1.0)
if i.data == "green":
target.backgroundColor = newColor(0.0, 1.0, 0.0, 1.0)
#============= Views ==============
proc createDraggedView(pos: Point, name: string): View =
result = DraggedView.new(newRect(pos.x, pos.y, 150, 60))
result.name = name
result.backgroundColor = newColor(0.0, 1.0, 0.0, 1.0)
let label_name = newLabel(newRect(2, 0, 200, 40))
label_name.text = result.name
result.addSubView(label_name)
proc createDropView(pos: Point, name: string, delegate: MyDropDelegate): View =
result = newView(newRect(pos.x, pos.y, 200, 200))
result.name = name
result.backgroundColor = newColor(1.0, 0.0, 0.0, 1.0)
result.dragDestination = delegate
let label_name = newLabel(newRect(2, 150, 200, 40))
label_name.text = result.name
result.addSubView(label_name)
let label_drop = newLabel(newRect(2, 170, 200, 35))
label_drop.text = "drop : "
result.addSubView(label_drop)
method init(v: DragAndDropView, r: Rect) =
procCall v.View.init(r)
let dropDelegate = MyDropDelegate.new()
let red_view = createDropView(newPoint(50.0, 80.0), "red_drop_view", dropDelegate)
let blue_view = createDropView(newPoint(350.0, 80.0), "blue_drop_view", dropDelegate)
blue_view.backgroundColor = newColor(0.0, 0.0, 1.0, 1.0)
v.addSubView(red_view)
v.addSubView(blue_view)
let draggedView1 = createDraggedView(newPoint(50, 10), "green")
v.addSubView(draggedView1)
let draggedView2 = createDraggedView(newPoint(350, 10), "yellow")
draggedView2.backgroundColor = newColor(1.0, 1.0, 0.0, 1.0)
v.addSubView(draggedView2)
let expView = newExpandingView(newRect(50, 300, 200, 400), true)
expView.title = "Expanded View "
v.addSubview(expView)
let exp_drop_view = createDropView(newPoint(350.0, 80.0), "exp_drop_view", dropDelegate)
exp_drop_view.backgroundColor = newColor(1.0, 0.0, 1.0, 1.0)
expView.addContent(exp_drop_view)
registerSample(DragAndDropView, "DragAndDrop")