Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgnacio Rodriguez <ignacio@sugarlabs.org>2013-12-13 18:47:51 (GMT)
committer Ignacio Rodriguez <ignacio@sugarlabs.org>2013-12-13 18:47:51 (GMT)
commit3085b496e00efe8e889485134e3131ce0a94c703 (patch)
tree92139fec5920d4c05eced5ae9612234b0f9e0ce0
parentd7fdf45491881379df9ee55bb5efd7f049964c78 (diff)
update sugargame
-rw-r--r--sugargame/canvas.py38
-rw-r--r--sugargame/event.py69
2 files changed, 71 insertions, 36 deletions
diff --git a/sugargame/canvas.py b/sugargame/canvas.py
index f5f5b56..919d46c 100644
--- a/sugargame/canvas.py
+++ b/sugargame/canvas.py
@@ -1,17 +1,20 @@
import os
from gi.repository import Gtk
from gi.repository import GObject
+from sugar3.activity.activity import PREVIEW_SIZE
import pygame
import event
CANVAS = None
+
class PygameCanvas(Gtk.EventBox):
"""
mainwindow is the activity intself.
"""
- def __init__(self, mainwindow, pointer_hint = True):
+
+ def __init__(self, mainwindow, pointer_hint=True):
GObject.GObject.__init__(self)
global CANVAS
@@ -33,8 +36,10 @@ class PygameCanvas(Gtk.EventBox):
self.show_all()
def run_pygame(self, main_fn):
- # Run the main loop after a short delay. The reason for the delay is that the
- # Sugar activity is not properly created until after its constructor returns.
+ # Run the main loop after a short delay.
+ # The reason for the delay is that the
+ # Sugar activity is not properly created until after its constructor
+ # returns.
# If the Pygame main loop is called from the activity constructor, the
# constructor never returns and the activity freezes.
GObject.idle_add(self._run_pygame_cb, main_fn)
@@ -55,7 +60,8 @@ class PygameCanvas(Gtk.EventBox):
# Initialize the Pygame window.
r = self.get_allocation()
- pygame.display.set_mode((r.width, r.height), pygame.RESIZABLE)
+ self._screen = pygame.display.set_mode((r.width, r.height),
+ pygame.RESIZABLE)
# Hook certain Pygame functions with GTK equivalents.
self.translator.hook_pygame()
@@ -68,3 +74,27 @@ class PygameCanvas(Gtk.EventBox):
def get_pygame_widget(self):
return self._socket
+
+ def get_preview(self):
+ """
+ Return preview of main surface
+ How to use in activity:
+ def get_preview(self):
+ return self.game_canvas.get_preview()
+ """
+
+ _tmp_dir = os.path.join(self._mainwindow.get_activity_root(),
+ 'tmp')
+ _file_path = os.path.join(_tmp_dir, 'preview.png')
+
+ width = PREVIEW_SIZE[0]
+ height = PREVIEW_SIZE[1]
+ _surface = pygame.transform.scale(self._screen, (width, height))
+ pygame.image.save(_surface, _file_path)
+
+ f = open(_file_path, 'r')
+ preview = f.read()
+ f.close()
+ os.remove(_file_path)
+
+ return preview
diff --git a/sugargame/event.py b/sugargame/event.py
index f6a69b9..d4c84e4 100644
--- a/sugargame/event.py
+++ b/sugargame/event.py
@@ -1,13 +1,14 @@
-from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GObject
import pygame
import pygame.event
+
class _MockEvent(object):
def __init__(self, keyval):
self.keyval = keyval
+
class Translator(object):
key_trans = {
'Alt_L': pygame.K_LALT,
@@ -18,14 +19,14 @@ class Translator(object):
'Shift_R': pygame.K_RSHIFT,
'Super_L': pygame.K_LSUPER,
'Super_R': pygame.K_RSUPER,
- 'KP_Page_Up' : pygame.K_KP9,
- 'KP_Page_Down' : pygame.K_KP3,
- 'KP_End' : pygame.K_KP1,
- 'KP_Home' : pygame.K_KP7,
- 'KP_Up' : pygame.K_KP8,
- 'KP_Down' : pygame.K_KP2,
- 'KP_Left' : pygame.K_KP4,
- 'KP_Right' : pygame.K_KP6,
+ 'KP_Page_Up': pygame.K_KP9,
+ 'KP_Page_Down': pygame.K_KP3,
+ 'KP_End': pygame.K_KP1,
+ 'KP_Home': pygame.K_KP7,
+ 'KP_Up': pygame.K_KP8,
+ 'KP_Down': pygame.K_KP2,
+ 'KP_Left': pygame.K_KP4,
+ 'KP_Right': pygame.K_KP6,
}
@@ -46,16 +47,16 @@ class Translator(object):
# Enable events
# (add instead of set here because the main window is already realized)
self._mainwindow.add_events(
- Gdk.EventMask.KEY_PRESS_MASK | \
- Gdk.EventMask.KEY_RELEASE_MASK | \
+ Gdk.EventMask.KEY_PRESS_MASK |
+ Gdk.EventMask.KEY_RELEASE_MASK |
Gdk.EventMask.VISIBILITY_NOTIFY_MASK
)
self._inner_evb.set_events(
- Gdk.EventMask.POINTER_MOTION_MASK | \
- Gdk.EventMask.POINTER_MOTION_HINT_MASK | \
- Gdk.EventMask.BUTTON_MOTION_MASK | \
- Gdk.EventMask.BUTTON_PRESS_MASK | \
+ Gdk.EventMask.POINTER_MOTION_MASK |
+ Gdk.EventMask.POINTER_MOTION_HINT_MASK |
+ Gdk.EventMask.BUTTON_MOTION_MASK |
+ Gdk.EventMask.BUTTON_PRESS_MASK |
Gdk.EventMask.BUTTON_RELEASE_MASK
)
@@ -77,8 +78,8 @@ class Translator(object):
# Internal data
self.__stopped = False
self.__keystate = [0] * 323
- self.__button_state = [0,0,0]
- self.__mouse_pos = (0,0)
+ self.__button_state = [0, 0, 0]
+ self.__mouse_pos = (0, 0)
self.__repeat = (None, None)
self.__held = set()
self.__held_time_left = {}
@@ -100,10 +101,11 @@ class Translator(object):
return True
def _resize_cb(self, widget, event):
- evt = pygame.event.Event(pygame.VIDEORESIZE,
- size=(event.width,event.height), width=event.width, height=event.height)
+ evt = pygame.event.Event(pygame.VIDEORESIZE,
+ size=(event.width, event.height),
+ width=event.width, height=event.height)
pygame.event.post(evt)
- return False # continue processing
+ return False # continue processing
def _screen_changed_cb(self, widget, previous_screen):
if pygame.display.get_init():
@@ -134,7 +136,8 @@ class Translator(object):
key = event.keyval
if self.__repeat[0] is not None:
if key in self.__held:
- # This is possibly false if set_repeat() is called with a key held
+ # This is possibly false if set_repeat()
+ # is called with a key held
del self.__held_time_left[key]
del self.__held_last_time[key]
self.__held.discard(key)
@@ -151,15 +154,15 @@ class Translator(object):
key = Gdk.keyval_name(event.keyval)
if key is None:
# No idea what this key is.
- return False
+ return False
keycode = None
if key in self.key_trans:
keycode = self.key_trans[key]
- elif hasattr(pygame, 'K_'+key.upper()):
- keycode = getattr(pygame, 'K_'+key.upper())
- elif hasattr(pygame, 'K_'+key.lower()):
- keycode = getattr(pygame, 'K_'+key.lower())
+ elif hasattr(pygame, 'K_' + key.upper()):
+ keycode = getattr(pygame, 'K_' + key.upper())
+ elif hasattr(pygame, 'K_' + key.lower()):
+ keycode = getattr(pygame, 'K_' + key.lower())
elif key == 'XF86Start':
# view source request, specially handled...
self._mainwindow.view_source()
@@ -187,21 +190,22 @@ class Translator(object):
return self.__button_state
def _mousedown_cb(self, widget, event):
- self.__button_state[event.button-1] = 1
+ self.__button_state[event.button - 1] = 1
return self._mouseevent(widget, event, pygame.MOUSEBUTTONDOWN)
def _mouseup_cb(self, widget, event):
- self.__button_state[event.button-1] = 0
+ self.__button_state[event.button - 1] = 0
return self._mouseevent(widget, event, pygame.MOUSEBUTTONUP)
def _mouseevent(self, widget, event, type):
- evt = pygame.event.Event(type, button=event.button, pos=(event.x, event.y))
+ evt = pygame.event.Event(type, button=event.button, pos=(event.x,
+ event.y))
self._post(evt)
return True
def _mousemove_cb(self, widget, event):
# From http://www.learningpython.com/2006/07/25/writing-a-custom-widget-using-pygtk/
- # if this is a hint, then let's get all the necessary
+ # if this is a hint, then let's get all the necessary
# information, if not it's all we need.
if event.is_hint:
win, x, y, state = event.window.get_device_position(event.device)
@@ -220,14 +224,15 @@ class Translator(object):
]
evt = pygame.event.Event(pygame.MOUSEMOTION,
- pos=self.__mouse_pos, rel=rel, buttons=self.__button_state)
+ pos=self.__mouse_pos, rel=rel,
+ buttons=self.__button_state)
self._post(evt)
return True
def _tick_cb(self):
cur_time = pygame.time.get_ticks()
for key in self.__held:
- delta = cur_time - self.__held_last_time[key]
+ delta = cur_time - self.__held_last_time[key]
self.__held_last_time[key] = cur_time
self.__held_time_left[key] -= delta