2

我有一个哈希值,这些值构建到以下结构中:

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 实现),我发现它重新实现了很多方法。没有更简单的方法吗?

4

2 回答 2

6

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

标记为的方法virtual通常不需要实现,尽管您可以根据需要提供一个实现(通常用于优化,我猜 Gtk.ListStore 提供了很多)。

于 2012-08-13T00:09:08.643 回答
4

简单继承自 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;
    }
    ..... 

于 2012-10-31T02:17:13.333 回答