GtkIconView nie wypełnia automatycznie ikony ikoną, gdy użytkownik zmienia rozmiar okna

9

W projekcie Osiągnięcia Ubuntu mamy kilka niezwykłych błędów:

Mianowicie, że mamy okno z GtkNotebook i GtkIconView na stronie i innym na innej stronie.

Gdy użytkownik zmienia rozmiar okna, widok ikon nie automatycznie wypełnia przestrzeń ikonami (pozostają w oryginalnym układzie kolumn), ale jeśli użytkownik zmieni strony GtkNotebook, a tym samym odświeży widok ikon, miejsce zostanie zajęte zgodnie z oczekiwaniami. Jak możemy automatycznie wykorzystać przestrzeń podczas zmiany rozmiaru okna?

Bardziej niepokojące jest to, że kiedy pojawi się okno, możemy zmienić jego rozmiar na mniejszy - wygląda na to, że widok ikon blokuje nam zmianę rozmiaru, a następnie posiadanie przewijalnego regionu dla ikon.

Kod wygląda następująco. ListStores, które sterują 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)

Poza tym, tak naprawdę nie przeszukujemy IconViews, po prostu dodajemy zawartość do ListStores, aby zaktualizować widoki.

Kod projektu znajduje się tutaj - czy ktoś może polecić, jak możemy rozwiązać te dwa problemy?

jonobacon
źródło
Tylko wyjaśnienie: gdy użytkownik zmienia strony Notatnika, kod aplikacji usuwa podstawowy model i dodaje ponownie wszystkie elementy, co wydaje się być powodem, dla którego GtkIconView odświeża i wykorzystuje puste miejsce.
Rafał Cieślak

Odpowiedzi:

3

Ok, jak już wymyśliliśmy, jak to naprawić, opiszę tutaj rozwiązanie, na wypadek, gdyby ktoś miał ten problem.

Sztuką jest umieszczenie GtkIconView w GtkScrolledWindow i ustawienie jego hscrollbar_policy na „always”. Następnie należy użyć sygnału sprawdzania-zmiany rozmiaru, aby zareagować, gdy użytkownik zmieni rozmiar okna (zwróć uwagę, że należy sprawdzić, czy rozmiar się zmienił, ponieważ sygnał jest emitowany również wtedy, gdy np. Okno jest przeciągane).

Gdy rozmiar się zmienia, model używany przez GtkIconView musi zostać wyczyszczony i ponownie utworzony, ponieważ powoduje to prawidłowe przestawienie nowo zdobytej przestrzeni (lub zmniejszenie) przez GtkIconView. Ponadto, w wyniku tego poziomy pasek przewijania nigdy nie będzie widoczny, ponieważ GtkIconView zajmuje dokładnie tyle miejsca, ile używa GtkScrolledWindow.

Rafał Cieślak
źródło
To było bardzo pomocne, dziękuję za odpowiedź! Wpłynęło to na mnie na lp: qreator, a wraz z twoją poprawką liczba kolumn ikon w głównym widoku ikon jest dynamiczna po ponownym zmianie rozmiaru.
David Planella
1

Moim preferowanym rozwiązaniem tego problemu jest bardzo mała podklasa 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 ()]]

Przesłonięcie get_preferred_width pozwala na dowolne zawężenie widoku. Oddzwonienie alokujące rozmiar wymusza przekazanie przez ustawienie liczby kolumn na 1 i wstecz.

cscarney
źródło
1

Możesz także ustawić kolumny na 0 i z powrotem na -1, gdy zmieni się rozmiar. W ten sposób ikony nie zostaną odznaczone:

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

(Należy to zrobić oprócz odpowiedzi @ rafalcieslak .)

użytkownik82378
źródło
Dlaczego jest to dodatek do odpowiedzi rafalcieslak? Jeśli zmienisz liczbę kolumn, otrzymasz sztafetę; przebudowa modelu i tak byłaby bezcelowa.
cscarney,