diff --git a/src/weather-settings.desktop.in b/src/weather-settings.desktop.in new file mode 100644 index 0000000..177a028 --- /dev/null +++ b/src/weather-settings.desktop.in @@ -0,0 +1,13 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +Type=Application +Name=Weather Settings +Comment=Weather preferences panel +Exec=@EXTENSIONDIR@/weather-settings +Icon=preferences-system +Terminal=false +Categories=GNOME;Settings; +StartupNotify=true +Name[fr]=Paramètres de la météo +Comment[fr]=Panel de préférences météo diff --git a/src/weather-settings.js.in b/src/weather-settings.js.in new file mode 100644 index 0000000..0b68f5a --- /dev/null +++ b/src/weather-settings.js.in @@ -0,0 +1,485 @@ +#! /usr/bin/env seed +/* + * + * Weather Settings for GNOME Shell Extension Weather + * + * Copyright (C) 2012 + * Christian METZLER + * + * + * 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 . + * + */ + +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(); + 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(_("Add..."), 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(" && "); + var ac = this.actual_city; + var textDialog = _("Remove "+city[ac]+" ?"); + var dialog = new Gtk.Dialog({title : ""}); + 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_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() + { + 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(_("Condition 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(); diff --git a/src/weather-settings.ui b/src/weather-settings.ui new file mode 100644 index 0000000..0e372e5 --- /dev/null +++ b/src/weather-settings.ui @@ -0,0 +1,113 @@ + + + + + False + False + + + 14 + + + True + False + 2 + 1 + 6 + + + True + True + in + 200 + 250 + + + True + True + False + False + 12 + + + + + + + + + + GTK_FILL + + + + + True + False + icons + 1 + + + + True + False + False + list-add-symbolic + + + + False + True + + + + + True + False + False + list-remove-symbolic + + + + False + True + + + + + 1 + 2 + GTK_FILL + GTK_SHRINK + + + + + + + True + False + True + + + True + False + 6 + 2 + 36 + 20 + 36 + + + + + True + True + + + + + +