示例#1
0
    def _export_turtleblocks_cb(self, button=None):
        alert = Alert()
        alert.props.title = _('Save as TurtleBlocks project')
        self.add_alert(alert)
        alert.show()

        gobject.idle_add(self._export_turtleblocks, alert)
示例#2
0
    def _export_turtleblocks_cb(self, button=None):
        alert = Alert()
        alert.props.title = _("Save as TurtleBlocks project")
        self.add_alert(alert)
        alert.show()

        gobject.idle_add(self._export_turtleblocks, alert)
示例#3
0
    def __init__(self, **kwargs):

	Alert.__init__(self, **kwargs)
        self.add_button(1, _('New\nGame'), icon=None)
        self.add_button(2, _(' Change \n Numbers '), icon=None)
        self.add_button(3, _('Easy'), icon=None)
        self.add_button(4, _('Medium'), icon=None)
        self.add_button(5, _('Hard'), icon=None)
 def _alert(self, title, text=None):
     try:
         self.remove_alert(self.alert)
     finally:
         self.alert = Alert()
         self.alert.props.title = title
         self.alert.props.msg = text
         self.add_alert(self.alert)
         self.alert.connect('response', self._alert_cancel_cb)
         self.alert.show()
示例#5
0
    def okAlert(self, title, msg, callback):
        self.alert = Alert()
        icon = Icon(icon_name='dialog-ok')
        self.alert.add_button(gtk.RESPONSE_OK, _('_Ok'), icon)

        self.alert.props.title = title
        self.alert.props.msg = msg

        self.alert.connect('response', callback)
        self.myAct.add_alert(self.alert)
    def _shared_cb(self, activity):
        self._logger.debug('My activity was shared')
        self.alert = Alert()
        self.alert.props.title = 'Shared Activity'
        self.alert.props.msg = 'Shared messages to be displayed here'
        self.add_alert(self.alert)
        self.initiating = True
        self._sharing_setup()

        self._logger.debug('This is my activity: making a tube...')
        id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(
            SERVICE, {})
示例#7
0
    def _object_chooser(self, mime_type, type_name):
        chooser = ObjectChooser()
        matches_mime_type = False

        response = chooser.run()
        if response == gtk.RESPONSE_ACCEPT:
            jobject = chooser.get_selected_object()
            metadata = jobject.metadata
            file_path = jobject.file_path

            if metadata['mime_type'] == mime_type:
                matches_mime_type = True

            else:
                alert = Alert()

                alert.props.title = _('Invalid object')
                alert.props.msg = \
                       _('The selected object must be a %s file' % (type_name))

                ok_icon = Icon(icon_name='dialog-ok')
                alert.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon)
                ok_icon.show()

                alert.connect('response', lambda a, r: self.remove_alert(a))

                self.add_alert(alert)

                alert.show()

        return matches_mime_type, file_path, metadata['title']
示例#8
0
 def __init__(self, parent, title, content, mtype):
     SugarAlert.__init__(self)
     self._parent = parent
     if mtype == gtk.MESSAGE_INFO:
         icon = Icon(icon_name='emblem-notification')
         icon.show()
         self.props.icon = icon
         icon.props.pixel_size = style.SMALL_ICON_SIZE * 2
     self.props.title = title
     self.props.msg = content
     ok_icon = Icon(icon_name='dialog-ok')
     self.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon)
     ok_icon.show()
     self.connect('response', self.remove_myself)
示例#9
0
    def _value_changed(self, cell, path, new_text, model, activity):
        _logger.info("Change '%s' to '%s'" % (model[path][1], new_text))
        is_number = True
        number = new_text.replace(",", ".")
        try:
            float(number)
        except ValueError:
            is_number = False

        if is_number:
            decimals = utils.get_decimals(str(float(number)))
            new_text = locale.format('%.' + decimals + 'f', float(number))
            model[path][1] = str(new_text)

            self.emit("value-changed", str(path), number)

        elif not is_number:
            alert = Alert()

            alert.props.title = _('Invalid Value')
            alert.props.msg = \
                           _('The value must be a number (integer or decimal)')

            ok_icon = Icon(icon_name='dialog-ok')
            alert.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon)
            ok_icon.show()

            alert.connect('response', lambda a, r: activity.remove_alert(a))

            activity.add_alert(alert)

            alert.show()
 def _notify(self, title='', msg=''):
     ''' Notify user when saves are completed '''
     self._alert = Alert()
     self._alert.props.title = title
     self._alert.props.msg = msg
     self.add_alert(self._alert)
     self._alert.show()
示例#11
0
 def __register_activate_cb(self, icon):
     alert = Alert()
     try:
         schoolserver.register_laptop()
     except RegisterError, e:
         alert.props.title = _('Registration Failed')
         alert.props.msg = '%s' % e
示例#12
0
    def _saved_dsobject_alert(self, dsobject):
        saved_alert = Alert()
        saved_alert.props.title = _('Download completed')
        saved_alert.props.msg = dsobject.metadata['title']
        saved_alert.add_button(gtk.RESPONSE_APPLY, _('Show in Journal'),
                               Icon(icon_name='zoom-activity'))
        saved_alert.add_button(gtk.RESPONSE_OK, _('Ok'),
                               Icon(icon_name='dialog-ok'))

        def response_cb(alert, response_id):
            if response_id is gtk.RESPONSE_APPLY:
                activity.show_object_in_journal(dsobject.object_id)
            self.remove_alert(alert)

        saved_alert.connect('response', response_cb)
        self.add_alert(saved_alert)
        saved_alert.show_all()
示例#13
0
    def _value_changed(self, cell, path, new_text, model, activity):
        _logger.info("Change '%s' to '%s'" % (model[path][1], new_text))
        is_number = True
        number = new_text.replace(",", ".")
        try:
            float(number)
        except ValueError:
            is_number = False

        if is_number:
            decimals = utils.get_decimals(str(float(number)))
            new_text = locale.format('%.' + decimals + 'f', float(number))
            model[path][1] = str(new_text)

            self.emit("value-changed", str(path), number)

        elif not is_number:
            alert = Alert()

            alert.props.title = _('Invalid Value')
            alert.props.msg = \
                           _('The value must be a number (integer or decimal)')

            ok_icon = Icon(icon_name='dialog-ok')
            alert.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon)
            ok_icon.show()

            alert.connect('response', lambda a, r: activity.remove_alert(a))

            activity.add_alert(alert)

            alert.show()
示例#14
0
    def _object_chooser(self, mime_type, type_name):
        chooser = ObjectChooser()
        matches_mime_type = False

        response = chooser.run()
        if response == gtk.RESPONSE_ACCEPT:
            jobject = chooser.get_selected_object()
            metadata = jobject.metadata
            file_path = jobject.file_path

            if metadata['mime_type'] == mime_type:
                matches_mime_type = True

            else:
                alert = Alert()

                alert.props.title = _('Invalid object')
                alert.props.msg = \
                       _('The selected object must be a %s file' % (type_name))

                ok_icon = Icon(icon_name='dialog-ok')
                alert.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon)
                ok_icon.show()

                alert.connect('response', lambda a, r: self.remove_alert(a))

                self.add_alert(alert)

                alert.show()

        return matches_mime_type, file_path, metadata['title']
示例#15
0
文件: mynum.py 项目: worg/MathMe
 def okAlert(self, title, msg, callback):        
     self.alert = Alert()
     icon = Icon(icon_name='dialog-ok')
     self.alert.add_button(gtk.RESPONSE_OK, _('_Ok'), icon)
     
     self.alert.props.title = title
     self.alert.props.msg = msg
     
     self.alert.connect('response', callback)
     self.myAct.add_alert(self.alert)
示例#16
0
文件: activity.py 项目: AlanJAS/Butia
    def __init__(self, handle):
        activity.Activity.__init__(self, handle)

        self.max_participants = 1

        self.build_toolbar()

        # Create the main container
        self._main_view = gtk.VBox()

        try:
            conf = Config("./properties.conf")

            if (conf.is_plugin_installed()):
                # Step 1: Load class, which creates ActivityWindows.widget
                self.ActivityWindows = ActivityWindows()
                # Step 2: Remove the widget's parent
                if self.ActivityWindows.widget.parent:
                    self.ActivityWindows.widget.parent.remove(
                        self.ActivityWindows.widget)

                # Step 3: We attach that widget to our window
                self._main_view.pack_start(self.ActivityWindows.widget)

                # Display everything
                self.ActivityWindows.widget.show()
                self._main_view.show()
            else:
                alert = Alert()
                # Populate the title and text body of the alert.
                alert.props.title = _('Error Fatal!')
                alert.props.msg = _('No tienes instalado el plugin')
                # Call the add_alert() method (inherited via the sugar.graphics.Window superclass of Activity)
                # to add this alert to the activity window.
                self.add_alert(alert)
                alert.show()
        except Exception as inst:
            print _("NewPatternsActivity - Error inesperado:")
            print type(inst)  # la instancia de excepción
            print inst.args  # argumentos guardados en .args
            print inst  # __str__ permite imprimir args directamente
            # Create a new simple alert
            alert = Alert()
            # Populate the title and text body of the alert.
            alert.props.title = _('Error Fatal!')
            alert.props.msg = inst  #_('No tienes instalado TortuBots o compatible')
            # Call the add_alert() method (inherited via the sugar.graphics.Window superclass of Activity)
            # to add this alert to the activity window.
            self.add_alert(alert)
            alert.show()

        self.set_canvas(self._main_view)
        self.show_all()
示例#17
0
 def _alert(self, title, text=None):
     try:
         self.remove_alert(self.alert)
     finally:
         self.alert = Alert()
         self.alert.props.title = title
         self.alert.props.msg = text
         self.add_alert(self.alert)
         self.alert.connect("response", self._alert_cancel_cb)
         self.alert.show()
示例#18
0
 def can_close(self):
     if downloadmanager.can_quit():
         return True
     else:
         alert = Alert()
         alert.props.title = _('Download in progress')
         alert.props.msg = _('Stopping now will cancel your download')
         cancel_icon = Icon(icon_name='dialog-cancel')
         alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'), cancel_icon)
         stop_icon = Icon(icon_name='dialog-ok')
         alert.add_button(gtk.RESPONSE_OK, _('Stop'), stop_icon)
         stop_icon.show()
         self.add_alert(alert)
         alert.connect('response', self.__inprogress_response_cb)
         alert.show()            
         self.present()
示例#19
0
 def show_alert(self, title='', msg='', start_test = False):
     alert = Alert()
     alert.props.title = title
     alert.props.msg = msg
     alert.add_button(gtk.RESPONSE_OK, '  OK  ')
     alert.connect('response', self.alert_response_cb, start_test)
     self.add_alert(alert)
     self.alerts_list.append(alert)
     alert.show()
示例#20
0
    def _shared_cb(self, activity):
        self._logger.debug("My activity was shared")
        self.alert = Alert()
        self.alert.props.title = "Shared Activity"
        self.alert.props.msg = "Shared messages to be displayed here"
        self.add_alert(self.alert)
        self.initiating = True
        self._sharing_setup()

        self._logger.debug("This is my activity: making a tube...")
        id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(SERVICE, {})
示例#21
0
    def _create_ssb_clicked_cb(self, button):
        title = self._activity.webtitle
        uri = self._activity.current
        #favicon = self._activity.get_favicon()

        pattern = re.compile(r'''
                      (\w+)  # first word
                      [ _-]* # any amount and type of spacing
                      (\w+)? # second word, may be absent
                  ''', re.VERBOSE)
        first, second = re.search(pattern, title).groups()

        # CamelCase the two words
        first = first.capitalize()
        if second is not None:
            second = second.capitalize()
            name = first + ' ' + second
        else:
            name = first

        self._ssb = ssb.SSBCreator(name, uri)

        # alert to show after creation
        alert = Alert()
        alert.props.title = _('SSB Creation') 
        
        cancel_icon = Icon(icon_name='dialog-cancel') 
        alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'), cancel_icon) 
        cancel_icon.show()
        
        open_icon = Icon(icon_name='filesave') 
        alert.add_button(gtk.RESPONSE_APPLY, _('Show in Journal'), open_icon) 
        open_icon.show()
        
        ok_icon = Icon(icon_name='dialog-ok') 
        alert.add_button(gtk.RESPONSE_OK, _('Install'), ok_icon) 
        ok_icon.show()
           
        self._activity.add_alert(alert) 
        alert.connect('response', self._create_ssb_alert_cb)

        try:
            self._ssb.create()
        except Exception, e:
            # DEBUG: alert shows exception message
            alert.props.msg = _('Failed: ') + str(e)
示例#22
0
    def _show_keep_failed_dialog(self):
        alert = Alert()
        alert.props.title = _('Keep error')
        alert.props.msg = _('Keep error: all changes will be lost')

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Don\'t stop'), cancel_icon)

        stop_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Stop anyway'), stop_icon)

        self.add_alert(alert)
        alert.connect('response', self._keep_failed_dialog_response_cb)

        self.reveal()
示例#23
0
    def show_software_updates_alert(self):
        alert = Alert()
        updater_icon = Icon(icon_name='module-updater',
                            pixel_size=style.STANDARD_ICON_SIZE)
        alert.props.icon = updater_icon
        updater_icon.show()
        alert.props.title = _('Software Update')
        alert.props.msg = _('Update your activities to ensure'
                            ' compatibility with your new software')

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'), cancel_icon)

        alert.add_button(gtk.RESPONSE_REJECT, _('Later'))

        erase_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Check now'), erase_icon)

        if self._list_view in self.get_children():
            self._list_view.add_alert(alert)
        else:
            self._favorites_view.add_alert(alert)
        alert.connect('response', self.__software_update_response_cb)
示例#24
0
    def onStateChange(self, web_progress, request, state_flags, status):
        if state_flags & interfaces.nsIWebProgressListener.STATE_START:
            self._create_journal_object()            
            self._object_id = self.dl_jobject.object_id
            
            alert = TimeoutAlert(9)
            alert.props.title = _('Download started')
            alert.props.msg = _('%s' % self._get_file_name()) 
            self._activity.add_alert(alert)
            alert.connect('response', self.__start_response_cb)
            alert.show()
            global _active_downloads
            _active_downloads.append(self)
            
        elif state_flags & interfaces.nsIWebProgressListener.STATE_STOP:
            if NS_FAILED(status): # download cancelled
                return

            self._stop_alert = Alert()
            self._stop_alert.props.title = _('Download completed') 
            self._stop_alert.props.msg = _('%s' % self._get_file_name()) 
            open_icon = Icon(icon_name='zoom-activity') 
            self._stop_alert.add_button(gtk.RESPONSE_APPLY, 
                                        _('Show in Journal'), open_icon) 
            open_icon.show() 
            ok_icon = Icon(icon_name='dialog-ok') 
            self._stop_alert.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon) 
            ok_icon.show()            
            self._activity.add_alert(self._stop_alert) 
            self._stop_alert.connect('response', self.__stop_response_cb)
            self._stop_alert.show()

            self.dl_jobject.metadata['title'] = _('File %s from %s.') % \
                    (self._get_file_name(), self._source.spec)
            self.dl_jobject.metadata['progress'] = '100'
            self.dl_jobject.file_path = self._target_file.path

            if self._mime_type in ['application/octet-stream',
                                   'application/x-zip']:
                sniffed_mime_type = mime.get_for_file(self._target_file.path)
                self.dl_jobject.metadata['mime_type'] = sniffed_mime_type

            datastore.write(self.dl_jobject,
                            transfer_ownership=True,
                            reply_handler=self._internal_save_cb,
                            error_handler=self._internal_save_error_cb,
                            timeout=360 * DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND)
示例#25
0
    def _show_keep_failed_dialog(self):
        alert = Alert()
        alert.props.title = _('Keep error')
        alert.props.msg = _('Keep error: all changes will be lost')

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Don\'t stop'), cancel_icon)

        stop_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Stop anyway'), stop_icon)

        self.add_alert(alert)
        alert.connect('response', self._keep_failed_dialog_response_cb)

        self.present()
示例#26
0
    def show_software_updates_alert(self):
        alert = Alert()
        updater_icon = Icon(icon_name='module-updater',
                            pixel_size=style.STANDARD_ICON_SIZE)
        alert.props.icon = updater_icon
        updater_icon.show()
        alert.props.title = _('Software Update')
        alert.props.msg = _('Update your activities to ensure'
                            ' compatibility with your new software')

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'), cancel_icon)

        alert.add_button(gtk.RESPONSE_REJECT, _('Later'))

        erase_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Check now'), erase_icon)

        if self._list_view in self.get_children():
            self._list_view.add_alert(alert)
        else:
            self._favorites_view.add_alert(alert)
        alert.connect('response', self.__software_update_response_cb)
示例#27
0
    def _show_keep_failed_dialog(self):
        '''
        A keep error means the activity write_file method raised an
        exception before writing the file, or the datastore cannot be
        written to.
        '''
        alert = Alert()
        alert.props.title = _('Keep error')
        alert.props.msg = _('Keep error: all changes will be lost')

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Don\'t stop'), cancel_icon)

        stop_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Stop anyway'), stop_icon)

        self.add_alert(alert)
        alert.connect('response', self.__keep_failed_dialog_response_cb)

        self.reveal()
示例#28
0
    def __erase_activated_cb(self, tree_view, bundle_id):
        registry = bundleregistry.get_registry()
        activity_info = registry.get_bundle(bundle_id)

        alert = Alert()
        alert.props.title = _('Confirm erase')
        alert.props.msg = \
                _('Confirm erase: Do you want to permanently erase %s?') \
                % activity_info.get_name()

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Keep'), cancel_icon)

        erase_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Erase'), erase_icon)

        alert.connect('response', self.__erase_confirmation_dialog_response_cb,
                      bundle_id)

        self.add_alert(alert)
示例#29
0
    def __erase_activated_cb(self, tree_view, bundle_id):
        registry = bundleregistry.get_registry()
        activity_info = registry.get_bundle(bundle_id)

        alert = Alert()
        alert.props.title = _('Confirm erase')
        alert.props.msg = \
                _('Confirm erase: Do you want to permanently erase %s?') \
                % activity_info.get_name()

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Keep'), cancel_icon)

        erase_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Erase'), erase_icon)

        alert.connect('response', self.__erase_confirmation_dialog_response_cb,
                bundle_id)

        self.add_alert(alert)
示例#30
0
    def _show_keep_failed_dialog(self):
        '''
        A keep error means the activity write_file method raised an
        exception before writing the file, or the datastore cannot be
        written to.
        '''
        alert = Alert()
        alert.props.title = _('Keep error')
        alert.props.msg = _('Keep error: all changes will be lost')

        cancel_icon = Icon(icon_name='dialog-cancel')
        alert.add_button(gtk.RESPONSE_CANCEL, _('Don\'t stop'), cancel_icon)

        stop_icon = Icon(icon_name='dialog-ok')
        alert.add_button(gtk.RESPONSE_OK, _('Stop anyway'), stop_icon)

        self.add_alert(alert)
        alert.connect('response', self.__keep_failed_dialog_response_cb)

        self.reveal()
示例#31
0
class Numbers:
    timeout = 0
    hasOp = True
    oldSign = 0
    lifes = 2
    difScore = 0
    difText = ''
    score = 0
    rounds = 0
    player = ''
    alert = Alert()

    def __init__(self, runAsLib=True):
        self.builder = gtk.Builder()
        self.builder.add_from_file('num.ui')
        self.window = self.builder.get_object('numWindow')
        self.menuView = self.builder.get_object('menuView')
        self.lbTitle = self.builder.get_object('lbTitle')
        self.lbSubt = self.builder.get_object('lbSubt')
        self.btnEasy = self.builder.get_object('btnEasy')
        self.btnHard = self.builder.get_object('btnHard')
        self.btnMed = self.builder.get_object('btnMed')
        self.scoreView = self.builder.get_object('scoreView')
        self.scoreMain = self.builder.get_object('scoreMain')
        self.lbScore = self.builder.get_object('lbScore')
        self.scoreList = self.builder.get_object('scoreList')
        self.nameView = self.builder.get_object('nameView')
        self.txtPlayer = self.builder.get_object('txtPlayer')
        self.gameView = self.builder.get_object('gameView')
        self.lbNum1 = self.builder.get_object('lbNum1')
        self.lbNum2 = self.builder.get_object('lbNum2')
        self.lbSign = self.builder.get_object('lbSign')
        self.lbEqual = self.builder.get_object('lbEqual')
        self.txtRes = self.builder.get_object('txtRes')
        self.lbMsg = self.builder.get_object('lbMsg')
        self.imgCheck = self.builder.get_object('imgCheck')
        self.pBar = self.builder.get_object('progressBar')
        self.btnCalc = self.builder.get_object('btnCalc')
        self.btnNext = self.builder.get_object('btnNext')
        self.lifeBox = self.builder.get_object('lifeBox')
        self.modelScore = listView(self.scoreList)
        self.widget = self.window.get_child()

        gtk.rc_parse_string("""
			style "mystyle"
				{
					font_name = "sans 30"
				}
			class 'GtkEntry' style 'mystyle' 
		""")

        self.lbLife = [gtk.Label(), gtk.Label(), gtk.Label(), gtk.Label()]
        i = 0
        for label in self.lifeBox.get_children():
            self.lbLife[i] = label
            self.pangoLabel(self.lbLife[i], self.rgbToPango(153, 84, 244), 2)
            i += 1

        self.markMe(self.btnCalc)
        self.markMe(self.btnNext)
        self.pangoLabel(self.lbNum1, self.rgbToPango(29, 97, 252), 5)
        self.pangoLabel(self.lbNum2, self.rgbToPango(227, 126, 0), 5)
        self.pangoLabel(self.lbSign, self.rgbToPango(255, 0, 0), 5)
        self.pangoLabel(self.lbEqual, self.rgbToPango(145, 225, 36), 5)
        self.forceLocales()

        self.builder.connect_signals(self)
        self.alert.hide()

        if not runAsLib:
            self.window.show_all()

        dbPath = '%s/.MathMe.db' % path.expanduser('~')
        dbExists = False
        if path.isfile(dbPath):
            dbExists = True
        self.dataCon = sqlite3.connect(dbPath)
        self.dataCursor = self.dataCon.cursor()
        initDb = 'create table mathMe (player text, score int, rounds int, difficulty text);'
        if not dbExists:
            self.dataCursor.execute(initDb)

    def numbers_term(self, widget, data=0):
        gtk.main_quit()

    def numbers_calcOp(self, widget):
        if not self.hasOp:
            self.lbMsg.set_label(' ')
            num1 = int(self.lbNum1.get_label())
            num2 = int(self.lbNum2.get_label())
            sign = self.lbSign.get_label()
            res = 0.0

            try:
                txRes = int(self.txtRes.get_text())
                if sign == '+':
                    res = num1 + num2
                    pointFactor = 1 + self.difScore
                elif sign == '-':
                    res = num1 - num2
                    pointFactor = 1 + self.difScore
                elif sign == '×':
                    res = num1 * num2
                    pointFactor = 2 + self.difScore
                elif sign == '÷':
                    res = num1 / num2
                    pointFactor = 2 + self.difScore

                if (txRes == res):
                    self.sendMsg(True)
                    self.score += pointFactor
                else:
                    self.sendMsg(False, res)

                self.rounds += 1
                self.btnNext.grab_focus()
            except ValueError:
                if self.txtRes.get_text() != '':
                    self.lbMsg.set_label(
                        self.pangoMark('purple', 'white',
                                       _('Insert numbers, not letters')))
                    self.txtRes.set_text('')
                    self.txtRes.grab_focus()

    def numbers_oper(self, widget=gtk.Widget):
        self.imgCheck.clear()
        self.lbMsg.set_label('')
        num1 = randint(1, 10)
        num2 = randrange(1, 10)
        newSign = randint(1, 4)
        sign = ''

        if self.lifes < 0 and self.hasOp:
            widget = self.txtPlayer
            widget.grab_focus()
            self.showScore(self.gameView, True)
            self.gameView.set_sensitive(False)
        else:
            widget = self.txtRes

        while newSign == self.oldSign:
            newSign = randrange(1, 4)

        self.oldSign = newSign

        if newSign == 1:
            sign = '+'
        elif newSign == 2:
            sign = '-'
        elif newSign == 3:
            sign = '×'
        elif newSign == 4:
            sign = '÷'

        if (self.hasOp):
            if sign == '÷':
                while num1 % num2 != 0 or num1 == num2 or (num1 == 1
                                                           or num2 == 1):
                    num1 = randint(1, 10)
                    num2 = randrange(1, 10)
            elif sign == '-':
                while num1 < num2 or num1 == num2:
                    num1 = randint(1, 10)
                    num2 = randrange(1, 10)
            self.lbNum1.set_label(str(num1))
            self.lbNum2.set_label(str(num2))
            self.lbSign.set_label(sign)
            self.txtRes.set_text('')
            self.hasOp = False
        else:
            self.lbMsg.set_label(
                self.pangoMark('#095DF0', 'white',
                               _('Type the result, then press calculate')))
        widget.grab_focus()
        timeout_add(self.timeout, self.setProgress)

    def numbers_txtActivate(self, widget):
        if widget.get_text() != '':
            self.btnCalc.grab_focus()

    def numbers_chDiff(self, action):
        actionN = action.get_name()
        if actionN == 'easy':
            self.timeout = 100
            self.difScore = 1
            self.difText = unicode(_('Easy'))
        elif actionN == 'medium':
            self.timeout = 50
            self.difScore = 2
            self.difText = unicode(_('Medium'))
            print _('Medium')
        elif actionN == 'hard':
            self.timeout = 25
            self.difScore = 3
            self.difText = unicode(_('Hard'))

        self.gameView.show()
        self.gameView.set_sensitive(True)
        self.menuView.hide()
        self.numbers_oper()

    def numbers_savePlayer(self, widget, respid=0):
        self.myAct.remove_alert(self.alert)
        self.scoreMain.show()
        self.player = unicode(self.txtPlayer.get_text())
        #Saving Data
        self.dataCursor.execute(
            'INSERT INTO mathMe (player, score, rounds, difficulty) VALUES (?, ?, ?, ?)',
            (self.player, self.score, self.rounds, self.difText))
        self.dataCon.commit()
        #Filling listView
        self.fillScore()

        self.okAlert(_('To start a New Game press Ok'), '',
                     self.numbers_setScore)
        self.nameView.hide()

    def numbers_setScore(self, widget, respid=0):
        self.myAct.remove_alert(self.alert)
        self.initLifes()

    def showScore(self, widget, internal=False):
        widget.hide()
        self.scoreView.show()
        if internal:
            self.scoreMain.hide()
            self.nameView.show()
            self.txtPlayer.grab_focus()
            self.okAlert(_('Game Over'), '', self.numbers_savePlayer)
        else:
            self.fillScore()
            self.scoreMain.show()
            self.nameView.hide()
            self.okAlert(_('To go back press Ok'), '', self.numbers_setScore)

    def numbers_actEnd(self, widget):
        self.dataCon.commit()
        self.dataCursor.close()
        self.dataCon.close()

    def markMe(self, widget, data=0):
        widgetLabel = widget.get_child()
        foreg = self.rgbToPango(153, 38, 244)
        self.pangoLabel(widgetLabel, foreg, 1.5)

    def sendMsg(self, isRight, res=0):
        if isRight:
            self.lbMsg.set_label(
                self.pangoMark('#4DC406', 'white', _('Great!')))
            self.imgCheck.set_from_file('icons/face-laugh.png')
        else:
            if (self.lifes < 0):
                self.lbMsg.set_label(
                    '<span foreground = "white" background = "purple" size = "x-large">  %s <b>%d  </b>, %s</span>'
                    % (_('The result is:'), res, _('Game Over')))
            else:
                self.lbMsg.set_label(
                    '<span foreground = "white" background = "orange" size = "x-large">  %s <b>%d  </b></span>'
                    % (_('The result is:'), res))
            self.imgCheck.set_from_file('icons/face-sad.png')
            self.lbLife[self.lifes].set_label(' ')
            self.lifes -= 1

        self.hasOp = True

    def setProgress(self):
        fraction = self.pBar.get_fraction()
        fraction += 0.01
        if not self.hasOp:
            if fraction < 1:
                self.pBar.set_fraction(fraction)
            else:
                if self.txtRes.get_text() == '':
                    self.txtRes.set_text('0')
                self.numbers_calcOp(self.btnCalc)
                self.pBar.set_fraction(0.0)
        else:
            self.pBar.set_fraction(0.0)

        return not self.hasOp

    def initLifes(self):
        i = 0
        while i < 3:
            self.lbLife[i].set_label('☺')
            i += 1

        self.gameView.hide()
        self.scoreView.hide()
        self.menuView.show()
        self.pBar.set_fraction(0)
        self.btnEasy.grab_focus()
        self.lifes = 3
        self.score = 0
        self.rounds = 0

    def forceLocales(self):
        #This nasty function is needed due to lack of doc how-to localize a GtkBuilder activity
        btnScore = self.builder.get_object('btnScore')
        btnScoreOk = self.builder.get_object('btnScoreOk')
        btnScMainOk = self.builder.get_object('btnScMainOk')
        lbScore = self.builder.get_object('lbScore')
        lbPlayer = self.builder.get_object('lbPlayer')

        self.lbTitle.set_label(_('New Game'))
        self.pangoLabel(self.lbTitle, (0, 0, 0), 3)
        self.lbSubt.set_label(_('Choose difficulty'))
        self.pangoLabel(self.lbSubt, (0, 0, 0), 1.5)
        self.btnEasy.set_label(_('_Easy'))
        self.btnMed.set_label(_('_Medium'))
        self.btnHard.set_label(_('_Hard'))
        self.btnNext.set_label(_('_Next'))
        self.btnCalc.set_label(_('_Calculate'))
        btnScore.set_label(_('_Score'))
        btnScMainOk.set_label(_('Ok'))
        btnScoreOk.set_label(_('_Ok'))
        lbScore.set_label(_('Score'))
        self.pangoLabel(lbScore, (0, 0, 0), 3)
        lbPlayer.set_label(_('Write Your Name'))
        self.pangoLabel(lbPlayer, (0, 0, 0), 3)

    def pangoLabel(self, label, fg, scale):
        atr = pango.AttrList()
        foreg = pango.AttrForeground(fg[0], fg[1], fg[2], 0, 100)
        scale = pango.AttrScale(scale, 0, 100)
        atr.insert(foreg)
        atr.insert(scale)
        label.set_attributes(atr)

    def pangoMark(self, bg, fg, content):
        return '<span foreground = "%s" background = "%s" size = "x-large">  %s  </span>' % (
            fg, bg, content)

    def rgbToPango(self, r, g, b):
        r = (r * 65535) / 255
        g = (g * 65535) / 255
        b = (b * 65535) / 255

        return (r, g, b)

    def fillScore(self):
        self.dataCursor.execute(
            'SELECT * FROM mathMe ORDER BY score COLLATE NOCASE DESC')
        self.modelScore.clear()
        for row in self.dataCursor:
            self.modelScore.append(row)

    def okAlert(self, title, msg, callback):
        self.alert = Alert()
        icon = Icon(icon_name='dialog-ok')
        self.alert.add_button(gtk.RESPONSE_OK, _('_Ok'), icon)

        self.alert.props.title = title
        self.alert.props.msg = msg

        self.alert.connect('response', callback)
        self.myAct.add_alert(self.alert)

    def setActivity(self, act):
        self.myAct = act
示例#32
0
class DevTutorActivity(activity.Activity):
    """DevTutorActivity class as specified in activity.info"""
    def __init__(self, handle):

        activity.Activity.__init__(self, handle)

        self.max_participants = 10

        # toolbar with the new toolbar redesign
        toolbar_box = ToolbarBox()

        activity_button = ActivityButton(self)
        toolbar_box.toolbar.insert(activity_button, 0)
        activity_button.show()

        title_entry = TitleEntry(self)
        toolbar_box.toolbar.insert(title_entry, -1)
        title_entry.show()

        share_button = ShareButton(self)
        toolbar_box.toolbar.insert(share_button, -1)
        share_button.show()

        stop_button = StopButton(self)
        toolbar_box.toolbar.insert(stop_button, -1)
        stop_button.show()

        self.back_button = BackButton()
        self.back_button.connect('clicked', self.show_options1)
        toolbar_box.toolbar.insert(self.back_button, 0)
        self.back_button.show()

        self.set_toolbar_box(toolbar_box)
        toolbar_box.show()

        self.show_options()

        self._logger = logging.getLogger('hellomesh-activity')

        self.hellotube = None  # Shared session
        self.initiating = False

        # get the Presence Service
        self.pservice = presenceservice.get_instance()
        # Buddy object for you
        owner = self.pservice.get_owner()
        self.owner = owner

        self.connect('shared', self._shared_cb)
        self.connect('joined', self._joined_cb)

    def show_options1(self, data=None):
        self.show_options()

    def show_options(self):

        self.main_container = gtk.VBox()

        self.add_padding()
        self.line1 = gtk.HBox()

        button1 = gtk.Button("Show modules")
        #button1.set_size_request(200,80)
        #self.line1.pack_start(button1, False, False, 0)
        self.line1.add(button1)
        button1.connect('clicked', self.show_modules, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()

        self.add_padding()

        self.line2 = gtk.HBox()
        button2 = gtk.Button("Show activities")
        #button2.set_size_request(200,80)
        #self.line2.pack_start(button2, False, False, 0)
        self.line2.add(button2)
        button2.connect('clicked', self.show_activity_list, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()
        self.add_padding()

        self.line3 = gtk.HBox()
        text = gtk.TextView()
        self.entry = gtk.Entry()
        self.entry.set_sensitive(True)
        self.entry.connect('activate', self.entry_activate_cb)

        self.entry.show()
        self.line3.add(self.entry)
        self.main_container.add(self.line3)
        self.line3.show()

        self.set_canvas(self.main_container)

        self.main_container.show()

    def add_padding(self):
        self.line_space1 = gtk.HBox()
        self.main_container.add(self.line_space1)
        self.line_space1.show()

        self.line_space2 = gtk.HBox()
        self.main_container.add(self.line_space2)
        self.line_space2.show()

    def show_modules(self, sender, data=None):

        self.mod = ShowModules(self.set_canvas)
        self.mod.show_modules()

    def show_activity_list(self, sender, data=None):
        self.back_button.connect('clicked', self.show_options1)
        self.main_container = gtk.VBox()

        self.add_padding()
        self.line1 = gtk.HBox()

        button1 = gtk.Button("Hello World activity")
        #button1.set_size_request(200,80)
        #self.line1.pack_start(button1, False, False, 0)
        self.line1.add(button1)
        button1.connect('clicked', self.show_labels_hello, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()

        self.add_padding()
        self.line2 = gtk.HBox()

        button2 = gtk.Button("Write activity")
        #button2.set_size_request(200,80)
        #self.line2.pack_start(button2, False, False, 0)
        self.line2.add(button2)
        button2.connect('clicked', self.show_labels_write, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()
        self.add_padding()

        self.set_canvas(self.main_container)
        self.main_container.show()

    def show_labels_hello(self, sender, data=None):
        self.back_button.connect('clicked', self.show_activity_list)
        self.main_container = gtk.VBox()

        self.add_padding()
        self.line1 = gtk.HBox()

        self.label1 = gtk.Label(
            _("Hello World activity step 1 - call activity.__init__"))
        self.label1.set_line_wrap(True)
        self.label1.modify_font(pango.FontDescription("Sans 12"))
        self.line1.add(self.label1)
        self.label1.show()

        button1 = gtk.Button("Show result")
        button1.set_size_request(200, 80)
        self.line1.pack_start(button1, False, False, 0)
        button1.connect('clicked', self.hello_launch1, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()

        self.add_padding()
        self.line2 = gtk.HBox()

        self.label2 = gtk.Label(_("Hello Word activity step 2 - add toolbox"))
        self.label2.set_line_wrap(True)
        self.label2.modify_font(pango.FontDescription("Sans 12"))
        self.line2.add(self.label2)
        self.label2.show()

        button2 = gtk.Button("Show result")
        button2.set_size_request(200, 80)
        self.line2.pack_start(button2, False, False, 0)
        button2.connect('clicked', self.hello_launch2, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()

        self.add_padding()
        self.line3 = gtk.HBox()

        self.label3 = gtk.Label(
            _("Hello World activity step 3 - add hello world label"))
        self.label3.set_line_wrap(True)
        self.label3.modify_font(pango.FontDescription("Sans 12"))
        self.line3.add(self.label3)
        self.label3.show()

        button3 = gtk.Button("Show result")
        button3.set_size_request(200, 80)
        self.line3.pack_start(button3, False, False, 0)
        button3.connect('clicked', self.hello_launch3, None)
        button3.get_child().modify_font(pango.FontDescription("Sans 14"))
        button3.show()

        self.main_container.add(self.line3)
        self.line3.show()

        self.add_padding()
        self.line4 = gtk.HBox()

        self.label4 = gtk.Label(
            _("Hello World activity step 4 - add rotate button"))
        self.label4.set_line_wrap(True)
        self.label4.modify_font(pango.FontDescription("Sans 12"))
        self.line4.add(self.label4)
        self.label4.show()

        button4 = gtk.Button("Show result")
        button4.set_size_request(200, 80)
        self.line4.pack_start(button4, False, False, 0)
        button4.connect('clicked', self.hello_launch4, None)
        button4.get_child().modify_font(pango.FontDescription("Sans 14"))
        button4.show()

        self.main_container.add(self.line4)
        self.line4.show()

        self.add_padding()
        self.set_canvas(self.main_container)
        self.main_container.show()

    def show_labels_write(self, sender, data=None):
        self.back_button.connect('clicked', self.show_activity_list)
        self.main_container = gtk.VBox()
        self.add_padding()
        self.line1 = gtk.HBox()

        self.label1 = gtk.Label(_("Write activity step 1 "))
        self.label1.set_line_wrap(True)
        self.label1.modify_font(pango.FontDescription("Sans 12"))
        self.line1.add(self.label1)
        self.label1.show()

        button1 = gtk.Button("Show result")
        button1.set_size_request(200, 80)
        self.line1.pack_start(button1, False, False, 0)
        button1.connect('clicked', self.write_launch1, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()
        self.add_padding()
        self.line2 = gtk.HBox()

        self.label2 = gtk.Label(_("Write activity step 2"))
        self.label2.set_line_wrap(True)
        self.label2.modify_font(pango.FontDescription("Sans 12"))
        self.line2.add(self.label2)
        self.label2.show()

        button2 = gtk.Button("Show result")
        button2.set_size_request(200, 80)
        self.line2.pack_start(button2, False, False, 0)
        button2.connect('clicked', self.write_launch2, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()

        self.set_canvas(self.main_container)
        self.add_padding()
        self.line3 = gtk.HBox()

        self.label3 = gtk.Label(_("Write activity step 3"))
        self.label3.set_line_wrap(True)
        self.label3.modify_font(pango.FontDescription("Sans 12"))
        self.line3.add(self.label3)
        self.label3.show()

        button3 = gtk.Button("Show result")
        button3.set_size_request(200, 80)
        self.line3.pack_start(button3, False, False, 0)
        button3.connect('clicked', self.write_launch3, None)
        button3.get_child().modify_font(pango.FontDescription("Sans 14"))
        button3.show()

        self.main_container.add(self.line3)
        self.line3.show()
        self.add_padding()
        self.set_canvas(self.main_container)
        self.main_container.show()

    def hello_launch1(self, sender, data=None):
        f = open('/tmp/1', 'w')
        os.putenv('TUTOR_CLASS', 'HelloWorldActivity')
        self.launch()

    def hello_launch2(self, sender, data=None):
        f = open('/tmp/2', 'w')
        self.hello_launch1(sender, data)

    def hello_launch3(self, sender, data=None):
        f = open('/tmp/3', 'w')
        self.hello_launch2(sender, data)

    def hello_launch4(self, sender, data=None):
        f = open('/tmp/4', 'w')
        self.hello_launch3(sender, data)

    def write_launch1(self, sender, data=None):
        f = open('/tmp/1', 'w')
        os.putenv('TUTOR_CLASS', 'AbiWordActivity')
        self.launch()

    def write_launch2(self, sender, data=None):
        f = open('/tmp/2', 'w')
        self.write_launch1(sender, data)

    def write_launch3(self, sender, data=None):
        f = open('/tmp/3', 'w')
        self.write_launch2(sender, data)

    def launch(self):
        subprocess.Popen(['sugar-launch', 'org.sugarlabs.DevTutor'])

    def entry_activate_cb(self, entry):
        """Handle the event when Enter is pressed in the Entry."""
        text = entry.props.text
        if self.hellotube is not None:
            self.hellotube.SendText(text)

    def entry_text_update_cb(self, text):
        """Update Entry text when text received from others."""
        self.entry.props.text = text

    def _alert(self, title, text=None):
        try:
            self.remove_alert(self.alert)
        finally:
            self.alert = Alert()
            self.alert.props.title = title
            self.alert.props.msg = text
            self.add_alert(self.alert)
            self.alert.connect('response', self._alert_cancel_cb)
            self.alert.show()

    def _alert_cancel_cb(self, alert, response_id):
        #self.remove_alert(alert)
        pass

    def _shared_cb(self, activity):
        self._logger.debug('My activity was shared')
        self.alert = Alert()
        self.alert.props.title = 'Shared Activity'
        self.alert.props.msg = 'Shared messages to be displayed here'
        self.add_alert(self.alert)
        self.initiating = True
        self._sharing_setup()

        self._logger.debug('This is my activity: making a tube...')
        id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(
            SERVICE, {})

    def _sharing_setup(self):
        if self.shared_activity is None:
            self._logger.error('Failed to share or join activity')
            return

        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)

        self.shared_activity.connect('buddy-joined', self._buddy_joined_cb)
        self.shared_activity.connect('buddy-left', self._buddy_left_cb)

        self.entry.set_sensitive(True)
        self.entry.grab_focus()

        # Optional - included for example:
        # Find out who's already in the shared activity:
        for buddy in self.shared_activity.get_joined_buddies():
            self._logger.debug('Buddy %s is already in the activity',
                               buddy.props.nick)

    def _list_tubes_reply_cb(self, tubes):
        for tube_info in tubes:
            self._new_tube_cb(*tube_info)

    def _list_tubes_error_cb(self, e):
        self._logger.error('ListTubes() failed: %s', e)

    def _joined_cb(self, activity):
        if not self.shared_activity:
            return

        self._logger.debug('Joined an existing shared activity')
        self._alert('Joined', 'Joined a shared activity')
        self.initiating = False
        self._sharing_setup()

        self._logger.debug('This is not my 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)

    def _new_tube_cb(self, id, initiator, type, service, params, state):
        self._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.hellotube = TextSync(tube_conn, self.initiating,
                                      self.entry_text_update_cb, self._alert,
                                      self._get_buddy)

    def _buddy_joined_cb(self, activity, buddy):
        """Called when a buddy joins the shared activity.

        This doesn't do much here as HelloMesh doesn't have much 
        functionality. It's up to you do do interesting things
        with the Buddy...
        """
        self._logger.debug('Buddy %s joined', buddy.props.nick)
        self._alert('Buddy joined', '%s joined' % buddy.props.nick)

    def _buddy_left_cb(self, activity, buddy):
        """Called when a buddy leaves the shared activity.

        This doesn't do much here as HelloMesh doesn't have much 
        functionality. It's up to you do do interesting things
        with the Buddy...
        """
        self._logger.debug('Buddy %s left', buddy.props.nick)
        self._alert('Buddy left', '%s left' % buddy.props.nick)

    def _get_buddy(self, cs_handle):
        """Get a Buddy from a channel specific handle."""
        self._logger.debug('Trying to find owner of handle %u...', cs_handle)
        group = self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]
        my_csh = group.GetSelfHandle()
        self._logger.debug('My handle in that group is %u', my_csh)
        if my_csh == cs_handle:
            handle = self.conn.GetSelfHandle()
            self._logger.debug('CS handle %u belongs to me, %u', cs_handle,
                               handle)
        elif group.GetGroupFlags(
        ) & telepathy.CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES:
            handle = group.GetHandleOwners([cs_handle])[0]
            self._logger.debug('CS handle %u belongs to %u', cs_handle, handle)
        else:
            handle = cs_handle
            self._logger.debug('non-CS handle %u belongs to itself', handle)
            # XXX: deal with failure to get the handle owner
            assert handle != 0
        return self.pservice.get_buddy_by_telepathy_handle(
            self.conn.service_name, self.conn.object_path, handle)
示例#33
0
class Download:
    _com_interfaces_ = interfaces.nsITransfer
    
    def init(self, source, target, display_name, mime_info, start_time,
             temp_file, cancelable):
        self._source = source
        self._mime_type = mime_info.MIMEType
        self._temp_file = temp_file
        self._target_file = target.queryInterface(interfaces.nsIFileURL).file
        self._display_name = display_name
        self.cancelable = cancelable
        self.datastore_deleted_handler = None

        self.dl_jobject = None
        self._object_id = None
        self._last_update_time = 0
        self._last_update_percent = 0
        self._stop_alert = None

        dom_window = _dest_to_window[self._target_file.path]
        del _dest_to_window[self._target_file.path]

        view = hulahop.get_view_for_window(dom_window)
        print dom_window
        self._activity = view.get_toplevel()
        
        return NS_OK

    def onStatusChange(self, web_progress, request, status, message):
        logging.info('Download.onStatusChange(%r, %r, %r, %r)' % \
            (web_progress, request, status, message))

    def onStateChange(self, web_progress, request, state_flags, status):
        if state_flags & interfaces.nsIWebProgressListener.STATE_START:
            self._create_journal_object()            
            self._object_id = self.dl_jobject.object_id
            
            alert = TimeoutAlert(9)
            alert.props.title = _('Download started')
            alert.props.msg = _('%s' % self._get_file_name()) 
            self._activity.add_alert(alert)
            alert.connect('response', self.__start_response_cb)
            alert.show()
            global _active_downloads
            _active_downloads.append(self)
            
        elif state_flags & interfaces.nsIWebProgressListener.STATE_STOP:
            if NS_FAILED(status): # download cancelled
                return

            self._stop_alert = Alert()
            self._stop_alert.props.title = _('Download completed') 
            self._stop_alert.props.msg = _('%s' % self._get_file_name()) 
            open_icon = Icon(icon_name='zoom-activity') 
            self._stop_alert.add_button(gtk.RESPONSE_APPLY, 
                                        _('Show in Journal'), open_icon) 
            open_icon.show() 
            ok_icon = Icon(icon_name='dialog-ok') 
            self._stop_alert.add_button(gtk.RESPONSE_OK, _('Ok'), ok_icon) 
            ok_icon.show()            
            self._activity.add_alert(self._stop_alert) 
            self._stop_alert.connect('response', self.__stop_response_cb)
            self._stop_alert.show()

            self.dl_jobject.metadata['title'] = _('File %s from %s.') % \
                    (self._get_file_name(), self._source.spec)
            self.dl_jobject.metadata['progress'] = '100'
            self.dl_jobject.file_path = self._target_file.path

            if self._mime_type in ['application/octet-stream',
                                   'application/x-zip']:
                sniffed_mime_type = mime.get_for_file(self._target_file.path)
                self.dl_jobject.metadata['mime_type'] = sniffed_mime_type

            datastore.write(self.dl_jobject,
                            transfer_ownership=True,
                            reply_handler=self._internal_save_cb,
                            error_handler=self._internal_save_error_cb,
                            timeout=360 * DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND)

    def __start_response_cb(self, alert, response_id):
        global _active_downloads
        if response_id is gtk.RESPONSE_CANCEL:
            logging.debug('Download Canceled')
            self.cancelable.cancel(NS_ERROR_FAILURE) 
            try:
                self.datastore_deleted_handler.remove()
                datastore.delete(self._object_id)
            except Exception, e:
                logging.warning('Object has been deleted already %s' % e)
            if self.dl_jobject is not None:
                self.cleanup_datastore_write()
            if self._stop_alert is not None:
                self._activity.remove_alert(self._stop_alert)

        self._activity.remove_alert(alert)        
示例#34
0
    def __accept_clicked_cb(self, widget):
        if self._section_view.needs_restart:
            self._section_toolbar.accept_button.set_sensitive(False)
            self._section_toolbar.cancel_button.set_sensitive(False)
            alert = Alert()
            alert.props.title = _('Warning')
            alert.props.msg = _('Changes require restart')

            icon = Icon(icon_name='dialog-cancel')
            alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel changes'), icon)
            icon.show()

            if self._current_option != 'aboutme':
                icon = Icon(icon_name='dialog-ok')
                alert.add_button(gtk.RESPONSE_ACCEPT, _('Later'), icon)
                icon.show()

            icon = Icon(icon_name='system-restart')
            alert.add_button(gtk.RESPONSE_APPLY, _('Restart now'), icon)
            icon.show()

            self._vbox.pack_start(alert, False)
            self._vbox.reorder_child(alert, 2)
            alert.connect('response', self.__response_cb)
            alert.show()
        else:
            self._show_main_view()
示例#35
0
class DevTutorActivity(activity.Activity):
    """DevTutorActivity class as specified in activity.info"""

    def __init__(self, handle):

        activity.Activity.__init__(self, handle)

        self.max_participants = 10

        # toolbar with the new toolbar redesign
        toolbar_box = ToolbarBox()

        activity_button = ActivityButton(self)
        toolbar_box.toolbar.insert(activity_button, 0)
        activity_button.show()

        title_entry = TitleEntry(self)
        toolbar_box.toolbar.insert(title_entry, -1)
        title_entry.show()

        share_button = ShareButton(self)
        toolbar_box.toolbar.insert(share_button, -1)
        share_button.show()

        stop_button = StopButton(self)
        toolbar_box.toolbar.insert(stop_button, -1)
        stop_button.show()

        self.back_button = BackButton()
        self.back_button.connect("clicked", self.show_options1)
        toolbar_box.toolbar.insert(self.back_button, 0)
        self.back_button.show()

        self.set_toolbar_box(toolbar_box)
        toolbar_box.show()

        self.show_options()

        self._logger = logging.getLogger("hellomesh-activity")

        self.hellotube = None  # Shared session
        self.initiating = False

        # get the Presence Service
        self.pservice = presenceservice.get_instance()
        # Buddy object for you
        owner = self.pservice.get_owner()
        self.owner = owner

        self.connect("shared", self._shared_cb)
        self.connect("joined", self._joined_cb)

    def show_options1(self, data=None):
        self.show_options()

    def show_options(self):

        self.main_container = gtk.VBox()

        self.add_padding()
        self.line1 = gtk.HBox()

        button1 = gtk.Button("Show modules")
        # button1.set_size_request(200,80)
        # self.line1.pack_start(button1, False, False, 0)
        self.line1.add(button1)
        button1.connect("clicked", self.show_modules, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()

        self.add_padding()

        self.line2 = gtk.HBox()
        button2 = gtk.Button("Show activities")
        # button2.set_size_request(200,80)
        # self.line2.pack_start(button2, False, False, 0)
        self.line2.add(button2)
        button2.connect("clicked", self.show_activity_list, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()
        self.add_padding()

        self.line3 = gtk.HBox()
        text = gtk.TextView()
        self.entry = gtk.Entry()
        self.entry.set_sensitive(True)
        self.entry.connect("activate", self.entry_activate_cb)

        self.entry.show()
        self.line3.add(self.entry)
        self.main_container.add(self.line3)
        self.line3.show()

        self.set_canvas(self.main_container)

        self.main_container.show()

    def add_padding(self):
        self.line_space1 = gtk.HBox()
        self.main_container.add(self.line_space1)
        self.line_space1.show()

        self.line_space2 = gtk.HBox()
        self.main_container.add(self.line_space2)
        self.line_space2.show()

    def show_modules(self, sender, data=None):

        self.mod = ShowModules(self.set_canvas)
        self.mod.show_modules()

    def show_activity_list(self, sender, data=None):
        self.back_button.connect("clicked", self.show_options1)
        self.main_container = gtk.VBox()

        self.add_padding()
        self.line1 = gtk.HBox()

        button1 = gtk.Button("Hello World activity")
        # button1.set_size_request(200,80)
        # self.line1.pack_start(button1, False, False, 0)
        self.line1.add(button1)
        button1.connect("clicked", self.show_labels_hello, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()

        self.add_padding()
        self.line2 = gtk.HBox()

        button2 = gtk.Button("Write activity")
        # button2.set_size_request(200,80)
        # self.line2.pack_start(button2, False, False, 0)
        self.line2.add(button2)
        button2.connect("clicked", self.show_labels_write, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()
        self.add_padding()

        self.set_canvas(self.main_container)
        self.main_container.show()

    def show_labels_hello(self, sender, data=None):
        self.back_button.connect("clicked", self.show_activity_list)
        self.main_container = gtk.VBox()

        self.add_padding()
        self.line1 = gtk.HBox()

        self.label1 = gtk.Label(_("Hello World activity step 1 - call activity.__init__"))
        self.label1.set_line_wrap(True)
        self.label1.modify_font(pango.FontDescription("Sans 12"))
        self.line1.add(self.label1)
        self.label1.show()

        button1 = gtk.Button("Show result")
        button1.set_size_request(200, 80)
        self.line1.pack_start(button1, False, False, 0)
        button1.connect("clicked", self.hello_launch1, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()

        self.add_padding()
        self.line2 = gtk.HBox()

        self.label2 = gtk.Label(_("Hello Word activity step 2 - add toolbox"))
        self.label2.set_line_wrap(True)
        self.label2.modify_font(pango.FontDescription("Sans 12"))
        self.line2.add(self.label2)
        self.label2.show()

        button2 = gtk.Button("Show result")
        button2.set_size_request(200, 80)
        self.line2.pack_start(button2, False, False, 0)
        button2.connect("clicked", self.hello_launch2, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()

        self.add_padding()
        self.line3 = gtk.HBox()

        self.label3 = gtk.Label(_("Hello World activity step 3 - add hello world label"))
        self.label3.set_line_wrap(True)
        self.label3.modify_font(pango.FontDescription("Sans 12"))
        self.line3.add(self.label3)
        self.label3.show()

        button3 = gtk.Button("Show result")
        button3.set_size_request(200, 80)
        self.line3.pack_start(button3, False, False, 0)
        button3.connect("clicked", self.hello_launch3, None)
        button3.get_child().modify_font(pango.FontDescription("Sans 14"))
        button3.show()

        self.main_container.add(self.line3)
        self.line3.show()

        self.add_padding()
        self.line4 = gtk.HBox()

        self.label4 = gtk.Label(_("Hello World activity step 4 - add rotate button"))
        self.label4.set_line_wrap(True)
        self.label4.modify_font(pango.FontDescription("Sans 12"))
        self.line4.add(self.label4)
        self.label4.show()

        button4 = gtk.Button("Show result")
        button4.set_size_request(200, 80)
        self.line4.pack_start(button4, False, False, 0)
        button4.connect("clicked", self.hello_launch4, None)
        button4.get_child().modify_font(pango.FontDescription("Sans 14"))
        button4.show()

        self.main_container.add(self.line4)
        self.line4.show()

        self.add_padding()
        self.set_canvas(self.main_container)
        self.main_container.show()

    def show_labels_write(self, sender, data=None):
        self.back_button.connect("clicked", self.show_activity_list)
        self.main_container = gtk.VBox()
        self.add_padding()
        self.line1 = gtk.HBox()

        self.label1 = gtk.Label(_("Write activity step 1 "))
        self.label1.set_line_wrap(True)
        self.label1.modify_font(pango.FontDescription("Sans 12"))
        self.line1.add(self.label1)
        self.label1.show()

        button1 = gtk.Button("Show result")
        button1.set_size_request(200, 80)
        self.line1.pack_start(button1, False, False, 0)
        button1.connect("clicked", self.write_launch1, None)
        button1.get_child().modify_font(pango.FontDescription("Sans 14"))
        button1.show()

        self.main_container.add(self.line1)
        self.line1.show()
        self.add_padding()
        self.line2 = gtk.HBox()

        self.label2 = gtk.Label(_("Write activity step 2"))
        self.label2.set_line_wrap(True)
        self.label2.modify_font(pango.FontDescription("Sans 12"))
        self.line2.add(self.label2)
        self.label2.show()

        button2 = gtk.Button("Show result")
        button2.set_size_request(200, 80)
        self.line2.pack_start(button2, False, False, 0)
        button2.connect("clicked", self.write_launch2, None)
        button2.get_child().modify_font(pango.FontDescription("Sans 14"))
        button2.show()

        self.main_container.add(self.line2)
        self.line2.show()

        self.set_canvas(self.main_container)
        self.add_padding()
        self.line3 = gtk.HBox()

        self.label3 = gtk.Label(_("Write activity step 3"))
        self.label3.set_line_wrap(True)
        self.label3.modify_font(pango.FontDescription("Sans 12"))
        self.line3.add(self.label3)
        self.label3.show()

        button3 = gtk.Button("Show result")
        button3.set_size_request(200, 80)
        self.line3.pack_start(button3, False, False, 0)
        button3.connect("clicked", self.write_launch3, None)
        button3.get_child().modify_font(pango.FontDescription("Sans 14"))
        button3.show()

        self.main_container.add(self.line3)
        self.line3.show()
        self.add_padding()
        self.set_canvas(self.main_container)
        self.main_container.show()

    def hello_launch1(self, sender, data=None):
        f = open("/tmp/1", "w")
        os.putenv("TUTOR_CLASS", "HelloWorldActivity")
        self.launch()

    def hello_launch2(self, sender, data=None):
        f = open("/tmp/2", "w")
        self.hello_launch1(sender, data)

    def hello_launch3(self, sender, data=None):
        f = open("/tmp/3", "w")
        self.hello_launch2(sender, data)

    def hello_launch4(self, sender, data=None):
        f = open("/tmp/4", "w")
        self.hello_launch3(sender, data)

    def write_launch1(self, sender, data=None):
        f = open("/tmp/1", "w")
        os.putenv("TUTOR_CLASS", "AbiWordActivity")
        self.launch()

    def write_launch2(self, sender, data=None):
        f = open("/tmp/2", "w")
        self.write_launch1(sender, data)

    def write_launch3(self, sender, data=None):
        f = open("/tmp/3", "w")
        self.write_launch2(sender, data)

    def launch(self):
        subprocess.Popen(["sugar-launch", "org.sugarlabs.DevTutor"])

    def entry_activate_cb(self, entry):
        """Handle the event when Enter is pressed in the Entry."""
        text = entry.props.text
        if self.hellotube is not None:
            self.hellotube.SendText(text)

    def entry_text_update_cb(self, text):
        """Update Entry text when text received from others."""
        self.entry.props.text = text

    def _alert(self, title, text=None):
        try:
            self.remove_alert(self.alert)
        finally:
            self.alert = Alert()
            self.alert.props.title = title
            self.alert.props.msg = text
            self.add_alert(self.alert)
            self.alert.connect("response", self._alert_cancel_cb)
            self.alert.show()

    def _alert_cancel_cb(self, alert, response_id):
        # self.remove_alert(alert)
        pass

    def _shared_cb(self, activity):
        self._logger.debug("My activity was shared")
        self.alert = Alert()
        self.alert.props.title = "Shared Activity"
        self.alert.props.msg = "Shared messages to be displayed here"
        self.add_alert(self.alert)
        self.initiating = True
        self._sharing_setup()

        self._logger.debug("This is my activity: making a tube...")
        id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(SERVICE, {})

    def _sharing_setup(self):
        if self.shared_activity is None:
            self._logger.error("Failed to share or join activity")
            return

        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)

        self.shared_activity.connect("buddy-joined", self._buddy_joined_cb)
        self.shared_activity.connect("buddy-left", self._buddy_left_cb)

        self.entry.set_sensitive(True)
        self.entry.grab_focus()

        # Optional - included for example:
        # Find out who's already in the shared activity:
        for buddy in self.shared_activity.get_joined_buddies():
            self._logger.debug("Buddy %s is already in the activity", buddy.props.nick)

    def _list_tubes_reply_cb(self, tubes):
        for tube_info in tubes:
            self._new_tube_cb(*tube_info)

    def _list_tubes_error_cb(self, e):
        self._logger.error("ListTubes() failed: %s", e)

    def _joined_cb(self, activity):
        if not self.shared_activity:
            return

        self._logger.debug("Joined an existing shared activity")
        self._alert("Joined", "Joined a shared activity")
        self.initiating = False
        self._sharing_setup()

        self._logger.debug("This is not my 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
        )

    def _new_tube_cb(self, id, initiator, type, service, params, state):
        self._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.hellotube = TextSync(
                tube_conn, self.initiating, self.entry_text_update_cb, self._alert, self._get_buddy
            )

    def _buddy_joined_cb(self, activity, buddy):
        """Called when a buddy joins the shared activity.

        This doesn't do much here as HelloMesh doesn't have much 
        functionality. It's up to you do do interesting things
        with the Buddy...
        """
        self._logger.debug("Buddy %s joined", buddy.props.nick)
        self._alert("Buddy joined", "%s joined" % buddy.props.nick)

    def _buddy_left_cb(self, activity, buddy):
        """Called when a buddy leaves the shared activity.

        This doesn't do much here as HelloMesh doesn't have much 
        functionality. It's up to you do do interesting things
        with the Buddy...
        """
        self._logger.debug("Buddy %s left", buddy.props.nick)
        self._alert("Buddy left", "%s left" % buddy.props.nick)

    def _get_buddy(self, cs_handle):
        """Get a Buddy from a channel specific handle."""
        self._logger.debug("Trying to find owner of handle %u...", cs_handle)
        group = self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]
        my_csh = group.GetSelfHandle()
        self._logger.debug("My handle in that group is %u", my_csh)
        if my_csh == cs_handle:
            handle = self.conn.GetSelfHandle()
            self._logger.debug("CS handle %u belongs to me, %u", cs_handle, handle)
        elif group.GetGroupFlags() & telepathy.CHANNEL_GROUP_FLAG_CHANNEL_SPECIFIC_HANDLES:
            handle = group.GetHandleOwners([cs_handle])[0]
            self._logger.debug("CS handle %u belongs to %u", cs_handle, handle)
        else:
            handle = cs_handle
            self._logger.debug("non-CS handle %u belongs to itself", handle)
            # XXX: deal with failure to get the handle owner
            assert handle != 0
        return self.pservice.get_buddy_by_telepathy_handle(self.conn.service_name, self.conn.object_path, handle)
示例#36
0
文件: mynum.py 项目: worg/MathMe
class Numbers:
    timeout  = 0
    hasOp    = True
    oldSign  = 0
    lifes    = 2
    difScore = 0
    difText  = ''
    score    = 0
    rounds   = 0
    player   = ''
    alert    = Alert()
    
    def __init__(self, runAsLib = True):
        self.builder = gtk.Builder() 
        self.builder.add_from_file('num.ui')
        self.window = self.builder.get_object('numWindow')
        self.menuView = self.builder.get_object('menuView')
        self.lbTitle = self.builder.get_object('lbTitle')
        self.lbSubt  = self.builder.get_object('lbSubt')
        self.btnEasy = self.builder.get_object('btnEasy')
        self.btnHard = self.builder.get_object('btnHard')
        self.btnMed  = self.builder.get_object('btnMed')
        self.scoreView = self.builder.get_object('scoreView')
        self.scoreMain = self.builder.get_object('scoreMain')
        self.lbScore = self.builder.get_object('lbScore')
        self.scoreList = self.builder.get_object('scoreList')
        self.nameView = self.builder.get_object('nameView')
        self.txtPlayer = self.builder.get_object('txtPlayer')
        self.gameView = self.builder.get_object('gameView')
        self.lbNum1 = self.builder.get_object('lbNum1')
        self.lbNum2 = self.builder.get_object('lbNum2')
        self.lbSign = self.builder.get_object('lbSign')
        self.lbEqual = self.builder.get_object('lbEqual')
        self.txtRes = self.builder.get_object('txtRes')
        self.lbMsg  = self.builder.get_object('lbMsg')
        self.imgCheck  = self.builder.get_object('imgCheck')
        self.pBar = self.builder.get_object('progressBar')
        self.btnCalc = self.builder.get_object('btnCalc')
        self.btnNext = self.builder.get_object('btnNext')
        self.lifeBox = self.builder.get_object('lifeBox')
        self.modelScore = listView(self.scoreList)
        self.widget = self.window.get_child()
        
        gtk.rc_parse_string("""
			style "mystyle"
				{
					font_name = "sans 30"
				}
			class 'GtkEntry' style 'mystyle' 
		""")
        
        self.lbLife = [gtk.Label(), gtk.Label(), gtk.Label(), gtk.Label()]
        i = 0
        for label in self.lifeBox.get_children():
            self.lbLife[i] = label
            self.pangoLabel(self.lbLife[i], self.rgbToPango(153,84,244), 2)
            i += 1
                
        self.markMe(self.btnCalc)
        self.markMe(self.btnNext)
        self.pangoLabel(self.lbNum1, self.rgbToPango(29, 97, 252), 5)
        self.pangoLabel(self.lbNum2, self.rgbToPango(227, 126, 0), 5)
        self.pangoLabel(self.lbSign, self.rgbToPango(255,0,0), 5)
        self.pangoLabel(self.lbEqual, self.rgbToPango(145, 225, 36), 5)
        self.forceLocales()
        
        self.builder.connect_signals(self)
        self.alert.hide()
        
        if not runAsLib:
            self.window.show_all()
			
        dbPath ='%s/.MathMe.db' % path.expanduser('~')
        dbExists = False
        if path.isfile(dbPath):
            dbExists = True
        self.dataCon = sqlite3.connect(dbPath)
        self.dataCursor = self.dataCon.cursor()
        initDb = 'create table mathMe (player text, score int, rounds int, difficulty text);'
        if not dbExists:
            self.dataCursor.execute(initDb)
        
    def numbers_term(self, widget, data = 0):
        gtk.main_quit()
    
    def numbers_calcOp(self, widget):
        if not self.hasOp:
            self.lbMsg.set_label(' ')
            num1 = int(self.lbNum1.get_label())
            num2 = int(self.lbNum2.get_label())
            sign = self.lbSign.get_label()
            res = 0.0
            
            try:
                txRes = int(self.txtRes.get_text())
                if sign == '+':
                    res = num1 + num2
                    pointFactor = 1 + self.difScore
                elif sign == '-':
                    res = num1 - num2
                    pointFactor = 1 + self.difScore
                elif sign == '×':
                    res = num1 * num2
                    pointFactor = 2 + self.difScore
                elif sign == '÷':
                    res = num1 / num2
                    pointFactor = 2 + self.difScore
                
                if(txRes == res):
                    self.sendMsg(True)
                    self.score  += pointFactor
                else:
                    self.sendMsg(False, res)
                    
                self.rounds += 1
                self.btnNext.grab_focus()
            except ValueError:
                if self.txtRes.get_text() != '':
                    self.lbMsg.set_label(self.pangoMark('purple', 'white', _('Insert numbers, not letters')))
                    self.txtRes.set_text('')
                    self.txtRes.grab_focus()
    
    def numbers_oper(self, widget = gtk.Widget):
        self.imgCheck.clear()
        self.lbMsg.set_label('')
        num1 = randint(1,10)
        num2 = randrange(1,10)
        newSign = randint(1,4)
        sign = ''
        
        if self.lifes < 0 and self.hasOp:
            widget = self.txtPlayer
            widget.grab_focus()
            self.showScore(self.gameView, True)
            self.gameView.set_sensitive(False)
        else:
            widget = self.txtRes
        
        while newSign == self.oldSign:
            newSign = randrange(1,4)
                    
        self.oldSign = newSign
            
        if newSign == 1:
            sign = '+'
        elif newSign == 2:
            sign = '-'
        elif newSign == 3:
            sign = '×'
        elif newSign == 4:
            sign = '÷'
            
        if(self.hasOp):
            if sign == '÷':
                while num1 % num2 != 0 or num1 == num2 or (num1 == 1 or num2 == 1):
                    num1 = randint(1,10)
                    num2 = randrange(1,10)
            elif sign == '-':
                while num1 < num2 or num1 == num2:
                    num1 = randint(1,10)
                    num2 = randrange(1,10)
            self.lbNum1.set_label(str(num1))
            self.lbNum2.set_label(str(num2))
            self.lbSign.set_label(sign)
            self.txtRes.set_text('')
            self.hasOp = False
        else:
            self.lbMsg.set_label(self.pangoMark('#095DF0', 'white', _('Type the result, then press calculate')))
        widget.grab_focus()
        timeout_add(self.timeout,self.setProgress)
        
    def numbers_txtActivate(self, widget):
        if widget.get_text() != '':
                    self.btnCalc.grab_focus()
        
    def numbers_chDiff(self,action):
        actionN = action.get_name()
        if actionN == 'easy':            
            self.timeout  = 100
            self.difScore = 1
            self.difText  = unicode(_('Easy'))
        elif actionN == 'medium':
            self.timeout  = 50
            self.difScore = 2
            self.difText  = unicode(_('Medium'))
            print _('Medium')
        elif actionN == 'hard':
            self.timeout  = 25
            self.difScore = 3
            self.difText  = unicode(_('Hard'))
            
        self.gameView.show()
        self.gameView.set_sensitive(True)
        self.menuView.hide()
        self.numbers_oper()
        
    def numbers_savePlayer(self, widget, respid = 0):
        self.myAct.remove_alert(self.alert)
        self.scoreMain.show()
        self.player = unicode(self.txtPlayer.get_text())
        #Saving Data
        self.dataCursor.execute('INSERT INTO mathMe (player, score, rounds, difficulty) VALUES (?, ?, ?, ?)',(self.player, self.score, self.rounds, self.difText))
        self.dataCon.commit()
        #Filling listView
        self.fillScore()
                    
        self.okAlert(_('To start a New Game press Ok'),'', self.numbers_setScore)
        self.nameView.hide()
    
    def numbers_setScore(self, widget, respid = 0):
        self.myAct.remove_alert(self.alert)
        self.initLifes()
        
    def showScore(self, widget, internal = False):
        widget.hide()
        self.scoreView.show()
        if internal:
            self.scoreMain.hide()
            self.nameView.show()
            self.txtPlayer.grab_focus()
            self.okAlert(_('Game Over'),'', self.numbers_savePlayer)
        else:
            self.fillScore()
            self.scoreMain.show()
            self.nameView.hide()
            self.okAlert(_('To go back press Ok'),'', self.numbers_setScore)
                            
    def numbers_actEnd(self, widget):
        self.dataCon.commit()
        self.dataCursor.close()
        self.dataCon.close()
            
    def markMe(self, widget,data = 0):
        widgetLabel = widget.get_child()
        foreg = self.rgbToPango(153, 38, 244)
        self.pangoLabel(widgetLabel, foreg, 1.5)
            
    def sendMsg(self, isRight, res = 0):
        if isRight:
            self.lbMsg.set_label(self.pangoMark('#4DC406', 'white',_('Great!')))
            self.imgCheck.set_from_file('icons/face-laugh.png')
        else:
            if(self.lifes < 0):
                self.lbMsg.set_label('<span foreground = "white" background = "purple" size = "x-large">  %s <b>%d  </b>, %s</span>' % (_('The result is:'), res, _('Game Over')))
            else:
                self.lbMsg.set_label('<span foreground = "white" background = "orange" size = "x-large">  %s <b>%d  </b></span>' % (_('The result is:'), res))
            self.imgCheck.set_from_file('icons/face-sad.png')
            self.lbLife[self.lifes].set_label(' ')
            self.lifes -= 1
            
        self.hasOp = True
    
    def setProgress(self):
        fraction = self.pBar.get_fraction()
        fraction += 0.01
        if not self.hasOp:
            if fraction < 1:
                self.pBar.set_fraction(fraction)
            else:
                if self.txtRes.get_text() == '':
                    self.txtRes.set_text('0')
                self.numbers_calcOp(self.btnCalc)
                self.pBar.set_fraction(0.0)
        else:
            self.pBar.set_fraction(0.0)
        
        return not self.hasOp
        
    def initLifes(self):
        i = 0
        while i < 3:
            self.lbLife[i].set_label('☺')
            i += 1
        
        self.gameView.hide()
        self.scoreView.hide()
        self.menuView.show()
        self.pBar.set_fraction(0)
        self.btnEasy.grab_focus()
        self.lifes  = 3
        self.score = 0
        self.rounds = 0
        

    def forceLocales(self):
        #This nasty function is needed due to lack of doc how-to localize a GtkBuilder activity
        btnScore     = self.builder.get_object('btnScore')
        btnScoreOk   = self.builder.get_object('btnScoreOk')
        btnScMainOk  = self.builder.get_object('btnScMainOk')
        lbScore      = self.builder.get_object('lbScore')
        lbPlayer     = self.builder.get_object('lbPlayer')
         
        self.lbTitle.set_label(_('New Game'))
        self.pangoLabel(self.lbTitle,(0,0,0),3)
        self.lbSubt.set_label(_('Choose difficulty'))
        self.pangoLabel(self.lbSubt,(0,0,0),1.5)
        self.btnEasy.set_label(_('_Easy'))
        self.btnMed.set_label(_('_Medium'))
        self.btnHard.set_label(_('_Hard'))
        self.btnNext.set_label(_('_Next'))
        self.btnCalc.set_label(_('_Calculate'))
        btnScore.set_label(_('_Score'))
        btnScMainOk.set_label(_('Ok'))
        btnScoreOk.set_label(_('_Ok'))
        lbScore.set_label(_('Score'))
        self.pangoLabel(lbScore,(0,0,0),3)
        lbPlayer.set_label(_('Write Your Name'))
        self.pangoLabel(lbPlayer,(0,0,0),3)
        
    def pangoLabel(self, label, fg, scale):
        atr = pango.AttrList()
        foreg = pango.AttrForeground(fg[0], fg[1], fg[2],0, 100)
        scale = pango.AttrScale(scale, 0, 100)
        atr.insert(foreg)
        atr.insert(scale)
        label.set_attributes(atr)
        
    def pangoMark(self, bg, fg, content):
        return '<span foreground = "%s" background = "%s" size = "x-large">  %s  </span>' % (fg, bg, content)
        
    def rgbToPango(self, r, g, b):
        r = (r * 65535)/255
        g = (g * 65535)/255
        b = (b * 65535)/255
        
        return (r,g,b)
        
    def fillScore(self):
        self.dataCursor.execute('SELECT * FROM mathMe ORDER BY score COLLATE NOCASE DESC')
        self.modelScore.clear()
        for row in self.dataCursor:
            self.modelScore.append(row)
            
    def okAlert(self, title, msg, callback):        
        self.alert = Alert()
        icon = Icon(icon_name='dialog-ok')
        self.alert.add_button(gtk.RESPONSE_OK, _('_Ok'), icon)
        
        self.alert.props.title = title
        self.alert.props.msg = msg
        
        self.alert.connect('response', callback)
        self.myAct.add_alert(self.alert)
        
    def setActivity(self, act):
        self.myAct = act
class BBoardActivity(activity.Activity):
    ''' Make a slideshow from starred Journal entries. '''

    def __init__(self, handle):
        ''' Initialize the toolbars and the work surface '''
        super(BBoardActivity, self).__init__(handle)

        self.datapath = get_path(activity, 'instance')

        self._hw = get_hardware()

        self._playback_buttons = {}
        self._audio_recordings = {}
        self.colors = profile.get_color().to_string().split(',')

        self._setup_toolbars()
        self._setup_canvas()

        self.slides = []
        self._setup_workspace()

        self._buddies = [profile.get_nick_name()]
        self._setup_presence_service()

        self._thumbs = []
        self._thumbnail_mode = False

        self._recording = False
        self._grecord = None
        self._alert = None

        self._dirty = False

    def _setup_canvas(self):
        ''' Create a canvas '''
        self._canvas = gtk.DrawingArea()
        self._canvas.set_size_request(int(gtk.gdk.screen_width()),
                                      int(gtk.gdk.screen_height()))
        self._canvas.show()
        self.set_canvas(self._canvas)
        self.show_all()

        self._canvas.set_flags(gtk.CAN_FOCUS)
        self._canvas.add_events(gtk.gdk.BUTTON_PRESS_MASK)
        self._canvas.add_events(gtk.gdk.POINTER_MOTION_MASK)
        self._canvas.add_events(gtk.gdk.BUTTON_RELEASE_MASK)
        self._canvas.add_events(gtk.gdk.KEY_PRESS_MASK)
        self._canvas.connect("expose-event", self._expose_cb)
        self._canvas.connect("button-press-event", self._button_press_cb)
        self._canvas.connect("button-release-event", self._button_release_cb)
        self._canvas.connect("motion-notify-event", self._mouse_move_cb)

    def _setup_workspace(self):
        ''' Prepare to render the datastore entries. '''

        # Use the lighter color for the text background
        if lighter_color(self.colors) == 0:
            tmp = self.colors[0]
            self.colors[0] = self.colors[1]
            self.colors[1] = tmp

        self._width = gtk.gdk.screen_width()
        self._height = gtk.gdk.screen_height()
        self._scale = gtk.gdk.screen_height() / 900.

        if not HAVE_TOOLBOX and self._hw[0:2] == 'xo':
            titlef = 18
            descriptionf = 12
        else:
            titlef = 36
            descriptionf = 24

        self._find_starred()
        for ds in self.dsobjects:
            if 'title' in ds.metadata:
                title = ds.metadata['title']
            else:
                title = None
            pixbuf = None
            media_object = False
            mimetype = None
            if 'mime_type' in ds.metadata:
                mimetype = ds.metadata['mime_type']
            if mimetype[0:5] == 'image':
                pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(
                    ds.file_path, MAXX, MAXY)
                    # ds.file_path, 300, 225)
                media_object = True
            else:
                pixbuf = get_pixbuf_from_journal(ds, MAXX, MAXY)  # 300, 225)
            if 'description' in ds.metadata:
                desc = ds.metadata['description']
            else:
                desc = None
            self.slides.append(Slide(True, ds.object_id, self.colors,
                                     title, pixbuf, desc))

        # Generate the sprites we'll need...
        self._sprites = Sprites(self._canvas)

        self._help = Sprite(
            self._sprites,
            int((self._width - int(PREVIEWW * self._scale)) / 2),
            int(PREVIEWY * self._scale),
            gtk.gdk.pixbuf_new_from_file_at_size(
                os.path.join(activity.get_bundle_path(), 'help.png'),
                int(PREVIEWW * self._scale), int(PREVIEWH * self._scale)))
        self._help.hide()

        self._genblanks(self.colors)

        self._title = Sprite(self._sprites, 0, 0, self._title_pixbuf)
        self._title.set_label_attributes(int(titlef * self._scale),
                                         rescale=False)
        self._preview = Sprite(self._sprites,
            int((self._width - int(PREVIEWW * self._scale)) / 2),
            int(PREVIEWY * self._scale), self._preview_pixbuf)

        self._description = Sprite(self._sprites,
                                   int(DESCRIPTIONX * self._scale),
                                   int(DESCRIPTIONY * self._scale),
                                   self._desc_pixbuf)
        self._description.set_label_attributes(int(descriptionf * self._scale))

        self._my_canvas = Sprite(self._sprites, 0, 0, self._canvas_pixbuf)
        self._my_canvas.set_layer(BOTTOM)

        self._clear_screen()

        self.i = 0
        self._show_slide()

        self._playing = False
        self._rate = 10

    def _genblanks(self, colors):
        ''' Need to cache these '''
        self._title_pixbuf = svg_str_to_pixbuf(
            genblank(self._width, int(TITLEH * self._scale), colors))
        self._preview_pixbuf = svg_str_to_pixbuf(
            genblank(int(PREVIEWW * self._scale), int(PREVIEWH * self._scale),
                     colors))
        self._desc_pixbuf = svg_str_to_pixbuf(
            genblank(int(self._width - (2 * DESCRIPTIONX * self._scale)),
                     int(DESCRIPTIONH * self._scale), colors))
        self._canvas_pixbuf = svg_str_to_pixbuf(
            genblank(self._width, self._height, (colors[0], colors[0])))

    def _setup_toolbars(self):
        ''' Setup the toolbars. '''

        self.max_participants = 6

        if HAVE_TOOLBOX:
            toolbox = ToolbarBox()

            # Activity toolbar
            activity_button_toolbar = ActivityToolbarButton(self)

            toolbox.toolbar.insert(activity_button_toolbar, 0)
            activity_button_toolbar.show()

            self.set_toolbar_box(toolbox)
            toolbox.show()
            self.toolbar = toolbox.toolbar

            self.record_toolbar = gtk.Toolbar()
            record_toolbar_button = ToolbarButton(
                label=_('Record a sound'),
                page=self.record_toolbar,
                icon_name='media-audio')
            self.record_toolbar.show_all()
            record_toolbar_button.show()
            toolbox.toolbar.insert(record_toolbar_button, -1)
        else:
            # Use pre-0.86 toolbar design
            primary_toolbar = gtk.Toolbar()
            toolbox = activity.ActivityToolbox(self)
            self.set_toolbox(toolbox)
            toolbox.add_toolbar(_('Page'), primary_toolbar)
            self.record_toolbar = gtk.Toolbar()
            toolbox.add_toolbar(_('Record'), self.record_toolbar)
            toolbox.show()
            toolbox.set_current_toolbar(1)
            self.toolbar = primary_toolbar

        self._prev_button = button_factory(
            'go-previous-inactive', self.toolbar, self._prev_cb,
            tooltip=_('Prev slide'), accelerator='<Ctrl>P')

        self._next_button = button_factory(
            'go-next', self.toolbar, self._next_cb,
            tooltip=_('Next slide'), accelerator='<Ctrl>N')


        separator_factory(self.toolbar)

        slide_button = radio_factory('slide-view', self.toolbar,
                                     self._slides_cb, group=None,
                                     tooltip=_('Slide view'))
        radio_factory('thumbs-view', self.toolbar, self._thumbs_cb,
                      tooltip=_('Thumbnail view'),
                      group=slide_button)

        button_factory('view-fullscreen', self.toolbar,
                       self.do_fullscreen_cb, tooltip=_('Fullscreen'),
                       accelerator='<Alt>Return')

        separator_factory(self.toolbar)

        journal_button = button_factory(
            'write-journal', self.toolbar, self._do_journal_cb,
            tooltip=_('Update description'))
        self._palette = journal_button.get_palette()
        msg_box = gtk.HBox()

        sw = gtk.ScrolledWindow()
        sw.set_size_request(int(gtk.gdk.screen_width() / 2),
                            2 * style.GRID_CELL_SIZE)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self._text_view = gtk.TextView()
        self._text_view.set_left_margin(style.DEFAULT_PADDING)
        self._text_view.set_right_margin(style.DEFAULT_PADDING)
        self._text_view.set_wrap_mode(gtk.WRAP_WORD_CHAR)
        self._text_view.connect('focus-out-event',
                               self._text_view_focus_out_event_cb)
        sw.add(self._text_view)
        sw.show()
        msg_box.pack_start(sw, expand=False)
        msg_box.show_all()

        self._palette.set_content(msg_box)

        label_factory(self.record_toolbar, _('Record a sound') + ':')
        self._record_button = button_factory(
            'media-record', self.record_toolbar,
            self._record_cb, tooltip=_('Start recording'))

        separator_factory(self.record_toolbar)

        # Look to see if we have audio previously recorded
        obj_id = self._get_audio_obj_id()
        dsobject = self._search_for_audio_note(obj_id)
        if dsobject is not None:
            _logger.debug('Found previously recorded audio')
            self._add_playback_button(profile.get_nick_name(),
                                      self.colors,
                                      dsobject.file_path)

        if HAVE_TOOLBOX:
            button_factory('system-restart', activity_button_toolbar,
                           self._resend_cb, tooltip=_('Refresh'))
            separator_factory(activity_button_toolbar)
            self._save_pdf = button_factory(
                'save-as-pdf', activity_button_toolbar,
                self._save_as_pdf_cb, tooltip=_('Save as PDF'))
        else:
            separator_factory(self.toolbar)
            self._save_pdf = button_factory(
                'save-as-pdf', self.toolbar,
                self._save_as_pdf_cb, tooltip=_('Save as PDF'))

        if HAVE_TOOLBOX:
            separator_factory(toolbox.toolbar, True, False)

            stop_button = StopButton(self)
            stop_button.props.accelerator = '<Ctrl>q'
            toolbox.toolbar.insert(stop_button, -1)
            stop_button.show()

    def _do_journal_cb(self, button):
        self._dirty = True
        if self._palette:
            if not self._palette.is_up():
                self._palette.popup(immediate=True,
                                    state=self._palette.SECONDARY)
            else:
                self._palette.popdown(immediate=True)
            return

    def _text_view_focus_out_event_cb(self, widget, event):
        buffer = self._text_view.get_buffer()
        start_iter = buffer.get_start_iter()
        end_iter = buffer.get_end_iter()
        self.slides[self.i].desc = buffer.get_text(start_iter, end_iter)
        self._show_slide()

    def _destroy_cb(self, win, event):
        ''' Clean up on the way out. '''
        gtk.main_quit()

    def _find_starred(self):
        ''' Find all the favorites in the Journal. '''
        self.dsobjects, nobjects = datastore.find({'keep': '1'})
        _logger.debug('found %d starred items', nobjects)

    def _prev_cb(self, button=None):
        ''' The previous button has been clicked; goto previous slide. '''
        if self.i > 0:
            self.i -= 1
            self._show_slide(direction=-1)

    def _next_cb(self, button=None):
        ''' The next button has been clicked; goto next slide. '''
        if self.i < len(self.slides) - 1:
            self.i += 1
            self._show_slide()

    def _save_as_pdf_cb(self, button=None):
        ''' Export an PDF version of the slideshow to the Journal. '''
        _logger.debug('saving to PDF...')
        if 'description' in self.metadata:
            tmp_file = save_pdf(self, self._buddies,
                                description=self.metadata['description'])
        else:
            tmp_file = save_pdf(self, self._buddies)
        _logger.debug('copying PDF file to Journal...')
        dsobject = datastore.create()
        dsobject.metadata['title'] = profile.get_nick_name() + ' ' + \
                                     _('Bboard')
        dsobject.metadata['icon-color'] = profile.get_color().to_string()
        dsobject.metadata['mime_type'] = 'application/pdf'
        dsobject.set_file_path(tmp_file)
        dsobject.metadata['activity'] = 'org.laptop.sugar.ReadActivity'
        datastore.write(dsobject)
        dsobject.destroy()
        return

    def _clear_screen(self):
        ''' Clear the screen to the darker of the two user colors. '''
        self._title.hide()
        self._preview.hide()
        self._description.hide()
        if hasattr(self, '_thumbs'):
            for thumbnail in self._thumbs:
                thumbnail[0].hide()
        self.invalt(0, 0, self._width, self._height)

        # Reset drag settings
        self._press = None
        self._release = None
        self._dragpos = [0, 0]
        self._total_drag = [0, 0]
        self.last_spr_moved = None

    def _update_colors(self):
        ''' Match the colors to those of the slide originator. '''
        if len(self.slides) == 0:
            return
        self._genblanks(self.slides[self.i].colors)
        self._title.set_image(self._title_pixbuf)
        self._preview.set_image(self._preview_pixbuf)
        self._description.set_image(self._desc_pixbuf)
        self._my_canvas.set_image(self._canvas_pixbuf)

    def _show_slide(self, direction=1):
        ''' Display a title, preview image, and decription for slide. '''
        self._clear_screen()
        self._update_colors()

        if len(self.slides) == 0:
            self._prev_button.set_icon('go-previous-inactive')
            self._next_button.set_icon('go-next-inactive')
            self._description.set_label(
                _('Do you have any items in your Journal starred?'))
            self._help.set_layer(TOP)
            self._description.set_layer(MIDDLE)
            return

        if self.i == 0:
            self._prev_button.set_icon('go-previous-inactive')
        else:
            self._prev_button.set_icon('go-previous')
        if self.i == len(self.slides) - 1:
            self._next_button.set_icon('go-next-inactive')
        else:
            self._next_button.set_icon('go-next')

        pixbuf = self.slides[self.i].pixbuf
        if pixbuf is not None:
            self._preview.set_shape(pixbuf.scale_simple(
                    int(PREVIEWW * self._scale),
                    int(PREVIEWH * self._scale),
                    gtk.gdk.INTERP_NEAREST))
            self._preview.set_layer(MIDDLE)
        else:
            if self._preview is not None:
                self._preview.hide()

        self._title.set_label(self.slides[self.i].title)
        self._title.set_layer(MIDDLE)

        if self.slides[self.i].desc is not None:
            self._description.set_label(self.slides[self.i].desc)
            self._description.set_layer(MIDDLE)
            text_buffer = gtk.TextBuffer()
            text_buffer.set_text(self.slides[self.i].desc)
            self._text_view.set_buffer(text_buffer)
        else:
            self._description.set_label('')
            self._description.hide()

    def _add_playback_button(self, nick, colors, audio_file):
        ''' Add a toolbar button for this audio recording '''
        if nick not in self._playback_buttons:
            self._playback_buttons[nick] = button_factory(
                'xo-chat',  self.record_toolbar,
                self._playback_recording_cb, cb_arg=nick,
                tooltip=_('Audio recording by %s') % (nick))
            xocolor = XoColor('%s,%s' % (colors[0], colors[1]))
            icon = Icon(icon_name='xo-chat', xo_color=xocolor)
            icon.show()
            self._playback_buttons[nick].set_icon_widget(icon)
            self._playback_buttons[nick].show()
        self._audio_recordings[nick] = audio_file

    def _slides_cb(self, button=None):
        if self._thumbnail_mode:
            self._thumbnail_mode = False
            self.i = self._current_slide
            self._show_slide()

    def _thumbs_cb(self, button=None):
        ''' Toggle between thumbnail view and slideshow view. '''
        if not self._thumbnail_mode:
            self._current_slide = self.i
            self._thumbnail_mode = True
            self._clear_screen()

            self._prev_button.set_icon('go-previous-inactive')
            self._next_button.set_icon('go-next-inactive')

            n = int(ceil(sqrt(len(self.slides))))
            if n > 0:
                w = int(self._width / n)
            else:
                w = self._width
            h = int(w * 0.75)  # maintain 4:3 aspect ratio
            x_off = int((self._width - n * w) / 2)
            x = x_off
            y = 0
            self._thumbs = []
            for i in range(len(self.slides)):
                self._show_thumb(i, x, y, w, h)
                x += w
                if x + w > self._width:
                    x = x_off
                    y += h
            self.i = 0  # Reset position in slideshow to the beginning
        return False

    def _show_thumb(self, i, x, y, w, h):
        ''' Display a preview image and title as a thumbnail. '''
        pixbuf = self.slides[i].pixbuf
        if pixbuf is not None:
            pixbuf_thumb = pixbuf.scale_simple(
                int(w), int(h), gtk.gdk.INTERP_TILES)
        else:
            pixbuf_thumb = svg_str_to_pixbuf(
                genblank(int(w), int(h), self.slides[i].colors))
        # Create a Sprite for this thumbnail
        self._thumbs.append([Sprite(self._sprites, x, y, pixbuf_thumb),
                             x, y, i])
        self._thumbs[i][0].set_image(
            svg_str_to_pixbuf(svg_rectangle(int(w), int(h),
                                            self.slides[i].colors)), i=1)
        self._thumbs[i][0].set_layer(TOP)

    def _expose_cb(self, win, event):
        ''' Callback to handle window expose events '''
        self.do_expose_event(event)
        return True

    # Handle the expose-event by drawing
    def do_expose_event(self, event):

        # Create the cairo context
        cr = self.canvas.window.cairo_create()

        # Restrict Cairo to the exposed area; avoid extra work
        cr.rectangle(event.area.x, event.area.y,
                event.area.width, event.area.height)
        cr.clip()

        # Refresh sprite list
        self._sprites.redraw_sprites(cr=cr)

    def write_file(self, file_path):
        ''' Clean up '''
        if self._dirty:
            self._save_descriptions_cb()
            self._dirty = False
        if os.path.exists(os.path.join(self.datapath, 'output.ogg')):
            os.remove(os.path.join(self.datapath, 'output.ogg'))

    def do_fullscreen_cb(self, button):
        ''' Hide the Sugar toolbars. '''
        self.fullscreen()

    def invalt(self, x, y, w, h):
        ''' Mark a region for refresh '''
        self._canvas.window.invalidate_rect(
            gtk.gdk.Rectangle(int(x), int(y), int(w), int(h)), False)

    def _spr_to_thumb(self, spr):
        ''' Find which entry in the thumbnails table matches spr. '''
        for i, thumb in enumerate(self._thumbs):
            if spr == thumb[0]:
                return i
        return -1

    def _spr_is_thumbnail(self, spr):
        ''' Does spr match an entry in the thumbnails table? '''
        if self._spr_to_thumb(spr) == -1:
            return False
        else:
            return True

    def _button_press_cb(self, win, event):
        ''' The mouse button was pressed. Is it on a thumbnail sprite? '''
        win.grab_focus()
        x, y = map(int, event.get_coords())

        self._dragpos = [x, y]
        self._total_drag = [0, 0]

        spr = self._sprites.find_sprite((x, y))
        self._press = None
        self._release = None

        # Are we clicking on a thumbnail?
        if not self._spr_is_thumbnail(spr):
            return False

        self.last_spr_moved = spr
        self._press = spr
        self._press.set_layer(DRAG)
        return False

    def _mouse_move_cb(self, win, event):
        """ Drag a thumbnail with the mouse. """
        spr = self._press
        if spr is None:
            self._dragpos = [0, 0]
            return False
        win.grab_focus()
        x, y = map(int, event.get_coords())
        dx = x - self._dragpos[0]
        dy = y - self._dragpos[1]
        spr.move_relative([dx, dy])
        # Also move the star
        self._dragpos = [x, y]
        self._total_drag[0] += dx
        self._total_drag[1] += dy
        return False

    def _button_release_cb(self, win, event):
        ''' Button event is used to swap slides or goto next slide. '''
        win.grab_focus()
        self._dragpos = [0, 0]
        x, y = map(int, event.get_coords())

        if self._thumbnail_mode:
            if self._press is None:
                return
            # Drop the dragged thumbnail below the other thumbnails so
            # that you can find the thumbnail beneath it.
            self._press.set_layer(UNDRAG)
            i = self._spr_to_thumb(self._press)
            spr = self._sprites.find_sprite((x, y))
            if self._spr_is_thumbnail(spr):
                self._release = spr
                # If we found a thumbnail and it is not the one we
                # dragged, swap their positions.
                if not self._press == self._release:
                    j = self._spr_to_thumb(self._release)
                    self._thumbs[i][0] = self._release
                    self._thumbs[j][0] = self._press
                    tmp = self.slides[i]
                    self.slides[i] = self.slides[j]
                    self.slides[j] = tmp
                    self._thumbs[j][0].move((self._thumbs[j][1],
                                             self._thumbs[j][2]))
            self._thumbs[i][0].move((self._thumbs[i][1], self._thumbs[i][2]))
            self._press.set_layer(TOP)
            self._press = None
            self._release = None
        else:
            self._next_cb()
        return False

    def _unit_combo_cb(self, arg=None):
        ''' Read value of predefined conversion factors from combo box '''
        if hasattr(self, '_unit_combo'):
            active = self._unit_combo.get_active()
            if active in UNIT_DICTIONARY:
                self._rate = UNIT_DICTIONARY[active][1]

    def _record_cb(self, button=None):
        ''' Start/stop audio recording '''
        if self._grecord is None:
            _logger.debug('setting up grecord')
            self._grecord = Grecord(self)
        if self._recording:  # Was recording, so stop (and save?)
            _logger.debug('recording...True. Preparing to save.')
            self._grecord.stop_recording_audio()
            self._recording = False
            self._record_button.set_icon('media-record')
            self._record_button.set_tooltip(_('Start recording'))
            _logger.debug('Autosaving recording')
            self._notify(title=_('Save recording'))
            gobject.timeout_add(100, self._wait_for_transcoding_to_finish)
        else:  # Wasn't recording, so start
            _logger.debug('recording...False. Start recording.')
            self._grecord.record_audio()
            self._recording = True
            self._record_button.set_icon('media-recording')
            self._record_button.set_tooltip(_('Stop recording'))

    def _wait_for_transcoding_to_finish(self, button=None):
        while not self._grecord.transcoding_complete():
            time.sleep(1)
        if self._alert is not None:
            self.remove_alert(self._alert)
            self._alert = None
        self._save_recording()

    def _playback_recording_cb(self, button=None, nick=profile.get_nick_name()):
        ''' Play back current recording '''
        _logger.debug('Playback current recording from %s...' % (nick))
        if nick in self._audio_recordings:
            play_audio_from_file(self._audio_recordings[nick])
        return

    def _get_audio_obj_id(self):
        ''' Find unique name for audio object '''
        if 'activity_id' in self.metadata:
            obj_id = self.metadata['activity_id']
        else:
            obj_id = _('Bulletin Board')
        _logger.debug(obj_id)
        return obj_id

    def _save_recording(self):
        if os.path.exists(os.path.join(self.datapath, 'output.ogg')):
            _logger.debug('Saving recording to Journal...')
            obj_id = self._get_audio_obj_id()
            copyfile(os.path.join(self.datapath, 'output.ogg'),
                     os.path.join(self.datapath, '%s.ogg' % (obj_id)))
            dsobject = self._search_for_audio_note(obj_id)
            if dsobject is None:
                dsobject = datastore.create()
            if dsobject is not None:
                _logger.debug(self.dsobjects[self.i].metadata['title'])
                dsobject.metadata['title'] = _('Audio recording by %s') % \
                    (self.metadata['title'])
                dsobject.metadata['icon-color'] = \
                    profile.get_color().to_string()
                dsobject.metadata['tags'] = obj_id
                dsobject.metadata['mime_type'] = 'audio/ogg'
                dsobject.set_file_path(
                    os.path.join(self.datapath, '%s.ogg' % (obj_id)))
                datastore.write(dsobject)
                dsobject.destroy()
            self._add_playback_button(
                profile.get_nick_name(), self.colors,
                os.path.join(self.datapath, '%s.ogg' % (obj_id)))
            if hasattr(self, 'chattube') and self.chattube is not None:
                self._share_audio()
        else:
            _logger.debug('Nothing to save...')
        return

    def _search_for_audio_note(self, obj_id):
        ''' Look to see if there is already a sound recorded for this
        dsobject '''
        dsobjects, nobjects = datastore.find({'mime_type': ['audio/ogg']})
        # Look for tag that matches the target object id
        for dsobject in dsobjects:
            if 'tags' in dsobject.metadata and \
               obj_id in dsobject.metadata['tags']:
                _logger.debug('Found audio note')
                return dsobject
        return None

    def _save_descriptions_cb(self, button=None):
        ''' Find the object in the datastore and write out the changes
        to the decriptions. '''
        for s in self.slides:
            if not s.owner:
                continue
            jobject = datastore.get(s.uid)
            jobject.metadata['description'] = s.desc
            datastore.write(jobject, update_mtime=False,
                            reply_handler=self.datastore_write_cb,
                            error_handler=self.datastore_write_error_cb)

    def datastore_write_cb(self):
        pass

    def datastore_write_error_cb(self, error):
        _logger.error('datastore_write_error_cb: %r' % error)

    def _notify(self, title='', msg=''):
        ''' Notify user when saves are completed '''
        self._alert = Alert()
        self._alert.props.title = title
        self._alert.props.msg = msg
        self.add_alert(self._alert)
        self._alert.show()

    def _resend_cb(self, button=None):
        ''' Resend slides, but only of sharing '''
        if hasattr(self, 'chattube') and self.chattube is not None:
            self._share_slides()
            self._share_audio()

    # Serialize

    def _dump(self, slide):
        ''' Dump data for sharing.'''
        _logger.debug('dumping %s' % (slide.uid))
        data = [slide.uid, slide.colors, slide.title,
                pixbuf_to_base64(activity, slide.pixbuf), slide.desc]
        return self._data_dumper(data)

    def _data_dumper(self, data):
        if _OLD_SUGAR_SYSTEM:
            return json.write(data)
        else:
            io = StringIO()
            jdump(data, io)
            return io.getvalue()

    def _load(self, data):
        ''' Load game data from the journal. '''
        slide = self._data_loader(data)
        if len(slide) == 5:
            if not self._slide_search(slide[0]):
                _logger.debug('loading %s' % (slide[0]))
                self.slides.append(Slide(
                        False, slide[0], slide[1], slide[2],
                        base64_to_pixbuf(activity, slide[3]), slide[4]))

    def _slide_search(self, uid):
        ''' Is this slide in the list already? '''
        for slide in self.slides:
            if slide.uid == uid:
                _logger.debug('skipping %s' % (slide.uid))
                return True
        return False

    def _data_loader(self, data):
        if _OLD_SUGAR_SYSTEM:
            return json.read(data)
        else:
            io = StringIO(data)
            return jload(io)

    # Sharing-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.buddies = [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...'''
        if self._shared_activity is None:
            _logger.error('Failed to share or join activity ... \
                _shared_activity is null in _shared_cb()')
            return

        self.initiating = True
        self.waiting = False
        _logger.debug('I am sharing...')

        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)

        _logger.debug('This is my activity: making a tube...')
        id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube(
            SERVICE, {})

    def _joined_cb(self, activity):
        ''' ...or join an exisiting share. '''
        if self._shared_activity is None:
            _logger.error('Failed to share or join activity ... \
                _shared_activity is null in _shared_cb()')
            return

        self.initiating = False
        _logger.debug('I joined a shared activity.')

        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)

        _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.waiting = 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.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)

            if self.waiting:
                self._send_event('j:%s' % (profile.get_nick_name()))

    def event_received_cb(self, text):
        ''' Data is passed as tuples: cmd:text '''
        _logger.debug('<<< %s' % (text[0]))
        if text[0] == 's':  # shared journal objects
            e, data = text.split(':')
            self._load(data)
        elif text[0] == 'j':  # Someone new has joined
            e, buddy = text.split(':')
            _logger.debug('%s has joined' % (buddy))
            if buddy not in self._buddies:
                self._buddies.append(buddy)
            if self.initiating:
                self._send_event('J:%s' % (profile.get_nick_name()))
                self._share_slides()
                self._share_audio()
        elif text[0] == 'J':  # Everyone must share
            e, buddy = text.split(':')
            self.waiting = False
            if buddy not in self._buddies:
                self._buddies.append(buddy)
                _logger.debug('%s has joined' % (buddy))
            self._share_slides()
            self._share_audio()
        elif text[0] == 'a':  # audio recording
            e, data = text.split(':')
            nick, colors, base64 = self._data_loader(data)
            path = os.path.join(activity.get_activity_root(),
                                'instance', 'nick.ogg')
            base64_to_file(activity, base64, path)
            self._add_playback_button(nick, colors, path)

    def _share_audio(self):
        if profile.get_nick_name() in self._audio_recordings:
            base64 = file_to_base64(
                    activity, self._audio_recordings[profile.get_nick_name()])
            gobject.idle_add(self._send_event, 'a:' + str(
                    self._data_dumper([profile.get_nick_name(),
                                       self.colors,
                                       base64])))

    def _share_slides(self):
        for s in self.slides:
            if s.owner:  # Maybe stagger the timing of the sends?
                gobject.idle_add(self._send_event, 's:' + str(self._dump(s)))
        _logger.debug('finished sharing')

    def _send_event(self, text):
        ''' Send event through the tube. '''
        if hasattr(self, 'chattube') and self.chattube is not None:
            _logger.debug('>>> %s' % (text[0]))
            self.chattube.SendText(text)
示例#38
0
    def _show_stop_dialog(self):
        for button in self._stop_buttons:
            button.set_sensitive(False)
        alert = Alert()
        alert.props.title = _('Stop')
        alert.props.msg = _('Stop: name your journal entry')

        title = self._jobject.metadata['title']
        alert.entry = alert.add_entry()
        alert.entry.set_text(title)

        label, tip = self._get_save_label_tip(title)
        button = alert.add_button(gtk.RESPONSE_OK, label,
                                  Icon(icon_name='dialog-ok'))
        button.add_accelerator('clicked', self.sugar_accel_group,
                               gtk.keysyms.Return, 0, 0)
        button.set_tooltip_text(tip)
        alert.ok = button

        label, tip = self._get_erase_label_tip()
        button = alert.add_button(gtk.RESPONSE_ACCEPT, label,
                                  Icon(icon_name='list-remove'))
        button.set_tooltip_text(tip)

        button = alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'),
                                  Icon(icon_name='dialog-cancel'))
        button.add_accelerator('clicked', self.sugar_accel_group,
                               gtk.keysyms.Escape, 0, 0)
        button.set_tooltip_text(_('Cancel stop and continue the activity'))

        alert.connect('realize', self.__stop_dialog_realize_cb)
        alert.connect('response', self.__stop_dialog_response_cb)
        alert.entry.connect('changed', self.__stop_dialog_changed_cb, alert)
        self.add_alert(alert)
        alert.show()
示例#39
0
    def __init__(self, handle):
        activity.Activity.__init__(self, handle)
        self.set_canvas(canvas.widget)
        toolbox = activity.ActivityToolbox(self)
        self.set_toolbox(toolbox)
        toolbox.show()

        alert = Alert()
        # Populate the title and text body of the alert.
        alert.props.title = 'Current Recording'
        alert.props.msg = 'recording information goes here'
        stop_icon = Icon(icon_name='dialog-cancel')
        stop_icon.set_pixel_size(50)
        alert.add_button(gtk.RESPONSE_CANCEL, 'End', stop_icon)
        stop_icon.show()
        alert.connect('response', singletab.stop)
        alert.connect('response', incramentaltab.stop)
        alert.connect('response', lapsetab.stop)
        # Call the add_alert() method (inherited via the sugar.graphics.Window superclass of Activity)
        # to add this alert to the activity window.
        self.add_alert(alert)
        alert.hide()

        for tab in tabs:
            toolbox.add_toolbar(tab.tab_name, tab.widget)
            tab.set_alert(alert)
示例#40
0
    def _show_stop_dialog(self):
        for button in self._stop_buttons:
            button.set_sensitive(False)
        alert = Alert()
        alert.props.title = _('Stop')
        alert.props.msg = _('Stop: name your journal entry')

        title = self._jobject.metadata['title']
        alert.entry = alert.add_entry()
        alert.entry.set_text(title)

        label, tip = self._get_save_label_tip(title)
        button = alert.add_button(gtk.RESPONSE_OK, label,
                                  Icon(icon_name='dialog-ok'))
        button.add_accelerator('clicked', self.sugar_accel_group,
                               gtk.keysyms.Return, 0, 0)
        button.set_tooltip_text(tip)
        alert.ok = button

        label, tip = self._get_erase_label_tip()
        button = alert.add_button(gtk.RESPONSE_ACCEPT, label,
                                  Icon(icon_name='list-remove'))
        button.set_tooltip_text(tip)

        button = alert.add_button(gtk.RESPONSE_CANCEL, _('Cancel'),
                                  Icon(icon_name='dialog-cancel'))
        button.add_accelerator('clicked', self.sugar_accel_group,
                               gtk.keysyms.Escape, 0, 0)
        button.set_tooltip_text(_('Cancel stop and continue the activity'))

        alert.connect('realize', self.__stop_dialog_realize_cb)
        alert.connect('response', self.__stop_dialog_response_cb)
        alert.entry.connect('changed', self.__stop_dialog_changed_cb, alert)
        self.add_alert(alert)
        alert.show()