| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * Copyright (c) 2012-2025 Daniele Bartolini et al.
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
- namespace Crown
- {
- public class DatabaseEditor
- {
- public const GLib.ActionEntry[] actions =
- {
- { "undo", on_undo, null, null },
- { "redo", on_redo, null, null },
- { "duplicate", on_duplicate, null, null },
- { "delete", on_delete, null, null },
- { "add", on_add, "(ss)", null },
- };
- public UndoRedo _undo_redo;
- public Database _database;
- public Gee.ArrayList<Guid?> _selection;
- public GLib.SimpleActionGroup _action_group;
- public signal void undo(int action_id);
- public signal void redo(int action_id);
- public signal void selection_changed();
- public DatabaseEditor(Project project, uint32 undo_redo_size)
- {
- _action_group = new GLib.SimpleActionGroup();
- _action_group.add_action_entries(actions, this);
- _undo_redo = new UndoRedo(undo_redo_size);
- _database = new Database(project, _undo_redo);
- _selection = new Gee.ArrayList<Guid?>(Guid.equal_func);
- }
- public void load_types()
- {
- create_object_types(_database);
- }
- public void on_undo(GLib.SimpleAction action, GLib.Variant? param)
- {
- int id = _database.undo();
- if (id != -1)
- undo(id);
- }
- public void on_redo(GLib.SimpleAction action, GLib.Variant? param)
- {
- int id = _database.redo();
- if (id != -1)
- redo(id);
- }
- public void on_duplicate(GLib.SimpleAction action, GLib.Variant? param)
- {
- if (_selection.size == 0)
- return;
- Guid?[] ids = _selection.to_array();
- Guid?[] new_ids = new Guid?[ids.length];
- for (int i = 0; i < new_ids.length; ++i)
- new_ids[i] = Guid.new_guid();
- for (int i = 0; i < ids.length; ++i)
- _database.duplicate_and_add_to_set(ids[i], new_ids[i]);
- _database.add_restore_point((int)ActionType.CREATE_OBJECTS, new_ids);
- selection_set(new_ids);
- }
- public void on_delete(GLib.SimpleAction action, GLib.Variant? param)
- {
- if (_selection.size == 0)
- return;
- Guid?[] ids = _selection.to_array();
- foreach (Guid id in ids) {
- _selection.remove(id);
- _database.destroy(id);
- }
- selection_changed();
- _database.add_restore_point((int)ActionType.DESTROY_OBJECTS, ids);
- }
- public void on_add(GLib.SimpleAction action, GLib.Variant? param)
- {
- Guid object_id = Guid.parse((string)param.get_child_value(0));
- string set_name = (string)param.get_child_value(1);
- StringId64 object_type = StringId64(_database.object_type(object_id));
- unowned PropertyDefinition[] properties = _database.object_definition(object_type);
- int i;
- for (i = 0; i < properties.length; ++i) {
- unowned PropertyDefinition p = properties[i];
- if (p.name == set_name)
- break;
- }
- if (i != properties.length) {
- string obj_type_name = _database.type_name(properties[i].object_type);
- Guid new_obj = Guid.new_guid();
- _database.create(new_obj, obj_type_name);
- _database.add_to_set(object_id, properties[i].name, new_obj);
- _database.add_restore_point((int)ActionType.CREATE_OBJECTS, { new_obj });
- }
- }
- public void clear_selection()
- {
- _selection.clear();
- selection_changed();
- }
- public void selection_read(Guid?[] ids)
- {
- _selection.clear();
- _selection.add_all_array(ids);
- }
- public void selection_set(Guid?[] ids)
- {
- selection_read(ids);
- selection_changed();
- }
- public void send_selection(RuntimeInstance runtime)
- {
- Guid?[] ids = _selection.to_array();
- runtime.send_script(LevelEditorApi.selection_set(ids));
- }
- }
- } /* namespace Crown */
|