ユーザーがウィンドウのサイズを変更しても、GtkIconViewがスペースをアイコンで自動的に埋めない


9

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)

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

プロジェクトのコードはここにあります -誰もがこれらの2つの問題をどのように修正できるかをお勧めできますか?


単なる説明:ユーザーがNotebookページを変更すると、アプリケーションコードが基になるモデルクリアしてすべてのアイテムを再度追加します。これが、GtkIconViewが更新して空のスペースを使用する理由のようです。
ラファウCieślak

回答:


3

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

コツは、GtkIconViewをGtkScrolledWindowに配置し、 hscrollbar_policyを「always」に設定することです。次に、ユーザーがウィンドウのサイズを変更したときに反応するために、check-resize信号を使用する必要があります(サイズが変更されたかどうかを確認する必要があります。たとえば、ウィンドウがドラッグされたときにも信号が発生するためです)。

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


これは非常に役に立ちました。回答に感謝します!lp:qreatorの影響を受けました。修正により、メインアイコンビューのアイコン列の数は、サイズ変更時に再び動的になります。
David Planella、2012年

1

この問題に対する私の好ましい解決策は、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オーバーライドにより、ビューを任意に狭めることができます。size-allocateコールバックは、列の数を1に設定して、再レイアウトを強制します。


1

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

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

(これは@rafalcieslakの回答に加えて行う必要があります。)


なぜこれはrafalcieslakの回答に加えてあるのですか?列の数を変更すると、再レイアウトが行われます。とにかくモデルを再構築しても意味がありません。
cscarney 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.