2
* * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>,
3
* * Anders Kvist <akv@lnxbx.dk> and Klaus Post <klauspost@gmail.com>
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
* The following functions is more or less grabbed from UFraw:
22
* lens_set(), lens_menu_select(), ptr_array_insert_sorted(),
23
* ptr_array_find_sorted(), ptr_array_insert_index() and lens_menu_fill()
26
#include <rawstudio.h>
28
#include <glib/gstdio.h>
33
#include <rs-lens-db.h>
36
#include <curl/curl.h>
37
#include <libxml/HTMLparser.h>
38
#include "rs-lens-db-editor.h"
40
static void fill_model(RSLensDb *lens_db, GtkTreeModel *tree_model);
41
static char * rs_lens_db_editor_update_lensfun(void);
42
GtkDialog *rs_lens_db_editor_single_lens(RSLens *lens);
45
GtkWidget *lensfun_make;
46
GtkWidget *lensfun_model;
48
GtkWidget *checkbutton_enabled;
53
/* The menu used to choose lens - either full or limited by search criteria */
56
GtkTreeView *tree_view;
57
SingleLensData *single_lens_data;
60
gint lf_lens_sort_by_model_func(gconstpointer *a, gconstpointer *b)
62
lfLens *first = (lfLens *) ((GPtrArray *) a)->pdata;
63
lfLens *second = (lfLens *) ((GPtrArray *) b)->pdata;
65
return g_strcmp0(first->Model, second->Model);
68
const lfLens **lf_lens_sort_by_model(const lfLens *const *array)
74
GPtrArray *temp = g_ptr_array_new();
77
g_ptr_array_add(temp, (gpointer *) array[x++]);
79
g_ptr_array_sort(temp, (GCompareFunc) lf_lens_sort_by_model_func);
80
g_ptr_array_add (temp, NULL);
81
return (const lfLens **) g_ptr_array_free (temp, FALSE);
84
static void lens_set (lens_data *data, const lfLens *lens)
86
if (data->single_lens_data)
88
/* Set Maker and Model to the selected RSLens */
89
rs_lens_set_lensfun_make(data->single_lens_data->lens, lens->Maker);
90
rs_lens_set_lensfun_model(data->single_lens_data->lens, lens->Model);
91
rs_lens_set_lensfun_enabled(data->single_lens_data->lens, TRUE);
93
gtk_label_set_text(GTK_LABEL(data->single_lens_data->lensfun_make), lens->Maker);
94
gtk_label_set_text(GTK_LABEL(data->single_lens_data->lensfun_model), lens->Model);
95
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->single_lens_data->checkbutton_enabled), TRUE);
97
gtk_widget_show(data->single_lens_data->lensfun_make);
98
gtk_widget_show(data->single_lens_data->lensfun_model);
99
gtk_widget_hide(data->single_lens_data->button);
101
RSLensDb *lens_db = rs_lens_db_get_default();
103
/* Force save of RSLensDb */
104
rs_lens_db_save(lens_db);
112
GtkTreeSelection *selection = gtk_tree_view_get_selection(data->tree_view);
113
GtkTreeModel *model = NULL;
116
gtk_tree_selection_get_selected(selection, &model, &iter);
118
/* Set Maker and Model to the tree view */
119
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
120
RS_LENS_DB_EDITOR_LENS_MAKE, lens->Maker,
121
RS_LENS_DB_EDITOR_LENS_MODEL, lens->Model,
122
RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE, TRUE,
123
RS_LENS_DB_EDITOR_ENABLED, TRUE,
126
RSLens *rs_lens = NULL;
127
gtk_tree_model_get (model, &iter,
128
RS_LENS_DB_EDITOR_LENS, &rs_lens,
131
/* Set Maker and Model to the selected RSLens */
132
rs_lens_set_lensfun_make(rs_lens, lens->Maker);
133
rs_lens_set_lensfun_model(rs_lens, lens->Model);
134
rs_lens_set_lensfun_enabled(rs_lens, TRUE);
136
RSLensDb *lens_db = rs_lens_db_get_default();
138
/* Force save of RSLensDb */
139
rs_lens_db_save(lens_db);
143
static void lens_menu_select (
144
GtkMenuItem *menuitem, gpointer user_data)
146
lens_data *data = (lens_data *)user_data;
147
lens_set (data, (lfLens *)g_object_get_data(G_OBJECT(menuitem), "lfLens"));
150
int ptr_array_insert_sorted (
151
GPtrArray *array, const void *item, GCompareFunc compare)
153
int length = array->len;
154
g_ptr_array_set_size (array, length + 1);
155
const void **root = (const void **)array->pdata;
157
int m = 0, l = 0, r = length - 1;
159
// Skip trailing NULL, if any
160
if (l <= r && !root [r])
166
int cmp = compare (root [m], item);
182
memmove (root + m + 1, root + m, (length - m) * sizeof (void *));
187
int ptr_array_find_sorted (
188
const GPtrArray *array, const void *item, GCompareFunc compare)
190
int length = array->len;
191
void **root = array->pdata;
193
int l = 0, r = length - 1;
199
// Skip trailing NULL, if any
206
cmp = compare (root [m], item);
220
void ptr_array_insert_index (
221
GPtrArray *array, const void *item, int index)
224
int length = array->len;
225
g_ptr_array_set_size (array, length + 1);
226
root = (const void **)array->pdata;
227
memmove (root + index + 1, root + index, (length - index) * sizeof (void *));
233
static void lens_menu_fill (
234
lens_data *data, const lfLens *const *lenslist_temp, const lfLens *const *full_lenslist_temp)
237
GPtrArray *makers, *submenus, *allmakers, *allsubmenus;
239
/* We want the two lists sorted by model */
240
const lfLens **lenslist = lf_lens_sort_by_model(lenslist_temp);
241
const lfLens **full_lenslist = lf_lens_sort_by_model(full_lenslist_temp);
245
/* This doesn't work, but will we be leaking GtkMenu's */
246
//gtk_widget_destroy (data->LensMenu);
247
data->LensMenu = NULL;
250
/* Count all existing lens makers and create a sorted list */
251
makers = g_ptr_array_new ();
252
submenus = g_ptr_array_new ();
255
for (i = 0; lenslist [i]; i++)
257
GtkWidget *submenu, *item;
258
const char *m = lf_mlstr_get (lenslist [i]->Maker);
259
int idx = ptr_array_find_sorted (makers, m, (GCompareFunc)g_utf8_collate);
262
/* No such maker yet, insert it into the array */
263
idx = ptr_array_insert_sorted (makers, m, (GCompareFunc)g_utf8_collate);
264
/* Create a submenu for lenses by this maker */
265
submenu = gtk_menu_new ();
266
ptr_array_insert_index (submenus, submenu, idx);
268
submenu = g_ptr_array_index (submenus, idx);
269
/* Append current lens name to the submenu */
270
item = gtk_menu_item_new_with_label (lf_mlstr_get (lenslist [i]->Model));
271
gtk_widget_show (item);
272
g_object_set_data(G_OBJECT(item), "lfLens", (void *)lenslist [i]);
273
g_signal_connect(G_OBJECT(item), "activate",
274
G_CALLBACK(lens_menu_select), data);
275
gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
278
/* Count all existing lens makers and create a sorted list */
279
allmakers = g_ptr_array_new ();
280
allsubmenus = g_ptr_array_new ();
282
for (i = 0; full_lenslist [i]; i++)
284
GtkWidget *allsubmenu, *allitem;
285
const char *allm = lf_mlstr_get (full_lenslist [i]->Maker);
286
int allidx = ptr_array_find_sorted (allmakers, allm, (GCompareFunc)g_utf8_collate);
289
/* No such maker yet, insert it into the array */
290
allidx = ptr_array_insert_sorted (allmakers, allm, (GCompareFunc)g_utf8_collate);
291
/* Create a submenu for lenses by this maker */
292
allsubmenu = gtk_menu_new ();
293
ptr_array_insert_index (allsubmenus, allsubmenu, allidx);
295
allsubmenu = g_ptr_array_index (allsubmenus, allidx);
296
/* Append current lens name to the submenu */
297
allitem = gtk_menu_item_new_with_label (lf_mlstr_get (full_lenslist [i]->Model));
298
gtk_widget_show (allitem);
299
g_object_set_data(G_OBJECT(allitem), "lfLens", (void *)full_lenslist [i]);
300
g_signal_connect(G_OBJECT(allitem), "activate",
301
G_CALLBACK(lens_menu_select), data);
302
gtk_menu_shell_append (GTK_MENU_SHELL (allsubmenu), allitem);
305
data->LensMenu = gtk_menu_new ();
306
for (i = 0; i < makers->len; i++)
308
GtkWidget *item = gtk_menu_item_new_with_label (g_ptr_array_index (makers, i));
309
gtk_widget_show (item);
310
gtk_menu_shell_append (GTK_MENU_SHELL (data->LensMenu), item);
311
gtk_menu_item_set_submenu (
312
GTK_MENU_ITEM (item), (GtkWidget *)g_ptr_array_index (submenus, i));
315
GtkWidget *allmenu = gtk_menu_new ();
316
for (i = 0; i < allmakers->len; i++)
318
GtkWidget *allitem = gtk_menu_item_new_with_label (g_ptr_array_index (allmakers, i));
319
gtk_widget_show (allitem);
320
gtk_menu_shell_append (GTK_MENU_SHELL (allmenu), allitem);
321
gtk_menu_item_set_submenu (
322
GTK_MENU_ITEM (allitem), (GtkWidget *)g_ptr_array_index (allsubmenus, i));
325
GtkWidget *item = gtk_menu_item_new_with_label (_("All lenses"));
326
gtk_widget_show (item);
327
gtk_menu_shell_append (GTK_MENU_SHELL (data->LensMenu), item);
328
gtk_menu_item_set_submenu (
329
GTK_MENU_ITEM (item), allmenu);
331
g_ptr_array_free (submenus, TRUE);
332
g_ptr_array_free (makers, TRUE);
334
g_ptr_array_free (allsubmenus, TRUE);
335
g_ptr_array_free (allmakers, TRUE);
338
void row_clicked (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
340
struct lfDatabase *lensdb = NULL;
341
const lfCamera *camera = NULL;
342
const lfCamera **cameras = NULL;
344
lens_data *data = g_malloc(sizeof(lens_data));
345
data->tree_view = tree_view;
346
data->single_lens_data = NULL;
348
lensdb = lf_db_new ();
351
GtkTreeSelection *selection = gtk_tree_view_get_selection(data->tree_view);
352
GtkTreeModel *model = NULL;
355
gboolean ret = gtk_tree_selection_get_selected(selection, &model, &iter);
359
RSLens *rs_lens = NULL;
360
gtk_tree_model_get (model, &iter,
361
RS_LENS_DB_EDITOR_LENS, &rs_lens,
369
g_assert(RS_IS_LENS(rs_lens));
370
g_object_get(rs_lens,
371
"camera-make", &camera_make,
372
"camera-model", &camera_model,
373
"min-focal", &min_focal,
374
"max-focal", &max_focal,
378
if (min_focal == max_focal)
379
lens_search = g_strdup_printf("%.0fmm", min_focal);
381
lens_search = g_strdup_printf("%.0f-%.0f", min_focal, max_focal);
383
cameras = lf_db_find_cameras(lensdb, camera_make, camera_model);
389
const lfLens **lenslist = lf_db_find_lenses_hd (
390
lensdb, camera, NULL, lens_search, 0);
391
const lfLens **full_lenslist = lf_db_find_lenses_hd (
392
lensdb, camera, NULL, NULL, 0);
394
if (!lenslist && !full_lenslist)
397
lens_menu_fill (data, lenslist, full_lenslist);
402
const lfLens **lenslist = lf_db_find_lenses_hd (
403
lensdb, NULL, NULL, lens_search, 0);
404
const lfLens *const *full_lenslist = lf_db_get_lenses (lensdb);
408
lens_menu_fill (data, lenslist, full_lenslist);
413
gtk_menu_popup (GTK_MENU (data->LensMenu), NULL, NULL, NULL, NULL,
414
0, gtk_get_current_event_time ());
418
view_on_button_pressed (GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
420
/* single click with the right mouse button? */
421
if (event->type == GDK_BUTTON_PRESS && event->button == 3)
423
GtkTreeSelection *selection;
425
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
427
/* Note: gtk_tree_selection_count_selected_rows() does not
428
* exist in gtk+-2.0, only in gtk+ >= v2.2 ! */
431
/* Get tree path for row that was clicked */
432
if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview),
435
&path, NULL, NULL, NULL))
437
gtk_tree_selection_unselect_all(selection);
438
gtk_tree_selection_select_path(selection, path);
439
gtk_tree_path_free(path);
441
row_clicked(GTK_TREE_VIEW(treeview), path, NULL, userdata);
442
return TRUE; /* we handled this */
444
return FALSE; /* we did not handle this */
448
view_popupmenu (GtkWidget *treeview, gpointer userdata)
450
GtkTreeSelection *selection;
451
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
452
GtkTreeModel *tree_model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
453
GList* selected = gtk_tree_selection_get_selected_rows (selection, &tree_model);
455
row_clicked(GTK_TREE_VIEW(treeview), selected->data, NULL, userdata);
457
return TRUE; /* we handled this */
461
toggle_clicked (GtkCellRendererToggle *cell_renderer_toggle, const gchar *path, gpointer user_data)
465
GtkTreeView *tree_view = GTK_TREE_VIEW(user_data);
466
GtkTreeModel *tree_model = gtk_tree_view_get_model(tree_view);
467
GtkTreePath* tree_path = gtk_tree_path_new_from_string(path);
469
gtk_tree_model_get_iter(GTK_TREE_MODEL (tree_model), &iter, tree_path);
470
gtk_tree_model_get(GTK_TREE_MODEL (tree_model), &iter, RS_LENS_DB_EDITOR_ENABLED, &enabled, -1);
473
gtk_list_store_set(GTK_LIST_STORE (tree_model), &iter, RS_LENS_DB_EDITOR_ENABLED, FALSE, -1);
475
gtk_list_store_set(GTK_LIST_STORE (tree_model), &iter, RS_LENS_DB_EDITOR_ENABLED, TRUE, -1);
477
RSLens *rs_lens = NULL;
478
gtk_tree_model_get (tree_model, &iter,
479
RS_LENS_DB_EDITOR_LENS, &rs_lens,
482
/* Set enabled/disabled to the selected RSLens */
483
rs_lens_set_lensfun_enabled(rs_lens, !enabled);
485
RSLensDb *lens_db = rs_lens_db_get_default();
487
/* Force save of RSLensDb */
488
rs_lens_db_save(lens_db);
492
update_lensfun(GtkButton *button, gpointer user_data)
494
GtkWidget *window = GTK_WIDGET(user_data);
495
GdkCursor* cursor = gdk_cursor_new(GDK_WATCH);
496
gdk_window_set_cursor(window->window, cursor);
498
gchar *error = rs_lens_db_editor_update_lensfun();
499
gdk_window_set_cursor(window->window, NULL);
500
GtkWidget *dialog = NULL;
503
dialog = gui_dialog_make_from_text(GTK_STOCK_DIALOG_ERROR, _("Error updating lensfun database"), error);
505
dialog = gui_dialog_make_from_text(GTK_STOCK_DIALOG_INFO, _("Lensfun database updated"), error);
507
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT);
508
gtk_widget_show_all(dialog);
509
gtk_dialog_run(GTK_DIALOG(dialog));
510
gtk_widget_destroy(dialog);
517
rs_lens_db_editor_sort(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
519
gchar *a_lensfun_model;
520
gchar *a_camera_model;
523
gtk_tree_model_get(model, a,
524
RS_LENS_DB_EDITOR_IDENTIFIER, &a_identifier,
525
RS_LENS_DB_EDITOR_LENS_MODEL, &a_lensfun_model,
526
RS_LENS_DB_EDITOR_CAMERA_MODEL, &a_camera_model,
529
gchar *b_lensfun_model;
530
gchar *b_camera_model;
533
gtk_tree_model_get(model, b,
534
RS_LENS_DB_EDITOR_IDENTIFIER, &b_identifier,
535
RS_LENS_DB_EDITOR_LENS_MODEL, &b_lensfun_model,
536
RS_LENS_DB_EDITOR_CAMERA_MODEL, &b_camera_model,
541
ret = g_strcmp0(a_lensfun_model, b_lensfun_model);
545
ret = g_strcmp0(a_camera_model, b_camera_model);
549
ret = g_strcmp0(a_identifier, b_identifier);
557
rs_lens_db_editor(void)
559
GtkTreeModel *tree_model = GTK_TREE_MODEL(gtk_list_store_new(10, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_OBJECT));
561
RSLensDb *lens_db = rs_lens_db_get_default();
562
fill_model(lens_db, tree_model);
564
GtkWidget *editor = gtk_dialog_new();
565
gtk_window_set_title(GTK_WINDOW(editor), _("Rawstudio Lens Library"));
566
gtk_dialog_set_has_separator (GTK_DIALOG(editor), FALSE);
567
g_signal_connect_swapped(editor, "delete_event",
568
G_CALLBACK (gtk_widget_destroy), editor);
569
g_signal_connect_swapped(editor, "response",
570
G_CALLBACK (gtk_widget_destroy), editor);
572
GtkWidget *frame = gtk_frame_new("");
574
GtkWidget *scroller = gtk_scrolled_window_new (NULL, NULL);
575
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller),
576
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
577
GtkWidget *view = gtk_tree_view_new_with_model(tree_model);
579
gtk_tree_view_set_reorderable(GTK_TREE_VIEW(view), FALSE);
580
gtk_container_add (GTK_CONTAINER (scroller), view);
582
GtkCellRenderer *renderer_lens_make = gtk_cell_renderer_text_new();
583
GtkCellRenderer *renderer_lens_model = gtk_cell_renderer_text_new();
584
GtkCellRenderer *renderer_focal = gtk_cell_renderer_text_new();
585
GtkCellRenderer *renderer_aperture = gtk_cell_renderer_text_new();
586
GtkCellRenderer *renderer_camera_make = gtk_cell_renderer_text_new();
587
GtkCellRenderer *renderer_camera_model = gtk_cell_renderer_text_new();
588
GtkCellRenderer *renderer_enabled = gtk_cell_renderer_toggle_new();
590
GtkTreeViewColumn *column_lens_make = gtk_tree_view_column_new_with_attributes (_("Lens make"),
592
"text", RS_LENS_DB_EDITOR_LENS_MAKE,
594
GtkTreeViewColumn *column_lens_model = gtk_tree_view_column_new_with_attributes (_("Lens model"),
596
"text", RS_LENS_DB_EDITOR_LENS_MODEL,
598
GtkTreeViewColumn *column_focal = gtk_tree_view_column_new_with_attributes (_("Focal"),
600
"text", RS_LENS_DB_EDITOR_HUMAN_FOCAL,
602
GtkTreeViewColumn *column_aperture = gtk_tree_view_column_new_with_attributes (_("Aperture"),
604
"text", RS_LENS_DB_EDITOR_HUMAN_APERTURE,
606
GtkTreeViewColumn *column_camera_make = gtk_tree_view_column_new_with_attributes (_("Camera make"),
607
renderer_camera_make,
608
"text", RS_LENS_DB_EDITOR_CAMERA_MAKE,
610
GtkTreeViewColumn *column_camera_model = gtk_tree_view_column_new_with_attributes (_("Camera model"),
611
renderer_camera_model,
612
"text", RS_LENS_DB_EDITOR_CAMERA_MODEL,
614
GtkTreeViewColumn *column_enabled = gtk_tree_view_column_new_with_attributes (_("Enabled"),
616
"active", RS_LENS_DB_EDITOR_ENABLED,
617
"activatable", RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE,
620
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(tree_model), RS_LENS_DB_EDITOR_CAMERA_MODEL, GTK_SORT_ASCENDING);
621
gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(tree_model), RS_LENS_DB_EDITOR_CAMERA_MODEL, rs_lens_db_editor_sort, NULL, NULL);
623
g_signal_connect(G_OBJECT(view), "row-activated",
624
G_CALLBACK(row_clicked), NULL);
626
g_signal_connect (renderer_enabled, "toggled",
627
G_CALLBACK (toggle_clicked), view);
628
g_signal_connect(G_OBJECT(view), "button-press-event", G_CALLBACK(view_on_button_pressed), NULL);
629
g_signal_connect(view, "popup-menu", (GCallback) view_popupmenu, NULL);
631
gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_lens_make);
632
gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_lens_model);
633
gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_focal);
634
gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_aperture);
635
gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_camera_make);
636
gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_camera_model);
637
gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_enabled);
639
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (view), TRUE);
641
gtk_container_add (GTK_CONTAINER (frame), scroller);
643
gtk_window_resize(GTK_WINDOW(editor), 400, 400);
645
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
646
gtk_container_set_border_width (GTK_CONTAINER (scroller), 6);
648
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(editor)->vbox), frame, TRUE, TRUE, 0);
650
GtkWidget *button_update_lensfun = gtk_button_new_with_label(_("Update lensfun database"));
651
g_signal_connect(button_update_lensfun, "clicked", G_CALLBACK(update_lensfun), editor);
652
gtk_dialog_add_action_widget (GTK_DIALOG (editor), button_update_lensfun, GTK_RESPONSE_NONE);
654
GtkWidget *button_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
655
gtk_dialog_add_action_widget (GTK_DIALOG (editor), button_close, GTK_RESPONSE_CLOSE);
657
gtk_widget_show_all(GTK_WIDGET(editor));
662
fill_model(RSLensDb *lens_db, GtkTreeModel *tree_model)
664
GList *list = rs_lens_db_get_lenses(lens_db);
670
gchar *lensfun_model;
671
gdouble min_focal, max_focal, min_aperture, max_aperture;
676
RSLens *lens = list->data;
678
g_assert(RS_IS_LENS(lens));
680
"identifier", &identifier,
681
"lensfun-make", &lensfun_make,
682
"lensfun-model", &lensfun_model,
683
"min-focal", &min_focal,
684
"max-focal", &max_focal,
685
"min-aperture", &min_aperture,
686
"max-aperture", &max_aperture,
687
"camera-make", &camera_make,
688
"camera-model", &camera_model,
692
const gchar *human_focal = rs_human_focal(min_focal, max_focal);
693
const gchar *human_aperture = rs_human_aperture(max_aperture);
697
gboolean enabled_activatable = FALSE;
698
if (lensfun_make && lensfun_model)
699
enabled_activatable = TRUE;
701
gtk_list_store_append (GTK_LIST_STORE(tree_model), &iter);
702
gtk_list_store_set (GTK_LIST_STORE(tree_model), &iter,
703
RS_LENS_DB_EDITOR_IDENTIFIER, identifier,
704
RS_LENS_DB_EDITOR_HUMAN_FOCAL, human_focal,
705
RS_LENS_DB_EDITOR_HUMAN_APERTURE, human_aperture,
706
RS_LENS_DB_EDITOR_LENS_MAKE, lensfun_make,
707
RS_LENS_DB_EDITOR_LENS_MODEL, lensfun_model,
708
RS_LENS_DB_EDITOR_CAMERA_MAKE, camera_make,
709
RS_LENS_DB_EDITOR_CAMERA_MODEL, camera_model,
710
RS_LENS_DB_EDITOR_ENABLED, enabled,
711
RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE, enabled_activatable,
712
RS_LENS_DB_EDITOR_LENS, lens,
714
list = g_list_next (list);
719
write_callback(void *ptr, size_t size, size_t nmemb, void *userp)
721
GString *string = (GString *) userp;
722
g_string_append_len(string, (char *) ptr, size * nmemb);
723
return (size * nmemb);
727
rs_lens_db_editor_update_lensfun(void)
729
const gchar *baseurl = "http://svn.berlios.de/svnroot/repos/lensfun/trunk/data/db/";
730
const gchar *target = g_strdup_printf("%s/.%u-rawstudio_lensfun/", g_get_tmp_dir(), g_random_int());
732
g_mkdir(target, 0700);
733
if (!g_file_test(target, G_FILE_TEST_IS_DIR))
734
return g_strdup(_("Could not create temporary directory."));
736
CURL *curl = curl_easy_init();
737
GString *xml = g_string_new(NULL);
738
gchar *filename = NULL, *url = NULL, *file = NULL;
742
curl_easy_setopt(curl, CURLOPT_URL, baseurl);
743
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
744
curl_easy_setopt(curl, CURLOPT_WRITEDATA, xml);
745
result = curl_easy_perform(curl);
747
return g_strdup_printf(_("Could not fetch list of files from %s."), baseurl);
749
htmlDocPtr doc = htmlReadMemory(xml->str, xml->len, NULL, NULL, 0);
750
htmlNodePtr cur, child;
752
cur = xmlDocGetRootElement(doc);
753
cur = cur->xmlChildrenNode;
755
cur = cur->xmlChildrenNode;
759
cur = cur->xmlChildrenNode;
764
child = cur->xmlChildrenNode;
765
filename = (gchar *) xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
767
url = g_strdup_printf("%s%s", baseurl, filename);
768
file = g_build_filename(target, filename, NULL);
770
fp = fopen(file, "w");
772
curl_easy_reset(curl);
773
curl_easy_setopt(curl, CURLOPT_URL, url);
774
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
775
result = curl_easy_perform(curl);
787
return g_strdup_printf(_("Could not fetch file from %s or write it to %s."), url, file);
790
const gchar *datadir = g_build_filename(g_get_user_data_dir(), "lensfun", NULL);
792
if (!g_file_test(datadir, G_FILE_TEST_IS_DIR))
794
g_mkdir(datadir, 0700);
795
if (!g_file_test(datadir, G_FILE_TEST_IS_DIR))
796
return g_strdup_printf(_("Could not create datadir for lensfun - %s"), datadir);
799
GDir *dir = g_dir_open(target, 0, NULL);
800
const gchar *fn = NULL;
802
while ((fn = g_dir_read_name (dir)))
804
GPatternSpec *ps = g_pattern_spec_new ("*.xml");
805
if (g_pattern_match (ps, strlen(fn), fn, NULL))
807
gchar *ffn = g_build_filename (target, fn, NULL);
808
GFile *source = g_file_new_for_path(ffn);
809
GFile *destination = g_file_new_for_path(g_build_filename(datadir, fn, NULL));
811
if (!g_file_copy(source, destination, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, NULL))
812
return g_strdup_printf(_("Error copying file %s to %s\n"), g_file_get_parse_name(source), g_file_get_parse_name(destination));
819
/* FIXME: remove 'target' */
826
void set_lens (GtkButton *button, SingleLensData *single_lens_data)
828
struct lfDatabase *lensdb = NULL;
829
const lfCamera *camera = NULL;
830
const lfCamera **cameras = NULL;
832
lens_data *data = g_malloc(sizeof(lens_data));
833
data->single_lens_data = single_lens_data;
835
lensdb = lf_db_new ();
838
RSLens *rs_lens = RS_LENS(single_lens_data->lens);
845
g_assert(RS_IS_LENS(rs_lens));
846
g_object_get(rs_lens,
847
"camera-make", &camera_make,
848
"camera-model", &camera_model,
849
"min-focal", &min_focal,
850
"max-focal", &max_focal,
854
if (min_focal == max_focal)
855
lens_search = g_strdup_printf("%.0fmm", min_focal);
857
lens_search = g_strdup_printf("%.0f-%.0f", min_focal, max_focal);
859
cameras = lf_db_find_cameras(lensdb, camera_make, camera_model);
865
const lfLens **lenslist = lf_db_find_lenses_hd (
866
lensdb, camera, NULL, lens_search, 0);
867
const lfLens **full_lenslist = lf_db_find_lenses_hd (
868
lensdb, camera, NULL, NULL, 0);
870
if (!lenslist && !full_lenslist)
873
lens_menu_fill (data, lenslist, full_lenslist);
878
const lfLens **lenslist = lf_db_find_lenses_hd (
879
lensdb, NULL, NULL, lens_search, 0);
880
const lfLens *const *full_lenslist = lf_db_get_lenses (lensdb);
884
lens_menu_fill (data, lenslist, full_lenslist);
889
gtk_menu_popup (GTK_MENU (data->LensMenu), NULL, NULL, NULL, NULL,
890
0, gtk_get_current_event_time ());
894
enable_lens(GtkCheckButton *checkbutton, gpointer user_data)
896
RSLens *lens = user_data;
897
rs_lens_set_lensfun_enabled(lens, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton)));
901
open_full_lens_editor(GtkCheckButton *checkbutton, gpointer user_data)
907
boldify(const gchar* text)
909
return g_strconcat("<b>", text, "</b>", NULL);
913
rs_lens_db_editor_single_lens(RSLens *lens)
918
gchar *lensfun_model;
919
gdouble min_focal, max_focal, min_aperture, max_aperture;
924
g_assert(RS_IS_LENS(lens));
926
"identifier", &identifier,
927
"lensfun-make", &lensfun_make,
928
"lensfun-model", &lensfun_model,
929
"min-focal", &min_focal,
930
"max-focal", &max_focal,
931
"min-aperture", &min_aperture,
932
"max-aperture", &max_aperture,
933
"camera-make", &camera_make,
934
"camera-model", &camera_model,
938
GtkWidget *editor = gtk_dialog_new();
939
gtk_window_set_title(GTK_WINDOW(editor), _("Rawstudio Lens Editor"));
940
gtk_dialog_set_has_separator (GTK_DIALOG(editor), FALSE);
941
g_signal_connect_swapped(editor, "delete_event",
942
G_CALLBACK (gtk_widget_destroy), editor);
943
g_signal_connect_swapped(editor, "response",
944
G_CALLBACK (gtk_widget_destroy), editor);
946
GtkWidget *frame = gtk_frame_new("");
947
GtkWidget *table = gtk_table_new(2, 10, FALSE);
949
GtkWidget *label1 = gtk_label_new("");
950
gtk_label_set_markup(GTK_LABEL(label1), boldify(_("Lens Make")));
951
gtk_misc_set_alignment(GTK_MISC(label1), 0, 0);
953
GtkWidget *label2 = gtk_label_new("");
954
gtk_label_set_markup(GTK_LABEL(label2), boldify(_("Lens Model")));
955
gtk_misc_set_alignment(GTK_MISC(label2), 0, 0);
957
GtkWidget *label3 = gtk_label_new("");
958
gtk_label_set_markup(GTK_LABEL(label3), boldify(_("Focal Length")));
959
gtk_misc_set_alignment(GTK_MISC(label3), 0, 0);
961
GtkWidget *label4 = gtk_label_new("");
962
gtk_label_set_markup(GTK_LABEL(label4), boldify(_("Aperture")));
963
gtk_misc_set_alignment(GTK_MISC(label4), 0, 0);
965
GtkWidget *label5 = gtk_label_new("");
966
gtk_label_set_markup(GTK_LABEL(label5), boldify(_("Camera Make")));
967
gtk_misc_set_alignment(GTK_MISC(label5), 0, 0);
969
GtkWidget *label6 = gtk_label_new("");
970
gtk_label_set_markup(GTK_LABEL(label6), boldify(_("Camera Model")));
971
gtk_misc_set_alignment(GTK_MISC(label6), 0, 0);
973
// GtkWidget *label7 = gtk_label_new("");
974
// gtk_label_set_markup(GTK_LABEL(label7), "<b>Enabled</b>");
975
// gtk_misc_set_alignment(GTK_MISC(label7), 0, 0);
977
gtk_table_attach_defaults(GTK_TABLE(table), label5, 0,1,0,1);
978
gtk_table_attach_defaults(GTK_TABLE(table), label6, 0,1,1,2);
979
gtk_table_attach_defaults(GTK_TABLE(table), label3, 0,1,2,3);
980
gtk_table_attach_defaults(GTK_TABLE(table), label4, 0,1,3,4);
981
// gtk_table_attach_defaults(GTK_TABLE(table), label7, 0,1,4,5);
982
gtk_table_attach_defaults(GTK_TABLE(table), label1, 0,1,6,7);
983
gtk_table_attach_defaults(GTK_TABLE(table), label2, 0,1,7,8);
985
GtkWidget *label_lensfun_make = gtk_label_new(lensfun_make);
986
GtkWidget *label_lensfun_model = gtk_label_new(lensfun_model);
987
GtkWidget *label_focal;
988
if (min_focal == max_focal)
989
label_focal = gtk_label_new(g_strdup_printf("%.0fmm", min_focal));
991
label_focal = gtk_label_new(g_strdup_printf("%.0f-%.0fmm", min_focal, max_focal));
992
GtkWidget *label_aperture = gtk_label_new(g_strdup_printf("F/%.1f", max_aperture));
993
GtkWidget *label_camera_make = gtk_label_new(camera_make);
994
GtkWidget *label_camera_model = gtk_label_new(camera_model);
995
GtkWidget *checkbutton_enabled = gtk_check_button_new_with_label(_("Enable this lens"));
996
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_enabled), rs_lens_get_lensfun_enabled(lens));
998
GtkWidget *button_set_lens = gtk_button_new_with_label(_("Set lens"));
1000
GtkWidget *sep1 = gtk_hseparator_new();
1001
GtkWidget *sep2 = gtk_hseparator_new();
1003
SingleLensData *single_lens_data = g_malloc(sizeof(SingleLensData));
1004
single_lens_data->lensfun_make = label_lensfun_make;
1005
single_lens_data->lensfun_model = label_lensfun_model;
1006
single_lens_data->lens = lens;
1007
single_lens_data->button = button_set_lens;
1008
single_lens_data->checkbutton_enabled = checkbutton_enabled;
1010
g_signal_connect(button_set_lens, "clicked", G_CALLBACK(set_lens), single_lens_data);
1012
gtk_misc_set_alignment(GTK_MISC(label_lensfun_make), 1, 0);
1013
gtk_misc_set_alignment(GTK_MISC(label_lensfun_model), 1, 0);
1014
gtk_misc_set_alignment(GTK_MISC(label_focal), 1, 0);
1015
gtk_misc_set_alignment(GTK_MISC(label_aperture), 1, 0);
1016
gtk_misc_set_alignment(GTK_MISC(label_camera_make), 1, 0);
1017
gtk_misc_set_alignment(GTK_MISC(label_camera_model), 1, 0);
1018
// gtk_button_set_alignment(GTK_BUTTON(checkbutton_enabled), 1, 0);
1020
gtk_table_attach_defaults(GTK_TABLE(table), label_camera_make, 1,2,0,1);
1021
gtk_table_attach_defaults(GTK_TABLE(table), label_camera_model, 1,2,1,2);
1022
gtk_table_attach_defaults(GTK_TABLE(table), label_focal, 1,2,2,3);
1023
gtk_table_attach_defaults(GTK_TABLE(table), label_aperture, 1,2,3,4);
1024
gtk_table_attach_defaults(GTK_TABLE(table), sep1, 0,2,5,6);
1025
gtk_table_attach_defaults(GTK_TABLE(table), label_lensfun_make, 1,2,6,7);
1026
gtk_table_attach_defaults(GTK_TABLE(table), label_lensfun_model, 1,2,7,8);
1027
gtk_table_attach_defaults(GTK_TABLE(table), button_set_lens, 1,2,6,8);
1028
gtk_table_attach_defaults(GTK_TABLE(table), sep2, 0,2,8,9);
1029
gtk_table_attach_defaults(GTK_TABLE(table), checkbutton_enabled, 0,2,9,10);
1031
/* Set spacing around separator in table */
1032
gtk_table_set_row_spacing(GTK_TABLE(table), 4, 10);
1033
gtk_table_set_row_spacing(GTK_TABLE(table), 5, 10);
1034
gtk_table_set_row_spacing(GTK_TABLE(table), 7, 10);
1035
gtk_table_set_row_spacing(GTK_TABLE(table), 8, 10);
1037
gtk_window_resize(GTK_WINDOW(editor), 300, 1);
1039
gtk_container_set_border_width (GTK_CONTAINER (frame), 6);
1040
gtk_container_set_border_width (GTK_CONTAINER (table), 6);
1042
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(editor)->vbox), frame, TRUE, TRUE, 0);
1043
gtk_container_add (GTK_CONTAINER (frame), table);
1045
g_signal_connect(checkbutton_enabled, "toggled", G_CALLBACK(enable_lens), lens);
1047
/* FIXME: Put lensfun update button in editor - for this to work, we cannot close the window when updating */
1048
// GtkWidget *button_update_lensfun = gtk_button_new_with_label(_("Update lensfun database"));
1049
// g_signal_connect(button_update_lensfun, "clicked", G_CALLBACK(update_lensfun), NULL);
1050
// gtk_dialog_add_action_widget (GTK_DIALOG (editor), button_update_lensfun, GTK_RESPONSE_NONE);
1052
GtkWidget *button_lens_library = gtk_button_new_with_label(_("Lens Library"));
1053
g_signal_connect(button_lens_library, "clicked", G_CALLBACK(open_full_lens_editor), lens);
1054
gtk_dialog_add_action_widget (GTK_DIALOG (editor), button_lens_library, GTK_RESPONSE_CLOSE);
1056
GtkWidget *button_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
1057
gtk_dialog_add_action_widget (GTK_DIALOG (editor), button_close, GTK_RESPONSE_CLOSE);
1059
gtk_widget_show_all(GTK_WIDGET(editor));
1060
if (!rs_lens_get_lensfun_model(lens) || !rs_lens_get_lensfun_make(lens))
1062
gtk_widget_hide(label_lensfun_make);
1063
gtk_widget_hide(label_lensfun_model);
1064
gtk_widget_show(button_set_lens);
1068
gtk_widget_show(label_lensfun_make);
1069
gtk_widget_show(label_lensfun_model);
1070
gtk_widget_hide(button_set_lens);
1072
return GTK_DIALOG(editor);