web-dev-qa-db-fra.com

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

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

À 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, iconview 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 la vue des icônes, l'espace est utilisé comme prévu. Comment pouvons-nous utiliser automatiquement l'espace lors du redimensionnement de la fenêtre?

Mais ce qui est plus préoccupant, c’est que, lorsque la fenêtre apparaît, nous pouvons la redimensionner plus petite. Il semble que la vue icon nous empêche de redimensionner et d’avoir 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 discutons 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 nous dire comment résoudre ces deux problèmes?

9
jonobacon

Bon, comme nous avons trouvé 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 à placez GtkIconView dans une fenêtre GtkScrolledWindow et définissez son paramètre hscrollbar_policy sur "toujours". Ensuite, un signal de contrôle de redimensionnement doit être utilisé pour réagir lorsque l'utilisateur redimensionne la fenêtre (notez qu'il faut vérifier 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 la réallocation correcte de l’espace nouvellement gagné (ou la réduction) par GtkIconView. De plus, la barre de défilement horizontale ne sera jamais visible car GtkIconView utilise exactement autant d’espace que GtkScrolledWindow.

3
Rafał Cieślak

Vous pouvez également définir les colonnes sur 0 et sur -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 à réponse de @ rafalcieslak .)

1
user82378

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 de restreindre la vue de façon arbitraire. Le rappel d'affectation de taille impose un relais en définissant le nombre de colonnes sur 1 et inversement.

1
cscarney