Browse Source

Some WIP drag and drop OSX stuff

Josh Engebretson 10 years ago
parent
commit
36ab1091a2

+ 1 - 1
Source/AtomicEditorWork/Application/AEDragAndDrop.cpp

@@ -53,7 +53,7 @@ void AEDragAndDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)
                 LOGINFOF("Drag Asset: %s", asset->GetPath().CString());
                 LOGINFOF("Drag Asset: %s", asset->GetPath().CString());
 
 
                 #ifdef ATOMIC_PLATFORM_OSX
                 #ifdef ATOMIC_PLATFORM_OSX
-                // START DRAG
+                StartDragAndDrop();
                 #endif
                 #endif
 
 
             }
             }

+ 2 - 0
Source/AtomicEditorWork/Application/AEDragAndDrop.h

@@ -27,6 +27,8 @@ public:
     void AddDragFilename(const String& filename);
     void AddDragFilename(const String& filename);
     void ConcludeDrag();
     void ConcludeDrag();
 
 
+    Object* GetDragObject() { return dragObject_; }
+
 private:
 private:
 
 
     void HandleMouseDown(StringHash eventType, VariantMap& eventData);
     void HandleMouseDown(StringHash eventType, VariantMap& eventData);

+ 3 - 0
Source/AtomicEditorWork/Application/AEMacDragAndDrop.h

@@ -4,8 +4,11 @@ namespace AtomicEditor
 {
 {
 
 
 class AEDragAndDrop;
 class AEDragAndDrop;
+
 void InitDragAndDrop(AEDragAndDrop* dragAndDrop);
 void InitDragAndDrop(AEDragAndDrop* dragAndDrop);
 
 
+void StartDragAndDrop();
+
 }
 }
 
 
 
 

+ 58 - 7
Source/AtomicEditorWork/Application/AEMacDragAndDrop.mm

@@ -8,6 +8,8 @@
 #include <Atomic/Input/InputEvents.h>
 #include <Atomic/Input/InputEvents.h>
 #include <Atomic/Graphics/Graphics.h>
 #include <Atomic/Graphics/Graphics.h>
 
 
+#include <ToolCore/Assets/Asset.h>
+
 #include "AEDragAndDrop.h"
 #include "AEDragAndDrop.h"
 
 
 static WeakPtr<AtomicEditor::AEDragAndDrop> dragAndDrop_;
 static WeakPtr<AtomicEditor::AEDragAndDrop> dragAndDrop_;
@@ -46,7 +48,7 @@ static WeakPtr<AtomicEditor::AEDragAndDrop> dragAndDrop_;
         }
         }
     }
     }
 
 
-    return NSDragOperationGeneric;
+    return NSDragOperationCopy;
 }
 }
 
 
 -(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
 -(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
@@ -67,7 +69,7 @@ static WeakPtr<AtomicEditor::AEDragAndDrop> dragAndDrop_;
 
 
     dragAndDrop_->SendEvent(E_MOUSEMOVE, eventData);
     dragAndDrop_->SendEvent(E_MOUSEMOVE, eventData);
 
 
-    return NSDragOperationGeneric;
+    return NSDragOperationCopy;
 }
 }
 
 
 -(BOOL)prepareForDragOperation:(id)sender
 -(BOOL)prepareForDragOperation:(id)sender
@@ -90,18 +92,67 @@ static WeakPtr<AtomicEditor::AEDragAndDrop> dragAndDrop_;
 namespace AtomicEditor
 namespace AtomicEditor
 {
 {
 
 
-void InitDragAndDrop(AEDragAndDrop *dragAndDrop)
+static NSWindow* GetNSWindow()
 {
 {
-    dragAndDrop_ = dragAndDrop;
-
-    SDL_Window* window = (SDL_Window*) dragAndDrop->GetSubsystem<Graphics>()->GetSDLWindow();
+    SDL_Window* window = (SDL_Window*) dragAndDrop_->GetSubsystem<Graphics>()->GetSDLWindow();
 
 
     SDL_SysWMinfo info;
     SDL_SysWMinfo info;
     SDL_VERSION(&info.version);
     SDL_VERSION(&info.version);
 
 
     if(SDL_GetWindowWMInfo(window, &info)) {
     if(SDL_GetWindowWMInfo(window, &info)) {
 
 
-        NSWindow* window = info.info.cocoa.window;
+        return info.info.cocoa.window;
+    }
+
+    return NULL;
+}
+
+void StartDragAndDrop()
+{
+    Object* o = dragAndDrop_->GetDragObject();
+
+    if (!o)
+        return;
+
+    ToolCore::Asset* asset = o->GetType() == ToolCore::Asset::GetTypeStatic() ? (ToolCore::Asset*) o : NULL;
+
+    if (asset)
+    {
+        NSWindow* window = GetNSWindow();
+        if (window)
+        {
+
+            NSImage *dragImage = nil;
+            NSPoint dragPosition;
+            NSString* filePath = [NSString stringWithUTF8String:asset->GetPath().CString()];
+
+            // Write data to the pasteboard
+
+            NSArray *fileList = [NSArray arrayWithObjects:filePath, nil];
+            NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
+            [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType]
+                    owner:nil];
+            [pboard setPropertyList:fileList forType:NSFilenamesPboardType];
+
+            [window dragImage:dragImage
+                    at:dragPosition
+                    offset:NSZeroSize
+                    event:nil
+                    pasteboard:pboard
+                    source:window
+                    slideBack:YES];
+
+        }
+    }
+}
+
+void InitDragAndDrop(AEDragAndDrop *dragAndDrop)
+{
+    dragAndDrop_ = dragAndDrop;
+
+    NSWindow* window = GetNSWindow();
+    if (window)
+    {
         [window registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
         [window registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
     }
     }