Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamus_ <mail2samus@gmail.com>2009-10-15 04:29:21 (GMT)
committer Samus_ <mail2samus@gmail.com>2009-10-15 04:29:21 (GMT)
commit3245f7c763d33e5a05300a54f6af1c961654927e (patch)
tree5f66ca3e9ad7d3d4c97b788dac29e8bf7684ab80
parentceeb557800ff3b9caa3e3728786ff5ffd15f639f (diff)
starting second rewrite to refactor window classes and integrate sugar
-rw-r--r--application.py75
-rw-r--r--data/background.pngbin41026 -> 0 bytes
-rw-r--r--data/completed.pngbin1941 -> 0 bytes
-rw-r--r--data/failed.pngbin3838 -> 0 bytes
-rw-r--r--data/gameover.pngbin36776 -> 0 bytes
-rw-r--r--data/start.pngbin16189 -> 0 bytes
-rw-r--r--data/state_inicio.glade73
-rw-r--r--data/win.pngbin45490 -> 0 bytes
-rw-r--r--estados.py89
-rwxr-xr-xfracciones.py10
-rw-r--r--fracciones_activity.py16
-rwxr-xr-xfracciones_standalone.py11
-rw-r--r--juego1.py231
-rw-r--r--main.py10
-rw-r--r--templates/frame.glade (renamed from data/frame.glade)76
-rw-r--r--torta.py64
-rw-r--r--utils.py18
17 files changed, 118 insertions, 555 deletions
diff --git a/application.py b/application.py
index 22391d8..fa28f26 100644
--- a/application.py
+++ b/application.py
@@ -1,62 +1,35 @@
-# -*- encoding: utf-8
-"""
-Modulo que define la aplicación principal que carga el Frame de la ventana,
-inicializa la informacion de la aplicación y permite cambiar entre los
-estados que manejan el Content.
+# -*- coding: utf-8 -*-
+import gtk, pygtk
+from os import path
-"""
-import logging
-import gtk
-from estados import Inicio
+pygtk.require("2.0")
+def reparent(manager, template, container):
+ builder = gtk.Builder()
+ builder.add_from_file(path.join("templates", template))
+ builder.connect_signals(manager)
-log = logging.getLogger(__name__)
+ window = builder.get_object("window")
+ for child in window.get_children():
+ child.reparent(container)
+class ApplicationManager(object):
+ """ Maquina de estados principal
-class Application(object):
+ -Inicializa contenido de la ventana (marco) tanto para Sugar como Standalone
+ -Provee el metodo 'change_state' utilizado para cargar un nuevo bloque dentro del marco
+ -Provee atributo 'state_info' (diccionario compartido que almacena los datos de cada contenido cargado)
"""
- Singleton correspondiente a la aplicación principal.
- Contiene un diccionario que mantiene la información que sera utilizada por
- los distintos estados del juego.
+ def __init__(self, frame_container):
+ super(ApplicationManager, self).__init__()
- """
- def __init__(self):
- """
- Cargamos el xml que define la interfaz (el marco), asignamos los
- eventos, creamos y asignamos el primer estado del juego.
-
- """
- builder = gtk.Builder()
- builder.add_from_file("data/frame.glade")
- window = builder.get_object("window")
- self.gtkcontent = builder.get_object("dummycontent")
- builder.connect_signals(self)
-
- self.info = dict()
- self.change_state(Inicio(self))
-
- window.show()
-
-
- def change_state(self, state):
- """
- Cambiamos el estado de la aplicación, modificamos Content.
+ reparent(self, "frame.glade", frame_container)
- """
- self.state = state
+ #self.state_info = dict()
+ #self.change_state(Inicio(self))
- parent = self.gtkcontent.parent
- parent.remove(self.gtkcontent)
- self.gtkcontent = state.content
- state.get_content().reparent(parent)
+ frame_container.connect("destroy", self.gtk_main_quit)
+ frame_container.show()
-
- def on_FRAME_destroy(self, userdata):
+ def gtk_main_quit(self, userdata=None):
gtk.main_quit()
-
-
- def run(self):
- gtk.main()
-
-
-app = Application()
diff --git a/data/background.png b/data/background.png
deleted file mode 100644
index e4a8351..0000000
--- a/data/background.png
+++ /dev/null
Binary files differ
diff --git a/data/completed.png b/data/completed.png
deleted file mode 100644
index c6d04c3..0000000
--- a/data/completed.png
+++ /dev/null
Binary files differ
diff --git a/data/failed.png b/data/failed.png
deleted file mode 100644
index b5c1896..0000000
--- a/data/failed.png
+++ /dev/null
Binary files differ
diff --git a/data/gameover.png b/data/gameover.png
deleted file mode 100644
index 085c038..0000000
--- a/data/gameover.png
+++ /dev/null
Binary files differ
diff --git a/data/start.png b/data/start.png
deleted file mode 100644
index cc9d314..0000000
--- a/data/start.png
+++ /dev/null
Binary files differ
diff --git a/data/state_inicio.glade b/data/state_inicio.glade
deleted file mode 100644
index 8a5b80a..0000000
--- a/data/state_inicio.glade
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0"?>
-<interface>
- <requires lib="gtk+" version="2.16"/>
- <!-- interface-naming-policy project-wide -->
- <object class="GtkWindow" id="window">
- <child>
- <object class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
- <child>
- <object class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <child>
- <object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Fractions of Cakes</property>
- <attributes>
- <attribute name="underline" value="True"/>
- <attribute name="scale" value="2.500000"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <child>
- <object class="GtkButton" id="button1">
- <property name="label" translatable="yes">Jugar!</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="xalign">0.55000001192092896</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="yalign">1</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <property name="bottom_padding">10</property>
- <property name="right_padding">10</property>
- <child>
- <object class="GtkButton" id="button2">
- <property name="label" translatable="yes">Instrucciones &#xBB;</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
-</interface>
diff --git a/data/win.png b/data/win.png
deleted file mode 100644
index 18f6b8c..0000000
--- a/data/win.png
+++ /dev/null
Binary files differ
diff --git a/estados.py b/estados.py
deleted file mode 100644
index 269f2fb..0000000
--- a/estados.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# -*- encoding: utf-8
-"""
-Mantenemos los distintos estados de la aplicación.
-
-class State(object):
- def __init__(self):
- debe retornar el contenido que se pondra en CONTENT.
-
-"""
-import logging
-import gtk
-import cairo
-
-
-log = logging.getLogger(__name__)
-IMAGE = {
- "start": cairo.ImageSurface.create_from_png("data/start.png"),
- "background": cairo.ImageSurface.create_from_png("data/background.png"),
- "completed": cairo.ImageSurface.create_from_png("data/completed.png"),
- "failed": cairo.ImageSurface.create_from_png("data/failed.png"),
- "win": cairo.ImageSurface.create_from_png("data/win.png"),
- "gameover": cairo.ImageSurface.create_from_png("data/gameover.png"),
-}
-
-
-class Inicio(object):
- def __init__(self, state):
- builder = gtk.Builder()
- builder.add_from_file("data/state_inicio.glade")
- builder.connect_signals(self)
- self.content = builder.get_object("window").child
- self.state = state
-
-
- def get_content(self):
- """
- Devuelve el widget que colocaremos en content_container.
-
- """
- log.debug("gtk: %s", self.content)
- return self.content
-
-
- def dibujar(self):
- cr = self.content.window.cairo_create()
- cr.set_source_surface(IMAGE["start"], 0, 0)
- cr.paint()
-
-
- def on_drawingarea_button_press_event(self, widget, event):
- log.debug("-> cambiar estado a Jugar")
- self.state.change_state(Fin(self.state))
-
-
- def on_drawingarea_expose_event(self, widget, event):
- self.dibujar()
-
-
-class Fin(object):
- def __init__(self, state):
- self.state = state
- builder = gtk.Builder()
- builder.add_from_file("data/state_inicio.glade")
- builder.connect_signals(self)
- self.content = builder.get_object("window").child
-
-
- def get_content(self):
- """
- Devuelve el widget que colocaremos en content_container.
-
- """
- log.debug("gtk: %s", self.content)
- return self.content
-
-
- def dibujar(self):
- cr = self.content.window.cairo_create()
- cr.set_source_surface(IMAGE["win"], 0, 0)
- cr.paint()
-
-
- def on_drawingarea_button_press_event(self, widget, event):
- log.debug("-> cambiar estado a Jugar")
- self.state.change_state(Inicio(self.state))
-
-
- def on_drawingarea_expose_event(self, widget, event):
- self.dibujar()
diff --git a/fracciones.py b/fracciones.py
deleted file mode 100755
index 28b95af..0000000
--- a/fracciones.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python
-import logging
-from application import app
-
-
-logging.basicConfig(level=logging.DEBUG)
-
-
-if __name__ == "__main__":
- app.run()
diff --git a/fracciones_activity.py b/fracciones_activity.py
new file mode 100644
index 0000000..2aadabc
--- /dev/null
+++ b/fracciones_activity.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+from sugar.activity.activity import Activity, ActivityToolbox
+from application import ApplicationManager
+
+class FraccionesActivity(Activity):
+ """ Clase principal cuando la aplicacion corre como actividad dentro de Sugar """
+ def __init__(self, handle):
+ super(FraccionesActivity, self).__init__(handle)
+
+ # barra de herramientas de Sugar
+ toolbox = ActivityToolbox(self)
+ self.set_toolbox(toolbox)
+ toolbox.show()
+
+ # conectar maquina de estados principal
+ self.application_manager = ApplicationManager(self)
diff --git a/fracciones_standalone.py b/fracciones_standalone.py
new file mode 100755
index 0000000..d91373e
--- /dev/null
+++ b/fracciones_standalone.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+import gtk
+from application import ApplicationManager
+
+class FraccionesStandalone(gtk.Window):
+ """ Clase principal cuando se corre por fuera de Sugar """
+ def __init__(self):
+ super(FraccionesStandalone, self).__init__(gtk.WINDOW_TOPLEVEL)
+
+ # conectar maquina de estados principal
+ self.application_manager = ApplicationManager(self)
diff --git a/juego1.py b/juego1.py
deleted file mode 100644
index 38d26a7..0000000
--- a/juego1.py
+++ /dev/null
@@ -1,231 +0,0 @@
-import logging
-import cairo
-from torta import Torta
-
-
-logging.basicConfig(level=logging.DEBUG)
-log = logging.getLogger(__name__)
-
-MAXLEVEL = 5
-IMAGE = {
- "start": cairo.ImageSurface.create_from_png("start.png"),
- "background": cairo.ImageSurface.create_from_png("background.png"),
- "completed": cairo.ImageSurface.create_from_png("completed.png"),
- "failed": cairo.ImageSurface.create_from_png("failed.png"),
- "win": cairo.ImageSurface.create_from_png("win.png"),
- "gameover": cairo.ImageSurface.create_from_png("gameover.png"),
-}
-
-
-class JuegoModo1(object):
- def __init__(self):
- log.debug("init - JuegoModo1")
- self.change_state(Inicio(self))
- self.vidas = 5
- self.nivel = 1
-
-
- def change_state(self, state):
- self.state = state
-
-
- def draw(self, widget, event):
- cr = widget.window.cairo_create()
- self.state.draw(cr)
-
-
- def update(self, widget, event):
- if self.state.update(widget, event):
- self.draw(widget, event)
-
-
- def check(self, widget, event):
- if isinstance(self.state, Jugar):
- self.state.check(widget, event)
-
-
-class Inicio(object):
- """
- Mostramos pantalla de inicio y esperamos a que el usuario pulse el raton
- para comenzar el juego.
-
- """
- def __init__(self, juego):
- self.juego = juego
-
-
- def update(self, widget, event):
- self.juego.change_state(Jugar(self.juego))
- self.juego.draw(widget, event)
-
-
- def draw(self, cairo_surface):
- log.debug("draw - INICIO")
- cairo_surface.set_source_surface(IMAGE["start"], 0, 0)
- cairo_surface.paint()
-
-
-class Jugar(object):
- """
- Obtenemos los click's del usuario y esperamos por el resultado del juego.
-
- """
- def __init__(self, juego):
- self.juego = juego
- self.torta = Torta([3, 5], [100, 100], 80)
-
-
- def update(self, widget, event):
- """
- Verifica donde se pulso en el area del usuario y pasa a la torta.
-
- """
- log.debug("update - Jugar")
- pos = event.get_coords()
- if self.torta.select(pos):
- log.debug("> torta")
- return True
- return False
-
-
- def check(self, widget, event):
- """
- Cambia de estado tomando en cuenta los trozos seleccionados.
-
- """
- log.debug("check - Jugar")
- if self.torta.check():
- self.juego.change_state(Gana(self.juego))
- self.juego.draw(widget, event)
- else:
- self.juego.change_state(Pierde(self.juego))
- self.juego.draw(widget, event)
-
-
- def draw(self, cairo_surface):
- """
- Dibujamos la torta.
-
- """
- log.debug("draw - JUGAR")
- cairo_surface.set_source_surface(IMAGE["background"], 0, 0)
- cairo_surface.paint()
- self.torta.draw(cairo_surface)
-
-
-class Gana(object):
- """
- Mostramos pantalla de felicitacion y avanzamos al siguiente nivel.
-
- """
- def __init__(self, juego):
- self.juego = juego
-
-
- def update(self, widget, event):
- """
- """
- self.juego.nivel += 1
- if self.juego.nivel == MAXLEVEL:
- self.juego.change_state(Win(self.juego))
- self.juego.draw(widget, event)
- else:
- self.juego.change_state(Jugar(self.juego))
- self.juego.draw(widget, event)
-
-
- def draw(self, cairo_surface):
- """
- Dibujamos felicitacion.
-
- """
- log.debug("draw - Gana")
- cairo_surface.set_source_surface(IMAGE["completed"], 0, 0)
- cairo_surface.paint()
-
-
-class Pierde(object):
- """
- Mostramos pantalla de error. Volvemos al siguiente nivel.
-
- """
- def __init__(self, juego):
- self.juego = juego
-
-
- def update(self, widget, event):
- """
- Quita una vida. Si quedan reinicia el juego sino se va al game over.
-
- """
- self.juego.vidas -= 1
- if self.juego.vidas == 0:
- self.juego.change_state(GameOver(self.juego))
- self.juego.draw(widget, event)
- else:
- self.juego.change_state(Jugar(self.juego))
- self.juego.draw(widget, event)
-
-
- def draw(self, cairo_surface):
- """
- Dibuja pantalla de error.
-
- """
- log.debug("draw - Pierde")
- cairo_surface.set_source_surface(IMAGE["failed"], 0, 0)
- cairo_surface.paint()
-
-
-class GameOver(object):
- """
- El jugador pierde por vidas.
-
- """
- def __init__(self, juego):
- self.juego = juego
-
-
- def update(self, widget, event):
- """
- No hace nada.
-
- """
- pass
-
-
- def draw(self, cairo_surface):
- """
- Dibuja game over.
-
- """
- log.debug("draw - GameOver")
- cairo_surface.set_source_surface(IMAGE["gameover"], 0, 0)
- cairo_surface.paint()
-
-
-class Win(object):
- """
- El jugador llega al final del juego.
-
- """
- def __init__(self, juego):
- self.juego = juego
-
-
- def update(self, widget, event):
- """
- No hace nada.
-
- """
- pass
-
-
- def draw(self, cairo_surface):
- """
- Dibuja felicitacion.
-
- """
- log.debug("draw - Win")
- cairo_surface.set_source_surface(IMAGE["win"], 0, 0)
- cairo_surface.paint()
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..2c9d9d2
--- /dev/null
+++ b/main.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import gtk
+from fracciones_standalone import FraccionesStandalone
+
+if __name__ == "__main__":
+ # crea ventana standalone
+ standalone = FraccionesStandalone()
+ # loop de eventos
+ gtk.main()
diff --git a/data/frame.glade b/templates/frame.glade
index e686ec6..56f93fe 100644
--- a/data/frame.glade
+++ b/templates/frame.glade
@@ -2,14 +2,14 @@
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
+ <!-- interface-local-resource-path .. -->
<object class="GtkWindow" id="window">
- <signal name="destroy" handler="on_FRAME_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
- <object class="GtkMenuBar" id="menubar1">
+ <object class="GtkMenuBar" id="menubar">
<property name="visible">True</property>
<child>
<object class="GtkMenuItem" id="menuitem1">
@@ -69,6 +69,57 @@
</object>
</child>
<child>
+ <object class="GtkMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Edit</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu2">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImageMenuItem" id="imagemenuitem6">
+ <property name="label">gtk-cut</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="imagemenuitem7">
+ <property name="label">gtk-copy</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="imagemenuitem8">
+ <property name="label">gtk-paste</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="imagemenuitem9">
+ <property name="label">gtk-delete</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_View</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
<object class="GtkMenuItem" id="menuitem4">
<property name="visible">True</property>
<property name="label" translatable="yes">_Help</property>
@@ -95,27 +146,13 @@
</packing>
</child>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="width_request">320</property>
- <property name="height_request">240</property>
+ <object class="GtkScrolledWindow" id="frame_content">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
- <object class="GtkViewport" id="content_container">
- <property name="visible">True</property>
- <property name="resize_mode">queue</property>
- <child>
- <object class="GtkLabel" id="dummycontent">
- <property name="width_request">320</property>
- <property name="height_request">240</property>
- <property name="visible">True</property>
- <property name="yalign">0.4699999988079071</property>
- <property name="label" translatable="yes">Dummy object for remove</property>
- </object>
- </child>
- </object>
+ <placeholder/>
</child>
</object>
<packing>
@@ -123,9 +160,10 @@
</packing>
</child>
<child>
- <object class="GtkStatusbar" id="statusbar1">
+ <object class="GtkStatusbar" id="statusbar">
<property name="visible">True</property>
<property name="spacing">2</property>
+ <property name="has_resize_grip">False</property>
</object>
<packing>
<property name="expand">False</property>
diff --git a/torta.py b/torta.py
deleted file mode 100644
index 35dfce5..0000000
--- a/torta.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# -*- encoding: utf-8
-import math
-from utils import draw_arc
-
-
-class Torta(object):
- def __init__(self, fraction, pos, radius):
- """
- Creamos una torta de centro pos, radio radius y que corresponda a la
- fraccion fraction. El parametro fraction es una lista cuyo primer
- elemento es el numerador y el segundo el denominador de la fraccion.
-
- """
- self.M = fraction[0]
- self.N = fraction[1]
- self.center = pos
- self.radius = radius
- self.selected = [0] * self.N
-
-
- def select(self, pos):
- """
- Si pos esta dentro del area de la torta cambia el estado del trozo y
- devuelve True, en caso contrario devuelve False.
-
- """
- x = pos[0] - self.center[0]
- y = pos[1] - self.center[1]
- if math.pow(x, 2) + math.pow(y, 2) > math.pow(self.radius, 2):
- return False
- angle = math.atan2(y, x)
- if angle < 0:
- angle += 2 * math.pi
- sector = angle * self.N / (2 * math.pi)
- index = int(math.floor(sector))
- self.selected[index] = 1 - self.selected[index]
- return True
-
-
- def check(self):
- """
- Devuelve True si esta seleccionada la cantidad de sectores
- correspondientes a la fraccion, False en caso contrario.
-
- """
- return sum(self.selected) == self.M
-
-
- def draw(self, cairo_drawing_area):
- """
- Dibuja la torta.
-
- """
- for i in xrange(self.N):
- angle_start = 2 * math.pi * i / self.N
- angle_end = 2 * math.pi * (i + 1) / self.N
- if self.selected[i]:
- fg = (1.0, 1.0, 0.0)
- bg = (0.0, 1.0, 1.0)
- else:
- fg = (1.0, 0.0, 0.0)
- bg = (0.0, 1.0, 0.0)
- draw_arc(cairo_drawing_area, fg, bg, self.center[0], self.center[1],
- self.radius, angle_start, angle_end)
diff --git a/utils.py b/utils.py
deleted file mode 100644
index 3ec288a..0000000
--- a/utils.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import math
-
-
-def draw_arc(cr, color_fg, color_bg, center_x, center_y, radius, angle_start, angle_end):
- """
- Dibuja un arco sobre una superficie de cairo.
-
- """
- cr.set_source_rgb(*color_fg)
- cr.move_to(center_x, center_y)
- nx = center_x + radius * math.cos(angle_start)
- ny = center_y + radius * math.sin(angle_start)
- cr.line_to(nx, ny)
- cr.arc(center_x, center_y, radius, angle_start, angle_end)
- cr.close_path()
- cr.stroke_preserve()
- cr.set_source_rgb(*color_bg)
- cr.fill()