~ubuntu-branches/ubuntu/saucy/darktable/saucy

« back to all changes in this revision

Viewing changes to src/views/darkroom.c

  • Committer: Bazaar Package Importer
  • Author(s): David Bremner
  • Date: 2011-08-02 21:32:31 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20110802213231-r9v63trgyk1e822j
Tags: 0.9.1-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
    This file is part of darktable,
3
 
    copyright (c) 2009--2010 johannes hanika.
 
3
    copyright (c) 2009--2011 johannes hanika.
4
4
 
5
5
    darktable is free software: you can redistribute it and/or modify
6
6
    it under the terms of the GNU General Public License as published by
39
39
 
40
40
DT_MODULE(1)
41
41
 
 
42
static void film_strip_key_accel(GtkAccelGroup *accel_group,
 
43
                                 GObject *acceleratable,
 
44
                                 guint keyval, GdkModifierType modifier,
 
45
                                 gpointer data);
 
46
 
 
47
static void zoom_key_accel(GtkAccelGroup *accel_group, GObject *acceleratable,
 
48
                           guint keyval, GdkModifierType modifier,
 
49
                           gpointer data);
 
50
 
 
51
static void export_key_accel_callback(GtkAccelGroup *accel_group,
 
52
                                      GObject *acceleratable, guint keyval,
 
53
                                      GdkModifierType modifier,gpointer data);
 
54
 
 
55
static void skip_f_key_accel_callback(GtkAccelGroup *accel_group,
 
56
                                      GObject *acceleratable,
 
57
                                      guint keyval, GdkModifierType modifier,
 
58
                                      gpointer data);
 
59
static void skip_b_key_accel_callback(GtkAccelGroup *accel_group,
 
60
                                      GObject *acceleratable,
 
61
                                      guint keyval, GdkModifierType modifier,
 
62
                                      gpointer data);
 
63
 
42
64
const char
43
65
*name(dt_view_t *self)
44
66
{
52
74
  self->data = malloc(sizeof(dt_develop_t));
53
75
  dt_dev_init((dt_develop_t *)self->data, 1);
54
76
 
 
77
  // Film strip shortcuts
 
78
  gtk_accel_map_add_entry("<Darktable>/darkroom/toggle film strip",
 
79
                          GDK_f, GDK_CONTROL_MASK);
 
80
  dt_accel_group_connect_by_path(
 
81
      darktable.control->accels_darkroom,
 
82
      "<Darktable>/darkroom/toggle film strip",
 
83
      NULL);
 
84
 
 
85
  // Zoom shortcuts
 
86
  gtk_accel_map_add_entry("<Darktable>/darkroom/zoom/close",
 
87
                          GDK_1, GDK_MOD1_MASK);
 
88
  gtk_accel_map_add_entry("<Darktable>/darkroom/zoom/fill",
 
89
                          GDK_2, GDK_MOD1_MASK);
 
90
  gtk_accel_map_add_entry("<Darktable>/darkroom/zoom/fit",
 
91
                          GDK_3, GDK_MOD1_MASK);
 
92
 
 
93
  dt_accel_group_connect_by_path(
 
94
      darktable.control->accels_darkroom,
 
95
      "<Darktable>/darkroom/zoom/close",
 
96
      NULL);
 
97
  dt_accel_group_connect_by_path(
 
98
      darktable.control->accels_darkroom,
 
99
      "<Darktable>/darkroom/zoom/fill",
 
100
      NULL);
 
101
  dt_accel_group_connect_by_path(
 
102
      darktable.control->accels_darkroom,
 
103
      "<Darktable>/darkroom/zoom/fit",
 
104
      NULL);
 
105
 
 
106
  // enable shortcut to export with current export settings:
 
107
  gtk_accel_map_add_entry("<Darktable>/darkroom/export",
 
108
                          GDK_e, GDK_CONTROL_MASK);
 
109
 
 
110
  dt_accel_group_connect_by_path(
 
111
      darktable.control->accels_darkroom,
 
112
      "<Darktable>/darkroom/export",
 
113
      NULL);
 
114
 
 
115
 
 
116
  // Shortcut to skip images
 
117
  gtk_accel_map_add_entry("<Darktable>/darkroom/image forward",
 
118
                          GDK_space, 0);
 
119
  gtk_accel_map_add_entry("<Darktable>/darkroom/image back",
 
120
                          GDK_BackSpace, 0);
 
121
 
 
122
  dt_accel_group_connect_by_path(
 
123
      darktable.control->accels_darkroom,
 
124
      "<Darktable>/darkroom/image forward",
 
125
      NULL);
 
126
  dt_accel_group_connect_by_path(
 
127
      darktable.control->accels_darkroom,
 
128
      "<Darktable>/darkroom/image back",
 
129
      NULL);
55
130
}
56
131
 
57
132
 
377
452
  }
378
453
}
379
454
 
380
 
/**
381
 
 * \brief Switch to the specified image
382
 
 *
383
 
 * Switches to the specified image, saving the state of the current image if needed.
384
 
 *
385
 
 * \param dev The developer
386
 
 * \param image The image to switch to
387
 
 */
388
455
static void
389
456
dt_dev_change_image(dt_develop_t *dev, dt_image_t *image)
390
457
{
397
464
    dt_conf_set_string("plugins/darkroom/active", "");
398
465
  g_assert(dev->gui_attached);
399
466
 
400
 
  // only save image/settings if image was modified
401
 
  if (dev->image && dev->image->dirty)
 
467
  // commit image ops to db
 
468
  dt_dev_write_history(dev);
 
469
 
 
470
  // be sure light table will update the thumbnail
 
471
  if(dev->image)
402
472
  {
403
 
    // tag image as changed
404
 
    // only tag the image when there was a real change.
405
 
    guint tagid = 0;
406
 
    dt_tag_new("darktable|changed", &tagid);
407
 
    dt_tag_attach(tagid, dev->image->id);
408
 
    // commit image ops to db
409
 
    dt_dev_write_history(dev);
410
 
    // write .xmp file
411
 
    dt_image_write_sidecar_file(dev->image->id);
412
 
 
413
 
    // commit updated mipmaps to db
414
 
    // TODO: bg process?
415
 
    dt_dev_process_to_mip(dev);
 
473
    dt_dev_get_processed_size(dev, &dev->image->output_width, &dev->image->output_height);
 
474
    dev->image->force_reimport = 1;
416
475
  }
417
 
 
418
476
  // release full buffer
419
477
  if(dev->image && dev->image->pixels)
420
478
    dt_image_release(dev->image, DT_IMAGE_FULL, 'r');
421
479
 
 
480
  // writes the .xmp and the database:
422
481
  dt_image_cache_flush(dev->image);
423
482
 
424
483
  dev->image = image;
531
590
  dt_view_film_strip_prefetch();
532
591
}
533
592
 
534
 
/**
535
 
 * \brief Jump forward (diff) images in the collection
536
 
 *
537
 
 * \param[in] dev A pointer to the dt_develop_t to use for state
538
 
 * \param[in] diff The number of images to jump forward.  Use negative values to jump backward.
539
 
 */
540
593
static void
541
594
dt_dev_jump_image(dt_develop_t *dev, int diff)
542
595
{
594
647
}
595
648
 
596
649
static void
597
 
zoom_key_accel(void *data)
 
650
zoom_key_accel(GtkAccelGroup *accel_group,
 
651
               GObject *acceleratable, guint keyval,
 
652
               GdkModifierType modifier, gpointer data)
598
653
{
599
654
  dt_develop_t *dev = darktable.develop;
600
655
  int zoom, closeup;
630
685
}
631
686
 
632
687
static void
633
 
film_strip_key_accel(void *data)
 
688
film_strip_key_accel(GtkAccelGroup *accel_group,
 
689
                     GObject *acceleratable, guint keyval,
 
690
                     GdkModifierType modifier, gpointer data)
634
691
{
635
 
  dt_view_film_strip_toggle(darktable.view_manager, film_strip_activated, data);
 
692
  dt_view_film_strip_toggle(darktable.view_manager, film_strip_activated,
 
693
                            (void*)data);
636
694
  dt_control_queue_draw_all();
637
695
}
638
696
 
639
697
static void
640
 
export_key_accel_callback(void *d)
 
698
export_key_accel_callback(GtkAccelGroup *accel_group,
 
699
                          GObject *acceleratable, guint keyval,
 
700
                          GdkModifierType modifier, gpointer data)
641
701
{
 
702
  /* write history before exporting */
 
703
  dt_dev_write_history((dt_develop_t *)data);
 
704
 
 
705
  /* export current image */
642
706
  dt_control_export();
643
707
}
644
708
 
 
709
static void skip_f_key_accel_callback(GtkAccelGroup *accel_group,
 
710
                                      GObject *acceleratable, guint keyval,
 
711
                                      GdkModifierType modifier, gpointer data)
 
712
{
 
713
  dt_dev_jump_image((dt_develop_t*)data, 1);
 
714
}
 
715
 
 
716
static void skip_b_key_accel_callback(GtkAccelGroup *accel_group,
 
717
                                      GObject *acceleratable,
 
718
                                      guint keyval, GdkModifierType modifier,
 
719
                                      gpointer data)
 
720
{
 
721
  dt_dev_jump_image((dt_develop_t*)data, -1);
 
722
}
 
723
 
 
724
 
 
725
static void show_module_callback(GtkAccelGroup *accel_group,
 
726
                                 GObject *acceleratable,
 
727
                                 guint keyval, GdkModifierType modifier,
 
728
                                 gpointer data)
 
729
 
 
730
{
 
731
  dt_iop_module_t *module = (dt_iop_module_t*)data;
 
732
 
 
733
  // Showing the module, if it isn't already visible
 
734
  if(!dtgtk_tristatebutton_get_state(DTGTK_TRISTATEBUTTON(module->showhide)))
 
735
  {
 
736
    dtgtk_tristatebutton_set_state(DTGTK_TRISTATEBUTTON(module->showhide), 1);
 
737
    gtk_widget_queue_draw(module->showhide);
 
738
  }
 
739
 
 
740
  dt_gui_iop_modulegroups_switch(module->groups());
 
741
  gtk_expander_set_expanded(GTK_EXPANDER(module->expander), TRUE);
 
742
  dt_iop_request_focus(module);
 
743
}
 
744
 
 
745
static void connect_closures(dt_view_t *self)
 
746
{
 
747
  GClosure *closure;
 
748
  dt_develop_t *dev = (dt_develop_t*)self->data;
 
749
 
 
750
  // Film strip shortcuts
 
751
  closure = g_cclosure_new(G_CALLBACK(film_strip_key_accel),
 
752
                           (gpointer)self, NULL);
 
753
  dev->closures = g_slist_prepend(dev->closures, closure);
 
754
  dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
755
                                 "<Darktable>/darkroom/toggle film strip",
 
756
                                 closure);
 
757
 
 
758
  // Zoom shortcuts
 
759
  closure = g_cclosure_new(G_CALLBACK(zoom_key_accel), (gpointer)1, NULL);
 
760
  dev->closures = g_slist_prepend(dev->closures, closure);
 
761
  dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
762
                                 "<Darktable>/darkroom/zoom/close",
 
763
                                 closure);
 
764
  closure = g_cclosure_new(G_CALLBACK(zoom_key_accel), (gpointer)2, NULL);
 
765
  dev->closures = g_slist_prepend(dev->closures, closure);
 
766
  dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
767
                                 "<Darktable>/darkroom/zoom/fill",
 
768
                                 closure);
 
769
  closure = g_cclosure_new(G_CALLBACK(zoom_key_accel), (gpointer)3, NULL);
 
770
  dev->closures = g_slist_prepend(dev->closures, closure);
 
771
  dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
772
                                 "<Darktable>/darkroom/zoom/fit",
 
773
                                 closure);
 
774
 
 
775
  // enable shortcut to export with current export settings:
 
776
  closure = g_cclosure_new(G_CALLBACK(export_key_accel_callback), 
 
777
                           (gpointer)self->data, NULL);
 
778
  dev->closures = g_slist_prepend(dev->closures, closure);
 
779
  dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
780
                                 "<Darktable>/darkroom/export",
 
781
                                 closure);
 
782
 
 
783
 
 
784
  // Shortcut to skip images
 
785
  closure = g_cclosure_new(G_CALLBACK(skip_f_key_accel_callback),
 
786
                           (gpointer)self->data, NULL);
 
787
  dev->closures = g_slist_prepend(dev->closures, closure);
 
788
  dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
789
                                 "<Darktable>/darkroom/image forward",
 
790
                                 closure);
 
791
  closure = g_cclosure_new(G_CALLBACK(skip_b_key_accel_callback),
 
792
                           (gpointer)self->data, NULL);
 
793
  dev->closures = g_slist_prepend(dev->closures, closure);
 
794
  dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
795
                                 "<Darktable>/darkroom/image back",
 
796
                                 closure);
 
797
 
 
798
}
 
799
 
645
800
void enter(dt_view_t *self)
646
801
{
 
802
  char accelpath[256];
 
803
 
 
804
  // Attaching accelerator group
 
805
  gtk_window_add_accel_group(GTK_WINDOW(darktable.gui->widgets.main_window),
 
806
                             darktable.control->accels_darkroom);
 
807
 
 
808
  // Connecting the closures
 
809
  connect_closures(self);
 
810
 
647
811
  dt_print(DT_DEBUG_CONTROL, "[run_job+] 11 %f in darkroom mode\n", dt_get_wtime());
648
812
  dt_develop_t *dev = (dt_develop_t *)self->data;
649
813
 
697
861
    GtkWidget *expander = dt_iop_gui_get_expander(module);
698
862
    module->topwidget = GTK_WIDGET(expander);
699
863
    gtk_box_pack_start(box, expander, FALSE, FALSE, 0);
 
864
    module->show_closure = NULL;
700
865
    if(strcmp(module->op, "gamma") && !(module->flags() & IOP_FLAGS_DEPRECATED))
701
866
    {
 
867
      // Connecting the (optional) module show accelerator
 
868
      snprintf(accelpath, 256, "<Darktable>/darkroom/plugins/%s/show plugin", module->op);
 
869
      module->show_closure = g_cclosure_new(G_CALLBACK(show_module_callback),
 
870
                                                       module, NULL);
 
871
      dt_accel_group_connect_by_path(darktable.control->accels_darkroom,
 
872
                                     accelpath, module->show_closure);
 
873
 
702
874
      module->showhide = dtgtk_tristatebutton_new(NULL,0);
703
875
      char filename[1024], datadir[1024];
704
876
      dt_get_datadir(datadir, 1024);
783
955
    dt_view_film_strip_open(darktable.view_manager, film_strip_activated, self);
784
956
    dt_view_film_strip_prefetch();
785
957
  }
786
 
  dt_gui_key_accel_register(GDK_CONTROL_MASK, GDK_f, film_strip_key_accel, self);
787
 
  dt_gui_key_accel_register(GDK_MOD1_MASK, GDK_1, zoom_key_accel, (void *)1);
788
 
  dt_gui_key_accel_register(GDK_MOD1_MASK, GDK_2, zoom_key_accel, (void *)2);
789
 
  dt_gui_key_accel_register(GDK_MOD1_MASK, GDK_3, zoom_key_accel, (void *)3);
790
 
 
791
 
  // enable shortcut to export with current export settings:
792
 
  dt_gui_key_accel_register(GDK_CONTROL_MASK, GDK_e, export_key_accel_callback, NULL);
793
958
 
794
959
  // switch on groups as they where last time:
795
960
  dt_gui_iop_modulegroups_switch(dt_conf_get_int("plugins/darkroom/groups"));
825
990
 
826
991
void leave(dt_view_t *self)
827
992
{
 
993
  GSList *c = ((dt_develop_t*)self->data)->closures;
 
994
 
 
995
  // Detaching the accelerator group
 
996
  gtk_window_remove_accel_group(GTK_WINDOW(darktable.gui->widgets.main_window),
 
997
                                darktable.control->accels_darkroom);
 
998
 
 
999
  // Disconnecting and deleting the closures
 
1000
  while(c)
 
1001
  {
 
1002
    dt_accel_group_disconnect(darktable.control->accels_darkroom, c->data);
 
1003
    c = g_slist_next(c);
 
1004
  }
 
1005
  g_slist_free(((dt_develop_t*)self->data)->closures);
 
1006
  ((dt_develop_t*)self->data)->closures = NULL;
 
1007
 
828
1008
  // store groups for next time:
829
1009
  dt_conf_set_int("plugins/darkroom/groups", dt_gui_iop_modulegroups_get());
830
1010
 
836
1016
 
837
1017
  if(dt_conf_get_bool("plugins/filmstrip/on"))
838
1018
    dt_view_film_strip_close(darktable.view_manager);
839
 
  dt_gui_key_accel_unregister(film_strip_key_accel);
840
 
  dt_gui_key_accel_unregister(zoom_key_accel);
841
 
  dt_gui_key_accel_unregister(export_key_accel_callback);
842
1019
 
843
1020
  GList *childs = gtk_container_get_children (
844
1021
                    GTK_CONTAINER (darktable.gui->widgets.bottom_left_toolbox));
874
1051
  dt_tag_attach(tagid, dev->image->id);
875
1052
  // commit image ops to db
876
1053
  dt_dev_write_history(dev);
877
 
  // write .xmp file
878
 
  dt_image_write_sidecar_file(dev->image->id);
879
1054
 
880
 
  // commit updated mipmaps to db
881
 
  dt_dev_process_to_mip(dev);
 
1055
  // be sure light table will regenerate the thumbnail:
 
1056
  if(dev->image)
 
1057
  {
 
1058
    dt_dev_get_processed_size(dev, &dev->image->output_width, &dev->image->output_height);
 
1059
    dev->image->force_reimport = 1;
 
1060
  }
882
1061
 
883
1062
  // clear gui.
884
1063
  dev->gui_leaving = 1;
903
1082
    snprintf(var, 1024, "plugins/darkroom/%s/expanded", module->op);
904
1083
    dt_conf_set_bool(var, gtk_expander_get_expanded (module->expander));
905
1084
 
 
1085
    // disconnect the show accelerator
 
1086
    if(module->show_closure)
 
1087
      dt_accel_group_disconnect(darktable.control->accels_darkroom,
 
1088
                                module->show_closure);
 
1089
 
906
1090
    module->gui_cleanup(module);
907
1091
    dt_iop_cleanup_module(module) ;
908
1092
    free(module);
1006
1190
int button_released(dt_view_t *self, double x, double y, int which, uint32_t state)
1007
1191
{
1008
1192
  dt_develop_t *dev = darktable.develop;
 
1193
  const int32_t width_i  = self->width;
 
1194
  const int32_t height_i = self->height;
 
1195
  if(width_i  > DT_IMAGE_WINDOW_SIZE) x += (DT_IMAGE_WINDOW_SIZE-width_i) *.5f;
 
1196
  if(height_i > DT_IMAGE_WINDOW_SIZE) y += (DT_IMAGE_WINDOW_SIZE-height_i)*.5f;
 
1197
 
1009
1198
  int handled = 0;
1010
1199
  if(dev->gui_module && dev->gui_module->button_released) handled = dev->gui_module->button_released(dev->gui_module, x, y, which, state);
1011
1200
  if(handled) return handled;
1083
1272
void scrolled(dt_view_t *self, double x, double y, int up, int state)
1084
1273
{
1085
1274
  dt_develop_t *dev = (dt_develop_t *)self->data;
 
1275
  const int32_t width_i  = self->width;
 
1276
  const int32_t height_i = self->height;
 
1277
  if(width_i  > DT_IMAGE_WINDOW_SIZE) x += (DT_IMAGE_WINDOW_SIZE-width_i) *.5f;
 
1278
  if(height_i > DT_IMAGE_WINDOW_SIZE) y += (DT_IMAGE_WINDOW_SIZE-height_i)*.5f;
 
1279
 
1086
1280
  int handled = 0;
1087
1281
  if(dev->gui_module && dev->gui_module->scrolled) handled = dev->gui_module->scrolled(dev->gui_module, x, y, up, state);
1088
1282
  if(handled) return;
1161
1355
}
1162
1356
 
1163
1357
 
1164
 
int key_pressed(dt_view_t *self, uint16_t which)
 
1358
int key_pressed(dt_view_t *self, guint key, guint state)
1165
1359
{
1166
 
  dt_develop_t *dev = (dt_develop_t *)self->data;
1167
 
  int handled = 0;
1168
 
  if(dev->gui_module && dev->gui_module->key_pressed) handled = dev->gui_module->key_pressed(dev->gui_module, which);
1169
 
  if(handled) return handled;
1170
 
  switch(which)
1171
 
  {
1172
 
    case KEYCODE_Space:
1173
 
      dt_dev_jump_image(dev, 1);
1174
 
      return 1;
1175
 
    case KEYCODE_BackSpace:
1176
 
      dt_dev_jump_image(dev, -1);
1177
 
      return 1;
1178
 
  }
1179
 
  return 0;
 
1360
  return 1;
1180
1361
}
1181
1362
 
1182
1363