comparison src/view_dir_list.c @ 388:5186f8e38cb8

Make directory view popup menu common and move it to view_dir.{c,h}.
author zas_
date Wed, 16 Apr 2008 20:36:10 +0000
parents 2c06e06f4236
children b78077f65eff
comparison
equal deleted inserted replaced
387:de6060230ec5 388:5186f8e38cb8
98 g_free(old_path); 98 g_free(old_path);
99 g_free(new_path); 99 g_free(new_path);
100 return FALSE; 100 return FALSE;
101 } 101 }
102 102
103 static void vdlist_rename_by_row(ViewDir *vd, FileData *fd) 103 void vdlist_rename_by_row(ViewDir *vd, FileData *fd)
104 { 104 {
105 GtkTreeModel *store; 105 GtkTreeModel *store;
106 GtkTreePath *tpath; 106 GtkTreePath *tpath;
107 GtkTreeIter iter; 107 GtkTreeIter iter;
108 108
113 tree_edit_by_path(GTK_TREE_VIEW(vd->view), tpath, 0, fd->name, 113 tree_edit_by_path(GTK_TREE_VIEW(vd->view), tpath, 0, fd->name,
114 vdlist_rename_row_cb, vd); 114 vdlist_rename_row_cb, vd);
115 gtk_tree_path_free(tpath); 115 gtk_tree_path_free(tpath);
116 } 116 }
117 117
118 static FileData *vdlist_row_by_path(ViewDir *vd, const gchar *path, gint *row) 118 FileData *vdlist_row_by_path(ViewDir *vd, const gchar *path, gint *row)
119 { 119 {
120 GList *work; 120 GList *work;
121 gint n; 121 gint n;
122 122
123 if (!path) 123 if (!path)
141 } 141 }
142 142
143 if (row) *row = -1; 143 if (row) *row = -1;
144 return NULL; 144 return NULL;
145 } 145 }
146
147 /*
148 *-----------------------------------------------------------------------------
149 * pop-up menu
150 *-----------------------------------------------------------------------------
151 */
152
153 static void vdlist_pop_menu_up_cb(GtkWidget *widget, gpointer data)
154 {
155 ViewDir *vd = data;
156 gchar *path;
157
158 if (!vd->path || strcmp(vd->path, "/") == 0) return;
159 path = remove_level_from_path(vd->path);
160
161 if (vd->select_func)
162 {
163 vd->select_func(vd, path, vd->select_data);
164 }
165
166 g_free(path);
167 }
168
169 static void vdlist_pop_menu_slide_cb(GtkWidget *widget, gpointer data)
170 {
171 ViewDir *vd = data;
172 gchar *path;
173
174 if (!vd->layout) return;
175 if (!vd->click_fd) return;
176
177 path = vd->click_fd->path;
178
179 layout_set_path(vd->layout, path);
180 layout_select_none(vd->layout);
181 layout_image_slideshow_stop(vd->layout);
182 layout_image_slideshow_start(vd->layout);
183 }
184
185 static void vdlist_pop_menu_slide_rec_cb(GtkWidget *widget, gpointer data)
186 {
187 ViewDir *vd = data;
188 gchar *path;
189 GList *list;
190
191 if (!vd->layout) return;
192 if (!vd->click_fd) return;
193
194 path = vd->click_fd->path;
195
196 list = filelist_recursive(path);
197
198 layout_image_slideshow_stop(vd->layout);
199 layout_image_slideshow_start_from_list(vd->layout, list);
200 }
201
202 static void vdlist_pop_menu_dupe(ViewDir *vd, gint recursive)
203 {
204 DupeWindow *dw;
205 GList *list = NULL;
206
207 if (!vd->click_fd) return;
208
209 if (recursive)
210 {
211 list = g_list_append(list, file_data_ref(vd->click_fd));
212 }
213 else
214 {
215 filelist_read(vd->click_fd->path, &list, NULL);
216 list = filelist_filter(list, FALSE);
217 }
218
219 dw = dupe_window_new(DUPE_MATCH_NAME);
220 dupe_window_add_files(dw, list, recursive);
221
222 filelist_free(list);
223 }
224
225 static void vdlist_pop_menu_dupe_cb(GtkWidget *widget, gpointer data)
226 {
227 ViewDir *vd = data;
228 vdlist_pop_menu_dupe(vd, FALSE);
229 }
230
231 static void vdlist_pop_menu_dupe_rec_cb(GtkWidget *widget, gpointer data)
232 {
233 ViewDir *vd = data;
234 vdlist_pop_menu_dupe(vd, TRUE);
235 }
236
237 static void vdlist_pop_menu_new_cb(GtkWidget *widget, gpointer data)
238 {
239 ViewDir *vd = data;
240 gchar *new_path;
241 gchar *buf;
242
243 if (!vd->path) return;
244
245 buf = concat_dir_and_file(vd->path, _("new_folder"));
246 new_path = unique_filename(buf, NULL, NULL, FALSE);
247 g_free(buf);
248 if (!new_path) return;
249
250 if (!mkdir_utf8(new_path, 0755))
251 {
252 gchar *text;
253
254 text = g_strdup_printf(_("Unable to create folder:\n%s"), new_path);
255 file_util_warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, vd->view);
256 g_free(text);
257 }
258 else
259 {
260 FileData *fd;
261
262 vdlist_refresh(vd);
263 fd = vdlist_row_by_path(vd, new_path, NULL);
264
265 vdlist_rename_by_row(vd, fd);
266 }
267
268 g_free(new_path);
269 }
270
271 static void vdlist_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
272 {
273 ViewDir *vd = data;
274
275 vdlist_rename_by_row(vd, vd->click_fd);
276 }
277
278 static void vdlist_pop_menu_delete_cb(GtkWidget *widget, gpointer data)
279 {
280 ViewDir *vd = data;
281
282 if (!vd->click_fd) return;
283 file_util_delete_dir(vd->click_fd, vd->widget);
284 }
285
286 static void vdlist_pop_menu_dir_view_as_cb(GtkWidget *widget, gpointer data)
287 {
288 ViewDir *vd = data;
289
290 if (vd->layout) layout_views_set(vd->layout, DIRVIEW_TREE, vd->layout->icon_view);
291 }
292
293 static void vdlist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
294 {
295 ViewDir *vd = data;
296
297 if (vd->layout) layout_refresh(vd->layout);
298 }
299
300 static void vdlist_toggle_show_hidden_files_cb(GtkWidget *widget, gpointer data)
301 {
302 ViewDir *vd = data;
303
304 options->file_filter.show_hidden_files = !options->file_filter.show_hidden_files;
305 if (vd->layout) layout_refresh(vd->layout);
306 }
307
308 static GtkWidget *vdlist_pop_menu(ViewDir *vd, FileData *fd)
309 {
310 GtkWidget *menu;
311 gint active;
312
313 active = (fd != NULL);
314
315 menu = popup_menu_short_lived();
316 g_signal_connect(G_OBJECT(menu), "destroy",
317 G_CALLBACK(vd_popup_destroy_cb), vd);
318
319 menu_item_add_stock_sensitive(menu, _("_Up to parent"), GTK_STOCK_GO_UP,
320 (vd->path && strcmp(vd->path, "/") != 0),
321 G_CALLBACK(vdlist_pop_menu_up_cb), vd);
322
323 menu_item_add_divider(menu);
324 menu_item_add_sensitive(menu, _("_Slideshow"), active,
325 G_CALLBACK(vdlist_pop_menu_slide_cb), vd);
326 menu_item_add_sensitive(menu, _("Slideshow recursive"), active,
327 G_CALLBACK(vdlist_pop_menu_slide_rec_cb), vd);
328
329 menu_item_add_divider(menu);
330 menu_item_add_stock_sensitive(menu, _("Find _duplicates..."), GTK_STOCK_FIND, active,
331 G_CALLBACK(vdlist_pop_menu_dupe_cb), vd);
332 menu_item_add_stock_sensitive(menu, _("Find duplicates recursive..."), GTK_STOCK_FIND, active,
333 G_CALLBACK(vdlist_pop_menu_dupe_rec_cb), vd);
334
335 menu_item_add_divider(menu);
336
337 /* check using . (always row 0) */
338 active = (vd->path && access_file(vd->path , W_OK | X_OK));
339 menu_item_add_sensitive(menu, _("_New folder..."), active,
340 G_CALLBACK(vdlist_pop_menu_new_cb), vd);
341
342 /* ignore .. and . */
343 active = (active && fd &&
344 strcmp(fd->name, ".") != 0 &&
345 strcmp(fd->name, "..") != 0 &&
346 access_file(fd->path, W_OK | X_OK));
347 menu_item_add_sensitive(menu, _("_Rename..."), active,
348 G_CALLBACK(vdlist_pop_menu_rename_cb), vd);
349 menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active,
350 G_CALLBACK(vdlist_pop_menu_delete_cb), vd);
351
352 menu_item_add_divider(menu);
353 menu_item_add_check(menu, _("View as _tree"), FALSE,
354 G_CALLBACK(vdlist_pop_menu_dir_view_as_cb), vd);
355 menu_item_add_check(menu, _("Show _hidden files"), options->file_filter.show_hidden_files,
356 G_CALLBACK(vdlist_toggle_show_hidden_files_cb), vd);
357
358 menu_item_add_stock(menu, _("Re_fresh"), GTK_STOCK_REFRESH,
359 G_CALLBACK(vdlist_pop_menu_refresh_cb), vd);
360
361 return menu;
362 }
363
364 146
365 /* 147 /*
366 *----------------------------------------------------------------------------- 148 *-----------------------------------------------------------------------------
367 * dnd 149 * dnd
368 *----------------------------------------------------------------------------- 150 *-----------------------------------------------------------------------------
864 vd->click_fd = NULL; 646 vd->click_fd = NULL;
865 } 647 }
866 648
867 vd_color_set(vd, vd->click_fd, TRUE); 649 vd_color_set(vd, vd->click_fd, TRUE);
868 650
869 vd->popup = vdlist_pop_menu(vd, vd->click_fd); 651 vd->popup = vd_pop_menu(vd, vd->click_fd);
870 652
871 gtk_menu_popup(GTK_MENU(vd->popup), NULL, NULL, vdlist_menu_position_cb, vd, 0, GDK_CURRENT_TIME); 653 gtk_menu_popup(GTK_MENU(vd->popup), NULL, NULL, vdlist_menu_position_cb, vd, 0, GDK_CURRENT_TIME);
872 654
873 return TRUE; 655 return TRUE;
874 } 656 }
895 vd->click_fd = fd; 677 vd->click_fd = fd;
896 vd_color_set(vd, vd->click_fd, TRUE); 678 vd_color_set(vd, vd->click_fd, TRUE);
897 679
898 if (bevent->button == 3) 680 if (bevent->button == 3)
899 { 681 {
900 vd->popup = vdlist_pop_menu(vd, vd->click_fd); 682 vd->popup = vd_pop_menu(vd, vd->click_fd);
901 gtk_menu_popup(GTK_MENU(vd->popup), NULL, NULL, NULL, NULL, 683 gtk_menu_popup(GTK_MENU(vd->popup), NULL, NULL, NULL, NULL,
902 bevent->button, bevent->time); 684 bevent->button, bevent->time);
903 } 685 }
904 686
905 return TRUE; 687 return TRUE;