|
|
|
#! /usr/bin/env seed
|
|
|
|
/*
|
|
|
|
*
|
|
|
|
* Weather Settings for GNOME Shell Extension Weather
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012
|
|
|
|
* Christian METZLER <neroth@xeked.com>
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* This file is part of gnome-shell-extension-weather.
|
|
|
|
*
|
|
|
|
* gnome-shell-extension-weather 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 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* gnome-shell-extension-weather 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 gnome-shell-extension-weather. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
const Gtk = imports.gi.Gtk;
|
|
|
|
const GObject = imports.gi.GObject;
|
|
|
|
const GtkBuilder = imports.gtkbuilder;
|
|
|
|
const Gio = imports.gi.Gio;
|
|
|
|
const Gettext = imports.gettext;
|
|
|
|
const _ = Gettext.gettext;
|
|
|
|
|
|
|
|
const WEATHER_SETTINGS_SCHEMA = 'org.gnome.shell.extensions.weather';
|
|
|
|
const WEATHER_UNIT_KEY = 'unit';
|
|
|
|
const WEATHER_CITY_KEY = 'city';
|
|
|
|
const WEATHER_ACTUAL_CITY_KEY = 'actual-city';
|
|
|
|
const WEATHER_TRANSLATE_CONDITION_KEY = 'translate-condition';
|
|
|
|
const WEATHER_USE_SYMBOLIC_ICONS_KEY = 'use-symbolic-icons';
|
|
|
|
const WEATHER_SHOW_TEXT_IN_PANEL_KEY = 'show-text-in-panel';
|
|
|
|
const WEATHER_POSITION_IN_PANEL_KEY = 'position-in-panel';
|
|
|
|
const WEATHER_SHOW_COMMENT_IN_PANEL_KEY = 'show-comment-in-panel';
|
|
|
|
const WEATHER_REFRESH_INTERVAL = 'refresh-interval';
|
|
|
|
|
|
|
|
var WeatherSetting = function()
|
|
|
|
{
|
|
|
|
Gettext.textdomain("gnome-shell-extension-weather");
|
|
|
|
|
|
|
|
Gtk.init(Seed.argv);
|
|
|
|
|
|
|
|
this.initWindow();
|
|
|
|
|
|
|
|
this.refreshUI();
|
|
|
|
|
|
|
|
this.showWindow();
|
|
|
|
|
|
|
|
Gtk.main();
|
|
|
|
};
|
|
|
|
|
|
|
|
WeatherSetting.prototype =
|
|
|
|
{
|
|
|
|
addCity : function()
|
|
|
|
{
|
|
|
|
var that = this;
|
|
|
|
var textDialog = _("Name of the city");
|
|
|
|
var dialog = new Gtk.Dialog({title : ""});
|
|
|
|
var entry = new Gtk.Entry();
|
|
|
|
entry.margin_top = 12;
|
|
|
|
entry.margin_bottom = 12;
|
|
|
|
var label = new Gtk.Label({label : textDialog});
|
|
|
|
|
|
|
|
dialog.set_border_width(12);
|
|
|
|
dialog.set_modal(1);
|
|
|
|
dialog.set_resizable(0);
|
|
|
|
dialog.set_transient_for(this.Window.get_object("main-window"));
|
|
|
|
|
|
|
|
dialog.add_button(Gtk.STOCK_CANCEL, 0);
|
|
|
|
dialog.add_button(Gtk.STOCK_OK, 1);
|
|
|
|
var dialog_area = dialog.get_content_area();
|
|
|
|
dialog_area.pack_start(label);
|
|
|
|
dialog_area.pack_start(entry);
|
|
|
|
dialog.signal.response.connect(function(w, response_id) {
|
|
|
|
if(response_id)
|
|
|
|
if(that.city)
|
|
|
|
that.city = that.city+" && "+entry.get_text();
|
|
|
|
else
|
|
|
|
that.city = entry.get_text();
|
|
|
|
dialog.hide();
|
|
|
|
});
|
|
|
|
|
|
|
|
dialog.show_all();
|
|
|
|
},
|
|
|
|
|
|
|
|
removeCity : function()
|
|
|
|
{
|
|
|
|
var that = this;
|
|
|
|
var city = this.city.split(" && ");
|
|
|
|
if(!city.length)
|
|
|
|
return 0;
|
|
|
|
var ac = this.actual_city;
|
|
|
|
var textDialog = _("Remove %s ?").replace("%s",city[ac]);
|
|
|
|
var dialog = new Gtk.Dialog({title : ""});
|
|
|
|
var label = new Gtk.Label({label : textDialog});
|
|
|
|
label.margin_bottom = 12;
|
|
|
|
|
|
|
|
dialog.set_border_width(12);
|
|
|
|
dialog.set_modal(1);
|
|
|
|
dialog.set_resizable(0);
|
|
|
|
dialog.set_transient_for(this.Window.get_object("main-window"));
|
|
|
|
|
|
|
|
dialog.add_button(Gtk.STOCK_NO, 0);
|
|
|
|
dialog.add_button(Gtk.STOCK_YES, 1);
|
|
|
|
var dialog_area = dialog.get_content_area();
|
|
|
|
dialog_area.pack_start(label);
|
|
|
|
dialog.signal.response.connect(function(w, response_id)
|
|
|
|
{
|
|
|
|
if(response_id)
|
|
|
|
{
|
|
|
|
if(city.length == 0)
|
|
|
|
city = [];
|
|
|
|
|
|
|
|
if(city.length > 0 && typeof city != "object")
|
|
|
|
city = [city];
|
|
|
|
|
|
|
|
if(city.length > 0)
|
|
|
|
city.splice(ac,1);
|
|
|
|
|
|
|
|
if(city.length > 1)
|
|
|
|
that.city = city.join(" && ");
|
|
|
|
else if(city[0])
|
|
|
|
that.city = city[0];
|
|
|
|
else
|
|
|
|
that.city = "";
|
|
|
|
}
|
|
|
|
dialog.hide();
|
|
|
|
});
|
|
|
|
|
|
|
|
dialog.show_all();
|
|
|
|
},
|
|
|
|
|
|
|
|
changeSelection : function()
|
|
|
|
{
|
|
|
|
var path = this.actual_city;
|
|
|
|
if(arguments[0])
|
|
|
|
path = arguments[0];
|
|
|
|
path = new Gtk.TreePath.from_string(path);
|
|
|
|
this.treeview.get_selection().select_path(path);
|
|
|
|
},
|
|
|
|
|
|
|
|
loadConfig : function()
|
|
|
|
{
|
|
|
|
var that = this;
|
|
|
|
var schema = WEATHER_SETTINGS_SCHEMA;
|
|
|
|
if (Gio.Settings.list_schemas().indexOf(schema) == -1)
|
|
|
|
throw _("Schema \"%s\" not found.").format(schema);
|
|
|
|
this.Settings = new Gio.Settings({ schema: schema });
|
|
|
|
this.Settings.signal.connect("changed",function(){that.refreshUI();});
|
|
|
|
},
|
|
|
|
|
|
|
|
get units()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_enum(WEATHER_UNIT_KEY);
|
|
|
|
},
|
|
|
|
|
|
|
|
set units()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_enum(WEATHER_UNIT_KEY,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
get city()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_string(WEATHER_CITY_KEY);
|
|
|
|
},
|
|
|
|
|
|
|
|
set city()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_string(WEATHER_CITY_KEY,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
get actual_city()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
var a = this.Settings.get_int(WEATHER_ACTUAL_CITY_KEY);
|
|
|
|
var b = a;
|
|
|
|
var citys = this.city.split(" && ");
|
|
|
|
|
|
|
|
if(citys && typeof citys == "string")
|
|
|
|
citys = [citys];
|
|
|
|
|
|
|
|
var l = citys.length-1;
|
|
|
|
|
|
|
|
if(a < 0)
|
|
|
|
a = 0;
|
|
|
|
|
|
|
|
if(l < 0)
|
|
|
|
l = 0;
|
|
|
|
|
|
|
|
if(a > l)
|
|
|
|
a = l;
|
|
|
|
|
|
|
|
if(a != b)
|
|
|
|
this.actual_city = a;
|
|
|
|
return a;
|
|
|
|
},
|
|
|
|
|
|
|
|
set actual_city()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
var a = arguments[0];
|
|
|
|
var citys = this.city.split(" && ");
|
|
|
|
|
|
|
|
if(citys && typeof citys == "string")
|
|
|
|
citys = [citys];
|
|
|
|
|
|
|
|
var l = citys.length-1;
|
|
|
|
|
|
|
|
if(a < 0)
|
|
|
|
a = 0;
|
|
|
|
|
|
|
|
if(l < 0)
|
|
|
|
l = 0;
|
|
|
|
|
|
|
|
if(a > l)
|
|
|
|
a = l;
|
|
|
|
|
|
|
|
this.Settings.set_int(WEATHER_ACTUAL_CITY_KEY,a);
|
|
|
|
},
|
|
|
|
|
|
|
|
get translate_condition()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_boolean(WEATHER_TRANSLATE_CONDITION_KEY);
|
|
|
|
},
|
|
|
|
|
|
|
|
set translate_condition()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_boolean(WEATHER_TRANSLATE_CONDITION_KEY,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
get icon_type()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_boolean(WEATHER_USE_SYMBOLIC_ICONS_KEY);
|
|
|
|
},
|
|
|
|
|
|
|
|
set icon_type()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_boolean(WEATHER_USE_SYMBOLIC_ICONS_KEY,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
get text_in_panel()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_boolean(WEATHER_SHOW_TEXT_IN_PANEL_KEY);
|
|
|
|
},
|
|
|
|
|
|
|
|
set text_in_panel()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_boolean(WEATHER_SHOW_TEXT_IN_PANEL_KEY,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
get position_in_panel()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_enum(WEATHER_POSITION_IN_PANEL_KEY);
|
|
|
|
},
|
|
|
|
|
|
|
|
set position_in_panel()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_enum(WEATHER_POSITION_IN_PANEL_KEY,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
get comment_in_panel()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_boolean(WEATHER_SHOW_COMMENT_IN_PANEL_KEY);
|
|
|
|
},
|
|
|
|
|
|
|
|
set comment_in_panel()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_boolean(WEATHER_SHOW_COMMENT_IN_PANEL_KEY,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
get refresh_interval()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
return this.Settings.get_int(WEATHER_REFRESH_INTERVAL);
|
|
|
|
},
|
|
|
|
|
|
|
|
set refresh_interval()
|
|
|
|
{
|
|
|
|
if(!this.Settings)
|
|
|
|
this.loadConfig();
|
|
|
|
this.Settings.set_int(WEATHER_REFRESH_INTERVAL,arguments[0]);
|
|
|
|
},
|
|
|
|
|
|
|
|
refreshUI : function()
|
|
|
|
{
|
|
|
|
this.Window.get_object("tree-toolbutton-remove").sensitive = Boolean(this.city.length);
|
|
|
|
|
|
|
|
if(typeof this.liststore != "undefined")
|
|
|
|
this.liststore.clear();
|
|
|
|
|
|
|
|
if(this.city.length > 0)
|
|
|
|
{
|
|
|
|
var city = String(this.city).split(" && ");
|
|
|
|
|
|
|
|
if(city && typeof city == "string")
|
|
|
|
city = [city];
|
|
|
|
|
|
|
|
var iter = this.iter;
|
|
|
|
|
|
|
|
for(var i in city)
|
|
|
|
{
|
|
|
|
var a = this.liststore.append(iter);
|
|
|
|
var current = a.iter;
|
|
|
|
this.liststore.set_value(current,0,city[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this.changeSelection();
|
|
|
|
}
|
|
|
|
|
|
|
|
var config = this.configWidgets;
|
|
|
|
for(var i in config)
|
|
|
|
if(config[i][0].active != this[config[i][1]])
|
|
|
|
config[i][0].active = this[config[i][1]];
|
|
|
|
},
|
|
|
|
|
|
|
|
initConfigWidget : function()
|
|
|
|
{
|
|
|
|
var a = this.Window.get_object("right-widget-table");
|
|
|
|
a.visible = 1;
|
|
|
|
a.can_focus = 0;
|
|
|
|
this.widget = a;
|
|
|
|
},
|
|
|
|
x : [0,1],
|
|
|
|
y : [0,1],
|
|
|
|
configWidgets : [],
|
|
|
|
inc : function()
|
|
|
|
{
|
|
|
|
if(this.x[0] == 1)
|
|
|
|
{
|
|
|
|
this.x[0] = 0;
|
|
|
|
this.x[1] = 1;
|
|
|
|
this.y[0] += 1;
|
|
|
|
this.y[1] += 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this.x[0] += 1;
|
|
|
|
this.x[1] += 1;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
addLabel : function(text)
|
|
|
|
{
|
|
|
|
var l = new Gtk.Label({label:text,xalign:0});
|
|
|
|
l.visible = 1;
|
|
|
|
l.can_focus = 0;
|
|
|
|
this.widget.attach(l, this.x[0],this.x[1], this.y[0],this.y[1]);
|
|
|
|
this.inc();
|
|
|
|
},
|
|
|
|
addComboBox : function(a,b)
|
|
|
|
{
|
|
|
|
var that = this;
|
|
|
|
var cf = new Gtk.ComboBoxText();
|
|
|
|
this.configWidgets.push([cf,b]);
|
|
|
|
cf.visible = 1;
|
|
|
|
cf.can_focus = 0;
|
|
|
|
cf.width_request = 75;
|
|
|
|
for(var i in a)
|
|
|
|
cf.append_text(a[i]);
|
|
|
|
cf.active = this[b];
|
|
|
|
cf.signal.changed.connect(function(){that[b] = arguments[0].active;});
|
|
|
|
this.widget.attach(cf, this.x[0],this.x[1], this.y[0],this.y[1]);
|
|
|
|
this.inc();
|
|
|
|
},
|
|
|
|
addSwitch : function(a)
|
|
|
|
{
|
|
|
|
var that = this;
|
|
|
|
var sw = new Gtk.Switch();
|
|
|
|
this.configWidgets.push([sw,a]);
|
|
|
|
sw.visible = 1;
|
|
|
|
sw.can_focus = 0;
|
|
|
|
sw.active = this[a];
|
|
|
|
sw.signal.connect("notify::active",function(){that[a] = arguments[0].active;});
|
|
|
|
this.widget.attach(sw, this.x[0],this.x[1], this.y[0],this.y[1]);
|
|
|
|
this.inc();
|
|
|
|
},
|
|
|
|
|
|
|
|
initWindow : function()
|
|
|
|
{
|
|
|
|
var that = this;
|
|
|
|
this.Window = new Gtk.Builder();
|
|
|
|
|
|
|
|
this.Window.add_from_file("@EXTENSIONDIR@/weather-settings.ui");
|
|
|
|
|
|
|
|
this.Window.get_object("main-window").title = _("Weather Settings");
|
|
|
|
|
|
|
|
this.Window.connect_signals(
|
|
|
|
{
|
|
|
|
add_button_clicked: function(button)
|
|
|
|
{
|
|
|
|
that.addCity();
|
|
|
|
},
|
|
|
|
remove_button_clicked: function(button)
|
|
|
|
{
|
|
|
|
that.removeCity();
|
|
|
|
},
|
|
|
|
selection_changed : function(selection)
|
|
|
|
{
|
|
|
|
that.selectionChanged(selection);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
this.treeview = this.Window.get_object("tree-treeview");
|
|
|
|
|
|
|
|
this.iter = new Gtk.TreeIter();
|
|
|
|
|
|
|
|
this.liststore = new Gtk.ListStore.c_new(1,[GObject.TYPE_STRING]);
|
|
|
|
|
|
|
|
this.treeview.set_model(this.liststore);
|
|
|
|
|
|
|
|
var column = new Gtk.TreeViewColumn()
|
|
|
|
this.treeview.append_column(column);
|
|
|
|
|
|
|
|
renderer = new Gtk.CellRendererText();
|
|
|
|
column.pack_start(renderer);
|
|
|
|
|
|
|
|
column.set_cell_data_func(renderer,function()
|
|
|
|
{
|
|
|
|
arguments[1].markup = arguments[2].get_value(arguments[3],0).value.get_string();
|
|
|
|
});
|
|
|
|
|
|
|
|
this.initConfigWidget();
|
|
|
|
this.addLabel(_("Temperature Unit"));
|
|
|
|
this.addComboBox(["°C","°F"],"units");
|
|
|
|
this.addLabel(_("Position in Panel"));
|
|
|
|
this.addComboBox([_("Center"),_("Left"),_("Right")],"position_in_panel");
|
|
|
|
this.addLabel(_("Translate Conditions"));
|
|
|
|
this.addSwitch("translate_condition");
|
|
|
|
this.addLabel(_("Symbolic Icons"));
|
|
|
|
this.addSwitch("icon_type");
|
|
|
|
this.addLabel(_("Temperature in Panel"));
|
|
|
|
this.addSwitch("text_in_panel");
|
|
|
|
this.addLabel(_("Conditions in Panel"));
|
|
|
|
this.addSwitch("comment_in_panel");
|
|
|
|
},
|
|
|
|
|
|
|
|
showWindow : function()
|
|
|
|
{
|
|
|
|
this.Window.get_object("main-window").signal.hide.connect(Gtk.main_quit);
|
|
|
|
this.Window.get_object("main-window").show_all();
|
|
|
|
},
|
|
|
|
|
|
|
|
selectionChanged : function(select)
|
|
|
|
{
|
|
|
|
if(typeof select.get_selected_rows(this.treestore)[0] == "object")
|
|
|
|
{
|
|
|
|
var a = select.get_selected_rows(this.treestore)[0].to_string();
|
|
|
|
if(this.actual_city != parseInt(a))
|
|
|
|
this.actual_city = parseInt(a);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
new WeatherSetting();
|