@@ -289,6 +289,64 @@ void *legacy_params(struct dt_lib_module_t *self,
289289
290290 return (void * )new ;
291291 }
292+ else if (old_version == 3 )
293+ {
294+ /* from v3 to v4 we have added 1 new timestamp filter */
295+ dt_lib_collect_params_t * old = (dt_lib_collect_params_t * )old_params ;
296+
297+ if (old -> rules > MAX_RULES )
298+ /* preset is corrupted, return NULL and drop the preset */
299+ return NULL ;
300+
301+ dt_lib_collect_params_t * new = malloc (old_params_size );
302+
303+ const int table [DT_COLLECTION_PROP_LAST ] =
304+ {
305+ DT_COLLECTION_PROP_FILMROLL ,
306+ DT_COLLECTION_PROP_FOLDERS ,
307+ DT_COLLECTION_PROP_FILENAME ,
308+ DT_COLLECTION_PROP_CAMERA ,
309+ DT_COLLECTION_PROP_LENS ,
310+ DT_COLLECTION_PROP_APERTURE ,
311+ DT_COLLECTION_PROP_EXPOSURE ,
312+ DT_COLLECTION_PROP_FOCAL_LENGTH ,
313+ DT_COLLECTION_PROP_ISO ,
314+ DT_COLLECTION_PROP_DAY ,
315+ DT_COLLECTION_PROP_MONTH ,
316+ DT_COLLECTION_PROP_TIME ,
317+ DT_COLLECTION_PROP_GEOTAGGING ,
318+ DT_COLLECTION_PROP_ASPECT_RATIO ,
319+ DT_COLLECTION_PROP_TAG ,
320+ DT_COLLECTION_PROP_COLORLABEL ,
321+
322+ // spaces for the metadata, see metadata.h
323+ DT_COLLECTION_PROP_COLORLABEL + 1 ,
324+ DT_COLLECTION_PROP_COLORLABEL + 2 ,
325+ DT_COLLECTION_PROP_COLORLABEL + 3 ,
326+ DT_COLLECTION_PROP_COLORLABEL + 4 ,
327+ DT_COLLECTION_PROP_COLORLABEL + 5 ,
328+
329+ DT_COLLECTION_PROP_GROUPING ,
330+ DT_COLLECTION_PROP_LOCAL_COPY ,
331+ DT_COLLECTION_PROP_HISTORY ,
332+ DT_COLLECTION_PROP_MODULE ,
333+ DT_COLLECTION_PROP_ORDER
334+ };
335+
336+ new -> rules = old -> rules ;
337+
338+ for (int r = 0 ; r < old -> rules ; r ++ )
339+ {
340+ new -> rule [r ].item = table [old -> rule [r ].item ];
341+ new -> rule [r ].mode = old -> rule [r ].mode ;
342+ memcpy (new -> rule [r ].string , old -> rule [r ].string , PARAM_STRING_SIZE );
343+ }
344+
345+ * new_size = old_params_size ;
346+ * new_version = 4 ;
347+
348+ return (void * )new ;
349+ }
292350
293351 return NULL ;
294352}
@@ -627,7 +685,9 @@ static gboolean view_onButtonPressed(GtkWidget *treeview,
627685 GtkTreeSelection * selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview ));
628686 if (get_path && dt_modifier_is (event -> state , GDK_SHIFT_MASK )
629687 && gtk_tree_selection_count_selected_rows (selection ) > 0
630- && (d -> view_rule == DT_COLLECTION_PROP_DAY || _is_time_property (d -> view_rule )
688+ && (d -> view_rule == DT_COLLECTION_PROP_DAY
689+ || d -> view_rule == DT_COLLECTION_PROP_MONTH
690+ || _is_time_property (d -> view_rule )
631691 || d -> view_rule == DT_COLLECTION_PROP_APERTURE
632692 || d -> view_rule == DT_COLLECTION_PROP_FOCAL_LENGTH
633693 || d -> view_rule == DT_COLLECTION_PROP_ISO
@@ -1364,6 +1424,7 @@ static void _tree_view(dt_lib_collect_rule_t *dr)
13641424 format_separator = "%s|" ;
13651425 break ;
13661426 case DT_COLLECTION_PROP_DAY :
1427+ case DT_COLLECTION_PROP_MONTH :
13671428 case DT_COLLECTION_PROP_TIME :
13681429 case DT_COLLECTION_PROP_IMPORT_TIMESTAMP :
13691430 case DT_COLLECTION_PROP_CHANGE_TIMESTAMP :
@@ -1502,6 +1563,20 @@ static void _tree_view(dt_lib_collect_rule_t *dr)
15021563 // clang-format on
15031564 break ;
15041565
1566+ case DT_COLLECTION_PROP_MONTH :
1567+ // clang-format off
1568+ query = g_strdup_printf
1569+ ("SELECT CAST(strftime('%%m', datetime_taken / 86400000000.0"
1570+ " + julianday('0001-01-01')) AS INTEGER) AS month_num,"
1571+ " 1, COUNT(*) AS count"
1572+ " FROM main.images AS mi"
1573+ " WHERE datetime_taken IS NOT NULL AND datetime_taken <> 0"
1574+ " AND %s"
1575+ " GROUP BY month_num"
1576+ " ORDER BY month_num" , where_ext );
1577+ // clang-format on
1578+ break ;
1579+
15051580 case DT_COLLECTION_PROP_TIME :
15061581 case DT_COLLECTION_PROP_IMPORT_TIMESTAMP :
15071582 case DT_COLLECTION_PROP_CHANGE_TIMESTAMP :
@@ -1563,6 +1638,18 @@ static void _tree_view(dt_lib_collect_rule_t *dr)
15631638 sdt [10 ] = '\0' ;
15641639 name = g_strdup (sdt );
15651640 }
1641+ else if (property == DT_COLLECTION_PROP_MONTH )
1642+ {
1643+ const int month_num = sqlite3_column_int (stmt , 0 );
1644+ const char * month_names [] = { N_ ("January" ), N_ ("February" ), N_ ("March" ),
1645+ N_ ("April" ), N_ ("May" ), N_ ("June" ),
1646+ N_ ("July" ), N_ ("August" ), N_ ("September" ),
1647+ N_ ("October" ), N_ ("November" ), N_ ("December" ) };
1648+ if (month_num >= 1 && month_num <= 12 )
1649+ name = g_strdup_printf ("%02d - %s" , month_num , _ (month_names [month_num - 1 ]));
1650+ else
1651+ name = g_strdup (_ ("unknown" ));
1652+ }
15661653 else
15671654 {
15681655 const char * sqlite_name = (const char * )sqlite3_column_text (stmt , 0 );
@@ -2192,6 +2279,22 @@ static void _list_view(dt_lib_collect_rule_t *dr)
21922279 }
21932280 break ;
21942281
2282+ case DT_COLLECTION_PROP_MONTH : // capture month
2283+ // clang-format off
2284+ g_snprintf (query , sizeof (query ),
2285+ "SELECT CAST(strftime('%%m', datetime_taken / 86400000000.0"
2286+ " + julianday('0001-01-01')) AS INTEGER) AS month_num,"
2287+ " 1, COUNT(*) AS count"
2288+ " FROM main.images AS mi"
2289+ " WHERE datetime_taken IS NOT NULL AND datetime_taken <> 0"
2290+ " AND %s"
2291+ " GROUP BY month_num"
2292+ " ORDER BY month_num %s" ,
2293+ where_ext ,
2294+ sort_descending ? "DESC" : "ASC" );
2295+ // clang-format on
2296+ break ;
2297+
21952298 default :
21962299 if (property >= DT_COLLECTION_PROP_METADATA_OFFSET )
21972300 {
@@ -2304,6 +2407,18 @@ static void _list_view(dt_lib_collect_rule_t *dr)
23042407 break ;
23052408 }
23062409 }
2410+ else if (property == DT_COLLECTION_PROP_MONTH )
2411+ {
2412+ const int month_num = sqlite3_column_int (stmt , 0 );
2413+ const char * month_names [] = { N_ ("January" ), N_ ("February" ), N_ ("March" ),
2414+ N_ ("April" ), N_ ("May" ), N_ ("June" ),
2415+ N_ ("July" ), N_ ("August" ), N_ ("September" ),
2416+ N_ ("October" ), N_ ("November" ), N_ ("December" ) };
2417+ if (month_num >= 1 && month_num <= 12 )
2418+ folder = _ (month_names [month_num - 1 ]);
2419+ else
2420+ folder = _ ("unknown" );
2421+ }
23072422
23082423 // check if name is empty string
23092424
@@ -3343,6 +3458,7 @@ static void _populate_collect_combo(GtkWidget *w)
33433458
33443459 dt_bauhaus_combobox_add_section (w , _ ("times" ));
33453460 ADD_COLLECT_ENTRY (DT_COLLECTION_PROP_DAY );
3461+ ADD_COLLECT_ENTRY (DT_COLLECTION_PROP_MONTH );
33463462 ADD_COLLECT_ENTRY (DT_COLLECTION_PROP_TIME );
33473463 ADD_COLLECT_ENTRY (DT_COLLECTION_PROP_IMPORT_TIMESTAMP );
33483464 ADD_COLLECT_ENTRY (DT_COLLECTION_PROP_CHANGE_TIMESTAMP );
0 commit comments