Bab 10. TreeView

Daftar Isi

10.1. Model
10.1.1. Iterator
10.2. View
10.2.1. Selection
10.2.2. Atribut

Menampilkan data atau informasi dengan perumpamaan struktur pohon saat ini sangat digemari. PyGTK mempunyai widget yang mendukung hal ini, yaitu gtk.TreeView . Aplikasi dengan menu yang kompleks menjadi lebih mudah digunakan dengan bantuan gtk.TreeView. Jika kita mempunyai banyak data yang ditampilkan namun kita hanya perlu melihat bagian yang penting saja, gunakanlah gtk.TreeView.

Berbeda dengan widget-widget yang lain, untuk menampilkan gtk.TreeView ini memerlukan banyak object dan widget pendukung. Dengan pendekatan pola (pattern) MVC, Model/View/Control , hal yang tampaknya rumit ini menjadi hal yang sederhana dan fleksibel.

Model adalah struktur data untuk menyimpan data/informasi yang akan ditampilkan. View adalah object/widget yang menampilkan data/informasi. Sedangkan control adalah kode program yang kita tulis dalam membuat model dan view.

10.1. Model

PyGTK mempunyai kelas gtk.TreeModel sebagai kelas dasar dari model yang kita gunakan. Kelas ini tidak digunakan langsung namun sebagai antar-muka (interface) dari object model dan view. Akan sangat membantu jika Anda membaca dokumen referensi dari gtk.TreeModel.

Untuk mempermudah hidup kita GTK telah menyiapkan model yang siap pakai. Terdapat dua model yaitu gtk.TreeStore dan gtk.ListStore. Jika kita memerlukan struktur data secara hirarki maka dapat kita gunakan gtk.TreeStore. Namun jika strukturnya berupa daftar maka gunakan gtk.ListStore. Selanjutnya kita hanya memasukkan data ke dalam struktur ini.

Kita mulai dengan struktur yang lebih sederhana dahulu. Sangat mudah untuk membuat object gtk.ListStore ini.

    gtk.ListStore(tipe_kolom,...)
tipe_kolom,...daftar tipe data untuk setiap kolom.
kembalianobject model.

Kita dapat melihat model sebagai tabel. Model terdiri dari baris dan kolom. Setiap kali kita membuat model kita perlu daftarkan tipe data untuk setiap kolomnya. Contoh :

    mymodel = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING, gtk.gdk.TYPE_PIXBUF)

Membuat model dengan tiga kolom. Kolom pertama mempunyai tipe gobject.TYPE_INT, kolom kedua gobject.TYPE_STRING dan kolom ketiga gtk.gdk.TYPE_PIXBUF . Tipe data lain yang dapat digunakan :

    gobject.TYPE_BOOLEAN
    gobject.TYPE_BOXED
    gobject.TYPE_CHAR
    gobject.TYPE_DOUBLE
    gobject.TYPE_ENUM
    gobject.TYPE_FLAGS
    gobject.TYPE_FLOAT
    gobject.TYPE_INT
    gobject.TYPE_INT64
    gobject.TYPE_INTERFACE
    gobject.TYPE_INVALID
    gobject.TYPE_LONG
    gobject.TYPE_NONE
    gobject.TYPE_OBJECT
    gobject.TYPE_PARAM
    gobject.TYPE_POINTER
    gobject.TYPE_PYOBJECT
    gobject.TYPE_STRING
    gobject.TYPE_UCHAR
    gobject.TYPE_UINT
    gobject.TYPE_UINT64
    gobject.TYPE_ULONG

Selain setiap kolom dapat menggunakan tipe data GObject manapun, juga dapat menggunakan tipe data dari PyGTK atau tipe data yang diturunkan dari GObject.

Karena fungsi dari model adalah menyimpan data maka kebanyakan method-method dari gtk.ListStore adalah cara-cara memasukkan data ke dalam model. Sangat dianjurkan untuk membaca dokumen referensi dari gtk.ListStore.

Model gtk.TreeStore sangat mirip dengan gtk.ListStore . Perbedaannya, kita dapat membuat baris baru sebagai anak baris (child node) pada gtk.TreeStore sehingga membentuk struktur hirarkis.

10.1.1. Iterator

Untuk dapat mengambil kembali data yang telah disimpan di dalam model diperlukan suatu cara tertentu. Mirip dengan indeks di array, model mempunyai istilah path. Path adalah petunjuk ke baris tertentu di dalam model (baris juga disebut node). Path dapat ditulis dalam dua bentuk. Pertama, path dapat dalam bentuk array/tuple dari bilangan bulat tak bertanda (unsigned integer). Kedua, dapat pula dalam bentuk string dari beberapa bilangan dengan titik dua sebagai pemisah. Sebagai contoh : "0" adalah akar dari model atau baris pertama (nomor dimulai dari 0), "2:4" adalah anak baris ke-lima dari baris ke-tiga.

Perlu diperhatikan bahwa path hanya sebagai petunjuk yang mirip dengan alamat rumah. Suatu alamat belum tentu menunjukkan bahwa rumah itu ada. Namun sebuah object iterator adalah object yang mereferensikan baris yang ada di dalam model. Iterator bisa dilihat sebagai pointer ke baris tertentu di dalam model. Dalam model kita, iterator ini disebut treeiter. Konversi dari path ke treeiter didapat dari fungsi get_iter(path), atau sebaliknya get_path(treeiter).

Kebanyakan fungsi-fungsi lain dari model menggunakan treeiter sebagai argumen atau nilai kembalinya.

Sebagai contoh cuplikan program :

    # membuat model
    model = gtk.TreeStore(gobject.TYPE_STRING,gobject.TYPE_STRING,gobject.TYPE_STRING)

    # mengisi model dengan data
    iter = model.append(None, None) # iterator baris baru
    model.set_value(iter, 0, "Lingkin Park")    # isi kolom pertama
    model.set_value(iter, 1, "Hybrid Theory")   # isi kolom kedua
    model.set_value(iter, 2, "Mobil")         # isi kolom ketiga

    # menambah baris baru sebagai anak dari baris di atas
    citer = model.append(iter, None)
    # isi datanya dengan fungsi set(iterator, ....)
    # .... adalah pasangan kolom dengan data, mis kolom 1 berisi data "Meteora"
    model.set(citer, 0, None, 1, "Meteora", 2, "Rumah")