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

9

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?

jonobacon
fonte
Apenas uma explicação: quando o usuário altera as páginas do Notebook, o código do aplicativo limpa o modelo subjacente e adiciona todos os itens novamente, o que parece ser o motivo para o GtkIconView atualizar e usar o espaço vazio.
Rafał Cieślak

Respostas:

3

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.

Rafał Cieślak
fonte
Isso foi extremamente útil, obrigado pela resposta! Fui afetado por ele no lp: qreator e, com sua correção, o número de colunas de ícones na visualização principal de ícones é dinâmico ao redimensionar novamente.
David Planella 28/05
1

Minha solução preferida para esse 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 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.

cscarney
fonte
1

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:

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

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

user82378
fonte
Por que isso além da resposta de rafalcieslak? Se você alterar o número de colunas, receberá uma retransmissão; reconstruir o modelo de qualquer maneira seria inútil.
Cscarney 20/08/2012