221 lines
6.9 KiB
JavaScript
221 lines
6.9 KiB
JavaScript
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
/*
|
|
Monito Gnome-Shell extension
|
|
Copyright (C) 2021 Benjamin Drieu
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
const Gio = imports.gi.Gio;
|
|
const GLib = imports.gi.GLib;
|
|
const Gtk = imports.gi.Gtk;
|
|
|
|
// It's common practice to keep GNOME API and JS imports in separate blocks
|
|
const Lang = imports.lang;
|
|
const ExtensionUtils = imports.misc.extensionUtils;
|
|
const Me = ExtensionUtils.getCurrentExtension();
|
|
const Convenience = Me.imports.convenience;
|
|
|
|
const Gettext = imports.gettext.domain('monito');
|
|
const _ = Gettext.gettext;
|
|
const N_ = function (e) {
|
|
return e;
|
|
};
|
|
|
|
const SETTINGS_SCHEMA = "org.gnome.shell.extensions.monito@drieu.org";
|
|
const SETTINGS_SCHEMA_ACCOUNT = "org.gnome.shell.extensions.monito@drieu.org.account";
|
|
const SETTINGS_SCHEMA_ACCOUNT_PATH = "/org/gnome/shell/extensions/monito@drieu.org/account";
|
|
|
|
|
|
const prefs = [ { type: Gtk.Entry, label: _('Name'), key: 'name' },
|
|
{ type: Gtk.ComboBoxText, label: _('Type'), key: 'type' },
|
|
{ type: Gtk.Entry, label: _('Username'), key: 'username' },
|
|
{ type: Gtk.Entry, label: _('Password'), key: 'password' },
|
|
{ type: Gtk.Entry, label: _('URL CGI'), key: 'urlcgi' },
|
|
];
|
|
|
|
// Like 'extension.js' this is used for any one-time setup like translations.
|
|
function init() {
|
|
// log('initializing ${Me.metadata.name} Preferences');
|
|
}
|
|
|
|
|
|
// This function is called when the preferences window is first created to build
|
|
// and return a Gtk widget. As an example we'll create and return a GtkLabel.
|
|
function buildPrefsWidget() {
|
|
|
|
// Copy the same GSettings code from `extension.js`
|
|
this.settings = ExtensionUtils.getSettings(SETTINGS_SCHEMA);
|
|
|
|
let mainVbox = new Gtk.Box( { orientation: Gtk.Orientation.VERTICAL } );
|
|
|
|
let mainWidget = new Gtk.Notebook( { } );
|
|
|
|
let prefsWidget = new Gtk.Grid({
|
|
margin: 18,
|
|
column_spacing: 12,
|
|
row_spacing: 12,
|
|
column_homogeneous: false,
|
|
});
|
|
|
|
this.prefWidgets = { };
|
|
|
|
// Add a simple title and add it to the prefsWidget
|
|
let title = new Gtk.Label({
|
|
label: `<b>${Me.metadata.name} Preferences</b>`,
|
|
halign: Gtk.Align.START,
|
|
use_markup: true,
|
|
});
|
|
prefsWidget.attach(title, 0, 0, 2, 1);
|
|
|
|
// Misc Settings (TBD)
|
|
mainWidget.append_page ( prefsWidget,
|
|
new Gtk.Label ( { label: 'General', } ) );
|
|
|
|
|
|
// Accounts
|
|
let accountsWidgetContainer = new Gtk.Box( { orientation: Gtk.Orientation.HORIZONTAL,
|
|
homogeneous: false, } );
|
|
mainWidget.append_page ( accountsWidgetContainer,
|
|
new Gtk.Label ( { label: 'Servers', } ) );
|
|
|
|
let accountsChooserContainer = new Gtk.Box( { orientation: Gtk.Orientation.VERTICAL,
|
|
homogeneous: false, } );
|
|
accountsWidgetContainer.pack_start(accountsChooserContainer, true, true, 0);
|
|
|
|
let accountsChooser = new Gtk.ListBox ( { valign: Gtk.Align.FILL,
|
|
hexpand: true,
|
|
vexpand: true } );
|
|
accountsChooserContainer.pack_start(accountsChooser, true, true, 0);
|
|
|
|
// Account list
|
|
for ( var server of this.settings.get_string ( 'servers' ) . split ( ',' ) )
|
|
{
|
|
let _account_settings = getAccountSettings ( server );
|
|
let row = new Gtk.ListBoxRow ( { hexpand: true,
|
|
halign: Gtk.Align.FILL } );
|
|
row.server= server
|
|
let _label = new Gtk.Label ( { label: _account_settings.get_string('name'),
|
|
hexpand: true,
|
|
margin: 5,
|
|
halign: Gtk.Align.START,
|
|
expand: true } );
|
|
row.add ( _label );
|
|
_label.set_data ( 'server', GLib.strdup(server) );
|
|
accountsChooser.add ( row );
|
|
}
|
|
accountsChooser.connect('row-activated', Lang.bind(this, function () {
|
|
let _row = accountsChooser.get_selected_row();
|
|
log('Active:' + _row.server);
|
|
let _account_settings = getAccountSettings ( _row.server );
|
|
|
|
for ( var prefEntry of prefs )
|
|
{
|
|
if ( prefEntry.type == Gtk.Entry )
|
|
{
|
|
// How to unbind previous one?
|
|
_account_settings.bind (
|
|
prefEntry.key,
|
|
this.prefWidgets[prefEntry.key],
|
|
'text',
|
|
Gio.SettingsBindFlags.DEFAULT
|
|
);
|
|
}
|
|
else if ( prefEntry.type == Gtk.ComboBoxText )
|
|
{
|
|
this.prefWidgets[prefEntry.key].set_active(_account_settings.get_enum('type'));
|
|
this.prefWidgets[prefEntry.key].connect('changed', Lang.bind(this, function () {
|
|
log('Active:' + this.prefWidgets[prefEntry.key].get_active());
|
|
_account_settings.set_enum('type', this.prefWidgets[prefEntry.key].get_active());
|
|
}));
|
|
}
|
|
}
|
|
} ) );
|
|
|
|
|
|
|
|
let accountsChooserActionBar = new Gtk.ActionBar ( { visible: true,
|
|
valign: Gtk.Align.END,
|
|
vexpand: false} );
|
|
accountsChooserContainer.pack_start(accountsChooserActionBar, true, true, 0);
|
|
|
|
let accountsWidget = new Gtk.Grid ( {
|
|
halign: Gtk.Align.FILL,
|
|
margin: 18,
|
|
column_spacing: 12,
|
|
row_spacing: 12,
|
|
visible: true,
|
|
column_homogeneous: false,
|
|
});
|
|
accountsWidgetContainer.pack_start(accountsWidget, true, true, 0);
|
|
|
|
let y = 1;
|
|
for ( var prefEntry of prefs )
|
|
{
|
|
let _label = new Gtk.Label({
|
|
label: prefEntry.label + ':',
|
|
visible: true,
|
|
halign: Gtk.Align.START,
|
|
});
|
|
accountsWidget.attach ( _label, 0, y, 1, 1 );
|
|
|
|
this.prefWidgets[prefEntry.key] = new prefEntry.type({
|
|
halign: Gtk.Align.FILL,
|
|
visible: true,
|
|
hexpand: true,
|
|
});
|
|
|
|
let boundValue = 'text';
|
|
if ( prefEntry.key == 'password' )
|
|
{
|
|
this.prefWidgets[prefEntry.key].set_input_purpose ( Gtk.InputPurpose.PASSWORD );
|
|
this.prefWidgets[prefEntry.key].set_visibility ( false );
|
|
}
|
|
else if ( prefEntry.key == 'type' )
|
|
{
|
|
[ 'Icinga', 'Icinga2' ].forEach((item) => {
|
|
this.prefWidgets[prefEntry.key].append_text(item);
|
|
} );
|
|
}
|
|
|
|
accountsWidget.attach(this.prefWidgets[prefEntry.key], 1, y, 1, 1);
|
|
|
|
if ( prefEntry.type != Gtk.ComboBoxText )
|
|
{
|
|
// this.account_settings.bind(
|
|
// prefEntry.key,
|
|
// _entry,
|
|
// boundValue,
|
|
// Gio.SettingsBindFlags.DEFAULT
|
|
// );
|
|
}
|
|
y++;
|
|
}
|
|
|
|
mainVbox.pack_start(mainWidget, true, true, 0);
|
|
mainVbox.show_all();
|
|
|
|
return mainVbox;
|
|
}
|
|
|
|
function getAccountSettings ( id )
|
|
{
|
|
let _path = SETTINGS_SCHEMA_ACCOUNT_PATH + '/' + id;
|
|
return Convenience.getSettings(SETTINGS_SCHEMA_ACCOUNT, _path);
|
|
}
|
|
|