prefs.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. 'use strict';
  2. import Adw from 'gi://Adw';
  3. import Gtk from 'gi://Gtk';
  4. import Gdk from 'gi://Gdk';
  5. import { ExtensionPreferences, gettext as _ } from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
  6. export default class GjsOskPreferences extends ExtensionPreferences {
  7. fillPreferencesWindow(window) {
  8. const UIFolderPath = this.dir.get_child('ui').get_path();
  9. let iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default());
  10. iconTheme.add_search_path(UIFolderPath + `/icons`);
  11. const settings = this.getSettings('org.gnome.shell.extensions.gjsosk');
  12. const page1 = new Adw.PreferencesPage({
  13. title: _("General"),
  14. icon_name: "general-symbolic"
  15. });
  16. const group0 = new Adw.PreferencesGroup();
  17. page1.add(group0)
  18. const apply = Gtk.Button.new_with_label(_("Apply Changes"));
  19. apply.connect("clicked", () => {
  20. settings.set_int("lang", langDrop.selected);
  21. settings.set_boolean("enable-drag", dragToggle.active);
  22. settings.set_int("enable-tap-gesture", dragOpt.selected);
  23. settings.set_boolean("indicator-enabled", indEnabled.active);
  24. settings.set_int("portrait-width-percent", numChanger_pW.value);
  25. settings.set_int("portrait-height-percent", numChanger_pH.value);
  26. settings.set_int("landscape-width-percent", numChanger_lW.value);
  27. settings.set_int("landscape-height-percent", numChanger_lH.value);
  28. let [r, g, b] = colorButton.get_rgba().to_string().replace("rgb(", "").replace(")", "").split(",")
  29. settings.set_double("background-r", r);
  30. settings.set_double("background-g", g);
  31. settings.set_double("background-b", b);
  32. settings.set_int("font-size-px", numChanger_font.value);
  33. settings.set_int("border-spacing-px", numChanger_bord.value);
  34. settings.set_boolean("round-key-corners", dragToggle2.active);
  35. settings.set_boolean("play-sound", dragToggle3.active);
  36. settings.set_int("default-snap", dropDown.selected);
  37. });
  38. group0.add(apply)
  39. const group1 = new Adw.PreferencesGroup({
  40. title: _("Behavior")
  41. });
  42. page1.add(group1);
  43. const row0 = new Adw.ActionRow({
  44. title: _('Language')
  45. });
  46. group1.add(row0);
  47. let langList = ["QWERTY", "AZERTY", "Dvorak", "QWERTZ"];
  48. let langDrop = Gtk.DropDown.new_from_strings(langList);
  49. langDrop.valign = Gtk.Align.CENTER;
  50. langDrop.selected = settings.get_int("lang");
  51. row0.add_suffix(langDrop);
  52. row0.activatable_widget = langDrop;
  53. const row1 = new Adw.ActionRow({
  54. title: _('Enable Dragging')
  55. });
  56. group1.add(row1);
  57. const dragToggle = new Gtk.Switch({
  58. active: settings.get_boolean('enable-drag'),
  59. valign: Gtk.Align.CENTER,
  60. });
  61. row1.add_suffix(dragToggle);
  62. row1.activatable_widget = dragToggle;
  63. const row1t3 = new Adw.ActionRow({
  64. title: _('Enable Panel Indicator')
  65. });
  66. group1.add(row1t3);
  67. const indEnabled = new Gtk.Switch({
  68. active: settings.get_boolean("indicator-enabled"),
  69. valign: Gtk.Align.CENTER,
  70. });
  71. row1t3.add_suffix(indEnabled);
  72. row1t3.activatable_widget = indEnabled;
  73. const row1t5 = new Adw.ActionRow({
  74. title: _('Open upon clicking in a text field')
  75. });
  76. group1.add(row1t5);
  77. let dragOptList = [_("Never"), _("Only on Touch"), _("Always")];
  78. let dragOpt = Gtk.DropDown.new_from_strings(dragOptList);
  79. dragOpt.valign = Gtk.Align.CENTER;
  80. dragOpt.selected = settings.get_int("enable-tap-gesture");
  81. row1t5.add_suffix(dragOpt);
  82. row1t5.activatable_widget = dragOpt;
  83. const row2 = new Adw.ExpanderRow({
  84. title: _('Portrait Sizing')
  85. });
  86. group1.add(row2);
  87. let pW = new Adw.ActionRow({
  88. title: _('Width (%)')
  89. })
  90. let pH = new Adw.ActionRow({
  91. title: _('Height (%)')
  92. })
  93. let numChanger_pW = Gtk.SpinButton.new_with_range(0, 100, 5);
  94. numChanger_pW.value = settings.get_int('portrait-width-percent');
  95. numChanger_pW.valign = Gtk.Align.CENTER;
  96. pW.add_suffix(numChanger_pW);
  97. pW.activatable_widget = numChanger_pW;
  98. let numChanger_pH = Gtk.SpinButton.new_with_range(0, 100, 5);
  99. numChanger_pH.value = settings.get_int('portrait-height-percent');
  100. numChanger_pH.valign = Gtk.Align.CENTER;
  101. pH.add_suffix(numChanger_pH);
  102. pH.activatable_widget = numChanger_pH;
  103. row2.add_row(pW);
  104. row2.add_row(pH);
  105. const row3 = new Adw.ExpanderRow({
  106. title: _('Landscape Sizing')
  107. });
  108. group1.add(row3);
  109. let lW = new Adw.ActionRow({
  110. title: _('Width (%)')
  111. });
  112. let lH = new Adw.ActionRow({
  113. title: _('Height (%)')
  114. });
  115. let numChanger_lW = Gtk.SpinButton.new_with_range(0, 100, 5);
  116. numChanger_lW.value = settings.get_int('landscape-width-percent');
  117. numChanger_lW.valign = Gtk.Align.CENTER;
  118. lW.add_suffix(numChanger_lW);
  119. lW.activatable_widget = numChanger_lW;
  120. let numChanger_lH = Gtk.SpinButton.new_with_range(0, 100, 5);
  121. numChanger_lH.value = settings.get_int('landscape-height-percent');
  122. numChanger_lH.valign = Gtk.Align.CENTER;
  123. lH.add_suffix(numChanger_lH);
  124. lH.activatable_widget = numChanger_lH;
  125. row3.add_row(lW);
  126. row3.add_row(lH);
  127. const row4 = new Adw.ActionRow({
  128. title: _('Default Position')
  129. });
  130. group1.add(row4);
  131. let posList = [
  132. _("Top Left"), _("Top Center"), _("Top Right"),
  133. _("Center Left"), _("Center"), _("Center Right"),
  134. _("Bottom Left"), _("Bottom Center"), _("Bottom Right")
  135. ];
  136. let dropDown = Gtk.DropDown.new_from_strings(posList);
  137. dropDown.valign = Gtk.Align.CENTER;
  138. dropDown.selected = settings.get_int("default-snap");
  139. row4.add_suffix(dropDown);
  140. row4.activatable_widget = dropDown;
  141. const group2 = new Adw.PreferencesGroup({
  142. title: _("Appearance")
  143. });
  144. page1.add(group2);
  145. const row5 = new Adw.ActionRow({
  146. title: _('Color')
  147. });
  148. group2.add(row5);settings.set_boolean("enable-tap-gesture", dragOpt.selected);
  149. let rgba = new Gdk.RGBA();
  150. rgba.parse("rgba(" + settings.get_double("background-r") + ", " + settings.get_double("background-g") + ", " + settings.get_double("background-b") + ", 1)");
  151. let colorButton = new Gtk.ColorButton({
  152. rgba,
  153. use_alpha: false,
  154. valign: Gtk.Align.CENTER
  155. });
  156. row5.add_suffix(colorButton);
  157. row5.activatable_widget = colorButton;
  158. let row6 = new Adw.ActionRow({
  159. title: _('Font Size (px)')
  160. });
  161. group2.add(row6);
  162. let numChanger_font = Gtk.SpinButton.new_with_range(0, 100, 1);
  163. numChanger_font.value = settings.get_int('font-size-px');
  164. numChanger_font.valign = Gtk.Align.CENTER;
  165. row6.add_suffix(numChanger_font);
  166. row6.activatable_widget = numChanger_font;
  167. let row7 = new Adw.ActionRow({
  168. title: _('Border Spacing (px)')
  169. });
  170. group2.add(row7);
  171. let numChanger_bord = Gtk.SpinButton.new_with_range(0, 10, 1);
  172. numChanger_bord.value = settings.get_int('border-spacing-px');
  173. numChanger_bord.valign = Gtk.Align.CENTER;
  174. row7.add_suffix(numChanger_bord);
  175. row7.activatable_widget = numChanger_bord;
  176. const row8 = new Adw.ActionRow({
  177. title: _('Round Corners')
  178. });
  179. group2.add(row8);
  180. const dragToggle2 = new Gtk.Switch({
  181. active: settings.get_boolean('round-key-corners'),
  182. valign: Gtk.Align.CENTER,
  183. });
  184. row8.add_suffix(dragToggle2);
  185. row8.activatable_widget = dragToggle2;
  186. const row9 = new Adw.ActionRow({
  187. title: _('Play sound')
  188. });
  189. group2.add(row9);
  190. const dragToggle3 = new Gtk.Switch({
  191. active: settings.get_boolean('play-sound'),
  192. valign: Gtk.Align.CENTER,
  193. });
  194. row9.add_suffix(dragToggle3);
  195. row9.activatable_widget = dragToggle3;
  196. window.add(page1);
  197. let page2 = new Adw.PreferencesPage({
  198. title: _("About"),
  199. icon_name: 'info-symbolic',
  200. });
  201. let contribute_icon_pref_group = new Adw.PreferencesGroup();
  202. let icon_box = new Gtk.Box({
  203. orientation: Gtk.Orientation.VERTICAL,
  204. margin_top: 24,
  205. margin_bottom: 24,
  206. spacing: 18,
  207. });
  208. let icon_image = new Gtk.Image({
  209. icon_name: "input-keyboard-symbolic",
  210. pixel_size: 128,
  211. });
  212. let label_box = new Gtk.Box({
  213. orientation: Gtk.Orientation.VERTICAL,
  214. spacing: 6,
  215. });
  216. let label = new Gtk.Label({
  217. label: "GJS OSK",
  218. wrap: true,
  219. });
  220. let context = label.get_style_context();
  221. context.add_class("title-1");
  222. let another_label = new Gtk.Label({
  223. label: _("Version ") + this.metadata.version
  224. });
  225. let links_pref_group = new Adw.PreferencesGroup();
  226. let code_row = new Adw.ActionRow({
  227. icon_name: "code-symbolic",
  228. title: _("More Information, submit feedback, and get help")
  229. });
  230. let github_link = new Gtk.LinkButton({
  231. label: "Github",
  232. uri: "https://github.com/Vishram1123/gjs-osk",
  233. });
  234. code_row.add_suffix(github_link);
  235. code_row.set_activatable_widget(github_link);
  236. links_pref_group.add(code_row);
  237. label_box.append(label);
  238. label_box.append(another_label);
  239. icon_box.append(icon_image);
  240. icon_box.append(label_box);
  241. contribute_icon_pref_group.add(icon_box);
  242. page2.add(contribute_icon_pref_group);
  243. page2.add(links_pref_group);
  244. window.add(page2);
  245. window.connect("close-request", () => {
  246. settings.set_int("lang", langDrop.selected);
  247. settings.set_boolean("enable-drag", dragToggle.active);
  248. settings.set_int("enable-tap-gesture", dragOpt.selected);
  249. settings.set_boolean("indicator-enabled", indEnabled.active);
  250. settings.set_int("portrait-width-percent", numChanger_pW.value);
  251. settings.set_int("portrait-height-percent", numChanger_pH.value);
  252. settings.set_int("landscape-width-percent", numChanger_lW.value);
  253. settings.set_int("landscape-height-percent", numChanger_lH.value);
  254. let [r, g, b] = colorButton.get_rgba().to_string().replace("rgb(", "").replace(")", "").split(",")
  255. settings.set_double("background-r", r);
  256. settings.set_double("background-g", g);
  257. settings.set_double("background-b", b);
  258. settings.set_int("font-size-px", numChanger_font.value);
  259. settings.set_int("border-spacing-px", numChanger_bord.value);
  260. settings.set_boolean("round-key-corners", dragToggle2.active);
  261. settings.set_boolean("play-sound", dragToggle3.active);
  262. settings.set_int("default-snap", dropDown.selected);
  263. });
  264. }
  265. };