UIDragDropMac.mm 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include <stdio.h>
  2. #include <ThirdParty/SDL/include/SDL.h>
  3. #include <ThirdParty/SDL/include/SDL_syswm.h>
  4. #include <Atomic/IO/Log.h>
  5. #include <Atomic/Input/InputEvents.h>
  6. #include <Atomic/Graphics/Graphics.h>
  7. #include "UIDragDrop.h"
  8. #include "UIDragDropMac.h"
  9. static Atomic::WeakPtr<Atomic::UIDragDrop> dragAndDrop_;
  10. @interface NSWindow (NSWindowWithDragAndDrop)
  11. -(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;
  12. -(NSDragOperation)draggingUpdated:(id)sender;
  13. -(BOOL)prepareForDragOperation:(id)sender;
  14. -(BOOL)performDragOperation:(id <NSDraggingInfo>)sender;
  15. -(void)concludeDragOperation:(id <NSDraggingInfo>)sender;
  16. @end
  17. @implementation NSWindow (NSWindowWithDragAndDrop)
  18. -(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
  19. {
  20. NSPasteboard *pboard = [sender draggingPasteboard];
  21. NSString *type = [pboard availableTypeFromArray:[NSArray arrayWithObject:NSFilenamesPboardType]];
  22. if (type)
  23. {
  24. if ([type isEqualToString:NSFilenamesPboardType])
  25. {
  26. NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];
  27. int i = (int) [filenames count];
  28. if (i)
  29. dragAndDrop_->FileDragEntered();
  30. while (i-- > 0)
  31. {
  32. NSString *filename = [filenames objectAtIndex:i];
  33. dragAndDrop_->FileDragAddFile([filename UTF8String]);
  34. }
  35. }
  36. }
  37. return NSDragOperationCopy;
  38. }
  39. -(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
  40. {
  41. using namespace Atomic::MouseMove;
  42. Atomic::Graphics* graphics = dragAndDrop_->GetSubsystem<Atomic::Graphics>();
  43. NSPoint dragPoint = [sender draggingLocation];
  44. Atomic::VariantMap eventData;
  45. eventData[P_X] = (int) dragPoint.x;
  46. eventData[P_Y] = graphics->GetHeight() - (int) dragPoint.y;
  47. eventData[P_DX] = 0;
  48. eventData[P_DY] = 0;
  49. eventData[P_BUTTONS] = 0;
  50. eventData[P_QUALIFIERS] = 0;
  51. dragAndDrop_->SendEvent(Atomic::E_MOUSEMOVE, eventData);
  52. return NSDragOperationCopy;
  53. }
  54. -(BOOL)prepareForDragOperation:(id)sender
  55. {
  56. return YES;
  57. }
  58. -(BOOL)performDragOperation:(id <NSDraggingInfo>)sender
  59. {
  60. return YES;
  61. }
  62. -(void)concludeDragOperation:(id <NSDraggingInfo>)sender
  63. {
  64. dragAndDrop_->FileDragConclude();
  65. }
  66. @end
  67. namespace Atomic
  68. {
  69. static NSWindow* GetNSWindow()
  70. {
  71. SDL_Window* window = (SDL_Window*) dragAndDrop_->GetSubsystem<Graphics>()->GetSDLWindow();
  72. SDL_SysWMinfo info;
  73. SDL_VERSION(&info.version);
  74. if(SDL_GetWindowWMInfo(window, &info)) {
  75. return info.info.cocoa.window;
  76. }
  77. return NULL;
  78. }
  79. /*
  80. void StartDragAndDrop()
  81. {
  82. Object* o = dragAndDrop_->GetDragObject();
  83. if (!o)
  84. return;
  85. ToolCore::Asset* asset = o->GetType() == ToolCore::Asset::GetTypeStatic() ? (ToolCore::Asset*) o : NULL;
  86. if (asset)
  87. {
  88. NSWindow* window = GetNSWindow();
  89. if (window)
  90. {
  91. NSImage *dragImage = nil;
  92. NSPoint dragPosition;
  93. NSString* filePath = [NSString stringWithUTF8String:asset->GetPath().CString()];
  94. // Write data to the pasteboard
  95. NSArray *fileList = [NSArray arrayWithObjects:filePath, nil];
  96. NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
  97. [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType]
  98. owner:nil];
  99. [pboard setPropertyList:fileList forType:NSFilenamesPboardType];
  100. // blocks
  101. [window dragImage:dragImage
  102. at:dragPosition
  103. offset:NSZeroSize
  104. event:nil
  105. pasteboard:pboard
  106. source:window
  107. slideBack:YES];
  108. }
  109. }
  110. }
  111. */
  112. void InitDragAndDrop(UIDragDrop *dragAndDrop)
  113. {
  114. dragAndDrop_ = dragAndDrop;
  115. NSWindow* window = GetNSWindow();
  116. if (window)
  117. {
  118. [window registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
  119. }
  120. }
  121. }