prefs.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import Gio from 'gi://Gio';
  2. import Gtk from 'gi://Gtk';
  3. import './prefs/shortcutListener.js';
  4. import {Shortcut, Switches, Radio, Spin, Combo} from './common.js';
  5. import {getKeybindingController} from './keybindingController.js';
  6. import {saveConfiguration} from './utils.js';
  7. import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
  8. export default class GrimblePreferences extends ExtensionPreferences {
  9. fillPreferencesWindow(window) {
  10. const settings = this.getSettings();
  11. const builder = Gtk.Builder.new_from_file(`${this.path}/ui/prefs.ui`);
  12. const page1 = this.createGeneralSettingsPage(builder, settings);
  13. const page2 = this.createKeybindingsPage(builder, settings);
  14. window.add(page1);
  15. window.add(page2);
  16. return Promise.resolve();
  17. }
  18. createGeneralSettingsPage(builder, settings) {
  19. const page1 = builder.get_object('general');
  20. this._bindRadioButtons(builder, settings);
  21. this._bindSwitches(builder, settings);
  22. this._bindSpinbuttons(builder, settings);
  23. return page1;
  24. }
  25. createKeybindingsPage(builder, settings) {
  26. const page2 = builder.get_object('keybindings');
  27. const comboRow = Combo.getCombo();
  28. comboRow.forEach(({key, rowNames}) => {
  29. const combo = builder.get_object(key.replaceAll('-', '_'));
  30. let lastValue = settings.get_string(key);
  31. let row = rowNames.findIndex(item => lastValue === item);
  32. if (row === -1)
  33. row = 0;
  34. combo.set_selected(row);
  35. combo.connect('notify::selected-item', widget => {
  36. settings.set_string(key, rowNames[widget.get_selected()]);
  37. });
  38. getKeybindingController().connect('keybinding-changed', () => {
  39. combo.set_selected(rowNames.findIndex(item => item === 'Custom'));
  40. const shortcuts = Shortcut.getShortcuts();
  41. let o = {};
  42. for (const p of shortcuts)
  43. o[p] = settings.get_strv(p) ?? [];
  44. saveConfiguration('custom.json', o);
  45. });
  46. });
  47. let keys = Shortcut.getShortcuts();
  48. keys.forEach(key => {
  49. const shortcut = builder.get_object(key.replaceAll('-', '_'));
  50. shortcut.initialize(key, settings);
  51. });
  52. return page2;
  53. }
  54. _bindRadioButtons(builder, settings) {
  55. const radioButtons = Radio.getRadios();
  56. radioButtons.forEach(({key, rowNames}) => {
  57. const currActive = settings.get_int(key);
  58. rowNames.forEach((name, idx) => {
  59. const row = builder.get_object(name.replaceAll('-', '_'));
  60. const checkButton = row.activatable_widget;
  61. checkButton.connect('toggled', () => {
  62. settings.set_int(key, idx);
  63. });
  64. // Set initial state
  65. if (idx === currActive)
  66. checkButton.activate();
  67. });
  68. });
  69. }
  70. _bindSwitches(builder, settings) {
  71. const switches = Switches.getSwitches();
  72. switches.forEach(key => {
  73. const widget = builder.get_object(key.replaceAll('-', '_'));
  74. settings.bind(key, widget, 'active', Gio.SettingsBindFlags.DEFAULT);
  75. });
  76. }
  77. _bindSpinbuttons(builder, settings) {
  78. const spinButtons = Spin.getSpins();
  79. spinButtons.forEach(key => {
  80. const widget = builder.get_object(key.replaceAll('-', '_'));
  81. settings.bind(key, widget, 'value', Gio.SettingsBindFlags.DEFAULT);
  82. });
  83. }
  84. }