96
103
rs_core_action_group_set_sensivity("Uncrop", (RS_IS_PHOTO(rs->photo) && rs->photo->crop));
97
104
rs_core_action_group_set_sensivity("Straighten", RS_IS_PHOTO(rs->photo));
98
105
rs_core_action_group_set_sensivity("Unstraighten", (RS_IS_PHOTO(rs->photo) && (rs->photo->angle != 0.0)));
106
rs_core_action_group_set_sensivity("TagPhoto", RS_IS_PHOTO(rs->photo));
99
107
rs_core_action_group_set_sensivity("Group", (num_selected > 1));
100
108
rs_core_action_group_set_sensivity("Ungroup", (selected_groups > 0));
109
rs_core_action_group_set_sensivity("RotateClockwise", RS_IS_PHOTO(rs->photo));
110
rs_core_action_group_set_sensivity("RotateCounterClockwise", RS_IS_PHOTO(rs->photo));
111
rs_core_action_group_set_sensivity("Flip", RS_IS_PHOTO(rs->photo));
112
rs_core_action_group_set_sensivity("Mirror", RS_IS_PHOTO(rs->photo));
101
113
#ifndef EXPERIMENTAL
102
114
rs_core_action_group_set_visibility("Group", FALSE);
103
115
rs_core_action_group_set_visibility("Ungroup", FALSE);
104
116
rs_core_action_group_set_visibility("AutoGroup", FALSE);
120
rs_core_action_group_set_sensivity("Lightsout", !rs->window_fullscreen);
123
rs_core_action_group_set_sensivity("AddToBatch", (num_selected >= 1) || (rs->photo && !rs_batch_exists_in_queue(rs->queue, rs->photo->filename, rs->current_setting)));
124
rs_core_action_group_set_sensivity("RemoveFromBatch", (num_selected >= 1) || (rs->photo && rs_batch_exists_in_queue(rs->queue, rs->photo->filename, rs->current_setting)));
125
rs_core_action_group_set_sensivity("ProcessBatch", (rs_batch_num_entries(rs->queue)>0));
128
rs_core_action_group_set_sensivity("Crop", RS_IS_PHOTO(rs->photo));
129
rs_core_action_group_set_sensivity("Uncrop", (RS_IS_PHOTO(rs->photo) && rs->photo->crop));
130
rs_core_action_group_set_sensivity("Straighten", RS_IS_PHOTO(rs->photo));
131
rs_core_action_group_set_sensivity("Unstraighten", (RS_IS_PHOTO(rs->photo) && (rs->photo->angle != 0.0)));
106
133
g_list_free(selected);
139
rs_core_actions_update_menu_items(rs);
144
rs_core_actions_update_menu_items(rs);
150
rs_core_actions_update_menu_items(rs);
155
rs_core_actions_update_menu_items(rs);
109
158
ACTION(batch_menu)
111
GList *selected = NULL;
113
gboolean photos_selected;
115
selected = rs_store_get_selected_names(rs->store);
116
num_selected = g_list_length(selected);
118
photos_selected = (RS_IS_PHOTO(rs->photo) || (num_selected > 0));
120
rs_core_action_group_set_sensivity("AddToBatch", photos_selected && !rs_batch_exists_in_queue(rs->queue, rs->photo->filename, rs->current_setting));
121
rs_core_action_group_set_sensivity("RemoveFromBatch", photos_selected && rs->photo && rs_batch_exists_in_queue(rs->queue, rs->photo->filename, rs->current_setting));
122
rs_core_action_group_set_sensivity("ProcessBatch", (rs_batch_num_entries(rs->queue)>0));
123
g_list_free(selected);
160
rs_core_actions_update_menu_items(rs);
126
163
ACTION(preview_popup)
128
rs_core_action_group_set_sensivity("Crop", RS_IS_PHOTO(rs->photo));
129
rs_core_action_group_set_sensivity("Uncrop", (RS_IS_PHOTO(rs->photo) && rs->photo->crop));
130
rs_core_action_group_set_sensivity("Straighten", RS_IS_PHOTO(rs->photo));
131
rs_core_action_group_set_sensivity("Unstraighten", (RS_IS_PHOTO(rs->photo) && (rs->photo->angle != 0.0)));
165
rs_core_actions_update_menu_items(rs);
158
193
gtk_widget_destroy (fc);
196
rs_core_actions_update_menu_items(rs);
163
199
ACTION(quick_export)
166
gchar *conf_export_directory;
167
gchar *conf_export_filename;
168
GString *export_path;
170
gchar *parsed_filename;
171
RS_FILETYPE *filetype;
174
if (!rs->photo) return;
176
dirname = g_path_get_dirname(rs->photo->filename);
202
gchar *filename_template;
203
gchar *parsed_filename = NULL;
204
gchar *parsed_dir = NULL;
205
gchar *output_identifier;
207
directory = rs_conf_get_string("quick-export-directory");
208
filename_template = rs_conf_get_string("quick-export-filename");
209
output_identifier = rs_conf_get_string("quick-export-filetype");
211
/* Initialize directory to home dir if nothing is saved in config */
214
const char *homedir = g_getenv("HOME");
216
homedir = g_get_home_dir();
217
directory = g_strdup(homedir);
220
/* Initialize filename_template to default if nothing is saved in config */
221
if (!filename_template)
222
filename_template = g_strdup(DEFAULT_CONF_EXPORT_FILENAME);
224
/* Output as Jpeg, if nothing is saved in config */
225
if (!output_identifier)
226
output_identifier = g_strdup("RSJpeg");
228
RSOutput *output = rs_output_new(output_identifier);
230
GString *filename = NULL;
231
/* Build new filename */
232
if (NULL == g_strrstr(filename_template, "%p"))
234
filename = g_string_new(directory);
235
g_string_append(filename, G_DIR_SEPARATOR_S);
236
g_string_append(filename, filename_template);
239
filename = g_string_new(filename_template);
178
conf_export_directory = rs_conf_get_string(CONF_EXPORT_DIRECTORY);
179
if (!conf_export_directory)
180
conf_export_directory = g_strdup(DEFAULT_CONF_EXPORT_DIRECTORY);
182
conf_export_filename = rs_conf_get_string(CONF_EXPORT_FILENAME);
183
if (!conf_export_filename)
184
conf_export_filename = DEFAULT_CONF_EXPORT_FILENAME;
186
rs_conf_get_filetype(CONF_EXPORT_FILETYPE, &filetype);
188
if (conf_export_directory)
241
g_string_append(filename, ".");
242
g_string_append(filename, rs_output_get_extension(output));
244
parsed_filename = filename_parse(filename->str, rs->photo->filename, rs->current_setting);
246
if (parsed_filename && output)
190
if (conf_export_directory[0]==G_DIR_SEPARATOR)
248
/* Create directory, if it doesn't exist */
249
parsed_dir = g_path_get_dirname(parsed_filename);
250
if (FALSE == g_file_test(parsed_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))
251
if (g_mkdir_with_parents(parsed_dir, 0x1ff))
253
gui_status_notify(_("Could not create output directory."));
257
guint msg = gui_status_push(_("Exporting..."));
260
g_object_set(output, "filename", parsed_filename, NULL);
261
rs_output_set_from_conf(output, "quick-export");
263
if (rs_photo_save(rs->photo, rs->filter_end, output, -1, -1, FALSE, 1.0, rs->current_setting))
193
dirname = conf_export_directory;
265
gchar *status = g_strdup_printf("%s (%s)", _("File exported"), parsed_filename);
266
gui_status_notify(status);
197
export_path = g_string_new(dirname);
198
g_string_append(export_path, G_DIR_SEPARATOR_S);
199
g_string_append(export_path, conf_export_directory);
201
dirname = export_path->str;
202
g_string_free(export_path, FALSE);
203
g_free(conf_export_directory);
205
g_mkdir_with_parents(dirname, 00755);
270
gui_status_notify(_("Export failed"));
208
save = g_string_new(dirname);
209
if (dirname[strlen(dirname)-1] != G_DIR_SEPARATOR)
210
g_string_append(save, G_DIR_SEPARATOR_S);
211
g_string_append(save, conf_export_filename);
213
g_string_append(save, filetype->ext);
215
parsed_filename = filename_parse(save->str, rs->photo->filename, rs->current_setting);
216
g_string_free(save, TRUE);
218
rs_photo_save(rs->photo, parsed_filename, filetype->filetype, -1, -1, FALSE, 1.0, rs->current_setting, rs->cms);
219
status = g_string_new("");
220
g_string_printf(status, "%s (%s)", _("File exported"), parsed_filename);
221
gui_status_notify(status->str);
222
g_string_free(status, TRUE);
276
g_object_unref(output);
223
278
g_free(parsed_filename);
280
g_free(output_identifier);
281
g_string_free(filename, TRUE);
226
284
ACTION(export_as)
228
gui_save_file_dialog(rs);
286
if (RS_IS_PHOTO(rs->photo))
288
RSSaveDialog *dialog = rs_save_dialog_new();
289
rs_save_dialog_set_photo(dialog, rs->photo, rs->current_setting);
290
gtk_widget_show(GTK_WIDGET(dialog));
293
gui_status_notify(_("Export failed"));
231
296
ACTION(export_to_gimp)
233
298
if (!RS_IS_PHOTO(rs->photo)) return;
235
if (!rs_external_editor_gimp(rs->photo, rs->current_setting, rs->cms))
300
guint status = gui_status_push(_("Exporting to GIMP..."));
302
if (!rs_external_editor_gimp(rs->photo, rs->filter_end, rs->current_setting))
237
304
GtkWidget *dialog = gui_dialog_make_from_text(GTK_STOCK_DIALOG_WARNING,
238
305
_("Error exporting"),
322
391
rs_photo_close(rs->photo);
323
392
rs_conf_set_integer(CONF_LAST_PRIORITY_PAGE, rs_store_get_current_page(rs->store));
393
rs_io_idle_cancel_class(METADATA_CLASS);
394
rs_io_idle_cancel_class(PRELOAD_CLASS);
395
rs_io_idle_cancel_class(RESTORE_TAGS_CLASS);
397
RS_PROGRESS *progress;
398
gint total_items = rs_io_get_jobs_left();
401
progress = gui_progress_new(_("Waiting for jobs to finish"), total_items);
402
gtk_widget_hide(rs->window);
403
gint items = total_items;
407
items = rs_io_get_jobs_left();
408
gui_progress_set_current(progress, total_items-items);
420
guint msg = gui_status_push(_("Copying image to clipboard"));
424
if (rs_photo_copy_to_clipboard(rs->photo, rs->filter_end, -1, -1, FALSE, 1.0, rs->current_setting))
425
gui_status_notify(_("Image copied to clipboard"));
427
gui_status_notify(_("ERROR: Could not copy image to clipboard"));
327
432
ACTION(revert_settings)
329
434
if (RS_IS_PHOTO(rs->photo))
330
435
rs_cache_load(rs->photo);
438
static const gint COPY_MASK_ALL = MASK_PROFILE|MASK_EXPOSURE|MASK_SATURATION|MASK_HUE|
439
MASK_CONTRAST|MASK_WB|MASK_SHARPEN|MASK_DENOISE_LUMA|MASK_DENOISE_CHROMA|
440
MASK_CHANNELMIXER|MASK_TCA|MASK_VIGNETTING|MASK_CURVE;
442
/* Widgets for copy dialog */
443
static GtkWidget *cb_profile, *cb_exposure, *cb_saturation, *cb_hue, *cb_contrast, *cb_whitebalance, *cb_curve, *cb_sharpen, *cb_denoise_luma, *cb_denoise_chroma, *cb_channelmixer, *cb_tca, *cb_vignetting, *b_all_none;
446
all_none_clicked(GtkButton *button, gpointer user_data)
448
gint mask= copy_dialog_get_mask();
449
if (mask == COPY_MASK_ALL)
452
mask = COPY_MASK_ALL;
454
copy_dialog_set_mask(mask);
458
create_copy_dialog(gint mask)
463
cb_profile = gtk_check_button_new_with_label (_("Profile"));
464
cb_exposure = gtk_check_button_new_with_label (_("Exposure"));
465
cb_saturation = gtk_check_button_new_with_label (_("Saturation"));
466
cb_hue = gtk_check_button_new_with_label (_("Hue"));
467
cb_contrast = gtk_check_button_new_with_label (_("Contrast"));
468
cb_whitebalance = gtk_check_button_new_with_label (_("White balance"));
469
cb_sharpen = gtk_check_button_new_with_label (_("Sharpen"));
470
cb_denoise_luma = gtk_check_button_new_with_label (_("Denoise"));
471
cb_denoise_chroma = gtk_check_button_new_with_label (_("Color denoise"));
472
cb_channelmixer = gtk_check_button_new_with_label (_("Channel mixer"));
473
cb_tca = gtk_check_button_new_with_label (_("TCA"));
474
cb_vignetting = gtk_check_button_new_with_label (_("Vignetting"));
475
cb_curve = gtk_check_button_new_with_label (_("Curve"));
476
b_all_none = gtk_button_new_with_label (_("Select All/None"));
478
g_signal_connect(b_all_none, "clicked", G_CALLBACK(all_none_clicked), NULL);
480
copy_dialog_set_mask(mask);
481
cb_box = gtk_vbox_new(FALSE, 0);
483
gtk_box_pack_start (GTK_BOX (cb_box), cb_profile, FALSE, TRUE, 0);
484
gtk_box_pack_start (GTK_BOX (cb_box), cb_exposure, FALSE, TRUE, 0);
485
gtk_box_pack_start (GTK_BOX (cb_box), cb_saturation, FALSE, TRUE, 0);
486
gtk_box_pack_start (GTK_BOX (cb_box), cb_hue, FALSE, TRUE, 0);
487
gtk_box_pack_start (GTK_BOX (cb_box), cb_contrast, FALSE, TRUE, 0);
488
gtk_box_pack_start (GTK_BOX (cb_box), cb_whitebalance, FALSE, TRUE, 0);
489
gtk_box_pack_start (GTK_BOX (cb_box), cb_sharpen, FALSE, TRUE, 0);
490
gtk_box_pack_start (GTK_BOX (cb_box), cb_denoise_luma, FALSE, TRUE, 0);
491
gtk_box_pack_start (GTK_BOX (cb_box), cb_denoise_chroma, FALSE, TRUE, 0);
492
gtk_box_pack_start (GTK_BOX (cb_box), cb_channelmixer, FALSE, TRUE, 0);
493
gtk_box_pack_start (GTK_BOX (cb_box), cb_tca, FALSE, TRUE, 0);
494
gtk_box_pack_start (GTK_BOX (cb_box), cb_vignetting, FALSE, TRUE, 0);
495
gtk_box_pack_start (GTK_BOX (cb_box), cb_curve, FALSE, TRUE, 0);
496
gtk_box_pack_start (GTK_BOX (cb_box), b_all_none, FALSE, TRUE, 0);
498
dialog = gui_dialog_make_from_widget(GTK_STOCK_DIALOG_QUESTION, _("Select settings to copy"), cb_box);
500
gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
501
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK);
506
copy_dialog_set_mask(gint mask)
508
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_profile), !!(mask & MASK_PROFILE));
509
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_exposure), !!(mask & MASK_EXPOSURE));
510
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_saturation), !!(mask & MASK_SATURATION));
511
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_hue), !!(mask & MASK_HUE));
512
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_contrast), !!(mask & MASK_CONTRAST));
513
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_whitebalance), !!(mask & MASK_WB));
514
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_sharpen), !!(mask & MASK_SHARPEN));
515
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_denoise_luma), !!(mask & MASK_DENOISE_LUMA));
516
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_denoise_chroma), !!(mask & MASK_DENOISE_CHROMA));
517
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_channelmixer), !!(mask & MASK_CHANNELMIXER));
518
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_tca), !!(mask & MASK_TCA));
519
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_vignetting), !!(mask & MASK_VIGNETTING));
520
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_curve), !!(mask & MASK_CURVE));
524
copy_dialog_get_mask(void)
527
if (GTK_TOGGLE_BUTTON(cb_profile)->active)
528
mask |= MASK_PROFILE;
529
if (GTK_TOGGLE_BUTTON(cb_exposure)->active)
530
mask |= MASK_EXPOSURE;
531
if (GTK_TOGGLE_BUTTON(cb_saturation)->active)
532
mask |= MASK_SATURATION;
533
if (GTK_TOGGLE_BUTTON(cb_hue)->active)
535
if (GTK_TOGGLE_BUTTON(cb_contrast)->active)
536
mask |= MASK_CONTRAST;
537
if (GTK_TOGGLE_BUTTON(cb_whitebalance)->active)
539
if (GTK_TOGGLE_BUTTON(cb_sharpen)->active)
540
mask |= MASK_SHARPEN;
541
if (GTK_TOGGLE_BUTTON(cb_denoise_luma)->active)
542
mask |= MASK_DENOISE_LUMA;
543
if (GTK_TOGGLE_BUTTON(cb_denoise_chroma)->active)
544
mask |= MASK_DENOISE_CHROMA;
545
if (GTK_TOGGLE_BUTTON(cb_channelmixer)->active)
546
mask |= MASK_CHANNELMIXER;
547
if (GTK_TOGGLE_BUTTON(cb_tca)->active)
549
if (GTK_TOGGLE_BUTTON(cb_vignetting)->active)
550
mask |= MASK_VIGNETTING;
551
if (GTK_TOGGLE_BUTTON(cb_curve)->active)
333
556
ACTION(copy_settings)
558
gint mask = COPY_MASK_ALL; /* Should be RSSettingsMask, is gint to satisfy rs_conf_get_integer() */
335
561
if (!rs->settings_buffer)
336
562
rs->settings_buffer = rs_settings_new();
337
rs_settings_copy(rs->settings[rs->current_setting], MASK_ALL, rs->settings_buffer);
338
gui_status_notify(_("Copied settings"));
566
rs_conf_get_integer(CONF_PASTE_MASK, &mask);
567
dialog = create_copy_dialog(mask);
568
gtk_widget_show_all(dialog);
570
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
572
mask = copy_dialog_get_mask();
573
rs_conf_set_integer(CONF_PASTE_MASK, mask);
574
rs_settings_copy(rs->photo->settings[rs->current_setting], MASK_ALL, rs->settings_buffer);
575
rs->dcp_buffer = rs_photo_get_dcp_profile(rs->photo);
576
rs->icc_buffer = rs_photo_get_icc_profile(rs->photo);
577
gui_status_notify(_("Copied settings"));
579
gtk_widget_destroy (dialog);
341
582
ACTION(paste_settings)
343
gint mask = 0xffffff; /* Should be RSSettingsMask, is gint to satisfy rs_conf_get_integer() */
345
GtkWidget *dialog, *cb_box;
346
GtkWidget *cb_exposure, *cb_saturation, *cb_hue, *cb_contrast, *cb_whitebalance, *cb_curve, *cb_sharpen;
584
gint mask = COPY_MASK_ALL; /* Should be RSSettingsMask, is gint to satisfy rs_conf_get_integer() */
587
guint msg = gui_status_push(_("Pasting settings to images"));
348
589
if (rs->settings_buffer)
351
cb_exposure = gtk_check_button_new_with_label (_("Exposure"));
352
cb_saturation = gtk_check_button_new_with_label (_("Saturation"));
353
cb_hue = gtk_check_button_new_with_label (_("Hue"));
354
cb_contrast = gtk_check_button_new_with_label (_("Contrast"));
355
cb_whitebalance = gtk_check_button_new_with_label (_("White balance"));
356
cb_sharpen = gtk_check_button_new_with_label (_("Sharpen"));
357
cb_curve = gtk_check_button_new_with_label (_("Curve"));
359
591
rs_conf_get_integer(CONF_PASTE_MASK, &mask);
361
if (mask & MASK_EXPOSURE)
362
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_exposure), TRUE);
363
if (mask & MASK_SATURATION)
364
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_saturation), TRUE);
366
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_hue), TRUE);
367
if (mask & MASK_CONTRAST)
368
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_contrast), TRUE);
369
if (mask & MASK_WARMTH && mask & MASK_TINT)
370
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_whitebalance), TRUE);
371
if (mask & MASK_SHARPEN)
372
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_sharpen), TRUE);
373
if (mask & MASK_CURVE)
374
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_curve), TRUE);
376
cb_box = gtk_vbox_new(FALSE, 0);
378
gtk_box_pack_start (GTK_BOX (cb_box), cb_exposure, FALSE, TRUE, 0);
379
gtk_box_pack_start (GTK_BOX (cb_box), cb_saturation, FALSE, TRUE, 0);
380
gtk_box_pack_start (GTK_BOX (cb_box), cb_hue, FALSE, TRUE, 0);
381
gtk_box_pack_start (GTK_BOX (cb_box), cb_contrast, FALSE, TRUE, 0);
382
gtk_box_pack_start (GTK_BOX (cb_box), cb_whitebalance, FALSE, TRUE, 0);
383
gtk_box_pack_start (GTK_BOX (cb_box), cb_sharpen, FALSE, TRUE, 0);
384
gtk_box_pack_start (GTK_BOX (cb_box), cb_curve, FALSE, TRUE, 0);
386
dialog = gui_dialog_make_from_widget(GTK_STOCK_DIALOG_QUESTION, _("Select settings to paste"), cb_box);
388
gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, NULL);
389
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_APPLY);
391
gtk_widget_show_all(dialog);
395
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_APPLY)
397
if (GTK_TOGGLE_BUTTON(cb_exposure)->active)
398
mask |= MASK_EXPOSURE;
399
if (GTK_TOGGLE_BUTTON(cb_saturation)->active)
400
mask |= MASK_SATURATION;
401
if (GTK_TOGGLE_BUTTON(cb_hue)->active)
403
if (GTK_TOGGLE_BUTTON(cb_contrast)->active)
404
mask |= MASK_CONTRAST;
405
if (GTK_TOGGLE_BUTTON(cb_whitebalance)->active)
407
if (GTK_TOGGLE_BUTTON(cb_sharpen)->active)
408
mask |= MASK_SHARPEN;
409
if (GTK_TOGGLE_BUTTON(cb_curve)->active)
411
rs_conf_set_integer(CONF_PASTE_MASK, mask);
413
gtk_widget_destroy (dialog);
594
RSMetadata *metadata;
419
597
GList *selected = NULL;
485
726
gui_setprio(rs, PRIO_U);
730
set_wb_on_multiple_photos(GList *selected, gint current_setting, const gchar *wb_ascii)
732
gint num_selected = g_list_length(selected);
736
if (num_selected > 1)
741
for(cur=0;cur<num_selected;cur++)
743
/* This is nothing but a hack around rs_cache_*() */
744
photo = rs_photo_new();
745
photo->filename = g_strdup(g_list_nth_data(selected, cur));
746
if (rs_metadata_load(photo->metadata, photo->filename))
748
/* Rotate photo inplace */
749
switch (photo->metadata->orientation)
751
case 90: ORIENTATION_90(photo->orientation);
753
case 180: ORIENTATION_180(photo->orientation);
755
case 270: ORIENTATION_270(photo->orientation);
759
load_mask = rs_cache_load(photo);
760
rs_settings_set_wb(photo->settings[current_setting], 0.0, 0.0, wb_ascii);
761
rs_cache_save(photo, load_mask | MASK_WB);
762
g_object_unref(photo);
765
g_list_free(selected);
490
if (RS_IS_PHOTO(rs->photo))
771
if (RS_IS_PHOTO(rs->photo) && rs_store_is_photo_selected(rs->store, rs->photo->filename))
492
773
gui_status_notify(_("Adjusting to auto white balance"));
493
774
rs_photo_set_wb_auto(rs->photo, rs->current_setting);
777
/* Apply to all selected photos */
778
set_wb_on_multiple_photos(rs_store_get_selected_names(rs->store), rs->current_setting, PRESET_WB_AUTO);
497
781
ACTION(camera_wb)
499
if (RS_IS_PHOTO(rs->photo))
783
if (RS_IS_PHOTO(rs->photo) && rs_store_is_photo_selected(rs->store, rs->photo->filename))
501
if (rs->photo->metadata->cam_mul[R] == -1.0)
785
if (rs->photo && !rs->photo->dcp)
786
rs_photo_set_wb_from_camera(rs->photo, rs->current_setting);
787
else if (rs->photo && rs->photo->metadata && rs->photo->metadata->cam_mul[R] == -1.0)
502
788
gui_status_notify(_("No white balance to set from"));
505
791
gui_status_notify(_("Adjusting to camera white balance"));
506
rs_photo_set_wb_from_mul(rs->photo, rs->current_setting, rs->photo->metadata->cam_mul);
792
rs_photo_set_wb_from_camera(rs->photo, rs->current_setting);
796
/* Apply to all selected photos */
797
set_wb_on_multiple_photos(rs_store_get_selected_names(rs->store), rs->current_setting, PRESET_WB_CAMERA);
513
802
rs_preview_widget_crop_start(RS_PREVIEW_WIDGET(rs->preview));
803
rs_core_actions_update_menu_items(rs);
518
808
rs_preview_widget_uncrop(RS_PREVIEW_WIDGET(rs->preview));
809
rs_core_actions_update_menu_items(rs);
521
812
ACTION(straighten)
543
858
rs_store_auto_group(rs->store);
861
typedef struct TagPhotoData {
867
tag_photo_input_changed(GtkWidget *button, gpointer user_data)
871
RSLibrary *library = rs_library_get_singleton();
872
TagPhotoData *info = (TagPhotoData*)(user_data);
873
RS_BLOB *rs = info->rs;
874
GtkEntry *entry = info->entry;
876
GList * selected = rs_store_get_selected_names(rs->store);
877
gint num_selected = g_list_length(selected);
879
GHashTable* directories = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
881
const char* entry_text = gtk_entry_get_text(entry);
882
if (num_selected > 0 && entry_text)
884
GList *tags = rs_split_string(entry_text, " .,/;:~^*|&");
885
for(i = 0; i < g_list_length(tags); i++)
887
gchar *tag = (gchar *) g_list_nth_data(tags, i);
888
gint tag_id = rs_library_add_tag(library, tag);
891
for(cur=0;cur<num_selected;cur++)
893
gchar* filename = g_list_nth_data(selected, cur);
894
rs_io_idle_add_tag(filename, tag_id, FALSE, -1);
898
gchar* dir = g_path_get_dirname(filename);
899
if (NULL == g_hash_table_lookup(directories, dir))
900
g_hash_table_insert(directories, dir, filename);
907
g_hash_table_iter_init (&iter, directories);
908
while (g_hash_table_iter_next (&iter, &key, &value))
910
rs_io_idle_add_tag(value, -2, FALSE, -1);
912
g_hash_table_remove_all(directories);
915
GdkWindow *window = gtk_widget_get_parent_window(GTK_WIDGET(entry));
916
gdk_window_destroy(window);
917
g_list_free(selected);
923
GtkWidget *popup = gtk_window_new(GTK_WINDOW_TOPLEVEL);
924
gtk_window_set_transient_for(GTK_WINDOW(popup), GTK_WINDOW(rs->window));
925
gtk_window_set_type_hint(GTK_WINDOW(popup), GDK_WINDOW_TYPE_HINT_UTILITY);
926
GtkWidget *label = gtk_label_new(_("Tags, separated by spaces:"));
927
GtkWidget *box = gtk_hbox_new(FALSE, 10);
928
GtkWidget *entry = rs_library_tag_entry_new(rs_library_get_singleton());
929
GtkWidget *apply_button = gtk_button_new_from_stock(GTK_STOCK_APPLY);
931
gtk_window_set_title(GTK_WINDOW(popup), _("Add tags to selected photo(s)."));
932
gtk_window_set_position(GTK_WINDOW(popup), GTK_WIN_POS_MOUSE);
933
gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 5);
934
gtk_box_pack_start(GTK_BOX(box), entry, FALSE, TRUE, 0);
935
gtk_box_pack_start(GTK_BOX(box), apply_button, FALSE, FALSE, 5);
936
gtk_container_set_border_width(GTK_CONTAINER(box), 10);
938
gtk_container_add(GTK_CONTAINER(popup), box);
939
gtk_widget_show_all(popup);
941
TagPhotoData *info = g_malloc(sizeof(TagPhotoData));
943
info->entry = GTK_ENTRY(entry);
945
g_signal_connect(entry, "activate", G_CALLBACK(tag_photo_input_changed), info);
946
g_signal_connect(apply_button, "clicked", G_CALLBACK(tag_photo_input_changed), info);
546
949
ACTION(previous_photo)
548
951
gchar *current_filename = NULL;
738
1229
if (RS_IS_PHOTO(rs->photo))
739
1230
rs_cache_save(rs->photo, MASK_ALL);
741
rs_batch_process(rs->queue);
1232
if (NULL == process_thread)
1233
process_thread = g_thread_create_full(start_process_batch, rs->queue, 0, FALSE, FALSE, G_THREAD_PRIORITY_LOW, NULL);
1236
ACTION(lens_db_editor)
1238
rs_lens_db_editor();
1241
ACTION(tethered_shooting)
1243
rs_tethered_shooting_open(rs);
1246
ACTION(filter_graph)
1248
rs_filter_graph(rs->filter_input);
1253
GtkWidget *dialog = gtk_file_chooser_dialog_new(
1254
_("Add Profile ..."),
1256
GTK_FILE_CHOOSER_ACTION_OPEN,
1258
GTK_RESPONSE_CANCEL,
1260
GTK_RESPONSE_ACCEPT,
1263
GtkFileFilter *filter_all = gtk_file_filter_new();
1265
GtkFileFilter *filter_profiles = gtk_file_filter_new();
1266
gtk_file_filter_set_name(filter_profiles, _("All Profiles"));
1267
gtk_file_filter_add_pattern(filter_profiles, "*.dcp");
1268
gtk_file_filter_add_pattern(filter_profiles, "*.DCP");
1269
gtk_file_filter_add_pattern(filter_profiles, "*.icc");
1270
gtk_file_filter_add_pattern(filter_profiles, "*.ICC");
1271
gtk_file_filter_add_pattern(filter_profiles, "*.icm");
1272
gtk_file_filter_add_pattern(filter_profiles, "*.ICM");
1273
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_profiles);
1275
GtkFileFilter *filter_dcp = gtk_file_filter_new();
1276
gtk_file_filter_set_name(filter_dcp, _("Camera Profiles (DCP)"));
1277
gtk_file_filter_add_pattern(filter_dcp, "*.dcp");
1278
gtk_file_filter_add_pattern(filter_dcp, "*.DCP");
1279
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_dcp);
1281
GtkFileFilter *filter_icc = gtk_file_filter_new();
1282
gtk_file_filter_set_name(filter_icc, _("Color Profiles (ICC and ICM)"));
1283
gtk_file_filter_add_pattern(filter_icc, "*.icc");
1284
gtk_file_filter_add_pattern(filter_icc, "*.ICC");
1285
gtk_file_filter_add_pattern(filter_icc, "*.icm");
1286
gtk_file_filter_add_pattern(filter_icc, "*.ICM");
1287
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_icc);
1289
gtk_file_filter_set_name(filter_all, _("All files"));
1290
gtk_file_filter_add_pattern(filter_all, "*");
1291
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_all);
1293
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1295
RSProfileFactory *factory = rs_profile_factory_new_default();
1296
gchar *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
1297
gchar *basename = g_path_get_basename(path);
1298
const gchar *userdir = rs_profile_factory_get_user_profile_directory();
1299
g_mkdir_with_parents(userdir, 00755);
1300
gchar *new_path = g_build_filename(userdir, basename, NULL);
1302
if (rs_file_copy(path, new_path))
1303
rs_profile_factory_add_profile(factory, new_path);
1309
gtk_widget_destroy (dialog);
1312
ACTION(online_documentation)
1314
const gchar *link = "http://rawstudio.org/documentation/";
1317
#warning This is untested
1322
"uri click", /* start needs explicit title incase link has spaces or quotes */
1328
"gnome-open", /* this feels like cheating! */
1333
GError *error = NULL;
1341
G_SPAWN_SEARCH_PATH, /*flags*/
1342
NULL, /*setup_func*/
1343
NULL, /*user data for setup*/
1345
NULL, /* stdin/out/error */
1351
g_error("%s: %s\n", g_quark_to_string(error->domain), error->message);
1352
g_error_free(error);
793
1438
{ "PhotoMenu", NULL, _("_Photo"), NULL, NULL, ACTION_CB(photo_menu) },
794
1439
{ "PriorityMenu", NULL, _("_Set Priority") },
795
1440
{ "WhiteBalanceMenu", "NULL", _("_White Balance") },
796
{ "ViewMenu", NULL, _("_View") },
1441
{ "ViewMenu", NULL, _("_View"), NULL, NULL, ACTION_CB(view_menu) },
797
1442
{ "SortByMenu", NULL, _("_Sort by") },
798
1443
{ "BatchMenu", NULL, _("_Batch"), NULL, NULL, ACTION_CB(batch_menu) },
799
1444
{ "HelpMenu", NULL, _("_Help") },
800
1445
{ "PreviewPopup", NULL, NULL, NULL, NULL, ACTION_CB(preview_popup) },
1446
{ "SnapshotMenu", NULL, _("_Snapshot") },
803
1449
{ "Open", GTK_STOCK_OPEN, _("_Open Directory"), "<control>O", NULL, ACTION_CB(open) },
804
1450
{ "QuickExport", GTK_STOCK_SAVE, _("_Quick Export"), "<control>S", NULL, ACTION_CB(quick_export) },
805
1451
{ "ExportAs", GTK_STOCK_SAVE_AS, _("_Export As"), "<control><shift>S", NULL, ACTION_CB(export_as) },
806
1452
{ "ExportToGimp", GTK_STOCK_EXECUTE, _("_Export to Gimp"), "<control>G", NULL, ACTION_CB(export_to_gimp) },
1453
{ "CopyImage", GTK_STOCK_COPY, _("_Copy Image to Clipboard"), "<control><shift>C", NULL, ACTION_CB(copy_image) },
807
1454
{ "Reload", GTK_STOCK_REFRESH, _("_Reload directory"), "<control>R", NULL, ACTION_CB(reload) },
808
1455
{ "DeleteFlagged", GTK_STOCK_DELETE, _("_Delete flagged photos"), "<control><shift>D", NULL, ACTION_CB(delete_flagged) },
809
1456
{ "Quit", GTK_STOCK_QUIT, _("_Quit"), "<control>Q", NULL, ACTION_CB(quit) },
823
1471
{ "RemovePriority", NULL, _("_Remove priority"), "0", NULL, ACTION_CB(priority_0) },
824
1472
{ "AutoWB", NULL, _("_Auto"), "A", NULL, ACTION_CB(auto_wb) },
825
1473
{ "CameraWB", NULL, _("_Camera"), "C", NULL, ACTION_CB(camera_wb) },
826
{ "Crop", NULL, _("_Crop"), "<shift>C", NULL, ACTION_CB(crop) },
1474
{ "Crop", RS_STOCK_CROP, _("_Crop"), "<shift>C", NULL, ACTION_CB(crop) },
827
1475
{ "Uncrop", NULL, _("_Uncrop"), "<shift>V", NULL, ACTION_CB(uncrop) },
828
{ "Straighten", NULL, _("_Straighten"), NULL, NULL, ACTION_CB(straighten) },
1476
{ "Straighten", RS_STOCK_ROTATE, _("_Straighten"), NULL, NULL, ACTION_CB(straighten) },
829
1477
{ "Unstraighten", NULL, _("_Unstraighten"), NULL, NULL, ACTION_CB(unstraighten) },
830
1478
{ "Group", NULL, _("_Group"), NULL, NULL, ACTION_CB(group_photos) },
831
1479
{ "Ungroup", NULL, _("_Ungroup"), NULL, NULL, ACTION_CB(ungroup_photos) },
832
1480
{ "AutoGroup", NULL, _("_Auto group"), NULL, NULL, ACTION_CB(auto_group_photos) },
1481
{ "TagPhoto", NULL, _("_Tag Photo..."), "<alt>T", NULL, ACTION_CB(tag_photo) },
1482
{ "RotateClockwise", RS_STOCK_ROTATE_CLOCKWISE, _("Rotate Clockwise"), "<alt>Right", NULL, ACTION_CB(rotate_clockwise) },
1483
{ "RotateCounterClockwise", RS_STOCK_ROTATE_COUNTER_CLOCKWISE, _("Rotate Counter Clockwise"), "<alt>Left", NULL, ACTION_CB(rotate_counter_clockwise) },
1484
{ "Flip", RS_STOCK_FLIP, _("Flip"), NULL, NULL, ACTION_CB(flip) },
1485
{ "Mirror", RS_STOCK_MIRROR, _("Mirror"), NULL, NULL, ACTION_CB(mirror) },
835
1488
{ "PreviousPhoto", GTK_STOCK_GO_BACK, _("_Previous photo"), "<control>Left", NULL, ACTION_CB(previous_photo) },
836
1489
{ "NextPhoto", GTK_STOCK_GO_FORWARD, _("_Next Photo"), "<control>Right", NULL, ACTION_CB(next_photo) },
837
{ "ZommToFit", GTK_STOCK_ZOOM_FIT, _("_Zoom to fit"), "slash", NULL, ACTION_CB(zoom_to_fit) },
838
{ "ZoomTo100", GTK_STOCK_ZOOM_100, _("_Zoom to 100%"), "asterisk", NULL, ACTION_CB(zoom_to_100) },
1490
{ "LensDbEditor", NULL, _("_Lens Library"), "<control>L", NULL, ACTION_CB(lens_db_editor) },
1491
{ "TetheredShooting", NULL, _("_Tethered Shooting"), "F9", NULL, ACTION_CB(tethered_shooting) },
840
1493
/* Batch menu */
841
{ "AddToBatch", GTK_STOCK_ADD, _("_Add to batch queue"), "<control>B", NULL, ACTION_CB(add_to_batch) },
842
{ "AddViewToBatch", NULL, _("_Add current view to queue"), NULL, NULL, ACTION_CB(add_view_to_batch) },
843
{ "RemoveFromBatch", GTK_STOCK_REMOVE, _("_Remove from batch queue"), "<control><alt>B", NULL, ACTION_CB(remove_from_batch) },
1494
{ "AddToBatch", GTK_STOCK_ADD, _("_Add to batch queue"), "Insert", NULL, ACTION_CB(add_to_batch) },
1495
{ "AddViewToBatch", NULL, _("_Add view to queue..."), "<control>Insert", NULL, ACTION_CB(add_view_to_batch) },
1496
{ "RemoveFromBatch", GTK_STOCK_REMOVE, _("_Remove from batch queue"), "<control>Delete", NULL, ACTION_CB(remove_from_batch) },
844
1497
{ "ProcessBatch", GTK_STOCK_EXECUTE, _("_Start"), NULL, NULL, ACTION_CB(ProcessBatch) },
1500
{ "OnlineDocumentation", GTK_STOCK_HELP, _("_Online Documentation"), NULL, NULL, ACTION_CB(online_documentation) },
847
1501
{ "About", GTK_STOCK_ABOUT, _("_About"), NULL, NULL, ACTION_CB(about) },
1502
{ "FilterGraph", NULL, "_Filter Graph", NULL, NULL, ACTION_CB(filter_graph) },
1504
/* Not in any menu (yet) */
1505
{ "AddProfile", NULL, _("Add Profile ..."), NULL, NULL, ACTION_CB(add_profile) },
849
1507
static guint n_actionentries = G_N_ELEMENTS (actionentries);
851
1509
GtkToggleActionEntry toggleentries[] = {
1510
{ "ZommToFit", GTK_STOCK_ZOOM_FIT, _("_Zoom to fit"), "asterisk", NULL, ACTION_CB(zoom_to_fit), TRUE },
852
1511
{ "Iconbox", NULL, _("_Iconbox"), "<control>I", NULL, ACTION_CB(iconbox), TRUE },
853
1512
{ "Toolbox", NULL, _("_Toolbox"), "<control>T", NULL, ACTION_CB(toolbox), TRUE },
854
1513
{ "Fullscreen", GTK_STOCK_FULLSCREEN, _("_Fullscreen"), "F11", NULL, ACTION_CB(fullscreen), FALSE },
1514
{ "FullscreenPreview", GTK_STOCK_FULLSCREEN, _("_Show Photo On Secondary Monitor"), "F10", NULL, ACTION_CB(fullscreen_preview), FALSE },
1515
{ "ShowFilenames", NULL, _("Show Filenames in Iconbox"), NULL, NULL, ACTION_CB(show_filenames), show_filenames },
1516
{ "Load8Bit", NULL, _("Load non-RAW images"), NULL, NULL, ACTION_CB(load_8bit), load_8bit },
1517
{ "LoadSelected", NULL, _("Do not Load Selected Images"), "Pause", NULL, ACTION_CB(load_selected), FALSE },
855
1518
{ "ExposureMask", NULL, _("_Exposure mask"), "<control>E", NULL, ACTION_CB(exposure_mask), FALSE },
856
{ "Split", NULL, _("_Split"), NULL, NULL, ACTION_CB(split), FALSE },
1519
{ "Split", NULL, _("_Split"), "<control>D", NULL, ACTION_CB(split), FALSE },
1520
#if GTK_CHECK_VERSION(2,12,0)
1521
{ "Lightsout", NULL, _("_Lights out"), "F12", NULL, ACTION_CB(lightsout), FALSE },
858
1524
static guint n_toggleentries = G_N_ELEMENTS (toggleentries);