Mercurial > hg > forks > geeqie
annotate src/view_dir_tree.c @ 2916:ae6cdcd69d9f default tip
Merge with upstream/master.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 14 May 2019 11:46:50 +0300 |
parents | 009f0a811472 |
children |
rev | line source |
---|---|
9 | 1 /* |
2350
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
2 * Copyright (C) 2006 John Ellis |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
3 * Copyright (C) 2008 - 2016 The Geeqie Team |
9 | 4 * |
5 * Author: John Ellis | |
6 * | |
2350
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
7 * This program is free software; you can redistribute it and/or modify |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
10 * (at your option) any later version. |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
11 * |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
15 * GNU General Public License for more details. |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
16 * |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
18 * with this program; if not, write to the Free Software Foundation, Inc., |
95507e596256
Update copyright in all files
Klaus Ethgen <Klaus@Ethgen.de>
parents:
2185
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
9 | 20 */ |
21 | |
281 | 22 #include "main.h" |
9 | 23 #include "view_dir_tree.h" |
24 | |
25 | |
26 #include "dnd.h" | |
27 #include "dupe.h" | |
586
122fc2223b42
split filelist.c to filefilter.c and filedata.c
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
512
diff
changeset
|
28 #include "filedata.h" |
9 | 29 #include "layout.h" |
30 #include "layout_image.h" | |
31 #include "layout_util.h" | |
32 #include "utilops.h" | |
33 #include "ui_fileops.h" | |
34 #include "ui_menu.h" | |
35 #include "ui_tree_edit.h" | |
380
41079d11eba7
Introduce a new struct ViewDir to handle directory views common
Laurent Monin <geeqie@norz.org>
parents:
356
diff
changeset
|
36 #include "view_dir.h" |
9 | 37 |
38 #include <gdk/gdkkeysyms.h> /* for keyboard values */ | |
39 | |
40 | |
979 | 41 #define VDTREE(_vd_) ((ViewDirInfoTree *)(_vd_->info)) |
9 | 42 |
43 | |
44 typedef struct _PathData PathData; | |
45 struct _PathData | |
46 { | |
47 gchar *name; | |
48 FileData *node; | |
49 }; | |
50 | |
51 | |
1630
9f2b903a22bc
do not call signal handler from vdtree_row_expanded
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1629
diff
changeset
|
52 static void vdtree_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *tpath, gpointer data); |
9 | 53 |
54 | |
55 /* | |
56 *---------------------------------------------------------------------------- | |
57 * utils | |
58 *---------------------------------------------------------------------------- | |
59 */ | |
60 | |
61 static void set_cursor(GtkWidget *widget, GdkCursorType cursor_type) | |
62 { | |
63 GdkCursor *cursor = NULL; | |
64 | |
2034
9297985567b5
use accessor functions
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
2021
diff
changeset
|
65 if (!widget || !gtk_widget_get_window(widget)) return; |
9 | 66 |
512
0896f486ec6f
Remove whitespace between function name and first parenthesis for the sake of consistency.
Laurent Monin <geeqie@norz.org>
parents:
475
diff
changeset
|
67 if (cursor_type > -1) cursor = gdk_cursor_new(cursor_type); |
2034
9297985567b5
use accessor functions
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
2021
diff
changeset
|
68 gdk_window_set_cursor(gtk_widget_get_window(widget), cursor); |
9 | 69 if (cursor) gdk_cursor_unref(cursor); |
70 gdk_flush(); | |
71 } | |
72 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
73 static void vdtree_busy_push(ViewDir *vd) |
9 | 74 { |
978
88298012a2be
Replace macros VDLIST_INFO() and VDTREE_INFO() by shorter VDLIST() and VDTREE(). VDLIST_INFO(vd, part) becomes VDLIST(vd)->part.
Laurent Monin <geeqie@norz.org>
parents:
943
diff
changeset
|
75 if (VDTREE(vd)->busy_ref == 0) set_cursor(vd->view, GDK_WATCH); |
88298012a2be
Replace macros VDLIST_INFO() and VDTREE_INFO() by shorter VDLIST() and VDTREE(). VDLIST_INFO(vd, part) becomes VDLIST(vd)->part.
Laurent Monin <geeqie@norz.org>
parents:
943
diff
changeset
|
76 VDTREE(vd)->busy_ref++; |
9 | 77 } |
78 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
79 static void vdtree_busy_pop(ViewDir *vd) |
9 | 80 { |
978
88298012a2be
Replace macros VDLIST_INFO() and VDTREE_INFO() by shorter VDLIST() and VDTREE(). VDLIST_INFO(vd, part) becomes VDLIST(vd)->part.
Laurent Monin <geeqie@norz.org>
parents:
943
diff
changeset
|
81 if (VDTREE(vd)->busy_ref == 1) set_cursor(vd->view, -1); |
88298012a2be
Replace macros VDLIST_INFO() and VDTREE_INFO() by shorter VDLIST() and VDTREE(). VDLIST_INFO(vd, part) becomes VDLIST(vd)->part.
Laurent Monin <geeqie@norz.org>
parents:
943
diff
changeset
|
82 if (VDTREE(vd)->busy_ref > 0) VDTREE(vd)->busy_ref--; |
9 | 83 } |
84 | |
1501
9ea21d03c41d
fixed vdlist_find_row return value
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1452
diff
changeset
|
85 gboolean vdtree_find_row(ViewDir *vd, FileData *fd, GtkTreeIter *iter, GtkTreeIter *parent) |
9 | 86 { |
87 GtkTreeModel *store; | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
88 gboolean valid; |
9 | 89 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
90 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 91 if (parent) |
92 { | |
93 valid = gtk_tree_model_iter_children(store, iter, parent); | |
94 } | |
95 else | |
96 { | |
97 valid = gtk_tree_model_get_iter_first(store, iter); | |
98 } | |
99 while (valid) | |
100 { | |
101 NodeData *nd; | |
102 GtkTreeIter found; | |
103 | |
104 gtk_tree_model_get(GTK_TREE_MODEL(store), iter, DIR_COLUMN_POINTER, &nd, -1); | |
105 if (nd->fd == fd) return TRUE; | |
106 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
107 if (vdtree_find_row(vd, fd, &found, iter)) |
9 | 108 { |
109 memcpy(iter, &found, sizeof(found)); | |
110 return TRUE; | |
111 } | |
112 | |
113 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter); | |
114 } | |
115 | |
116 return FALSE; | |
117 } | |
118 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
119 static void vdtree_icon_set_by_iter(ViewDir *vd, GtkTreeIter *iter, GdkPixbuf *pixbuf) |
9 | 120 { |
121 GtkTreeModel *store; | |
122 GdkPixbuf *old; | |
123 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
124 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 125 gtk_tree_model_get(store, iter, DIR_COLUMN_ICON, &old, -1); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
126 if (old != vd->pf->deny) |
9 | 127 { |
128 gtk_tree_store_set(GTK_TREE_STORE(store), iter, DIR_COLUMN_ICON, pixbuf, -1); | |
129 } | |
130 } | |
131 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
132 static void vdtree_expand_by_iter(ViewDir *vd, GtkTreeIter *iter, gboolean expand) |
9 | 133 { |
134 GtkTreeModel *store; | |
135 GtkTreePath *tpath; | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
136 NodeData *nd; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
137 FileData *fd = NULL; |
9 | 138 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
139 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 140 tpath = gtk_tree_model_get_path(store, iter); |
1630
9f2b903a22bc
do not call signal handler from vdtree_row_expanded
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1629
diff
changeset
|
141 |
9 | 142 if (expand) |
143 { | |
1630
9f2b903a22bc
do not call signal handler from vdtree_row_expanded
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1629
diff
changeset
|
144 /* block signal handler, icon is set here, the caller of vdtree_expand_by_iter must make sure |
9f2b903a22bc
do not call signal handler from vdtree_row_expanded
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1629
diff
changeset
|
145 that the iter is populated */ |
9f2b903a22bc
do not call signal handler from vdtree_row_expanded
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1629
diff
changeset
|
146 g_signal_handlers_block_by_func(G_OBJECT(vd->view), vdtree_row_expanded, vd); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
147 gtk_tree_view_expand_row(GTK_TREE_VIEW(vd->view), tpath, FALSE); |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
148 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
149 fd = (nd) ? nd->fd : NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
150 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
151 if (fd && islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
152 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
153 vdtree_icon_set_by_iter(vd, iter, vd->pf->link); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
154 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
155 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
156 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
157 vdtree_icon_set_by_iter(vd, iter, vd->pf->open); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
158 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
159 |
1630
9f2b903a22bc
do not call signal handler from vdtree_row_expanded
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1629
diff
changeset
|
160 g_signal_handlers_unblock_by_func(G_OBJECT(vd->view), vdtree_row_expanded, vd); |
9 | 161 } |
162 else | |
163 { | |
1630
9f2b903a22bc
do not call signal handler from vdtree_row_expanded
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1629
diff
changeset
|
164 /* signal handler vdtree_row_collapsed is called, it updates the icon */ |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
165 gtk_tree_view_collapse_row(GTK_TREE_VIEW(vd->view), tpath); |
9 | 166 } |
167 gtk_tree_path_free(tpath); | |
168 } | |
169 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
170 static void vdtree_expand_by_data(ViewDir *vd, FileData *fd, gboolean expand) |
9 | 171 { |
172 GtkTreeIter iter; | |
173 | |
389
cc1094d922dd
Merge few more vdlist/vdtree functions.
Laurent Monin <geeqie@norz.org>
parents:
388
diff
changeset
|
174 if (vd_find_row(vd, fd, &iter)) |
9 | 175 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
176 vdtree_expand_by_iter(vd, &iter, expand); |
9 | 177 } |
178 } | |
179 | |
180 static void vdtree_node_free(NodeData *nd) | |
181 { | |
182 if (!nd) return; | |
183 | |
1926
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
184 if (nd->fd) file_data_unref(nd->fd); |
9 | 185 g_free(nd); |
186 } | |
187 | |
188 /* | |
189 *---------------------------------------------------------------------------- | |
190 * dnd | |
191 *---------------------------------------------------------------------------- | |
192 */ | |
193 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
194 static gboolean vdtree_dnd_drop_expand_cb(gpointer data) |
9 | 195 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
196 ViewDir *vd = data; |
9 | 197 GtkTreeIter iter; |
198 | |
394
ae99e42db2f1
Merge dirlist/dirview dnd code.
Laurent Monin <geeqie@norz.org>
parents:
389
diff
changeset
|
199 if (vd->drop_fd && vd_find_row(vd, vd->drop_fd, &iter)) |
9 | 200 { |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
201 vdtree_populate_path_by_iter(vd, &iter, FALSE, vd->dir_fd); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
202 vdtree_expand_by_data(vd, vd->drop_fd, TRUE); |
9 | 203 } |
204 | |
1523
e52aabe8fc7a
Fix up event source ids type: gint -> guint.
Laurent Monin <geeqie@norz.org>
parents:
1501
diff
changeset
|
205 VDTREE(vd)->drop_expand_id = 0; |
9 | 206 return FALSE; |
207 } | |
208 | |
407
f441b932ed5c
Rename vd_drop_update() to vd_dnd_drop_update().
Laurent Monin <geeqie@norz.org>
parents:
406
diff
changeset
|
209 static void vdtree_dnd_drop_expand_cancel(ViewDir *vd) |
9 | 210 { |
1523
e52aabe8fc7a
Fix up event source ids type: gint -> guint.
Laurent Monin <geeqie@norz.org>
parents:
1501
diff
changeset
|
211 if (VDTREE(vd)->drop_expand_id) |
e52aabe8fc7a
Fix up event source ids type: gint -> guint.
Laurent Monin <geeqie@norz.org>
parents:
1501
diff
changeset
|
212 { |
e52aabe8fc7a
Fix up event source ids type: gint -> guint.
Laurent Monin <geeqie@norz.org>
parents:
1501
diff
changeset
|
213 g_source_remove(VDTREE(vd)->drop_expand_id); |
e52aabe8fc7a
Fix up event source ids type: gint -> guint.
Laurent Monin <geeqie@norz.org>
parents:
1501
diff
changeset
|
214 VDTREE(vd)->drop_expand_id = 0; |
e52aabe8fc7a
Fix up event source ids type: gint -> guint.
Laurent Monin <geeqie@norz.org>
parents:
1501
diff
changeset
|
215 } |
9 | 216 } |
217 | |
407
f441b932ed5c
Rename vd_drop_update() to vd_dnd_drop_update().
Laurent Monin <geeqie@norz.org>
parents:
406
diff
changeset
|
218 static void vdtree_dnd_drop_expand(ViewDir *vd) |
9 | 219 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
220 vdtree_dnd_drop_expand_cancel(vd); |
978
88298012a2be
Replace macros VDLIST_INFO() and VDTREE_INFO() by shorter VDLIST() and VDTREE(). VDLIST_INFO(vd, part) becomes VDLIST(vd)->part.
Laurent Monin <geeqie@norz.org>
parents:
943
diff
changeset
|
221 VDTREE(vd)->drop_expand_id = g_timeout_add(1000, vdtree_dnd_drop_expand_cb, vd); |
9 | 222 } |
223 | |
224 /* | |
225 *---------------------------------------------------------------------------- | |
226 * parts lists | |
227 *---------------------------------------------------------------------------- | |
228 */ | |
229 | |
230 static GList *parts_list(const gchar *path) | |
231 { | |
232 GList *list = NULL; | |
233 const gchar *strb, *strp; | |
234 gint l; | |
235 | |
236 strp = path; | |
237 | |
726
5166ed61c537
Use G_DIR_SEPARATOR where applicable.
Laurent Monin <geeqie@norz.org>
parents:
725
diff
changeset
|
238 if (*strp != G_DIR_SEPARATOR) return NULL; |
9 | 239 |
240 strp++; | |
241 strb = strp; | |
242 l = 0; | |
243 | |
244 while (*strp != '\0') | |
245 { | |
726
5166ed61c537
Use G_DIR_SEPARATOR where applicable.
Laurent Monin <geeqie@norz.org>
parents:
725
diff
changeset
|
246 if (*strp == G_DIR_SEPARATOR) |
9 | 247 { |
248 if (l > 0) list = g_list_prepend(list, g_strndup(strb, l)); | |
249 strp++; | |
250 strb = strp; | |
251 l = 0; | |
252 } | |
253 else | |
254 { | |
255 strp++; | |
256 l++; | |
257 } | |
258 } | |
259 if (l > 0) list = g_list_prepend(list, g_strndup(strb, l)); | |
260 | |
261 list = g_list_reverse(list); | |
262 | |
725
ee5f1f4fd7e7
Use G_DIR_SEPARATOR_S where applicable.
Laurent Monin <geeqie@norz.org>
parents:
673
diff
changeset
|
263 list = g_list_prepend(list, g_strdup(G_DIR_SEPARATOR_S)); |
9 | 264 |
265 return list; | |
266 } | |
267 | |
268 static void parts_list_free(GList *list) | |
269 { | |
270 GList *work = list; | |
271 while (work) | |
272 { | |
273 PathData *pd = work->data; | |
274 g_free(pd->name); | |
275 g_free(pd); | |
276 work = work->next; | |
277 } | |
278 | |
279 g_list_free(list); | |
280 } | |
281 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
282 static GList *parts_list_add_node_points(ViewDir *vd, GList *list) |
9 | 283 { |
284 GList *work; | |
285 GtkTreeModel *store; | |
286 GtkTreeIter iter; | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
287 gboolean valid; |
9 | 288 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
289 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 290 valid = gtk_tree_model_get_iter_first(store, &iter); |
291 | |
292 work = list; | |
293 while (work) | |
294 { | |
295 PathData *pd; | |
296 FileData *fd = NULL; | |
297 | |
298 pd = g_new0(PathData, 1); | |
299 pd->name = work->data; | |
300 | |
301 while (valid && !fd) | |
302 { | |
303 NodeData *nd; | |
304 | |
305 gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1); | |
1926
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
306 if (nd->fd && strcmp(nd->fd->name, pd->name) == 0) |
9 | 307 { |
308 fd = nd->fd; | |
309 } | |
310 else | |
311 { | |
312 valid = gtk_tree_model_iter_next(store, &iter); | |
313 } | |
314 } | |
315 | |
316 pd->node = fd; | |
317 work->data = pd; | |
318 | |
319 if (fd) | |
320 { | |
321 GtkTreeIter parent; | |
322 memcpy(&parent, &iter, sizeof(parent)); | |
323 valid = gtk_tree_model_iter_children(store, &iter, &parent); | |
324 } | |
325 | |
326 work = work->next; | |
327 } | |
328 | |
329 return list; | |
330 } | |
331 | |
332 | |
333 /* | |
334 *---------------------------------------------------------------------------- | |
335 * node traversal, management | |
336 *---------------------------------------------------------------------------- | |
337 */ | |
338 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
339 static gboolean vdtree_find_iter_by_data(ViewDir *vd, GtkTreeIter *parent, NodeData *nd, GtkTreeIter *iter) |
9 | 340 { |
341 GtkTreeModel *store; | |
342 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
343 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 344 if (!nd || !gtk_tree_model_iter_children(store, iter, parent)) return -1; |
345 do { | |
346 NodeData *cnd; | |
347 | |
348 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &cnd, -1); | |
349 if (cnd == nd) return TRUE; | |
350 } while (gtk_tree_model_iter_next(store, iter)); | |
351 | |
352 return FALSE; | |
353 } | |
354 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
355 static NodeData *vdtree_find_iter_by_name(ViewDir *vd, GtkTreeIter *parent, const gchar *name, GtkTreeIter *iter) |
9 | 356 { |
357 GtkTreeModel *store; | |
358 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
359 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 360 if (!name || !gtk_tree_model_iter_children(store, iter, parent)) return NULL; |
361 do { | |
362 NodeData *nd; | |
363 | |
364 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); | |
365 if (nd && strcmp(nd->fd->name, name) == 0) return nd; | |
366 } while (gtk_tree_model_iter_next(store, iter)); | |
367 | |
368 return NULL; | |
369 } | |
370 | |
1232
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
371 static NodeData *vdtree_find_iter_by_fd(ViewDir *vd, GtkTreeIter *parent, FileData *fd, GtkTreeIter *iter) |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
372 { |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
373 GtkTreeModel *store; |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
374 |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
375 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
376 if (!fd || !gtk_tree_model_iter_children(store, iter, parent)) return NULL; |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
377 do { |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
378 NodeData *nd; |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
379 |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
380 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
381 if (nd && nd->fd == fd) return nd; |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
382 } while (gtk_tree_model_iter_next(store, iter)); |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
383 |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
384 return NULL; |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
385 } |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
386 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
387 static void vdtree_add_by_data(ViewDir *vd, FileData *fd, GtkTreeIter *parent) |
9 | 388 { |
389 GtkTreeStore *store; | |
390 GtkTreeIter child; | |
391 NodeData *nd; | |
392 GdkPixbuf *pixbuf; | |
393 NodeData *end; | |
394 GtkTreeIter empty; | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
395 gchar *link = NULL; |
9 | 396 |
397 if (!fd) return; | |
398 | |
399 if (access_file(fd->path, R_OK | X_OK)) | |
400 { | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
401 if (islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
402 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
403 pixbuf = vd->pf->link; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
404 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
405 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
406 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
407 pixbuf = vd->pf->close; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
408 } |
9 | 409 } |
410 else | |
411 { | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
412 pixbuf = vd->pf->deny; |
9 | 413 } |
414 | |
415 nd = g_new0(NodeData, 1); | |
416 nd->fd = fd; | |
907
598938add3af
added notification handler to view_dir
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
902
diff
changeset
|
417 nd->version = fd->version; |
9 | 418 nd->expanded = FALSE; |
419 nd->last_update = time(NULL); | |
420 | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
421 if (islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
422 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
423 link = realpath(fd->path, NULL); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
424 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
425 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
426 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
427 link = NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
428 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
429 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
430 store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view))); |
9 | 431 gtk_tree_store_append(store, &child, parent); |
432 gtk_tree_store_set(store, &child, DIR_COLUMN_POINTER, nd, | |
433 DIR_COLUMN_ICON, pixbuf, | |
434 DIR_COLUMN_NAME, nd->fd->name, | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
435 DIR_COLUMN_LINK, link, |
9 | 436 DIR_COLUMN_COLOR, FALSE, -1); |
437 | |
438 /* all nodes are created with an "empty" node, so that the expander is shown | |
439 * this is removed when the child is populated */ | |
440 end = g_new0(NodeData, 1); | |
1926
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
441 end->fd = NULL; |
9 | 442 end->expanded = TRUE; |
443 | |
444 gtk_tree_store_append(store, &empty, &child); | |
445 gtk_tree_store_set(store, &empty, DIR_COLUMN_POINTER, end, | |
446 DIR_COLUMN_NAME, "empty", -1); | |
447 | |
448 if (parent) | |
449 { | |
450 NodeData *pnd; | |
451 GtkTreePath *tpath; | |
452 | |
453 gtk_tree_model_get(GTK_TREE_MODEL(store), parent, DIR_COLUMN_POINTER, &pnd, -1); | |
454 tpath = gtk_tree_model_get_path(GTK_TREE_MODEL(store), parent); | |
320
bd97f1e60100
Move more options to ConfOptions.
Laurent Monin <geeqie@norz.org>
parents:
318
diff
changeset
|
455 if (options->tree_descend_subdirs && |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
456 gtk_tree_view_row_expanded(GTK_TREE_VIEW(vd->view), tpath) && |
9 | 457 !nd->expanded) |
458 { | |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
459 vdtree_populate_path_by_iter(vd, &child, FALSE, vd->dir_fd); |
9 | 460 } |
461 gtk_tree_path_free(tpath); | |
462 } | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
463 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
464 g_free(link); |
9 | 465 } |
466 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
467 gboolean vdtree_populate_path_by_iter(ViewDir *vd, GtkTreeIter *iter, gboolean force, FileData *target_fd) |
9 | 468 { |
469 GtkTreeModel *store; | |
470 GList *list; | |
471 GList *work; | |
472 GList *old; | |
473 time_t current_time; | |
474 GtkTreeIter child; | |
475 NodeData *nd; | |
2392
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
476 gboolean add_hidden = FALSE; |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
477 gchar *link = NULL; |
9 | 478 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
479 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 480 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); |
481 | |
482 if (!nd) return FALSE; | |
483 | |
484 current_time = time(NULL); | |
442 | 485 |
9 | 486 if (nd->expanded) |
487 { | |
1926
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
488 if (!nd->fd || !isdir(nd->fd->path)) |
9 | 489 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
490 if (vd->click_fd == nd->fd) vd->click_fd = NULL; |
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
491 if (vd->drop_fd == nd->fd) vd->drop_fd = NULL; |
9 | 492 gtk_tree_store_remove(GTK_TREE_STORE(store), iter); |
493 vdtree_node_free(nd); | |
494 return FALSE; | |
495 } | |
995 | 496 if (!force && current_time - nd->last_update < 2) |
943
80a103f6e5a3
improved updating of view_dir_tree
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
916
diff
changeset
|
497 { |
80a103f6e5a3
improved updating of view_dir_tree
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
916
diff
changeset
|
498 DEBUG_1("Too frequent update of %s", nd->fd->path); |
80a103f6e5a3
improved updating of view_dir_tree
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
916
diff
changeset
|
499 return TRUE; |
80a103f6e5a3
improved updating of view_dir_tree
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
916
diff
changeset
|
500 } |
2018
04f3a395bb8f
update file data structure
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1927
diff
changeset
|
501 file_data_check_changed_files(nd->fd); /* make sure we have recent info */ |
9 | 502 } |
503 | |
504 /* when hidden files are not enabled, and the user enters a hidden path, | |
505 * allow the tree to display that path by specifically inserting the hidden entries | |
506 */ | |
356
ba4edae270d6
Rename show_dot_files to show_hidden_files.
Laurent Monin <geeqie@norz.org>
parents:
355
diff
changeset
|
507 if (!options->file_filter.show_hidden_files && |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
508 target_fd && |
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
509 strncmp(nd->fd->path, target_fd->path, strlen(nd->fd->path)) == 0) |
9 | 510 { |
511 gint n; | |
512 | |
513 n = strlen(nd->fd->path); | |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
514 if (target_fd->path[n] == G_DIR_SEPARATOR && target_fd->path[n+1] == '.') |
2392
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
515 add_hidden = TRUE; |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
516 } |
9 | 517 |
2392
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
518 if (nd->expanded && (!force && !add_hidden) && nd->fd->version == nd->version) |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
519 return TRUE; |
9 | 520 |
2392
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
521 vdtree_busy_push(vd); |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
522 |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
523 filelist_read(nd->fd, NULL, &list); |
9 | 524 |
2392
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
525 if (add_hidden) |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
526 { |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
527 gint n; |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
528 gchar *name8; |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
529 |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
530 n = strlen(nd->fd->path) + 1; |
9 | 531 |
2392
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
532 while (target_fd->path[n] != '\0' && target_fd->path[n] != G_DIR_SEPARATOR) n++; |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
533 name8 = g_strndup(target_fd->path, n); |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
534 |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
535 if (isdir(name8)) |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
536 { |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
537 list = g_list_prepend(list, file_data_new_dir(name8)); |
9 | 538 } |
2392
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
539 |
335b038e401c
Fix hidden directories not showing in a tree view
Maciej S. Szmigiero <mail@maciej.szmigiero.name>
parents:
2350
diff
changeset
|
540 g_free(name8); |
9 | 541 } |
542 | |
543 old = NULL; | |
544 if (gtk_tree_model_iter_children(store, &child, iter)) | |
545 { | |
546 do { | |
547 NodeData *cnd; | |
548 | |
549 gtk_tree_model_get(store, &child, DIR_COLUMN_POINTER, &cnd, -1); | |
550 old = g_list_prepend(old, cnd); | |
551 } while (gtk_tree_model_iter_next(store, &child)); | |
552 } | |
553 | |
554 work = list; | |
555 while (work) | |
556 { | |
557 FileData *fd; | |
558 | |
559 fd = work->data; | |
560 work = work->next; | |
561 | |
562 if (strcmp(fd->name, ".") == 0 || strcmp(fd->name, "..") == 0) | |
563 { | |
138
5be5d1c53016
replaced gchar* path with FileData *fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
125
diff
changeset
|
564 file_data_unref(fd); |
9 | 565 } |
566 else | |
567 { | |
568 NodeData *cnd; | |
569 | |
1232
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
570 cnd = vdtree_find_iter_by_fd(vd, iter, fd, &child); |
9 | 571 if (cnd) |
572 { | |
1232
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
573 if (cnd->expanded && cnd->version != fd->version) |
9 | 574 { |
1232
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
575 vdtree_populate_path_by_iter(vd, &child, FALSE, target_fd); |
9 | 576 } |
577 | |
1232
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
578 gtk_tree_store_set(GTK_TREE_STORE(store), &child, DIR_COLUMN_NAME, fd->name, -1); |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
579 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
580 if (islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
581 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
582 link = realpath(fd->path, NULL); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
583 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
584 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
585 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
586 link = NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
587 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
588 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
589 gtk_tree_store_set(GTK_TREE_STORE(store), &child, DIR_COLUMN_LINK, link, -1); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
590 |
1232
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
591 cnd->version = fd->version; |
83741493adbe
do not enter a directory after rename
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1055
diff
changeset
|
592 old = g_list_remove(old, cnd); |
138
5be5d1c53016
replaced gchar* path with FileData *fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
125
diff
changeset
|
593 file_data_unref(fd); |
9 | 594 } |
595 else | |
596 { | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
597 vdtree_add_by_data(vd, fd, iter); |
9 | 598 } |
599 } | |
600 } | |
601 | |
602 work = old; | |
603 while (work) | |
604 { | |
605 NodeData *cnd = work->data; | |
606 work = work->next; | |
607 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
608 if (vd->click_fd == cnd->fd) vd->click_fd = NULL; |
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
609 if (vd->drop_fd == cnd->fd) vd->drop_fd = NULL; |
9 | 610 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
611 if (vdtree_find_iter_by_data(vd, iter, cnd, &child)) |
9 | 612 { |
613 gtk_tree_store_remove(GTK_TREE_STORE(store), &child); | |
614 vdtree_node_free(cnd); | |
615 } | |
616 } | |
617 | |
618 g_list_free(old); | |
619 g_list_free(list); | |
620 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
621 vdtree_busy_pop(vd); |
9 | 622 |
623 nd->expanded = TRUE; | |
624 nd->last_update = current_time; | |
625 | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
626 g_free(link); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
627 |
9 | 628 return TRUE; |
629 } | |
630 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
631 FileData *vdtree_populate_path(ViewDir *vd, FileData *target_fd, gboolean expand, gboolean force) |
9 | 632 { |
633 GList *list; | |
634 GList *work; | |
635 FileData *fd = NULL; | |
636 | |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
637 if (!target_fd) return NULL; |
9 | 638 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
639 vdtree_busy_push(vd); |
9 | 640 |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
641 list = parts_list(target_fd->path); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
642 list = parts_list_add_node_points(vd, list); |
9 | 643 |
644 work = list; | |
645 while (work) | |
646 { | |
647 PathData *pd = work->data; | |
648 if (pd->node == NULL) | |
649 { | |
650 PathData *parent_pd; | |
651 GtkTreeIter parent_iter; | |
652 GtkTreeIter iter; | |
653 NodeData *nd; | |
654 | |
655 if (work == list) | |
656 { | |
657 /* should not happen */ | |
673
c9c2bc042e10
Do not use printf() directly but use new wrapper function log_printf() instead.
Laurent Monin <geeqie@norz.org>
parents:
586
diff
changeset
|
658 log_printf("vdtree warning, root node not found\n"); |
9 | 659 parts_list_free(list); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
660 vdtree_busy_pop(vd); |
9 | 661 return NULL; |
662 } | |
663 | |
664 parent_pd = work->prev->data; | |
665 | |
389
cc1094d922dd
Merge few more vdlist/vdtree functions.
Laurent Monin <geeqie@norz.org>
parents:
388
diff
changeset
|
666 if (!vd_find_row(vd, parent_pd->node, &parent_iter) || |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
667 !vdtree_populate_path_by_iter(vd, &parent_iter, force, target_fd) || |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
668 (nd = vdtree_find_iter_by_name(vd, &parent_iter, pd->name, &iter)) == NULL) |
9 | 669 { |
673
c9c2bc042e10
Do not use printf() directly but use new wrapper function log_printf() instead.
Laurent Monin <geeqie@norz.org>
parents:
586
diff
changeset
|
670 log_printf("vdtree warning, aborted at %s\n", parent_pd->name); |
9 | 671 parts_list_free(list); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
672 vdtree_busy_pop(vd); |
9 | 673 return NULL; |
674 } | |
675 | |
676 pd->node = nd->fd; | |
677 | |
678 if (pd->node) | |
679 { | |
680 if (expand) | |
681 { | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
682 vdtree_expand_by_iter(vd, &parent_iter, TRUE); |
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
683 vdtree_expand_by_iter(vd, &iter, TRUE); |
9 | 684 } |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
685 vdtree_populate_path_by_iter(vd, &iter, force, target_fd); |
9 | 686 } |
687 } | |
688 else | |
689 { | |
690 GtkTreeIter iter; | |
691 | |
389
cc1094d922dd
Merge few more vdlist/vdtree functions.
Laurent Monin <geeqie@norz.org>
parents:
388
diff
changeset
|
692 if (vd_find_row(vd, pd->node, &iter)) |
9 | 693 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
694 if (expand) vdtree_expand_by_iter(vd, &iter, TRUE); |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
695 vdtree_populate_path_by_iter(vd, &iter, force, target_fd); |
9 | 696 } |
697 } | |
698 | |
699 work = work->next; | |
700 } | |
701 | |
702 work = g_list_last(list); | |
703 if (work) | |
704 { | |
705 PathData *pd = work->data; | |
706 fd = pd->node; | |
707 } | |
708 parts_list_free(list); | |
709 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
710 vdtree_busy_pop(vd); |
9 | 711 |
712 return fd; | |
713 } | |
714 | |
715 /* | |
716 *---------------------------------------------------------------------------- | |
717 * access | |
718 *---------------------------------------------------------------------------- | |
719 */ | |
720 | |
1437 | 721 static gboolean selection_is_ok = FALSE; |
9 | 722 |
723 static gboolean vdtree_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath, | |
442 | 724 gboolean path_currently_selected, gpointer data) |
9 | 725 { |
726 return selection_is_ok; | |
727 } | |
728 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
729 gboolean vdtree_set_fd(ViewDir *vd, FileData *dir_fd) |
9 | 730 { |
731 FileData *fd; | |
732 GtkTreeIter iter; | |
733 | |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
734 if (!dir_fd) return FALSE; |
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
735 if (vd->dir_fd == dir_fd) return TRUE; |
9 | 736 |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
737 file_data_unref(vd->dir_fd); |
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
738 vd->dir_fd = file_data_ref(dir_fd);; |
9 | 739 |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
740 fd = vdtree_populate_path(vd, vd->dir_fd, TRUE, FALSE); |
9 | 741 |
742 if (!fd) return FALSE; | |
743 | |
389
cc1094d922dd
Merge few more vdlist/vdtree functions.
Laurent Monin <geeqie@norz.org>
parents:
388
diff
changeset
|
744 if (vd_find_row(vd, fd, &iter)) |
9 | 745 { |
746 GtkTreeModel *store; | |
1629
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
747 GtkTreePath *tpath, *old_tpath; |
1628
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
748 GtkTreeSelection *selection; |
9 | 749 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
750 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
9 | 751 |
1628
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
752 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vd->view)); |
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
753 |
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
754 /* hack, such that selection is only allowed to be changed from here */ |
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
755 selection_is_ok = TRUE; |
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
756 gtk_tree_selection_select_iter(selection, &iter); |
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
757 selection_is_ok = FALSE; |
ac33c60e405e
simplified the code around vd_select_row
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1523
diff
changeset
|
758 |
1629
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
759 gtk_tree_view_get_cursor(GTK_TREE_VIEW(vd->view), &old_tpath, NULL); |
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
760 tpath = gtk_tree_model_get_path(store, &iter); |
2185
c14a1d8e6aa4
Trim trailing white spaces on empty lines.
Laurent Monin <zas@norz.org>
parents:
2179
diff
changeset
|
761 |
1629
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
762 if (!old_tpath || gtk_tree_path_compare(tpath, old_tpath) != 0) |
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
763 { |
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
764 /* setting the cursor scrolls the view; do not do that unless it is necessary */ |
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
765 gtk_tree_view_set_cursor(GTK_TREE_VIEW(vd->view), tpath, NULL, FALSE); |
2185
c14a1d8e6aa4
Trim trailing white spaces on empty lines.
Laurent Monin <zas@norz.org>
parents:
2179
diff
changeset
|
766 |
1631
d80c4b8b3179
better implementation of tree_view_row_get_visibility,
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1630
diff
changeset
|
767 /* gtk_tree_view_set_cursor scrolls the window itself, but it sometimes |
d80c4b8b3179
better implementation of tree_view_row_get_visibility,
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1630
diff
changeset
|
768 does not work (switch from dir_list to dir_tree) */ |
d80c4b8b3179
better implementation of tree_view_row_get_visibility,
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1630
diff
changeset
|
769 tree_view_row_make_visible(GTK_TREE_VIEW(vd->view), &iter, TRUE); |
1629
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
770 } |
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
771 gtk_tree_path_free(tpath); |
50e2ef7fcfa8
reduced jumping of directory tree when user clicks on folders
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1628
diff
changeset
|
772 gtk_tree_path_free(old_tpath); |
9 | 773 } |
774 | |
775 return TRUE; | |
776 } | |
777 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
778 void vdtree_refresh(ViewDir *vd) |
9 | 779 { |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
780 vdtree_populate_path(vd, vd->dir_fd, FALSE, TRUE); |
9 | 781 } |
782 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
783 const gchar *vdtree_row_get_path(ViewDir *vd, gint row) |
9 | 784 { |
673
c9c2bc042e10
Do not use printf() directly but use new wrapper function log_printf() instead.
Laurent Monin <geeqie@norz.org>
parents:
586
diff
changeset
|
785 log_printf("FIXME: no get row path\n"); |
9 | 786 return NULL; |
787 } | |
788 | |
789 /* | |
790 *---------------------------------------------------------------------------- | |
791 * callbacks | |
792 *---------------------------------------------------------------------------- | |
793 */ | |
794 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
795 gboolean vdtree_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) |
9 | 796 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
797 ViewDir *vd = data; |
9 | 798 GtkTreePath *tpath; |
799 GtkTreeIter iter; | |
800 FileData *fd = NULL; | |
801 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
802 gtk_tree_view_get_cursor(GTK_TREE_VIEW(vd->view), &tpath, NULL); |
9 | 803 if (tpath) |
804 { | |
805 GtkTreeModel *store; | |
806 NodeData *nd; | |
807 | |
808 store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); | |
809 gtk_tree_model_get_iter(store, &iter, tpath); | |
810 gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1); | |
811 | |
812 gtk_tree_path_free(tpath); | |
813 | |
814 fd = (nd) ? nd->fd : NULL; | |
815 } | |
816 | |
817 switch (event->keyval) | |
818 { | |
2036
472c094c0154
changed GDK_<key> to GDK_KEY_<key>
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
2034
diff
changeset
|
819 case GDK_KEY_Menu: |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
820 vd->click_fd = fd; |
383
e2edfa5524d4
Move some dnd common code from view_dir_list.c and view_dir_tree.c
Laurent Monin <geeqie@norz.org>
parents:
382
diff
changeset
|
821 vd_color_set(vd, vd->click_fd, TRUE); |
9 | 822 |
388
5e8bef8d014a
Make directory view popup menu common and move it to view_dir.{c,h}.
Laurent Monin <geeqie@norz.org>
parents:
384
diff
changeset
|
823 vd->popup = vd_pop_menu(vd, vd->click_fd); |
395
3df085acd9f9
Move common menu position callback to view_dir.c.
Laurent Monin <geeqie@norz.org>
parents:
394
diff
changeset
|
824 gtk_menu_popup(GTK_MENU(vd->popup), NULL, NULL, vd_menu_position_cb, vd, 0, GDK_CURRENT_TIME); |
9 | 825 |
826 return TRUE; | |
827 break; | |
2036
472c094c0154
changed GDK_<key> to GDK_KEY_<key>
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
2034
diff
changeset
|
828 case GDK_KEY_plus: |
472c094c0154
changed GDK_<key> to GDK_KEY_<key>
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
2034
diff
changeset
|
829 case GDK_KEY_Right: |
472c094c0154
changed GDK_<key> to GDK_KEY_<key>
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
2034
diff
changeset
|
830 case GDK_KEY_KP_Add: |
9 | 831 if (fd) |
832 { | |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
833 vdtree_populate_path_by_iter(vd, &iter, FALSE, vd->dir_fd); |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
834 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
835 if (islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
836 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
837 vdtree_icon_set_by_iter(vd, &iter, vd->pf->link); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
838 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
839 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
840 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
841 vdtree_icon_set_by_iter(vd, &iter, vd->pf->open); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
842 } |
9 | 843 } |
844 break; | |
845 } | |
846 | |
847 return FALSE; | |
848 } | |
849 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
850 static gboolean vdtree_clicked_on_expander(GtkTreeView *treeview, GtkTreePath *tpath, |
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
851 GtkTreeViewColumn *column, gint x, gint y, gint *left_of_expander) |
9 | 852 { |
853 gint depth; | |
854 gint size; | |
855 gint sep; | |
856 gint exp_width; | |
857 | |
858 if (column != gtk_tree_view_get_expander_column(treeview)) return FALSE; | |
859 | |
860 gtk_widget_style_get(GTK_WIDGET(treeview), "expander-size", &size, "horizontal-separator", &sep, NULL); | |
861 depth = gtk_tree_path_get_depth(tpath); | |
862 | |
863 exp_width = sep + size + sep; | |
864 | |
865 if (x <= depth * exp_width) | |
866 { | |
867 if (left_of_expander) *left_of_expander = !(x >= (depth - 1) * exp_width); | |
868 return TRUE; | |
869 } | |
870 | |
871 return FALSE; | |
872 } | |
873 | |
1452
8a37a1a4bc67
gint -> gboolean where applicable.
Laurent Monin <geeqie@norz.org>
parents:
1437
diff
changeset
|
874 gboolean vdtree_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) |
9 | 875 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
876 ViewDir *vd = data; |
9 | 877 GtkTreePath *tpath; |
878 GtkTreeViewColumn *column; | |
879 GtkTreeIter iter; | |
880 NodeData *nd = NULL; | |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
881 FileData *fd; |
9 | 882 |
883 if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y, | |
884 &tpath, &column, NULL, NULL)) | |
885 { | |
886 GtkTreeModel *store; | |
887 gint left_of_expander; | |
888 | |
889 store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); | |
890 gtk_tree_model_get_iter(store, &iter, tpath); | |
891 gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1); | |
892 gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE); | |
893 | |
894 if (vdtree_clicked_on_expander(GTK_TREE_VIEW(widget), tpath, column, bevent->x, bevent->y, &left_of_expander)) | |
895 { | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
896 vd->click_fd = NULL; |
9 | 897 |
898 /* clicking this region should automatically reveal an expander, if necessary | |
899 * treeview bug: the expander will not expand until a button_motion_event highlights it. | |
900 */ | |
448
2c1500b5c933
Use explicit names for mouse buttons instead of numbers.
Laurent Monin <geeqie@norz.org>
parents:
442
diff
changeset
|
901 if (bevent->button == MOUSE_BUTTON_LEFT && |
9 | 902 !left_of_expander && |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
903 !gtk_tree_view_row_expanded(GTK_TREE_VIEW(vd->view), tpath)) |
9 | 904 { |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
905 vdtree_populate_path_by_iter(vd, &iter, FALSE, vd->dir_fd); |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
906 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
907 fd = (nd) ? nd->fd : NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
908 if (fd && islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
909 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
910 vdtree_icon_set_by_iter(vd, &iter, vd->pf->link); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
911 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
912 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
913 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
914 vdtree_icon_set_by_iter(vd, &iter, vd->pf->open); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
915 } |
9 | 916 } |
917 | |
918 gtk_tree_path_free(tpath); | |
919 return FALSE; | |
920 } | |
921 | |
922 gtk_tree_path_free(tpath); | |
923 } | |
924 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
925 vd->click_fd = (nd) ? nd->fd : NULL; |
383
e2edfa5524d4
Move some dnd common code from view_dir_list.c and view_dir_tree.c
Laurent Monin <geeqie@norz.org>
parents:
382
diff
changeset
|
926 vd_color_set(vd, vd->click_fd, TRUE); |
9 | 927 |
448
2c1500b5c933
Use explicit names for mouse buttons instead of numbers.
Laurent Monin <geeqie@norz.org>
parents:
442
diff
changeset
|
928 if (bevent->button == MOUSE_BUTTON_RIGHT) |
9 | 929 { |
388
5e8bef8d014a
Make directory view popup menu common and move it to view_dir.{c,h}.
Laurent Monin <geeqie@norz.org>
parents:
384
diff
changeset
|
930 vd->popup = vd_pop_menu(vd, vd->click_fd); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
931 gtk_menu_popup(GTK_MENU(vd->popup), NULL, NULL, NULL, NULL, |
9 | 932 bevent->button, bevent->time); |
933 } | |
934 | |
448
2c1500b5c933
Use explicit names for mouse buttons instead of numbers.
Laurent Monin <geeqie@norz.org>
parents:
442
diff
changeset
|
935 return (bevent->button != MOUSE_BUTTON_LEFT); |
9 | 936 } |
937 | |
938 static void vdtree_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *tpath, gpointer data) | |
939 { | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
940 ViewDir *vd = data; |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
941 GtkTreeModel *store; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
942 NodeData *nd = NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
943 FileData *fd; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
944 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
945 gtk_tree_view_set_tooltip_column(treeview, DIR_COLUMN_LINK); |
9 | 946 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
947 vdtree_populate_path_by_iter(vd, iter, FALSE, NULL); |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
948 store = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
949 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
950 gtk_tree_model_get_iter(store, iter, tpath); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
951 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
952 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
953 fd = (nd) ? nd->fd : NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
954 if (fd && islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
955 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
956 vdtree_icon_set_by_iter(vd, iter, vd->pf->link); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
957 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
958 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
959 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
960 vdtree_icon_set_by_iter(vd, iter, vd->pf->open); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
961 } |
9 | 962 } |
963 | |
964 static void vdtree_row_collapsed(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *tpath, gpointer data) | |
965 { | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
966 ViewDir *vd = data; |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
967 GtkTreeModel *store; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
968 NodeData *nd = NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
969 FileData *fd; |
9 | 970 |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
971 vdtree_populate_path_by_iter(vd, iter, FALSE, NULL); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
972 store = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
973 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
974 gtk_tree_model_get_iter(store, iter, tpath); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
975 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
976 |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
977 fd = (nd) ? nd->fd : NULL; |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
978 if (fd && islink(fd->path)) |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
979 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
980 vdtree_icon_set_by_iter(vd, iter, vd->pf->link); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
981 } |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
982 else |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
983 { |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
984 vdtree_icon_set_by_iter(vd, iter, vd->pf->close); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
985 } |
9 | 986 } |
987 | |
988 static gint vdtree_sort_cb(GtkTreeModel *store, GtkTreeIter *a, GtkTreeIter *b, gpointer data) | |
989 { | |
990 NodeData *nda; | |
991 NodeData *ndb; | |
992 | |
993 gtk_tree_model_get(store, a, DIR_COLUMN_POINTER, &nda, -1); | |
994 gtk_tree_model_get(store, b, DIR_COLUMN_POINTER, &ndb, -1); | |
995 | |
1926
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
996 if (!nda->fd && !ndb->fd) return 0; |
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
997 if (!nda->fd) return 1; |
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
998 if (!ndb->fd) return -1; |
776d6784c7c3
do not use FileData entries with empty path
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1802
diff
changeset
|
999 |
785
9c54f243c2c6
Use uft8_collate_key() to sort utf8 strings.
Laurent Monin <geeqie@norz.org>
parents:
783
diff
changeset
|
1000 if (options->file_sort.case_sensitive) |
819
e4a2711d7db2
fixed vdtree_sort_cb
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
785
diff
changeset
|
1001 return strcmp(nda->fd->collate_key_name, ndb->fd->collate_key_name); |
785
9c54f243c2c6
Use uft8_collate_key() to sort utf8 strings.
Laurent Monin <geeqie@norz.org>
parents:
783
diff
changeset
|
1002 else |
819
e4a2711d7db2
fixed vdtree_sort_cb
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
785
diff
changeset
|
1003 return strcmp(nda->fd->collate_key_name_nocase, ndb->fd->collate_key_name_nocase); |
9 | 1004 } |
1005 | |
1006 /* | |
1007 *---------------------------------------------------------------------------- | |
1008 * core | |
1009 *---------------------------------------------------------------------------- | |
1010 */ | |
1011 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1012 static void vdtree_setup_root(ViewDir *vd) |
9 | 1013 { |
725
ee5f1f4fd7e7
Use G_DIR_SEPARATOR_S where applicable.
Laurent Monin <geeqie@norz.org>
parents:
673
diff
changeset
|
1014 const gchar *path = G_DIR_SEPARATOR_S; |
9 | 1015 FileData *fd; |
1016 | |
138
5be5d1c53016
replaced gchar* path with FileData *fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
125
diff
changeset
|
1017 |
1927
d1a5b8633919
always check for sidecars by readdir
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1926
diff
changeset
|
1018 fd = file_data_new_dir(path); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1019 vdtree_add_by_data(vd, fd, NULL); |
9 | 1020 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1021 vdtree_expand_by_data(vd, fd, TRUE); |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
1022 vdtree_populate_path(vd, fd, FALSE, FALSE); |
9 | 1023 } |
1024 | |
1025 static gboolean vdtree_destroy_node_cb(GtkTreeModel *store, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data) | |
1026 { | |
1027 NodeData *nd; | |
1028 | |
1029 gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1); | |
1030 vdtree_node_free(nd); | |
1031 | |
1032 return FALSE; | |
1033 } | |
1034 | |
401
7dc6fdbdfef9
Add some wrappers in view_dir.c and simplify even more.
Laurent Monin <geeqie@norz.org>
parents:
397
diff
changeset
|
1035 void vdtree_destroy_cb(GtkWidget *widget, gpointer data) |
9 | 1036 { |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1037 ViewDir *vd = data; |
9 | 1038 GtkTreeModel *store; |
1039 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1040 vdtree_dnd_drop_expand_cancel(vd); |
394
ae99e42db2f1
Merge dirlist/dirview dnd code.
Laurent Monin <geeqie@norz.org>
parents:
389
diff
changeset
|
1041 vd_dnd_drop_scroll_cancel(vd); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1042 widget_auto_scroll_stop(vd->view); |
9 | 1043 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1044 store = gtk_tree_view_get_model(GTK_TREE_VIEW(vd->view)); |
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1045 gtk_tree_model_foreach(store, vdtree_destroy_node_cb, vd); |
9 | 1046 } |
1047 | |
783
0e45ed008a1c
replaced directory path with FileData* dir_fd
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
780
diff
changeset
|
1048 ViewDir *vdtree_new(ViewDir *vd, FileData *dir_fd) |
9 | 1049 { |
1050 GtkTreeStore *store; | |
1051 GtkTreeSelection *selection; | |
1052 GtkTreeViewColumn *column; | |
1053 GtkCellRenderer *renderer; | |
1054 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1055 vd->info = g_new0(ViewDirInfoTree, 1); |
1365
087b69c56be5
When g_new0() is used, drop redundant initializations to NULL, FALSE or 0.
Laurent Monin <geeqie@norz.org>
parents:
1284
diff
changeset
|
1056 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1057 vd->type = DIRVIEW_TREE; |
442 | 1058 |
407
f441b932ed5c
Rename vd_drop_update() to vd_dnd_drop_update().
Laurent Monin <geeqie@norz.org>
parents:
406
diff
changeset
|
1059 vd->dnd_drop_leave_func = vdtree_dnd_drop_expand_cancel; |
f441b932ed5c
Rename vd_drop_update() to vd_dnd_drop_update().
Laurent Monin <geeqie@norz.org>
parents:
406
diff
changeset
|
1060 vd->dnd_drop_update_func = vdtree_dnd_drop_expand; |
9 | 1061 |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
1062 store = gtk_tree_store_new(6, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1063 vd->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); |
9 | 1064 g_object_unref(store); |
1065 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1066 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vd->view), FALSE); |
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1067 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vd->view), FALSE); |
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1068 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), vdtree_sort_cb, vd, NULL); |
9 | 1069 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), |
1070 GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); | |
1071 | |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1072 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vd->view)); |
9 | 1073 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1074 gtk_tree_selection_set_select_function(selection, vdtree_select_cb, vd, NULL); |
9 | 1075 |
1076 column = gtk_tree_view_column_new(); | |
1077 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); | |
1078 | |
1079 renderer = gtk_cell_renderer_pixbuf_new(); | |
1080 gtk_tree_view_column_pack_start(column, renderer, FALSE); | |
1081 gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", DIR_COLUMN_ICON); | |
396
039f140aa8dc
Merge few more functions to view_dir.c.
Laurent Monin <geeqie@norz.org>
parents:
395
diff
changeset
|
1082 gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, NULL); |
9 | 1083 |
1084 renderer = gtk_cell_renderer_text_new(); | |
1085 gtk_tree_view_column_pack_start(column, renderer, TRUE); | |
1086 gtk_tree_view_column_add_attribute(column, renderer, "text", DIR_COLUMN_NAME); | |
396
039f140aa8dc
Merge few more functions to view_dir.c.
Laurent Monin <geeqie@norz.org>
parents:
395
diff
changeset
|
1087 gtk_tree_view_column_set_cell_data_func(column, renderer, vd_color_cb, vd, NULL); |
9 | 1088 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1089 gtk_tree_view_append_column(GTK_TREE_VIEW(vd->view), column); |
9 | 1090 |
2855
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
1091 gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(vd->view), DIR_COLUMN_LINK); |
009f0a811472
Fix #642: If a folder is a link, use an icon to indicate it is a link
Colin Clark <colin.clark@cclark.uk>
parents:
2392
diff
changeset
|
1092 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1093 vdtree_setup_root(vd); |
9 | 1094 |
405
d64659c27a88
Fix forgotten vd->pf affectation.
Laurent Monin <geeqie@norz.org>
parents:
401
diff
changeset
|
1095 g_signal_connect(G_OBJECT(vd->view), "row_expanded", |
d64659c27a88
Fix forgotten vd->pf affectation.
Laurent Monin <geeqie@norz.org>
parents:
401
diff
changeset
|
1096 G_CALLBACK(vdtree_row_expanded), vd); |
d64659c27a88
Fix forgotten vd->pf affectation.
Laurent Monin <geeqie@norz.org>
parents:
401
diff
changeset
|
1097 g_signal_connect(G_OBJECT(vd->view), "row_collapsed", |
d64659c27a88
Fix forgotten vd->pf affectation.
Laurent Monin <geeqie@norz.org>
parents:
401
diff
changeset
|
1098 G_CALLBACK(vdtree_row_collapsed), vd); |
9 | 1099 |
382
2d6110a20e8a
Rename vdt occurences to vd.
Laurent Monin <geeqie@norz.org>
parents:
380
diff
changeset
|
1100 return vd; |
9 | 1101 } |
1055
4bbdfab3c89a
Adding a vim modeline to all files - patch by Klaus Ethgen
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
995
diff
changeset
|
1102 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |