comparison src/bar_sort.c @ 753:477f48ba28d8

rewritten utilops.h: - better integration of external commands - filter commands
author nadvornik
date Sat, 24 May 2008 22:44:18 +0000
parents e07895754e65
children 7dbdd80610a3
comparison
equal deleted inserted replaced
752:85c9412d77d2 753:477f48ba28d8
18 #include "collect-io.h" 18 #include "collect-io.h"
19 #include "filedata.h" 19 #include "filedata.h"
20 #include "layout.h" 20 #include "layout.h"
21 #include "layout_image.h" 21 #include "layout_image.h"
22 #include "utilops.h" 22 #include "utilops.h"
23 #include "editors.h"
23 #include "ui_bookmark.h" 24 #include "ui_bookmark.h"
24 #include "ui_fileops.h" 25 #include "ui_fileops.h"
25 #include "ui_menu.h" 26 #include "ui_menu.h"
26 #include "ui_misc.h" 27 #include "ui_misc.h"
27 28
39 } SortModeType; 40 } SortModeType;
40 41
41 typedef enum { 42 typedef enum {
42 BAR_SORT_COPY = 0, 43 BAR_SORT_COPY = 0,
43 BAR_SORT_MOVE, 44 BAR_SORT_MOVE,
44 BAR_SORT_LINK, 45 BAR_SORT_FILTER,
45 BAR_SORT_ACTION_COUNT 46 BAR_SORT_ACTION_COUNT = BAR_SORT_FILTER + GQ_EDITOR_GENERIC_SLOTS
46 } SortActionType; 47 } SortActionType;
47 48
48 typedef enum { 49 typedef enum {
49 BAR_SORT_SELECTION_IMAGE = 0, 50 BAR_SORT_SELECTION_IMAGE = 0,
50 BAR_SORT_SELECTION_SELECTED, 51 BAR_SORT_SELECTION_SELECTED,
201 GList *list; 202 GList *list;
202 gchar *src_dir; 203 gchar *src_dir;
203 204
204 list = g_list_append(NULL, file_data_new_simple(sd->undo_dest)); 205 list = g_list_append(NULL, file_data_new_simple(sd->undo_dest));
205 src_dir = remove_level_from_path(sd->undo_src); 206 src_dir = remove_level_from_path(sd->undo_src);
206 file_util_move_simple(list, src_dir); 207 file_util_move_simple(list, src_dir, sd->lw->window);
207 g_free(src_dir); 208 g_free(src_dir);
208 } 209 }
209 break; 210 break;
210 case BAR_SORT_COPY: 211 case BAR_SORT_COPY:
211 file_util_delete(file_data_new_simple(sd->undo_dest), NULL, button); 212 file_util_delete(file_data_new_simple(sd->undo_dest), NULL, button);
212 break; 213 break;
213 case BAR_SORT_LINK:
214 if (!unlink_file(sd->undo_dest))
215 {
216 gchar *buf;
217
218 buf = g_strdup_printf(_("Unable to remove symbolic link:\n%s"), sd->undo_dest);
219 file_util_warning_dialog(_("Unlink failed"), buf, GTK_STOCK_DIALOG_ERROR, button);
220 g_free(buf);
221 }
222 break;
223 default: 214 default:
215 /* undo external command */
216 file_util_delete(file_data_new_simple(sd->undo_dest), NULL, button);
224 break; 217 break;
225 } 218 }
226 219
227 layout_refresh(sd->lw); 220 layout_refresh(sd->lw);
228 221
278 list = g_list_append(NULL, file_data_ref(source)); 271 list = g_list_append(NULL, file_data_ref(source));
279 272
280 switch (sd->action) 273 switch (sd->action)
281 { 274 {
282 case BAR_SORT_COPY: 275 case BAR_SORT_COPY:
283 file_util_copy_simple(list, path); 276 file_util_copy_simple(list, path, sd->lw->window);
284 list = NULL; 277 list = NULL;
285 layout_image_next(sd->lw); 278 layout_image_next(sd->lw);
286 break; 279 break;
287 case BAR_SORT_MOVE: 280 case BAR_SORT_MOVE:
288 file_util_move_simple(list, path); 281 file_util_move_simple(list, path, sd->lw->window);
289 list = NULL; 282 list = NULL;
290 break; 283 break;
291 case BAR_SORT_LINK: 284 default:
292 if (symlink_utf8(source->path, dest_path)) 285 if (sd->action >= BAR_SORT_FILTER && sd->action < BAR_SORT_ACTION_COUNT)
293 { 286 {
287 file_util_start_filter_from_filelist(sd->action - BAR_SORT_FILTER, list, path, sd->lw->window);
288 list = NULL;
294 layout_image_next(sd->lw); 289 layout_image_next(sd->lw);
295 } 290 }
296 else
297 {
298 gchar *buf;
299
300 buf = g_strdup_printf(_("Unable to create symbolic link:\n%s"), dest_path);
301 file_util_warning_dialog(_("Link failed"), buf, GTK_STOCK_DIALOG_ERROR, sd->bookmarks);
302
303 g_free(buf);
304 }
305 break;
306 default:
307 break; 291 break;
308 } 292 }
309 293
310 g_list_free(list); 294 g_list_free(list);
311 g_free(dest_path); 295 g_free(dest_path);
380 SortData *sd = data; 364 SortData *sd = data;
381 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return; 365 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return;
382 bar_sort_set_action(sd, BAR_SORT_MOVE); 366 bar_sort_set_action(sd, BAR_SORT_MOVE);
383 } 367 }
384 368
385 static void bar_sort_set_link_cb(GtkWidget *button, gpointer data) 369 static void bar_sort_set_filter_cb(GtkWidget *button, gpointer data)
386 { 370 {
387 SortData *sd = data; 371 SortData *sd = data;
372 gint n;
388 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return; 373 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return;
389 bar_sort_set_action(sd, BAR_SORT_LINK); 374 n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "filter_idx"));
375 if (n == 0) return;
376 n--;
377 bar_sort_set_action(sd, BAR_SORT_FILTER + n);
390 } 378 }
391 379
392 static void bar_sort_set_selection(SortData *sd, SortSelectionType selection) 380 static void bar_sort_set_selection(SortData *sd, SortSelectionType selection)
393 { 381 {
394 options->panels.sort.selection_state = sd->selection = selection; 382 options->panels.sort.selection_state = sd->selection = selection;
559 GtkWidget *buttongrp; 547 GtkWidget *buttongrp;
560 GtkWidget *label; 548 GtkWidget *label;
561 GtkWidget *tbar; 549 GtkWidget *tbar;
562 GtkWidget *combo; 550 GtkWidget *combo;
563 SortModeType mode; 551 SortModeType mode;
552 guint i;
564 553
565 if (!lw) return NULL; 554 if (!lw) return NULL;
566 555
567 sd = g_new0(SortData, 1); 556 sd = g_new0(SortData, 1);
568 557
569 sd->lw = lw; 558 sd->lw = lw;
570 559
571 mode = CLAMP(options->panels.sort.mode_state, 0, BAR_SORT_MODE_COUNT - 1); 560 mode = CLAMP(options->panels.sort.mode_state, 0, BAR_SORT_MODE_COUNT - 1);
572 sd->action = CLAMP(options->panels.sort.action_state, 0, BAR_SORT_ACTION_COUNT - 1); 561 sd->action = CLAMP(options->panels.sort.action_state, 0, BAR_SORT_ACTION_COUNT - 1);
562
563 while (sd->action >= BAR_SORT_FILTER && !editor_is_filter(sd->action - BAR_SORT_FILTER)) sd->action--;
564
573 sd->selection = CLAMP(options->panels.sort.selection_state, 0, BAR_SORT_SELECTION_COUNT - 1); 565 sd->selection = CLAMP(options->panels.sort.selection_state, 0, BAR_SORT_SELECTION_COUNT - 1);
574 sd->undo_src = NULL; 566 sd->undo_src = NULL;
575 sd->undo_dest = NULL; 567 sd->undo_dest = NULL;
576 568
577 sd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); 569 sd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
600 _("Copy"), (sd->action == BAR_SORT_COPY), 592 _("Copy"), (sd->action == BAR_SORT_COPY),
601 G_CALLBACK(bar_sort_set_copy_cb), sd); 593 G_CALLBACK(bar_sort_set_copy_cb), sd);
602 pref_radiobutton_new(sd->folder_group, buttongrp, 594 pref_radiobutton_new(sd->folder_group, buttongrp,
603 _("Move"), (sd->action == BAR_SORT_MOVE), 595 _("Move"), (sd->action == BAR_SORT_MOVE),
604 G_CALLBACK(bar_sort_set_move_cb), sd); 596 G_CALLBACK(bar_sort_set_move_cb), sd);
605 pref_radiobutton_new(sd->folder_group, buttongrp, 597
606 _("Link"), (sd->action == BAR_SORT_LINK), 598
607 G_CALLBACK(bar_sort_set_link_cb), sd); 599 for (i = 0; i < GQ_EDITOR_GENERIC_SLOTS; i++)
600 {
601 GtkWidget *button;
602
603 const gchar *name = editor_get_name(i);
604 if (!name || !editor_is_filter(i)) continue;
605
606 button = pref_radiobutton_new(sd->folder_group, buttongrp,
607 name, (sd->action == BAR_SORT_FILTER + i),
608 G_CALLBACK(bar_sort_set_filter_cb), sd);
609
610
611 g_object_set_data(G_OBJECT(button), "filter_idx", GUINT_TO_POINTER(i + 1));
612 }
613
608 614
609 sd->collection_group = pref_box_new(sd->vbox, FALSE, GTK_ORIENTATION_VERTICAL, 0); 615 sd->collection_group = pref_box_new(sd->vbox, FALSE, GTK_ORIENTATION_VERTICAL, 0);
610 616
611 buttongrp = pref_radiobutton_new(sd->collection_group, NULL, 617 buttongrp = pref_radiobutton_new(sd->collection_group, NULL,
612 _("Add image"), (sd->selection == BAR_SORT_SELECTION_IMAGE), 618 _("Add image"), (sd->selection == BAR_SORT_SELECTION_IMAGE),