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