Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/ReflectionActivity.py
diff options
context:
space:
mode:
Diffstat (limited to 'ReflectionActivity.py')
-rw-r--r--ReflectionActivity.py340
1 files changed, 0 insertions, 340 deletions
diff --git a/ReflectionActivity.py b/ReflectionActivity.py
deleted file mode 100644
index 15598cd..0000000
--- a/ReflectionActivity.py
+++ /dev/null
@@ -1,340 +0,0 @@
-#Copyright (c) 2011 Walter Bender
-#Copyright (c) 2012 Ignacio Rodriguez
-
-# 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 3 of the License, or
-# (at your option) any later version.
-#
-# You should have received a copy of the GNU General Public License
-# along with this library; if not, write to the Free Software
-# Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA
-
-
-from gi.repository import Gtk,Gdk
-from sugar3.activity import activity
-from sugar3 import profile
-try:
- from sugar3.graphics.toolbarbox import ToolbarBox
- _have_toolbox = True
-except ImportError:
- _have_toolbox = False
-
-if _have_toolbox:
- from sugar3.activity.widgets import ActivityToolbarButton
- from sugar3.activity.widgets import StopButton
-
-from toolbar_utils import button_factory, label_factory, separator_factory, \
- radio_factory
-from utils import json_load, json_dump
-
-import telepathy
-import dbus
-from dbus.service import signal
-from dbus.gobject_service import ExportedGObject
-from sugar3.presence import presenceservice
-from sugar3.presence.tubeconn import TubeConnection
-
-from gettext import gettext as _
-
-from game import Game
-
-import logging
-_logger = logging.getLogger('reflection-activity')
-
-
-SERVICE = 'org.sugarlabs.ReflectionActivity'
-IFACE = SERVICE
-PATH = '/org/augarlabs/ReflectionActivity'
-
-
-class ReflectionActivity(activity.Activity):
- """ Reflection puzzle game """
-
- def __init__(self, handle):
- """ Initialize the toolbars and the game board """
- try:
- super(ReflectionActivity, self).__init__(handle)
- except dbus.exceptions.DBusException, e:
- _logger.error(str(e))
-
- self.nick = profile.get_nick_name()
- if profile.get_color() is not None:
- self.colors = profile.get_color().to_string().split(',')
- else:
- self.colors = ['#A0FFA0', '#FF8080']
-
- self._setup_toolbars(_have_toolbox)
- self._setup_dispatch_table()
-
- # Create a canvas
- canvas = Gtk.DrawingArea()
- canvas.set_size_request(Gdk.Screen.width(), \
- Gdk.Screen.height())
- self.set_canvas(canvas)
- canvas.show()
- self.show_all()
-
- self._game = Game(canvas, parent=self, colors=self.colors)
- self._setup_presence_service()
-
- if 'dotlist' in self.metadata:
- self._restore()
- else:
- self._game.new_game('horizontal')
-
- def _setup_toolbars(self, have_toolbox):
- """ Setup the toolbars. """
-
- self.max_participants = 4
-
- if have_toolbox:
- toolbox = ToolbarBox()
-
- # Activity toolbar
- activity_button = ActivityToolbarButton(self)
-
- toolbox.toolbar.insert(activity_button, 0)
- activity_button.show()
-
- self.set_toolbar_box(toolbox)
- toolbox.show()
- self.toolbar = toolbox.toolbar
-
- else:
- # Use pre-0.86 toolbar design
- games_toolbar = Gtk.Toolbar()
- toolbox = activity.ActivityToolbox(self)
- self.set_toolbox(toolbox)
- toolbox.add_toolbar(_('Game'), games_toolbar)
- toolbox.show()
- toolbox.set_current_toolbar(1)
- self.toolbar = games_toolbar
-
- my_colors = radio_factory(
- 'my-colors', self.toolbar, self._my_colors_cb, group=None)
-
- radio_factory('toolbar-colors', self.toolbar,
- self._roygbiv_colors_cb, group=my_colors)
-
- self._new_game_button_h = button_factory(
- 'new-game-horizontal', self.toolbar, self._new_game_cb,
- cb_arg='horizontal',
- tooltip=_('Start a new horizontal-reflection game.'))
-
- self._new_game_button_v = button_factory(
- 'new-game-vertical', self.toolbar, self._new_game_cb,
- cb_arg='vertical',
- tooltip=_('Start a new vertical-reflection game.'))
-
- self._new_game_button_b = button_factory(
- 'new-game-bilateral', self.toolbar, self._new_game_cb,
- cb_arg='bilateral',
- tooltip=_('Start a new bilateral-reflection game.'))
-
- self.status = label_factory(self.toolbar, '')
-
- if _have_toolbox:
- separator_factory(toolbox.toolbar, False, True)
-
- self.robot_button = button_factory(
- 'robot-off', self.toolbar, self._robot_cb,
- tooltip= _('Play with the robot.'))
-
- if _have_toolbox:
- separator_factory(toolbox.toolbar, True, False)
-
- if _have_toolbox:
- stop_button = StopButton(self)
- stop_button.props.accelerator = '<Ctrl>q'
- toolbox.toolbar.insert(stop_button, -1)
- stop_button.show()
-
- def _my_colors_cb(self, button=None):
- if hasattr(self, '_game'):
- self._game.roygbiv = False
- self._game.new_game()
-
- def _roygbiv_colors_cb(self, button=None):
- if hasattr(self, '_game'):
- self._game.roygbiv = True
- self._game.new_game()
-
- def _new_game_cb(self, button=None, orientation='horizontal'):
- ''' Start a new game. '''
- self._game.new_game(orientation)
-
- def _robot_cb(self, button=None):
- ''' Play with the computer (or not). '''
- if not self._game.playing_with_robot:
- self.set_robot_status(True, 'robot-on')
- else:
- self.set_robot_status(False, 'robot-off')
-
- def set_robot_status(self, status, icon):
- ''' Reset robot icon and status '''
- self._game.playing_with_robot = status
- self.robot_button.set_icon_name(icon)
-
- def write_file(self, file_path):
- """ Write the grid status to the Journal """
- [dot_list, orientation] = self._game.save_game()
- self.metadata['orientation'] = orientation
- self.metadata['dotlist'] = ''
- for dot in dot_list:
- self.metadata['dotlist'] += str(dot)
- if dot_list.index(dot) < len(dot_list) - 1:
- self.metadata['dotlist'] += ' '
-
- def _restore(self):
- """ Restore the game state from metadata """
- if 'orientation' in self.metadata:
- orientation = self.metadata['orientation']
- else:
- orientation = 'horizontal'
-
- dot_list = []
- dots = self.metadata['dotlist'].split()
- for dot in dots:
- dot_list.append(int(dot))
- self._game.restore_game(dot_list, orientation)
-
- # Collaboration-related methods
-
- def _setup_presence_service(self):
- """ Setup the Presence Service. """
- self.pservice = presenceservice.get_instance()
- self.initiating = None # sharing (True) or joining (False)
-
- owner = self.pservice.get_owner()
- self.owner = owner
- self._share = ""
- self.connect('shared', self._shared_cb)
- self.connect('joined', self._joined_cb)
-
- def _shared_cb(self, activity):
- """ Either set up initial share..."""
- self._new_tube_common(True)
-
- def _joined_cb(self, activity):
- """ ...or join an exisiting share. """
- self._new_tube_common(False)
-
- def _new_tube_common(self, sharer):
- """ Joining and sharing are mostly the same... """
- if self._shared_activity is None:
- _logger.debug("Error: Failed to share or join activity ... \
- _shared_activity is null in _shared_cb()")
- return
-
- self.initiating = sharer
- self.waiting_for_hand = not sharer
-
- self.conn = self._shared_activity.telepathy_conn
- self.tubes_chan = self._shared_activity.telepathy_tubes_chan
- self.text_chan = self._shared_activity.telepathy_text_chan
-
- self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal(
- 'NewTube', self._new_tube_cb)
-
- if sharer:
- _logger.debug('This is my activity: making a tube...')
- id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(
- SERVICE, {})
- else:
- _logger.debug('I am joining an activity: waiting for a tube...')
- self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].ListTubes(
- reply_handler=self._list_tubes_reply_cb,
- error_handler=self._list_tubes_error_cb)
- self._game.set_sharing(True)
-
- def _list_tubes_reply_cb(self, tubes):
- """ Reply to a list request. """
- for tube_info in tubes:
- self._new_tube_cb(*tube_info)
-
- def _list_tubes_error_cb(self, e):
- """ Log errors. """
- _logger.debug('Error: ListTubes() failed: %s' % (e))
-
- def _new_tube_cb(self, id, initiator, type, service, params, state):
- """ Create a new tube. """
- _logger.debug('New tube: ID=%d initator=%d type=%d service=%s \
-params=%r state=%d' % (id, initiator, type, service, params, state))
-
- if (type == telepathy.TUBE_TYPE_DBUS and service == SERVICE):
- if state == telepathy.TUBE_STATE_LOCAL_PENDING:
- self.tubes_chan[ \
- telepathy.CHANNEL_TYPE_TUBES].AcceptDBusTube(id)
-
- tube_conn = TubeConnection(self.conn,
- self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES], id, \
- group_iface=self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP])
-
- self.chattube = ChatTube(tube_conn, self.initiating, \
- self.event_received_cb)
-
- def _setup_dispatch_table(self):
- ''' Associate tokens with commands. '''
- self._processing_methods = {
- 'n': [self._receive_new_game, 'get a new game grid'],
- 'p': [self._receive_dot_click, 'get a dot click'],
- }
-
- def event_received_cb(self, event_message):
- ''' Data from a tube has arrived. '''
- if len(event_message) == 0:
- return
- try:
- command, payload = event_message.split('|', 2)
- except ValueError:
- _logger.debug('Could not split event message %s' % (event_message))
- return
- self._processing_methods[command][0](payload)
-
- def send_new_game(self):
- ''' Send a new orientation, grid to all players '''
- self.send_event('n|%s' % (json_dump(self._game.save_game())))
-
- def _receive_new_game(self, payload):
- ''' Sharer can start a new game. '''
- [dot_list, orientation] = json_load(payload)
- self._game.restore_game(dot_list, orientation)
-
- def send_dot_click(self, dot, color):
- ''' Send a dot click to all the players '''
- self.send_event('p|%s' % (json_dump([dot, color])))
-
- def _receive_dot_click(self, payload):
- ''' When a dot is clicked, everyone should change its color. '''
- (dot, color) = json_load(payload)
- self._game.remote_button_press(dot, color)
-
- def send_event(self, entry):
- """ Send event through the tube. """
- if hasattr(self, 'chattube') and self.chattube is not None:
- self.chattube.SendText(entry)
-
-
-class ChatTube(ExportedGObject):
- """ Class for setting up tube for sharing """
-
- def __init__(self, tube, is_initiator, stack_received_cb):
- super(ChatTube, self).__init__(tube, PATH)
- self.tube = tube
- self.is_initiator = is_initiator # Are we sharing or joining activity?
- self.stack_received_cb = stack_received_cb
- self.stack = ''
-
- self.tube.add_signal_receiver(self.send_stack_cb, 'SendText', IFACE,
- path=PATH, sender_keyword='sender')
-
- def send_stack_cb(self, text, sender=None):
- if sender == self.tube.get_unique_name():
- return
- self.stack = text
- self.stack_received_cb(text)
-
- @signal(dbus_interface=IFACE, signature='s')
- def SendText(self, text):
- self.stack = text