From e3f238a2e3c540bba1e44a65c7ae4cc1928f4ce1 Mon Sep 17 00:00:00 2001 From: Thomas Liebetraut Date: Tue, 21 May 2013 19:07:35 +0200 Subject: [PATCH] Readonly prefs.js support --- prefs.js | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 prefs.js diff --git a/prefs.js b/prefs.js new file mode 100644 index 0000000..76c97cc --- /dev/null +++ b/prefs.js @@ -0,0 +1,129 @@ +/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* Olaf Leidinger + Thomas Liebetraut +*/ + +const Gdk = imports.gi.Gdk; +const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; +const GnomeDesktop = imports.gi.GnomeDesktop; +const Mainloop = imports.mainloop; // timer +const St = imports.gi.St; +const Clutter = imports.gi.Clutter; + +const Lang = imports.lang; +const Gtk = imports.gi.Gtk; +const GObject = imports.gi.GObject; + +const Gettext = imports.gettext.domain('gnome-shell-extensions'); +const _ = Gettext.gettext; +const N_ = function(e) { return e; }; + +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + +let settings; + +const SETTINGS_TEALIST_KEY = 'steep-times'; + + +function getSettings(schema) { + let extension = ExtensionUtils.getCurrentExtension(); + + schema = schema || extension.metadata['settings-schema']; + + const GioSSS = Gio.SettingsSchemaSource; + + // check if this extension was built with "make zip-file", and thus + // has the schema files in a subfolder + // otherwise assume that extension has been installed in the + // same prefix as gnome-shell (and therefore schemas are available + // in the standard folders) + let schemaDir = extension.dir.get_child('schemas'); + let schemaSource; + if (schemaDir.query_exists(null)) { + schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), + GioSSS.get_default(), + false); + } + else + schemaSource = GioSSS.get_default(); + + let schemaObj = schemaSource.lookup(schema, true); + if (!schemaObj) + throw new Error('Schema ' + schema + ' could not be found for extension ' + + extension.metadata.uuid + '. Please check your installation.'); + + return new Gio.Settings({ settings_schema: schemaObj }); +} + +const TeaTimePrefsWidget = new Lang.Class({ + Name : 'TeaTimePrefsWidget', + Extends : Gtk.Box, + + _init: function() { + this.parent({ orientation: Gtk.Orientation.VERTICAL }); + + this._tealist = new Gtk.ListStore(); + this._tealist.set_column_types([GObject.TYPE_STRING, GObject.TYPE_INT, Gtk.Adjustment]); + + this._settings = getSettings(); + this._settings.connect("changed::" + SETTINGS_TEALIST_KEY, Lang.bind(this, this._refresh)); + + this._initWindow(); + this.vexpand = true; + this._refresh(); + }, + _initWindow: function() { + this.treeview = new Gtk.TreeView({model: this._tealist, expand: true}); + this.add(this.treeview); + + let teaname = new Gtk.TreeViewColumn({ title: _("Tea"), expand: true }); + let renderer = new Gtk.CellRendererText({ editable: true }); + teaname.pack_start(renderer, true); + teaname.add_attribute(renderer, "text", 0); + this.treeview.append_column(teaname); + + let steeptime = new Gtk.TreeViewColumn({ title: _("Steep time") }); + let spinrenderer = new Gtk.CellRendererSpin({ editable: true }); + steeptime.pack_start(spinrenderer, true); + steeptime.add_attribute(spinrenderer, "adjustment", 2); + steeptime.add_attribute(spinrenderer, "text", 1); + this.treeview.append_column(steeptime); + + + this.toolbar = new Gtk.Toolbar({ icon_size: 1 }); + this.toolbar.get_style_context().add_class("inline-toolbar"); + this.add(this.toolbar); + this.addButton = new Gtk.ToolButton({ icon_name: "list-add-symbolic", use_action_appearance: false }); + this.toolbar.insert(this.addButton, -1); + this.removeButton = new Gtk.ToolButton({ icon_name: "list-remove-symbolic", use_action_appearance: false }); + this.toolbar.insert(this.removeButton, -1); + }, + _refresh: function() { + this._tealist.clear(); + + let list = this._settings.get_value(SETTINGS_TEALIST_KEY); + for (let i = 0; i < list.n_children(); ++i) { + let item = list.get_child_value(i); + let teaname = item.get_child_value(0).get_string()[0]; + let time = item.get_child_value(1).get_uint32(); + + let adj = new Gtk.Adjustment({ lower: 1, step_increment: 1, upper: 65535, value: time }); + this._tealist.set(this._tealist.append(), [0, 1, 2], [teaname, time, adj]); + } + } + +}); + + +function init() { +} + +function buildPrefsWidget() { + let widget = new TeaTimePrefsWidget(); + + widget.show_all(); + return widget; +} +