annotate src/filelist.c @ 3:c0e337a01cb7

0.8.0
author gqview
date Thu, 13 Apr 2000 12:55:19 +0000
parents b3e0e515fabf
children d907d608745f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2 * GQview image viewer
3
gqview
parents: 1
diff changeset
3 * (C)2000 John Ellis
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
4 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
5 * Author: John Ellis
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
6 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
7 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
8
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
9 #include "gqview.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
10
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
11 static gint filelist_click_row = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
12
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
13 static void update_progressbar(gfloat val);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
14
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
15 static gint file_is_hidden(gchar *name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
16 static gint file_is_in_filter(gchar *name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
17 static void add_to_filter(gchar *text, gint add);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
18
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
19 static gint sort_list_cb(void *a, void *b);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
20 static void filelist_read(gchar *path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
21
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
22 static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
23
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
24 static void history_menu_select_cb(GtkWidget *widget, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
25 static gchar *truncate_hist_text(gchar *t, gint l);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
26 static void filelist_set_history(gchar *path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
27
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
28 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
29 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
30 * file status information (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
31 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
32 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
33
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
34 static void update_progressbar(gfloat val)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
35 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
36 gtk_progress_bar_update (GTK_PROGRESS_BAR(info_progress_bar), val);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
37 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
38
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
39 void update_status_label(gchar *text)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
40 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
41 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
42 gint count;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
43 gchar *ss = "";
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
44
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
45 if (text)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
46 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
47 gtk_label_set(GTK_LABEL(info_status), text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
48 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
49 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
50
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
51 if (slideshow_is_running()) ss = _(" Slideshow");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
52
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
53 count = file_selection_count();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
54 if (count > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
55 buf = g_strdup_printf(_("%d files (%d)%s"), file_count(), count, ss);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
56 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
57 buf = g_strdup_printf(_("%d files%s"), file_count(), ss);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
58
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
59 gtk_label_set(GTK_LABEL(info_status), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
60 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
61 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
62
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
63 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
64 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
65 * file filtering
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
66 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
67 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
68
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
69 static gint file_is_hidden(gchar *name)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
70 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
71 if (name[0] != '.') return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
72 if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
73 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
74 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
75
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
76 static gint file_is_in_filter(gchar *name)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
77 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
78 GList *work;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
79 if (!filename_filter || file_filter_disable) return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
80
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
81 work = filename_filter;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
82 while (work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
83 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
84 gchar *filter = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
85 gint lf = strlen(filter);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
86 gint ln = strlen(name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
87 if (ln >= lf)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
88 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
89 if (strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
90 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
91 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
92 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
93
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
94 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
95 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
96
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
97 static void add_to_filter(gchar *text, gint add)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
98 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
99 if (add) filename_filter = g_list_append(filename_filter, g_strdup(text));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
100 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
101
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
102 void rebuild_file_filter()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
103 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
104 if (filename_filter)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
105 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
106 g_list_foreach(filename_filter,(GFunc)g_free,NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
107 g_list_free(filename_filter);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
108 filename_filter = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
109 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
110
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
111 add_to_filter(".jpg", filter_include_jpg);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
112 add_to_filter(".jpeg", filter_include_jpg);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
113 add_to_filter(".xpm", filter_include_xpm);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
114 add_to_filter(".tif", filter_include_tif);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
115 add_to_filter(".tiff", filter_include_tif);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
116 add_to_filter(".gif", filter_include_gif);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
117 add_to_filter(".png", filter_include_png);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
118 add_to_filter(".ppm", filter_include_ppm);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
119 add_to_filter(".pgm", filter_include_pgm);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
120 add_to_filter(".pcx", filter_include_pcx);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
121 add_to_filter(".bmp", filter_include_bmp);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
122
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
123 if (custom_filter)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
124 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
125 gchar *buf = g_strdup(custom_filter);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
126 gchar *pos_ptr_b;
3
gqview
parents: 1
diff changeset
127 gchar *pos_ptr_e = buf;
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
128 while(pos_ptr_e[0] != '\0')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
129 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
130 pos_ptr_b = pos_ptr_e;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
131 while (pos_ptr_e[0] != ';' && pos_ptr_e[0] != '\0') pos_ptr_e++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
132 if (pos_ptr_e[0] == ';')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
133 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
134 pos_ptr_e[0] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
135 pos_ptr_e++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
136 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
137 add_to_filter(pos_ptr_b, TRUE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
138 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
139 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
140 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
141 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
142
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
143 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
144 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
145 * load file list (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
146 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
147 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
148
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
149 static gint sort_list_cb(void *a, void *b)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
150 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
151 return strcmp((gchar *)a, (gchar *)b);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
152 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
153
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
154 static void filelist_read(gchar *path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
155 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
156 DIR *dp;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
157 struct dirent *dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
158 struct stat ent_sbuf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
159
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
160 if((dp = opendir(path))==NULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
161 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
162 /* dir not found */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
163 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
164 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
165
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
166 g_list_foreach(dir_list,(GFunc)g_free,NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
167 g_list_free(dir_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
168 dir_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
169
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
170 g_list_foreach(file_list,(GFunc)g_free,NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
171 g_list_free(file_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
172 file_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
173
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
174 while ((dir = readdir(dp)) != NULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
175 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
176 /* skips removed files */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
177 if (dir->d_ino > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
178 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
179 gchar *name = dir->d_name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
180 if (show_dot_files || !file_is_hidden(name))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
181 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
182 gchar *filepath = g_strconcat(path, "/", name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
183 if (stat(filepath,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
184 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
185 dir_list = g_list_prepend(dir_list, g_strdup(name));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
186 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
187 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
188 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
189 if (file_is_in_filter(name))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
190 file_list = g_list_prepend(file_list, g_strdup(name));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
191 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
192 g_free(filepath);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
193 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
194 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
195 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
196
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
197 closedir(dp);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
198
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
199 dir_list = g_list_sort(dir_list, (GCompareFunc) sort_list_cb);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
200 file_list = g_list_sort(file_list, (GCompareFunc) sort_list_cb);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
201 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
202
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
203 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
204 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
205 * file list utilities to retrieve information (public)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
206 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
207 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
208
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
209 gint file_count()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
210 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
211 return g_list_length(file_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
212 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
213
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
214 gint file_selection_count()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
215 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
216 gint count = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
217 GList *work = GTK_CLIST(file_clist)->selection;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
218 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
219 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
220 count++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
221 if (debug) printf("s = %d\n", GPOINTER_TO_INT(work->data));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
222 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
223 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
224
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
225 if (debug) printf("files selected = %d\n", count);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
226
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
227 return count;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
228 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
229
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
230 gint find_file_in_list(gchar *path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
231 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
232 GList *work = file_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
233 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
234 gchar *name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
235 gint count = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
236
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
237 if (!path) return -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
238
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
239 buf = remove_level_from_path(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
240 if (strcmp(buf, current_path) != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
241 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
242 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
243 return -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
244 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
245 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
246
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
247 name = filename_from_path(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
248 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
249 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
250 count++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
251 if (strcmp(name, work->data) == 0) return count;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
252 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
253 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
254
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
255 return -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
256 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
257
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
258 gchar *file_get_path(gint row)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
259 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
260 gchar *path = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
261 gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
262
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
263 if (name) path = g_strconcat(current_path, "/", name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
264
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
265 return path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
266 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
267
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
268 gint file_is_selected(gint row)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
269 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
270 GList *work = GTK_CLIST(file_clist)->selection;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
271
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
272 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
273 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
274 if (GPOINTER_TO_INT(work->data) == row) return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
275 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
276 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
277
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
278 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
279 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
280
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
281 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
282 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
283 * utilities to retrieve list of selected files (public)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
284 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
285 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
286
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
287 GList *file_get_selected_list()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
288 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
289 GList *list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
290 GList *work = GTK_CLIST(file_clist)->selection;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
291
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
292 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
293 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
294 gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist),
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
295 GPOINTER_TO_INT(work->data));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
296 list = g_list_prepend(list, g_strconcat(current_path, "/", name, NULL));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
297 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
298 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
299
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
300 list = g_list_reverse(list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
301
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
302 return list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
303 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
304
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
305 void free_selected_list(GList *list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
306 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
307 g_list_foreach(list, (GFunc)g_free, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
308 g_list_free(list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
309 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
310
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
311 gint file_clicked_is_selected()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
312 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
313 return file_is_selected(filelist_click_row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
314 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
315
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
316 gchar *file_clicked_get_path()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
317 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
318 return file_get_path(filelist_click_row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
319 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
320
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
321 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
322 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
323 * image change routines
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
324 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
325 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
326
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
327 void file_image_change_to(gint row)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
328 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
329 gtk_clist_unselect_all(GTK_CLIST(file_clist));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
330 gtk_clist_select_row(GTK_CLIST(file_clist), row, -1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
331 if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), row) != GTK_VISIBILITY_FULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
332 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
333 gtk_clist_moveto(GTK_CLIST(file_clist), row, -1, 0.5, 0.0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
334 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
335 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
336
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
337 void file_next_image()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
338 {
3
gqview
parents: 1
diff changeset
339 gint current;
gqview
parents: 1
diff changeset
340 gint total;
gqview
parents: 1
diff changeset
341
gqview
parents: 1
diff changeset
342 if (slideshow_is_running())
gqview
parents: 1
diff changeset
343 {
gqview
parents: 1
diff changeset
344 slideshow_next();
gqview
parents: 1
diff changeset
345 return;
gqview
parents: 1
diff changeset
346 }
gqview
parents: 1
diff changeset
347
gqview
parents: 1
diff changeset
348 current = find_file_in_list(image_get_path());
gqview
parents: 1
diff changeset
349 total = file_count();
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
350
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
351 if (current >= 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
352 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
353 if (current < total - 1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
354 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
355 file_image_change_to(current + 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
356 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
357 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
358 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
359 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
360 file_image_change_to(0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
361 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
362 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
363
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
364 void file_prev_image()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
365 {
3
gqview
parents: 1
diff changeset
366 gint current;
gqview
parents: 1
diff changeset
367
gqview
parents: 1
diff changeset
368 if (slideshow_is_running())
gqview
parents: 1
diff changeset
369 {
gqview
parents: 1
diff changeset
370 slideshow_prev();
gqview
parents: 1
diff changeset
371 return;
gqview
parents: 1
diff changeset
372 }
gqview
parents: 1
diff changeset
373
gqview
parents: 1
diff changeset
374 current = find_file_in_list(image_get_path());
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
375
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
376 if (current >= 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
377 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
378 if (current > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
379 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
380 file_image_change_to(current - 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
381 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
382 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
383 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
384 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
385 file_image_change_to(file_count() - 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
386 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
387 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
388
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
389 void file_first_image()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
390 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
391 gint current = find_file_in_list(image_get_path());
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
392 if (current != 0 && file_count() > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
393 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
394 file_image_change_to(0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
395 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
396 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
397
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
398 void file_last_image()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
399 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
400 gint current = find_file_in_list(image_get_path());
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
401 gint count = file_count();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
402 if (current != count - 1 && count > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
403 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
404 file_image_change_to(count - 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
405 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
406 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
407
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
408 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
409 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
410 * file delete/rename update routines
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
411 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
412 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
413
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
414 static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
415 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
416 GList *list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
417 GList *work;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
418 gint rev = row - 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
419 row ++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
420
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
421 work = ignore_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
422 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
423 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
424 gint f = find_file_in_list(work->data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
425 if (f >= 0) list = g_list_append(list, GINT_TO_POINTER(f));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
426 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
427 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
428
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
429 while(list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
430 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
431 gint c = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
432 work = list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
433 while(work && c)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
434 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
435 gpointer p = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
436 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
437 if (row == GPOINTER_TO_INT(p))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
438 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
439 row++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
440 c = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
441 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
442 if (rev == GPOINTER_TO_INT(p))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
443 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
444 rev--;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
445 c = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
446 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
447 if (!c) list = g_list_remove(list, p);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
448 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
449 if (c && list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
450 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
451 g_list_free(list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
452 list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
453 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
454 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
455 if (row > count - 1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
456 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
457 if (rev < 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
458 return -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
459 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
460 return rev;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
461 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
462 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
463 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
464 return row;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
465 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
466 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
467
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
468 void file_is_gone(gchar *path, GList *ignore_list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
469 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
470 GList *list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
471 gchar *name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
472 gint row;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
473 gint new_row = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
474 row = find_file_in_list(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
475 if (row < 0) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
476
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
477 if (file_is_selected(row) /* && file_selection_count() == 1 */)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
478 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
479 gint n = file_count();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
480 if (ignore_list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
481 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
482 new_row = file_find_closest_unaccounted(row, n, ignore_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
483 if (debug) printf("row = %d, closest is %d\n", row, new_row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
484 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
485 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
486 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
487 if (row + 1 < n)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
488 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
489 new_row = row + 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
490 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
491 else if (row > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
492 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
493 new_row = row - 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
494 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
495 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
496 gtk_clist_unselect_all(GTK_CLIST(file_clist));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
497 if (new_row >= 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
498 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
499 gtk_clist_select_row(GTK_CLIST(file_clist), new_row, -1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
500 file_image_change_to(new_row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
501 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
502 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
503 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
504 image_change_to(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
505 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
506 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
507
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
508 gtk_clist_remove(GTK_CLIST(file_clist), row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
509 list = g_list_nth(file_list, row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
510 name = list->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
511 file_list = g_list_remove(file_list, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
512 g_free(name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
513 update_status_label(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
514 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
515
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
516 void file_is_renamed(gchar *source, gchar *dest)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
517 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
518 gint row;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
519 gchar *source_base;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
520 gchar *dest_base;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
521
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
522 if (image_get_path() && !strcmp(source, image_get_path()))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
523 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
524 image_set_path(dest);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
525 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
526
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
527 row = find_file_in_list(source);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
528 if (row < 0) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
529
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
530 source_base = remove_level_from_path(source);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
531 dest_base = remove_level_from_path(dest);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
532
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
533 if (strcmp(source_base, dest_base) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
534 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
535 gchar *name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
536 gint n;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
537 GList *work = g_list_nth(file_list, row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
538 name = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
539 file_list = g_list_remove(file_list, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
540 g_free(name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
541 name = g_strdup(filename_from_path(dest));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
542 file_list = g_list_insert_sorted(file_list, name, (GCompareFunc) sort_list_cb);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
543 n = g_list_index(file_list, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
544
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
545 if (gtk_clist_get_cell_type(GTK_CLIST(file_clist), row, 0) != GTK_CELL_PIXTEXT)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
546 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
547 gtk_clist_set_text (GTK_CLIST(file_clist), row, 0, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
548 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
549 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
550 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
551 guint8 spacing = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
552 GdkPixmap *pixmap = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
553 GdkBitmap *mask = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
554 gtk_clist_get_pixtext(GTK_CLIST(file_clist), row, 0,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
555 NULL, &spacing, &pixmap, &mask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
556 gtk_clist_set_pixtext(GTK_CLIST(file_clist), row, 0,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
557 name, spacing, pixmap, mask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
558 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
559
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
560 gtk_clist_set_row_data(GTK_CLIST(file_clist), row, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
561 gtk_clist_row_move(GTK_CLIST(file_clist), row, n);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
562 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
563 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
564 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
565 GList *work = g_list_nth(file_list, row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
566 gchar *name = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
567 file_list = g_list_remove(file_list, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
568 gtk_clist_remove(GTK_CLIST(file_clist), row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
569 g_free(name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
570 update_status_label(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
571 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
572
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
573 g_free(source_base);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
574 g_free(dest_base);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
575
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
576 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
577
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
578 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
579 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
580 * directory list callbacks
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
581 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
582 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
583
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
584 void dir_select_cb(GtkWidget *widget, gint row, gint col,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
585 GdkEvent *event, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
586 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
587 gchar *name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
588 gchar *new_path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
589 name = gtk_clist_get_row_data (GTK_CLIST(dir_clist), row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
590 if (strcmp(name, ".") == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
591 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
592 new_path = g_strdup(current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
593 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
594 else if (strcmp(name, "..") == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
595 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
596 new_path = remove_level_from_path(current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
597 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
598 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
599 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
600 if (strcmp(current_path, "/") == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
601 new_path = g_strconcat(current_path, name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
602 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
603 new_path = g_strconcat(current_path, "/", name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
604 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
605 filelist_change_to(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
606 g_free(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
607 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
608
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
609 void dir_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
610 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
611 gint row = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
612 gint col = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
613
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
614 gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
615
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
616 if (bevent->button == 2)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
617 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
618 gtk_object_set_user_data(GTK_OBJECT(dir_clist), GINT_TO_POINTER(row));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
619 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
620 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
621
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
622 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
623 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
624 * file list callbacks
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
625 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
626 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
627
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
628 void file_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
629 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
630 gint row = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
631 gint col = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
632
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
633 gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
634 if (row == -1 || col == -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
635 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
636 filelist_click_row = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
637 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
638 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
639
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
640 filelist_click_row = row;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
641
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
642 if (bevent->button == 3)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
643 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
644 file_clist_highlight_set();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
645 gtk_menu_popup (GTK_MENU(menu_file_popup), NULL, NULL, NULL, NULL,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
646 bevent->button, bevent->time);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
647 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
648 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
649
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
650 void file_select_cb(GtkWidget *widget, gint row, gint col,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
651 GdkEvent *event, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
652 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
653 gchar *name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
654 gchar *path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
655
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
656 if (file_selection_count() != 1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
657 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
658 update_status_label(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
659 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
660 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
661
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
662 name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
663 path = g_strconcat(current_path, "/", name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
664 image_change_to(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
665 update_status_label(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
666 g_free(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
667 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
668
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
669 void file_unselect_cb(GtkWidget *widget, gint row, gint col,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
670 GdkEvent *event, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
671 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
672 #if 0
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
673 gchar *name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
674 gchar *path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
675
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
676 name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
677 path = g_strconcat(current_path, "/", name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
678
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
679 if (strcmp(path, image_get_path()) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
680 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
681 if (file_selection_count() > 0 && !file_is_selected(find_file_in_list(image_get_path())) )
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
682 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
683 gint new_row = GPOINTER_TO_INT(GTK_CLIST(file_clist)->selection->data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
684 gchar *new_name = gtk_clist_get_row_data(GTK_CLIST(file_clist), new_row);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
685 gchar *new_path = g_strconcat(current_path, "/", new_name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
686 image_change_to(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
687 g_free(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
688 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
689 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
690 g_free(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
691 #endif
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
692 update_status_label(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
693 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
694
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
695 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
696 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
697 * file list highlight utils
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
698 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
699 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
700
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
701 void file_clist_highlight_set()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
702 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
703 if (file_clicked_is_selected()) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
704
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
705 gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
706 &GTK_WIDGET (file_clist)->style->bg[GTK_STATE_PRELIGHT]);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
707 gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
708 &GTK_WIDGET (file_clist)->style->fg[GTK_STATE_PRELIGHT]);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
709 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
710
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
711 void file_clist_highlight_unset()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
712 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
713 if (file_clicked_is_selected()) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
714
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
715 gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
716 gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
717 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
718
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
719 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
720 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
721 * path entry and history menu
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
722 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
723 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
724
3
gqview
parents: 1
diff changeset
725 void path_entry_tab_cb(gchar *newdir, gpointer data)
gqview
parents: 1
diff changeset
726 {
gqview
parents: 1
diff changeset
727 gchar *new_path;
gqview
parents: 1
diff changeset
728 gchar *buf;
gqview
parents: 1
diff changeset
729 gint found = FALSE;
gqview
parents: 1
diff changeset
730
gqview
parents: 1
diff changeset
731 new_path = g_strdup(newdir);
gqview
parents: 1
diff changeset
732 parse_out_relatives(new_path);
gqview
parents: 1
diff changeset
733 buf = remove_level_from_path(new_path);
gqview
parents: 1
diff changeset
734
gqview
parents: 1
diff changeset
735 if (buf && current_path && strcmp(buf, current_path) == 0)
gqview
parents: 1
diff changeset
736 {
gqview
parents: 1
diff changeset
737 GList *work;
gqview
parents: 1
diff changeset
738 gchar *part;
gqview
parents: 1
diff changeset
739
gqview
parents: 1
diff changeset
740 part = filename_from_path(new_path);
gqview
parents: 1
diff changeset
741 work = file_list;
gqview
parents: 1
diff changeset
742
gqview
parents: 1
diff changeset
743 while(part && work)
gqview
parents: 1
diff changeset
744 {
gqview
parents: 1
diff changeset
745 gchar *name = work->data;
gqview
parents: 1
diff changeset
746 work = work->next;
gqview
parents: 1
diff changeset
747
gqview
parents: 1
diff changeset
748 if (strncmp(part, name, strlen(part)) == 0)
gqview
parents: 1
diff changeset
749 {
gqview
parents: 1
diff changeset
750 gint row = g_list_index(file_list, name);
gqview
parents: 1
diff changeset
751 if (!gtk_clist_row_is_visible(GTK_CLIST(file_clist), row) != GTK_VISIBILITY_FULL)
gqview
parents: 1
diff changeset
752 {
gqview
parents: 1
diff changeset
753 gtk_clist_moveto(GTK_CLIST(file_clist), row, -1, 0.5, 0.0);
gqview
parents: 1
diff changeset
754 }
gqview
parents: 1
diff changeset
755 found = TRUE;
gqview
parents: 1
diff changeset
756 break;
gqview
parents: 1
diff changeset
757 }
gqview
parents: 1
diff changeset
758 }
gqview
parents: 1
diff changeset
759 }
gqview
parents: 1
diff changeset
760
gqview
parents: 1
diff changeset
761 if (!found && new_path && current_path &&
gqview
parents: 1
diff changeset
762 strcmp(new_path, current_path) != 0 && isdir(new_path))
gqview
parents: 1
diff changeset
763 {
gqview
parents: 1
diff changeset
764 filelist_change_to(new_path);
gqview
parents: 1
diff changeset
765 /* we are doing tab completion, add '/' back */
gqview
parents: 1
diff changeset
766 gtk_entry_append_text(GTK_ENTRY(path_entry), "/");
gqview
parents: 1
diff changeset
767 }
gqview
parents: 1
diff changeset
768
gqview
parents: 1
diff changeset
769 g_free(buf);
gqview
parents: 1
diff changeset
770 g_free(new_path);
gqview
parents: 1
diff changeset
771 }
gqview
parents: 1
diff changeset
772
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
773 void path_entry_cb(gchar *newdir, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
774 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
775 gchar *new_path = g_strdup(newdir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
776 parse_out_relatives(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
777 if (isdir(new_path))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
778 filelist_change_to(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
779 else if (isfile(new_path))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
780 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
781 gchar *path = remove_level_from_path(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
782 filelist_change_to(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
783 g_free(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
784 image_change_to(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
785 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
786 g_free(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
787 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
788
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
789 static void history_menu_select_cb(GtkWidget *widget, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
790 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
791 gchar *new_path = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
792 filelist_change_to(new_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
793 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
794
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
795 static gchar *truncate_hist_text(gchar *t, gint l)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
796 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
797 gchar *tp;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
798 gchar *tbuf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
799 if (l >= strlen(t)) return g_strdup(t);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
800 tp = t + strlen(t) - l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
801 while (tp[0] != '/' && tp < t + strlen(t)) tp++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
802 /* this checks to see if directory name is longer than l, if so
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
803 * reset the length of name to l, it's better to have a partial
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
804 * name than no name at all.
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
805 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
806 if (tp >= t + strlen(t)) tp = t + strlen(t) - l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
807 tbuf = g_strconcat("/...", tp, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
808 return tbuf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
809 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
810
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
811 static void filelist_set_history(gchar *path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
812 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
813 static GList *history_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
814 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
815 gchar *buf_ptr;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
816 GtkWidget *menu;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
817 GtkWidget *item;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
818
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
819 if (!path) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
820
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
821 gtk_entry_set_text(GTK_ENTRY(path_entry), current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
822
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
823 if (history_list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
824 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
825 g_list_foreach(history_list, (GFunc)g_free, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
826 g_list_free(history_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
827 history_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
828 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
829
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
830 menu = gtk_menu_new();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
831
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
832 buf = g_strdup(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
833 buf_ptr = buf + strlen(buf) - 1 ;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
834 while (buf_ptr > buf)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
835 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
836 gchar *full_path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
837 gchar *truncated;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
838 truncated = truncate_hist_text(buf, 32);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
839
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
840 full_path = g_strdup(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
841 history_list = g_list_append(history_list, full_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
842
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
843 item = gtk_menu_item_new_with_label (truncated);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
844 gtk_signal_connect (GTK_OBJECT (item), "activate",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
845 (GtkSignalFunc) history_menu_select_cb, full_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
846
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
847 gtk_menu_append (GTK_MENU (menu), item);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
848 gtk_widget_show (item);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
849
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
850 g_free(truncated);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
851
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
852 while (buf_ptr[0] != '/' && buf_ptr > buf) buf_ptr--;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
853 buf_ptr[0] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
854 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
855 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
856
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
857 item = gtk_menu_item_new_with_label ("/");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
858
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
859 gtk_signal_connect (GTK_OBJECT (item), "activate",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
860 (GtkSignalFunc) history_menu_select_cb, "/");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
861
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
862 gtk_menu_append (GTK_MENU (menu), item);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
863 gtk_widget_show (item);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
864
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
865 gtk_option_menu_set_menu(GTK_OPTION_MENU(history_menu), menu);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
866 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
867
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
868 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
869 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
870 * list update routines (public)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
871 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
872 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
873
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
874 static gint thumbs_running = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
875
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
876 void interrupt_thumbs()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
877 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
878 if (thumbs_running > 0) thumbs_running ++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
879 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
880
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
881 void filelist_populate_clist()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
882 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
883 GList *work;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
884 gint width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
885 gint tmp_width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
886 gint row;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
887 gchar *image_name = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
888 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
889
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
890 gint row_p = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
891 gchar *text;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
892 guint8 spacing;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
893 GdkPixmap *nopixmap;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
894 GdkBitmap *nomask;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
895
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
896 interrupt_thumbs();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
897
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
898 filelist_set_history(current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
899
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
900 gtk_clist_freeze (GTK_CLIST (dir_clist));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
901 gtk_clist_clear (GTK_CLIST (dir_clist));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
902
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
903 width = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
904 work = dir_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
905 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
906 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
907 gchar *buf[2];
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
908 buf[0] = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
909 buf[1] = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
910 row = gtk_clist_append(GTK_CLIST(dir_clist), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
911 gtk_clist_set_row_data (GTK_CLIST(dir_clist), row, work->data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
912 tmp_width = gdk_string_width(dir_clist->style->font, buf[0]);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
913 if (tmp_width > width) width = tmp_width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
914 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
915 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
916
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
917 gtk_clist_set_column_width(GTK_CLIST(dir_clist), 0, width);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
918 gtk_clist_thaw(GTK_CLIST (dir_clist));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
919
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
920 buf = remove_level_from_path(image_get_path());
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
921 if (buf && strcmp(buf, current_path) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
922 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
923 image_name = image_get_name();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
924 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
925 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
926
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
927 gtk_clist_freeze (GTK_CLIST (file_clist));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
928
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
929 if (!thumbnails_enabled)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
930 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
931 gtk_clist_set_row_height (GTK_CLIST(file_clist),
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
932 GTK_WIDGET(file_clist)->style->font->ascent +
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
933 GTK_WIDGET(file_clist)->style->font->descent + 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
934 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
935 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
936 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
937 gtk_clist_set_row_height (GTK_CLIST(file_clist), thumb_max_height + 2);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
938 maintain_thumbnail_dir(current_path, FALSE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
939 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
940
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
941 width = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
942 work = file_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
943
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
944 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
945 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
946 gint has_pixmap;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
947 gint match;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
948 gchar *name = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
949 gint done = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
950
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
951 while (!done)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
952 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
953 if (GTK_CLIST(file_clist)->rows > row_p)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
954 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
955 if (gtk_clist_get_cell_type(GTK_CLIST(file_clist),row_p, 0) == GTK_CELL_PIXTEXT)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
956 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
957 gtk_clist_get_pixtext(GTK_CLIST(file_clist), row_p, 0, &text, &spacing, &nopixmap, &nomask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
958 has_pixmap = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
959 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
960 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
961 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
962 gtk_clist_get_text(GTK_CLIST(file_clist), row_p, 0, &text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
963 has_pixmap = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
964 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
965 match = strcmp(name, text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
966 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
967 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
968 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
969 match = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
970 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
971
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
972 if (match < 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
973 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
974 gchar *buf[2];
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
975 buf[0] = name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
976 buf[1] = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
977 row = gtk_clist_insert(GTK_CLIST(file_clist), row_p, buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
978 gtk_clist_set_row_data (GTK_CLIST(file_clist), row, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
979 if (thumbnails_enabled)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
980 gtk_clist_set_shift(GTK_CLIST(file_clist), row, 0, 0, 5 + thumb_max_width);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
981 done = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
982 if (image_name && strcmp(name, image_name) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
983 gtk_clist_select_row(GTK_CLIST(file_clist), row, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
984 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
985 else if (match > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
986 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
987 gtk_clist_remove(GTK_CLIST(file_clist), row_p);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
988 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
989 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
990 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
991 if (thumbnails_enabled && !has_pixmap)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
992 gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 5 + thumb_max_width);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
993 if (!thumbnails_enabled/* && has_pixmap*/)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
994 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
995 gtk_clist_set_text(GTK_CLIST(file_clist), row_p, 0, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
996 gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
997 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
998 gtk_clist_set_row_data (GTK_CLIST(file_clist), row_p, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
999 done = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1000 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1001 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1002 row_p++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1003
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1004 if (thumbnails_enabled)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1005 tmp_width = gdk_string_width(file_clist->style->font, name) + thumb_max_width + 5;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1006 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1007 tmp_width = gdk_string_width(file_clist->style->font, name);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1008 if (tmp_width > width) width = tmp_width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1009 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1010 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1011
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1012 while (GTK_CLIST(file_clist)->rows > row_p)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1013 gtk_clist_remove(GTK_CLIST(file_clist), row_p);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1014
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1015 gtk_clist_set_column_width(GTK_CLIST(file_clist), 0, width);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1016 gtk_clist_thaw(GTK_CLIST (file_clist));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1017
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1018 if (thumbnails_enabled)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1019 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1020 GList *done_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1021 gint past_run;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1022 gint finished = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1023 gint j;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1024 gint count = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1025 update_status_label(_("Loading thumbs..."));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1026
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1027 for (j = 0; j < GTK_CLIST(file_clist)->rows; j++)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1028 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1029 done_list = g_list_prepend(done_list, GINT_TO_POINTER(FALSE));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1030 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1031
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1032 /* load thumbs */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1033
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1034 while (!finished && done_list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1035 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1036 gint p = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1037 gint r = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1038 gint c = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1039 gtk_clist_get_selection_info (GTK_CLIST(file_clist), 1, 1, &r, &c);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1040 if (r != -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1041 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1042 work = g_list_nth(done_list, r);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1043 while (work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1044 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1045 if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), r))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1046 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1047 if (!GPOINTER_TO_INT(work->data))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1048 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1049 work->data = GINT_TO_POINTER(TRUE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1050 p = r;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1051 work = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1052 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1053 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1054 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1055 r++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1056 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1057 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1058 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1059 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1060 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1061 work = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1062 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1063 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1064 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1065 if (p == -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1066 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1067 work = done_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1068 r = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1069 while(work && p == -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1070 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1071 if (!GPOINTER_TO_INT(work->data))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1072 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1073 p = r;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1074 work->data = GINT_TO_POINTER(TRUE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1075 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1076 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1077 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1078 r++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1079 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1080 if (!work) finished = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1081 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1082 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1083 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1084
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1085 count++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1086
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1087 if (!finished && gtk_clist_get_cell_type(GTK_CLIST(file_clist), p, 0) != GTK_CELL_PIXTEXT)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1088 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1089 GdkPixmap *pixmap = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1090 GdkBitmap *mask = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1091 gchar *name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1092 gchar *path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1093
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1094 thumbs_running ++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1095 past_run = thumbs_running;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1096 while(gtk_events_pending()) gtk_main_iteration();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1097 if (thumbs_running > past_run)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1098 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1099 thumbs_running -= 2;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1100 update_progressbar(0.0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1101 update_status_label(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1102 g_list_free(done_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1103 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1104 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1105 thumbs_running --;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1106
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1107 name = gtk_clist_get_row_data(GTK_CLIST(file_clist), p);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1108 path = g_strconcat (current_path, "/", name, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1109 spacing = create_thumbnail(path, &pixmap, &mask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1110 g_free(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1111 gtk_clist_set_pixtext (GTK_CLIST(file_clist), p, 0, name, spacing + 5, pixmap, mask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1112 gtk_clist_set_shift(GTK_CLIST(file_clist), p, 0, 0, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1113
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1114 update_progressbar((gfloat)(count) / GTK_CLIST(file_clist)->rows);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1115 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1116 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1117 update_progressbar(0.0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1118 g_list_free(done_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1119 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1120
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1121 update_status_label(NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1122 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1123
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1124 void filelist_refresh()
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1125 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1126 filelist_read(current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1127 filelist_populate_clist();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1128 filelist_click_row = -1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1129 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1130
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1131 void filelist_change_to(gchar *path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1132 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1133 if (!isdir(path)) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1134
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1135 g_free(current_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1136 current_path = g_strdup(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1137
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1138 filelist_refresh();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1139 }