web-dev-qa-db-ja.com

GtkIconViewは、ユーザーがウィンドウのサイズを変更するときにアイコンで自動的にスペースを埋めません

Ubuntu Accomplishmentsプロジェクトでは、いくつかの異常なバグがあります。

つまり、あるページにGtkNotebookとGtkIconViewがあり、別のページに別のウィンドウがあるということです。

ユーザーがウィンドウのサイズを変更すると、アイコンビューは自動的にアイコンでスペースを埋めません(元の列レイアウトのままです)が、ユーザーがGtkNotebookページを変更してアイコンビューを更新すると、スペースが期待どおりに使用されます。ウィンドウのサイズを変更するときにスペースを自動的に使用するにはどうすればよいですか?

しかし、もっと心配なのは、ウィンドウが表示されたときに、サイズを小さく変更できることです。アイコンビューがアイコンのサイズ変更を妨げており、アイコンのスクロール可能な領域があるようです。

コードは次のようになります。 IconViewsを駆動するListStores:

    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)

これ以外は、IconViewsを実際に操作するのではなく、ListStoresにコンテンツを追加してビューを更新するだけです。

プロジェクトのコードは here です。これらの2つの問題を解決する方法を誰かお勧めできますか?

9
jonobacon

さて、これを修正する方法がわかったので、他の誰かがこの問題を抱えている場合に備えて、ここで解決策を説明します。

トリックはGtkIconViewをGtkScrolledWindowに配置するで、hscrollbar_policyを「常に」に設定することです。次に、ユーザーがウィンドウのサイズを変更したときに反応するために、check-resize信号を使用する必要があります(サイズが変更された場合、ウィンドウがドラッグされたときにも信号が放出されるため、チェックする必要があることに注意してください)。

サイズが変更されると、GtkIconViewが使用するモデルをクリアして再作成する必要があります。これにより、GtkIconViewが新たに獲得したスペースを適切に再割り当て(または縮小)します。 また、GtkIconViewはGtkScrolledWindowが使用するのとまったく同じスペースを使用するため、結果として水平スクロールバーは表示されません。

3
Rafał Cieślak

サイズを変更したときに、列を0に設定し、-1に戻すこともできます。これにより、アイコンが選択解除されなくなります。

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

(これは、 @ rafalcieslak's answer に加えてに加えて行う必要があります。)

1
user82378

この問題に対する私の好ましい解決策は、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 ()]]

Get_preferred_widthオーバーライドにより、ビューを任意に狭めることができます。サイズ割り当てコールバックは、列の数を1に設定して戻すことにより、強制的に再レイアウトします。

1
cscarney