From e5fffb0ab8546d8b0b886e3b271ee5a11b392089 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Wed, 18 Sep 2024 20:22:36 +0800 Subject: [PATCH 1/2] Add quick action "Delete layer" --- src/game/editor/editor.h | 1 + src/game/editor/popups.cpp | 18 ++---------------- src/game/editor/quick_actions.cpp | 23 +++++++++++++++++++++++ src/game/editor/quick_actions.h | 13 +++++++++++++ 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index 86521f561..ef85855c5 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -331,6 +331,7 @@ public: void AddTileLayer(); void AddFrontLayer(); void AddQuadsLayer(); + void DeleteSelectedLayer(); void LayerSelectImage(); bool IsNonGameTileLayerSelected() const; void MapDetails(); diff --git a/src/game/editor/popups.cpp b/src/game/editor/popups.cpp index e251ff240..b74f77bdc 100644 --- a/src/game/editor/popups.cpp +++ b/src/game/editor/popups.cpp @@ -708,23 +708,9 @@ CUi::EPopupMenuFunctionResult CEditor::PopupLayer(void *pContext, CUIRect View, { CUIRect DeleteButton; View.HSplitBottom(12.0f, &View, &DeleteButton); - static int s_DeleteButton = 0; - if(pEditor->DoButton_Editor(&s_DeleteButton, "Delete layer", 0, &DeleteButton, 0, "Deletes the layer")) + if(pEditor->DoButton_Editor(&pEditor->m_QuickActionDeleteLayer, pEditor->m_QuickActionDeleteLayer.Label(), 0, &DeleteButton, 0, pEditor->m_QuickActionDeleteLayer.Description())) { - pEditor->m_EditorHistory.RecordAction(std::make_shared(pEditor, pEditor->m_SelectedGroup, pEditor->m_vSelectedLayers[0])); - - if(pCurrentLayer == pEditor->m_Map.m_pFrontLayer) - pEditor->m_Map.m_pFrontLayer = nullptr; - if(pCurrentLayer == pEditor->m_Map.m_pTeleLayer) - pEditor->m_Map.m_pTeleLayer = nullptr; - if(pCurrentLayer == pEditor->m_Map.m_pSpeedupLayer) - pEditor->m_Map.m_pSpeedupLayer = nullptr; - if(pCurrentLayer == pEditor->m_Map.m_pSwitchLayer) - pEditor->m_Map.m_pSwitchLayer = nullptr; - if(pCurrentLayer == pEditor->m_Map.m_pTuneLayer) - pEditor->m_Map.m_pTuneLayer = nullptr; - pEditor->m_Map.m_vpGroups[pEditor->m_SelectedGroup]->DeleteLayer(pEditor->m_vSelectedLayers[0]); - + pEditor->m_QuickActionDeleteLayer.Call(); return CUi::POPUP_CLOSE_CURRENT; } } diff --git a/src/game/editor/quick_actions.cpp b/src/game/editor/quick_actions.cpp index ce302e287..e7b6abf30 100644 --- a/src/game/editor/quick_actions.cpp +++ b/src/game/editor/quick_actions.cpp @@ -135,3 +135,26 @@ void CEditor::MapDetails() PopupMapInfo); Ui()->SetActiveItem(nullptr); } + +void CEditor::DeleteSelectedLayer() +{ + std::shared_ptr pCurrentLayer = GetSelectedLayer(0); + if(!pCurrentLayer) + return; + if(m_Map.m_pGameLayer == pCurrentLayer) + return; + + m_EditorHistory.RecordAction(std::make_shared(this, m_SelectedGroup, m_vSelectedLayers[0])); + + if(pCurrentLayer == m_Map.m_pFrontLayer) + m_Map.m_pFrontLayer = nullptr; + if(pCurrentLayer == m_Map.m_pTeleLayer) + m_Map.m_pTeleLayer = nullptr; + if(pCurrentLayer == m_Map.m_pSpeedupLayer) + m_Map.m_pSpeedupLayer = nullptr; + if(pCurrentLayer == m_Map.m_pSwitchLayer) + m_Map.m_pSwitchLayer = nullptr; + if(pCurrentLayer == m_Map.m_pTuneLayer) + m_Map.m_pTuneLayer = nullptr; + m_Map.m_vpGroups[m_SelectedGroup]->DeleteLayer(m_vSelectedLayers[0]); +} diff --git a/src/game/editor/quick_actions.h b/src/game/editor/quick_actions.h index 476d81246..0541e3ca0 100644 --- a/src/game/editor/quick_actions.h +++ b/src/game/editor/quick_actions.h @@ -278,6 +278,19 @@ REGISTER_QUICK_ACTION( [&]() -> bool { return m_ShowTileInfo == SHOW_TILE_HEXADECIMAL; }, DEFAULT_BTN, "[Ctrl+Shift+I] Show tile information in hexadecimal.") +REGISTER_QUICK_ACTION( + DeleteLayer, + "Delete layer", + [&]() { DeleteSelectedLayer(); }, + [&]() -> bool { + std::shared_ptr pCurrentLayer = GetSelectedLayer(0); + if(!pCurrentLayer) + return true; + return m_Map.m_pGameLayer == pCurrentLayer; + }, + ALWAYS_FALSE, + DEFAULT_BTN, + "Deletes the layer.") REGISTER_QUICK_ACTION( Pipette, "Pipette", From 6a2afb6f60d9c9457e0c642ee42529f6ac883895 Mon Sep 17 00:00:00 2001 From: ChillerDragon Date: Wed, 18 Sep 2024 20:38:11 +0800 Subject: [PATCH 2/2] Select previous layer after deletion --- src/game/editor/editor.cpp | 91 +++++++++++++++++-------------- src/game/editor/editor.h | 3 + src/game/editor/quick_actions.cpp | 2 + 3 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 3cd8faa2a..e3736ab89 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -738,6 +738,54 @@ std::pair CEditor::EnvGetSelectedTimeAndValue() const return std::pair{CurrentTime, CurrentValue}; } +void CEditor::SelectNextLayer() +{ + int CurrentLayer = 0; + for(const auto &Selected : m_vSelectedLayers) + CurrentLayer = maximum(Selected, CurrentLayer); + SelectLayer(CurrentLayer); + + if(m_vSelectedLayers[0] < (int)m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1) + { + SelectLayer(m_vSelectedLayers[0] + 1); + } + else + { + for(size_t Group = m_SelectedGroup + 1; Group < m_Map.m_vpGroups.size(); Group++) + { + if(!m_Map.m_vpGroups[Group]->m_vpLayers.empty()) + { + SelectLayer(0, Group); + break; + } + } + } +} + +void CEditor::SelectPreviousLayer() +{ + int CurrentLayer = std::numeric_limits::max(); + for(const auto &Selected : m_vSelectedLayers) + CurrentLayer = minimum(Selected, CurrentLayer); + SelectLayer(CurrentLayer); + + if(m_vSelectedLayers[0] > 0) + { + SelectLayer(m_vSelectedLayers[0] - 1); + } + else + { + for(int Group = m_SelectedGroup - 1; Group >= 0; Group--) + { + if(!m_Map.m_vpGroups[Group]->m_vpLayers.empty()) + { + SelectLayer(m_Map.m_vpGroups[Group]->m_vpLayers.size() - 1, Group); + break; + } + } + } +} + bool CEditor::CallbackOpenMap(const char *pFileName, int StorageType, void *pUser) { CEditor *pEditor = (CEditor *)pUser; @@ -4195,26 +4243,7 @@ void CEditor::RenderLayers(CUIRect LayersBox) } else { - int CurrentLayer = 0; - for(const auto &Selected : m_vSelectedLayers) - CurrentLayer = maximum(Selected, CurrentLayer); - SelectLayer(CurrentLayer); - - if(m_vSelectedLayers[0] < (int)m_Map.m_vpGroups[m_SelectedGroup]->m_vpLayers.size() - 1) - { - SelectLayer(m_vSelectedLayers[0] + 1); - } - else - { - for(size_t Group = m_SelectedGroup + 1; Group < m_Map.m_vpGroups.size(); Group++) - { - if(!m_Map.m_vpGroups[Group]->m_vpLayers.empty()) - { - SelectLayer(0, Group); - break; - } - } - } + SelectNextLayer(); } s_ScrollToSelectionNext = true; } @@ -4227,27 +4256,9 @@ void CEditor::RenderLayers(CUIRect LayersBox) } else { - int CurrentLayer = std::numeric_limits::max(); - for(const auto &Selected : m_vSelectedLayers) - CurrentLayer = minimum(Selected, CurrentLayer); - SelectLayer(CurrentLayer); - - if(m_vSelectedLayers[0] > 0) - { - SelectLayer(m_vSelectedLayers[0] - 1); - } - else - { - for(int Group = m_SelectedGroup - 1; Group >= 0; Group--) - { - if(!m_Map.m_vpGroups[Group]->m_vpLayers.empty()) - { - SelectLayer(m_Map.m_vpGroups[Group]->m_vpLayers.size() - 1, Group); - break; - } - } - } + SelectPreviousLayer(); } + s_ScrollToSelectionNext = true; } diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index ef85855c5..429c97fdf 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -324,6 +324,9 @@ public: const CMapView *MapView() const { return &m_MapView; } CLayerSelector *LayerSelector() { return &m_LayerSelector; } + void SelectNextLayer(); + void SelectPreviousLayer(); + void FillGameTiles(EGameTileOp FillTile) const; bool CanFillGameTiles() const; void AddQuadOrSound(); diff --git a/src/game/editor/quick_actions.cpp b/src/game/editor/quick_actions.cpp index e7b6abf30..a06a81eba 100644 --- a/src/game/editor/quick_actions.cpp +++ b/src/game/editor/quick_actions.cpp @@ -157,4 +157,6 @@ void CEditor::DeleteSelectedLayer() if(pCurrentLayer == m_Map.m_pTuneLayer) m_Map.m_pTuneLayer = nullptr; m_Map.m_vpGroups[m_SelectedGroup]->DeleteLayer(m_vSelectedLayers[0]); + + SelectPreviousLayer(); }