Vuo  2.0.0
VuoGraphicsWindowDrag.mm
Go to the documentation of this file.
1 
11 #import "VuoMouse.h"
12 #import "VuoTriggerSet.hh"
13 
14 #ifdef VUO_COMPILER
16  "title" : "VuoGraphicsWindowDrag",
17  "dependencies" : [
18  "VuoDragEvent",
19  "VuoList_VuoUrl",
20  "VuoMouse"
21  ]
22 });
23 #endif
24 
25 
26 @implementation VuoGraphicsWindow (Drag)
30 - (void)initDrag
31 {
32  self.dragEntered = new VuoTriggerSet<VuoDragEvent>;
33  self.dragMovedTo = new VuoTriggerSet<VuoDragEvent>;
34  self.dragCompleted = new VuoTriggerSet<VuoDragEvent>;
35  self.dragExited = new VuoTriggerSet<VuoDragEvent>;
36 }
37 
41 - (void)addDragEnteredCallback:(VuoGraphicsWindowDragCallback)dragEnteredCallback
42  dragMovedToCallback:(VuoGraphicsWindowDragCallback)dragMovedToCallback
43  dragCompletedCallback:(VuoGraphicsWindowDragCallback)dragCompletedCallback
44  dragExitedCallback:(VuoGraphicsWindowDragCallback)dragExitedCallback
45 {
46  ((VuoTriggerSet<VuoDragEvent>*)self.dragEntered)->addTrigger(dragEnteredCallback);
47  ((VuoTriggerSet<VuoDragEvent>*)self.dragMovedTo)->addTrigger(dragMovedToCallback);
48  ((VuoTriggerSet<VuoDragEvent>*)self.dragCompleted)->addTrigger(dragCompletedCallback);
49  ((VuoTriggerSet<VuoDragEvent>*)self.dragExited)->addTrigger(dragExitedCallback);
50 }
51 
55 - (void)removeDragEnteredCallback:(VuoGraphicsWindowDragCallback)dragEnteredCallback
56  dragMovedToCallback:(VuoGraphicsWindowDragCallback)dragMovedToCallback
57  dragCompletedCallback:(VuoGraphicsWindowDragCallback)dragCompletedCallback
58  dragExitedCallback:(VuoGraphicsWindowDragCallback)dragExitedCallback
59 {
60  ((VuoTriggerSet<VuoDragEvent>*)self.dragEntered)->removeTrigger(dragEnteredCallback);
61  ((VuoTriggerSet<VuoDragEvent>*)self.dragMovedTo)->removeTrigger(dragMovedToCallback);
62  ((VuoTriggerSet<VuoDragEvent>*)self.dragCompleted)->removeTrigger(dragCompletedCallback);
63  ((VuoTriggerSet<VuoDragEvent>*)self.dragExited)->removeTrigger(dragExitedCallback);
64 }
65 
69 - (bool)makeDragEvent:(VuoDragEvent *)dragEvent fromSender:(id<NSDraggingInfo>)sender
70 {
71  if (!((VuoTriggerSet<VuoDragEvent>*)self.dragEntered)->size())
72  return NO;
73 
74  NSPasteboard *pboard = [sender draggingPasteboard];
75 
76  if (![[pboard types] containsObject:NSFilenamesPboardType])
77  return NO;
78 
79  NSPoint p = [sender draggingLocation];
80 
82  NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
83  for (NSString *file in files)
84  {
85  VuoText path = VuoText_makeFromCFString(file);
86  VuoRetain(path);
88  VuoListAppendValue_VuoUrl(urls, url);
89  VuoRelease(path);
90  }
91 
92  bool shouldFire;
93  *dragEvent = VuoDragEvent_make(VuoMouse_convertWindowToVuoCoordinates(p, self, &shouldFire), urls);
94 
95  return YES;
96 }
97 
101 - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
102 {
103  VuoDragEvent dragEvent;
104  if (![self makeDragEvent:&dragEvent fromSender:sender])
105  return NSDragOperationNone;
106 
107  ((VuoTriggerSet<VuoDragEvent>*)self.dragEntered)->fire(dragEvent);
108  return NSDragOperationGeneric;
109 }
110 
114 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
115 {
116  VuoDragEvent dragEvent;
117  if (![self makeDragEvent:&dragEvent fromSender:sender])
118  return NSDragOperationNone;
119 
120  ((VuoTriggerSet<VuoDragEvent>*)self.dragMovedTo)->fire(dragEvent);
121  return NSDragOperationGeneric;
122 }
123 
127 - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
128 {
129  VuoDragEvent dragEvent;
130  if (![self makeDragEvent:&dragEvent fromSender:sender])
131  return NO;
132 
133  ((VuoTriggerSet<VuoDragEvent>*)self.dragCompleted)->fire(dragEvent);
134  return YES;
135 }
136 
140 - (void)draggingExited:(id<NSDraggingInfo>)sender
141 {
142  VuoDragEvent dragEvent;
143  if (![self makeDragEvent:&dragEvent fromSender:sender])
144  return;
145 
146  ((VuoTriggerSet<VuoDragEvent>*)self.dragExited)->fire(dragEvent);
147 }
148 
149 @end