prefs.js 10 KB

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