Rapidement application avec ListStore en tant que préférence

10

Je commence à écrire un programme avec "rapidement". Une liste des langues souhaitées sera une préférence. Exemple:

languages = ["en", "de"]

Le code rapide (créé automatiquement) qui gère la partie de préférence a l'aspect suivant:

# Define your preferences dictionary in the __init__.main() function.
# The widget names in the PreferencesTestProjectDialog.ui
# file need to correspond to the keys in the preferences dictionary.
#
# Each preference also need to be defined in the 'widget_methods' map below
# to show up in the dialog itself.  Provide three bits of information:
#  1) The first entry is the method on the widget that grabs a value from the
#     widget.
#  2) The second entry is the method on the widget that sets the widgets value
#      from a stored preference.
#  3) The third entry is a signal the widget will send when the contents have
#     been changed by the user. The preferences dictionary is always up to
# date and will signal the rest of the application about these changes.
# The values will be saved to desktopcouch when the application closes.
#
# TODO: replace widget_methods with your own values


widget_methods = {
    'languages': ['getter', 'setter', 'changed'],
}

Dans l'interface graphique, il semble que le widget de choix dans gtk pour une liste soit un ListStore (qui n'est pas un widget, mais un modèle, mais défini dans le fichier Glade ...). Quelqu'un peut-il me dire ce qui fonctionnerait pour un ListStore pour les 'getter' , 'setter' et 'changed' dans le code ci-dessus?

L’approche semble facile pour les widgets d’entrée simples et autres, mais je ne sais pas comment l’utiliser avec des listes.

Sinon, j'accepterais bien sûr tout autre moyen de traiter les listes en tant que préférences, à condition que la longueur de la liste ne soit pas fixée.

    
posée xubuntix 11.10.2011 - 15:37
la source

2 réponses

2

Avertissement: je ne savais rien de rapidement avant de lire votre message, ni de la programmation gui en général. Par conséquent, honnêtement, je ne cherche pas à répondre à cette question:)

Cela dit, Rapidement est un projet intéressant. J'ai brièvement analysé le code source et identifié les approches potentielles suivantes pour ajouter une préférence de style liste avec ListStore:

  1. 'Monkey-patch' récupère et définit widget_methods sur une arborescence stock widget (modèle ListStore) défini dans le répertoire data / ui / Preferences $ PROJECTNAME $ Dialog.ui avec Glade.
  2. Implémentez set_widget_from_preference et set_preference dans le la sous-classe de projet de PreferencesDialog (la sous-classe est Preferences $ PROJECTNAME $ Dialog), et faites quelque chose de différent lorsque key ou widget est votre widget TreeView sauvegardé par ListStore.
  3. Rédigez une sous-classe personnalisée de gtk.TreeView avec un widget personnalisé pour glade . .

Pour les tester, j'ai mis en œuvre ces trois idées - chacune fonctionnant comme prévu et AFAICT, à l'identique. En fin de compte, le troisième (en particulier) me paraissait le plus propre et le plus proche des conventions utilisées dans l’ensemble du chaud, bien qu’il attendait initialement le contraire.

Voici les étapes que j'ai suivies pour le numéro trois ...

Utilisation de Glade via quickly design (rapidement 11.10, btw), et en suivant vaguement ce tutoriel (partie 2) , ajoutez un widget ScrolledWindow aux préférences $ PROJECTNAME $ Dialog.ui, déposez-lui un TreeView, nommez-le TreeView language_treeview . Créez un nouveau modèle ListStore pour le TreeView lorsque vous y êtes invité, et nommez-le language_liststore, etc. ... vous avez fini par obtenir quelque chose comme ceci:

Ensuite,ajoutezuncataloguedesous-produits(data/ui/preferences_$PROJECTNAME$_treeview.xml)aveclecontenusuivant:

<glade-catalogname="preferences_$PROJECTNAME$_treeview" domain="glade-3"
               depends="gtk+" version="1.0">
  <glade-widget-classes>
    <glade-widget-class title="$PROJECTNAME$ Preferences TreeView" name="Preferences$PROJECTNAME$TreeView"
                        generic-name="Preference$PROJECTNAME$TreeView" parent="GtkTreeView"
                        icon-name="widget-gtk-treeview"/>
  </glade-widget-classes>
</glade-catalog>

Modifiez ensuite les préférences $ PROJECTNAME $ Dialog.ui, en ajoutant ...

<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->

... en haut, sous la balise require. Et modifiez l'attribut de classe de language_treeview sur Preferences $ PROJECTNAME $ TreeView, en vue d'une étape ultérieure.

Enfin, ajoutez l'élément suivant à la liste widget_methods dans les préférences $ PROJECTNAME $ Dialog.py

'language_treeview': ['get_languages', 'set_languages', 'button-release-event']

Et à la fin du même fichier (Préférences $ PROJECTNAME $ Dialog.py), ajoutez

import gtk

ALL_LANGUAGES = [
  'en', 'uk', 'de', 'fr', # ... much longer list
]

class Preferences$PROJECTNAME$TreeView(gtk.TreeView):
    __gtype_name__ = "Preferences$PROJECTNAME$TreeView"

    def __init__(self, *args):
        super(Preferences$PROJECTNAME$TreeView, self).__init__(*args)
        self.get_selection().set_mode(gtk.SELECTION_MULTIPLE)

    # loads the liststore with all languages, 
    # selecting/highlighting in the treeview those 
    # already retrieved from previously saved preferences
    def set_languages(self, preferred_languages):
        model = self.get_model()
        for row, lang in enumerate(ALL_LANGUAGES):
            model.append([lang])
            if lang in preferred_languages:
                self.get_selection().select_iter(model.get_iter(row))

    # collects only the selected languages in the treeview
    # to save in the preferences database
    def get_languages(self):
        model, rows = self.get_selection().get_selected_rows()
        result = [model.get_value(model.get_iter(row), 0) for row in rows]
        return result

Si vous souhaitez voir mes tentatives pour un et deux, je suis heureux de vous rendre service.

Modifier: pour le lecteur occasionnel, remplacez toute occurrence de $ PROJECTNAME $ par le nom réel de votre projet Rapidement (comme spécifié dans quickly create ).

HTH!

    
réponse donnée mwalsh 20.10.2011 - 06:13
la source
0

Je n'ai pas essayé moi-même 'rapidement', mais avec mon expérience GTK, j'utiliserais les boutons radio pour gérer la sélection de la langue.

Le fait de regarder l'événement toggled avec la méthode button.get_active() devrait suffire à vérifier ce que l'utilisateur a sélectionné.

    
réponse donnée Alexandre 16.10.2011 - 23:15
la source

Lire d'autres questions sur les étiquettes