=begin @description displays the aare temperature in the system tray @author alexis reigel, mail@koffeinfrei.org @date april 05 @version 0.2 @changelog 0.2/2007-08-06 : supports now koffeinfrei xml interface @license gpl version >= 2 =end ################################################################################ #$KCODE = 'u' require 'gtktrayicon' require 'open-uri' require 'cgi' require "rexml/document" include REXML # prefix REXML:: ################################################################################ @@data = Hash.new("-") @@font_color = Gdk::Color.parse("white") @@bg_color = Gdk::Color.parse("#4e85d7") ################################################################################ # update def update get_data set_labels return true end # retrieves data from aaremarzili def get_data begin content = URI.parse("http://koffeinfrei.org/aaremarzili/GetAMData.php").read xmlDoc = Document.new content xmlDoc.elements.each("/data/*") do |element| #@@data[element.name] = GLib.convert(CGI::unescapeHTML(element.attributes["value"]), "iso-8859-1", "utf-8") @@data[element.name] = CGI::unescapeHTML(element.attributes["value"]) end rescue puts "#{Time.new.strftime("%Y-%m-%d %H:%M:%S")}\terror [#{$!}]" end end # updates the labels def set_labels @@treestore.clear @@label_temp.text = @@data["TemperaturAare"][/^[^°]+/] @@tooltips.set_tip(@@icon, "Aare Temperatur: #{@@data["TemperaturAare"]}", nil) ["TemperaturAare", "TemperaturLuft", "AareSchwummIndex", "Regen", "Badebedingungen", "Ozon", "Pegel", "Abfluss", "LetzteAktualisierung" ].each do |key| iter = @@treestore.append(nil) iter[2] = 1.0 iter[3] = 400 if key == "LetzteAktualisierung" iter[0] = "Letzte Aktualisierung" iter[2] = 0.8 else iter[0] = key end if key == "TemperaturAare" iter[0] = "Temperatur" #iter[2] = 1.0 iter[3] = 600 end if key == "TemperaturLuft" iter[0] = "Luft" end if key == "AareSchwummIndex" iter[0] = "Aareschwummindex" end if key.empty? then iter[1] = "" else iter[1] = @@data[key] end end end # popupmenu on tray right click class PopupMenu < Gtk::Menu def initialize super() if @@window.visible? item_toggledetails = Gtk::MenuItem.new("Details ausblenden") else item_toggledetails = Gtk::MenuItem.new("Details anzeigen") end item_update = Gtk::MenuItem.new("Daten aktualisieren") item_fontcolor = Gtk::MenuItem.new("Schriftfarbe wählen") item_bgcolor = Gtk::MenuItem.new("Hintergrundfarbe wählen") item_defaults = Gtk::MenuItem.new("Standardwerte setzen") item_about = Gtk::MenuItem.new("Über...") item_quit = Gtk::MenuItem.new("Beenden") append(item_toggledetails) append(item_update) append(Gtk::MenuItem.new) append(item_fontcolor) append(item_bgcolor) append(item_defaults) append (Gtk::MenuItem.new) append(item_about) append(item_quit) item_toggledetails.signal_connect("button_press_event") do |widget, event| if @@window.visible? @@window.hide else @@window.show_all end end item_update.signal_connect("button_press_event") do |widget, event| update end item_fontcolor.signal_connect("button_press_event") do |widget, event| color_dialog = Gtk::ColorSelectionDialog.new("Schriftfarbe wählen") color_sel = color_dialog.colorsel color_sel.set_previous_color(@@font_color) color_sel.set_current_color(@@font_color) color_sel.set_has_palette(true) #color_sel.set_has_opacity_control(true) --> TODO: add opacity to color color_sel.signal_connect("color_changed") do |widget, event| @@label_temp.modify_fg(Gtk::STATE_NORMAL, widget.current_color) end if color_dialog.run == Gtk::Dialog::RESPONSE_OK puts "#{Time.new.strftime("%Y-%m-%d %H:%M:%S")}\tbackground color changed "+ "[#{color_sel.current_color}]" @@font_color = color_sel.current_color @@label_temp.modify_fg(Gtk::STATE_NORMAL, @@font_color) else @@label_temp.modify_fg(Gtk::STATE_NORMAL, @@font_color) end color_dialog.hide end item_bgcolor.signal_connect("button_press_event") do |widget, event| color_dialog = Gtk::ColorSelectionDialog.new("Hintergrundfarbe wählen") color_sel = color_dialog.colorsel color_sel.set_previous_color(@@bg_color) color_sel.set_current_color(@@bg_color) color_sel.set_has_palette(true) #color_sel.set_has_opacity_control(true) --> TODO: add opacity to color color_sel.signal_connect("color_changed") do |widget, event| @@icon.modify_bg(Gtk::STATE_NORMAL, widget.current_color) end if color_dialog.run == Gtk::Dialog::RESPONSE_OK puts "#{Time.new.strftime("%Y-%m-%d %H:%M:%S")}\tbackground color changed "+ "[#{color_sel.current_color}]" @@bg_color = color_sel.current_color @@icon.modify_bg(Gtk::STATE_NORMAL, @@bg_color) else @@icon.modify_bg(Gtk::STATE_NORMAL, @@bg_color) end color_dialog.hide end item_about.signal_connect("button_press_event") do |widget, event| if event.kind_of? Gdk::EventButton about = Gtk::AboutDialog.new about.name = "AareMarzili Temperature" about.version = "0.1" about.copyright = "©2006 koffeinfrei.org" #about.comments = "Zeigt die Temperatur der Aare im System Tray an" open "http://www.gnu.org/licenses/gpl.txt" do |f| about.license = f.read end about.website = "http://aaremarzili.ch" about.website_label = "aaremarzili.ch" about.authors = ["Alexis Reigel"] about.show end end item_quit.signal_connect("button_press_event") do |widget, event| if event.kind_of? Gdk::EventButton Gtk.main_quit false end end show_all end end ################################################################################ Gtk.init @@treestore = Gtk::TreeStore.new(String, String, Float, Fixnum) content = Gtk::TreeView.new(@@treestore).set_headers_visible(false).set_enable_search(false) content.selection.mode = Gtk::SELECTION_NONE renderer = Gtk::CellRendererText.new content.append_column(Gtk::TreeViewColumn.new("", renderer, :text => 0, :scale => 2, :weight => 3)) content.append_column(Gtk::TreeViewColumn.new("", renderer, :text => 1, :scale => 2, :weight => 3)) @@tooltips = Gtk::Tooltips.new @@label_temp = Gtk::Label.new("-") @@label_temp.modify_fg(Gtk::STATE_NORMAL, @@font_color) @@icon = Gtk::EventBox.new update #update every 30min Gtk::timeout_add(1800000) do update end @@window = Gtk::Window.new @@window.title = "Aaremarzili" @@window.keep_above = true #@@window.decorated = false @@window.allow_grow = false @@window.allow_shrink = false @@window.signal_connect("delete_event") { @@window.hide } @@window.add_events(Gdk::Event::BUTTON_PRESS_MASK) @@window.add(content) @@window.window_position = Gtk::Window::POS_MOUSE @@icon.modify_bg(Gtk::STATE_NORMAL, @@bg_color) @@icon.add(@@label_temp) @@icon.signal_connect("button_press_event"){ |widget, event| # left click (toggle detail window) if event.kind_of? Gdk::EventButton and event.button == 1 if @@window.visible? @@window.hide else @@window.show_all end # right click (show menu) elsif event.kind_of? Gdk::EventButton and event.button == 3 PopupMenu.new.popup(nil, nil, event.button, event.time) end } tray = Gtk::TrayIcon.new("Aaremarzili") tray.add(@@icon) tray.show_all Gtk.main