You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
647 lines
15 KiB
647 lines
15 KiB
#! /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 Soup = imports.gi.Soup;
|
|
|
|
const WEATHER_SETTINGS_SCHEMA = 'org.gnome.shell.extensions.weather';
|
|
const WEATHER_UNIT_KEY = 'unit';
|
|
const WEATHER_WIND_SPEED_UNIT_KEY = 'wind-speed-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';
|
|
|
|
// Soup session (see https://bugzilla.gnome.org/show_bug.cgi?id=661323#c64) (Simon Legner)
|
|
const _httpSession = new Soup.SessionAsync();
|
|
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
|
|
|
|
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();
|
|
var completion = new Gtk.EntryCompletion();
|
|
entry.set_completion(completion);
|
|
var completionModel = new Gtk.ListStore.c_new(1,[GObject.TYPE_STRING]);
|
|
completion.set_model(completionModel);
|
|
completion.set_text_column(0);
|
|
completion.set_match_func(function(completion,key,iter)
|
|
{
|
|
if(iter)
|
|
if(completionModel.get_value(iter,0).value.get_string())
|
|
return true;
|
|
return false;
|
|
});
|
|
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);
|
|
var d = dialog.add_button(Gtk.STOCK_OK, 1);
|
|
|
|
d.set_can_default(true);
|
|
d.sensitive = 0;
|
|
|
|
dialog.set_default(d);
|
|
entry.activates_default = true;
|
|
|
|
var testLocation = function(location)
|
|
{
|
|
that.loadJsonAsync(encodeURI("http://query.yahooapis.com/v1/public/yql?format=json&q=select woeid from geo.places where text = '"+location+"' limit 2"),function()
|
|
{
|
|
d.sensitive = 0;
|
|
var city = arguments[0].query;
|
|
if(typeof city == "object" && typeof city.results == "object")
|
|
city = city.results.place;
|
|
else
|
|
return 0;
|
|
if(typeof city.woeid == "undefined")
|
|
return 0;
|
|
else
|
|
d.sensitive = 1;
|
|
});
|
|
};
|
|
|
|
entry.signal.changed.connect(function()
|
|
{
|
|
var location = entry.get_text();
|
|
print(location);
|
|
testLocation(location);
|
|
|
|
that.loadJsonAsync(encodeURI("http://query.yahooapis.com/v1/public/yql?q=select woeid,name,admin1,country from geo.places where text = '*"+location+"*' or text = '"+location+"' limit 10&format=json"),function()
|
|
{
|
|
var city = arguments[0].query;
|
|
if(typeof city == "object" && typeof city.results == "object")
|
|
city = city.results.place;
|
|
else
|
|
return 0;
|
|
var iter = that.iter;
|
|
completionModel.clear();
|
|
if(typeof city.woeid == "undefined")
|
|
{
|
|
for(var i in city)
|
|
{
|
|
if(typeof m == "undefined")
|
|
var m = {};
|
|
var current = completionModel.append(iter).iter;
|
|
var cityText = city[i].name+", "+city[i].admin1.content+", "+city[i].country.code;
|
|
if(m[cityText])
|
|
continue;
|
|
else
|
|
m[cityText] = 1;
|
|
completionModel.set_value(current,0,cityText);
|
|
completion.complete();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var current = completionModel.append(iter).iter;
|
|
var cityText = city.name+", "+city.admin1.content+", "+city.country.code;
|
|
completionModel.set_value(current,0,cityText);
|
|
}
|
|
testLocation(location);
|
|
});
|
|
return 0;
|
|
});
|
|
|
|
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)
|
|
{
|
|
that.loadJsonAsync(encodeURI("http://query.yahooapis.com/v1/public/yql?format=json&q=select woeid,name,admin1,country from geo.places where text = '"+entry.get_text()+"'"),function()
|
|
{
|
|
var city = arguments[0].query;
|
|
if(typeof city == "object" && typeof city.results == "object")
|
|
city = city.results.place;
|
|
else
|
|
return 0;
|
|
|
|
if(that.city)
|
|
that.city = that.city+" && "+city.woeid+">"+city.name+", "+city.admin1.content+", "+city.country.code;
|
|
else
|
|
that.city = city.woeid+">"+city.name+", "+city.admin1.content+", "+city.country.code;
|
|
});
|
|
}
|
|
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",this.extractLocation(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);
|
|
var d = dialog.add_button(Gtk.STOCK_YES, 1);
|
|
|
|
d.set_can_default(true);
|
|
dialog.set_default(d);
|
|
|
|
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);
|
|
},
|
|
|
|
loadJsonAsync : function(url, fun)
|
|
{
|
|
var here = this;
|
|
var message = new Soup.Message.c_new('GET', url);
|
|
_httpSession.queue_message(message, function(_httpSession, message) {
|
|
if(!message.response_body.data)
|
|
{
|
|
fun.call(here,0);
|
|
return 0;
|
|
}
|
|
|
|
try
|
|
{
|
|
var jp = JSON.parse(message.response_body.data);
|
|
fun.call(here, jp);
|
|
}
|
|
catch(e)
|
|
{
|
|
fun.call(here,0);
|
|
return 0;
|
|
}
|
|
});
|
|
},
|
|
|
|
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 wind_speed_unit()
|
|
{
|
|
if(!this.Settings)
|
|
this.loadConfig();
|
|
return this.Settings.get_enum(WEATHER_WIND_SPEED_UNIT_KEY);
|
|
},
|
|
|
|
set wind_speed_unit(v)
|
|
{
|
|
if(!this.Settings)
|
|
this.loadConfig();
|
|
this.Settings.set_enum(WEATHER_WIND_SPEED_UNIT_KEY,v);
|
|
},
|
|
|
|
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 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;
|
|
|
|
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]);
|
|
},
|
|
|
|
extractLocation : function()
|
|
{
|
|
if(arguments[0].search(">") == -1)
|
|
return _("Invalid city");
|
|
return arguments[0].split(">")[1];
|
|
},
|
|
|
|
extractWoeid : function()
|
|
{
|
|
if(arguments[0].search(">") == -1)
|
|
return 0;
|
|
return arguments[0].split(">")[0];
|
|
},
|
|
|
|
refreshUI : function()
|
|
{
|
|
this.Window.get_object("tree-toolbutton-remove").sensitive = Boolean(this.city.length);
|
|
|
|
if(this.mCities != this.city)
|
|
{
|
|
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,this.extractLocation(city[i]));
|
|
}
|
|
}
|
|
|
|
this.mCities = this.city;
|
|
}
|
|
|
|
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(_("Wind Speed Unit"));
|
|
this.addComboBox(["km/h","mph","m/s","knots"],"wind_speed_unit");
|
|
this.addLabel(_("Position in Panel"));
|
|
this.addComboBox([_("Center"),_("Right"),_("Left")],"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();
|
|
|