iso-profiles-settings/tromjaro/gnome/desktop-overlay/etc/skel/.local/share/gnome-shell/extensions/donotdisturb@kylecorry31.github.io/settings.js
2019-11-06 21:43:51 +00:00

220 lines
6.2 KiB
JavaScript

const Gio = imports.gi.Gio;
const Lang = imports.lang;
const GLib = imports.gi.GLib;
const Me = imports.misc.extensionUtils.getCurrentExtension();
/**
* A class which handles all interactions with the settings.
*/
class SettingsManager {
/**
* Represents a settings repository, where settings can be modified and read.
* @constructor
*/
constructor() {
this.connections = [];
this._appSettings = _getSettings();
}
/**
* Enable or disable the icon in the system panel when do not disturb mode is enabled.
*
* @param {boolean} showIcon - True if the icon should be shown, false otherwise.
*/
setShowIcon(showIcon) {
this._appSettings.set_boolean('show-icon', showIcon);
}
/**
* Determines if the icon should be shown or not.
*
* @returns {boolean} - True if the icon should be shown when do not disturb is enabled, false otherwise.
*/
shouldShowIcon() {
return this._appSettings.get_boolean('show-icon');
}
/**
* Calls a function when the status of the show icon setting has changed.
*
* @param {() => ()} fn - The function to call when the show icon setting is changed.
*/
onShowIconChanged(fn) {
var id = this._appSettings.connect('changed::show-icon', fn);
this.connections.push(id);
}
/**
* Determines if the sound should be muted when do not disturb is enabled.
*
* @returns {boolean} - True if the sound should be muted when do not disturb is enabled, false otherwise.
*/
shouldMuteSound() {
return this._appSettings.get_boolean('mute-sounds');
}
/**
* Enable or disable the muting of sound when do not disturb mode is enabled.
*
* @param {boolean} muteSound - True if the sound should be muted when do not disturb is enabled, false otherwise.
*/
setShouldMuteSound(muteSound) {
this._appSettings.set_boolean('mute-sounds', muteSound);
}
/**
* Calls a function when the status of the mute sounds setting has changed.
*
* @param {() => ()} fn - The function to call when the mute sounds setting is changed.
*/
onMuteSoundChanged(fn) {
var id = this._appSettings.connect('changed::mute-sounds', fn);
this.connections.push(id);
}
/**
* Sets whether to show the count of notifications or not.
* @param {Boolean} newShowCount True if the notification count should be shown.
*/
set showCount(newShowCount){
this._appSettings.set_boolean('show-count', newShowCount);
}
/**
* Determines whether to show the notification count.
* @return {Boolean} True if the notification count should be shown.
*/
get showCount(){
return this._appSettings.get_boolean('show-count');
}
/**
* Calls a function when the status of the show count setting has changed.
*
* @param {() => ()} fn - The function to call when the show count setting is changed.
*/
onShowCountChanged(fn){
var id = this._appSettings.connect('changed::show-count', fn);
this.connections.push(id);
}
/**
* Sets whether to show an indicator of hidden notifications or not.
* @param {Boolean} newShowDot True if the notification dot should be shown.
*/
set showDot(newShowDot){
this._appSettings.set_boolean('show-dot', newShowDot);
}
/**
* Determines whether to show the notification dot.
* @return {Boolean} True if the notification dot should be shown.
*/
get showDot(){
return this._appSettings.get_boolean('show-dot');
}
/**
* Calls a function when the status of the show dot setting has changed.
*
* @param {() => ()} fn - The function to call when the show dot setting is changed.
*/
onShowDotChanged(fn){
var id = this._appSettings.connect('changed::show-dot', fn);
this.connections.push(id);
}
disconnectAll() {
this.connections.forEach((id) => {
this._appSettings.disconnect(id);
});
this.connections = [];
}
}
class RemoteAPI {
constructor() {
this._appSettings = _getSettings();
this.listeners = [];
this.id = this._appSettings.connect('changed::do-not-disturb', () => {
this.listeners.forEach((fn) => fn(this.getRemote()));
});
}
/**
* Calls a function when the status of the do not disturb setting has changed.
*
* @param {() => ()} listener - The function to call when the do not disturb setting is changed.
*/
addRemoteListener(listener) {
if (listener == null){
return -1;
}
if (this.listeners.length == 0){
this.id = this._appSettings.connect('changed::do-not-disturb', () => {
this.listeners.forEach((fn) => fn(this.getRemote()));
});
}
return this.listeners.push(listener) - 1;
}
removeRemoteListener(id) {
if (id < 0 || id >= this.listeners.length){
return;
}
this.listeners.splice(id, 1);
if (this.listeners.length == 0) {
this._appSettings.disconnect(this.id);
}
}
/**
* @return {Boolean} true if the external do not disturb is on, false otherwise
*/
getRemote() {
return this._appSettings.get_boolean('do-not-disturb');
}
/**
* @param {Boolean} dnd true if the external do not disturb should be on, false otherwise
*/
setRemote(dnd) {
this._appSettings.set_boolean('do-not-disturb', dnd);
}
}
/**
* A helper function to get the application specific settings. Adapted
* from the System76 Pop Suspend Button extension: https://github.com/pop-os/gnome-shell-extension-pop-suspend-button
*
* @returns {Gio.Settings} - The application specific settings object.
*/
function _getSettings() {
let schemaName = 'org.gnome.shell.extensions.kylecorry31-do-not-disturb';
let schemaDir = Me.dir.get_child('schemas').get_path();
// Extension installed in .local
if (GLib.file_test(schemaDir + '/gschemas.compiled', GLib.FileTest.EXISTS)) {
let schemaSource = Gio.SettingsSchemaSource.new_from_directory(schemaDir,
Gio.SettingsSchemaSource.get_default(),
false);
let schema = schemaSource.lookup(schemaName, false);
return new Gio.Settings({
settings_schema: schema
});
}
// Extension installed system-wide
else {
if (Gio.Settings.list_schemas().indexOf(schemaName) == -1)
throw "Schema \"%s\" not found.".format(schemaName);
return new Gio.Settings({
schema: schemaName
});
}
}