Author: abrander
Date: 2010-01-27 22:59:31 +0100 (Wed, 27 Jan 2010)
New Revision: 3098

Modified:
   branches/rawstudio-ng-color/librawstudio/rs-profile-factory-model.h
   branches/rawstudio-ng-color/librawstudio/rs-profile-factory.c
   branches/rawstudio-ng-color/librawstudio/rs-profile-factory.h
   branches/rawstudio-ng-color/librawstudio/rs-profile-selector.c
   branches/rawstudio-ng-color/librawstudio/rs-profile-selector.h
   branches/rawstudio-ng-color/src/rs-toolbox.c
Log:
Preparing for ICC input profiles.

Modified: branches/rawstudio-ng-color/librawstudio/rs-profile-factory-model.h
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-profile-factory-model.h 
2010-01-27 19:59:43 UTC (rev 3097)
+++ branches/rawstudio-ng-color/librawstudio/rs-profile-factory-model.h 
2010-01-27 21:59:31 UTC (rev 3098)
@@ -1,6 +1,15 @@
 enum {
+       FACTORY_MODEL_COLUMN_TYPE,
        FACTORY_MODEL_COLUMN_PROFILE,
        FACTORY_MODEL_COLUMN_MODEL,
        FACTORY_MODEL_COLUMN_ID,
        FACTORY_MODEL_NUM_COLUMNS
 };
+
+/* We use these for sorting */
+enum {
+       FACTORY_MODEL_TYPE_DCP,
+       FACTORY_MODEL_TYPE_ICC,
+       FACTORY_MODEL_TYPE_SEP,
+       FACTORY_MODEL_TYPE_ADD,
+};

Modified: branches/rawstudio-ng-color/librawstudio/rs-profile-factory.c
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-profile-factory.c       
2010-01-27 19:59:43 UTC (rev 3097)
+++ branches/rawstudio-ng-color/librawstudio/rs-profile-factory.c       
2010-01-27 21:59:31 UTC (rev 3098)
@@ -1,6 +1,7 @@
 #include "rs-dcp-file.h"
 #include "rs-profile-factory.h"
 #include "rs-profile-factory-model.h"
+#include "rs-icc-profile.h"
 #include "config.h"
 #include "rs-utils.h"
 
@@ -24,11 +25,59 @@
 {
        /* We use G_TYPE_POINTER to store some strings because they should live
         forever - and we avoid unneeded strdup/free */
-       factory->profiles = gtk_list_store_new(FACTORY_MODEL_NUM_COLUMNS, 
RS_TYPE_DCP_FILE, G_TYPE_POINTER, G_TYPE_POINTER);
+       factory->profiles = gtk_list_store_new(FACTORY_MODEL_NUM_COLUMNS, 
G_TYPE_INT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
 }
 
+static gboolean
+add_icc_profile(RSProfileFactory *factory, const gchar *path)
+{
+       gboolean readable = FALSE;
+
+       RSIccProfile *profile = rs_icc_profile_new_from_file(path);
+       g_assert(RS_IS_ICC_PROFILE(profile));
+       if (profile)
+       {
+               GtkTreeIter iter;
+
+               gtk_list_store_prepend(factory->profiles, &iter);
+               gtk_list_store_set(factory->profiles, &iter,
+                       FACTORY_MODEL_COLUMN_TYPE, FACTORY_MODEL_TYPE_ICC,
+                       FACTORY_MODEL_COLUMN_PROFILE, profile,
+                       FACTORY_MODEL_COLUMN_ID, g_path_get_basename(path), /* 
FIXME */
+                       -1);
+
+               readable = TRUE;
+       }
+
+       return readable;
+}
+
+static gboolean
+add_dcp_profile(RSProfileFactory *factory, const gchar *path)
+{
+       gboolean readable = FALSE;
+
+       RSDcpFile *profile = rs_dcp_file_new_from_file(path);
+       const gchar *model = rs_dcp_file_get_model(profile);
+       if (model)
+       {
+               GtkTreeIter iter;
+
+               gtk_list_store_prepend(factory->profiles, &iter);
+               gtk_list_store_set(factory->profiles, &iter,
+                       FACTORY_MODEL_COLUMN_TYPE, FACTORY_MODEL_TYPE_DCP,
+                       FACTORY_MODEL_COLUMN_PROFILE, profile,
+                       FACTORY_MODEL_COLUMN_MODEL, model,
+                       FACTORY_MODEL_COLUMN_ID, rs_dcp_get_id(profile),
+                       -1);
+               readable = TRUE;
+       }
+
+       return readable;
+}
+
 static void
-load_profiles(RSProfileFactory *factory, const gchar *path)
+load_profiles(RSProfileFactory *factory, const gchar *path, gboolean load_dcp, 
gboolean load_icc)
 {
        const gchar *basename;
        gchar *filename;
@@ -42,24 +91,19 @@
                filename = g_build_filename(path, basename, NULL);
 
                if (g_file_test(filename, G_FILE_TEST_IS_DIR))
-                       load_profiles(factory, filename);
+                       load_profiles(factory, filename, load_dcp, load_icc);
 
-               else if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)
-                       && (g_str_has_suffix(basename, ".dcp") || 
g_str_has_suffix(basename, ".DCP")))
+               else if (g_file_test(filename, G_FILE_TEST_IS_REGULAR))
                {
-                       RSDcpFile *profile = 
rs_dcp_file_new_from_file(filename);
-                       const gchar *model = rs_dcp_file_get_model(profile);
-                       if (model)
-                       {
-                               GtkTreeIter iter;
-
-                               gtk_list_store_prepend(factory->profiles, 
&iter);
-                               gtk_list_store_set(factory->profiles, &iter,
-                                       FACTORY_MODEL_COLUMN_PROFILE, profile,
-                                       FACTORY_MODEL_COLUMN_MODEL, model,
-                                       FACTORY_MODEL_COLUMN_ID, 
rs_dcp_get_id(profile),
-                                       -1);
-                       }
+                       if (load_dcp && (g_str_has_suffix(basename, ".dcp") || 
g_str_has_suffix(basename, ".DCP")))
+                               add_dcp_profile(factory, filename);
+                       else if (load_icc && (
+                               g_str_has_suffix(basename, ".icc")
+                               || g_str_has_suffix(basename, ".ICC")
+                               || g_str_has_suffix(basename, ".icm")
+                               || g_str_has_suffix(basename, ".ICM")
+                               ))
+                               add_icc_profile(factory, filename);
                }
 
                g_free(filename);
@@ -72,17 +116,22 @@
 {
        RSProfileFactory *factory = g_object_new(RS_TYPE_PROFILE_FACTORY, NULL);
 
-       load_profiles(factory, search_path);
-       
+       load_profiles(factory, search_path, TRUE, FALSE);
+
+       GtkTreeIter iter;
+
+       gtk_list_store_prepend(factory->profiles, &iter);
+       gtk_list_store_set(factory->profiles, &iter,
+               FACTORY_MODEL_COLUMN_TYPE, FACTORY_MODEL_TYPE_SEP,
+               -1);
+       gtk_list_store_prepend(factory->profiles, &iter);
+       gtk_list_store_set(factory->profiles, &iter,
+               FACTORY_MODEL_COLUMN_TYPE, FACTORY_MODEL_TYPE_ADD,
+               -1);
+
        return factory;
 }
 
-void
-rs_profile_factory_append(RSProfileFactory *factory, const gchar *search_path)
-{
-       load_profiles(factory, search_path);
-}
-
 RSProfileFactory *
 rs_profile_factory_new_default(void)
 {
@@ -95,7 +144,7 @@
                factory = 
rs_profile_factory_new(PROFILE_FACTORY_DEFAULT_SEARCH_PATH);
 
                gchar *user_profiles = g_strdup_printf("%s/profiles/", 
rs_confdir_get());
-               rs_profile_factory_append(factory, user_profiles);
+               load_profiles(factory, user_profiles, TRUE, TRUE);
                g_free(user_profiles);
        }
        g_static_mutex_unlock(&lock);
@@ -103,41 +152,41 @@
        return factory;
 }
 
-GList *
-rs_profile_factory_get_compatible(RSProfileFactory *factory, const gchar 
*make, const gchar *model)
+gboolean
+rs_profile_factory_add_profile(RSProfileFactory *factory, const gchar *path)
 {
-       RSDcpFile *dcp;
-       gchar *dcp_model;
-       GList *matches = NULL;
-       GtkTreeIter iter;
-       GtkTreeModel *treemodel = GTK_TREE_MODEL(factory->profiles);
+       g_assert(RS_IS_PROFILE_FACTORY(factory));
+       g_assert(path != NULL);
+       g_assert(path[0] != '\0');
+       g_assert(g_path_is_absolute(path));
 
-       if (gtk_tree_model_get_iter_first(treemodel, &iter))
-               do {
-                       gtk_tree_model_get(treemodel, &iter,
-                               FACTORY_MODEL_COLUMN_MODEL, &dcp_model,
-                               FACTORY_MODEL_COLUMN_PROFILE, &dcp,
-                               -1);
-                       if (model && g_str_equal(model, dcp_model))
-                               matches = g_list_prepend(matches, dcp);
-                       g_object_unref(dcp);
-               } while (gtk_tree_model_iter_next(treemodel, &iter));
+       if (g_str_has_suffix(path, ".dcp") || g_str_has_suffix(path, ".DCP"))
+               return add_dcp_profile(factory, path);
+       if (g_str_has_suffix(path, ".icc") || g_str_has_suffix(path, ".ICC"))
+               return add_icc_profile(factory, path);
+       if (g_str_has_suffix(path, ".icm") || g_str_has_suffix(path, ".ICM"))
+               return add_icc_profile(factory, path);
 
-       return matches;
+       return FALSE;
 }
 
 static gboolean
 visible_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 {
-       gboolean visible = FALSE;
+       gboolean visible = TRUE;
 
        gchar *model_needle = (gchar *) data;
        gchar *model_haystack;
+       gint type;
 
-       gtk_tree_model_get(model, iter, FACTORY_MODEL_COLUMN_MODEL, 
&model_haystack, -1);
+       gtk_tree_model_get(model, iter,
+               FACTORY_MODEL_COLUMN_MODEL, &model_haystack,
+               FACTORY_MODEL_COLUMN_TYPE, &type,
+               -1);
 
-       if (g_strcmp0(model_needle, model_haystack) == 0)
-           visible = TRUE;
+       /* The only thing we need to hide is mismatched DCP profiles */
+       if ((type == FACTORY_MODEL_TYPE_DCP) && (g_strcmp0(model_needle, 
model_haystack) != 0))
+           visible = FALSE;
 
        return visible;
 }
@@ -169,17 +218,18 @@
                                FACTORY_MODEL_COLUMN_ID, &model_id,
                                -1);
 
-                       if (id && g_str_equal(id, model_id))
+                       if (id && model_id && g_str_equal(id, model_id))
                        {
                                gtk_tree_model_get(treemodel, &iter,
                                        FACTORY_MODEL_COLUMN_PROFILE, &dcp,
                                        -1);
 
+                               /* FIXME: Deal with ICC */
+                               g_assert(RS_IS_DCP_FILE(dcp));
                                if (ret)
                                        g_warning("WARNING: Duplicate profiles 
detected in file: %s, for %s, named:%s.\nUnsing last found profile.", 
rs_tiff_get_filename_nopath(RS_TIFF(dcp)),  rs_dcp_file_get_model(dcp),  
rs_dcp_file_get_name(dcp));
 
                                ret = dcp;
-                               g_object_unref(dcp);
                        }
                } while (gtk_tree_model_iter_next(treemodel, &iter));
 

Modified: branches/rawstudio-ng-color/librawstudio/rs-profile-factory.h
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-profile-factory.h       
2010-01-27 19:59:43 UTC (rev 3097)
+++ branches/rawstudio-ng-color/librawstudio/rs-profile-factory.h       
2010-01-27 21:59:31 UTC (rev 3098)
@@ -31,7 +31,7 @@
 
 RSProfileFactory *rs_profile_factory_new_default(void);
 
-GList *rs_profile_factory_get_compatible(RSProfileFactory *factory, const 
gchar *make, const gchar *model);
+gboolean rs_profile_factory_add_profile(RSProfileFactory *factory, const gchar 
*path);
 
 GtkTreeModelFilter *rs_dcp_factory_get_compatible_as_model(RSProfileFactory 
*factory, const gchar *make, const gchar *model);
 

Modified: branches/rawstudio-ng-color/librawstudio/rs-profile-selector.c
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-profile-selector.c      
2010-01-27 19:59:43 UTC (rev 3097)
+++ branches/rawstudio-ng-color/librawstudio/rs-profile-selector.c      
2010-01-27 21:59:31 UTC (rev 3098)
@@ -1,3 +1,5 @@
+#include "config.h"
+#include "gettext.h"
 #include "rs-profile-selector.h"
 #include "rs-icc-profile.h"
 #include "rs-profile-factory-model.h"
@@ -5,8 +7,9 @@
 G_DEFINE_TYPE(RSProfileSelector, rs_profile_selector, GTK_TYPE_COMBO_BOX)
 
 enum {
-    DCP_SELECTED_SIGNAL,
+       DCP_SELECTED_SIGNAL,
        ICC_SELECTED_SIGNAL,
+       ADD_SELECTED_SIGNAL,
     LAST_SIGNAL
 };
 static guint signals[LAST_SIGNAL] = {0};
@@ -18,12 +21,6 @@
        NUM_COLUMNS
 };
 
-/* We use these for sorting */
-enum {
-       SELECTOR_TYPE_DCP,
-       SELECTOR_TYPE_ICC
-};
-
 static void
 rs_profile_selector_dispose(GObject *object)
 {
@@ -59,6 +56,15 @@
         g_cclosure_marshal_VOID__OBJECT,
         G_TYPE_NONE, 1, RS_TYPE_ICC_PROFILE);
 
+       signals[ADD_SELECTED_SIGNAL] = g_signal_new("add-selected",
+               G_TYPE_FROM_CLASS(klass),
+           G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+               0,
+               NULL,
+               NULL,
+        g_cclosure_marshal_VOID__VOID,
+        G_TYPE_NONE, 0);
+
        object_class->dispose = rs_profile_selector_dispose;
        object_class->finalize = rs_profile_selector_finalize;
 }
@@ -83,14 +89,40 @@
                        COLUMN_POINTER, &profile,
                        COLUMN_TYPE, &type,
                        -1);
+               RSProfileSelector *selector = RS_PROFILE_SELECTOR(combo);
 
-               if (type == SELECTOR_TYPE_DCP)
+               if (type == FACTORY_MODEL_TYPE_DCP)
+               {
                        g_signal_emit(RS_PROFILE_SELECTOR(combo), 
signals[DCP_SELECTED_SIGNAL], 0, profile);
-               else if (type == SELECTOR_TYPE_ICC)
+                       selector->selected = profile;
+               }
+               else if (type == FACTORY_MODEL_TYPE_ICC)
+               {
                        g_signal_emit(RS_PROFILE_SELECTOR(combo), 
signals[ICC_SELECTED_SIGNAL], 0, profile);
+                       selector->selected = profile;
+               }
+               else if (type == FACTORY_MODEL_TYPE_ADD)
+               {
+                       /* If the user selects "add profile", we should not 
stay at this selection */
+                       rs_profile_selector_select_profile(selector, 
selector->selected);
+
+                       g_signal_emit(RS_PROFILE_SELECTOR(combo), 
signals[ADD_SELECTED_SIGNAL], 0, NULL);
+               }
        }
 }
 
+static gboolean
+separator_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
+{
+       gint type = 0;
+
+       gtk_tree_model_get(model, iter,
+               COLUMN_TYPE, &type,
+               -1);
+
+       return (type == FACTORY_MODEL_TYPE_SEP);
+}
+
 static void
 rs_profile_selector_init(RSProfileSelector *selector)
 {
@@ -101,8 +133,10 @@
        GtkCellRenderer *cell = gtk_cell_renderer_text_new();
        gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), cell, TRUE );
        gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), cell,
-               "text", 0,
+               "markup", 0,
                NULL);
+
+       gtk_combo_box_set_row_separator_func(combo, separator_func, NULL, NULL);
 }
 
 RSProfileSelector *
@@ -138,45 +172,43 @@
 static void
 modify_func(GtkTreeModel *filter, GtkTreeIter *iter, GValue *value, gint 
column, gpointer data)
 {
-       GtkTreeModel *model; 
+       GtkTreeModel *model;
        GtkTreeIter child_iter;
 
+       gint type;
        gpointer profile;
+       gchar *str;
 
        g_object_get(filter, "child-model", &model, NULL);
        
gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(filter), 
&child_iter, iter);
-       gtk_tree_model_get(model, &child_iter, FACTORY_MODEL_COLUMN_PROFILE, 
&profile, -1 );
+       gtk_tree_model_get(model, &child_iter,
+               FACTORY_MODEL_COLUMN_TYPE, &type,
+               FACTORY_MODEL_COLUMN_PROFILE, &profile,
+               -1);
 
-       if (RS_IS_DCP_FILE(profile))
+       if (column == COLUMN_TYPE)
+               g_value_set_int(value, type);
+       else if (column == COLUMN_POINTER)
+               g_value_set_pointer(value, profile);
+       else if (column == COLUMN_NAME)
        {
-               switch (column)
+               switch(type)
                {
-                       case COLUMN_POINTER:
-                               g_value_set_pointer(value, profile);
+                       case FACTORY_MODEL_TYPE_DCP:
+                               str = g_strdup_printf("%s 
<small><small>(dcp)</small></small>", rs_dcp_file_get_name(profile));
+                               g_value_set_string(value, str);
+                               g_free(str);
                                break;
-                       case COLUMN_NAME:
-                               g_value_set_string(value, 
rs_dcp_file_get_name(profile));
+                       case FACTORY_MODEL_TYPE_ICC:
+                               str = g_strdup_printf("%s 
<small><small>(icc)</small></small>", "FIXME-name");
+                               g_value_set_string(value, str);
+                               g_free(str);
                                break;
-                       case COLUMN_TYPE:
-                               g_value_set_int(value, SELECTOR_TYPE_DCP);
+                       case FACTORY_MODEL_TYPE_ADD:
+                               g_value_set_string(value, _("Add profile ..."));
                                break;
                }
        }
-       else if (RS_IS_ICC_PROFILE(profile))
-       {
-               switch (column)
-               {
-                       case COLUMN_POINTER:
-                               g_value_set_pointer(value, profile);
-                               break;
-                       case COLUMN_NAME:
-                               g_value_set_string(value, "ICC FIXME");
-                               break;
-                       case COLUMN_TYPE:
-                               g_value_set_int(value, SELECTOR_TYPE_ICC);
-                               break;
-               }
-       }
 }
 
 static gint

Modified: branches/rawstudio-ng-color/librawstudio/rs-profile-selector.h
===================================================================
--- branches/rawstudio-ng-color/librawstudio/rs-profile-selector.h      
2010-01-27 19:59:43 UTC (rev 3097)
+++ branches/rawstudio-ng-color/librawstudio/rs-profile-selector.h      
2010-01-27 21:59:31 UTC (rev 3098)
@@ -16,6 +16,8 @@
 
 typedef struct {
        GtkComboBox parent;
+
+       gpointer selected;
 } RSProfileSelector;
 
 typedef struct {
@@ -36,6 +38,9 @@
 void
 rs_profile_selector_set_profiles_steal(RSProfileSelector *selector, GList 
*profiles);
 
+void
+rs_profile_selector_set_model_filter(RSProfileSelector *selector, 
GtkTreeModelFilter *filter);
+
 G_END_DECLS
 
 #endif /* RS_PROFILE_SELECTOR_H */

Modified: branches/rawstudio-ng-color/src/rs-toolbox.c
===================================================================
--- branches/rawstudio-ng-color/src/rs-toolbox.c        2010-01-27 19:59:43 UTC 
(rev 3097)
+++ branches/rawstudio-ng-color/src/rs-toolbox.c        2010-01-27 21:59:31 UTC 
(rev 3098)
@@ -106,6 +106,7 @@
 
 static void dcp_profile_selected(RSProfileSelector *selector, RSDcpFile *dcp, 
RSToolbox *toolbox);
 static void icc_profile_selected(RSProfileSelector *selector, RSIccProfile 
*icc, RSToolbox *toolbox);
+static void add_profile_selected(RSProfileSelector *selector, RSToolbox 
*toolbox);
 static void conf_histogram_height_changed(GConfClient *client, guint cnxn_id, 
GConfEntry *entry, gpointer user_data);
 static void notebook_switch_page(GtkNotebook *notebook, GtkNotebookPage *page, 
guint page_num, RSToolbox *toolbox);
 static void basic_range_value_changed(GtkRange *range, gpointer user_data);
@@ -166,6 +167,7 @@
        self->selector = rs_profile_selector_new();
        g_signal_connect(self->selector, "dcp-selected", 
G_CALLBACK(dcp_profile_selected), self);
        g_signal_connect(self->selector, "icc-selected", 
G_CALLBACK(icc_profile_selected), self);
+       g_signal_connect(self->selector, "add-selected", 
G_CALLBACK(add_profile_selected), self);
        gtk_box_pack_start(self->toolbox, GTK_WIDGET(self->selector), FALSE, 
FALSE, 0);
 
        for(page=0;page<3;page++)
@@ -233,12 +235,16 @@
 static void
 icc_profile_selected(RSProfileSelector *selector, RSIccProfile *icc, RSToolbox 
*toolbox)
 {
-       /* FIXME: stub */
-//     if (toolbox->photo)
-//             rs_photo_set_icc_profile(toolbox->photo, icc);
+       g_debug("FIXME: stub @ %s:%d %s()", __FILE__, __LINE__, __FUNCTION__);
 }
 
 static void
+add_profile_selected(RSProfileSelector *selector, RSToolbox *toolbox)
+{
+       g_debug("FIXME: stub @ %s:%d %s()", __FILE__, __LINE__, __FUNCTION__);
+}
+
+static void
 conf_histogram_height_changed(GConfClient *client, guint cnxn_id, GConfEntry 
*entry, gpointer user_data)
 {
        RSToolbox *toolbox = RS_TOOLBOX(user_data);
@@ -944,7 +950,6 @@
        toolbox->mute_from_sliders = FALSE;
 
        /* Update profile selector */
-       GList *dcp_profiles = NULL;
        if (photo && photo->metadata)
        {
                RSProfileFactory *factory = rs_profile_factory_new_default();


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to