dotfiles/.local/share/gnome-shell/extensions/trayIconsReloaded@selfmade.pl/preferences/Prefs.js

125 lines
2.9 KiB
JavaScript

const { GObject, Gtk, Gio, Gdk } = imports.gi;
const ExtensionUtils = imports.misc.extensionUtils;
const getSettings = ExtensionUtils.getSettings;
const Me = ExtensionUtils.getCurrentExtension();
const AppRow = Me.imports.preferences.AppRow.AppRow;
const AppChooser = Me.imports.preferences.AppChooser.AppChooser;
const schemaNames = [
"tray-position",
"position-weight",
"tray-margin-left",
"tray-margin-right",
"icons-limit",
"icon-size",
"icon-margin-vertical",
"icon-margin-horizontal",
"icon-padding-vertical",
"icon-padding-horizontal",
"icon-saturation",
"icon-contrast",
"icon-brightness",
"invoke-to-workspace",
"wine-behavior",
];
const settingIds = schemaNames.map(function (name) {
return name.replaceAll("-", "_");
});
var Prefs = GObject.registerClass(
{
GTypeName: "Prefs",
Template: Me.dir.get_child("preferences/Prefs.xml").get_uri(),
InternalChildren: ["headerBar", "appList", ...settingIds],
},
class Prefs extends Gtk.Box {
_init(params = {}) {
super._init(params);
this._bindSettings(schemaNames);
this.connect("realize", () => {
const window = this.get_root();
window.set_titlebar(this._headerBar);
});
let provider = new Gtk.CssProvider();
provider.load_from_file(
Gio.File.new_for_uri(
Me.dir.get_child("preferences/Prefs.css").get_uri()
)
);
Gtk.StyleContext.add_provider_for_display(
Gdk.Display.get_default(),
provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
);
this._settings = getSettings();
this._changeId = this._settings.connect(
"changed::applications",
this._syncAppsRows.bind(this)
);
this._syncAppsRows();
}
showAppChooser() {
const dialog = new AppChooser(this.get_root());
dialog.show();
}
_syncAppsRows() {
this._settings.block_signal_handler(this._changeId);
const oldApps = [...this._appList].filter((row) => !!row.appId);
const newApps = JSON.parse(
this._settings.get_string("applications")
).filter((app) => !!app);
newApps.forEach((appInfo, index) => {
if (!oldApps.some((row) => row.appId == appInfo.id)) {
const appRow = new AppRow(appInfo);
this._appList.insert(appRow, index);
if (this._notFirstSync) {
appRow.toggleSettingsVisibility();
}
}
});
oldApps.forEach((row, index) => {
if (!newApps.some((app) => row.appId == app.id)) {
this._appList.remove(row);
}
});
this._notFirstSync = true;
this._settings.unblock_signal_handler(this._changeId);
}
_bindSettings(settings) {
settings.forEach((name) => {
let obj = eval("this._" + name.replaceAll("-", "_"));
let valueType;
switch (obj.css_name) {
case "combobox":
valueType = "active-id";
break;
case "switch":
valueType = "active";
break;
default:
valueType = "value";
}
getSettings().bind(name, obj, valueType, Gio.SettingsBindFlags.DEFAULT);
});
}
}
);