Gtk +和Vala:继承gtk.TreeModel

时间:2012-08-12 11:11:24

标签: gtk vala

我的哈希值包含以下结构:

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个TreeViews(扩展的实际树以层次结构方式显示所有列,简要说明ListStore仅显示DataStruct的类型图标和名称,这些视图由不同的父项拥有,并且可能同时显示)和1个ListView与相同数据的图标表示。 ATM我有一个类管理数据(验证,序列化,反序列化,...)和每个视图的3个模型,所以每次我更新/删除/创建项目我必须更新所有3个模型,这看起来不太好:(

我想到的是创建一个实现Gtk.TreeModel的类并提供可用作所有3个视图的模型的公共数据源,但是我找不到有关如何实现gtk.TreeModel的任何文档。我试图通过GtkListStore(本地C实现)查看,我看到它重新实现了很多方法。有没有更简单的方法?

2 个答案:

答案 0 :(得分:5)

不,没有更简单的方法,但实际上并不太难。查看C代码可能会令人生畏,但实际上只需要执行十几种方法。它们在gtk + -3.0.vapi中标记为abstract(在valadoc.org的Gtk.TreeModel文档中)。并且实现通常非常简单。如果你想要一个例子SQLHeavyGtk.Model是我唯一能想到的。

标记为virtual的方法通常不需要实现,但是如果需要可以提供一个(通常用于优化,我猜Gtk.ListStore提供了很多)

答案 1 :(得分:3)

从Gtk.TreeStore / Gtk.ListStore简单继承并明确设置列类型。 树视图列设置为单元格渲染器和您想要显示的数据回调函数。

要将MyCommon.data1映射到treeview1.column = 0

的Vala示例
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;
    }
    .....