reference_chooser.vala 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) 2012-2018 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/dbartolini/crown/blob/master/LICENSE
  4. */
  5. using Gtk;
  6. namespace Crown
  7. {
  8. /// <summary>
  9. /// Vector2 spin button.
  10. /// </summary>
  11. public class ReferenceChooser : Gtk.Box
  12. {
  13. // Data
  14. private bool _stop_emit;
  15. private string _type;
  16. // Widgets
  17. private Gtk.Entry _name;
  18. private Gtk.Button _selector;
  19. private ProjectStore _project_store;
  20. public string value
  21. {
  22. get
  23. {
  24. return _name.text;
  25. }
  26. set
  27. {
  28. _stop_emit = true;
  29. _name.text = value;
  30. _stop_emit = false;
  31. }
  32. }
  33. // Signals
  34. public signal void value_changed();
  35. public ReferenceChooser(ProjectStore store, string type)
  36. {
  37. Object(orientation: Gtk.Orientation.HORIZONTAL, spacing: 0);
  38. // Data
  39. _stop_emit = false;
  40. _type = type;
  41. // Widgets
  42. _name = new Gtk.Entry();
  43. _name.sensitive = false;
  44. _name.hexpand = true;
  45. _name.changed.connect(on_value_changed);
  46. _selector = new Gtk.Button.from_icon_name("document-open-symbolic");
  47. _selector.clicked.connect(on_selector_clicked);
  48. _project_store = store;
  49. add(_name);
  50. add(_selector);
  51. }
  52. private void on_value_changed()
  53. {
  54. if (!_stop_emit)
  55. value_changed();
  56. }
  57. private void on_selector_clicked()
  58. {
  59. Gtk.Dialog dg = new Gtk.Dialog.with_buttons("Select resource"
  60. , null
  61. , DialogFlags.MODAL
  62. , null
  63. );
  64. var rb = new ResourceBrowser(null, _project_store, false);
  65. rb.set_type_filter(type_filter);
  66. rb.resource_selected.connect(() => { _name.text = rb._name; dg.response(ResponseType.OK); });
  67. dg.skip_taskbar_hint = true;
  68. dg.get_content_area().add(rb);
  69. dg.show_all();
  70. dg.run();
  71. dg.destroy();
  72. }
  73. private bool type_filter(string type, string name)
  74. {
  75. return _type == type;
  76. }
  77. }
  78. }