From 5e923adcc9517bd595d910824f1ba376c751d641 Mon Sep 17 00:00:00 2001 From: dobrykafe <121701317+dobrykafe@users.noreply.github.com> Date: Sat, 26 Aug 2023 18:14:13 +0200 Subject: [PATCH] fix map drag and drop --- src/engine/client/client.cpp | 7 ++----- src/engine/editor.h | 1 + src/game/editor/editor.h | 5 +++++ src/game/editor/io.cpp | 21 +++++++++++++++++++++ src/game/editor/popups.cpp | 27 +++++++++++++++++++++++---- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index eaac7b945..960162c07 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -3120,11 +3120,8 @@ void CClient::Run() // handle pending map edits if(m_aCmdEditMap[0]) { - int Result = m_pEditor->Load(m_aCmdEditMap, IStorage::TYPE_ALL_OR_ABSOLUTE); - if(Result) - g_Config.m_ClEditor = true; - else - dbg_msg("editor", "editing passed map file '%s' failed", m_aCmdEditMap); + g_Config.m_ClEditor = true; + m_pEditor->HandleMapDrop(m_aCmdEditMap, IStorage::TYPE_ALL_OR_ABSOLUTE); m_aCmdEditMap[0] = 0; } diff --git a/src/engine/editor.h b/src/engine/editor.h index 290e81898..46d1d4e36 100644 --- a/src/engine/editor.h +++ b/src/engine/editor.h @@ -15,6 +15,7 @@ public: virtual void OnActivate() = 0; virtual void OnWindowResize() = 0; virtual bool HasUnsavedData() const = 0; + virtual void HandleMapDrop(const char *pFilename, int StorageType) = 0; virtual bool Load(const char *pFilename, int StorageType) = 0; virtual bool Save(const char *pFilename) = 0; virtual void UpdateMentions() = 0; diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index b32dfbb0a..8ddf3839a 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -523,6 +523,7 @@ public: // io bool Save(const char *pFilename); bool Load(const char *pFilename, int StorageType, const std::function &ErrorHandler); + void HandleMapDrop(const char *pFilename, int StorageType); void PerformSanityChecks(const std::function &ErrorHandler); // DDRace @@ -867,6 +868,7 @@ public: m_BrushColorEnabled = true; m_aFileName[0] = '\0'; + m_aFileNamePending[0] = '\0'; m_aFileSaveName[0] = '\0'; m_ValidSaveFilename = false; @@ -982,6 +984,7 @@ public: void Reset(bool CreateDefault = true); bool Save(const char *pFilename) override; bool Load(const char *pFilename, int StorageType) override; + void HandleMapDrop(const char *pFilename, int StorageType) override; bool Append(const char *pFilename, int StorageType); void LoadCurrentMap(); void Render(); @@ -1040,6 +1043,7 @@ public: bool m_BrushColorEnabled; char m_aFileName[IO_MAX_PATH_LENGTH]; + char m_aFileNamePending[IO_MAX_PATH_LENGTH]; char m_aFileSaveName[IO_MAX_PATH_LENGTH]; bool m_ValidSaveFilename; @@ -1048,6 +1052,7 @@ public: POPEVENT_EXIT = 0, POPEVENT_LOAD, POPEVENT_LOADCURRENT, + POPEVENT_LOADDROP, POPEVENT_NEW, POPEVENT_SAVE, POPEVENT_SAVE_COPY, diff --git a/src/game/editor/io.cpp b/src/game/editor/io.cpp index a5516e18a..a490a1952 100644 --- a/src/game/editor/io.cpp +++ b/src/game/editor/io.cpp @@ -426,6 +426,27 @@ bool CEditorMap::Save(const char *pFileName) return true; } +void CEditor::HandleMapDrop(const char *pFileName, int StorageType) +{ + m_Map.HandleMapDrop(pFileName, IStorage::TYPE_ALL_OR_ABSOLUTE); +} + +void CEditorMap::HandleMapDrop(const char *pFileName, int StorageType) +{ + if(m_pEditor->HasUnsavedData()) + { + str_copy(m_pEditor->m_aFileNamePending, pFileName); + m_pEditor->m_PopupEventType = CEditor::POPEVENT_LOADDROP; + m_pEditor->m_PopupEventActivated = true; + } + else + { + int Result = m_pEditor->Load(pFileName, IStorage::TYPE_ALL_OR_ABSOLUTE); + if(!Result) + dbg_msg("editor", "editing passed map file '%s' failed", pFileName); + } +} + bool CEditor::Load(const char *pFileName, int StorageType) { const auto &&ErrorHandler = [this](const char *pErrorMessage) { diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index 188a57dfe..0c2234d1f 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -1721,7 +1721,7 @@ CUI::EPopupMenuFunctionResult CEditor::PopupEvent(void *pContext, CUIRect View, pTitle = "Exit the editor"; pMessage = "The map contains unsaved data, you might want to save it before you exit the editor.\n\nContinue anyway?"; } - else if(pEditor->m_PopupEventType == POPEVENT_LOAD || pEditor->m_PopupEventType == POPEVENT_LOADCURRENT) + else if(pEditor->m_PopupEventType == POPEVENT_LOAD || pEditor->m_PopupEventType == POPEVENT_LOADCURRENT || pEditor->m_PopupEventType == POPEVENT_LOADDROP) { pTitle = "Load map"; pMessage = "The map contains unsaved data, you might want to save it before you load a new map.\n\nContinue anyway?"; @@ -1786,10 +1786,22 @@ CUI::EPopupMenuFunctionResult CEditor::PopupEvent(void *pContext, CUIRect View, if(pEditor->m_PopupEventType != POPEVENT_LARGELAYER && pEditor->m_PopupEventType != POPEVENT_PREVENTUNUSEDTILES && pEditor->m_PopupEventType != POPEVENT_IMAGEDIV16 && pEditor->m_PopupEventType != POPEVENT_IMAGE_MAX) { static int s_CancelButton = 0; - if(pEditor->DoButton_Editor(&s_CancelButton, "Cancel", 0, &Button, 0, nullptr)) + if(pEditor->m_PopupEventType == POPEVENT_LOADDROP) { - pEditor->m_PopupEventWasActivated = false; - return CUI::POPUP_CLOSE_CURRENT; + if(pEditor->DoButton_Editor(&s_CancelButton, "Cancel", 0, &Button, 0, nullptr)) + { + pEditor->m_aFileNamePending[0] = 0; + pEditor->m_PopupEventWasActivated = false; + return CUI::POPUP_CLOSE_CURRENT; + } + } + else + { + if(pEditor->DoButton_Editor(&s_CancelButton, "Cancel", 0, &Button, 0, nullptr)) + { + pEditor->m_PopupEventWasActivated = false; + return CUI::POPUP_CLOSE_CURRENT; + } } } @@ -1809,6 +1821,13 @@ CUI::EPopupMenuFunctionResult CEditor::PopupEvent(void *pContext, CUIRect View, { pEditor->LoadCurrentMap(); } + else if(pEditor->m_PopupEventType == POPEVENT_LOADDROP) + { + int Result = pEditor->Load(pEditor->m_aFileNamePending, IStorage::TYPE_ALL_OR_ABSOLUTE); + if(!Result) + dbg_msg("editor", "editing passed map file '%s' failed", pEditor->m_aFileNamePending); + pEditor->m_aFileNamePending[0] = 0; + } else if(pEditor->m_PopupEventType == POPEVENT_NEW) { pEditor->Reset();