O GtkIconView não preenche automaticamente o espaço com o ícone quando o usuário redimensiona a janela

9

No projeto do Ubuntu Accomplishments, estamos tendo alguns bugs incomuns:

Ou seja, temos uma janela com um GtkNotebook e um GtkIconView em uma página e outra em outra página.

Quando o usuário redimensiona a janela, a iconview não preenche automaticamente o espaço com ícones (eles permanecem no layout da coluna original), mas se o usuário alterar as páginas do GtkNotebook e atualizar a visualização do ícone, o espaço será ocupado como esperado. Como podemos usar automaticamente o espaço ao redimensionar a janela?

O que é mais preocupante é que quando a janela aparece, podemos redimensioná-la de forma menor - parece que a iconview está nos impedindo de redimensionar e depois ter uma região rolável para os ícones.

O código é assim. Os ListStores que controlam os 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)

Além disso, nós não investigamos os IconViews, apenas adicionamos conteúdo aos ListStores para atualizar as visualizações.

O código do projeto é aqui - alguém pode recomendar como podemos corrigir esses dois problemas?

    
por jonobacon 24.04.2012 / 07:20

3 respostas

3

Ok, como descobrimos como corrigir isso, descreverei a solução aqui, caso alguém mais tenha esse problema.

O truque é colocar o GtkIconView em um GtkScrolledWindow e configurar o hscrollbar_policy como "always". Então, um sinal de redimensionamento de verificação deve ser usado, para reagir quando o usuário redimensiona a janela (observe que deve ser verificado se o tamanho foi alterado, pois o sinal é emitido também quando, por exemplo, a janela é arrastada).

Quando o tamanho muda, o modelo usado pelo GtkIconView precisa ser limpo e recriado, pois isso aciona o GtkIconView para realocar adequadamente o espaço recém-ganho (ou encolhendo). Além disso, como resultado, a barra de rolagem horizontal nunca será vista, já que o GtkIconView usa exatamente o espaço que a GtkScrolledWindow usa.

    
por Rafał Cieślak 24.04.2012 / 18:00
1

Minha solução preferida para este problema é uma subclasse muito pequena do 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 ()]]

A substituição get_preferred_width permite que a exibição seja arbitrariamente limitada. O retorno de chamada de alocação de tamanho força um relé, definindo o número de colunas para 1 e vice-versa.

    
por cscarney 25.07.2012 / 22:04
1

Você também pode definir as colunas como 0 e voltar a -1 quando o tamanho mudar. Desta forma, os ícones não serão desmarcados:

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

(Isto deve ser feito além para @ resposta do rafalcieslak .)

    
por user82378 09.08.2012 / 20:28