combatiblity for gnome-shell 3.32 (maybe break for earlier versions)

This commit is contained in:
Zener 2019-04-09 12:52:38 +02:00
parent e5a5e61398
commit e94ef7f5bc
5 changed files with 552 additions and 545 deletions

View File

@ -4,7 +4,6 @@
*/ */
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Mainloop = imports.mainloop; // timer const Mainloop = imports.mainloop; // timer
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
@ -29,10 +28,8 @@ const N_ = function (e) {
const TeaTimeFullscreenNotification = new Lang.Class({ class TeaTimeFullscreenNotification {
Name: 'TeaTimeFullscreenNotification', constructor() {
_init: function () {
// this spans the whole monitor and contains // this spans the whole monitor and contains
// the actual layout, which it displays in // the actual layout, which it displays in
// the center of itself // the center of itself
@ -80,7 +77,7 @@ const TeaTimeFullscreenNotification = new Lang.Class({
reactive: true, reactive: true,
keep_aspect_ratio: true keep_aspect_ratio: true
}); });
this._texture.connect("button-release-event", Lang.bind(this, this.hide)); this._texture.connect("button-release-event", this.hide.bind(this));
this._layout.add_child(this._texture); this._layout.add_child(this._texture);
this._timeline = new Clutter.Timeline({ this._timeline = new Clutter.Timeline({
@ -88,7 +85,7 @@ const TeaTimeFullscreenNotification = new Lang.Class({
repeat_count: -1, repeat_count: -1,
progress_mode: Clutter.AnimationMode.LINEAR progress_mode: Clutter.AnimationMode.LINEAR
}); });
this._timeline.connect("new-frame", Lang.bind(this, this._newFrame)); this._timeline.connect("new-frame", this._newFrame.bind(this));
this._label = new St.Label({ this._label = new St.Label({
text: _("Your tea is ready!"), text: _("Your tea is ready!"),
@ -98,19 +95,19 @@ const TeaTimeFullscreenNotification = new Lang.Class({
this._lightbox = new imports.ui.lightbox.Lightbox(Main.uiGroup); // Seems not to work on Gnome 3.10 { fadeInTime: 0.5, fadeOutTime: 0.5 } this._lightbox = new imports.ui.lightbox.Lightbox(Main.uiGroup); // Seems not to work on Gnome 3.10 { fadeInTime: 0.5, fadeOutTime: 0.5 }
this._lightbox.highlight(this._bin); this._lightbox.highlight(this._bin);
}, }
destroy: function () { destroy() {
this.hide(); this.hide();
Main.popModal(this._bin); Main.popModal(this._bin);
this._bin.destroy(); this._bin.destroy();
this._lightbox.hide(); this._lightbox.hide();
}, }
_newFrame: function (timeline, msecs, user) { _newFrame(timeline, msecs, user) {
let progress = timeline.get_progress(); let progress = timeline.get_progress();
let idx = Math.round(progress * this._textureFiles.length) % this._textureFiles.length; let idx = Math.round(progress * this._textureFiles.length) % this._textureFiles.length;
this._texture.set_from_file(this._textureFiles[idx]); this._texture.set_from_file(this._textureFiles[idx]);
}, }
show: function () { show() {
if (typeof Layout.MonitorConstraint != 'undefined') { if (typeof Layout.MonitorConstraint != 'undefined') {
this._monitorConstraint.index = global.screen.get_current_monitor() this._monitorConstraint.index = global.screen.get_current_monitor()
} }
@ -118,22 +115,19 @@ const TeaTimeFullscreenNotification = new Lang.Class({
this._timeline.start(); this._timeline.start();
this._lightbox.show(); this._lightbox.show();
this._bin.show_all(); this._bin.show_all();
}, }
hide: function () { hide() {
Main.popModal(this._bin); Main.popModal(this._bin);
this._bin.hide(); this._bin.hide();
this._lightbox.hide(); this._lightbox.hide();
this._timeline.stop(); this._timeline.stop();
} }
}) };
const PopupTeaMenuItem = new Lang.Class({ class PopupTeaMenuItem extends PopupMenu.PopupBaseMenuItem {
Name: 'PopupTeaMenuItem', constructor(sTeaname, nBrewtime, params) {
Extends: PopupMenu.PopupBaseMenuItem, super(params);
_init: function (sTeaname, nBrewtime, params) {
this.parent(params);
this.tealabel = new St.Label({ this.tealabel = new St.Label({
text: sTeaname text: sTeaname
@ -163,15 +157,14 @@ const PopupTeaMenuItem = new Lang.Class({
} }
} }
} }
}); };
var TeaTime = class extends PanelMenu.Button {
const TeaTime = new Lang.Class({ constructor() {
Name: 'TeaTime', super(null, "TeaTime");
Extends: PanelMenu.Button,
_init: function () { this.myinit = function () {
this.parent(null, "TeaTime");
this._settings = Utils.getSettings(); this._settings = Utils.getSettings();
@ -187,18 +180,19 @@ const TeaTime = new Lang.Class({
this.actor.add_actor(this._logo); this.actor.add_actor(this._logo);
this.actor.add_style_class_name('panel-status-button'); this.actor.add_style_class_name('panel-status-button');
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChanged)); this.actor.connect('style-changed', this._onStyleChanged.bind(this));
this._idleTimeout = null; this._idleTimeout = null;
this._createMenu(); this._createMenu();
}, };
_createMenu: function () {
this._createMenu = function () {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._settings.connect("changed::" + this.config_keys.steep_times, this._settings.connect("changed::" + this.config_keys.steep_times,
Lang.bind(this, this._updateTeaList)); this._updateTeaList.bind(this));
this._settings.connect("changed::" + this.config_keys.graphical_countdown, this._settings.connect("changed::" + this.config_keys.graphical_countdown,
Lang.bind(this, this._updateCountdownType)); this._updateCountdownType.bind(this));
this.teaItemCont = new PopupMenu.PopupMenuSection(); this.teaItemCont = new PopupMenu.PopupMenuSection();
@ -207,7 +201,7 @@ const TeaTime = new Lang.Class({
let head = new PopupMenu.PopupMenuSection(); let head = new PopupMenu.PopupMenuSection();
let item = new PopupMenu.PopupMenuItem(_("Show settings")); //, 'gtk-preferences'); let item = new PopupMenu.PopupMenuItem(_("Show settings")); //, 'gtk-preferences');
// item._icon.icon_size = 15; // item._icon.icon_size = 15;
item.connect('activate', Lang.bind(this, this._showPreferences)); item.connect('activate', this._showPreferences.bind(this));
head.addMenuItem(item); head.addMenuItem(item);
/*******************/ /*******************/
@ -218,7 +212,7 @@ const TeaTime = new Lang.Class({
hint_text: _("min:sec") hint_text: _("min:sec")
}); });
this._customEntry.get_clutter_text().set_max_length(10); this._customEntry.get_clutter_text().set_max_length(10);
this._customEntry.get_clutter_text().connect("key-press-event", Lang.bind(this, this._createCustomTimer)); this._customEntry.get_clutter_text().connect("key-press-event", this._createCustomTimer.bind(this));
bottom.box.add(this._customEntry); bottom.box.add(this._customEntry);
bottom.actor.set_style("padding: 0px 18px;") bottom.actor.set_style("padding: 0px 18px;")
@ -231,29 +225,29 @@ const TeaTime = new Lang.Class({
this.menu.addMenuItem(bottom); this.menu.addMenuItem(bottom);
this._updateTeaList(); this._updateTeaList();
}, };
_updateTeaList: function (config, output) { this._updateTeaList = function (config, output) {
// make sure the menu is empty // make sure the menu is empty
this.teaItemCont.removeAll(); this.teaItemCont.removeAll();
// fill with new teas // fill with new teas
let list = this._settings.get_value(this.config_keys.steep_times).unpack(); let list = this._settings.get_value(this.config_keys.steep_times).unpack();
let menuItem = new PopupTeaMenuItem("Stop Timer", 0); let menuItem = new PopupTeaMenuItem("Stop Timer", 0);
menuItem.connect('activate', Lang.bind(this, function () { menuItem.connect('activate', function () {
this._stopCountdown(); this._stopCountdown();
})); }.bind(this));
this.teaItemCont.addMenuItem(menuItem); this.teaItemCont.addMenuItem(menuItem);
for (let teaname in list) { for (let teaname in list) {
let time = list[teaname].get_uint32(); let time = list[teaname].get_uint32();
let menuItem = new PopupTeaMenuItem(_(teaname), time); let menuItem = new PopupTeaMenuItem(_(teaname), time);
menuItem.connect('activate', Lang.bind(this, function () { menuItem.connect('activate', function () {
this._initCountdown(time); this._initCountdown(time);
})); }.bind(this));
this.teaItemCont.addMenuItem(menuItem); this.teaItemCont.addMenuItem(menuItem);
} }
}, };
_updateCountdownType: function (config, output) { this._updateCountdownType = function (config, output) {
let bWantGraphicalCountdown = this._settings.get_boolean(this.config_keys.graphical_countdown); let bWantGraphicalCountdown = this._settings.get_boolean(this.config_keys.graphical_countdown);
if (bWantGraphicalCountdown != this._bGraphicalCountdown) { if (bWantGraphicalCountdown != this._bGraphicalCountdown) {
@ -268,21 +262,29 @@ const TeaTime = new Lang.Class({
this._updateTimerDisplay(this._getRemainingSec()); this._updateTimerDisplay(this._getRemainingSec());
} // if timeout active } // if timeout active
} // value changed } // value changed
}, };
_createCustomTimer: function (text, event) { this._createCustomTimer = function (text, event) {
if (event.get_key_symbol() == Clutter.KEY_Enter || if (event.get_key_symbol() == Clutter.KEY_Enter ||
event.get_key_symbol() == Clutter.KEY_Return) { event.get_key_symbol() == Clutter.KEY_Return ||
event.get_key_symbol() == Clutter.KEY_KP_Enter) {
let customTime = text.get_text(); let customTime = text.get_text();
let seconds = 0; let seconds = 0;
let match = customTime.match(/^(?:(\d+)(?::(\d{0,2}))?|:(\d+))$/) let match = customTime.match(/^(?:(\d+)(?::(\d{0,2}))?|:(\d+))$/)
if (match) { if (match) {
let factor = 1; let factor = 1;
if (match[3] === undefined) { // minutes and seconds?
for (var i = match.length - 2; i > 0; i--) { for (var i = match.length - 2; i > 0; i--) {
let s = match[i].replace(/^0/, ''); // fix for elder GNOME <= 3.10 which don't like leading zeros let s = match[i] === undefined ? "" : match[i].replace(/^0/, ''); // fix for elder GNOME <= 3.10 which don't like leading zeros
if (s.match(/^\d+$/)) { // only if something left
seconds += factor * parseInt(s); seconds += factor * parseInt(s);
}
factor *= 60; factor *= 60;
} }
} else { // only seconds?
let s = match[3].replace(/^0/, '');
seconds = parseInt(s);
}
if (seconds > 0) { if (seconds > 0) {
this._initCountdown(seconds); this._initCountdown(seconds);
this.menu.close(); this.menu.close();
@ -290,8 +292,8 @@ const TeaTime = new Lang.Class({
} }
this._customEntry.set_text(""); this._customEntry.set_text("");
} }
}, };
_showNotification: function (subject, text) { this._showNotification = function (subject, text) {
let source = (Utils.isGnome34()) ? let source = (Utils.isGnome34()) ?
new MessageTray.Source(_("TeaTime applet")) : new MessageTray.Source(_("TeaTime applet")) :
new MessageTray.Source(_("TeaTime applet"), 'utilities-teatime'); new MessageTray.Source(_("TeaTime applet"), 'utilities-teatime');
@ -315,8 +317,8 @@ const TeaTime = new Lang.Class({
let notification = new MessageTray.Notification(source, subject, text); let notification = new MessageTray.Notification(source, subject, text);
notification.setTransient(true); notification.setTransient(true);
source.notify(notification); source.notify(notification);
}, };
_initCountdown: function (time) { this._initCountdown = function (time) {
this._startTime = new Date(); this._startTime = new Date();
this._stopTime = new Date(); this._stopTime = new Date();
this._cntdownStart = time; this._cntdownStart = time;
@ -338,27 +340,27 @@ const TeaTime = new Lang.Class({
this._graphicalTimer : this._textualTimer); this._graphicalTimer : this._textualTimer);
if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout); if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout);
this._idleTimeout = Mainloop.timeout_add_seconds(dt, Lang.bind(this, this._doCountdown)); this._idleTimeout = Mainloop.timeout_add_seconds(dt, this._doCountdown.bind(this));
}, };
_stopCountdown: function () { this._stopCountdown = function () {
if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout); if (this._idleTimeout != null) Mainloop.source_remove(this._idleTimeout);
this.actor.remove_actor(this._bGraphicalCountdown ? this.actor.remove_actor(this._bGraphicalCountdown ?
this._graphicalTimer : this._textualTimer); this._graphicalTimer : this._textualTimer);
this.actor.add_actor(this._logo); this.actor.add_actor(this._logo);
this._idleTimeout = null; this._idleTimeout = null;
}, };
_getRemainingSec: function () { this._getRemainingSec = function () {
let a = new Date(); let a = new Date();
return (this._stopTime.getTime() - a.getTime()) * 1e-3; return (this._stopTime.getTime() - a.getTime()) * 1e-3;
}, };
_updateTimerDisplay: function (remainingTime) { this._updateTimerDisplay = function (remainingTime) {
if (this._bGraphicalCountdown) { if (this._bGraphicalCountdown) {
this._graphicalTimer.setStatus((this._cntdownStart - remainingTime) / this._cntdownStart); this._graphicalTimer.setStatus((this._cntdownStart - remainingTime) / this._cntdownStart);
} else { } else {
this._textualTimer.text = Utils.formatTime(remainingTime); this._textualTimer.text = Utils.formatTime(remainingTime);
} }
}, };
_doCountdown: function () { this._doCountdown = function () {
let remainingTime = this._getRemainingSec(); let remainingTime = this._getRemainingSec();
if (remainingTime <= 0) { if (remainingTime <= 0) {
@ -378,18 +380,19 @@ const TeaTime = new Lang.Class({
this._updateTimerDisplay(remainingTime); this._updateTimerDisplay(remainingTime);
return true; // continue timer return true; // continue timer
} }
}, };
_playSound: function () { this._playSound = function () {
let bPlayAlarmSound = this._settings.get_boolean(this.config_keys.use_alarm_sound); let bPlayAlarmSound = this._settings.get_boolean(this.config_keys.use_alarm_sound);
if (bPlayAlarmSound) { if (bPlayAlarmSound) {
Utils.playSound(this._settings.get_string(this.config_keys.alarm_sound)); Utils.playSound(this._settings.get_string(this.config_keys.alarm_sound));
} }
}, };
_showPreferences: function () { this._showPreferences = function () {
imports.misc.util.spawn(["gnome-shell-extension-prefs", ExtensionUtils.getCurrentExtension().metadata['uuid']]); const currExt = ExtensionUtils.getCurrentExtension();
imports.misc.util.spawn(["gnome-shell-extension-prefs", currExt.metadata['uuid']]);
return 0; return 0;
}, };
_onStyleChanged: function (actor) { this._onStyleChanged = function (actor) {
let themeNode = actor.get_theme_node(); let themeNode = actor.get_theme_node();
let color = themeNode.get_foreground_color() let color = themeNode.get_foreground_color()
let [bHasPadding, padding] = themeNode.lookup_length("-natural-hpadding", false); let [bHasPadding, padding] = themeNode.lookup_length("-natural-hpadding", false);
@ -413,9 +416,11 @@ const TeaTime = new Lang.Class({
let scaling = Utils.getGlobalDisplayScaleFactor(); let scaling = Utils.getGlobalDisplayScaleFactor();
this._logo.setScaling(scaling); this._logo.setScaling(scaling);
this._graphicalTimer.setScaling(scaling); this._graphicalTimer.setScaling(scaling);
}, };
config_keys: Utils.GetConfigKeys() this.config_keys = Utils.GetConfigKeys();
}); this.myinit();
}
};
function init(metadata) { function init(metadata) {
let theme = imports.gi.Gtk.IconTheme.get_default(); let theme = imports.gi.Gtk.IconTheme.get_default();

View File

@ -10,28 +10,27 @@
* If there is a better way for that stuff, please let me know ;) * If there is a better way for that stuff, please let me know ;)
********************************************************************/ ********************************************************************/
const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const ExUt = imports.misc.extensionUtils; const ExUt = imports.misc.extensionUtils;
const Me = ExUt.getCurrentExtension(); const Me = ExUt.getCurrentExtension();
const Utils = Me.imports.utils; const Utils = Me.imports.utils;
var TwoColorIcon = new Lang.Class({ var TwoColorIcon = class extends St.DrawingArea {
Name: 'TwoColorIcon', constructor(size, drawingObject) {
Extends: St.DrawingArea, super({
_init: function (size, drawingObject) {
this.parent({
reactive: true, reactive: true,
style: 'padding: 0px 2px' style: 'padding: 0px 2px'
}); });
this.myinit = function () {
this._base_size = size; this._base_size = size;
this.setScaling(Utils.getGlobalDisplayScaleFactor()); //this.setScaling(Utils.getGlobalDisplayScaleFactor());
this._drawingObject = drawingObject; this._drawingObject = drawingObject;
this.connect('repaint', Lang.bind(this, this._drawIcon)); this.connect('repaint', function () {
this._drawIcon();
}.bind(this));
// some fallback color // some fallback color
this._primaryColor = new Clutter.Color({ this._primaryColor = new Clutter.Color({
@ -42,27 +41,27 @@ var TwoColorIcon = new Lang.Class({
}); });
this._secundaryColor = this._primaryColor; this._secundaryColor = this._primaryColor;
this._customStatus = null; this._customStatus = null;
}, };
setPadding: function (padding) { this.setPadding = function (padding) {
this.margin_left = padding; this.margin_left = padding;
this.margin_right = padding; this.margin_right = padding;
}, };
setColor: function (primary, secundary) { this.setColor = function (primary, secundary) {
this._primaryColor = primary; this._primaryColor = primary;
this._secundaryColor = secundary; this._secundaryColor = secundary;
this.queue_repaint(); this.queue_repaint();
}, };
setScaling: function (newScale) { this.setScaling = function (newScale) {
this._default_scale = newScale; this._default_scale = newScale;
this.set_width(this._base_size * this._default_scale); this.set_width(this._base_size * this._default_scale);
this.set_height(this._base_size * this._default_scale); this.set_height(this._base_size * this._default_scale);
this.queue_repaint(); this.queue_repaint();
}, };
setStatus: function (newStatus) { this.setStatus = function (newStatus) {
this._customStatus = newStatus; this._customStatus = newStatus;
this.queue_repaint(); this.queue_repaint();
}, };
_drawIcon: function () { this._drawIcon = function () {
let cr = this.get_context(); let cr = this.get_context();
let orWdt = this._drawingObject.width; let orWdt = this._drawingObject.width;
let orHgt = this._drawingObject.height; let orHgt = this._drawingObject.height;
@ -77,19 +76,24 @@ var TwoColorIcon = new Lang.Class({
let padding_y = (height - orHgt * scaling) * 0.5; let padding_y = (height - orHgt * scaling) * 0.5;
cr.translate(padding_x, padding_y); cr.translate(padding_x, padding_y);
try {
cr.scale(scaling, scaling); cr.scale(scaling, scaling);
this._drawingObject.draw(cr, this._customStatus, this._primaryColor, this._secundaryColor); this._drawingObject.draw(cr, this._customStatus, this._primaryColor, this._secundaryColor);
cr.restore(); cr.restore();
} catch (e) {
// ignore
} }
};
}); this.myinit();
}
};
var TeaPot = { var TeaPot = {
width: 484, width: 484,
height: 295, height: 295,
draw: function (cr, stat, primary, secundary) { draw(cr, stat, primary, secundary) {
// draw TeaPot // draw TeaPot
// cairo commands generated from svg2cairo // cairo commands generated from svg2cairo
// https://github.com/akrinke/svg2cairo // https://github.com/akrinke/svg2cairo
@ -133,7 +137,7 @@ var TeaPot = {
var Pie = { var Pie = {
width: 1, width: 1,
height: 1, height: 1,
draw: function (cr, stat, primary, secundary) { draw(cr, stat, primary, secundary) {
const pi = Math.PI; const pi = Math.PI;
const r = 0.5; const r = 0.5;

View File

@ -1 +1 @@
{"shell-version": ["3.4", "3.6", "3.8", "3.10", "3.12", "3.14", "3.16", "3.18", "3.20", "3.22", "3.24", "3.26"], "uuid": "TeaTime@oleid.mescharet.de", "name": "TeaTime", "settings-schema": "org.gnome.shell.extensions.teatime", "gettext-domain": "TeaTime", "description": "A tea steeping timer"} {"shell-version": ["3.32"], "uuid": "TeaTime@oleid.mescharet.de", "name": "TeaTime", "settings-schema": "org.gnome.shell.extensions.teatime", "gettext-domain": "TeaTime", "description": "A tea steeping timer"}

View File

@ -3,7 +3,6 @@
Thomas Liebetraut <thomas@tommie-lie.de> Thomas Liebetraut <thomas@tommie-lie.de>
*/ */
const Lang = imports.lang;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
@ -23,12 +22,9 @@ const Columns = {
ADJUSTMENT: 2 ADJUSTMENT: 2
} }
const TeaTimePrefsWidget = new Lang.Class({ var TeaTimePrefsWidget = class extends Gtk.Grid {
Name: 'TeaTimePrefsWidget', constructor() {
Extends: Gtk.Grid, super({
_init: function () {
this.parent({
orientation: Gtk.Orientation.VERTICAL, orientation: Gtk.Orientation.VERTICAL,
column_homogeneous: false, column_homogeneous: false,
vexpand: true, vexpand: true,
@ -36,6 +32,7 @@ const TeaTimePrefsWidget = new Lang.Class({
row_spacing: 5 row_spacing: 5
}); });
this.myinit = function () {
this._tealist = new Gtk.ListStore(); this._tealist = new Gtk.ListStore();
this._tealist.set_column_types([ this._tealist.set_column_types([
GObject.TYPE_STRING, GObject.TYPE_STRING,
@ -47,15 +44,15 @@ const TeaTimePrefsWidget = new Lang.Class({
this._settings = Utils.getSettings(); this._settings = Utils.getSettings();
this._inhibitUpdate = true; this._inhibitUpdate = true;
this._settings.connect("changed", Lang.bind(this, this._refresh)); this._settings.connect("changed", this._refresh.bind(this));
this._initWindow(); this._initWindow();
this._inhibitUpdate = false; this._inhibitUpdate = false;
this._refresh(); this._refresh();
this._tealist.connect("row-changed", Lang.bind(this, this._save)); this._tealist.connect("row-changed", this._save.bind(this));
this._tealist.connect("row-deleted", Lang.bind(this, this._save)); this._tealist.connect("row-deleted", this._save.bind(this));
}, };
_initWindow: function () { this._initWindow = function () {
let curRow = 0; let curRow = 0;
let labelFN = new Gtk.Label({ let labelFN = new Gtk.Label({
label: _("Fullscreen Notifications"), label: _("Fullscreen Notifications"),
@ -75,14 +72,14 @@ const TeaTimePrefsWidget = new Lang.Class({
}); });
this.fullscreenNotificationSwitch = new Gtk.Switch(); this.fullscreenNotificationSwitch = new Gtk.Switch();
this.fullscreenNotificationSwitch.connect("notify::active", Lang.bind(this, this._saveFullscreenNotifications)); this.fullscreenNotificationSwitch.connect("notify::active", this._saveFullscreenNotifications.bind(this));
this.graphicalCountdownSwitch = new Gtk.Switch(); this.graphicalCountdownSwitch = new Gtk.Switch();
this.graphicalCountdownSwitch.connect("notify::active", Lang.bind(this, this._saveGraphicalCountdown)); this.graphicalCountdownSwitch.connect("notify::active", this._saveGraphicalCountdown.bind(this));
// alarm sound file chooser // alarm sound file chooser
this.alarmSoundSwitch = new Gtk.Switch(); this.alarmSoundSwitch = new Gtk.Switch();
this.alarmSoundSwitch.connect("notify::active", Lang.bind(this, this._saveUseAlarm)); this.alarmSoundSwitch.connect("notify::active", this._saveUseAlarm.bind(this));
this.alarmSoundFile = new Gtk.FileChooserButton({ this.alarmSoundFile = new Gtk.FileChooserButton({
@ -92,7 +89,7 @@ const TeaTimePrefsWidget = new Lang.Class({
this.alarmSoundFileFilter = new Gtk.FileFilter(); this.alarmSoundFileFilter = new Gtk.FileFilter();
this.alarmSoundFile.set_filter(this.alarmSoundFileFilter); this.alarmSoundFile.set_filter(this.alarmSoundFileFilter);
this.alarmSoundFileFilter.add_mime_type("audio/*"); this.alarmSoundFileFilter.add_mime_type("audio/*");
this.alarmSoundFile.connect("selection_changed", Lang.bind(this, this._saveSoundFile)); this.alarmSoundFile.connect("selection_changed", this._saveSoundFile.bind(this));
if (!Utils.isGnome34()) { if (!Utils.isGnome34()) {
@ -132,10 +129,10 @@ const TeaTimePrefsWidget = new Lang.Class({
// This makes life a little harder due to chaining of callbacks // This makes life a little harder due to chaining of callbacks
// and the need for this._inhibitUpdate, but it feels a lot cleaner // and the need for this._inhibitUpdate, but it feels a lot cleaner
// when the UI does not know about the config storage backend. // when the UI does not know about the config storage backend.
renderer.connect("edited", Lang.bind(this, function (renderer, pathString, newValue) { renderer.connect("edited", function (renderer, pathString, newValue) {
let [store, iter] = this._tealist.get_iter(Gtk.TreePath.new_from_string(pathString)); let [store, iter] = this._tealist.get_iter(Gtk.TreePath.new_from_string(pathString));
this._tealist.set(iter, [Columns.TEA_NAME], [newValue]); this._tealist.set(iter, [Columns.TEA_NAME], [newValue]);
})); }.bind(this));
teaname.pack_start(renderer, true); teaname.pack_start(renderer, true);
teaname.add_attribute(renderer, "text", Columns.TEA_NAME); teaname.add_attribute(renderer, "text", Columns.TEA_NAME);
this.treeview.append_column(teaname); this.treeview.append_column(teaname);
@ -148,10 +145,10 @@ const TeaTimePrefsWidget = new Lang.Class({
editable: true editable: true
}); });
// See comment above. // See comment above.
spinrenderer.connect("edited", Lang.bind(this, function (renderer, pathString, newValue) { spinrenderer.connect("edited", function (renderer, pathString, newValue) {
let [store, iter] = this._tealist.get_iter(Gtk.TreePath.new_from_string(pathString)); let [store, iter] = this._tealist.get_iter(Gtk.TreePath.new_from_string(pathString));
this._tealist.set(iter, [Columns.STEEP_TIME], [parseInt(newValue)]); this._tealist.set(iter, [Columns.STEEP_TIME], [parseInt(newValue)]);
})); }.bind(this));
steeptime.pack_start(spinrenderer, true); steeptime.pack_start(spinrenderer, true);
steeptime.add_attribute(spinrenderer, "adjustment", Columns.ADJUSTMENT); steeptime.add_attribute(spinrenderer, "adjustment", Columns.ADJUSTMENT);
@ -168,16 +165,16 @@ const TeaTimePrefsWidget = new Lang.Class({
icon_name: "list-add-symbolic", icon_name: "list-add-symbolic",
use_action_appearance: false use_action_appearance: false
}); });
this.addButton.connect("clicked", Lang.bind(this, this._addTea)); this.addButton.connect("clicked", this._addTea.bind(this));
this.toolbar.insert(this.addButton, -1); this.toolbar.insert(this.addButton, -1);
this.removeButton = new Gtk.ToolButton({ this.removeButton = new Gtk.ToolButton({
icon_name: "list-remove-symbolic", icon_name: "list-remove-symbolic",
use_action_appearance: false use_action_appearance: false
}); });
this.removeButton.connect("clicked", Lang.bind(this, this._removeSelectedTea)); this.removeButton.connect("clicked", this._removeSelectedTea.bind(this));
this.toolbar.insert(this.removeButton, -1); this.toolbar.insert(this.removeButton, -1);
}, };
_refresh: function () { this._refresh = function () {
// don't update the model if someone else is messing with the backend // don't update the model if someone else is messing with the backend
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -208,8 +205,8 @@ const TeaTimePrefsWidget = new Lang.Class({
} }
this._inhibitUpdate = false; this._inhibitUpdate = false;
}, };
_addTea: function () { this._addTea = function () {
let adj = new Gtk.Adjustment({ let adj = new Gtk.Adjustment({
lower: 1, lower: 1,
step_increment: 1, step_increment: 1,
@ -221,8 +218,8 @@ const TeaTimePrefsWidget = new Lang.Class({
this.treeview.set_cursor(this._tealist.get_path(item), this.treeview.set_cursor(this._tealist.get_path(item),
this.treeview.get_column(Columns.TEA_NAME), this.treeview.get_column(Columns.TEA_NAME),
true); true);
}, };
_removeSelectedTea: function () { this._removeSelectedTea = function () {
let [selection, store] = this.treeview.get_selection().get_selected_rows(); let [selection, store] = this.treeview.get_selection().get_selected_rows();
let iters = []; let iters = [];
for (let i = 0; i < selection.length; ++i) { for (let i = 0; i < selection.length; ++i) {
@ -237,8 +234,8 @@ const TeaTimePrefsWidget = new Lang.Class({
}); });
this.treeview.get_selection().unselect_all(); this.treeview.get_selection().unselect_all();
}, };
_saveFullscreenNotifications: function (sw, data) { this._saveFullscreenNotifications = function (sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -246,8 +243,8 @@ const TeaTimePrefsWidget = new Lang.Class({
this._settings.set_boolean(this.config_keys.fullscreen_notification, this._settings.set_boolean(this.config_keys.fullscreen_notification,
sw.active); sw.active);
this._inhibitUpdate = false; this._inhibitUpdate = false;
}, };
_saveGraphicalCountdown: function (sw, data) { this._saveGraphicalCountdown = function (sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -255,8 +252,8 @@ const TeaTimePrefsWidget = new Lang.Class({
this._settings.set_boolean(this.config_keys.graphical_countdown, this._settings.set_boolean(this.config_keys.graphical_countdown,
sw.active); sw.active);
this._inhibitUpdate = false; this._inhibitUpdate = false;
}, };
_saveUseAlarm: function (sw, data) { this._saveUseAlarm = function (sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -264,8 +261,8 @@ const TeaTimePrefsWidget = new Lang.Class({
this._settings.set_boolean(this.config_keys.use_alarm_sound, this._settings.set_boolean(this.config_keys.use_alarm_sound,
sw.active); sw.active);
this._inhibitUpdate = false; this._inhibitUpdate = false;
}, };
_saveSoundFile: function (sw, data) { this._saveSoundFile = function (sw, data) {
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
if (this._inhibitUpdate) if (this._inhibitUpdate)
return; return;
@ -282,8 +279,8 @@ const TeaTimePrefsWidget = new Lang.Class({
this._settings.set_string(this.config_keys.alarm_sound, alarm_sound); this._settings.set_string(this.config_keys.alarm_sound, alarm_sound);
this._inhibitUpdate = false; this._inhibitUpdate = false;
} }
}, };
_save: function (store, path_, iter_) { this._save = function (store, path_, iter_) {
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
// don't update the backend if someone else is messing with the model // don't update the backend if someone else is messing with the model
@ -305,9 +302,11 @@ const TeaTimePrefsWidget = new Lang.Class({
this._settings.set_value(this.config_keys.steep_times, settingsValue); this._settings.set_value(this.config_keys.steep_times, settingsValue);
this._inhibitUpdate = false; this._inhibitUpdate = false;
}, };
config_keys: Utils.GetConfigKeys() this.config_keys = Utils.GetConfigKeys();
}); this.myinit();
}
};
function init() {} function init() {}

View File

@ -116,7 +116,6 @@ function formatTime(sec_num) {
function playSound(uri) { function playSound(uri) {
const Gst = imports.gi.Gst; const Gst = imports.gi.Gst;
const Lang = imports.lang;
debug("Playing " + uri); debug("Playing " + uri);
@ -125,7 +124,7 @@ function playSound(uri) {
this.player = Gst.ElementFactory.make("playbin", "player"); this.player = Gst.ElementFactory.make("playbin", "player");
this.playBus = this.player.get_bus(); this.playBus = this.player.get_bus();
this.playBus.add_signal_watch(); this.playBus.add_signal_watch();
this.playBus.connect("message", Lang.bind(this, this.playBus.connect("message",
function (playBus, message) { function (playBus, message) {
if (message != null) { if (message != null) {
// IMPORTANT: to reuse the player, set state to READY // IMPORTANT: to reuse the player, set state to READY
@ -134,7 +133,7 @@ function playSound(uri) {
this.player.set_state(Gst.State.READY); this.player.set_state(Gst.State.READY);
} }
} // message handler } // message handler
})); }.bind(this));
} // if undefined } // if undefined
this.player.set_property('uri', uri); this.player.set_property('uri', uri);
this.player.set_state(Gst.State.PLAYING); this.player.set_state(Gst.State.PLAYING);