feat: UI elements for key combinations

This commit is contained in:
Sara Gerretsen 2025-12-16 15:46:21 +01:00
parent ab300878cf
commit c668771696
15 changed files with 415 additions and 33 deletions

View file

@ -40,13 +40,15 @@ String const TerrainMeshEditor::sig_selection_changed{ "selection_changed" };
void TerrainMeshEditor::_bind_methods() {
BIND_HPROPERTY(Variant::OBJECT, point_primitive_object, PROPERTY_HINT_RESOURCE_TYPE, "PackedScene");
ClassDB::bind_method(D_METHOD("save_data"), &self_type::save_data);
ClassDB::bind_method(D_METHOD("save_data_as"), &self_type::save_data_as);
BIND_HPROPERTY(Variant::OBJECT, current_selected, PROPERTY_HINT_RESOURCE_TYPE, "TerrainPrimitive");
BIND_HPROPERTY(Variant::OBJECT, new_file_data, PROPERTY_HINT_RESOURCE_TYPE, "SaveData");
ADD_SIGNAL(MethodInfo(sig_selection_changed, PropertyInfo(Variant::OBJECT, "new_selection", PROPERTY_HINT_RESOURCE_TYPE, "TerrainPrimitive")));
}
void TerrainMeshEditor::ready() {
connect(sig_primitive_list_changed, callable_mp(this, &self_type::on_primitive_list_changed));
on_primitive_list_changed(get_primitives());
load_new();
if (FileDialog * dialog{ memnew(FileDialog) }) {
this->file_dialog = dialog;
add_child(dialog);
@ -96,6 +98,13 @@ void TerrainMeshEditor::on_save_file_selected(String path) {
}
}
void TerrainMeshEditor::load_new() {
this->data = this->new_file_data->duplicate(true);
this->set_primitives(this->data->get_primitives().duplicate(true));
this->data->set_save_path("");
EditHistory::get_singleton()->clear_history();
}
void TerrainMeshEditor::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
@ -121,9 +130,7 @@ void TerrainMeshEditor::unhandled_input(Ref<InputEvent> const &event) {
case Key::S:
if (key->is_shift_pressed() && key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled();
this->file_dialog->set_file_mode(FileDialog::FILE_MODE_SAVE_FILE);
this->file_dialog->set_ok_button_text("Save");
this->file_dialog->popup_file_dialog();
save_data_as();
} else if (key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled();
save_data();
@ -146,6 +153,12 @@ void TerrainMeshEditor::unhandled_input(Ref<InputEvent> const &event) {
EditHistory::get_singleton()->undo();
}
break;
case Key::N:
if (key->is_command_or_control_pressed()) {
get_viewport()->set_input_as_handled();
load_new();
}
break;
}
}
@ -155,15 +168,27 @@ void TerrainMeshEditor::save_data() {
return;
}
if (this->data->get_save_path().is_empty()) {
this->file_dialog->set_file_mode(FileDialog::FILE_MODE_SAVE_FILE);
this->file_dialog->set_ok_button_text("Save");
this->file_dialog->popup_file_dialog();
save_data_as();
} else {
this->data->set_primitives(get_primitives());
this->data->write_to_file();
}
}
void TerrainMeshEditor::save_data_as() {
this->file_dialog->set_file_mode(FileDialog::FILE_MODE_SAVE_FILE);
this->file_dialog->set_ok_button_text("Save");
this->file_dialog->popup_file_dialog();
}
void TerrainMeshEditor::set_new_file_data(Ref<SaveData> data) {
this->new_file_data = data;
}
Ref<SaveData> TerrainMeshEditor::get_new_file_data() const {
return this->new_file_data;
}
void TerrainMeshEditor::set_current_selected(Ref<TerrainPrimitive> primitive) {
this->current_selected = primitive;
emit_signal(sig_selection_changed, primitive);