125 lines
2.9 KiB
JavaScript
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);
|
|
});
|
|
}
|
|
}
|
|
);
|