level_layers_tree_view.vala 2.8 KB

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