🔧 Work on loading of profiles
This commit is contained in:
@@ -93,21 +93,22 @@ var PreferencesDialog = class PreferencesDialog {
|
|||||||
// Register the template widgets used in the settings dialog.
|
// Register the template widgets used in the settings dialog.
|
||||||
this._registerCustomClasses();
|
this._registerCustomClasses();
|
||||||
|
|
||||||
// Store a reference to the settings object.
|
|
||||||
this._settings = ExtensionUtils.getSettings();
|
|
||||||
|
|
||||||
let profiles = utils.listProfiles();
|
|
||||||
if (profiles.length == 0) {
|
|
||||||
profiles = [utils.createProfile()];
|
|
||||||
}
|
|
||||||
|
|
||||||
this._profileSettings = utils.getProfileSettings(profiles[0]);
|
|
||||||
|
|
||||||
// Load the general user interface files.
|
// Load the general user interface files.
|
||||||
this._builder = new Gtk.Builder();
|
this._builder = new Gtk.Builder();
|
||||||
this._builder.add_from_resource(`/ui/common/menus.ui`);
|
this._builder.add_from_resource(`/ui/common/menus.ui`);
|
||||||
this._builder.add_from_resource(`/ui/${utils.getUIDir()}/prefs.ui`);
|
this._builder.add_from_resource(`/ui/${utils.getUIDir()}/prefs.ui`);
|
||||||
|
|
||||||
|
// Store a reference to the general settings object.
|
||||||
|
this._settings = ExtensionUtils.getSettings();
|
||||||
|
|
||||||
|
// Load the current effect profile. If there is none, we create a default profile.
|
||||||
|
this._settings.connect('changed::active-profile', () => {
|
||||||
|
this._loadActiveProfile();
|
||||||
|
this._updateProfileButton();
|
||||||
|
});
|
||||||
|
this._loadActiveProfile();
|
||||||
|
this._updateProfileButton();
|
||||||
|
|
||||||
// Check whether the power profiles daemon is available - if not, we hide the
|
// Check whether the power profiles daemon is available - if not, we hide the
|
||||||
// corresponding settings row.
|
// corresponding settings row.
|
||||||
let hasPowerProfiles = false;
|
let hasPowerProfiles = false;
|
||||||
@@ -124,10 +125,8 @@ var PreferencesDialog = class PreferencesDialog {
|
|||||||
|
|
||||||
this._builder.get_object('profile-power-profile').set_visible(hasPowerProfiles);
|
this._builder.get_object('profile-power-profile').set_visible(hasPowerProfiles);
|
||||||
|
|
||||||
// Starting with GNOME Shell 42, the settings dialog uses libadwaita (at least most of
|
// Starting with GNOME Shell 42, the settings dialog uses libadwaita. We use this to
|
||||||
// the time - it seems that pop!_OS does not support libadwaita even on GNOME 42). We
|
// create a completely different layout for the settings dialog.
|
||||||
// have to use a different layout, as the stack sidebar looks pretty ugly with the
|
|
||||||
// included Adw.Clamp...
|
|
||||||
if (utils.isADW()) {
|
if (utils.isADW()) {
|
||||||
|
|
||||||
// This is our top-level widget which we will return later.
|
// This is our top-level widget which we will return later.
|
||||||
@@ -192,8 +191,8 @@ var PreferencesDialog = class PreferencesDialog {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// On older GNOME versions, we use a StackSidebar. The code below works both, on GTK3
|
// On older GNOME versions, we use a StackSidebar. The code below works on GTK3 and
|
||||||
// and GTK4.
|
// GTK4.
|
||||||
else {
|
else {
|
||||||
|
|
||||||
// This is our top-level widget which we will return later.
|
// This is our top-level widget which we will return later.
|
||||||
@@ -393,46 +392,10 @@ var PreferencesDialog = class PreferencesDialog {
|
|||||||
|
|
||||||
// Bind all the profile-related actions.
|
// Bind all the profile-related actions.
|
||||||
{
|
{
|
||||||
const updateProfileName = () => {
|
|
||||||
let items = [];
|
|
||||||
|
|
||||||
const addItems = (settingsKey, options) => {
|
|
||||||
const option = this._profileSettings.get_int(settingsKey);
|
|
||||||
if (option > 0) {
|
|
||||||
items.push(options[option - 1]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
addItems('profile-animation-type', [_('Opening Windows'),
|
|
||||||
_('Closing Windows')]);
|
|
||||||
addItems('profile-window-type', [_('Normal Windows'),
|
|
||||||
_('Dialog Windows')]);
|
|
||||||
addItems('profile-desktop-style', [_('Bright Mode'),
|
|
||||||
_('Dark Mode')]);
|
|
||||||
addItems('profile-power-mode', [_('On Battery'),
|
|
||||||
_('Plugged In')]);
|
|
||||||
addItems('profile-power-profile', [_('Power-Saver Mode'),
|
|
||||||
_('Balanced Mode'),
|
|
||||||
_('Performance Mode'),
|
|
||||||
_('Power Saver or Balanced'),
|
|
||||||
_('Balanced or Performance')]);
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
let label = '';
|
|
||||||
|
|
||||||
if (items.length == 0) {
|
|
||||||
label = _('Default Profile');
|
|
||||||
} else {
|
|
||||||
label = items.join(' · ');
|
|
||||||
}
|
|
||||||
|
|
||||||
this._builder.get_object('choose-profile-button').label = label;
|
|
||||||
};
|
|
||||||
|
|
||||||
const setupProfileOption = (settingsKey) => {
|
const setupProfileOption = (settingsKey) => {
|
||||||
this.bindComboRow(settingsKey);
|
this.bindComboRow(settingsKey);
|
||||||
this._profileSettings.connect('changed::' + settingsKey, updateProfileName);
|
this._profileSettings.connect('changed::' + settingsKey,
|
||||||
|
() => this._updateProfileButton());
|
||||||
};
|
};
|
||||||
|
|
||||||
setupProfileOption('profile-animation-type');
|
setupProfileOption('profile-animation-type');
|
||||||
@@ -441,7 +404,37 @@ var PreferencesDialog = class PreferencesDialog {
|
|||||||
setupProfileOption('profile-power-mode');
|
setupProfileOption('profile-power-mode');
|
||||||
setupProfileOption('profile-power-profile');
|
setupProfileOption('profile-power-profile');
|
||||||
|
|
||||||
updateProfileName();
|
|
||||||
|
const profileAction = this._settings.create_action('active-profile');
|
||||||
|
group.add_action(profileAction);
|
||||||
|
|
||||||
|
const newProfileAction = Gio.SimpleAction.new('profile-new', null);
|
||||||
|
newProfileAction.connect('activate', () => {
|
||||||
|
const profile = utils.createProfile();
|
||||||
|
this._settings.set_string('active-profile', profile);
|
||||||
|
this._builder.get_object('edit-profile-button').active = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
group.add_action(newProfileAction);
|
||||||
|
|
||||||
|
const deleteProfileAction = Gio.SimpleAction.new('profile-delete', null);
|
||||||
|
deleteProfileAction.connect('activate', () => {
|
||||||
|
this._builder.get_object('profile-delete-dialog').show();
|
||||||
|
});
|
||||||
|
|
||||||
|
const deleteProfileDialog = this._builder.get_object('profile-delete-dialog');
|
||||||
|
deleteProfileDialog.set_transient_for(window);
|
||||||
|
deleteProfileDialog.connect('response', (d, response) => {
|
||||||
|
if (response == 'delete') {
|
||||||
|
this._builder.get_object('edit-profile-button').active = false;
|
||||||
|
const profile = this._settings.get_string('active-profile');
|
||||||
|
utils.deleteProfile(profile);
|
||||||
|
this._loadActiveProfile();
|
||||||
|
this._updateProfileButton();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
group.add_action(deleteProfileAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate the enabled-effects drop-down menu.
|
// Populate the enabled-effects drop-down menu.
|
||||||
@@ -557,6 +550,44 @@ var PreferencesDialog = class PreferencesDialog {
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- private stuff
|
// ----------------------------------------------------------------------- private stuff
|
||||||
|
|
||||||
|
_loadActiveProfile() {
|
||||||
|
|
||||||
|
let profiles = utils.listProfiles();
|
||||||
|
if (profiles.length == 0) {
|
||||||
|
profiles = [utils.createProfile()];
|
||||||
|
}
|
||||||
|
|
||||||
|
let activeProfile = this._settings.get_string('active-profile');
|
||||||
|
if (!profiles.includes(activeProfile)) {
|
||||||
|
activeProfile = profiles[0];
|
||||||
|
this._settings.set_string('active-profile', activeProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.debug('loading ' + activeProfile);
|
||||||
|
|
||||||
|
this._profileSettings = utils.getProfileSettings(activeProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateProfileButton() {
|
||||||
|
const activeProfile = this._settings.get_string('active-profile');
|
||||||
|
|
||||||
|
this._builder.get_object('choose-profile-button').label =
|
||||||
|
utils.getProfileName(activeProfile);
|
||||||
|
|
||||||
|
const profileSection = this._builder.get_object('profile-section');
|
||||||
|
profileSection.remove_all();
|
||||||
|
|
||||||
|
const profiles = utils.listProfiles();
|
||||||
|
|
||||||
|
profiles.forEach(profile => {
|
||||||
|
const label = utils.getProfileName(profile);
|
||||||
|
const item = Gio.MenuItem.new(label, 'prefs.active-profile');
|
||||||
|
item.set_action_and_target_value('prefs.active-profile',
|
||||||
|
GLib.Variant.new_string(profile));
|
||||||
|
profileSection.append_item(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Searches for a reset button for the given settings key and make it reset the settings
|
// Searches for a reset button for the given settings key and make it reset the settings
|
||||||
// key when clicked.
|
// key when clicked.
|
||||||
_bindResetButton(settingsKey) {
|
_bindResetButton(settingsKey) {
|
||||||
|
|||||||
@@ -8,6 +8,21 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
<interface domain="burn-my-windows">
|
<interface domain="burn-my-windows">
|
||||||
<requires lib="gtk" version="4.0" />
|
<requires lib="gtk" version="4.0" />
|
||||||
|
|
||||||
|
<!-- This is shown when a profile is going to be deleted. -->
|
||||||
|
<object class="AdwMessageDialog" id="profile-delete-dialog">
|
||||||
|
<property name="modal">true</property>
|
||||||
|
<property name="hide-on-close">true</property>
|
||||||
|
<property name="heading" translatable="yes">Delete this Profile?</property>
|
||||||
|
<property name="body" translatable="yes">The current effect profile will be permanently lost.</property>
|
||||||
|
<property name="default-response">cancel</property>
|
||||||
|
<property name="close-response">cancel</property>
|
||||||
|
<responses>
|
||||||
|
<response id="cancel" translatable="yes">Cancel</response>
|
||||||
|
<response id="delete" translatable="yes" appearance="destructive">Delete</response>
|
||||||
|
</responses>
|
||||||
|
</object>
|
||||||
|
|
||||||
|
<!-- This will be added to the header bar. -->
|
||||||
<object class="GtkBox" id="profile-button">
|
<object class="GtkBox" id="profile-button">
|
||||||
<property name="halign">center</property>
|
<property name="halign">center</property>
|
||||||
<child>
|
<child>
|
||||||
@@ -153,8 +168,13 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkButton">
|
<object class="GtkButton">
|
||||||
<property name="icon-name">user-trash-symbolic</property>
|
<property name="action-name">prefs.profile-delete</property>
|
||||||
<property name="label" translatable="yes">Delete this Profile...</property>
|
<property name="child">
|
||||||
|
<object class="AdwButtonContent">
|
||||||
|
<property name="icon-name">user-trash-symbolic</property>
|
||||||
|
<property name="label" translatable="yes">Delete this Profile...</property>
|
||||||
|
</object>
|
||||||
|
</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
@@ -199,7 +219,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
@@ -52,11 +52,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
</menu>
|
</menu>
|
||||||
|
|
||||||
<menu id="profile-menu">
|
<menu id="profile-menu">
|
||||||
<section>
|
<section id="profile-section">
|
||||||
<item>
|
<!-- <item>
|
||||||
<attribute name="label" translatable="yes">Default Profile</attribute>
|
<attribute name="label">Default Profile</attribute>
|
||||||
<attribute name="action">prefs.profile-default</attribute>
|
<attribute name="action">prefs.profile</attribute>
|
||||||
</item>
|
<attribute name="target">profile-023402834923749</attribute>
|
||||||
|
</item> -->
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ SPDX-License-Identifier: CC0-1.0
|
|||||||
|
|
||||||
<key name="active-profile" type="s">
|
<key name="active-profile" type="s">
|
||||||
<default>""</default>
|
<default>""</default>
|
||||||
<summary>Active Profile</summary>
|
<summary>Profile</summary>
|
||||||
<description>The currently active effect profile.</description>
|
<description>The currently active effect profile.</description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ const [GS_MAJOR, GS_MINOR] = Config.PACKAGE_VERSION.split('.').map(toNumericVers
|
|||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||||
|
|
||||||
|
const _ = imports.gettext.domain('burn-my-windows').gettext;
|
||||||
|
|
||||||
// This method can be used to write a message to GNOME Shell's log. This is enhances
|
// This method can be used to write a message to GNOME Shell's log. This is enhances
|
||||||
// the standard log() functionality by prepending the extension's name and the location
|
// the standard log() functionality by prepending the extension's name and the location
|
||||||
// where the message was logged. As the extensions name is part of the location, you
|
// where the message was logged. As the extensions name is part of the location, you
|
||||||
@@ -123,6 +125,14 @@ function createProfile() {
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function deleteProfile(profilePath) {
|
||||||
|
const profileDir = GLib.get_user_config_dir() + `/burn-my-windows/profiles`;
|
||||||
|
const file = Gio.File.new_for_path(profilePath);
|
||||||
|
if (file.has_prefix(Gio.File.new_for_path(profileDir)) && file.query_exists(null)) {
|
||||||
|
file.delete(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function listProfiles() {
|
function listProfiles() {
|
||||||
|
|
||||||
@@ -178,4 +188,42 @@ function getProfileSettings(profilePath) {
|
|||||||
Gio.keyfile_settings_backend_new(profilePath, '/org/gnome/shell/extensions/', null);
|
Gio.keyfile_settings_backend_new(profilePath, '/org/gnome/shell/extensions/', null);
|
||||||
|
|
||||||
return new Gio.Settings({settings_schema: schema, backend: backend});
|
return new Gio.Settings({settings_schema: schema, backend: backend});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getProfileName(profilePath) {
|
||||||
|
let items = [];
|
||||||
|
const settings = getProfileSettings(profilePath);
|
||||||
|
|
||||||
|
const addItems = (settingsKey, options) => {
|
||||||
|
const option = settings.get_int(settingsKey);
|
||||||
|
if (option > 0) {
|
||||||
|
items.push(options[option - 1]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
addItems('profile-animation-type', [_('Opening Windows'),
|
||||||
|
_('Closing Windows')]);
|
||||||
|
addItems('profile-window-type', [_('Normal Windows'),
|
||||||
|
_('Dialog Windows')]);
|
||||||
|
addItems('profile-desktop-style', [_('Bright Mode'),
|
||||||
|
_('Dark Mode')]);
|
||||||
|
addItems('profile-power-mode', [_('On Battery'),
|
||||||
|
_('Plugged In')]);
|
||||||
|
addItems('profile-power-profile', [_('Power-Saver Mode'),
|
||||||
|
_('Balanced Mode'),
|
||||||
|
_('Performance Mode'),
|
||||||
|
_('Power Saver or Balanced'),
|
||||||
|
_('Balanced or Performance')]);
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
let label = '';
|
||||||
|
|
||||||
|
if (items.length == 0) {
|
||||||
|
label = _('Default Profile');
|
||||||
|
} else {
|
||||||
|
label = items.join(' · ');
|
||||||
|
}
|
||||||
|
|
||||||
|
return label;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user