Model

Každý widget Gtk::TreeView má přiřazený Gtk::TreeModel, který obsahuje data zobrazená v TreeView. Každý Gtk::TreeModel může být použit i více než jedním Gtk::TreeView. Umožňuje to například stejná podkladová data zobrazit a upravovat dvěma různými způsoby naráz. Nebo dvě zobrazení mohou ukazovat různé sloupce ze stejného datového modelu, podobně jako dva dotazy SQL (nebo pohledy) mohou zobrazovat různá pole ze stejné databázové tabulky.

I když si teoreticky můžete implementovat svůj vlastní Model, normálně budete používat buď třídu ListStore nebo TreeStore.

Reference

10.1.1. ListStore (pro řádky)

ListStore obsahuje jen řádková data, řádky nemají žádné potomky.

Obrázek 10-1TreeView – ListStore

Reference

10.1.2. TreeStore (pro hierarchii)

TreeStore obsahuje řádková data a každý z řádků může mít potomky v podobě dalších řádků.

Obrázek 10-2TreeView – TreeStore

Reference

10.1.3. Sloupce modelu

Třída TreeModelColumnRecord se používá k udržení přehledu o sloupcích a jejich datových typech. Instance TreeModelColumn přidáváte do ColumnRecord a pak je používáte k získávání a nastavování dat v řádkovém modelu. Pravděpodobně budete považovat za vhodné odvodit novou třídu TreeModelColumnRecord, kterou použije vaše instance TreeModelColumn jako členská data.

class ModelColumns : public Gtk::TreeModelColumnRecord
{
public:

  ModelColumns()
    { add(m_col_text); add(m_col_number); }

  Gtk::TreeModelColumn<Glib::ustring> m_col_text;
  Gtk::TreeModelColumn<int> m_col_number;
};

ModelColumns m_Columns;

Když vytváříte Model, určíte ColumnRecord takto:

Glib::RefPtr<Gtk::ListStore> refListStore =
    Gtk::ListStore::create(m_Columns);

As a TreeModelColumnRecord describes structure, not data, it can be shared among multiple models, and this is preferable for efficiency. However, the instance (such as m_Columns here) should usually not be static, because it often needs to be instantiated after glibmm has been initialized. The best solution is to make it a lazily instantiated singleton, so that it will be constructed on-demand, whenever the first model accesses it.

10.1.4. Přidávání řádků

Řádky do modelu přidejte pomocí metod append(), prepend() nebo insert().

auto iter = m_refListStore->append();

Pro získání řádku Row můžete použít dereferenci iterátoru:

auto row = *iter;

10.1.4.1. Přidávání synovský řádků

Model Gtk::TreeStore může mít dceřiné položky. Přidávají se pomocí metody append(), prepend() nebo insert() takto:

auto iter_child =
    m_refTreeStore->append(row.children());

10.1.5. Nastavení hodnot

You can use the operator[] overload to set the data for a particular column in the row, specifying the TreeModelColumn used to create the model.

row[m_Columns.m_col_text] = "sometext";

10.1.6. Získání hodnot

You can use the operator[] overload to get the data in a particular column in a row, specifying the TreeModelColumn used to create the model.

auto strText = row[m_Columns.m_col_text];
auto number = row[m_Columns.m_col_number];

Kompilátor vás upozorní, když použijete nesprávný typ. Například následující ukázka by měla způsobit chybu kompilace:

//compiler error - no conversion from ustring to int.
int number = row[m_Columns.m_col_text];

10.1.7. „Skryté“ sloupce

Můžete potřebovat mít v řádcích zadaná nějaká doplňující data. V takovém případě stačí, když je přidáte do Modelu jako další sloupec, ale ten nebudete přidávat do zobrazení View.