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 (すべての列を階層的に表示する拡張された実際のツリーと、タイプ アイコンと DataStruct の名前のみを表示する ListStore のように簡単なもの、これらのビューは異なる親によって所有されており、同時に表示される可能性があります) と 1 つ同じデータをアイコンで表現した ListView。ATM データ (検証、シリアライゼーション、デシリアライゼーションなど) を管理するクラスと、これらのビューごとに 3 つのモデルがあるため、アイテムを更新/削除/作成するたびに、3 つのモデルすべてを更新する必要があり、見栄えがよくありません。 :(

私が考えたのは、Gtk.TreeModel を実装するクラスを作成し、3 つのビューすべてのモデルとして使用できる共通のデータ ソースを提供することですが、gtk.TreeModel の実装方法に関するドキュメントが見つかりません。私は GtkListStore (ネイティブ C 実装) を調べてみましたが、本当に多くのメソッドを再実装していることがわかります。もっと簡単な方法はありませんか?

4

2 に答える 2

6

いいえ、簡単な方法はありませんが、それほど難しくはありません。C コードを見ると気が遠くなるかもしれませんが、実際に実装する必要があるメソッドは 10 個ほどしかありません。それらはabstractgtk+-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 に答える