Beispiel #1
0
// replace < and > with &lt; and &gt;. any more? Yes! & -> &amp;
static gchar *_string_escape(const gchar *string)
{
  gchar *result;
  result = dt_util_str_replace(string, "&", "&amp;");
  result = dt_util_str_replace(result, "<", "&lt;");
  result = dt_util_str_replace(result, ">", "&gt;");
  return result;
}
Beispiel #2
0
static gchar *_string_substitute(gchar *string, const gchar *search, const gchar *replace)
{
  gchar *_replace = _string_escape(replace);
  gchar *result = dt_util_str_replace(string, search, _replace);
  g_free(_replace);
  return result;
}
Beispiel #3
0
static void button_clicked(GtkWidget *widget, dt_imageio_module_storage_t *self)
{
  disk_t *d = (disk_t *)self->gui_data;
  GtkWidget *win = dt_ui_main_window(darktable.gui->ui);
  GtkWidget *filechooser = gtk_file_chooser_dialog_new(
      _("select directory"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_cancel"),
      GTK_RESPONSE_CANCEL, _("_select as output destination"), GTK_RESPONSE_ACCEPT, (char *)NULL);
#ifdef GDK_WINDOWING_QUARTZ
  dt_osx_disallow_fullscreen(filechooser);
#endif

  gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(filechooser), FALSE);
  gchar *old = g_strdup(gtk_entry_get_text(d->entry));
  char *c = g_strstr_len(old, -1, "$");
  if(c) *c = '\0';
  gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filechooser), old);
  g_free(old);
  if(gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
  {
    gchar *dir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
    char *composed = g_build_filename(dir, "$(FILE_NAME)", NULL);

    // composed can now contain '\': on Windows it's the path separator,
    // on other platforms it can be part of a regular folder name.
    // This would later clash with variable substitution, so we have to escape them
    gchar *escaped = dt_util_str_replace(composed, "\\", "\\\\");

    gtk_entry_set_text(GTK_ENTRY(d->entry), escaped); // the signal handler will write this to conf
    g_free(dir);
    g_free(composed);
    g_free(escaped);
  }
  gtk_widget_destroy(filechooser);
}
Beispiel #4
0
gboolean dt_variables_expand(dt_variables_params_t *params, gchar *string, gboolean iterate)
{
  gchar *variable = g_malloc(128);
  gchar *value = g_malloc_n(1024, sizeof(gchar));
  gchar *token = NULL;

  // Let's free previous expanded result if any...
  g_free(params->data->result);

  if(iterate) params->data->sequence++;

  // Lets expand string
  gchar *result = NULL;
  params->data->result = params->data->source = string;
  if((token = _string_get_first_variable(params->data->source, variable)) != NULL)
  {
    do
    {
      // fprintf(stderr,"var: %s\n",variable);
      if(_variable_get_value(params, variable, value, 1024 * sizeof(gchar)))
      {
        // fprintf(stderr,"Substitute variable '%s' with value '%s'\n",variable,value);
        if((result = dt_util_str_replace(params->data->result, variable, value)) != params->data->result
           && result != params->data->source)
        {
          // we got a result
          if(params->data->result != params->data->source) g_free(params->data->result);
          params->data->result = result;
        }
      }
    } while((token = _string_get_next_variable(token, variable)) != NULL);
  }
  else
    params->data->result = g_strdup(string);

  g_free(variable);
  g_free(value);
  return TRUE;
}
static gboolean
changed_callback (GtkEntry *entry, dt_lib_collect_rule_t *dr)
{
    // update related list
    dt_lib_collect_t *d = get_collect(dr);
    sqlite3_stmt *stmt;
    GtkTreeIter iter;
    GtkTreeView *view = d->view;
    GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
    g_object_ref(model);
    gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL);
    gtk_list_store_clear(GTK_LIST_STORE(model));
    char query[1024];
    int property = gtk_combo_box_get_active(dr->combo);
    const gchar *text = gtk_entry_get_text(GTK_ENTRY(dr->text));
    gchar *escaped_text = dt_util_str_replace(text, "'", "''");
    char confname[200];
    snprintf(confname, 200, "plugins/lighttable/collect/string%1ld", dr->num);
    dt_conf_set_string (confname, text);
    snprintf(confname, 200, "plugins/lighttable/collect/item%1ld", dr->num);
    dt_conf_set_int (confname, property);

    switch(property)
    {
    case 0: // film roll
        snprintf(query, 1024, "select distinct folder, id from film_rolls where folder like '%%%s%%'  order by id DESC", escaped_text);
        break;
    case 1: // camera
        snprintf(query, 1024, "select distinct maker || ' ' || model as model, 1 from images where maker || ' ' || model like '%%%s%%' order by model", escaped_text);
        break;
    case 2: // tag
        snprintf(query, 1024, "SELECT distinct name, id FROM tags WHERE name LIKE '%%%s%%' ORDER BY UPPER(name)", escaped_text);
        break;
    case 4: // History, 2 hardcoded alternatives
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT,_("altered"),
                            DT_LIB_COLLECT_COL_ID, 0,
                            DT_LIB_COLLECT_COL_TOOLTIP,_("altered"),
                            -1);
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT,_("not altered"),
                            DT_LIB_COLLECT_COL_ID, 1,
                            DT_LIB_COLLECT_COL_TOOLTIP,_("not altered"),
                            -1);
        goto entry_key_press_exit;
        break;

    case 5: // colorlabels
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT,_("red"),
                            DT_LIB_COLLECT_COL_ID, 0,
                            DT_LIB_COLLECT_COL_TOOLTIP, _("red"),
                            -1);
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT,_("yellow"),
                            DT_LIB_COLLECT_COL_ID, 1,
                            DT_LIB_COLLECT_COL_TOOLTIP, _("yellow"),
                            -1);
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT,_("green"),
                            DT_LIB_COLLECT_COL_ID, 2,
                            DT_LIB_COLLECT_COL_TOOLTIP, _("green"),
                            -1);
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT,_("blue"),
                            DT_LIB_COLLECT_COL_ID, 3,
                            DT_LIB_COLLECT_COL_TOOLTIP, _("blue"),
                            -1);
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT,_("purple"),
                            DT_LIB_COLLECT_COL_ID, 4,
                            DT_LIB_COLLECT_COL_TOOLTIP, _("purple"),
                            -1);
        goto entry_key_press_exit;
        break;

    // TODO: Add empty string for metadata?
    // TODO: Autogenerate this code?
    case 6: // title
        snprintf(query, 1024, "select distinct value, 1 from meta_data where key = %d and value like '%%%s%%' order by value",
                 DT_METADATA_XMP_DC_TITLE, escaped_text);
        break;
    case 7: // description
        snprintf(query, 1024, "select distinct value, 1 from meta_data where key = %d and value like '%%%s%%' order by value",
                 DT_METADATA_XMP_DC_DESCRIPTION, escaped_text);
        break;
    case 8: // creator
        snprintf(query, 1024, "select distinct value, 1 from meta_data where key = %d and value like '%%%s%%' order by value",
                 DT_METADATA_XMP_DC_CREATOR, escaped_text);
        break;
    case 9: // publisher
        snprintf(query, 1024, "select distinct value, 1 from meta_data where key = %d and value like '%%%s%%' order by value",
                 DT_METADATA_XMP_DC_PUBLISHER, escaped_text);
        break;
    case 10: // rights
        snprintf(query, 1024, "select distinct value, 1 from meta_data where key = %d and value like '%%%s%%'order by value ",
                 DT_METADATA_XMP_DC_RIGHTS, escaped_text);
        break;
    case 11: // lens
        snprintf(query, 1024, "select distinct lens, 1 from images where lens like '%%%s%%' order by lens", escaped_text);
        break;
    case 12: // iso
        snprintf(query, 1024, "select distinct cast(iso as integer) as iso, 1 from images where iso like '%%%s%%' order by iso", escaped_text);
        break;
    case 13: // aperature
        snprintf(query, 1024, "select distinct round(aperture,1) as aperture, 1 from images where aperture like '%%%s%%' order by aperture", escaped_text);
        break;
    case 14: // filename
        snprintf(query, 1024, "select distinct filename, 1 from images where filename like '%%%s%%' order by filename", escaped_text);
        break;

    default: // case 3: // day
        snprintf(query, 1024, "SELECT DISTINCT datetime_taken, 1 FROM images WHERE datetime_taken LIKE '%%%s%%' ORDER BY datetime_taken DESC", escaped_text);
        break;
    }
    g_free(escaped_text);
    DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), query, -1, &stmt, NULL);
    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        gtk_list_store_append(GTK_LIST_STORE(model), &iter);
        const char *folder = (const char*)sqlite3_column_text(stmt, 0);
        if(property == 0) // film roll
        {
            folder = dt_image_film_roll_name(folder);
        }
        gchar *value =  (gchar *)sqlite3_column_text(stmt, 0);
        gchar *escaped_text = g_markup_escape_text(value, strlen(value));
        gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            DT_LIB_COLLECT_COL_TEXT, folder,
                            DT_LIB_COLLECT_COL_ID, sqlite3_column_int(stmt, 1),
                            DT_LIB_COLLECT_COL_TOOLTIP, escaped_text,
                            DT_LIB_COLLECT_COL_PATH, value,
                            -1);
    }
    sqlite3_finalize(stmt);
entry_key_press_exit:
    gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(view), DT_LIB_COLLECT_COL_TOOLTIP);
    gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
    g_object_unref(model);
    return FALSE;
}
Beispiel #6
0
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);

}