Author: akv
Date: 2009-12-29 23:51:35 +0100 (Tue, 29 Dec 2009)
New Revision: 2885
Added:
branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.c
branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.h
Modified:
branches/rawstudio-ng-color/librawstudio/Makefile.am
Log:
Added editor for rs-lens-db - gui to match unique identifiers with lensfun
lenses.
Modified: branches/rawstudio-ng-color/librawstudio/Makefile.am
===================================================================
--- branches/rawstudio-ng-color/librawstudio/Makefile.am 2009-12-29
22:01:48 UTC (rev 2884)
+++ branches/rawstudio-ng-color/librawstudio/Makefile.am 2009-12-29
22:51:35 UTC (rev 2885)
@@ -20,6 +20,7 @@
rs-image16.h \
rs-lens.h \
rs-lens-db.h \
+ rs-lens-db-editor.h \
rs-metadata.h \
rs-filetypes.h \
rs-filter.h \
@@ -59,6 +60,7 @@
rs-image16.c rs-image16.h \
rs-lens.c rs-lens.h \
rs-lens-db.c rs-lens-db.h \
+ rs-lens-db-editor.c rs-lens-db-editor.h \
rs-metadata.c rs-metadata.h \
rs-filetypes.c rs-filetypes.h \
rs-filter.c rs-filter.h \
Added: branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.c
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.c
(rev 0)
+++ branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.c
2009-12-29 22:51:35 UTC (rev 2885)
@@ -0,0 +1,393 @@
+/*
+ * Copyright (C) 2006-2009 Anders Brander <[email protected]> and
+ * Anders Kvist <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA.
+ */
+
+/*
+ * The following functions is more or less grabbed from UFraw:
+ * lens_set(), lens_menu_select(), ptr_array_insert_sorted(),
+ * ptr_array_find_sorted(), ptr_array_insert_index() and lens_menu_fill()
+ */
+
+#include <rawstudio.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <string.h>
+#include <config.h>
+#include <lensfun.h>
+#include <rs-lens-db.h>
+#include <rs-lens.h>
+#include <gettext.h>
+#include "rs-lens-db-editor.h"
+
+static void fill_model(RSLensDb *lens_db, GtkTreeModel *tree_model);
+
+typedef struct {
+ /* The menu used to choose lens - either full or limited by search
criteria */
+ GtkWidget *LensMenu;
+ /* The GtkTreeView */
+ GtkTreeView *tree_view;
+} lens_data;
+
+static void lens_set (lens_data *data, const lfLens *lens)
+{
+ GtkTreeSelection *selection =
gtk_tree_view_get_selection(data->tree_view);
+ GtkTreeModel *model = NULL;
+ GtkTreeIter iter;
+
+ gtk_tree_selection_get_selected(selection, &model, &iter);
+
+ /* Set Maker and Model to the tree view */
+ gtk_list_store_set (GTK_LIST_STORE(model), &iter,
+ RS_LENS_DB_EDITOR_LENS_MAKE, lens->Maker,
+ RS_LENS_DB_EDITOR_LENS_MODEL, lens->Model,
+ -1);
+
+ RSLens *rs_lens = NULL;
+ gtk_tree_model_get (model, &iter,
+ RS_LENS_DB_EDITOR_LENS, &rs_lens,
+ -1);
+
+ /* Set Maker and Model to the selected RSLens */
+ rs_lens_set_lensfun_make(rs_lens, lens->Maker);
+ rs_lens_set_lensfun_model(rs_lens, lens->Model);
+
+ RSLensDb *lens_db = rs_lens_db_get_default();
+
+ /* Force save of RSLensDb */
+ rs_lens_db_save(lens_db);
+}
+
+
+static void lens_menu_select (
+ GtkMenuItem *menuitem, gpointer user_data)
+{
+ lens_data *data = (lens_data *)user_data;
+ lens_set (data, (lfLens *)g_object_get_data(G_OBJECT(menuitem),
"lfLens"));
+}
+
+int ptr_array_insert_sorted (
+ GPtrArray *array, const void *item, GCompareFunc compare)
+{
+ int length = array->len;
+ g_ptr_array_set_size (array, length + 1);
+ const void **root = (const void **)array->pdata;
+
+ int m = 0, l = 0, r = length - 1;
+
+ // Skip trailing NULL, if any
+ if (l <= r && !root [r])
+ r--;
+
+ while (l <= r)
+ {
+ m = (l + r) / 2;
+ int cmp = compare (root [m], item);
+
+ if (cmp == 0)
+ {
+ ++m;
+ goto done;
+ }
+ else if (cmp < 0)
+ l = m + 1;
+ else
+ r = m - 1;
+ }
+ if (r == m)
+ m++;
+
+ done:
+ memmove (root + m + 1, root + m, (length - m) * sizeof (void *));
+ root [m] = item;
+ return m;
+}
+
+int ptr_array_find_sorted (
+ const GPtrArray *array, const void *item, GCompareFunc compare)
+{
+ int length = array->len;
+ void **root = array->pdata;
+
+ int l = 0, r = length - 1;
+ int m = 0, cmp = 0;
+
+ if (!length)
+ return -1;
+
+ // Skip trailing NULL, if any
+ if (!root [r])
+ r--;
+
+ while (l <= r)
+ {
+ m = (l + r) / 2;
+ cmp = compare (root [m], item);
+
+ if (cmp == 0)
+ return m;
+ else if (cmp < 0)
+ l = m + 1;
+ else
+ r = m - 1;
+ }
+
+ return -1;
+}
+
+
+void ptr_array_insert_index (
+ GPtrArray *array, const void *item, int index)
+{
+ const void **root;
+ int length = array->len;
+ g_ptr_array_set_size (array, length + 1);
+ root = (const void **)array->pdata;
+ memmove (root + index + 1, root + index, (length - index) * sizeof
(void *));
+ root [index] = item;
+}
+
+
+
+static void lens_menu_fill (
+ lens_data *data, const lfLens *const *lenslist)
+{
+ unsigned i;
+ GPtrArray *makers, *submenus;
+
+ if (data->LensMenu)
+ {
+ /* This doesn't work, but will we be leaking GtkMenu's */
+ //gtk_widget_destroy (data->LensMenu);
+ data->LensMenu = NULL;
+ }
+
+ /* Count all existing lens makers and create a sorted list */
+ makers = g_ptr_array_new ();
+ submenus = g_ptr_array_new ();
+ for (i = 0; lenslist [i]; i++)
+ {
+ GtkWidget *submenu, *item;
+ const char *m = lf_mlstr_get (lenslist [i]->Maker);
+ int idx = ptr_array_find_sorted (makers, m,
(GCompareFunc)g_utf8_collate);
+ if (idx < 0)
+ {
+ /* No such maker yet, insert it into the array */
+ idx = ptr_array_insert_sorted (makers, m,
(GCompareFunc)g_utf8_collate);
+ /* Create a submenu for lenses by this maker */
+ submenu = gtk_menu_new ();
+ ptr_array_insert_index (submenus, submenu, idx);
+ }
+ submenu = g_ptr_array_index (submenus, idx);
+ /* Append current lens name to the submenu */
+ item = gtk_menu_item_new_with_label (lf_mlstr_get (lenslist
[i]->Model));
+ gtk_widget_show (item);
+ g_object_set_data(G_OBJECT(item), "lfLens", (void *)lenslist
[i]);
+ g_signal_connect(G_OBJECT(item), "activate",
+ G_CALLBACK(lens_menu_select), data);
+ gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
+ }
+
+ data->LensMenu = gtk_menu_new ();
+ for (i = 0; i < makers->len; i++)
+ {
+ GtkWidget *item = gtk_menu_item_new_with_label
(g_ptr_array_index (makers, i));
+ gtk_widget_show (item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (data->LensMenu), item);
+ gtk_menu_item_set_submenu (
+ GTK_MENU_ITEM (item), (GtkWidget *)g_ptr_array_index
(submenus, i));
+ }
+
+ g_ptr_array_free (submenus, TRUE);
+ g_ptr_array_free (makers, TRUE);
+}
+
+void row_clicked (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn
*column, gpointer user_data)
+{
+ struct lfDatabase *lensdb = NULL;
+ const lfCamera *camera = NULL;
+ const lfCamera **cameras = NULL;
+
+ lens_data *data = g_malloc(sizeof(lens_data));
+ data->tree_view = tree_view;
+
+ lensdb = lf_db_new ();
+ lf_db_load (lensdb);
+
+ GtkTreeSelection *selection =
gtk_tree_view_get_selection(data->tree_view);
+ GtkTreeModel *model = NULL;
+ GtkTreeIter iter;
+
+ gtk_tree_selection_get_selected(selection, &model, &iter);
+
+ RSLens *rs_lens = NULL;
+ gtk_tree_model_get (model, &iter,
+ RS_LENS_DB_EDITOR_LENS, &rs_lens,
+ -1);
+
+ gchar *camera_make;
+ gchar *camera_model;
+
+ g_assert(RS_IS_LENS(rs_lens));
+ g_object_get(rs_lens,
+ "camera-make", &camera_make,
+ "camera-model", &camera_model,
+ NULL);
+
+ cameras = lf_db_find_cameras(lensdb, camera_make, camera_model);
+ if (cameras)
+ camera = cameras[0];
+
+ if (camera)
+ {
+ const lfLens **lenslist = lf_db_find_lenses_hd (
+ lensdb, camera, NULL, NULL, 0);
+
+ if (!lenslist)
+ return;
+ lens_menu_fill (data, lenslist);
+ lf_free (lenslist);
+ }
+ else
+ {
+ const lfLens *const *lenslist = lf_db_get_lenses (lensdb);
+
+ if (!lenslist)
+ return;
+ lens_menu_fill (data, lenslist);
+ }
+
+ gtk_menu_popup (GTK_MENU (data->LensMenu), NULL, NULL, NULL, NULL,
+ 0, gtk_get_current_event_time ());
+}
+
+void
+rs_lens_db_editor()
+{
+ GtkTreeModel *tree_model = GTK_TREE_MODEL(gtk_list_store_new(8,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_OBJECT));
+
+ RSLensDb *lens_db = rs_lens_db_get_default();
+ fill_model(lens_db, tree_model);
+
+ GtkWidget *editor = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title(GTK_WINDOW(editor), "Rawstudio Lens Editor");
+
+ GtkWidget *scroller = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ GtkWidget *view = gtk_tree_view_new_with_model(tree_model);
+
+ gtk_tree_view_set_reorderable(GTK_TREE_VIEW(view), FALSE);
+ gtk_container_add (GTK_CONTAINER (scroller), view);
+
+ GtkCellRenderer *renderer_lens_make = gtk_cell_renderer_text_new();
+ GtkCellRenderer *renderer_lens_model = gtk_cell_renderer_text_new();
+ GtkCellRenderer *renderer_focal = gtk_cell_renderer_text_new();
+ GtkCellRenderer *renderer_aperture = gtk_cell_renderer_text_new();
+ GtkCellRenderer *renderer_camera_make = gtk_cell_renderer_text_new();
+ GtkCellRenderer *renderer_camera_model = gtk_cell_renderer_text_new();
+
+ GtkTreeViewColumn *column_lens_make =
gtk_tree_view_column_new_with_attributes (_("Lens make"),
+
renderer_lens_make,
+ "text",
RS_LENS_DB_EDITOR_LENS_MAKE,
+
NULL);
+ GtkTreeViewColumn *column_lens_model =
gtk_tree_view_column_new_with_attributes (_("Lens model"),
+
renderer_lens_model,
+ "text",
RS_LENS_DB_EDITOR_LENS_MODEL,
+
NULL);
+ GtkTreeViewColumn *column_focal =
gtk_tree_view_column_new_with_attributes (_("Focal"),
+
renderer_focal,
+ "text",
RS_LENS_DB_EDITOR_HUMAN_FOCAL,
+
NULL);
+ GtkTreeViewColumn *column_aperture =
gtk_tree_view_column_new_with_attributes (_("Aperture"),
+
renderer_aperture,
+ "text",
RS_LENS_DB_EDITOR_HUMAN_APERTURE,
+
NULL);
+ GtkTreeViewColumn *column_camera_make =
gtk_tree_view_column_new_with_attributes (_("Camera make"),
+
renderer_camera_make,
+ "text",
RS_LENS_DB_EDITOR_CAMERA_MAKE,
+
NULL);
+ GtkTreeViewColumn *column_camera_model =
gtk_tree_view_column_new_with_attributes (_("Camera model"),
+
renderer_camera_model,
+ "text",
RS_LENS_DB_EDITOR_CAMERA_MODEL,
+
NULL);
+
+ g_signal_connect(G_OBJECT(view), "row-activated",
+ G_CALLBACK(row_clicked), NULL);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_lens_make);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_lens_model);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_focal);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_aperture);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_camera_make);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view),
column_camera_model);
+
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (view), TRUE);
+
+ gtk_container_add (GTK_CONTAINER (editor), scroller);
+
+ gtk_widget_show_all(editor);
+}
+
+static void
+fill_model(RSLensDb *lens_db, GtkTreeModel *tree_model)
+{
+ GList *list = rs_lens_db_get_lenses(lens_db);
+
+ while (list)
+ {
+ gchar *identifier;
+ gchar *lensfun_make;
+ gchar *lensfun_model;
+ gdouble min_focal, max_focal, min_aperture, max_aperture;
+ gchar *camera_make;
+ gchar *camera_model;
+
+ RSLens *lens = list->data;
+
+ g_assert(RS_IS_LENS(lens));
+ g_object_get(lens,
+ "identifier", &identifier,
+ "lensfun-make", &lensfun_make,
+ "lensfun-model", &lensfun_model,
+ "min-focal", &min_focal,
+ "max-focal", &max_focal,
+ "min-aperture", &min_aperture,
+ "max-aperture", &max_aperture,
+ "camera-make", &camera_make,
+ "camera-model", &camera_model,
+ NULL);
+
+ const gchar *human_focal = rs_human_focal(min_focal, max_focal);
+ const gchar *human_aperture = rs_human_aperture(max_aperture);
+
+ GtkTreeIter iter;
+
+ gtk_list_store_append (GTK_LIST_STORE(tree_model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE(tree_model), &iter,
+ RS_LENS_DB_EDITOR_IDENTIFIER, identifier,
+ RS_LENS_DB_EDITOR_HUMAN_FOCAL, human_focal,
+ RS_LENS_DB_EDITOR_HUMAN_APERTURE,
human_aperture,
+ RS_LENS_DB_EDITOR_LENS_MAKE, lensfun_make,
+ RS_LENS_DB_EDITOR_LENS_MODEL, lensfun_model,
+ RS_LENS_DB_EDITOR_CAMERA_MAKE, camera_make,
+ RS_LENS_DB_EDITOR_CAMERA_MODEL,
camera_model,
+ RS_LENS_DB_EDITOR_LENS, lens,
+ -1);
+ list = g_list_next (list);
+ }
+}
Added: branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.h
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.h
(rev 0)
+++ branches/rawstudio-ng-color/librawstudio/rs-lens-db-editor.h
2009-12-29 22:51:35 UTC (rev 2885)
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006-2009 Anders Brander <[email protected]> and
+ * Anders Kvist <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA.
+ */
+
+#ifndef RS_LENS_DB_EDITOR_H
+#define RS_LENS_DB_EDITOR_H
+
+enum {
+ RS_LENS_DB_EDITOR_IDENTIFIER = 0,
+ RS_LENS_DB_EDITOR_HUMAN_FOCAL,
+ RS_LENS_DB_EDITOR_HUMAN_APERTURE,
+ RS_LENS_DB_EDITOR_LENS_MAKE,
+ RS_LENS_DB_EDITOR_LENS_MODEL,
+ RS_LENS_DB_EDITOR_CAMERA_MAKE,
+ RS_LENS_DB_EDITOR_CAMERA_MODEL,
+ RS_LENS_DB_EDITOR_LENS
+};
+
+
+extern void rs_lens_db_editor();
+
+#endif /* RS_LENS_DB_EDITOR_H */
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit