comparison finch/libgnt/gntfilesel.c @ 15848:3da9d5da9054

Directory only selection.
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Tue, 20 Mar 2007 02:09:46 +0000
parents a2ab257116ce
children 65b45106bfbb 0592a7b4db86
comparison
equal deleted inserted replaced
15847:695ef54aca48 15848:3da9d5da9054
64 static void 64 static void
65 update_location(GntFileSel *sel) 65 update_location(GntFileSel *sel)
66 { 66 {
67 char *old; 67 char *old;
68 const char *tmp; 68 const char *tmp;
69 tmp = (const char*)gnt_tree_get_selection_data(GNT_TREE(sel->files)); 69 tmp = (const char*)gnt_tree_get_selection_data(sel->dirsonly ? GNT_TREE(sel->dirs) : GNT_TREE(sel->files));
70 old = g_strdup_printf("%s%s%s", sel->current, sel->current[1] ? G_DIR_SEPARATOR_S : "", tmp ? tmp : ""); 70 old = g_strdup_printf("%s%s%s", sel->current, sel->current[1] ? G_DIR_SEPARATOR_S : "", tmp ? tmp : "");
71 gnt_entry_set_text(GNT_ENTRY(sel->location), old); 71 gnt_entry_set_text(GNT_ENTRY(sel->location), old);
72 g_free(old); 72 g_free(old);
73 } 73 }
74 74
76 location_changed(GntFileSel *sel, GError **err) 76 location_changed(GntFileSel *sel, GError **err)
77 { 77 {
78 GDir *dir; 78 GDir *dir;
79 const char *str; 79 const char *str;
80 80
81 if (!sel->dirs)
82 return TRUE;
83
81 gnt_tree_remove_all(GNT_TREE(sel->dirs)); 84 gnt_tree_remove_all(GNT_TREE(sel->dirs));
82 gnt_tree_remove_all(GNT_TREE(sel->files)); 85 if (sel->files)
86 gnt_tree_remove_all(GNT_TREE(sel->files));
83 gnt_entry_set_text(GNT_ENTRY(sel->location), NULL); 87 gnt_entry_set_text(GNT_ENTRY(sel->location), NULL);
84 if (sel->current == NULL) { 88 if (sel->current == NULL) {
85 if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(sel), GNT_WIDGET_MAPPED)) 89 if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(sel), GNT_WIDGET_MAPPED))
86 gnt_widget_draw(GNT_WIDGET(sel)); 90 gnt_widget_draw(GNT_WIDGET(sel));
87 return TRUE; 91 return TRUE;
106 g_printerr("Error stating location %s\n", fp); 110 g_printerr("Error stating location %s\n", fp);
107 } else { 111 } else {
108 if (S_ISDIR(st.st_mode)) 112 if (S_ISDIR(st.st_mode))
109 gnt_tree_add_row_after(GNT_TREE(sel->dirs), g_strdup(str), 113 gnt_tree_add_row_after(GNT_TREE(sel->dirs), g_strdup(str),
110 gnt_tree_create_row(GNT_TREE(sel->dirs), str), NULL, NULL); 114 gnt_tree_create_row(GNT_TREE(sel->dirs), str), NULL, NULL);
111 else { 115 else if (!sel->dirsonly) {
112 char size[128]; 116 char size[128];
113 snprintf(size, sizeof(size), "%ld", (long)st.st_size); 117 snprintf(size, sizeof(size), "%ld", (long)st.st_size);
114 118
115 gnt_tree_add_row_after(GNT_TREE(sel->files), g_strdup(str), 119 gnt_tree_add_row_after(GNT_TREE(sel->files), g_strdup(str),
116 gnt_tree_create_row(GNT_TREE(sel->files), str, size, ""), NULL, NULL); 120 gnt_tree_create_row(GNT_TREE(sel->files), str, size, ""), NULL, NULL);
176 char *loc = g_path_get_dirname(gl.gl_pathv[0]); 180 char *loc = g_path_get_dirname(gl.gl_pathv[0]);
177 181
178 stat(gl.gl_pathv[0], &st); 182 stat(gl.gl_pathv[0], &st);
179 gnt_file_sel_set_current_location(sel, loc); /* XXX: check the return value */ 183 gnt_file_sel_set_current_location(sel, loc); /* XXX: check the return value */
180 g_free(loc); 184 g_free(loc);
181 if (!S_ISDIR(st.st_mode)) { 185 if (!S_ISDIR(st.st_mode) && !sel->dirsonly) {
182 gnt_tree_remove_all(GNT_TREE(sel->files)); 186 gnt_tree_remove_all(GNT_TREE(sel->files));
183 for (count = 0; count < gl.gl_pathc; count++) { 187 for (count = 0; count < gl.gl_pathc; count++) {
184 char *tmp = process_path(gl.gl_pathv[count]); 188 char *tmp = process_path(gl.gl_pathv[count]);
185 loc = g_path_get_dirname(tmp); 189 loc = g_path_get_dirname(tmp);
186 if (g_utf8_collate(sel->current, loc) == 0) { 190 if (g_utf8_collate(sel->current, loc) == 0) {
193 g_free(loc); 197 g_free(loc);
194 g_free(tmp); 198 g_free(tmp);
195 } 199 }
196 gnt_widget_draw(sel->files); 200 gnt_widget_draw(sel->files);
197 } 201 }
198 } else { 202 } else if (sel->files) {
199 gnt_tree_remove_all(GNT_TREE(sel->files)); 203 gnt_tree_remove_all(GNT_TREE(sel->files));
200 gnt_widget_draw(sel->files); 204 gnt_widget_draw(sel->files);
201 } 205 }
202 globfree(&gl); 206 globfree(&gl);
203 success: 207 success:
214 } 218 }
215 219
216 static void 220 static void
217 gnt_file_sel_map(GntWidget *widget) 221 gnt_file_sel_map(GntWidget *widget)
218 { 222 {
223 GntFileSel *sel = GNT_FILE_SEL(widget);
224 GntWidget *hbox, *vbox;
225
226 vbox = gnt_vbox_new(FALSE);
227 gnt_box_set_pad(GNT_BOX(vbox), 0);
228 gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_LEFT);
229
230 /* The dir. and files list */
231 hbox = gnt_hbox_new(FALSE);
232 gnt_box_set_pad(GNT_BOX(hbox), 0);
233
234 gnt_box_add_widget(GNT_BOX(hbox), sel->dirs);
235
236 if (!sel->dirsonly) {
237 gnt_box_add_widget(GNT_BOX(hbox), sel->files);
238 } else {
239 g_signal_connect(G_OBJECT(sel->dirs), "selection_changed", G_CALLBACK(file_sel_changed), sel);
240 }
241
242 gnt_box_add_widget(GNT_BOX(vbox), hbox);
243 gnt_box_add_widget(GNT_BOX(vbox), sel->location);
244
245 /* The buttons */
246 hbox = gnt_hbox_new(FALSE);
247 gnt_box_add_widget(GNT_BOX(hbox), sel->cancel);
248 gnt_box_add_widget(GNT_BOX(hbox), sel->select);
249 gnt_box_add_widget(GNT_BOX(vbox), hbox);
250
251 gnt_box_add_widget(GNT_BOX(sel), vbox);
219 orig_map(widget); 252 orig_map(widget);
220 update_location(GNT_FILE_SEL(widget)); 253 update_location(sel);
221 } 254 }
222 255
223 static void 256 static void
224 gnt_file_sel_class_init(GntFileSelClass *klass) 257 gnt_file_sel_class_init(GntFileSelClass *klass)
225 { 258 {
281 314
282 GntWidget *gnt_file_sel_new() 315 GntWidget *gnt_file_sel_new()
283 { 316 {
284 GntWidget *widget = g_object_new(GNT_TYPE_FILE_SEL, NULL); 317 GntWidget *widget = g_object_new(GNT_TYPE_FILE_SEL, NULL);
285 GntFileSel *sel = GNT_FILE_SEL(widget); 318 GntFileSel *sel = GNT_FILE_SEL(widget);
286 GntWidget *hbox, *vbox;
287
288 vbox = gnt_vbox_new(FALSE);
289 gnt_box_set_pad(GNT_BOX(vbox), 0);
290 gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_LEFT);
291
292 /* The dir. and files list */
293 hbox = gnt_hbox_new(FALSE);
294 gnt_box_set_pad(GNT_BOX(hbox), 0);
295 319
296 sel->dirs = gnt_tree_new(); 320 sel->dirs = gnt_tree_new();
297 gnt_tree_set_compare_func(GNT_TREE(sel->dirs), (GCompareFunc)g_utf8_collate); 321 gnt_tree_set_compare_func(GNT_TREE(sel->dirs), (GCompareFunc)g_utf8_collate);
298 gnt_tree_set_hash_fns(GNT_TREE(sel->dirs), g_str_hash, g_str_equal, g_free); 322 gnt_tree_set_hash_fns(GNT_TREE(sel->dirs), g_str_hash, g_str_equal, g_free);
299 gnt_tree_set_column_titles(GNT_TREE(sel->dirs), "Directories"); 323 gnt_tree_set_column_titles(GNT_TREE(sel->dirs), "Directories");
300 gnt_tree_set_show_title(GNT_TREE(sel->dirs), TRUE); 324 gnt_tree_set_show_title(GNT_TREE(sel->dirs), TRUE);
301 gnt_tree_set_col_width(GNT_TREE(sel->dirs), 0, 20); 325 gnt_tree_set_col_width(GNT_TREE(sel->dirs), 0, 20);
302 g_signal_connect(G_OBJECT(sel->dirs), "key_pressed", G_CALLBACK(dir_key_pressed), sel); 326 g_signal_connect(G_OBJECT(sel->dirs), "key_pressed", G_CALLBACK(dir_key_pressed), sel);
303 327
304 sel->files = gnt_tree_new_with_columns(2); /* Name, Size, Modified */ 328 sel->files = gnt_tree_new_with_columns(2); /* Name, Size */
305 gnt_tree_set_compare_func(GNT_TREE(sel->files), (GCompareFunc)g_utf8_collate); 329 gnt_tree_set_compare_func(GNT_TREE(sel->files), (GCompareFunc)g_utf8_collate);
306 /*gnt_tree_set_column_titles(GNT_TREE(sel->files), "Filename", "Size", "Modified");*/
307 gnt_tree_set_column_titles(GNT_TREE(sel->files), "Filename", "Size"); 330 gnt_tree_set_column_titles(GNT_TREE(sel->files), "Filename", "Size");
308 gnt_tree_set_show_title(GNT_TREE(sel->files), TRUE); 331 gnt_tree_set_show_title(GNT_TREE(sel->files), TRUE);
309 gnt_tree_set_col_width(GNT_TREE(sel->files), 0, 25); 332 gnt_tree_set_col_width(GNT_TREE(sel->files), 0, 25);
310 gnt_tree_set_col_width(GNT_TREE(sel->files), 1, 10); 333 gnt_tree_set_col_width(GNT_TREE(sel->files), 1, 10);
311 /*gnt_tree_set_col_width(GNT_TREE(sel->files), 2, 10);*/
312 g_signal_connect(G_OBJECT(sel->files), "selection_changed", G_CALLBACK(file_sel_changed), sel); 334 g_signal_connect(G_OBJECT(sel->files), "selection_changed", G_CALLBACK(file_sel_changed), sel);
313
314 gnt_box_add_widget(GNT_BOX(hbox), sel->dirs);
315 gnt_box_add_widget(GNT_BOX(hbox), sel->files);
316 gnt_box_add_widget(GNT_BOX(vbox), hbox);
317 335
318 /* The location entry */ 336 /* The location entry */
319 sel->location = gnt_entry_new(NULL); 337 sel->location = gnt_entry_new(NULL);
320 gnt_box_add_widget(GNT_BOX(vbox), sel->location);
321 g_signal_connect(G_OBJECT(sel->location), "key_pressed", G_CALLBACK(location_key_pressed), sel); 338 g_signal_connect(G_OBJECT(sel->location), "key_pressed", G_CALLBACK(location_key_pressed), sel);
322 339
323 /* The buttons */
324 hbox = gnt_hbox_new(FALSE);
325 sel->cancel = gnt_button_new("Cancel"); 340 sel->cancel = gnt_button_new("Cancel");
326 sel->select = gnt_button_new("Select"); 341 sel->select = gnt_button_new("Select");
327 gnt_box_add_widget(GNT_BOX(hbox), sel->cancel); 342
328 gnt_box_add_widget(GNT_BOX(hbox), sel->select);
329 gnt_box_add_widget(GNT_BOX(vbox), hbox);
330
331 gnt_box_add_widget(GNT_BOX(sel), vbox);
332 return widget; 343 return widget;
333 } 344 }
334 345
335 gboolean gnt_file_sel_set_current_location(GntFileSel *sel, const char *path) 346 gboolean gnt_file_sel_set_current_location(GntFileSel *sel, const char *path)
336 { 347 {
352 363
353 update_location(sel); 364 update_location(sel);
354 return ret; 365 return ret;
355 } 366 }
356 367
368 void gnt_file_sel_set_dirs_only(GntFileSel *sel, gboolean dirs)
369 {
370 sel->dirsonly = dirs;
371 }
372
373 gboolean gnt_file_sel_get_dirs_only(GntFileSel *sel)
374 {
375 return sel->dirsonly;
376 }
377