Gtk + и Vala: наследование 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 (расширенное фактическое дерево, показывающее все столбцы в иерархическом порядке и краткое, как ListStore, показывающее только значок типа и имя DataStruct, эти представления принадлежат разным родителям и могут отображаться одновременно) и 1 ListView со значком представления тех же данных. ATM У меня есть данные управления классом (проверки, сериализация, десериализация, ...) и 3 модели для каждого из этих представлений, поэтому каждый раз, когда я обновляю / удаляю / создаю элемент, я должен обновлять все 3 модели, и это выглядит не очень хорошо :(

Я думал о создании класса, реализующего Gtk.TreeModel и предоставляющего общий источник данных, который можно использовать в качестве модели для всех трех представлений, но я не могу найти никакой документации о том, как реализовать gtk.TreeModel. Я попытался просмотреть GtkListStore (встроенная реализация C), и я вижу, что он переопределяет действительно множество методов. Нет более простого способа?


person Daniel    schedule 12.08.2012    source источник


Ответы (2)


Нет, более простого пути нет, но на самом деле это не так уж и сложно. Просмотр кода C может показаться пугающим, но на самом деле существует всего около дюжины методов, которые вам нужно реализовать. Они помечены как abstract в gtk + -3.0.vapi (и в Gtk.TreeModel docs)., и реализации обычно довольно тривиальны. Если вам нужен пример SQLHeavyGtk.Model, это единственный, о котором я могу думать.

Методы, отмеченные как virtual, обычно не требуют реализации, хотя вы можете предоставить ее, если хотите (часто используются для оптимизации, и я предполагаю, что Gtk.ListStore предоставляет их много).

person nemequ    schedule 13.08.2012
comment
благодарю вас! это действительно помогло. Я не могу назвать свой код идеальным, но он работает, и теперь у меня гораздо меньше проблем с дублированием. - person Daniel; 13.08.2012

Простое наследование от Gtk.TreeStore / Gtk.ListStore и явная установка типов столбцов. В столбце древовидного представления задано средство визуализации ячеек и функция обратного вызова данных, которую вы хотите показать.

Пример Vala для сопоставления 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;
    }
    ..... 

person no_spam    schedule 31.10.2012