diff --git a/src/tagstudio/core/library/alchemy/enums.py b/src/tagstudio/core/library/alchemy/enums.py index f1d3106c3..09e679bd2 100644 --- a/src/tagstudio/core/library/alchemy/enums.py +++ b/src/tagstudio/core/library/alchemy/enums.py @@ -1,4 +1,5 @@ import enum +import random from dataclasses import dataclass, replace from pathlib import Path @@ -69,6 +70,7 @@ class SortingModeEnum(enum.Enum): DATE_ADDED = "file.date_added" FILE_NAME = "generic.filename" PATH = "file.path" + RANDOM = "sorting.mode.random" @dataclass @@ -78,6 +80,7 @@ class BrowsingState: page_index: int = 0 sorting_mode: SortingModeEnum = SortingModeEnum.DATE_ADDED ascending: bool = True + random_seed: float = 0 query: str | None = None @@ -120,7 +123,10 @@ def with_page_index(self, index: int) -> "BrowsingState": return replace(self, page_index=index) def with_sorting_mode(self, mode: SortingModeEnum) -> "BrowsingState": - return replace(self, sorting_mode=mode) + seed = self.random_seed + if mode == SortingModeEnum.RANDOM: + seed = random.random() + return replace(self, sorting_mode=mode, random_seed=seed) def with_sorting_direction(self, ascending: bool) -> "BrowsingState": return replace(self, ascending=ascending) diff --git a/src/tagstudio/core/library/alchemy/library.py b/src/tagstudio/core/library/alchemy/library.py index fe5bc341e..b0d0a8cf5 100644 --- a/src/tagstudio/core/library/alchemy/library.py +++ b/src/tagstudio/core/library/alchemy/library.py @@ -913,6 +913,8 @@ def search_library( sort_on = func.lower(Entry.filename) case SortingModeEnum.PATH: sort_on = func.lower(Entry.path) + case SortingModeEnum.RANDOM: + sort_on = func.sin(Entry.id * search.random_seed) statement = statement.order_by(asc(sort_on) if search.ascending else desc(sort_on)) if page_size is not None: diff --git a/src/tagstudio/resources/translations/en.json b/src/tagstudio/resources/translations/en.json index 6f29bd9f2..26af8987b 100644 --- a/src/tagstudio/resources/translations/en.json +++ b/src/tagstudio/resources/translations/en.json @@ -262,6 +262,7 @@ "settings.title": "Settings", "sorting.direction.ascending": "Ascending", "sorting.direction.descending": "Descending", + "sorting.mode.random": "Random", "splash.opening_library": "Opening Library \"{library_path}\"...", "status.deleted_file_plural": "Deleted {count} files!", "status.deleted_file_singular": "Deleted 1 file!",