GtkIconView füllt den Bereich nicht automatisch mit Symbolen, wenn der Benutzer die Fenstergröße ändert

9

Im Ubuntu Accomplishments-Projekt gibt es einige ungewöhnliche Fehler:

Das heißt, wir haben ein Fenster mit einem GtkNotebook und einem GtkIconView auf einer Seite und einem anderen auf einer anderen Seite.

Wenn der Benutzer die Größe des Fensters ändert, füllt die Symbolansicht den Bereich nicht automatisch mit Symbolen (sie bleiben in ihrem ursprünglichen Spaltenlayout). Wenn der Benutzer jedoch die GtkNotebook-Seiten ändert und somit die Symbolansicht aktualisiert, wird der Bereich wie erwartet belegt. Wie können wir den Platz beim Ändern der Fenstergröße automatisch nutzen?

Noch besorgniserregender ist jedoch, dass wir die Größe des Fensters verkleinern können, wenn es angezeigt wird. Es scheint, als würde uns die Symbolansicht daran hindern, die Größe zu ändern, und dann einen scrollbaren Bereich für die Symbole haben.

Der Code sieht so aus. Die ListStores, die die IconViews steuern:

    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)

Abgesehen davon stöbern wir nicht wirklich in den IconViews herum, sondern fügen lediglich Inhalte zu den ListStores hinzu, um die Ansichten zu aktualisieren.

Der Code für das Projekt ist hier - kann jemand empfehlen, wie wir diese beiden Probleme beheben können?

Jonobacon
quelle
Nur eine Erklärung: Wenn der Benutzer die Notebook-Seiten ändert, löscht der Anwendungscode das zugrunde liegende Modell und fügt alle Elemente erneut hinzu. Dies scheint der Grund für GtkIconView zu sein, den leeren Bereich zu aktualisieren und zu verwenden.
Rafał Cieślak

Antworten:

3

Okay, da wir herausgefunden haben, wie dies behoben werden kann, werde ich hier die Lösung beschreiben, falls jemand anderes dieses Problem hat.

Der Trick besteht darin , die GtkIconView in einem GtkScrolledWindow zu platzieren und die hscrollbar_policy auf "immer" zu setzen. Dann muss ein Check-Resize-Signal verwendet werden, um zu reagieren, wenn der Benutzer die Größe des Fensters ändert (beachten Sie, dass überprüft werden muss, ob sich die Größe geändert hat, da das Signal auch ausgegeben wird, wenn z. B. das Fenster herumgezogen wird).

Wenn sich die Größe ändert, muss das von GtkIconView verwendete Modell gelöscht und neu erstellt werden, da dies dazu führt, dass GtkIconView den neu gewonnenen Speicherplatz ordnungsgemäß neu zuweist (oder verkleinert). Infolgedessen wird die horizontale Bildlaufleiste nie angezeigt, da GtkIconView genau so viel Speicherplatz benötigt wie GtkScrolledWindow.

Rafał Cieślak
quelle
Das war sehr hilfreich, danke für die Antwort! Ich war auf lp: qreator davon betroffen und mit Ihrem Fix ist die Anzahl der Symbolspalten in der Hauptsymbolansicht beim erneuten Ändern der Größe dynamisch.
David Planella
1

Meine bevorzugte Lösung für dieses Problem ist eine sehr kleine Unterklasse von 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 ()]]

Durch das Überschreiben von get_preferred_width kann die Ansicht beliebig eng sein. Der Rückruf zur Größenzuweisung erzwingt ein Relayout, indem die Anzahl der Spalten auf 1 und zurück gesetzt wird.

cscarney
quelle
1

Sie können die Spalten auch auf 0 und zurück auf -1 setzen, wenn sich die Größe ändert. Auf diese Weise werden die Symbole nicht abgewählt:

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

(Dies sollte zusätzlich zu der Antwort von @ rafalcieslak erfolgen .)

user82378
quelle
Warum ist das zusätzlich zu Rafalcieslaks Antwort? Wenn Sie die Anzahl der Spalten ändern, erhalten Sie ein Relayout. Der Umbau des Modells wäre sowieso sinnlos.
cscarney