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?
la source
Réponses:
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.
la source
Ma solution préférée à ce problème est une très petite sous-classe de Gtk.IconView:
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.
la source
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:
(Cela devrait être fait en plus de la réponse de @ rafalcieslak .)
la source