2012-08-12 47 views
1

我有值的散列該建設成以下結構:GTK +和瓦拉:繼承gtk.TreeModel

string type1_name -> Hash(
       string name_member -> DataStruct, 
       string name_member -> DataStruct, 
       string name_member -> DataStruct, 
       string name_member -> DataStruct 
      ), 
string type2_name -> Hash(
       string name_member -> DataStruct, 
       string name_member -> DataStruct, 
       string name_member -> DataStruct, 
       string name_member -> DataStruct 
      ), 
/// etc 

問題是我有3次:2級的TreeView(擴展實際樹表示hierarchial方式的所有列並簡單顯示爲僅顯示DataStruct的類型圖標和名稱的ListStore,這些視圖由不同父母擁有並可能同時顯示)以及1個帶有圖標表示的相同數據的ListView。自動櫃員機我有一個班級管理數據(驗證,序列化,反序列化......)和3個模型的每個視圖,所以每次我更新/刪除/創建項目,我必須更新所有3個模型,這看起來不好:(

我想到的是創建一個類實現Gtk.TreeModel並提供可用作所有3個視圖的模型的通用數據源,但是我找不到有關如何實現gtk.TreeModel的任何文檔。我試圖通過GtkListStore(原生C實現)來看,並且我看到它實際上實現了很多方法。是不是有更簡單的方法?

回答

5

不,沒有更簡單的方法,但實際上並不太很難,查看C代碼可能會讓人感到恐懼,但實際上只有十幾種方法需要實現。它們在gtk + -3.0.vapi(和valadoc.org的Gtk.TreeModel文檔)中標記爲abstract,實現通常非常簡單。如果你想要一個例子SQLHeavyGtk.Model是我能想到的唯一的例子。

標記爲virtual的方法通常不需要實現,儘管您可以提供一個實現(通常用於優化,我猜Gtk.ListStore提供了很多實現)。

+0

謝謝!這真的有幫助。我不能稱我的代碼完美,但它的工作原理,現在我有更少的重複問題。 – Daniel 2012-08-13 13:34:42

3

從Gtk.TreeStore/Gtk.ListStore簡單繼承,並明確設置列類型。 樹視圖列設置爲單元格渲染器和您想要顯示的數據回調函數。

瓦拉樣品MyCommon.data1映射到treeview1.column = 0


public class MyCommon : GLib.Object { 
    string data1 {get; set; } 
    string data2 {get; set; } 
} 


public class Store : Gtk.TreeStore { 

    public Store() { 
     set_column_types(new GLib.Type[] { typeof(MyCommon) }); 
    } 

    public set_treeview1(Gtk.TreeView treeview) { 
     treeview.insert_column_with_data_func(0, "data1", new Gtk.CellRendererText(), tree_cell_data1); 
     treeview.insert_column_with_data_func(1, "data2", new Gtk.CellRendererText(), tree_cell_data2); 
     treeview.model = this; 
    } 

    protected MyCommon? my_common(Gtk.TreeModel model, Gtk.TreeIter iter) { 
     GLib.Value data; 
     model.get_value(iter, 0, out data); 
     return (MyCommon)data; 
    } 

    public void tree_cell_data1(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, 
            Gtk.TreeModel model, Gtk.TreeIter iter) { 
     MyCommon? property = my_common(this,iter); 
     if(property != null) (cell as Gtk.CellRendererText).text = property.data1; 
    } 

    public void tree_cell_data2(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, 
            Gtk.TreeModel model, Gtk.TreeIter iter) { 
     MyCommon? property = my_common(this,iter); 
     if(property != null) (cell as Gtk.CellRendererText).text = property.data2; 
    } 
    .....