diff --git a/Siv3D/include/Siv3D/DragDrop.hpp b/Siv3D/include/Siv3D/DragDrop.hpp index 4ae40a9c1..7a408fa48 100644 --- a/Siv3D/include/Siv3D/DragDrop.hpp +++ b/Siv3D/include/Siv3D/DragDrop.hpp @@ -70,6 +70,10 @@ namespace s3d /// @brief 指定したファイルのドラッグを開始します。 /// @param path ファイルパス void MakeDragDrop(FilePathView path); + + /// @brief 指定したファイルのドラッグを開始します。 + /// @param paths ファイルパスの配列 + void MakeDragDrop(const Array& paths); } # endif diff --git a/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.cpp b/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.cpp index 6a482bdfb..9b33a64da 100644 --- a/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.cpp +++ b/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.cpp @@ -155,7 +155,7 @@ namespace s3d return dropped; } - void CDragDrop::makeDragDrop(const FilePathView) + void CDragDrop::makeDragDrop(const Array&) { // [Siv3D ToDo] } diff --git a/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.hpp b/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.hpp index d7276194a..1d36dd3c9 100644 --- a/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.hpp +++ b/Siv3D/src/Siv3D-Platform/Linux/Siv3D/DragDrop/CDragDrop.hpp @@ -42,7 +42,7 @@ namespace s3d Array getDroppedText() override; - void makeDragDrop(FilePathView path) override; + void makeDragDrop(const Array& paths) override; // // Linux diff --git a/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.cpp b/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.cpp index afdc75e8c..708a7e4f5 100644 --- a/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.cpp +++ b/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.cpp @@ -165,7 +165,7 @@ namespace s3d return dropped; } - void CDragDrop::makeDragDrop(const FilePathView path) + void CDragDrop::makeDragDrop(const Array&) { // [Siv3D ToDo] } diff --git a/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.hpp b/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.hpp index d7276194a..1d36dd3c9 100644 --- a/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.hpp +++ b/Siv3D/src/Siv3D-Platform/Web/Siv3D/DragDrop/CDragDrop.hpp @@ -42,7 +42,7 @@ namespace s3d Array getDroppedText() override; - void makeDragDrop(FilePathView path) override; + void makeDragDrop(const Array& paths) override; // // Linux diff --git a/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.cpp b/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.cpp index e213dd78c..1c3d9c0e6 100644 --- a/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.cpp +++ b/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.cpp @@ -670,12 +670,21 @@ namespace s3d } }; - static void BeginDrop(IDataObject** lpDataObejct, IDropSource** lpDropSource, const FilePath& path) + static void BeginDrop(IDataObject** lpDataObejct, IDropSource** lpDropSource, const Array& paths) { - std::wstring pathW = (FileSystem::FullPath(path)).toWstr(); - pathW.push_back(L'\0'); - pathW.push_back(L'\0'); - const size_t path_size_bytes = (sizeof(wchar_t) * pathW.size()); + // must be double null terminated + std::wstring data; + { + for (const auto& path : paths) + { + data += (FileSystem::FullPath(path)).toWstr(); + data.push_back(L'\0'); + } + + data.push_back(L'\0'); + } + + const size_t data_size_bytes = (sizeof(wchar_t) * data.size()); FORMATETC formatetc; formatetc.cfFormat = CF_HDROP; @@ -687,14 +696,14 @@ namespace s3d STGMEDIUM medium { .tymed = TYMED_HGLOBAL, - .hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(DROPFILES) + path_size_bytes) + .hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(DROPFILES) + data_size_bytes) }; if (void* p = ::GlobalLock(medium.hGlobal)) { ((DROPFILES*)p)->pFiles = sizeof(DROPFILES); ((DROPFILES*)p)->fWide = true; - std::memcpy((char*)p + sizeof(DROPFILES), pathW.data(), path_size_bytes); + std::memcpy((char*)p + sizeof(DROPFILES), data.data(), data_size_bytes); ::GlobalUnlock(medium.hGlobal); } @@ -818,27 +827,27 @@ namespace s3d return dropped; } - void CDragDrop::makeDragDrop(const FilePathView path) + void CDragDrop::makeDragDrop(const Array& paths) { std::lock_guard lock{ m_mutex }; - m_newDragPath = path; + m_newDragPaths = paths; } void CDragDrop::process() { - FilePath path; + Array paths; { std::lock_guard lock{ m_mutex }; - if (m_newDragPath) + if (m_newDragPaths) { - path.swap(m_newDragPath); + paths.swap(m_newDragPaths); } } - if (not path) + if (not paths) { return; } @@ -847,7 +856,7 @@ namespace s3d ComPtr dataObject; ComPtr dropSource; - detail::BeginDrop(&dataObject, &dropSource, path); + detail::BeginDrop(&dataObject, &dropSource, paths); DWORD dropEffect; HRESULT hr = ::DoDragDrop(dataObject.Get(), dropSource.Get(), DROPEFFECT_MOVE | DROPEFFECT_COPY, &dropEffect); diff --git a/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.hpp b/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.hpp index 1c8e43d2e..a4f493de6 100644 --- a/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.hpp +++ b/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/DragDrop/CDragDrop.hpp @@ -49,7 +49,7 @@ namespace s3d Array getDroppedText() override; - void makeDragDrop(FilePathView path) override; + void makeDragDrop(const Array& paths) override; void process(); @@ -73,7 +73,7 @@ namespace s3d // std::mutex m_mutex; - FilePath m_newDragPath; + Array m_newDragPaths; // ////////// }; diff --git a/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.cpp b/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.cpp index 8334e6e66..ce03cb178 100644 --- a/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.cpp +++ b/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.cpp @@ -170,7 +170,7 @@ namespace s3d return dropped; } - void CDragDrop::makeDragDrop(const FilePathView) + void CDragDrop::makeDragDrop(const Array&) { // [Siv3D ToDo] } diff --git a/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.hpp b/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.hpp index a143ed767..300762783 100644 --- a/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.hpp +++ b/Siv3D/src/Siv3D-Platform/macOS/Siv3D/DragDrop/CDragDrop.hpp @@ -42,7 +42,7 @@ namespace s3d Array getDroppedText() override; - void makeDragDrop(FilePathView path) override; + void makeDragDrop(const Array& paths) override; // // macOS diff --git a/Siv3D/src/Siv3D/DragDrop/IDragDrop.hpp b/Siv3D/src/Siv3D/DragDrop/IDragDrop.hpp index 9ce3c731c..3dd7e641f 100644 --- a/Siv3D/src/Siv3D/DragDrop/IDragDrop.hpp +++ b/Siv3D/src/Siv3D/DragDrop/IDragDrop.hpp @@ -43,6 +43,6 @@ namespace s3d virtual Array getDroppedText() = 0; - virtual void makeDragDrop(FilePathView path) = 0; + virtual void makeDragDrop(const Array& paths) = 0; }; } diff --git a/Siv3D/src/Siv3D/DragDrop/SivDragDrop.cpp b/Siv3D/src/Siv3D/DragDrop/SivDragDrop.cpp index 65db46959..153361dbb 100644 --- a/Siv3D/src/Siv3D/DragDrop/SivDragDrop.cpp +++ b/Siv3D/src/Siv3D/DragDrop/SivDragDrop.cpp @@ -64,7 +64,14 @@ namespace s3d { void MakeDragDrop(const FilePathView path) { - SIV3D_ENGINE(DragDrop)->makeDragDrop(path); + const Array paths = { FilePath{ path } }; + + SIV3D_ENGINE(DragDrop)->makeDragDrop(paths); + } + + void MakeDragDrop(const Array& paths) + { + SIV3D_ENGINE(DragDrop)->makeDragDrop(paths); } }