database_editor.vala 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * Copyright (c) 2012-2025 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. namespace Crown
  6. {
  7. public class DatabaseEditor
  8. {
  9. public const GLib.ActionEntry[] actions =
  10. {
  11. { "undo", on_undo, null, null },
  12. { "redo", on_redo, null, null },
  13. { "duplicate", on_duplicate, null, null },
  14. { "delete", on_delete, null, null },
  15. { "add", on_add, "(ss)", null },
  16. };
  17. public UndoRedo _undo_redo;
  18. public Database _database;
  19. public Gee.ArrayList<Guid?> _selection;
  20. public GLib.SimpleActionGroup _action_group;
  21. public signal void undo(int action_id);
  22. public signal void redo(int action_id);
  23. public signal void selection_changed();
  24. public DatabaseEditor(Project project, uint32 undo_redo_size)
  25. {
  26. _action_group = new GLib.SimpleActionGroup();
  27. _action_group.add_action_entries(actions, this);
  28. _undo_redo = new UndoRedo(undo_redo_size);
  29. _database = new Database(project, _undo_redo);
  30. _selection = new Gee.ArrayList<Guid?>(Guid.equal_func);
  31. }
  32. public void load_types()
  33. {
  34. create_object_types(_database);
  35. }
  36. public void on_undo(GLib.SimpleAction action, GLib.Variant? param)
  37. {
  38. int id = _database.undo();
  39. if (id != -1)
  40. undo(id);
  41. }
  42. public void on_redo(GLib.SimpleAction action, GLib.Variant? param)
  43. {
  44. int id = _database.redo();
  45. if (id != -1)
  46. redo(id);
  47. }
  48. public void on_duplicate(GLib.SimpleAction action, GLib.Variant? param)
  49. {
  50. if (_selection.size == 0)
  51. return;
  52. Guid?[] ids = _selection.to_array();
  53. Guid?[] new_ids = new Guid?[ids.length];
  54. for (int i = 0; i < new_ids.length; ++i)
  55. new_ids[i] = Guid.new_guid();
  56. for (int i = 0; i < ids.length; ++i)
  57. _database.duplicate_and_add_to_set(ids[i], new_ids[i]);
  58. _database.add_restore_point((int)ActionType.CREATE_OBJECTS, new_ids);
  59. selection_set(new_ids);
  60. }
  61. public void on_delete(GLib.SimpleAction action, GLib.Variant? param)
  62. {
  63. if (_selection.size == 0)
  64. return;
  65. Guid?[] ids = _selection.to_array();
  66. foreach (Guid id in ids) {
  67. _selection.remove(id);
  68. _database.destroy(id);
  69. }
  70. selection_changed();
  71. _database.add_restore_point((int)ActionType.DESTROY_OBJECTS, ids);
  72. }
  73. public void on_add(GLib.SimpleAction action, GLib.Variant? param)
  74. {
  75. Guid object_id = Guid.parse((string)param.get_child_value(0));
  76. string set_name = (string)param.get_child_value(1);
  77. StringId64 object_type = StringId64(_database.object_type(object_id));
  78. unowned PropertyDefinition[] properties = _database.object_definition(object_type);
  79. int i;
  80. for (i = 0; i < properties.length; ++i) {
  81. unowned PropertyDefinition p = properties[i];
  82. if (p.name == set_name)
  83. break;
  84. }
  85. if (i != properties.length) {
  86. string obj_type_name = _database.type_name(properties[i].object_type);
  87. Guid new_obj = Guid.new_guid();
  88. _database.create(new_obj, obj_type_name);
  89. _database.add_to_set(object_id, properties[i].name, new_obj);
  90. _database.add_restore_point((int)ActionType.CREATE_OBJECTS, { new_obj });
  91. }
  92. }
  93. public void clear_selection()
  94. {
  95. _selection.clear();
  96. selection_changed();
  97. }
  98. public void selection_read(Guid?[] ids)
  99. {
  100. _selection.clear();
  101. _selection.add_all_array(ids);
  102. }
  103. public void selection_set(Guid?[] ids)
  104. {
  105. selection_read(ids);
  106. selection_changed();
  107. }
  108. public void send_selection(RuntimeInstance runtime)
  109. {
  110. Guid?[] ids = _selection.to_array();
  111. runtime.send_script(LevelEditorApi.selection_set(ids));
  112. }
  113. }
  114. } /* namespace Crown */