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つの問題を解決する方法を誰かお勧めできますか?
さて、これを修正する方法がわかったので、他の誰かがこの問題を抱えている場合に備えて、ここで解決策を説明します。
トリックはGtkIconViewをGtkScrolledWindowに配置するで、hscrollbar_policyを「常に」に設定することです。次に、ユーザーがウィンドウのサイズを変更したときに反応するために、check-resize信号を使用する必要があります(サイズが変更された場合、ウィンドウがドラッグされたときにも信号が放出されるため、チェックする必要があることに注意してください)。
サイズが変更されると、GtkIconViewが使用するモデルをクリアして再作成する必要があります。これにより、GtkIconViewが新たに獲得したスペースを適切に再割り当て(または縮小)します。 また、GtkIconViewはGtkScrolledWindowが使用するのとまったく同じスペースを使用するため、結果として水平スクロールバーは表示されません。
サイズを変更したときに、列を0に設定し、-1に戻すこともできます。これにより、アイコンが選択解除されなくなります。
iconview.set_columns(0)
iconview.set_columns(-1)
(これは、 @ rafalcieslak's answer に加えてに加えて行う必要があります。)
この問題に対する私の好ましい解決策は、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に設定して戻すことにより、強制的に再レイアウトします。