level_layers_tree_view.vala 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright (c) 2012-2024 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. using Gee;
  6. using Gtk;
  7. namespace Crown
  8. {
  9. public class LevelLayersTreeView : Gtk.Box
  10. {
  11. private enum ItemFlags
  12. {
  13. VISIBLE = 1,
  14. LOCKED = 2
  15. }
  16. // Data
  17. private Level _level;
  18. private Database _db;
  19. // Widgets
  20. private EntrySearch _filter_entry;
  21. private Gtk.ListStore _list_store;
  22. private Gtk.TreeModelFilter _tree_filter;
  23. private Gtk.TreeView _tree_view;
  24. private Gtk.TreeSelection _tree_selection;
  25. private Gtk.ScrolledWindow _scrolled_window;
  26. public LevelLayersTreeView(Database db, Level level)
  27. {
  28. Object(orientation: Gtk.Orientation.VERTICAL, spacing: 0);
  29. // Data
  30. _level = level;
  31. _db = db;
  32. // Widgets
  33. _filter_entry = new EntrySearch();
  34. _filter_entry.set_placeholder_text("Search...");
  35. _filter_entry.search_changed.connect(on_filter_entry_text_changed);
  36. _list_store = new Gtk.ListStore(3, typeof(string), typeof(string), typeof(string));
  37. _list_store.insert_with_values(null, -1
  38. , 0, "layer-visible"
  39. , 1, "layer-locked"
  40. , 2, "Background"
  41. , -1
  42. );
  43. _list_store.insert_with_values(null, -1
  44. , 0, "layer-visible"
  45. , 1, "layer-locked"
  46. , 2, "Default"
  47. , -1
  48. );
  49. _tree_filter = new Gtk.TreeModelFilter(_list_store, null);
  50. _tree_filter.set_visible_func(filter_tree);
  51. _tree_view = new Gtk.TreeView();
  52. _tree_view.insert_column_with_attributes(-1, "Visible", new Gtk.CellRendererPixbuf(), "icon-name", 0, null);
  53. _tree_view.insert_column_with_attributes(-1, "Locked", new Gtk.CellRendererPixbuf(), "icon-name", 1, null);
  54. _tree_view.insert_column_with_attributes(-1, "Name", new Gtk.CellRendererText(), "text", 2, null);
  55. _tree_view.headers_clickable = false;
  56. _tree_view.headers_visible = false;
  57. _tree_view.model = _tree_filter;
  58. _tree_view.button_press_event.connect(on_button_pressed);
  59. _tree_selection = _tree_view.get_selection();
  60. _tree_selection.set_mode(Gtk.SelectionMode.MULTIPLE);
  61. _scrolled_window = new Gtk.ScrolledWindow(null, null);
  62. _scrolled_window.add(_tree_view);
  63. this.pack_start(_filter_entry, false, true, 0);
  64. this.pack_start(_scrolled_window, true, true, 0);
  65. }
  66. private bool on_button_pressed(Gdk.EventButton ev)
  67. {
  68. return Gdk.EVENT_PROPAGATE;
  69. }
  70. private bool filter_tree(Gtk.TreeModel model, Gtk.TreeIter iter)
  71. {
  72. Value val;
  73. model.get_value(iter, 2, out val);
  74. _tree_view.expand_all();
  75. string layer_name = ((string)val).down();
  76. string filter_text = _filter_entry.text.down();
  77. if (filter_text == "" || layer_name.index_of(filter_text) > -1)
  78. return true;
  79. return false;
  80. }
  81. private void on_filter_entry_text_changed()
  82. {
  83. _tree_filter.refilter();
  84. }
  85. }
  86. } /* namespace Crown */