# python import import logging, os from gettext import gettext as _ # gtk import import gtk # atoidejouer import from atoidejouer.tools import config, ui, storage # get application logger logger = logging.getLogger('atoidejouer') def _on_toggle_click(radio, screen, option, value): # manage change state manually _previous = config.Config().get('activity>%s' % option) # remove screens to recreate them after if screen._initialized is True\ and _previous != value: # update config.Config().set('activity>%s' % option, value) # ... if option in ['mode', 'dnd']: screen._activity.remove_screen('graphics') screen._activity.remove_screen('sounds') else: pass else: pass def _on_button_click(button, screen, name, msg_label, value): if name == 'import': try: # int file chooser _chooser = ObjectChooser(button.get_label(), screen, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) # get chooser result _r = _chooser.run() # check result if _r == gtk.RESPONSE_ACCEPT: # get selected object _object = _chooser.get_selected_object() # do import storage.import_project(screen._activity, _object.file_path, msg_label) else: pass except Exception, e: # ERROR logger.error('[screens] _on_button_click - e: %s' % e) elif name == 'export': # do export storage.export_project(screen._activity, msg_label, value) else: pass def __load_story(screen, path): # little check if os.path.exists(path): # read db screen._activity.read_file(path) # switch to story screen._activity.change_screen('story') def _on_included_click(button, screen, file_): # get bundle path bund = os.path.join(storage.BUND, 'static', 'ext', 'db') path = os.path.join(bund, file_) __load_story(screen, path) def _on_recent_click(button, screen, timestamp): # db path path = storage.get_path_from_journal(timestamp, 'atoidejouer/db') __load_story(screen, path) [ ADVANCED, EASY, ] = range(2) [ FASTER, SMOOTH, NORMAL, ] = range(3) [ YES, NO, ] = range(2) class ScreenActivity(gtk.ScrolledWindow): def __init__(self, activity_): gtk.ScrolledWindow.__init__(self) self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) # keep activity self._activity = activity_ # dummy flag self._initialized = False # keep result label self.msg_label_import = None self.msg_label_export = None # init main box self.__main_box = gtk.HBox(homogeneous=True, spacing=2) self.__main_box.show() # .. self.add_with_viewport(self.__main_box) # add left menu self._add_left_part() # .. self.__main_box.pack_start(gtk.EventBox(), expand=False, fill=True) # add right menu self._add_right_part() def _get_title(self, text): # init _label = gtk.Label() # show _label.show() # set markup _label.set_use_markup(True) _label.set_markup('%s' % text) # align _label.set_padding(5, 5) _label.set_alignment(0, 0.5) # return it return _label def _get_toggle_box(self, group, option, value, text): # create checkbox _toggle = gtk.RadioButton(group=group, label=text) _toggle.show() # set current _current = config.Config().get('activity>%s' % option) _toggle.set_active(_current==value) # set cb _toggle.connect('toggled', _on_toggle_click, self, option, value) # return it return _toggle def _get_button(self, name, text, stock_id, msg_label=None, value=None): # init button _button = ui.get_button(label=text, stock_id=stock_id, width=48, padding=(10, 0)) _button.show() # set cb _button.connect('clicked', _on_button_click, self, name, msg_label, value) # return it return _button def _get_hidden_text(self): # init _label = gtk.Label() # set markup _label.set_use_markup(True) # align _label.set_padding(5, 5) _label.set_alignment(0, 0.5) # return it return _label def _get_included_button(self, file_): # prepare label _img_name = file_.replace('.db', '') _label = _img_name.replace('_', ' ') # .. _button = ui.get_button(label=_label, img_name=_img_name, width=100, padding=(10, 0), img_size=(100, 100)) _button.connect('clicked', _on_included_click, self, file_) _button.show() return _button def _get_included_part(self): _vbox = gtk.VBox(homogeneous=False, spacing=5) _vbox.set_border_width(5) _vbox.show() # add first part title _vbox.pack_start(self._get_title(_('INCLUDED STORIES')), expand=False, fill=True) # get bundle path _path = os.path.join(storage.BUND, 'static', 'ext', 'db') # file by file for _f in os.listdir(_path): if _f == 'blank': continue _vbox.pack_start(self._get_included_button(_f), expand=False, fill=True) # return part return _vbox def _add_left_part(self): # .. _vbox = gtk.VBox(homogeneous=False, spacing=5) # border _vbox.set_border_width(5) # show _vbox.show() # add self.__main_box.pack_start(_vbox, expand=False, fill=True) # add part choices _vbox.pack_start(self._get_included_part(), expand=False, fill=True) def _get_export_part(self): _vbox = gtk.VBox(homogeneous=False, spacing=5) _vbox.set_border_width(5) _vbox.show() # add first part title _vbox.pack_start(self._get_title(_('IMPORT')), expand=False, fill=True) self.msg_label_import = self._get_hidden_text() _vbox.pack_start(self._get_button('import', _('Choose a File'), 'import', msg_label=self.msg_label_import), expand=False, fill=True) _vbox.pack_start(self.msg_label_import, expand=False, fill=True) # add first part title _vbox.pack_start(self._get_title(_('EXPORT')), expand=False, fill=True) self.msg_label_export = self._get_hidden_text() # list the possible medias for _media in os.listdir('/media'): # current path _path = os.path.join('/media', _media) # should be a dir if os.path.isdir(_path): # set export button text _button_text = _('Export to') + ' "' + _media + '"' # init button _button = self._get_button('export', _button_text, 'export', msg_label=self.msg_label_export, value=_media) # add button _vbox.pack_start(_button, expand=False, fill=True) else: continue # add label _vbox.pack_start(self.msg_label_export, expand=False, fill=True) # .. return _vbox def _get_story_button(self, ds_object): _button = ui.get_button(label=ds_object.metadata['title'], stock_id="play", width=48, padding=(10, 0)) _button.connect('clicked', _on_recent_click, self, ds_object.metadata['timestamp']) _button.show() return _button def _get_recent_part(self): _vbox = gtk.VBox(homogeneous=False, spacing=5) _vbox.set_border_width(5) _vbox.show() # add first part title _vbox.pack_start(self._get_title(_('RECENT STORIES')), expand=False, fill=True) # list stories _nb_of_recent = config.Config().get('activity>recent', type_=int) _cur = 0 for ds_obj in storage.journal_query({ 'activity': 'org.laptop.AToiDeJouerActivity'}): if _cur == _nb_of_recent: break elif os.path.exists(ds_obj.file_path): _cur += 1 _vbox.pack_start(self._get_story_button(ds_obj), expand=False, fill=True) return _vbox def _add_right_part(self): # .. _vbox = gtk.VBox(homogeneous=False, spacing=5) # border _vbox.set_border_width(5) # show _vbox.show() # add self.__main_box.pack_start(_vbox, expand=False, fill=True) # add export # _vbox.pack_start(self._get_export_part(), expand=False, fill=True) # add recent part _vbox.pack_start(self._get_recent_part(), expand=False, fill=True) def _show(self): self._initialized = True # show all self.show() # update screen self._activity.set_canvas(self)