GtkIconView ne remplit pas automatiquement l'espace avec l'icône lorsque l'utilisateur redimensionne la fenêtre

9

Dans le projet Ubuntu Accomplishments, nous rencontrons quelques bugs inhabituels:

A savoir que nous avons une fenêtre avec un GtkNotebook et un GtkIconView sur une page et une autre sur une autre page.

Lorsque l'utilisateur redimensionne la fenêtre, l'icône ne remplit pas automatiquement l'espace avec des icônes (elles restent dans leur disposition de colonne d'origine), mais si l'utilisateur modifie les pages GtkNotebook et actualise ainsi l'icône, l'espace est occupé comme prévu. Comment utiliser automatiquement l'espace lors du redimensionnement de la fenêtre?

Ce qui est plus inquiétant cependant, c'est que lorsque la fenêtre apparaît, nous pouvons la redimensionner plus petite - il semble que la vue d'icône nous empêche de redimensionner et d'avoir ensuite une zone de défilement pour les icônes.

Le code ressemble à ceci. Les ListStores qui pilotent les IconViews:

    self.trophystore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon accomplished, locked, app, accomplishment
    self.trophystore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.trophy_icon.set_model(self.trophystore)

    self.oppstore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon, accomplished, locked, app, accomplishment
    self.oppstore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.opp_icon.set_model(self.oppstore)

    self.trophy_icon.set_text_column(COL_TITLE)
    self.trophy_icon.set_pixbuf_column(COL_PIXBUF)

    self.opp_icon.set_text_column(COL_TITLE)
    self.opp_icon.set_pixbuf_column(COL_PIXBUF)

En dehors de cela, nous ne fouinons pas vraiment avec les IconViews, nous ajoutons simplement du contenu aux ListStores pour mettre à jour les vues.

Le code du projet est ici - quelqu'un peut-il recommander comment nous pouvons résoudre ces deux problèmes?

jonobacon
la source
Juste une explication: lorsque l'utilisateur change de page Notebook, le code d'application efface le modèle sous-jacent et ajoute à nouveau tous les éléments, ce qui semble être la raison pour laquelle GtkIconView actualise et utilise l'espace vide.
Rafał Cieślak

Réponses:

3

D'accord, comme nous avons compris comment résoudre ce problème, je vais décrire la solution ici, au cas où quelqu'un d'autre aurait ce problème.

L'astuce consiste à placer le GtkIconView dans un GtkScrolledWindow et à définir sa hscrollbar_policy sur "toujours". Ensuite, un signal de vérification de redimensionnement doit être utilisé pour réagir lorsque l'utilisateur redimensionne la fenêtre (notez qu'il doit être vérifié si la taille a changé, car le signal est émis également lorsque, par exemple, la fenêtre est déplacée).

Lorsque la taille change, le modèle utilisé par GtkIconView doit être effacé et recréé, car cela déclenche GtkIconView correctement réallouant l'espace nouvellement gagné (ou rétréci). En outre, comme résultat, la barre de défilement horizontale ne sera jamais vue, car GtkIconView utilise exactement autant d'espace que GtkScrolledWindow utilise.

Rafał Cieślak
la source
Cela a été extrêmement utile, merci pour la réponse! J'en ai été affecté sur lp: qreator et avec votre correctif, le nombre de colonnes d'icônes dans la vue d'icônes principale est dynamique lors du redimensionnement.
David Planella
1

Ma solution préférée à ce problème est une très petite sous-classe de Gtk.IconView:

class FluidIconView (Gtk.IconView):
    def __init__ (self):
        Gtk.IconView.__init__ (self)
        self.connect ("size-allocate", FluidIconView.on_size_allocate)

    def do_get_preferred_width (self):
        return (0,0)

    def on_size_allocate (self, allocation):
        [self.set_columns (m) for m in [1,self.get_columns ()]]

La substitution get_preferred_width permet à la vue d'être arbitrairement étroite. Le rappel de taille allouée force une sortie relais en définissant le nombre de colonnes sur 1 et inversement.

cscarney
la source
1

Vous pouvez également définir les colonnes sur 0 et revenir à -1 lorsque la taille change. De cette façon, les icônes ne seront pas désélectionnées:

iconview.set_columns(0)
iconview.set_columns(-1)

(Cela devrait être fait en plus de la réponse de @ rafalcieslak .)

user82378
la source
Pourquoi est-ce en plus de la réponse de rafalcieslak? Si vous modifiez le nombre de colonnes, vous obtiendrez un relais; reconstruire le modèle de toute façon serait inutile.
cscarney