Vuo  2.3.2
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 #pragma clang diagnostic push
77 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
78  // The replacement, NSPasteboardTypeFileURL, isn't available until macOS 11.
79  if (![[pboard types] containsObject:NSFilenamesPboardType])
80  return NO;
81 #pragma clang diagnostic pop
82 
83  NSPoint p = [sender draggingLocation];
84 
86 #pragma clang diagnostic push
87 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
88  // The replacement, NSPasteboardTypeFileURL, isn't available until macOS 11.
89  NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
90 #pragma clang diagnostic pop
91  for (NSString *file in files)
92  {
93  VuoText path = VuoText_makeFromCFString(file);
94  VuoRetain(path);
96  VuoListAppendValue_VuoUrl(urls, url);
97  VuoRelease(path);
98  }
99 
100  bool shouldFire;
101  *dragEvent = VuoDragEvent_make(VuoMouse_convertWindowToVuoCoordinates(p, self, &shouldFire), urls);
102 
103  return YES;
104 }
105 
109 - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
110 {
111  VuoDragEvent dragEvent;
112  if (![self makeDragEvent:&dragEvent fromSender:sender])
113  return NSDragOperationNone;
114 
115  ((VuoTriggerSet<VuoDragEvent>*)self.dragEntered)->fire(dragEvent);
116  return NSDragOperationGeneric;
117 }
118 
122 - (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender
123 {
124  VuoDragEvent dragEvent;
125  if (![self makeDragEvent:&dragEvent fromSender:sender])
126  return NSDragOperationNone;
127 
128  ((VuoTriggerSet<VuoDragEvent>*)self.dragMovedTo)->fire(dragEvent);
129  return NSDragOperationGeneric;
130 }
131 
135 - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
136 {
137  VuoDragEvent dragEvent;
138  if (![self makeDragEvent:&dragEvent fromSender:sender])
139  return NO;
140 
141  ((VuoTriggerSet<VuoDragEvent>*)self.dragCompleted)->fire(dragEvent);
142  return YES;
143 }
144 
148 - (void)draggingExited:(id<NSDraggingInfo>)sender
149 {
150  VuoDragEvent dragEvent;
151  if (![self makeDragEvent:&dragEvent fromSender:sender])
152  return;
153 
154  ((VuoTriggerSet<VuoDragEvent>*)self.dragExited)->fire(dragEvent);
155 }
156 
157 @end