diff --git a/radiant/ui/einspector/EntityInspector.cpp b/radiant/ui/einspector/EntityInspector.cpp index 6273caf155..337f518bd6 100644 --- a/radiant/ui/einspector/EntityInspector.cpp +++ b/radiant/ui/einspector/EntityInspector.cpp @@ -379,6 +379,15 @@ void EntityInspector::createContextMenu() std::bind(&EntityInspector::_onPasteKey, this), std::bind(&EntityInspector::_testPasteKey, this) ); + + _contextMenu->addSeparator(); + + _contextMenu->addItem( + new wxutil::StockIconTextMenuItem(_("Reject selected Changes"), wxART_UNDO), + std::bind(&EntityInspector::_onRejectMergeAction, this), + std::bind(&EntityInspector::_testRejectMergeAction, this), + [] { return GlobalMapModule().getEditMode() == IMap::EditMode::Merge; } + ); } void EntityInspector::onMainFrameConstructed() @@ -935,6 +944,40 @@ bool EntityInspector::_testPasteKey() return !_clipboard.empty() && canUpdateEntity(); } +void EntityInspector::_onRejectMergeAction() +{ + +} + +bool EntityInspector::_testRejectMergeAction() +{ + if (GlobalMapModule().getEditMode() != IMap::EditMode::Merge) + { + return false; + } + + wxDataViewItemArray selectedItems; + _keyValueTreeView->GetSelections(selectedItems); + + for (const wxDataViewItem& item : selectedItems) + { + wxutil::TreeModel::Row row(item, *_kvStore); + + if (isItemAffecedByMergeOperation(row)) + { + return true; // we have at least one non-inherited value that is not "classname" + } + } + + return false; +} + +bool EntityInspector::isItemAffecedByMergeOperation(const wxutil::TreeModel::Row& row) +{ + auto key = row[_columns.name].getString().ToStdString(); + return _mergeActions.count(key) > 0; +} + // wxWidget callbacks void EntityInspector::_onContextMenu(wxDataViewEvent& ev) diff --git a/radiant/ui/einspector/EntityInspector.h b/radiant/ui/einspector/EntityInspector.h index 538f565563..02626cfffc 100644 --- a/radiant/ui/einspector/EntityInspector.h +++ b/radiant/ui/einspector/EntityInspector.h @@ -173,16 +173,19 @@ class EntityInspector : void _onCopyKey(); void _onCutKey(); void _onPasteKey(); + void _onRejectMergeAction(); bool _testAddKey(); bool _testDeleteKey(); bool _testCopyKey(); bool _testCutKey(); bool _testPasteKey(); + bool _testRejectMergeAction(); // Shared by cut and delete keys bool _testNonEmptyAndDeletableSelection(); bool isItemDeletable(const wxutil::TreeModel::Row& row); + bool isItemAffecedByMergeOperation(const wxutil::TreeModel::Row& row); // callbacks void _onEntryActivate(wxCommandEvent& ev);