applications.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import Adw from 'gi://Adw';
  2. import GLib from 'gi://GLib';
  3. import GObject from 'gi://GObject';
  4. import Gio from 'gi://Gio';
  5. import { WindowRow } from './window_row.js';
  6. const make_array = prefs_group => {
  7. let list_box = prefs_group
  8. .get_first_child()
  9. .get_last_child()
  10. .get_first_child();
  11. let elements = [];
  12. let i = 0;
  13. let element = list_box.get_row_at_index(i);
  14. while (element) {
  15. elements.push(element);
  16. i++;
  17. element = list_box.get_row_at_index(i);
  18. }
  19. return elements;
  20. };
  21. export const Applications = GObject.registerClass({
  22. GTypeName: 'Applications',
  23. Template: GLib.uri_resolve_relative(import.meta.url, '../ui/applications.ui', GLib.UriFlags.NONE),
  24. InternalChildren: [
  25. 'blur',
  26. 'customize',
  27. 'opacity',
  28. 'blur_on_overview',
  29. 'enable_all',
  30. 'whitelist',
  31. 'add_window_whitelist',
  32. 'blacklist',
  33. 'add_window_blacklist'
  34. ],
  35. }, class Applications extends Adw.PreferencesPage {
  36. constructor(preferences, preferences_window) {
  37. super({});
  38. this._preferences_window = preferences_window;
  39. this.preferences = preferences;
  40. this.preferences.applications.settings.bind(
  41. 'blur', this._blur, 'active',
  42. Gio.SettingsBindFlags.DEFAULT
  43. );
  44. this.preferences.applications.settings.bind(
  45. 'opacity', this._opacity, 'value',
  46. Gio.SettingsBindFlags.DEFAULT
  47. );
  48. this.preferences.applications.settings.bind(
  49. 'blur-on-overview', this._blur_on_overview, 'active',
  50. Gio.SettingsBindFlags.DEFAULT
  51. );
  52. this.preferences.applications.settings.bind(
  53. 'enable-all', this._enable_all, 'active',
  54. Gio.SettingsBindFlags.DEFAULT
  55. );
  56. this._customize.connect_to(this.preferences, this.preferences.applications, false);
  57. // connect 'enable all' button to whitelist/blacklist visibility
  58. this._enable_all.bind_property(
  59. 'active', this._whitelist, 'visible',
  60. GObject.BindingFlags.INVERT_BOOLEAN
  61. );
  62. this._enable_all.bind_property(
  63. 'active', this._blacklist, 'visible',
  64. GObject.BindingFlags.DEFAULT
  65. );
  66. // make sure that blacklist / whitelist is correctly hidden
  67. if (this._enable_all.active)
  68. this._whitelist.visible = false;
  69. this._blacklist.visible = !this._whitelist.visible;
  70. // listen to app row addition
  71. this._add_window_whitelist.connect('clicked',
  72. _ => this.add_to_whitelist()
  73. );
  74. this._add_window_blacklist.connect('clicked',
  75. _ => this.add_to_blacklist()
  76. );
  77. // add initial applications
  78. this.add_widgets_from_lists();
  79. this.preferences.connect('reset', _ => {
  80. this.remove_all_widgets();
  81. this.add_widgets_from_lists();
  82. });
  83. }
  84. // A way to retriew the whitelist widgets.
  85. get _whitelist_elements() {
  86. return make_array(this._whitelist);
  87. }
  88. // A way to retriew the blacklist widgets.
  89. get _blacklist_elements() {
  90. return make_array(this._blacklist);
  91. }
  92. add_widgets_from_lists() {
  93. this.preferences.applications.WHITELIST.forEach(
  94. app_name => this.add_to_whitelist(app_name)
  95. );
  96. this.preferences.applications.BLACKLIST.forEach(
  97. app_name => this.add_to_blacklist(app_name)
  98. );
  99. }
  100. close_all_expanded_rows() {
  101. this._whitelist_elements.forEach(
  102. element => element.set_expanded(false)
  103. );
  104. this._blacklist_elements.forEach(
  105. element => element.set_expanded(false)
  106. );
  107. }
  108. remove_all_widgets() {
  109. this._whitelist_elements.forEach(
  110. element => this._whitelist.remove(element)
  111. );
  112. this._blacklist_elements.forEach(
  113. element => this._blacklist.remove(element)
  114. );
  115. }
  116. add_to_whitelist(app_name = null) {
  117. let window_row = new WindowRow('whitelist', this, app_name);
  118. this._whitelist.add(window_row);
  119. }
  120. add_to_blacklist(app_name = null) {
  121. let window_row = new WindowRow('blacklist', this, app_name);
  122. this._blacklist.add(window_row);
  123. }
  124. update_whitelist_titles() {
  125. let titles = this._whitelist_elements
  126. .map(element => element._window_class.buffer.text)
  127. .filter(title => title != "");
  128. this.preferences.applications.WHITELIST = titles;
  129. }
  130. update_blacklist_titles() {
  131. let titles = this._blacklist_elements
  132. .map(element => element._window_class.buffer.text)
  133. .filter(title => title != "");
  134. this.preferences.applications.BLACKLIST = titles;
  135. }
  136. remove_from_whitelist(widget) {
  137. this._whitelist.remove(widget);
  138. this.update_whitelist_titles();
  139. }
  140. remove_from_blacklist(widget) {
  141. this._blacklist.remove(widget);
  142. this.update_blacklist_titles();
  143. }
  144. });