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)
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)
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()
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, {})
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']
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)
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()
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
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()
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()
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 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()
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()
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 _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)
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()
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)
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 _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()
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()
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)
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 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)
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)
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()
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)
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)
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()
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)