示例#1
0
class GeoTagToolbar(gtk.Toolbar):
    """
    Contains tools to categorize observations and add them to the map.
    """

    def __init__(self, control):
        """
        Creates the tagging toolbar with tag button and description combo.

        The textfield combo suggests a default description for the chosen
        category.

        For now the following categories are present:
         - agriculture
         - animal
         - building
         - infrastructure
         (- photo)
         - text
         - vegetation
         - water

        Get each description as gtk.Liststore:
            GeoTagToolbar.description_sets[category]
        """
        gtk.Toolbar.__init__(self)
    	self._logger = logging.getLogger('GeoTagToolbar')
    	self._logger.setLevel(constants.LOG_LEVEL)
        self.control = control
        self.control.create_tagstar(self)

        # holds default descriptions for each category
        self.description_sets = dict()

        # get and parse each description set
        file_ = None
        try:
            desc_path = os.path.join(constants.BUNDLE_PATH, 'geotagplugin/tag_descriptions')
            for description_set in get_categories():
                # parse default descriptions into liststore
                path = os.path.join(desc_path, description_set)
                file_ = open(path, 'r')
                liststore = gtk.ListStore(gobject.TYPE_STRING)
                for description in file_.readlines():
                    if not description.startswith('#'):
                        liststore.append([description.strip()])
                #self._logger.debug('key: %s', files[i])
                self.description_sets[description_set] = liststore
        except IOError:
            self._logger.error("Failed reading categories.")
            raise
        finally:
            if file_:
                file_.close()

        self.store_player_btn = ToolButton('kmz-export')
        self.store_player_btn.set_tooltip(_('Export player data.'))
        self.store_player_btn.connect('clicked', self.control.export)
        self.insert(self.store_player_btn, -1)
        self.store_player_btn.show()

        self.export_csv = ToolButton('csv-export')
        self.export_csv.set_tooltip(_('Export to CSV.'))
        self.export_csv.connect('clicked', self.control.model.export_to_csv)
        self.export_csv.show()
        self.insert(self.export_csv, -1)

        separator = gtk.SeparatorToolItem()
        separator.set_draw(False)
        separator.set_expand(True)
        self.insert(separator, -1)
        separator.show()

        # add tag-toggled-category button
        self.tag_star_btn = ToggleToolButton('activity-start')
        self.tag_star_btn.set_tooltip(_('Tag something!'))
        self.tag_star_btn.connect('clicked', self._toggle_tag_star)
        self.insert(self.tag_star_btn, -1)
        self.tag_star_btn.show()

        # create textfieldcombo for default descriptions
        self.combobox = gtk.combo_box_entry_new_text()
        toolitem = gtk.ToolItem()
        toolitem.add(self.combobox)
        toolitem.set_size_request(600, 20)
        self.combobox.set_property('sensitive', False)
        self.combobox.show()
        self.insert(toolitem, -1)
        toolitem.show()

    def _toggle_tag_star(self, button):
        """
        Makes controller show/remove the tag star.
        """
        self._logger.debug('_toggle_tag_star()')
        if self.tag_star_btn.get_active():
            self.combobox.set_property('sensitive', True)
            self.control.show_tag_star()
        else:
            self.combobox.set_property('sensitive', False)
            text = self.combobox.get_active_text()
            self.control.remove_tag_star(text)
class CreateToolbar(gtk.Toolbar):
    __gtype_name__ = 'CreateToolbar'

    __gsignals__ = {
        'create_new_game': (SIGNAL_RUN_FIRST, None, []), 
        'create_load_game': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]), 
        'create_save_game': (SIGNAL_RUN_FIRST, None, 3 * [TYPE_PYOBJECT]), 
        'create_equal_pairs': (SIGNAL_RUN_FIRST, None, [TYPE_PYOBJECT]), 
    }
    
    def __init__(self, activity):
        gtk.Toolbar.__init__(self)
        self.activity = activity
        self._lock = True
        
        # New Button
        new_icon = join(dirname(__file__), 'images', 'game-new.svg')
        new_image = gtk.Image()
        new_image.set_from_file(new_icon)
        self._new_button = ToolButton()
        self._new_button.set_icon_widget(new_image)
        self._new_button.set_tooltip(_('New game'))
        self._new_button.connect('clicked', self._new_game_bt)
        self._add_widget(self._new_button)
        
        # Load Button
        load_icon = join(dirname(__file__), 'images', 'game-load.svg')
        load_image = gtk.Image()
        load_image.set_from_file(load_icon)
        self._load_button = ToolButton()
        self._load_button.set_icon_widget(load_image)
        self._load_button.set_tooltip(_('Load game'))
        self._load_button.connect('clicked', self._load_game)
        self._add_widget(self._load_button)
            
        # Save Button
        save_icon = join(dirname(__file__), 'images', 'game-save.svg')
        save_image = gtk.Image()
        save_image.set_from_file(save_icon)
        self._save_button = ToolButton()
        self._save_button.set_icon_widget(save_image)
        self._save_button.set_tooltip(_('Save game'))
        self._save_button.connect('clicked', self._save_game_bt)
        self._save_button.set_sensitive(False)
        self._add_widget(self._save_button)
    
        # Separator
        separator2 = gtk.SeparatorToolItem()
        separator2.set_draw(True)
        self.insert(separator2, -1)
        
        self._add_widget(gtk.Label(_('Game name') + ': '))
        self.game_name_entry = gtk.Entry()
        self._add_widget(self.game_name_entry) 
        
        self._equal_pairs = gtk.CheckButton(_('Equal pairs'))   
        self._add_widget(self._equal_pairs)
        self._equal_pairs.connect('toggled', self._emit_equal_pairs)
                
        self._grouped_icon1 = join(dirname(__file__), 'images', 'equal_pairs1.svg')
        self._grouped_icon2 = join(dirname(__file__), 'images', 'equal_pairs2.svg')
        self._grouped_image1 = gtk.Image()
        self._grouped_image2 = gtk.Image()
        self._grouped_image1.set_from_file(self._grouped_icon1)
        self._grouped_image2.set_from_file(self._grouped_icon2)
        self._grouped = ToggleToolButton()
        self._grouped.set_icon_widget(self._grouped_image1)
        self._grouped.set_tooltip(_('Click for grouped game'))
        self._grouped.connect('toggled', self._grouped_cb)
        self._add_widget(self._grouped)
        
    def _add_widget(self, widget, expand=False):
        tool_item = gtk.ToolItem()
        tool_item.set_expand(expand)
        tool_item.add(widget)
        widget.show()
        self.insert(tool_item, -1)
        tool_item.show()
        
    def _game_changed_cb(self, combobox, game_name):
        self.game_name_entry.set_text(game_name)
        self.emit('create_load_game', game_name)
  
    def _load_game(self, button):
        chooser = ObjectChooser(_('Choose memorize game'),
                parent=self.activity,
                flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
        jobject = ''
        try:
            result = chooser.run()
            if result == gtk.RESPONSE_ACCEPT:
                logging.debug('ObjectChooser: %r' % chooser.get_selected_object())
                jobject = chooser.get_selected_object()
                if not jobject or  not jobject.file_path:
                    return
        finally:
            chooser.destroy()
            del chooser
            
        if jobject and jobject.file_path:    
            self.emit('create_load_game', jobject.file_path)
            self._save_button.set_sensitive(False)
        
    def _new_game_bt(self, button):
        self.game_name_entry.set_text('')
        self._equal_pairs.set_active(False)
        self._grouped.set_active(False)
        self.emit('create_new_game')
        self._new_button.set_sensitive(False)
        self._save_button.set_sensitive(False)

    def _save_game_bt(self, button):
        self.emit('create_save_game', self.game_name_entry.get_text(), self._equal_pairs.get_active(), self._grouped.get_active())
        self._save_button.set_sensitive(False)
        
    def _emit_equal_pairs(self, checkbutton):
        self.emit('create_equal_pairs', checkbutton.get_active())
        self._save_button.set_sensitive(True)
        
    def _grouped_cb(self, widget):
        self._save_button.set_sensitive(True)
        if self._grouped.get_active():
            self._grouped.set_icon_widget(self._grouped_image2)
            self._grouped_image2.show()
            self._grouped.set_tooltip(_('Click for ungrouped game'))
        else:
            self._grouped.set_icon_widget(self._grouped_image1)
            self._grouped_image1.show()
            self._grouped.set_tooltip(_('Click for grouped game'))
    
    def update_create_toolbar(self, widget, game_name, equal_pairs, grouped):        
        self.game_name_entry.set_text(game_name)
        self._equal_pairs.set_active(equal_pairs == 'True')
        self._grouped.set_active(grouped == '1')
        
    def update_buttons_status(self, widget, new, save):
        self._new_button.set_sensitive(new)
        self._save_button.set_sensitive(save)