fix: undo and redo both work

This commit is contained in:
Sara Gerretsen 2025-11-21 16:14:55 +01:00
parent e2926f7c3f
commit 07db1670c7
2 changed files with 37 additions and 23 deletions

View file

@ -1,5 +1,4 @@
#include "edit_history.h" #include "edit_history.h"
#include "macros.h"
EditHistory *EditHistory::singleton_instance{ nullptr }; EditHistory *EditHistory::singleton_instance{ nullptr };
@ -19,15 +18,15 @@ void EditHistory::push_action(Callable do_action, Callable undo_action) {
} }
void EditHistory::undo() { void EditHistory::undo() {
if (this->undo_count + 1 < this->history.size()) { if (this->undo_count < this->history.size()) {
this->undo_count++; this->undo_count++;
this->history[this->history.size() - this->undo_count].undo_action.call(); this->history[this->history.size() - this->undo_count].undo_action.call();
} }
} }
void EditHistory::redo() { void EditHistory::redo() {
if (this->undo_count > 1) { if (this->undo_count > 0) {
this->undo_count--;
this->history[this->history.size() - this->undo_count].do_action.call(); this->history[this->history.size() - this->undo_count].do_action.call();
this->undo_count--;
} }
} }

View file

@ -110,25 +110,40 @@ void TerrainMeshEditor::_notification(int what) {
void TerrainMeshEditor::unhandled_input(Ref<InputEvent> const &event) { void TerrainMeshEditor::unhandled_input(Ref<InputEvent> const &event) {
Ref<InputEventKey> key{ event }; Ref<InputEventKey> key{ event };
if (key.is_valid() && key->get_key_label() == Key::S && key->get_modifiers_mask() == (KeyModifierMask::SHIFT | KeyModifierMask::CTRL)) { if (!key.is_valid() || !key->is_pressed()) {
return;
}
switch (key->get_key_label()) {
default:
return;
case Key::S:
if (key->is_shift_pressed() && key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled(); get_viewport()->set_input_as_handled();
this->file_dialog->set_file_mode(FileDialog::FILE_MODE_SAVE_FILE); this->file_dialog->set_file_mode(FileDialog::FILE_MODE_SAVE_FILE);
this->file_dialog->set_ok_button_text("Save"); this->file_dialog->set_ok_button_text("Save");
this->file_dialog->popup_file_dialog(); this->file_dialog->popup_file_dialog();
} else if (key.is_valid() && key->get_key_label() == Key::S && key->get_modifiers_mask() == KeyModifierMask::CTRL) { } else if (key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled(); get_viewport()->set_input_as_handled();
save_data(); save_data();
} else if (key.is_valid() && key->get_key_label() == Key::O && key->get_modifiers_mask() == KeyModifierMask::CTRL) { }
break;
case Key::O:
if (key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled(); get_viewport()->set_input_as_handled();
this->file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE); this->file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_FILE);
this->file_dialog->set_ok_button_text("Open"); this->file_dialog->set_ok_button_text("Open");
this->file_dialog->popup_file_dialog(); this->file_dialog->popup_file_dialog();
} else if (key.is_valid() && key->get_key_label() == Key::Z && key->get_modifiers_mask() == KeyModifierMask::CTRL) { }
get_viewport()->set_input_as_handled(); break;
EditHistory::get_singleton()->undo(); case Key::Z:
} else if (key.is_valid() && key->get_key_label() == Key::Z && key->get_modifiers_mask() == (KeyModifierMask::CTRL | KeyModifierMask::SHIFT)) { if (key->is_shift_pressed() && key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled(); get_viewport()->set_input_as_handled();
EditHistory::get_singleton()->redo(); EditHistory::get_singleton()->redo();
} else if (key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled();
EditHistory::get_singleton()->undo();
}
break;
} }
} }