GtkIconView tidak secara otomatis mengisi ruang dengan ikon ketika pengguna mengubah ukuran jendela

9

Dalam proyek Ubuntu Accomplishments kami mengalami beberapa bug yang tidak biasa:

Yaitu bahwa kita memiliki jendela dengan GtkNotebook dan GtkIconView pada halaman dan yang lain di halaman lain.

Ketika pengguna mengubah ukuran jendela, tampilan ikon tidak secara otomatis mengisi ruang dengan ikon (mereka tetap dalam tata letak kolom aslinya) tetapi jika pengguna mengubah halaman GtkNotebook dan dengan demikian menyegarkan tampilan ikon sehingga ruang diambil seperti yang diharapkan. Bagaimana kita dapat secara otomatis menggunakan ruang ketika mengubah ukuran jendela?

Yang lebih memprihatinkan adalah bahwa ketika jendela muncul, kita dapat mengubah ukurannya lebih kecil - sepertinya tampilan ikon menghalangi kita untuk mengubah ukuran dan kemudian memiliki wilayah yang dapat digulir untuk ikon.

Kode terlihat seperti ini. ListStores yang menggerakkan 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)

Selain ini, kami tidak benar-benar mencari-cari dengan IconViews, kami hanya menambahkan konten ke ListStores untuk memperbarui tampilan.

Kode untuk proyek ada di sini - adakah yang bisa merekomendasikan bagaimana kita dapat memperbaiki kedua masalah ini?

jonobacon
sumber
Hanya sebuah penjelasan: ketika pengguna mengubah halaman buku catatan, kode aplikasi membersihkan model yang mendasarinya dan menambahkan semua item lagi, yang tampaknya menjadi alasan bagi GtkIconView untuk menyegarkan dan menggunakan ruang kosong.
Rafał Cieślak

Jawaban:

3

Oke, seperti yang kita ketahui bagaimana cara memperbaikinya, saya akan menjelaskan solusinya di sini, kalau-kalau ada orang lain yang memiliki masalah ini.

Caranya adalah dengan menempatkan GtkIconView di GtkScrolledWindow , dan mengaturnya hscrollbar_policy ke "always". Kemudian, tanda centang ukuran harus digunakan, untuk bereaksi ketika pengguna mengubah ukuran jendela (perhatikan bahwa itu harus diperiksa jika ukurannya telah berubah, untuk sinyal dipancarkan juga ketika misalnya jendela diseret sekitar).

Ketika ukurannya berubah, model yang digunakan oleh GtkIconView harus dihapus dan dibuat ulang, karena ini memicu GtkIconView mengalokasikan kembali ruang yang baru diperoleh dengan benar (atau menyusut). Juga, sebagai akibatnya scrollbar horizontal tidak akan pernah terlihat, karena GtkIconView menggunakan ruang yang persis sama dengan yang digunakan GtkScrolledWindow.

Rafał Cieślak
sumber
Ini sangat membantu, terima kasih atas jawabannya! Saya terpengaruh olehnya di lp: qreator dan dengan perbaikan Anda jumlah kolom ikon pada tampilan ikon utama dinamis setelah diubah ukurannya lagi.
David Planella
1

Solusi pilihan saya untuk masalah ini adalah subkelas Gtk.IconView yang sangat kecil:

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 ()]]

Override get_preferred_width memungkinkan tampilan menjadi sempit. Callback yang mengalokasikan ukuran memaksa relayout dengan mengatur jumlah kolom ke 1 dan kembali.

cscarney
sumber
1

Anda juga dapat mengatur kolom ke 0 dan kembali ke -1 saat ukurannya berubah. Dengan cara ini ikon tidak akan dipilih:

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

(Hal ini harus dilakukan selain untuk jawaban @ rafalcieslak ini .)

pengguna82378
sumber
Mengapa ini selain jawaban rafalcieslak? Jika Anda mengubah jumlah kolom, Anda akan mendapatkan relayout; membangun kembali model itu akan sia-sia.
cscarney