From 02367bd39d33cee61c799a20ba0ffecb5cdfc872 Mon Sep 17 00:00:00 2001 From: flavio Date: Fri, 24 Feb 2012 23:55:56 +0000 Subject: Luna --- (limited to 'SugarMoonActivity.py') diff --git a/SugarMoonActivity.py b/SugarMoonActivity.py new file mode 100644 index 0000000..2e26742 --- /dev/null +++ b/SugarMoonActivity.py @@ -0,0 +1,334 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2008 Gary C. Martin + +# This program 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 2 of the License, or +# (at your option) any later version. + +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +# Activity web site: http://wiki.laptop.org/go/Moon +# Created: Febuary 2008 +# Author: gary@garycmartin.com +# Home page: http://www.garycmartin.com/ + +# Febrero 2012 +# Correcciones, Simplificación y Reestructuración Modular: +# Desarrollo de CalendarButton + MoonCalendar: +# Instalador y Portado a gnome: +# Flavio Danesse CeibalJAM! - Uruguay - Activity Central +# Traducciones a Español: +# Ana Cichero CeibalJAM! - Uruguay + +import gtk, pygtk, time, math, gobject, sys +from sugar.activity import activity +from gettext import gettext as _ +import MoonGlobals as MG +from Moonwidgets import * + +IMAGE_SIZE = 726 +HALF_SIZE = IMAGE_SIZE / 2 +SECONDS_PER_DAY = 86400.0 +format = "%Y-%m-%d %H:%M" + +try: + import json + json.dumps +except (ImportError, AttributeError): + import simplejson as json + +class MoonActivity(activity.Activity): + def __init__(self, handle): + activity.Activity.__init__(self, handle, True) + self.set_title(_("Luna")) + self.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + self.main_view = None + self.mooncalendar = None + self.info_panel = None + self.info = None + self.luna_hoy = None + self.label_emisferio = None + self.aspectframe = None + + self.activity_state = {} + self.max_participants = 1 + + self.set_layout() + + self.show_all() + self.realize() + self.maximize() + + self.connect("delete_event", self.delete_event) + self.luna_hoy.connect("expose_event", self.repaint) + + self.actualizador = gobject.timeout_add(1000, self.handle) + + def set_layout(self): + anio, mes, fecha, hora = MG.get_date_time_now() + self.luna_hoy = CalendarButton(anio, mes, fecha, hora) + self.mooncalendar = MoonCalendar() + self.aspectframe = gtk.AspectFrame() + self.aspectframe.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + self.aspectframe.add(self.luna_hoy) + + cajabase = gtk.VBox() + self.main_view = gtk.HBox() + cajabase.pack_end(self.main_view, True, True, 5) + + try: # Sugar 86 en adelante + from sugar.graphics.toolbarbox import ToolbarBox + from sugar.activity.widgets import StopButton + from sugar.activity.widgets import ActivityToolbarButton + + toolbox = ToolbarBox() + activity_button = ActivityToolbarButton(self) + activity_button.show() + toolbox.toolbar.insert(activity_button, 0) + + boton = gtk.ToggleToolButton() + pixbuf= gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(MG.ICONOS,'grid-ico.svg'), 32, 32) + imagen = gtk.Image() + imagen.set_from_pixbuf(pixbuf) + boton.set_icon_widget(imagen) + imagen.show() + boton.show() + toolbox.toolbar.insert(boton, -1) + boton.connect("clicked", self.toggle_grid_clicked) + boton.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + boton = gtk.ToggleToolButton() + pixbuf= gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(MG.ICONOS,'hemi-ico.svg'), 32, 32) + imagen = gtk.Image() + imagen.set_from_pixbuf(pixbuf) + boton.set_icon_widget(imagen) + imagen.show() + boton.show() + toolbox.toolbar.insert(boton, -1) + boton.connect("clicked", self.toggle_hemisphere_clicked) + boton.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + boton = gtk.ToggleToolButton() + pixbuf= gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(MG.ICONOS,'calendario-ico.svg'), 32, 32) + imagen = gtk.Image() + imagen.set_from_pixbuf(pixbuf) + boton.set_icon_widget(imagen) + imagen.show() + boton.show() + toolbox.toolbar.insert(boton, -1) + boton.connect("clicked", self.switch_calendar_luna) + boton.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + self.label_emisferio = gtk.Label() + item = gtk.ToolItem() + item.add(self.label_emisferio) + toolbox.toolbar.insert(item, -1) + self.label_emisferio.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + self.label_emisferio.modify_fg(gtk.STATE_NORMAL, MG.FOREGROUND) + self.label_emisferio.show() + + separator = gtk.SeparatorToolItem() + separator.props.draw = False + separator.set_size_request(0, -1) + separator.set_expand(True) + toolbox.toolbar.insert(separator, -1) + + toolbox.toolbar.insert(StopButton(self), -1) + + self.set_toolbar_box(toolbox) + toolbox.show_all() + + except: # Hasta Sugar 84 + view_tool_bar = gtk.Toolbar() + view_tool_bar.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + boton = gtk.ToggleToolButton() + pixbuf= gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(MG.ICONOS,'grid-ico.svg'), 32, 32) + imagen = gtk.Image() + imagen.set_from_pixbuf(pixbuf) + boton.set_icon_widget(imagen) + imagen.show() + boton.show() + view_tool_bar.append_item("", "", "",boton, self.toggle_grid_clicked, user_data=None) + boton.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + boton = gtk.ToggleToolButton() + pixbuf= gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(MG.ICONOS,'hemi-ico.svg'), 32, 32) + imagen = gtk.Image() + imagen.set_from_pixbuf(pixbuf) + boton.set_icon_widget(imagen) + imagen.show() + boton.show() + view_tool_bar.append_item("", _(""), "",boton, self.toggle_hemisphere_clicked, user_data=None) + boton.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + boton = gtk.ToggleToolButton() + pixbuf= gtk.gdk.pixbuf_new_from_file_at_size(os.path.join(MG.ICONOS,'grid-ico.svg'), 32, 32) + imagen = gtk.Image() + imagen.set_from_pixbuf(pixbuf) + boton.set_icon_widget(imagen) + imagen.show() + boton.show() + view_tool_bar.append_item("", "", "",boton, self.switch_calendar_luna, user_data=None) + boton.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + + self.label_emisferio = gtk.Label() + view_tool_bar.append_widget(self.label_emisferio, None, None) + self.label_emisferio.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + self.label_emisferio.modify_fg(gtk.STATE_NORMAL, MG.FOREGROUND) + self.label_emisferio.show() + + view_tool_bar.show_all() + toolbox = activity.ActivityToolbox(self) + toolbox.add_toolbar(_("Luna"), view_tool_bar) + self.set_toolbox(toolbox) + toolbox.show() + + info_scroll = gtk.ScrolledWindow() + info_scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + self.info_panel = gtk.VBox() + self.info = gtk.TextView() + self.info.set_property("sensitive", False) + self.info.set_border_window_size(gtk.TEXT_WINDOW_TOP, 10) + self.info.set_border_window_size(gtk.TEXT_WINDOW_LEFT, 10) + self.info.set_border_window_size(gtk.TEXT_WINDOW_RIGHT, 10) + self.info.set_border_window_size(gtk.TEXT_WINDOW_BOTTOM, 10) + self.info_panel.pack_start(self.info, False, False, 0) + info_scroll.add_with_viewport(self.info_panel) + + event = gtk.EventBox() + event.modify_bg(gtk.STATE_NORMAL, MG.BACKGROUND) + event.add(self.aspectframe) + self.main_view.pack_start(info_scroll, False, False, 5) + self.main_view.pack_end(event, True, True, 5) + self.set_canvas(cajabase) + + self.mooncalendar.set_mes(anio, mes, fecha, hora) + self.update_text_information_view() + + self.activity_state['hemisphereView'] = self.luna_hoy.hemisphere_view + self.activity_state['showGrid'] = self.luna_hoy.show_grid + self.read_and_parse_prefs(os.environ['SUGAR_ACTIVITY_ROOT'] + '/data/defaults') + + def toggle_grid_clicked(self, widget= None): + self.luna_hoy.toggle_grid_clicked() + self.mooncalendar.toggle_grid_clicked(widget= None, actualizar = self.mooncalendar in self.aspectframe.get_children()) + + def toggle_hemisphere_clicked(self, widget= None): + self.luna_hoy.toggle_hemisphere_clicked() + self.mooncalendar.toggle_hemisphere_clicked(widget= None, actualizar = self.mooncalendar in self.aspectframe.get_children()) + + def switch_calendar_luna(self, widget): + if self.mooncalendar in self.aspectframe.get_children(): + self.aspectframe.remove(self.mooncalendar) + self.aspectframe.add(self.luna_hoy) + self.luna_hoy.show_all() + elif self.luna_hoy in self.aspectframe.get_children(): + self.aspectframe.remove(self.luna_hoy) + self.aspectframe.add(self.mooncalendar) + self.mooncalendar.show_all() + self.show_all() + self.realize() + + def handle(self): + self.update_text_information_view() + if self.luna_hoy in self.aspectframe.get_children(): + self.luna_hoy.actualizar() + return True + + def repaint(self, widget= None, event= None): + x,y,w,h= self.luna_hoy.get_allocation() + anchoboton, altoboton = (w,h) + tamanioboton = min( [anchoboton,altoboton] ) + self.luna_hoy.repaint(tamanioboton) + + def delete_event(self, widget, event, data=None): + sys.exit(0) + return False + + def update_text_information_view(self): + anio, mes, fecha, hora = MG.get_date_time_now() + hoy = "%s-%s-%s %s" % (anio, mes, fecha, hora) + ahora = time.mktime(time.strptime(hoy, MG.format)) + + self.luna_hoy.data_model.update_moon_calculations(ahora) + + information = "" + information += _("Today's Moon Information\n\n") + information += "%s\n\n" % (MG.get_date_time()) + information += _("Phase:\n%s\n\n") % (self.luna_hoy.data_model.moon_phase_name(self.luna_hoy.data_model.phase_of_moon)) + information += _("Julian Date:\n%.2f (astronomical)\n\n") % (self.luna_hoy.data_model.julian_date) + + tiempo = {'days':self.luna_hoy.data_model.days_old, + 'hours':self.luna_hoy.data_model.hours_old, 'minutes':self.luna_hoy.data_model.minutes_old} + information += _("Age:\n%(days).0f days, %(hours).0f hours, %(minutes).0f minutes\n\n") % tiempo + + lunacion = {'phase':self.luna_hoy.data_model.phase_of_moon * 100, 'lunation':self.luna_hoy.data_model.lunation} + information += _("Lunation:\n%(phase).2f%% through lunation %(lunation)d\n\n") % lunacion + information += _("Surface Visibility:\n%.0f%% (estimated)\n\n") % (self.luna_hoy.data_model.percent_of_full_moon * 100) + + selen = {'deg':self.luna_hoy.data_model.selenographic_deg, 'westOrEast':self.luna_hoy.data_model.west_or_east, + 'riseOrSet':self.luna_hoy.data_model.rise_or_set} + information += _(u"Selenographic Terminator Longitude:\n%(deg).1f\u00b0%(westOrEast)s (%(riseOrSet)s)\n\n") % selen + + full = {'date':time.strftime(MG.LOCALE_DATE_FORMAT, time.localtime(self.luna_hoy.data_model.next_full_moon_date)), + 'days':self.luna_hoy.data_model.days_until_full_moon} + information += _("Next Full Moon:\n%(date)s in %(days).0f days\n\n") % full + + new = {'date':time.strftime(MG.LOCALE_DATE_FORMAT, time.localtime(self.luna_hoy.data_model.next_new_moon_date)), + 'days':self.luna_hoy.data_model.days_until_new_moon} + information += _("Next New Moon:\n%(date)s in %(days).0f days\n\n") % new + + lunare = {'date':time.strftime(MG.LOCALE_DATE_FORMAT, time.localtime(self.luna_hoy.data_model.next_lunar_eclipse_date)), + 'days':self.luna_hoy.data_model.days_until_lunar_eclipse} + information += _("Next Lunar eclipse:\n%(date)s in %(days).0f days\n\n") % lunare + + solare = {'date':time.strftime(MG.LOCALE_DATE_FORMAT, time.localtime(self.luna_hoy.data_model.next_solar_eclipse_date)), + 'days':self.luna_hoy.data_model.days_until_solar_eclipse} + information += _("Next Solar eclipse:\n%(date)s in %(days).0f days") % solare + text = gtk.TextBuffer() + text.set_text(information) + self.info.set_buffer(text) + self.label_emisferio.set_text( "%s: %s" % (_("Vista Hemisferio"),_(self.luna_hoy.hemisphere_view)) ) + + def read_and_parse_prefs(self, file_path): + try: + read_file = open(file_path, 'r') + self.activity_state = json.loads(read_file.read()) + if self.activity_state.has_key('hemisphereView'): + self.luna_hoy.hemisphere_view = self.activity_state['hemisphereView'] + if self.activity_state.has_key('showGrid'): + self.luna_hoy.show_grid = self.activity_state['showGrid'] + read_file.close() + except: + pass + + def read_file(self, file_path): + self.read_and_parse_prefs(file_path) + + def write_file(self, file_path): + self.activity_state['hemisphereView'] = self.luna_hoy.hemisphere_view + self.activity_state['showGrid'] = self.luna_hoy.show_grid + serialised_data = json.dumps(self.activity_state) + to_journal = file(file_path, 'w') + try: + to_journal.write(serialised_data) + finally: + to_journal.close() + to_persistent_fs = file(os.environ['SUGAR_ACTIVITY_ROOT'] + '/data/defaults', 'w') + try: + to_persistent_fs.write(serialised_data) + finally: + to_persistent_fs.close() + -- cgit v0.9.1