一位相當早期的挪威籍電腦科學家 Trygve Reenskaug 在 1970 年代提出了 Model-View-Controller 的概念,其主要目的是為了 code reuse 以及 parallel development (例如,Model 與 View 由不同的人或團隊所負責,而 Controller 則需兩者相互溝通來訂定規格,如此為之就能同時開發其所負責的軟體元件),其中 View 主要是指 GUI 對於資料的顯示方式,而 Controller 則有兩個面向,第一個面向在 GUI 端,第二個面向則在 Model 端;GUI 端必須提供可下達「執行資料運作」的介面,例如 add、delete、double click(activate) 的 GUI 元件,而 Model 端則需提供 API 來讓 Controller 端做呼叫。至於 Model,則是整個 Application 的核心所在,所有融合與實現 domain knowledge 與 business rules 的資料結構、演算法、軟體元件、以及軟體架構等等,全部都放在 Model 之中。
GTK TreeView 也是採用 Model-View-Controller 的設計,筆者在閱練 GtkTreeView widget 之後,寫了兩個範例程式,簡單地示範 GtkTreeView widget 底層所提供的兩種 data model: GtkListStore 與 GtkTreeStore。
請注意上述所提到的 Model,以 GtkTreeView 為例,是包含 Gtk 所提供的 GtkListStore 與 GtkTreeStore 這兩個 GUI data model,以及 Application 所針對的產業而所必須實現與融合的 domain knowledge 與 business rule,並包含與其相關的資料結構、演算法、軟體元件、以及軟體架構等等。
< Model-View-Controller Concept >
在 wikipedia 網站上關於 Model-View-Controller 的解釋圖片,其中 Controller 與 View 之間沒有任何的運作關係,對此筆者認為需要修正一下,因為實際的使用範例,user 是可以透過 Controller 去改變 View,例如 user 對 GtkTreeView 中的某一個 row 做 double-click,之後 GtkTreeView 開啟另一個視窗來顯示更加詳細的資訊,此例就是 user 透過 Controller 去改變 View,但沒有動到 Model。
< GtkTreeView >
GtkTreeView 是以 column-based 的方式來設定如何顯示同一種類別的資料, 而資料的選擇則是採用 row-based 的方式。
< GtkTreeModel >
GtkTreeModel 主要有兩種:GtkListStore 與 GtkTreeStore;在 GtkListStore 之中,row 與 row 彼此之間是獨立的,並沒有從屬關係;在 GtkTreeStore 之中,row 與 row 之間可能具有 Parent-Child 的從屬關係。
GtkTreeModel 是以 column-based 的方式來規劃與描述各個欄位,而資料的增加與移除方式,則是採用 row-based 的方式。
GtkTreeView 與 GtkTreeModel 彼此是獨立的,因此得透過 API
gtk_tree_view_set_model(tree_view, tree_model);
來建立兩者之間的關連性。
資料的增加與移除是由 GtkTreeModel (亦即 GtkListStore 或 GtkTreeStore) 所負責,與 GtkTreeView 無關,GtkTreeView 只負責顯示 GtkTreeModel 的資料。
< GtkTreeView and GtkListStore >
< GtkTreeView and GtkTreeStore >
screen snapshot 1
screen snapshot 2
screen snapshot 3
screen snapshot 4
screen snapshot 5