本文整理汇总了C++中dt_database_get函数的典型用法代码示例。如果您正苦于以下问题:C++ dt_database_get函数的具体用法?C++ dt_database_get怎么用?C++ dt_database_get使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dt_database_get函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dt_styles_create_from_image
gboolean
dt_styles_create_from_image (const char *name,const char *description,int32_t imgid,GList *filter)
{
int id=0;
sqlite3_stmt *stmt;
/* first create the style header */
if (!dt_styles_create_style_header(name,description) ) return FALSE;
if ((id=dt_styles_get_id_by_name(name)) != 0)
{
/* create the style_items from source image history stack */
if (filter)
{
GList *list=filter;
char tmp[64];
char include[2048]= {0};
g_strlcat(include,"num in (", 2048);
do
{
if(list!=g_list_first(list))
g_strlcat(include,",", 2048);
sprintf(tmp,"%ld",(glong)list->data);
g_strlcat(include,tmp, 2048);
}
while ((list=g_list_next(list)));
g_strlcat(include,")", 2048);
char query[4096]= {0};
sprintf(query,"insert into style_items (styleid,num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name) select ?1, num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name from history where imgid=?2 and %s",include);
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), query, -1, &stmt, NULL);
}
else
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into style_items (styleid,num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name) select ?1, num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name from history where imgid=?2", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid);
sqlite3_step (stmt);
sqlite3_finalize (stmt);
_dt_style_cleanup_multi_instance(id);
/* backup style to disk */
char stylesdir[1024];
dt_loc_get_user_config_dir(stylesdir, 1024);
g_strlcat(stylesdir,"/styles",1024);
g_mkdir_with_parents(stylesdir,00755);
dt_styles_save_to_file(name,stylesdir,FALSE);
char tmp_accel[1024];
gchar* tmp_name = g_strdup(name); // freed by _destroy_style_shortcut_callback
snprintf(tmp_accel,1024,C_("accel", "styles/apply %s"),name);
dt_accel_register_global( tmp_accel, 0, 0);
GClosure *closure;
closure = g_cclosure_new(
G_CALLBACK(_apply_style_shortcut_callback),
tmp_name, _destroy_style_shortcut_callback);
dt_accel_connect_global(tmp_accel, closure);
return TRUE;
}
return FALSE;
}
示例2: dt_similarity_match_image
void dt_similarity_match_image(uint32_t imgid,dt_similarity_t *data)
{
sqlite3_stmt *stmt;
gboolean all_ok_for_match = TRUE;
dt_similarity_histogram_t orginal_histogram,test_histogram;
dt_similarity_lightmap_t orginal_lightmap,test_lightmap;
/* create temporary mem table for matches */
DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "create temporary table if not exists similar_images (id integer,score real)", NULL, NULL, NULL);
DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from similar_images", NULL, NULL, NULL);
/*
* get the histogram and lightmap data for image to match against
*/
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select histogram,lightmap from images where id = ?1", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid);
if (sqlite3_step(stmt) == SQLITE_ROW)
{
/* get the histogram data */
uint32_t size = sqlite3_column_bytes(stmt,0);
if (size!=sizeof(dt_similarity_histogram_t))
{
all_ok_for_match = FALSE;
dt_control_log(_("this image has not been indexed yet."));
}
else
memcpy(&orginal_histogram, sqlite3_column_blob(stmt, 0), sizeof(dt_similarity_histogram_t));
/* get the lightmap data */
size = sqlite3_column_bytes(stmt,1);
if (size!=sizeof(dt_similarity_lightmap_t))
{
all_ok_for_match = FALSE;
dt_control_log(_("this image has not been indexed yet."));
}
else
memcpy(&orginal_lightmap, sqlite3_column_blob(stmt, 1), sizeof(dt_similarity_lightmap_t));
}
else
{
all_ok_for_match = FALSE;
dt_control_log(_("this image has not been indexed yet."));
}
sqlite3_reset(stmt);
sqlite3_clear_bindings(stmt);
/*
* if all ok lets begin matching
*/
if (all_ok_for_match)
{
char query[4096]={0};
/* add target image with 100.0 in score into result to ensure it always shown in top */
sprintf(query,"insert into similar_images(id,score) values(%d,%f)",imgid,100.0);
DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), query, NULL, NULL, NULL);
/* set an extended collection query for viewing the result of match */
dt_collection_set_extended_where(darktable.collection, ", similar_images where images.id = similar_images.id order by similar_images.score desc");
dt_collection_set_query_flags( darktable.collection,
dt_collection_get_query_flags(darktable.collection) | COLLECTION_QUERY_USE_ONLY_WHERE_EXT);
dt_collection_update(darktable.collection);
dt_control_signal_raise(darktable.signals, DT_SIGNAL_COLLECTION_CHANGED);
/* loop thru images and generate score table */
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select id,histogram,lightmap from images", -1, &stmt, NULL);
while (sqlite3_step(stmt) == SQLITE_ROW)
{
float score_histogram=0, score_lightmap=0, score_colormap=0;
/* verify size of histogram and lightmap blob of test image */
if (
(sqlite3_column_bytes(stmt,1) == sizeof(dt_similarity_histogram_t)) &&
(sqlite3_column_bytes(stmt,2) == sizeof(dt_similarity_lightmap_t))
)
{
/*
* Get the histogram blob and calculate the similarity score
*/
memcpy(&test_histogram, sqlite3_column_blob(stmt, 1), sizeof(dt_similarity_histogram_t));
score_histogram = _similarity_match_histogram_rgb(data, &orginal_histogram, &test_histogram);
/*
* Get the lightmap blob and calculate the similarity score
* 1.08 is a tuned constant that works well with threshold
*/
memcpy(&test_lightmap, sqlite3_column_blob(stmt, 2), sizeof(dt_similarity_lightmap_t));
score_lightmap = _similarity_match_lightmap(data, &orginal_lightmap, &test_lightmap);
/*
* then calculate the colormap similarity score
*/
score_colormap = _similarity_match_colormap(data, &orginal_lightmap, &test_lightmap);
/*
//.........这里部分代码省略.........
示例3: _lib_tag_gui_update
static void
_lib_tag_gui_update (gpointer instance,gpointer self)
{
dt_lib_module_t *dm = (dt_lib_module_t *)self;
dt_lib_keywords_t *d = (dt_lib_keywords_t*)dm->data;
GtkTreeStore *store = gtk_tree_store_new(1, G_TYPE_STRING);
/* intialize the tree store with known tags */
sqlite3_stmt *stmt;
GtkTreeIter uncategorized, temp;
memset(&uncategorized,0,sizeof(GtkTreeIter));
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),
"SELECT name,icon,description FROM tags ORDER BY UPPER(name) DESC", -1, &stmt, NULL);
gtk_tree_store_clear(store);
while (sqlite3_step(stmt) == SQLITE_ROW)
{
if(strchr((const char *)sqlite3_column_text(stmt, 0),'|')==0)
{
/* add uncategorized root iter if not exists */
if (!uncategorized.stamp)
{
gtk_tree_store_insert(store, &uncategorized, NULL,0);
gtk_tree_store_set(store, &uncategorized, 0, _(UNCATEGORIZED_TAG), -1);
}
/* adding a uncategorized tag */
gtk_tree_store_insert(store, &temp, &uncategorized,0);
gtk_tree_store_set(store, &temp, 0, sqlite3_column_text(stmt, 0), -1);
}
else
{
int level = 0;
char *value;
GtkTreeIter current,iter;
char **pch = g_strsplit((char *)sqlite3_column_text(stmt, 0),"|", -1);
if (pch != NULL)
{
int j = 0;
while (pch[j] != NULL)
{
gboolean found=FALSE;
int children = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store),level>0?¤t:NULL);
/* find child with name, if not found create and continue */
for (int k=0; k<children; k++)
{
if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, level>0?¤t:NULL, k))
{
gtk_tree_model_get (GTK_TREE_MODEL(store), &iter, 0, &value, -1);
if (strcmp(value, pch[j])==0)
{
current = iter;
found = TRUE;
break;
}
}
}
/* lets add new keyword and assign current */
if (!found)
{
gtk_tree_store_insert(store, &iter, level>0?¤t:NULL,0);
gtk_tree_store_set(store, &iter, 0, pch[j], -1);
current = iter;
}
level++;
j++;
}
g_strfreev(pch);
}
}
}
gtk_tree_view_set_model(d->view, GTK_TREE_MODEL(store));
/* free store, treeview has its own storage now */
g_object_unref(store);
}
示例4: dt_styles_create_from_image
gboolean dt_styles_create_from_image(const char *name, const char *description, int32_t imgid, GList *filter)
{
int id = 0;
sqlite3_stmt *stmt;
/* first create the style header */
if(!dt_styles_create_style_header(name, description)) return FALSE;
if((id = dt_styles_get_id_by_name(name)) != 0)
{
/* create the style_items from source image history stack */
if(filter)
{
GList *list = filter;
char tmp[64];
char include[2048] = { 0 };
g_strlcat(include, "num IN (", sizeof(include));
do
{
if(list != g_list_first(list)) g_strlcat(include, ",", sizeof(include));
snprintf(tmp, sizeof(tmp), "%d", GPOINTER_TO_INT(list->data));
g_strlcat(include, tmp, sizeof(include));
} while((list = g_list_next(list)));
g_strlcat(include, ")", sizeof(include));
char query[4096] = { 0 };
snprintf(query, sizeof(query), "INSERT INTO data.style_items "
"(styleid,num,module,operation,op_params,enabled,blendop_params,blendop_"
"version,multi_priority,multi_name) SELECT ?1, "
"num,module,operation,op_params,enabled,blendop_params,blendop_version,"
"multi_priority,multi_name FROM main.history WHERE imgid=?2 AND %s",
include);
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), query, -1, &stmt, NULL);
}
else
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),
"INSERT INTO data.style_items "
"(styleid,num,module,operation,op_params,enabled,blendop_params,blendop_"
"version,multi_priority,multi_name) SELECT ?1, "
"num,module,operation,op_params,enabled,blendop_params,blendop_version,"
"multi_priority,multi_name FROM main.history WHERE imgid=?2",
-1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
_dt_style_cleanup_multi_instance(id);
/* backup style to disk */
char stylesdir[PATH_MAX] = { 0 };
dt_loc_get_user_config_dir(stylesdir, sizeof(stylesdir));
g_strlcat(stylesdir, "/styles", sizeof(stylesdir));
g_mkdir_with_parents(stylesdir, 00755);
dt_styles_save_to_file(name, stylesdir, FALSE);
char tmp_accel[1024];
gchar *tmp_name = g_strdup(name); // freed by _destroy_style_shortcut_callback
snprintf(tmp_accel, sizeof(tmp_accel), C_("accel", "styles/apply %s"), name);
dt_accel_register_global(tmp_accel, 0, 0);
GClosure *closure;
closure = g_cclosure_new(G_CALLBACK(_apply_style_shortcut_callback), tmp_name,
_destroy_style_shortcut_callback);
dt_accel_connect_global(tmp_accel, closure);
dt_control_signal_raise(darktable.signals, DT_SIGNAL_STYLE_CHANGED);
return TRUE;
}
return FALSE;
}
示例5: DT_DEBUG_SQLITE3_PREPARE_V2
GList *dt_styles_get_item_list(const char *name, gboolean params, int imgid)
{
GList *result = NULL;
sqlite3_stmt *stmt;
int id = 0;
if((id = dt_styles_get_id_by_name(name)) != 0)
{
if(params)
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),
"SELECT num, module, operation, enabled, op_params, blendop_params, "
"multi_name FROM data.style_items WHERE styleid=?1 ORDER BY num DESC",
-1, &stmt, NULL);
else if(imgid != -1)
{
// get all items from the style
// UNION
// get all items from history, not in the style : select only the last operation, that is max(num)
DT_DEBUG_SQLITE3_PREPARE_V2(
dt_database_get(darktable.db),
"SELECT num, module, operation, enabled, (SELECT MAX(num) FROM main.history WHERE imgid=?2 AND "
"operation=data.style_items.operation GROUP BY multi_priority),multi_name FROM data.style_items WHERE "
"styleid=?1 UNION SELECT -1,main.history.module,main.history.operation,main.history.enabled, "
"main.history.num,multi_name FROM main.history WHERE imgid=?2 AND main.history.enabled=1 AND "
"(main.history.operation NOT IN (SELECT operation FROM data.style_items WHERE styleid=?1) OR "
"(main.history.op_params NOT IN (SELECT op_params FROM data.style_items WHERE styleid=?1 AND "
"operation=main.history.operation)) OR (main.history.blendop_params NOT IN (SELECT blendop_params FROM "
"data.style_items WHERE styleid=?1 AND operation=main.history.operation))) GROUP BY operation HAVING "
"MAX(num) ORDER BY num DESC", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid);
}
else
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT num, module, operation, enabled, 0, "
"multi_name FROM data.style_items WHERE "
"styleid=?1 ORDER BY num DESC",
-1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id);
while(sqlite3_step(stmt) == SQLITE_ROW)
{
// name of current item of style
char iname[512] = { 0 };
dt_style_item_t *item = calloc(1, sizeof(dt_style_item_t));
if(sqlite3_column_type(stmt, 0) == SQLITE_NULL)
item->num = -1;
else
item->num = sqlite3_column_int(stmt, 0);
item->selimg_num = -1;
item->module_version = sqlite3_column_int(stmt, 1);
item->enabled = sqlite3_column_int(stmt, 3);
if(params)
{
// when we get the parameters we do not want to get the operation localized as this
// is used to compare against the internal module name.
const char *multi_name = (const char *)sqlite3_column_text(stmt, 6);
if(!(multi_name && *multi_name))
g_snprintf(iname, sizeof(iname), "%s", sqlite3_column_text(stmt, 2));
else
g_snprintf(iname, sizeof(iname), "%s %s", sqlite3_column_text(stmt, 2), multi_name);
const unsigned char *op_blob = sqlite3_column_blob(stmt, 4);
const int32_t op_len = sqlite3_column_bytes(stmt, 4);
const unsigned char *bop_blob = sqlite3_column_blob(stmt, 5);
const int32_t bop_len = sqlite3_column_bytes(stmt, 5);
item->params = malloc(op_len);
memcpy(item->params, op_blob, op_len);
item->blendop_params = malloc(bop_len);
memcpy(item->blendop_params, bop_blob, bop_len);
}
else
{
const char *multi_name = (const char *)sqlite3_column_text(stmt, 5);
gboolean has_multi_name = FALSE;
if(multi_name && *multi_name && strcmp(multi_name, "0") != 0) has_multi_name = TRUE;
if(has_multi_name)
g_snprintf(iname, sizeof(iname), "%s %s (%s)",
dt_iop_get_localized_name((gchar *)sqlite3_column_text(stmt, 2)), multi_name,
(sqlite3_column_int(stmt, 3) != 0) ? _("on") : _("off"));
else
g_snprintf(iname, sizeof(iname), "%s (%s)",
dt_iop_get_localized_name((gchar *)sqlite3_column_text(stmt, 2)),
(sqlite3_column_int(stmt, 3) != 0) ? _("on") : _("off"));
item->params = NULL;
item->blendop_params = NULL;
if(imgid != -1 && sqlite3_column_type(stmt, 4) != SQLITE_NULL)
item->selimg_num = sqlite3_column_int(stmt, 4);
}
item->name = g_strdup(iname);
result = g_list_append(result, item);
}
sqlite3_finalize(stmt);
//.........这里部分代码省略.........
示例6: _dt_style_cleanup_multi_instance
static void _dt_style_cleanup_multi_instance(int id)
{
sqlite3_stmt *stmt;
GList *list = NULL;
struct _data
{
int rowid;
int mi;
};
char last_operation[128] = { 0 };
int last_mi = 0;
/* let's clean-up the style multi-instance. What we want to do is have a unique multi_priority value for
each iop.
Furthermore this value must start to 0 and increment one by one for each multi-instance of the same
module. On
SQLite there is no notion of ROW_NUMBER, so we use rather resource consuming SQL statement, but as a
style has
never a huge number of items that's not a real issue. */
/* 1. read all data for the style and record multi_instance value. */
DT_DEBUG_SQLITE3_PREPARE_V2(
dt_database_get(darktable.db),
"SELECT rowid,operation FROM data.style_items WHERE styleid=?1 ORDER BY operation, multi_priority ASC", -1,
&stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id);
while(sqlite3_step(stmt) == SQLITE_ROW)
{
struct _data *d = malloc(sizeof(struct _data));
const char *operation = (const char *)sqlite3_column_text(stmt, 1);
if(strncmp(last_operation, operation, 128) != 0)
{
last_mi = 0;
g_strlcpy(last_operation, operation, sizeof(last_operation));
}
else
last_mi++;
d->rowid = sqlite3_column_int(stmt, 0);
d->mi = last_mi;
list = g_list_append(list, d);
}
sqlite3_finalize(stmt);
/* 2. now update all multi_instance values previously recorded */
list = g_list_first(list);
while(list)
{
struct _data *d = (struct _data *)list->data;
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),
"UPDATE data.style_items SET multi_priority=?1 WHERE rowid=?2", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, d->mi);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, d->rowid);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
list = g_list_next(list);
}
g_list_free_full(list, free);
}
示例7: dt_history_copy_and_paste_on_image
int
dt_history_copy_and_paste_on_image (int32_t imgid, int32_t dest_imgid, gboolean merge, GList *ops)
{
sqlite3_stmt *stmt;
if(imgid==dest_imgid) return 1;
if(imgid==-1)
{
dt_control_log(_("you need to copy history from an image before you paste it onto another"));
return 1;
}
/* if merge onto history stack, lets find history offest in destination image */
int32_t offs = 0;
if (merge)
{
/* apply on top of history stack */
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT MAX(num)+1 FROM history WHERE imgid = ?1", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, dest_imgid);
if (sqlite3_step (stmt) == SQLITE_ROW) offs = sqlite3_column_int (stmt, 0);
}
else
{
/* replace history stack */
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from history where imgid = ?1", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, dest_imgid);
sqlite3_step (stmt);
}
sqlite3_finalize (stmt);
// prepare SQL request
char req[2048];
strcpy (req, "insert into history (imgid, num, module, operation, op_params, enabled, blendop_params, blendop_version, multi_name, multi_priority) select ?1, num+?2, module, operation, op_params, enabled, blendop_params, blendop_version, multi_name, multi_priority from history where imgid = ?3");
// Add ops selection if any format: ... and num in (val1, val2)
if (ops)
{
GList *l = ops;
int first = 1;
strcat (req, " and num in (");
while (l)
{
unsigned int value = GPOINTER_TO_UINT(l->data);
char v[30];
if (!first) strcat (req, ",");
snprintf (v, 30, "%u", value);
strcat (req, v);
first=0;
l = g_list_next(l);
}
strcat (req, ")");
}
/* add the history items to stack offest */
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), req, -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, dest_imgid);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, offs);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, imgid);
sqlite3_step (stmt);
sqlite3_finalize (stmt);
if (merge && ops)
_dt_history_cleanup_multi_instance(dest_imgid, offs);
//we have to copy masks too
//what to do with existing masks ?
if (merge)
{
//there's very little chance that we will have same shapes id.
//but we may want to handle this case anyway
//and it's not trivial at all !
}
else
{
//let's remove all existing shapes
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from mask where imgid = ?1", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, dest_imgid);
sqlite3_step (stmt);
sqlite3_finalize (stmt);
}
//let's copy now
strcpy (req, "insert into mask (imgid, formid, form, name, version, points, points_count, source) select ?1, formid, form, name, version, points, points_count, source from mask where imgid = ?2");
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), req, -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, dest_imgid);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid);
sqlite3_step (stmt);
sqlite3_finalize (stmt);
/* if current image in develop reload history */
if (dt_dev_is_current_image(darktable.develop, dest_imgid))
{
dt_dev_reload_history_items (darktable.develop);
dt_dev_modulegroups_set(darktable.develop, dt_dev_modulegroups_get(darktable.develop));
}
/* update xmp file */
dt_image_synch_xmp(dest_imgid);
//.........这里部分代码省略.........
示例8: dt_selection_select_single
void dt_selection_select_single(dt_selection_t *selection, uint32_t imgid)
{
selection->last_single_id = imgid;
DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "DELETE FROM main.selected_images", NULL, NULL, NULL);
dt_selection_select(selection, imgid);
}
示例9: _metadata_view_update_values
/* update all values to reflect mouse over image id or no data at all */
static void _metadata_view_update_values(dt_lib_module_t *self)
{
dt_lib_metadata_view_t *d = (dt_lib_metadata_view_t *)self->data;
int32_t mouse_over_id = dt_control_get_mouse_over_id();
if (mouse_over_id == -1)
{
const dt_view_t *cv = dt_view_manager_get_current_view(darktable.view_manager);
if(cv->view((dt_view_t*)cv) == DT_VIEW_DARKROOM)
{
mouse_over_id = darktable.develop->image_storage.id;
}
else
{
sqlite3_stmt *stmt;
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select imgid from selected_images limit 1", -1, &stmt, NULL);
if(sqlite3_step(stmt) == SQLITE_ROW)
mouse_over_id = sqlite3_column_int(stmt, 0);
sqlite3_finalize(stmt);
}
}
if(mouse_over_id >= 0)
{
char value[512];
char pathname[PATH_MAX];
const dt_image_t *img = dt_image_cache_read_get(darktable.image_cache, mouse_over_id);
if(!img) goto fill_minuses;
if(img->film_id == -1)
{
dt_image_cache_read_release(darktable.image_cache, img);
goto fill_minuses;
}
/* update all metadata */
dt_image_film_roll(img, value, sizeof(value));
_metadata_update_value(d->metadata[md_internal_filmroll], value);
const int tp = 512;
char tooltip[tp];
snprintf(tooltip, tp, _("double click to jump to film roll\n%s"), value);
g_object_set(G_OBJECT(d->metadata[md_internal_filmroll]), "tooltip-text", tooltip, (char *)NULL);
snprintf(value,sizeof(value),"%d", img->id);
_metadata_update_value(d->metadata[md_internal_imgid], value);
snprintf(value,sizeof(value),"%d", img->group_id);
_metadata_update_value(d->metadata[md_internal_groupid], value);
_metadata_update_value(d->metadata[md_internal_filename], img->filename);
snprintf(value,sizeof(value),"%d", img->version);
_metadata_update_value(d->metadata[md_internal_version], value);
gboolean from_cache = FALSE;
dt_image_full_path(img->id, pathname, sizeof(pathname), &from_cache);
_metadata_update_value(d->metadata[md_internal_fullpath], pathname);
snprintf(value, sizeof(value), "%s", (img->flags & DT_IMAGE_LOCAL_COPY)?_("yes"):_("no"));
_metadata_update_value(d->metadata[md_internal_local_copy], value);
// TODO: decide if this should be removed for a release. maybe #ifdef'ing to only add it to git compiles?
// the bits of the flags
{
#define EMPTY_FIELD '.'
#define FALSE_FIELD '.'
#define TRUE_FIELD '!'
char *tooltip = NULL;
char *flag_descriptions[] = { N_("unused"),
N_("unused/deprecated"),
N_("ldr"),
N_("raw"),
N_("hdr"),
N_("marked for deletion"),
N_("auto-applying presets applied"),
N_("legacy flag. set for all new images"),
N_("local copy"),
N_("has .txt"),
N_("has .wav")
};
char *tooltip_parts[13] = { 0 };
int next_tooltip_part = 0;
memset(value, EMPTY_FIELD, sizeof(value));
int stars = img->flags & 0x7;
char *star_string = NULL;
if(stars == 6)
{
value[0] = 'x';
tooltip_parts[next_tooltip_part++] = _("image rejected");
}
else
{
value[0] = '0' + stars;
tooltip_parts[next_tooltip_part++] = star_string = g_strdup_printf(ngettext("image has %d star", "image has %d stars", stars), stars);
}
//.........这里部分代码省略.........
示例10: gtk_expander_new
//.........这里部分代码省略.........
gtk_widget_set_size_request(creator, DT_PIXEL_APPLY_DPI(300), -1);
gchar *str = dt_conf_get_string("ui_last/import_last_creator");
gtk_entry_set_text(GTK_ENTRY(creator), str);
g_free(str);
publisher = gtk_entry_new();
str = dt_conf_get_string("ui_last/import_last_publisher");
gtk_entry_set_text(GTK_ENTRY(publisher), str);
g_free(str);
rights = gtk_entry_new();
str = dt_conf_get_string("ui_last/import_last_rights");
gtk_entry_set_text(GTK_ENTRY(rights), str);
g_free(str);
tags = gtk_entry_new();
str = dt_conf_get_string("ui_last/import_last_tags");
g_object_set(tags, "tooltip-text", _("comma separated list of tags"), NULL);
gtk_entry_set_text(GTK_ENTRY(tags), str);
g_free(str);
// presets from the metadata plugin
GtkCellRenderer *renderer;
GtkTreeIter iter;
GtkListStore *model = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING /*name*/, G_TYPE_STRING /*creator*/,
G_TYPE_STRING /*publisher*/, G_TYPE_STRING /*rights*/);
GtkWidget *presets = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model));
renderer = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(presets), renderer, FALSE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(presets), renderer, "text", NAME_COLUMN, NULL);
sqlite3_stmt *stmt;
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),
"select name, op_params from presets where operation = \"metadata\"", -1, &stmt,
NULL);
while(sqlite3_step(stmt) == SQLITE_ROW)
{
void *op_params = (void *)sqlite3_column_blob(stmt, 1);
int32_t op_params_size = sqlite3_column_bytes(stmt, 1);
char *buf = (char *)op_params;
char *title = buf;
buf += strlen(title) + 1;
char *description = buf;
buf += strlen(description) + 1;
char *rights = buf;
buf += strlen(rights) + 1;
char *creator = buf;
buf += strlen(creator) + 1;
char *publisher = buf;
if(op_params_size
== strlen(title) + strlen(description) + strlen(rights) + strlen(creator) + strlen(publisher) + 5)
{
gtk_list_store_append(model, &iter);
gtk_list_store_set(model, &iter, NAME_COLUMN, (char *)sqlite3_column_text(stmt, 0), CREATOR_COLUMN,
creator, PUBLISHER_COLUMN, publisher, RIGHTS_COLUMN, rights, -1);
}
}
sqlite3_finalize(stmt);
g_object_unref(model);
int line = 0;
示例11: dt_tag_new_from_gui
}
gboolean dt_tag_new_from_gui(const char *name, guint *tagid)
{
gboolean ret = dt_tag_new(name, tagid);
/* if everything went fine, raise signal of tags change to refresh keywords module in GUI */
if(ret) dt_control_signal_raise(darktable.signals, DT_SIGNAL_TAG_CHANGED);
return ret;
}
guint dt_tag_remove(const guint tagid, gboolean final)
{
int rv, count = -1;
sqlite3_stmt *stmt;
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),
"SELECT COUNT(*) FROM main.tagged_images WHERE tagid=?1", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, tagid);
rv = sqlite3_step(stmt);
if(rv == SQLITE_ROW) count = sqlite3_column_int(stmt, 0);
sqlite3_finalize(stmt);
if(final == TRUE)
{
// let's actually remove the tag
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "DELETE FROM data.tags WHERE id=?1", -1, &stmt,
NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, tagid);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
示例12: dt_colorlabels_remove_labels_selection
void dt_colorlabels_remove_labels_selection ()
{
DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from color_labels where imgid in (select imgid from selected_images)", NULL, NULL, NULL);
}
示例13: dt_styles_get_item_list
GList *
dt_styles_get_item_list (const char *name, gboolean params, int imgid)
{
GList *result=NULL;
sqlite3_stmt *stmt;
int id=0;
if ((id=dt_styles_get_id_by_name(name)) != 0)
{
if (params)
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select num, operation, enabled, op_params, blendop_params, multi_name from style_items where styleid=?1 order by num desc", -1, &stmt, NULL);
else if (imgid != -1)
{
// get all items from the style
// UNION
// get all items from history, not in the style : select only the last operation, that is max(num)
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select num, operation, enabled, (select max(num) from history where imgid=?2 and operation=style_items.operation group by multi_priority),multi_name from style_items where styleid=?1 UNION select -1,history.operation,history.enabled,history.num,multi_name from history where imgid=?2 and history.enabled=1 and (history.operation not in (select operation from style_items where styleid=?1) or (history.op_params not in (select op_params from style_items where styleid=?1 and operation=history.operation)) or (history.blendop_params not in (select blendop_params from style_items where styleid=?1 and operation=history.operation))) group by operation having max(num) order by num desc", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid);
}
else
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select num, operation, enabled, 0, multi_name from style_items where styleid=?1 order by num desc", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id);
while (sqlite3_step(stmt) == SQLITE_ROW)
{
char name[512]= {0};
dt_style_item_t *item=g_malloc (sizeof (dt_style_item_t));
if (sqlite3_column_type(stmt,0)==SQLITE_NULL)
item->num = -1;
else
item->num = sqlite3_column_int (stmt, 0);
item->selimg_num = -1;
if (params)
{
// when we get the parameters we do not want to get the operation localized as this
// is used to compare against the internal module name.
const char *multi_name = (const char *)sqlite3_column_text (stmt, 5);
if (!multi_name || strlen(multi_name))
g_snprintf(name,512,"%s",sqlite3_column_text (stmt, 1));
else
g_snprintf(name,512,"%s %s",sqlite3_column_text (stmt, 1), multi_name);
const unsigned char *op_blob = sqlite3_column_blob(stmt, 3);
const int32_t op_len = sqlite3_column_bytes(stmt, 3);
const unsigned char *bop_blob = sqlite3_column_blob(stmt, 4);
const int32_t bop_len = sqlite3_column_bytes(stmt, 4);
item->params = malloc(op_len);
memcpy(item->params, op_blob, op_len);
item->blendop_params = malloc(bop_len);
memcpy(item->blendop_params, bop_blob, bop_len);
}
else
{
const char *multi_name = (const char *)sqlite3_column_text (stmt, 4);
gboolean has_multi_name = FALSE;
if (multi_name && strlen(multi_name)>0 && strcmp(multi_name,"0")!=0)
has_multi_name = TRUE;
if (has_multi_name)
g_snprintf(name,512,"%s %s (%s)",dt_iop_get_localized_name((gchar *)sqlite3_column_text (stmt, 1)),multi_name,(sqlite3_column_int (stmt, 2)!=0)?_("on"):_("off"));
else
g_snprintf(name,512,"%s (%s)",dt_iop_get_localized_name((gchar *)sqlite3_column_text (stmt, 1)),(sqlite3_column_int (stmt, 2)!=0)?_("on"):_("off"));
item->params = NULL;
item->blendop_params = NULL;
if (imgid != -1 && sqlite3_column_type(stmt,4)!=SQLITE_NULL)
item->selimg_num = sqlite3_column_int (stmt, 4);
}
item->name = g_strdup (name);
result = g_list_append (result,item);
}
sqlite3_finalize(stmt);
}
return result;
}
示例14: _lib_filmstrip_dnd_begin_callback
static void
_lib_filmstrip_dnd_begin_callback(GtkWidget *widget, GdkDragContext *context, gpointer user_data)
{
const int ts = 64;
dt_lib_module_t *self = (dt_lib_module_t *)user_data;
dt_lib_filmstrip_t *strip = (dt_lib_filmstrip_t *)self->data;
int imgid = strip->mouse_over_id;
// imgid part of selection -> do nothing
// otherwise -> select the current image
strip->select = DT_LIB_FILMSTRIP_SELECT_NONE;
sqlite3_stmt *stmt;
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select imgid from selected_images where imgid=?1", -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid);
if(sqlite3_step(stmt) != SQLITE_ROW)
{
dt_selection_select_single(darktable.selection, imgid);
/* redraw filmstrip */
if(darktable.view_manager->proxy.filmstrip.module)
gtk_widget_queue_draw(darktable.view_manager->proxy.filmstrip.module->widget);
}
sqlite3_finalize(stmt);
// if we are dragging a single image -> use the thumbnail of that image
// otherwise use the generic d&d icon
// TODO: have something pretty in the 2nd case, too.
if(dt_collection_get_selected_count(NULL) == 1)
{
dt_mipmap_buffer_t buf;
dt_mipmap_size_t mip = dt_mipmap_cache_get_matching_size(darktable.mipmap_cache, ts, ts);
dt_mipmap_cache_read_get(darktable.mipmap_cache, &buf, imgid, mip, DT_MIPMAP_BLOCKING);
if(buf.buf)
{
uint8_t *scratchmem = dt_mipmap_cache_alloc_scratchmem(darktable.mipmap_cache);
uint8_t *buf_decompressed = dt_mipmap_cache_decompress(&buf, scratchmem);
uint8_t *rgbbuf = g_malloc((buf.width+2)*(buf.height+2)*3);
memset(rgbbuf, 64, (buf.width+2)*(buf.height+2)*3);
for(int i=1; i<=buf.height; i++)
for(int j=1; j<=buf.width; j++)
for(int k=0; k<3; k++)
rgbbuf[(i*(buf.width+2)+j)*3+k] = buf_decompressed[((i-1)*buf.width+j-1)*4+2-k];
int w=ts, h=ts;
if(buf.width < buf.height) w = (buf.width*ts)/buf.height; // portrait
else h = (buf.height*ts)/buf.width; // landscape
GdkPixbuf *source = gdk_pixbuf_new_from_data(rgbbuf, GDK_COLORSPACE_RGB, FALSE, 8, (buf.width+2), (buf.height+2), (buf.width+2)*3, NULL, NULL);
GdkPixbuf *scaled = gdk_pixbuf_scale_simple(source, w, h, GDK_INTERP_HYPER);
gtk_drag_set_icon_pixbuf(context, scaled, 0, 0);
if(source)
g_object_unref(source);
if(scaled)
g_object_unref(scaled);
free(scratchmem);
g_free(rgbbuf);
}
dt_mipmap_cache_read_release(darktable.mipmap_cache, &buf);
}
}
示例15: dt_collection_update_query
void
dt_collection_update_query(const dt_collection_t *collection)
{
char query[1024], confname[200];
gchar *complete_query = NULL;
const int _n_r = dt_conf_get_int("plugins/lighttable/collect/num_rules");
const int num_rules = CLAMP(_n_r, 1, 10);
char *conj[] = {"and", "or", "and not"};
complete_query = dt_util_dstrcat(complete_query, "(");
for(int i=0; i<num_rules; i++)
{
snprintf(confname, sizeof(confname), "plugins/lighttable/collect/item%1d", i);
const int property = dt_conf_get_int(confname);
snprintf(confname, sizeof(confname), "plugins/lighttable/collect/string%1d", i);
gchar *text = dt_conf_get_string(confname);
if(!text) break;
snprintf(confname, sizeof(confname), "plugins/lighttable/collect/mode%1d", i);
const int mode = dt_conf_get_int(confname);
gchar *escaped_text = dt_util_str_replace(text, "'", "''");
get_query_string(property, escaped_text, query, sizeof(query));
if(i > 0)
complete_query = dt_util_dstrcat(complete_query, " %s %s", conj[mode], query);
else
complete_query = dt_util_dstrcat(complete_query, "%s", query);
g_free(escaped_text);
g_free(text);
}
complete_query = dt_util_dstrcat(complete_query, ")");
// printf("complete query: `%s'\n", complete_query);
/* set the extended where and the use of it in the query */
dt_collection_set_extended_where (collection, complete_query);
dt_collection_set_query_flags (collection, (dt_collection_get_query_flags (collection) | COLLECTION_QUERY_USE_WHERE_EXT));
/* remove film id from default filter */
dt_collection_set_filter_flags (collection, (dt_collection_get_filter_flags (collection) & ~COLLECTION_FILTER_FILM_ID));
/* update query and at last the visual */
dt_collection_update (collection);
/* free string */
g_free(complete_query);
// remove from selected images where not in this query.
sqlite3_stmt *stmt = NULL;
const gchar *cquery = dt_collection_get_query(collection);
complete_query = NULL;
if(cquery && cquery[0] != '\0')
{
complete_query = dt_util_dstrcat(complete_query, "delete from selected_images where imgid not in (%s)", cquery);
DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), complete_query, -1, &stmt, NULL);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, 0);
DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, -1);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
/* free allocated strings */
g_free(complete_query);
}
/* raise signal of collection change, only if this is an original */
if (!collection->clone)
dt_control_signal_raise(darktable.signals, DT_SIGNAL_COLLECTION_CHANGED);
}