No projeto de realizações do Ubuntu, estamos tendo alguns erros 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, o iconview não preenche automaticamente o espaço com ícones (eles permanecem no layout original da coluna), mas se o usuário altera as páginas do GtkNotebook e atualiza a visualização do ícone, o espaço é ocupado conforme o esperado. Como podemos usar automaticamente o espaço ao redimensionar a janela?
O que é mais preocupante, porém, é que, quando a janela aparece, podemos redimensioná-la menor - parece que o iconview está nos impedindo de redimensionar e depois ter uma região rolável para os ícones.
O código fica assim. As ListStores que controlam o 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)
Fora isso, nós realmente não mexemos com o IconViews, apenas adicionamos conteúdo às ListStores para atualizar as visualizações.
O código do projeto está aqui - alguém pode recomendar como podemos corrigir esses dois problemas?
fonte
Respostas:
Ok, como descobrimos como consertar isso, descreverei a solução aqui, caso alguém mais tenha esse problema.
O truque é colocar o GtkIconView em um GtkScrolledWindow e definir hscrollbar_policy como "sempre". Em seguida, é necessário usar um sinal de verificação de redimensionamento para reagir quando o usuário redimensiona a janela (observe que deve ser verificado se o tamanho mudou, pois o sinal é emitido também quando, por exemplo, a janela é arrastada).
Quando o tamanho muda, o modelo usado pelo GtkIconView deve ser limpo e recriado, pois isso aciona o GtkIconView realocando adequadamente o espaço recém-ganho (ou diminuindo). Além disso, como resultado, a barra de rolagem horizontal nunca será vista, pois o GtkIconView usa exatamente tanto espaço quanto o GtkScrolledWindow.
fonte
Minha solução preferida para esse problema é uma subclasse muito pequena do Gtk.IconView:
A substituição get_preferred_width permite que a exibição seja arbitrariamente estreita. O retorno de chamada de alocação de tamanho força uma retransmissão definindo o número de colunas como 1 e vice-versa.
fonte
Você também pode definir as colunas para 0 e voltar para -1 quando o tamanho for alterado. Dessa forma, os ícones não serão desmarcados:
(Isto deve ser feito além de resposta de @ rafalcieslak .)
fonte