2
0

database_editor.vala 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. { "delete", on_delete, "(ss)", null },
  14. { "rename", on_rename, "(ss)", null },
  15. { "add", on_add, "(ss)", null },
  16. };
  17. public UndoRedo _undo_redo;
  18. public Database _database;
  19. public GLib.SimpleActionGroup _action_group;
  20. public signal void undo(int action_id);
  21. public signal void redo(int action_id);
  22. public DatabaseEditor(Project project, uint32 undo_redo_size)
  23. {
  24. _action_group = new GLib.SimpleActionGroup();
  25. _action_group.add_action_entries(actions, this);
  26. _undo_redo = new UndoRedo(undo_redo_size);
  27. _database = new Database(project, _undo_redo);
  28. }
  29. public void load_types()
  30. {
  31. create_object_types(_database);
  32. }
  33. public void on_undo(GLib.SimpleAction action, GLib.Variant? param)
  34. {
  35. int id = _database.undo();
  36. if (id != -1)
  37. undo(id);
  38. }
  39. public void on_redo(GLib.SimpleAction action, GLib.Variant? param)
  40. {
  41. int id = _database.redo();
  42. if (id != -1)
  43. redo(id);
  44. }
  45. public void on_delete(GLib.SimpleAction action, GLib.Variant? param)
  46. {
  47. Guid object_id = Guid.parse((string)param.get_child_value(0));
  48. string set_name = (string)param.get_child_value(1);
  49. _database.remove_from_set(_database.object_owner(object_id), set_name, object_id);
  50. _database.destroy(object_id);
  51. _database.add_restore_point((int)ActionType.DESTROY_OBJECTS, { object_id });
  52. }
  53. public void do_rename(Guid object_id, string new_name)
  54. {
  55. if (new_name != "" && _database.object_name(object_id) != new_name) {
  56. _database.set_object_name(object_id, new_name);
  57. _database.add_restore_point((int)ActionType.CHANGE_OBJECTS, new Guid?[] { object_id });
  58. }
  59. }
  60. public void on_rename(GLib.SimpleAction action, GLib.Variant? param)
  61. {
  62. Guid object_id = Guid.parse((string)param.get_child_value(0));
  63. string new_name = (string)param.get_child_value(1);
  64. if (new_name != "") {
  65. do_rename(object_id, new_name);
  66. } else {
  67. Gtk.Dialog dg = new Gtk.Dialog.with_buttons("New Name"
  68. , null
  69. , Gtk.DialogFlags.MODAL
  70. , "Cancel"
  71. , Gtk.ResponseType.CANCEL
  72. , "Ok"
  73. , Gtk.ResponseType.OK
  74. , null
  75. );
  76. InputString sb = new InputString();
  77. sb.activate.connect(() => { dg.response(Gtk.ResponseType.OK); });
  78. sb.value = _database.object_name(object_id);
  79. dg.get_content_area().add(sb);
  80. dg.response.connect((response_id) => {
  81. if (response_id == Gtk.ResponseType.OK)
  82. do_rename(object_id, sb.text.strip());
  83. dg.destroy();
  84. });
  85. dg.show_all();
  86. }
  87. }
  88. public void on_add(GLib.SimpleAction action, GLib.Variant? param)
  89. {
  90. Guid object_id = Guid.parse((string)param.get_child_value(0));
  91. string set_name = (string)param.get_child_value(1);
  92. StringId64 object_type = StringId64(_database.object_type(object_id));
  93. unowned PropertyDefinition[] properties = _database.object_definition(object_type);
  94. int i;
  95. for (i = 0; i < properties.length; ++i) {
  96. unowned PropertyDefinition p = properties[i];
  97. if (p.name == set_name)
  98. break;
  99. }
  100. if (i != properties.length) {
  101. string obj_type_name = _database.object_type_name(properties[i].object_type);
  102. Guid new_obj = Guid.new_guid();
  103. _database.create(new_obj, obj_type_name);
  104. _database.add_to_set(object_id, properties[i].name, new_obj);
  105. _database.add_restore_point((int)ActionType.CREATE_OBJECTS, { new_obj });
  106. }
  107. }
  108. }
  109. } /* namespace Crown */