File: gtk-migrating-GtkIconView.html

package info (click to toggle)
gtk%2B2.0 2.24.33-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie, trixie-proposed-updates, trixie-updates
  • size: 124,860 kB
  • sloc: ansic: 574,091; makefile: 5,171; sh: 4,618; xml: 1,193; python: 1,117; perl: 749; awk: 49; cpp: 34
file content (263 lines) | stat: -rw-r--r-- 14,565 bytes parent folder | download | duplicates (3)
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Migrating from GnomeIconList to GtkIconView: GTK+ 2 Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="index.html" title="GTK+ 2 Reference Manual">
<link rel="up" href="migrating.html" title="Part IV. Migrating from Previous Versions of GTK+">
<link rel="prev" href="new-features-GtkComboBox.html" title="New features">
<link rel="next" href="gtk-migrating-GtkAboutDialog.html" title="Migrating from GnomeAbout to GtkAboutDialog">
<meta name="generator" content="GTK-Doc V1.33.0 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
<td width="100%" align="left" class="shortcuts"></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="migrating.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="new-features-GtkComboBox.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gtk-migrating-GtkAboutDialog.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="chapter">
<div class="titlepage"><div><div><h2 class="title">
<a name="gtk-migrating-GtkIconView"></a>Migrating from GnomeIconList to GtkIconView</h2></div></div></div>
<p>
    Since version 2.6, GTK+ provides the <a class="link" href="GtkIconView.html" title="GtkIconView"><span class="type">GtkIconView</span></a> widget. It is similar in 
    functionality to the <span class="structname">GnomeIconList</span> widget in the 
    libgnomeui library, both widgets provide a way to lay out named icons in 
    a grid. The distinctive feature of the GTK+ widget is that it follows the 
    model-view pattern, allowing it to share the actual data (i.e. the names 
    and images of the icons) with other views.
  </p>
<p>
    <a class="link" href="GtkIconView.html" title="GtkIconView"><span class="type">GtkIconView</span></a> currently doesn't support some features found in 
    <span class="structname">GnomeIconList</span>. Icons can not be positioned freely, 
    the spacing is not customizable, and it is not possible to edit the names of 
    icons. 
  </p>
<p>
    To convert an application that uses <span class="structname">GnomeIconList</span> 
    to <a class="link" href="GtkIconView.html" title="GtkIconView"><span class="type">GtkIconView</span></a>, the first step is to organize your data in a <a class="link" href="GtkTreeModel.html" title="GtkTreeModel"><span class="type">GtkTreeModel</span></a>. 
    <span class="structname">GnomeIconList</span> lets you directly insert data with 
    <code class="function">gnome_icon_list_insert()</code> and <code class="function">gnome_icon_list_insert_pixbuf()</code> and their
    append variants. So, if you previously had a function to fill your icon 
    list similar to this one:
    </p>
<div class="informalexample">
  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
    <tbody>
      <tr>
        <td class="listing_lines" align="right"><pre>1
2
3
4
5
6
7
8</pre></td>
        <td class="listing_code"><pre class="programlisting"><span class="kt">void</span> 
<span class="nf">fill_icon_list</span> <span class="p">(</span><span class="n">GnomeIconList</span> <span class="o">*</span><span class="n">icon_list</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">gnome_icon_list_append</span> <span class="p">(</span><span class="n">icon_list</span><span class="p">,</span> <span class="s">&quot;file1.png&quot;</span><span class="p">,</span> <span class="s">&quot;Icon 1&quot;</span><span class="p">);</span>
  <span class="n">gnome_icon_list_append</span> <span class="p">(</span><span class="n">icon_list</span><span class="p">,</span> <span class="s">&quot;file2.png&quot;</span><span class="p">,</span> <span class="s">&quot;Icon 2&quot;</span><span class="p">);</span>

  <span class="cm">/* more icons ... */</span> 
<span class="p">}</span></pre></td>
      </tr>
    </tbody>
  </table>
</div>

<p>
    you will have to create a tree model, attach your icon view to it, and 
    fill the model:
    </p>
<div class="informalexample">
  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
    <tbody>
      <tr>
        <td class="listing_lines" align="right"><pre>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</pre></td>
        <td class="listing_code"><pre class="programlisting"><span class="k">enum</span> <span class="p">{</span> 
  <span class="n">PIXBUF_COLUMN</span><span class="p">,</span>
  <span class="n">TEXT_COLUMN</span><span class="p">,</span>

  <span class="cm">/* you can have more columns here, e.g */</span> 

  <span class="n">DATA_COLUMN</span>
<span class="p">};</span>
 
<span class="kt">void</span> 
<span class="nf">fill_model</span> <span class="p">(</span><span class="n">GtkListStore</span> <span class="o">*</span><span class="n">store</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">GtkTreeIter</span> <span class="n">iter</span><span class="p">;</span>
  <span class="n">GdkPixbuf</span> <span class="o">*</span><span class="n">pixbuf</span><span class="p">;</span>

  <span class="n">gtk_list_store_append</span> <span class="p">(</span><span class="n">store</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">iter</span><span class="p">);</span>
  <span class="n">pixbuf</span> <span class="o">=</span> <span class="n">gdk_pixbuf_new_from_file</span> <span class="p">(</span><span class="s">&quot;file1.png&quot;</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
  <span class="n">gtk_list_store_set</span> <span class="p">(</span><span class="n">store</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">iter</span><span class="p">,</span> <span class="n">PIXBUF_COLUMN</span><span class="p">,</span> <span class="n">pixbuf</span><span class="p">,</span> <span class="n">TEXT_COLUMN</span><span class="p">,</span> <span class="s">&quot;Icon 1&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">pixbuf</span><span class="p">);</span>

  <span class="n">gtk_list_store_append</span> <span class="p">(</span><span class="n">store</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">iter</span><span class="p">);</span>
  <span class="n">pixbuf</span> <span class="o">=</span> <span class="n">gdk_pixbuf_new_from_file</span> <span class="p">(</span><span class="s">&quot;file2.png&quot;</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
  <span class="n">gtk_list_store_set</span> <span class="p">(</span><span class="n">store</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">iter</span><span class="p">,</span> <span class="n">PIXBUF_COLUMN</span><span class="p">,</span> <span class="n">pixbuf</span><span class="p">,</span> <span class="n">TEXT_COLUMN</span><span class="p">,</span> <span class="s">&quot;Icon 2&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
  <span class="n">g_object_unref</span> <span class="p">(</span><span class="n">pixbuf</span><span class="p">);</span>

  <span class="cm">/* more icons ... */</span> 
<span class="p">}</span>

<span class="kt">int</span> 
<span class="nf">main</span> <span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
  <span class="n">GtkWidget</span> <span class="o">*</span><span class="n">icon_view</span><span class="p">;</span>
  <span class="n">GtkListStore</span> <span class="o">*</span><span class="n">store</span><span class="p">;</span>

  <span class="n">gtk_init</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">argc</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">argv</span><span class="p">);</span>

  <span class="cm">/* do other initialization... */</span>

  <span class="cm">/* construct the GtkIconView */</span>
  <span class="n">icon_view</span> <span class="o">=</span> <span class="n">gtk_icon_view_new</span> <span class="p">();</span>
  <span class="n">store</span> <span class="o">=</span> <span class="n">gtk_list_store_new</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">GDK_TYPE_PIXBUF</span><span class="p">,</span> <span class="n">G_TYPE_STRING</span><span class="p">,</span> <span class="n">G_TYPE_POINTER</span><span class="p">);</span>

  <span class="n">gtk_icon_view_set_pixbuf_column</span> <span class="p">(</span><span class="n">GTK_ICON_VIEW</span> <span class="p">(</span><span class="n">icon_view</span><span class="p">),</span> <span class="n">PIXBUF_COLUMN</span><span class="p">);</span>
  <span class="n">gtk_icon_view_set_text_column</span> <span class="p">(</span><span class="n">GTK_ICON_VIEW</span> <span class="p">(</span><span class="n">icon_view</span><span class="p">),</span> <span class="n">TEXT_COLUMN</span><span class="p">);</span>
  <span class="n">gtk_icon_view_set_model</span> <span class="p">(</span><span class="n">GTK_ICON_VIEW</span> <span class="p">(</span><span class="n">icon_view</span><span class="p">),</span> <span class="n">GTK_TREE_MODEL</span> <span class="p">(</span><span class="n">store</span><span class="p">));</span>

  <span class="n">fill_model</span> <span class="p">(</span><span class="n">store</span><span class="p">);</span>

  <span class="cm">/* ... */</span>
<span class="p">}</span></pre></td>
      </tr>
    </tbody>
  </table>
</div>

<p>
    This example uses a <a class="link" href="GtkListStore.html" title="GtkListStore"><span class="type">GtkListStore</span></a> as model, but part of the elegance of the 
    model-view pattern is that you can easily use another tree model implementation, 
    or even write your own custom tree model.
  </p>
<p>
    Your application may make use of extra data attached to the icons in the 
    <span class="structname">GnomeIconList</span> via <code class="function">gnome_icon_list_set_icon_data()</code> and 
    <code class="function">gnome_icon_list_get_icon_data()</code>. With <a class="link" href="GtkIconView.html" title="GtkIconView"><span class="type">GtkIconView</span></a> such data is most 
    conveniently stored in an extra column in the tree model, so you would 
    call a function like
    </p>
<div class="informalexample">
  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
    <tbody>
      <tr>
        <td class="listing_lines" align="right"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre></td>
        <td class="listing_code"><pre class="programlisting"><span class="kt">void</span> 
<span class="nf">set_icon_data</span> <span class="p">(</span><span class="n">GtkIconView</span> <span class="o">*</span><span class="n">icon_view</span><span class="p">,</span>
               <span class="n">gint</span>         <span class="n">idx</span><span class="p">,</span>
               <span class="n">gpointer</span>     <span class="n">data</span><span class="p">)</span>
<span class="p">{</span>
   <span class="n">GtkTreeModel</span> <span class="o">*</span><span class="n">model</span><span class="p">;</span>
   <span class="n">GtkTreeIter</span> <span class="n">iter</span><span class="p">;</span>

   <span class="n">model</span> <span class="o">=</span> <span class="n">gtk_icon_view_get_model</span> <span class="p">(</span><span class="n">icon_view</span><span class="p">);</span>

   <span class="k">if</span> <span class="p">(</span><span class="n">gtk_tree_model_iter_nth_child</span> <span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">iter</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">idx</span><span class="p">))</span>
     <span class="n">gtk_list_store_set</span> <span class="p">(</span><span class="n">GTK_LIST_STORE</span> <span class="p">(</span><span class="n">model</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">iter</span><span class="p">,</span> 
                         <span class="n">DATA_COLUMN</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span></pre></td>
      </tr>
    </tbody>
  </table>
</div>

<p>
    assuming that your tree model has a <code class="literal">DATA_COLUMN</code> of type 
    <code class="literal">G_TYPE_POINTER</code>.
  </p>
<p>
    There is a number of minor API differences between 
    <span class="structname">GnomeIconList</span> and 
    <span class="structname">GtkIconView</span>:
    </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem"><p>
       <span class="type">GnomeIconListMode</span> is replaced by the 
       <a class="link" href="GtkIconView.html#GtkIconView--orientation" title="The “orientation” property">orientation</a> 
       property of <span class="structname">GtkIconView</span>
     </p></li>
<li class="listitem"><p>
       <span class="structname">GtkIconView</span> can not be frozen in the same 
       way as <span class="structname">GnomeIconList</span> can with 
       <code class="function">gnome_icon_list_freeze()</code> and <code class="function">gnome_icon_list_thaw()</code>. Instead you can 
       replace the whole model of a <span class="structname">GtkIconView</span>, 
       instead of doing many small changes to the existing model.
     </p></li>
</ul></div>
<p>
  </p>
</div>
<div class="footer">
<hr>Generated by GTK-Doc V1.33.0</div>
</body>
</html>