Skip to content

Commit

Permalink
More collection types and filters (#16479)
Browse files Browse the repository at this point in the history
* new collection types

  - white balance
  - flash
  - exposure program
  - metering mode
  • Loading branch information
zisoft committed Mar 19, 2024
1 parent 241bf89 commit 357bdc3
Show file tree
Hide file tree
Showing 5 changed files with 640 additions and 7 deletions.
118 changes: 116 additions & 2 deletions src/common/collection.c
@@ -1,6 +1,6 @@
/*
This file is part of darktable,
Copyright (C) 2010-2023 darktable developers.
Copyright (C) 2024 darktable developers.
darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -651,7 +651,16 @@ const char *dt_collection_name_untranslated(const dt_collection_properties_t pro
return N_("rating");
case DT_COLLECTION_PROP_TEXTSEARCH:
return N_("search");
case DT_COLLECTION_PROP_LAST: return NULL;
case DT_COLLECTION_PROP_WHITEBALANCE:
return N_("white balance");
case DT_COLLECTION_PROP_FLASH:
return N_("flash");
case DT_COLLECTION_PROP_EXPOSURE_PROGRAM:
return N_("exposure program");
case DT_COLLECTION_PROP_METERING_MODE:
return N_("metering mode");
case DT_COLLECTION_PROP_LAST:
return NULL;
default:
{
if(prop >= DT_COLLECTION_PROP_METADATA
Expand Down Expand Up @@ -1637,6 +1646,111 @@ static gchar *get_query_string(const dt_collection_properties_t property, const
query = dt_util_dstrcat(query, ")");
break;

case DT_COLLECTION_PROP_WHITEBALANCE: // white balance
query = g_strdup("(");
// handle the possibility of multiple values
elems = g_strsplit(escaped_text, ",", -1);
for(int i = 0; i < g_strv_length(elems); i++)
{
if(!g_strcmp0(elems[i], _("unnamed")))
{
query = dt_util_dstrcat
(query,
"%swhitebalance_id IN (SELECT id FROM main.whitebalance WHERE name IS NULL OR TRIM(name)='')",
i>0?" OR ":"");
}
else
{
gchar *whitebalance = _add_wildcards(elems[i]);
query = dt_util_dstrcat(query,
"%swhitebalance_id IN (SELECT id FROM main.whitebalance WHERE name LIKE '%s')",
i>0?" OR ":"", whitebalance);
g_free(whitebalance);
}

}
g_strfreev(elems);
query = dt_util_dstrcat(query, ")");
break;

case DT_COLLECTION_PROP_FLASH: // flash
query = g_strdup("(");
// handle the possibility of multiple values
elems = g_strsplit(escaped_text, ",", -1);
for(int i = 0; i < g_strv_length(elems); i++)
{
if(!g_strcmp0(elems[i], _("unnamed")))
{
query = dt_util_dstrcat
(query,
"%sflash_id IN (SELECT id FROM main.flash WHERE name IS NULL OR TRIM(name)='')",
i>0?" OR ":"");
}
else
{
gchar *flash = _add_wildcards(elems[i]);
query = dt_util_dstrcat(query,
"%sflash_id IN (SELECT id FROM main.flash WHERE name LIKE '%s')",
i>0?" OR ":"", flash);
g_free(flash);
}
}
g_strfreev(elems);
query = dt_util_dstrcat(query, ")");
break;

case DT_COLLECTION_PROP_EXPOSURE_PROGRAM: // exposure program
query = g_strdup("(");
// handle the possibility of multiple values
elems = g_strsplit(escaped_text, ",", -1);
for(int i = 0; i < g_strv_length(elems); i++)
{
if(!g_strcmp0(elems[i], _("unnamed")))
{
query = dt_util_dstrcat
(query,
"%sexposure_program_id IN (SELECT id FROM main.exposure_program WHERE name IS NULL OR TRIM(name)='')",
i>0?" OR ":"");
}
else
{
gchar *exposure_program = _add_wildcards(elems[i]);
query = dt_util_dstrcat(query,
"%sexposure_program_id IN (SELECT id FROM main.exposure_program WHERE name LIKE '%s')",
i>0?" OR ":"", exposure_program);
g_free(exposure_program);
}
}
g_strfreev(elems);
query = dt_util_dstrcat(query, ")");
break;

case DT_COLLECTION_PROP_METERING_MODE: // metering mode
query = g_strdup("(");
// handle the possibility of multiple values
elems = g_strsplit(escaped_text, ",", -1);
for(int i = 0; i < g_strv_length(elems); i++)
{
if(!g_strcmp0(elems[i], _("unnamed")))
{
query = dt_util_dstrcat
(query,
"%smetering_mode_id IN (SELECT id FROM main.metering_mode WHERE name IS NULL OR TRIM(name)='')",
i>0?" OR ":"");
}
else
{
gchar *metering_mode = _add_wildcards(elems[i]);
query = dt_util_dstrcat(query,
"%smetering_mode_id IN (SELECT id FROM main.metering_mode WHERE name LIKE '%s')",
i>0?" OR ":"", metering_mode);
g_free(metering_mode);
}
}
g_strfreev(elems);
query = dt_util_dstrcat(query, ")");
break;

case DT_COLLECTION_PROP_FOCAL_LENGTH: // focal length
{
gchar *operator, *number1, *number2;
Expand Down
9 changes: 7 additions & 2 deletions src/common/collection.h
@@ -1,6 +1,6 @@
/*
This file is part of darktable,
Copyright (C) 2010-2020 darktable developers.
Copyright (C) 2024 darktable developers.
darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -110,7 +110,12 @@ typedef enum dt_collection_properties_t
DT_COLLECTION_PROP_LAST,

DT_COLLECTION_PROP_UNDEF,
DT_COLLECTION_PROP_SORT
DT_COLLECTION_PROP_SORT,

DT_COLLECTION_PROP_WHITEBALANCE,
DT_COLLECTION_PROP_FLASH,
DT_COLLECTION_PROP_EXPOSURE_PROGRAM,
DT_COLLECTION_PROP_METERING_MODE
} dt_collection_properties_t;

typedef enum dt_collection_change_t
Expand Down
58 changes: 57 additions & 1 deletion src/libs/collect.c
@@ -1,6 +1,6 @@
/*
This file is part of darktable,
Copyright (C) 2010-2023 darktable developers.
Copyright (C) 2024 darktable developers.
darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -1947,6 +1947,58 @@ static void _list_view(dt_lib_collect_rule_t *dr)
// clang-format on
break;

case DT_COLLECTION_PROP_WHITEBALANCE: // white balance
// clang-format off
g_snprintf(query, sizeof(query),
"SELECT wb.name AS whitebalance, 1, COUNT(*) AS count"
" FROM main.images AS mi, main.whitebalance AS wb"
" WHERE mi.whitebalance_id = wb.id"
" AND %s"
" GROUP BY LOWER(whitebalance)"
" ORDER BY LOWER(whitebalance) %s", where_ext,
sort_descending ? "DESC" : "ASC");
// clang-format on
break;

case DT_COLLECTION_PROP_FLASH: // white balance
// clang-format off
g_snprintf(query, sizeof(query),
"SELECT fl.name AS flash, 1, COUNT(*) AS count"
" FROM main.images AS mi, main.flash AS fl"
" WHERE mi.flash_id = fl.id"
" AND %s"
" GROUP BY LOWER(flash)"
" ORDER BY LOWER(flash) %s", where_ext,
sort_descending ? "DESC" : "ASC");
// clang-format on
break;

case DT_COLLECTION_PROP_EXPOSURE_PROGRAM: // exposure program
// clang-format off
g_snprintf(query, sizeof(query),
"SELECT ep.name AS exposure_program, 1, COUNT(*) AS count"
" FROM main.images AS mi, main.exposure_program AS ep"
" WHERE mi.exposure_program_id = ep.id"
" AND %s"
" GROUP BY LOWER(exposure_program)"
" ORDER BY LOWER(exposure_program) %s", where_ext,
sort_descending ? "DESC" : "ASC");
// clang-format on
break;

case DT_COLLECTION_PROP_METERING_MODE: // metering mode
// clang-format off
g_snprintf(query, sizeof(query),
"SELECT mm.name AS metering_mode, 1, COUNT(*) AS count"
" FROM main.images AS mi, main.metering_mode AS mm"
" WHERE mi.metering_mode_id = mm.id"
" AND %s"
" GROUP BY LOWER(metering_mode)"
" ORDER BY LOWER(metering_mode) %s", where_ext,
sort_descending ? "DESC" : "ASC");
// clang-format on
break;

case DT_COLLECTION_PROP_FOCAL_LENGTH: // focal length
// clang-format off
g_snprintf(query, sizeof(query),
Expand Down Expand Up @@ -3249,6 +3301,10 @@ static void _populate_collect_combo(GtkWidget *w)
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_FOCAL_LENGTH);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_ISO);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_ASPECT_RATIO);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_WHITEBALANCE);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_FLASH);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_EXPOSURE_PROGRAM);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_METERING_MODE);

dt_bauhaus_combobox_add_section(w, _("darktable"));
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_GROUPING);
Expand Down
21 changes: 19 additions & 2 deletions src/libs/filtering.c
@@ -1,6 +1,6 @@
/*
This file is part of darktable,
Copyright (C) 2022-2023 darktable developers.
Copyright (C) 2024 darktable developers.
darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -225,6 +225,7 @@ typedef struct _filter_t
#include "libs/filters/iso.c"
#include "libs/filters/lens.c"
#include "libs/filters/local_copy.c"
#include "libs/filters/misc.c"
#include "libs/filters/module_order.c"
#include "libs/filters/rating.c"
#include "libs/filters/rating_range.c"
Expand Down Expand Up @@ -252,7 +253,11 @@ static _filter_t filters[]
{ DT_COLLECTION_PROP_ORDER, _module_order_widget_init, _module_order_update },
{ DT_COLLECTION_PROP_RATING, _rating_widget_init, _rating_update },
{ DT_COLLECTION_PROP_LENS, _lens_widget_init, _lens_update },
{ DT_COLLECTION_PROP_CAMERA, _camera_widget_init, _camera_update } };
{ DT_COLLECTION_PROP_CAMERA, _camera_widget_init, _camera_update },
{ DT_COLLECTION_PROP_WHITEBALANCE, _misc_widget_init, _misc_update },
{ DT_COLLECTION_PROP_FLASH, _misc_widget_init, _misc_update },
{ DT_COLLECTION_PROP_EXPOSURE_PROGRAM, _misc_widget_init, _misc_update },
{ DT_COLLECTION_PROP_METERING_MODE, _misc_widget_init, _misc_update } };

static _filter_t *_filters_get(const dt_collection_properties_t prop)
{
Expand Down Expand Up @@ -922,6 +927,10 @@ static gboolean _rule_show_popup(GtkWidget *widget, dt_lib_filtering_rule_t *rul
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_FOCAL_LENGTH);
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_ISO);
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_ASPECT_RATIO);
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_WHITEBALANCE);
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_FLASH);
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_EXPOSURE_PROGRAM);
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_METERING_MODE);

_popup_add_item(spop, _("darktable"), 0, TRUE, NULL, NULL, self, 0.0);
ADD_COLLECT_ENTRY(spop, DT_COLLECTION_PROP_GROUPING);
Expand Down Expand Up @@ -989,6 +998,10 @@ static void _populate_rules_combo(GtkWidget *w)
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_FOCAL_LENGTH);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_ISO);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_ASPECT_RATIO);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_WHITEBALANCE);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_FLASH);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_EXPOSURE_PROGRAM);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_METERING_MODE);

dt_bauhaus_combobox_add_section(w, _("darktable"));
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_GROUPING);
Expand Down Expand Up @@ -1658,6 +1671,10 @@ static void _topbar_populate_rules_combo(GtkWidget *w, dt_lib_filtering_t *d)
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_FOCAL_LENGTH);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_ISO);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_ASPECT_RATIO);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_WHITEBALANCE);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_FLASH);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_EXPOSURE_PROGRAM);
ADD_COLLECT_ENTRY(DT_COLLECTION_PROP_METERING_MODE);
// if we have not added any entry, remove the section
if(nb == dt_bauhaus_combobox_length(w)) dt_bauhaus_combobox_remove_at(w, nb - 1);

Expand Down

0 comments on commit 357bdc3

Please sign in to comment.