This file is indexed.

/usr/share/help/cs/gnome-devel-demos/model-view-controller.py.page is in gnome-devel-docs 3.28.0-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:e="http://projectmallard.org/experimental/" type="guide" style="task" id="model-view-controller.py" xml:lang="cs">

<info>
    <title type="text">Návrh typu Model/Zobrazení/Ovládání (Python)</title>
  <link type="guide" xref="beginner.py#theory"/>
  <link type="next" xref="combobox_multicolumn.py"/>
  <revision version="0.1" date="2012-06-30" status="stub"/>

  <desc>Návrh typu Model/Zobrazení/Ovládání</desc>
  <credit type="author copyright">
    <name>Sebastian Pölsterl</name>
    <email its:translate="no">sebp@k-d-w.org</email>
    <years>2011</years>
  </credit>
  <credit type="author copyright editor">
    <name>Marta Maria Casetti</name>
    <email its:translate="no">mmcasetti@gmail.com</email>
    <years>2012</years>
  </credit>
</info>

<title>Návrh typu Model/Zobrazení/Ovládání</title>

<links type="section"/>

<section id="overview">
<title>Přehled</title>

<p>Widgety <link xref="treeview_simple_liststore.py">TreeView</link> i <link xref="combobox.py">ComboBox</link> jsou postaveny na návrhu <em>Model/Zobrazení/Ovládání</em>. <em>Model</em> (implementace <code>Gtk.TreeModel</code>, obvykle <code>Gtk.TreeStore</code> nebo <code>Gtk.ListStore</code>) uchovává data, <code>Zobrazení</code> (např. <code>Gtk.TreeView</code>, <code>Gtk.ComboBox</code> nebo <code>Gtk.ComboBoxText</code>) přijímá upozornění a zobrazuje obsah modelu. A konečně <code>Ovládání</code> mění stav modelu (přes některé metody, které model implementuje, jako je <code>append()</code> nebo <code>remove()</code>) a upozorňuje zobrazení na tyto změny (pomocí signálu, jako je <code>"changed"</code>).</p>

</section>

<section id="model">
<title>Model</title>

<p>Hlavní rozdíl mezi dvěma hlavními implementacemi <code>Gtk.TreeModel</code> je, že <code>Gtk.ListStore</code> obsahuje jednoduché řádky dat bez potomků, zatímco <code>Gtk.TreeStore</code> obsahuje sice také řádky dat, ale každý řádek může mít synovské řádky (a ty také mohou mít synovské řádky a tak dále).</p>

<p>Data v modelu mohou být získána nebo změněna pomocí stromového iterátoru a sloupcového indexu nebo metody <code>Gtk.TreeIter</code> nebo <code>Gtk.TreePath</code>.</p>

<p>Stejně jako u objektů typu seznam vestavěných v jazyce Python, můžete použít <code>len()</code> k získání počtu řádků a „slice“ (řez) k získání nebo nastavení hodnot. Jinak metoda <code>append()</code> vrací instanci <code>Gtk.TreeIter</code>, která ukazuje na místo, kam byl nový řádek vložen. <code>Gtk.TreeIter</code> můžete získat i zavoláním <code>get_iter()</code>.</p>

<p>Protože <code>Gtk.ListStore</code> obsahuje jen jednu úroveň, tj. uzly nemají žádné potomky, je cesta v podstatě jen index řádku, ke kterému chcete přístup. V případě <code>Gtk.TreeStore</code> je cesta seznam indexů nebo řetězec. Forma řetězce je seznam čísel oddělených dvojtečkami. Každé číslo odkazuje na pořadí v dané úrovni. Takže cesta <code>"0"</code> odkazuje na kořenový uzel a cesta <code>"2:4"</code> odkazuje na pátého potomka třetího uzlu.</p>

<p>Užitečné metody pro <code>Gtk.TreeModel</code>:</p>
<list>
  <item><p><code>get_iter(cesta)</code> vrací instanci <code>Gtk.TreeIter</code> ukazující na <code>cestu</code>. Ta je očekávána v podobě seznamu čísel oddělovaného dvojtečkou nebo n-tice. Například řetězec <code>"10:4:0"</code> je stejná cesta jako n-tice <code>(10, 4, 0)</code>, protože obojí vytvoří cestu do hloubky 3. úrovně k 11. potomku od kořene, 5. pátému potomku jedenáctého potomka a 1. potomku pátého potomka.</p></item>
  <item><p><code>iter_next(stromový_iterátor)</code> vrací instanci <code>Gtk.TreeIter</code> ukazující na uzel následující za <code>stromovým_iterátorem</code> v aktuální úrovni nebo <code>None</code>, pokud tam již další není.</p></item>
  <item><p><code>iter_has_child(stromový_iterátor)</code> vrací <code>True</code> jestliže má <code>stromový_iterátor</code> potomky, jinak <code>False</code>.</p></item>
  <item><p><code>iter_children(stromový_iterátor)</code> vrací instanci <code>Gtk.TreeIter</code> ukazující na prvního potomka <code>stromového_iterátoru</code> nebo <code>None</code>, když žádného potomka nemá.</p></item>
  <item><p><code>get_iter_first()</code> vrací instanci <code>Gtk.TreeIter</code>, která ukazuje na první iterátor ve stromu (tj. na cestě <code>"0"</code>) nebo <code>None</code>, pokud je strom prázdný.</p></item>
</list>

<p>Užitečné metody pro <code>Gtk.ListStore</code>:</p>
<list>
  <item><p><code>append(řádek)</code> připojí nový řádek do <code>ListStore</code>, kde <code>řádek</code> může být seznam hodnot pro každý ze sloupců nebo může být <code>řádek</code> vynechán či <code>None</code> a pak bude připojen prázdný řádek. Tato metoda vrací <code>Gtk.TreeIter</code> ukazující na připojený řádek.</p></item>
  <item><p><code>remove(iterátor)</code> odstraní <code>iterátor</code> z <code>Gtk.ListStore</code> a vrátí <code>True</code> jestliže je iterátor platný nebo <code>False</code> jestliže není. Po odstranění je <code>iterátor</code> nastaven na následující platný řádek.</p></item>
</list>

<p>Užitečné metody pro <code>Gtk.TreeStore</code>:</p>
<list>
  <item><p><code>append(rodič, řádek)</code> přidá do stromového úložiště nový řádek. Argument <code>rodič</code> musí být platný <code>Gtk.TreeIter</code>. Když rodič není <code>None</code>, bude nový řádek přidán za posledního potomka rodiče, jinak bude přidán do nejvyšší úrovně. Argument <code>řádek</code> může být seznam hodnot pro jednotlivé sloupce nebo může být vynechán nebo <code>None</code>. V posledních dvou zmíněných případech bude připojen prázdný řádek. Metoda vrací <code>Gtk.TreeIter</code> ukazující na připojený řádek.</p></item>
  <item><p><code>remove(iterátor)</code> odstraní <code>iterátor</code> z <code>Gtk.ListStore</code> a vrátí <code>True</code> jestliže je iterátor platný nebo <code>False</code> jestliže není. Po odstranění je <code>iterátor</code> nastaven na následující platný řádek.</p></item>
</list>

</section>

<section id="treeview">
<title>Zobrazení: případ TreeView</title>

<p><code>TreeView</code> zobrazuje strukturu dceřiných a rodičovských položek v podobě stromu. Viz třeba <link xref="treeview_treestore.py">tento příklad</link>.</p>

<p><code>Gtk.TreeViewColumn</code> je použito k uspořádání svislých sloupců.</p>

<p>Užitečné metody pro <code>Gtk.TreeView</code>:</p>
<list>
  <item><p><code>set_model(model)</code> nastaví model pro toto stromové zobrazení. Pokud již nějaký model nastavené má, tak ten bude nejdříve odebrán. Jestliže je model <code>None</code>, tak se zruší nastavení starého modelu.</p></item>
  <item><p><code>get_model()</code> vrací model, na kterém je strom založen, <code>None</code>, když model není nastaven.</p></item>
  <item><p><code>append_column(sloupec)</code> připojí <code>sloupec</code> do seznamu sloupců.</p></item>
  <item><p><code>get_selection()</code> vrací <code>Gtk.TreeSelection</code> přidružené k tomuto stromovému zobrazení.</p></item>
</list>

<p>Užitečné metody pro <code>Gtk.TreeViewColumn</code>:</p>
<list>
  <item><p><code>add_attribute(vykreslovač, atribut, hodnota)</code> přidá mapování atributu na tento sloupec. <code>atribut</code> je parametr <code>vykreslovače</code>, který má být nastaven na <code>hodnotu</code>.</p></item>
  <item><p><code>pack_start(vykreslovač, roztáhnout)</code> zabalí <code>vykreslovač</code> do začátku tohoto sloupce. Když je <code>roztáhnout</code> nastaveno na <code>False</code>, nebude si <code>vykreslovač</code> nárokovat víc místa, než potřebuje. Veškeré nevyužité místo je rovnoměrně rozděleno mezi buňky, kterém mají tento parametr nastavený na <code>True</code>.</p></item>
  <item><p><code>pack_end(vykreslovač, roztáhnout)</code> zabalí <code>vykreslovač</code> do konce tohoto sloupce. Když je <code>roztáhnout</code> nastaveno na <code>False</code>, nebude si <code>vykreslovač</code> nárokovat víc místa, než potřebuje. Veškeré nevyužité místo je rovnoměrně rozděleno mezi buňky, kterém mají tento parametr nastavený na <code>True</code>.</p></item>
  <item><p><code>set_sort_column_id(id_slupce_řazení)</code> nastaví sloupec z modelu, podle kterého by se měl tento sloupec (v zobrazení) řadit. Rovněž to zpřístupní záhlaví sloupce pro kliknutí.</p></item>
  <item><p><code>set_sort_indicator(nastavení)</code> nastaví, jestli se má v záhlaví sloupce zobrazovat malá šipka. Argument <code>nastavení</code> může být <code>True</code> (indikátor je zobrazen) nebo <code>False</code>.</p></item>
  <item><p><code>set_sort_order(pořadí)</code> změní pořadí, ve kterém je sloupec seřazen. <code>pořadí</code> může být <code>Gtk.SortType.ASCENDING</code> (vzestupné) nebo <code>Gtk.SortType.DESCENDING</code> (sestupné).</p></item>
</list>

</section>

<section id="combobox">
<title>Zobrazení: případ ComboBox</title>

<p><code>Gtk.ComboBox</code> poskytuje výběr z položek v rozbalovací nabídce, viz třeba <link xref="combobox.py">tento příklad</link>. Pro seznam s čistě textovými položkami lze použít také jednodušší <code>Gtk.ComboBoxText</code>. Obě verze mohou obsahovat vstupní pole.</p>

<p>Užitečné metody pro <code>Gtk.ComboBox</code>:</p>
<list>
  <item><p>Statická metoda <code>new_with_entry()</code> vytvoří nový prázdný <code>Gtk.ComboBox</code> se vstupním polem. Statická metoda <code>new_with_model(model)</code> jej vytvoří s modelem inicializovaným na <code>model</code>. A statická metodat <code>new_with_model_and_entry(model)</code> je kombinací dvou předchozích.</p></item>
  <item><p><code>get_active_iter()</code> vrací <code>Gtk.TreeIter</code> ukazující na právě aktivní položku. Pokud žádná aktivní položka neexistuje, je vráceno <code>None</code>.</p></item>
  <item><p><code>set_model(model)</code> nastaví model použitý tímto rozbalovacím seznamem na <code>model</code> a zruší nastavení předchozího nastaveného modelu (pokud nějaký byl). Pokud je <code>model</code> <code>None</code>, bude jen zrušeno nastavení předchozího. Upozorňujeme, že tato funkce nemaže vykreslovače buněk.</p></item>
  <item><p><code>set_entry_text_column(textový_sloupec)</code> nastavuje sloupec modelu, který by měl tento rozbalovací seznam použít k získávání řetězců, na <code>textový_sloupec</code>. Tento sloupec musí být typu <code>str</code> (to platí v případě, že rozbalovací seznam byl vytvořen s vlastností <code>"has-entry"</code> nastavenou na <code>True</code>).</p></item>
  <item><p><code>set_wrap_width(šířka)</code> nastavuje šířku zalamování rozbalovacího seznamu na <code>šířka</code>. Jedná se v zásadě o upřednostňovaný počet sloupců, když chcete, aby byl rozbalený seznam rozvržen do mřížky.</p></item>
</list>

<p>Užitečné metody pro <code>Gtk.ComboBoxText</code>:</p>
<list>
  <item><p>Statická metoda <code>new_with_entry()</code> vytvoří nový prázdný <code>Gtk.ComboBoxText</code> se vstupním polem.</p></item>
  <item><p><code>append_text(text)</code> připojí <code>text</code> do seznamu řetězců uchovaných v tomto rozbalovacím seznamu.</p></item>
  <item><p><code>get_active_text()</code> vrací aktuálně aktivní řetězec v rozbalovacím seznamu nebo <code>None</code>, když není nic vybráno. V případě, kdy má rozbalovací seznam vstupní pole, vrací tato funkce obsah tohoto pole (což nutně nemusí být žádná položka ze seznamu).</p></item>
</list>

</section>

<section id="cellrenderer">
<title>Zobrazení: vykreslování buněk</title>

<p>K vykreslení různých typů dat používá <code>View</code> objekty <code>Gtk.CellRenderer</code>.</p>

<p>Implementace <code>Gtk.CellRenderer</code> a užitečných metod:</p>
<list>
  <item><p><code>Gtk.CellRendererText</code> – vykresluje text v buňce.</p></item>
  <item><p><code>Gtk.CellRendererToggle</code> – vykresluje v buňce přepínací tlačítko nebo skupinový přepínač. Užitečné metody:</p>
    <list>
    <item><p><code>set_active(nastavení)</code> – aktivuje nebo deaktivuje vykreslování buňky</p></item>
    <item><p><code>get_active()</code> – vrací, jestli je vykreslování buňky aktivní</p></item>
    <item><p><code>set_radio(skupinový_přepínač)</code> – pokud je <code>skupinový_přepínač</code> <code>True</code>, bude vykreslovač buňky vykreslovat skupinový přepínač (tj. navzájem se vylučující přepínače), pokud je <code>False</code>, bude se vykreslovat zaškrtávací políčko (samostatná volba)</p></item>
    <item><p><code>get_radio()</code> – vrací, jestli vykreslujeme skupinové přepínače místo zaškrtávacích políček.</p></item>
    </list>
  </item>
  <item><p><code>Gtk.CellRendererPixbuf</code> – vykresluje obrázek v buňce</p></item>
  <item><p><code>Gtk.CellRendererCombo</code>  – vykresluje v buňce text; ale zatímco <code>Gtk.CellRendererText</code> poskytuje jednoduché vstupní pole pro úpravu textu, <code>Gtk.CellRendererCombo</code> poskytuje pro úpravu textu widget <code>Gtk.ComboBox</code>. Ten lze použít s nebo bez přidruženého widgetu <code>Gtk.Entry</code>, v závislosti na vlastnosti <code>"has-entry"</code>.</p></item>
  <item><p><code>Gtk.CellRendererProgress</code> – vykresluje v buňce číselnou hodnotu v podobě ukazatele průběhu; nad ukazatelem může zobrazit text</p></item>
  <item><p><code>Gtk.CellRendererSpinner</code> – vykresluje v buňce animovanou káču</p></item>
  <item><p><code>Gtk.CellRendererSpin</code> – vykresluje v buňce číselník</p></item>
  <item><p><code>Gtk.CellRendererAccel</code> – vykresluje v buňce klávesovou zkratku</p></item>
</list>

</section>

<section id="selection">
<title>Ovládání: výběr</title>

<p>Většina aplikací potřebuje používat nejen zobrazení dat, ale i přijímat vstupní události od uživatelů. To udělají jednoduše tak, že získají odkaz na objekt s výběrem a napojí se na signál <code>"changed"</code>.</p>

<code mime="text/x-python">
select = tree.get_selection()
select.connect("changed", on_tree_selection_changed)
</code>

<p>Pak k získání dat pro vybraný řádek:</p>

<code mime="text/x-python">
def on_tree_selection_changed(selection):
    model, treeiter = selection.get_selected()
    if treeiter != None:
        print "You selected", model[treeiter][0]
</code>

<p>Užitečné metody pro <code>Gtk.TreeSelection</code>:</p>

<list>
  <item><p><code>set_mode(typ)</code> nastaví typ výběru, kde typ může být něco z</p>
  <list>
    <item><p><code>Gtk.SelectionMode.NONE</code> – není možný žádný výběr</p></item>
    <item><p><code>Gtk.SelectionMode.SINGLE</code> – může být vybrán žádný nebo jeden prvek</p></item>
    <item><p><code>Gtk.SelectionMode.BROWSE</code> – je vybrán právě jeden prvek. V některých případech, jako na počátku nebo v průběhu vyhledávání, je možné, aby nebyl vybrán žádný prvek. To, co je opravdu vynucováno, je, že uživatel nemůže zrušit výběr aktuálně vybraného prvku, jedině může vybrat jiný.</p></item>
    <item><p><code>Gtk.SelectionMode.MULTIPLE</code> – může být vybrán libovolný počet prvků. Kliknutí přepne stav položky. Klávesu <key>Ctrl</key> lze používat k přidávání výběru a klávesu <key>Shift</key> k výběru rozsahu mezi zaměřenou a kliknutou položkou. Některé widgety mohou umožňovat výběr rozsahu prvků i postupem „klikni a táhni“.</p></item>
  </list>
  </item>
  <item><p><code>get_selected()</code> vrací dvojici <code>(model, stromový_iterátor)</code>, kde <code>model</code> je aktuální model a <code>stromový_iterátor</code> je <code>Gtk.TreeIter</code> ukazující na aktuálně vybraný řádek nebo <code>None</code>, když není žádný řádek vybrán. Metoda nepracuje, když je režim výběru nastaven na <code>Gtk.SelectionMode.MULTIPLE</code>. V tomto případě použijte místo toho <code>get_selected_rows()</code>, která vrací seznam instancí <code>Gtk.TreePath</code> se všemi vybranými řádky.</p></item>
</list>

</section>

<section id="references">
<title>Odkazy</title>

<list>
  <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTreeModel.html">GtkTreeModel</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTreeView.html">GtkTreeView</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkTreeViewColumn.html">GtkTreeViewColumn</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkComboBox.html">GtkComboBox</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk3/unstable/GtkCellRenderer.html">GtkCellRenderer</link></p></item>
</list>

</section>

</page>