applications.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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 { ApplicationRow } from './applications_management/application_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. 'sigma',
  27. 'brightness',
  28. 'opacity',
  29. 'dynamic_opacity',
  30. 'blur_on_overview',
  31. 'enable_all',
  32. 'whitelist',
  33. 'add_window_whitelist',
  34. 'blacklist',
  35. 'add_window_blacklist'
  36. ],
  37. }, class Applications extends Adw.PreferencesPage {
  38. constructor(preferences, preferences_window) {
  39. super({});
  40. this._preferences_window = preferences_window;
  41. this.preferences = preferences;
  42. this.preferences.applications.settings.bind(
  43. 'blur', this._blur, 'active',
  44. Gio.SettingsBindFlags.DEFAULT
  45. );
  46. this.preferences.applications.settings.bind(
  47. 'opacity', this._opacity, 'value',
  48. Gio.SettingsBindFlags.DEFAULT
  49. );
  50. this.preferences.applications.settings.bind(
  51. 'dynamic-opacity', this._dynamic_opacity, 'active',
  52. Gio.SettingsBindFlags.DEFAULT
  53. );
  54. this.preferences.applications.settings.bind(
  55. 'blur-on-overview', this._blur_on_overview, 'active',
  56. Gio.SettingsBindFlags.DEFAULT
  57. );
  58. this.preferences.applications.settings.bind(
  59. 'enable-all', this._enable_all, 'active',
  60. Gio.SettingsBindFlags.DEFAULT
  61. );
  62. this.preferences.applications.settings.bind(
  63. 'sigma', this._sigma, 'value',
  64. Gio.SettingsBindFlags.DEFAULT
  65. );
  66. this.preferences.applications.settings.bind(
  67. 'brightness', this._brightness, 'value',
  68. Gio.SettingsBindFlags.DEFAULT
  69. );
  70. // connect 'enable all' button to whitelist/blacklist visibility
  71. this._enable_all.bind_property(
  72. 'active', this._whitelist, 'visible',
  73. GObject.BindingFlags.INVERT_BOOLEAN
  74. );
  75. this._enable_all.bind_property(
  76. 'active', this._blacklist, 'visible',
  77. GObject.BindingFlags.DEFAULT
  78. );
  79. // make sure that blacklist / whitelist is correctly hidden
  80. if (this._enable_all.active)
  81. this._whitelist.visible = false;
  82. this._blacklist.visible = !this._whitelist.visible;
  83. // listen to app row addition
  84. this._add_window_whitelist.connect('clicked',
  85. () => this.add_to_whitelist()
  86. );
  87. this._add_window_blacklist.connect('clicked',
  88. () => this.add_to_blacklist()
  89. );
  90. // add initial applications
  91. this.add_widgets_from_lists();
  92. this.preferences.connect('reset', () => {
  93. this.remove_all_widgets();
  94. this.add_widgets_from_lists();
  95. });
  96. }
  97. // A way to retriew the whitelist widgets.
  98. get _whitelist_elements() {
  99. return make_array(this._whitelist);
  100. }
  101. // A way to retriew the blacklist widgets.
  102. get _blacklist_elements() {
  103. return make_array(this._blacklist);
  104. }
  105. add_widgets_from_lists() {
  106. this.preferences.applications.WHITELIST.forEach(
  107. app_name => this.add_to_whitelist(app_name)
  108. );
  109. this.preferences.applications.BLACKLIST.forEach(
  110. app_name => this.add_to_blacklist(app_name)
  111. );
  112. }
  113. close_all_expanded_rows() {
  114. this._whitelist_elements.forEach(
  115. element => element.set_expanded(false)
  116. );
  117. this._blacklist_elements.forEach(
  118. element => element.set_expanded(false)
  119. );
  120. }
  121. remove_all_widgets() {
  122. this._whitelist_elements.forEach(
  123. element => this._whitelist.remove(element)
  124. );
  125. this._blacklist_elements.forEach(
  126. element => this._blacklist.remove(element)
  127. );
  128. }
  129. add_to_whitelist(app_name = null) {
  130. let window_row = new ApplicationRow('whitelist', this, app_name);
  131. this._whitelist.add(window_row);
  132. }
  133. add_to_blacklist(app_name = null) {
  134. let window_row = new ApplicationRow('blacklist', this, app_name);
  135. this._blacklist.add(window_row);
  136. }
  137. update_whitelist_titles() {
  138. let titles = this._whitelist_elements
  139. .map(element => element._window_class.buffer.text)
  140. .filter(title => title != "");
  141. this.preferences.applications.WHITELIST = titles;
  142. }
  143. update_blacklist_titles() {
  144. let titles = this._blacklist_elements
  145. .map(element => element._window_class.buffer.text)
  146. .filter(title => title != "");
  147. this.preferences.applications.BLACKLIST = titles;
  148. }
  149. remove_from_whitelist(widget) {
  150. this._whitelist.remove(widget);
  151. this.update_whitelist_titles();
  152. }
  153. remove_from_blacklist(widget) {
  154. this._blacklist.remove(widget);
  155. this.update_blacklist_titles();
  156. }
  157. });