summaryrefslogtreecommitdiffstats
path: root/xbmc/utils/SortUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/utils/SortUtils.h')
-rw-r--r--xbmc/utils/SortUtils.h224
1 files changed, 224 insertions, 0 deletions
diff --git a/xbmc/utils/SortUtils.h b/xbmc/utils/SortUtils.h
new file mode 100644
index 0000000..79629d4
--- /dev/null
+++ b/xbmc/utils/SortUtils.h
@@ -0,0 +1,224 @@
1/*
2 * Copyright (C) 2012-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#pragma once
10
11#include "DatabaseUtils.h"
12#include "LabelFormatter.h"
13#include "SortFileItem.h"
14
15#include <map>
16#include <memory>
17#include <string>
18#include <vector>
19
20typedef enum {
21 SortOrderNone = 0,
22 SortOrderAscending,
23 SortOrderDescending
24} SortOrder;
25
26typedef enum {
27 SortAttributeNone = 0x0,
28 SortAttributeIgnoreArticle = 0x1,
29 SortAttributeIgnoreFolders = 0x2,
30 SortAttributeUseArtistSortName = 0x4,
31 SortAttributeIgnoreLabel = 0x8
32} SortAttribute;
33
34typedef enum {
35 SortSpecialNone = 0,
36 SortSpecialOnTop = 1,
37 SortSpecialOnBottom = 2
38} SortSpecial;
39
40///
41/// \defgroup List_of_sort_methods List of sort methods
42/// \addtogroup List_of_sort_methods
43///
44/// \brief These ID's can be used with the \ref built_in_functions_6 "Container.SetSortMethod(id)" function
45/// \note The on field named part with <b>String</b> shows the string used on
46/// GUI to set this sort type.
47///
48///@{
49typedef enum {
50 /// __0__ :
51 SortByNone = 0,
52 /// __1__ : Sort by Name <em>(String: <b><c>Label</c></b>)</em>
53 SortByLabel,
54 /// __2__ : Sort by Date <em>(String: <b><c>Date</c></b>)</em>
55 SortByDate,
56 /// __3__ : Sort by Size <em>(String: <b><c>Size</c></b>)</em>
57 SortBySize,
58 /// __4__ : Sort by filename <em>(String: <b><c>File</c></b>)</em>
59 SortByFile,
60 /// __5__ : Sort by path <em>(String: <b><c>Path</c></b>)</em>
61 SortByPath,
62 /// __6__ : Sort by drive type <em>(String: <b><c>DriveType</c></b>)</em>
63 SortByDriveType,
64 /// __7__ : Sort by title <em>(String: <b><c>Title</c></b>)</em>
65 SortByTitle,
66 /// __8__ : Sort by track number <em>(String: <b><c>TrackNumber</c></b>)</em>
67 SortByTrackNumber,
68 /// __9__ : Sort by time <em>(String: <b><c>Time</c></b>)</em>
69 SortByTime,
70 /// __10__ : Sort by artist <em>(String: <b><c>Artist</c></b>)</em>
71 SortByArtist,
72 /// __11__ : Sort by first artist then year <em>(String: <b><c>ArtistYear</c></b>)</em>
73 SortByArtistThenYear,
74 /// __12__ : Sort by album <em>(String: <b><c>Album</c></b>)</em>
75 SortByAlbum,
76 /// __13__ : Sort by album type <em>(String: <b><c>AlbumType</c></b>)</em>
77 SortByAlbumType,
78 /// __14__ : Sort by genre <em>(String: <b><c>Genre</c></b>)</em>
79 SortByGenre,
80 /// __15__ : Sort by country <em>(String: <b><c>Country</c></b>)</em>
81 SortByCountry,
82 /// __16__ : Sort by year <em>(String: <b><c>Year</c></b>)</em>
83 SortByYear,
84 /// __17__ : Sort by rating <em>(String: <b><c>Rating</c></b>)</em>
85 SortByRating,
86 /// __18__ : Sort by user rating <em>(String: <b><c>UserRating</c></b>)</em>
87 SortByUserRating,
88 /// __19__ : Sort by votes <em>(String: <b><c>Votes</c></b>)</em>
89 SortByVotes,
90 /// __20__ : Sort by top 250 <em>(String: <b><c>Top250</c></b>)</em>
91 SortByTop250,
92 /// __21__ : Sort by program count <em>(String: <b><c>ProgramCount</c></b>)</em>
93 SortByProgramCount,
94 /// __22__ : Sort by playlist order <em>(String: <b><c>Playlist</c></b>)</em>
95 SortByPlaylistOrder,
96 /// __23__ : Sort by episode number <em>(String: <b><c>Episode</c></b>)</em>
97 SortByEpisodeNumber,
98 /// __24__ : Sort by season <em>(String: <b><c>Season</c></b>)</em>
99 SortBySeason,
100 /// __25__ : Sort by number of episodes <em>(String: <b><c>TotalEpisodes</c></b>)</em>
101 SortByNumberOfEpisodes,
102 /// __26__ : Sort by number of watched episodes <em>(String: <b><c>WatchedEpisodes</c></b>)</em>
103 SortByNumberOfWatchedEpisodes,
104 /// __27__ : Sort by TV show status <em>(String: <b><c>TvShowStatus</c></b>)</em>
105 SortByTvShowStatus,
106 /// __28__ : Sort by TV show title <em>(String: <b><c>TvShowTitle</c></b>)</em>
107 SortByTvShowTitle,
108 /// __29__ : Sort by sort title <em>(String: <b><c>SortTitle</c></b>)</em>
109 SortBySortTitle,
110 /// __30__ : Sort by production code <em>(String: <b><c>ProductionCode</c></b>)</em>
111 SortByProductionCode,
112 /// __31__ : Sort by MPAA <em>(String: <b><c>MPAA</c></b>)</em>
113 SortByMPAA,
114 /// __32__ : Sort by video resolution <em>(String: <b><c>VideoResolution</c></b>)</em>
115 SortByVideoResolution,
116 /// __33__ : Sort by video codec <em>(String: <b><c>VideoCodec</c></b>)</em>
117 SortByVideoCodec,
118 /// __34__ : Sort by video aspect ratio <em>(String: <b><c>VideoAspectRatio</c></b>)</em>
119 SortByVideoAspectRatio,
120 /// __35__ : Sort by audio channels <em>(String: <b><c>AudioChannels</c></b>)</em>
121 SortByAudioChannels,
122 /// __36__ : Sort by audio codec <em>(String: <b><c>AudioCodec</c></b>)</em>
123 SortByAudioCodec,
124 /// __37__ : Sort by audio language <em>(String: <b><c>AudioLanguage</c></b>)</em>
125 SortByAudioLanguage,
126 /// __38__ : Sort by subtitle language <em>(String: <b><c>SubtitleLanguage</c></b>)</em>
127 SortBySubtitleLanguage,
128 /// __39__ : Sort by studio <em>(String: <b><c>Studio</c></b>)</em>
129 SortByStudio,
130 /// __40__ : Sort by date added <em>(String: <b><c>DateAdded</c></b>)</em>
131 SortByDateAdded,
132 /// __41__ : Sort by last played <em>(String: <b><c>LastPlayed</c></b>)</em>
133 SortByLastPlayed,
134 /// __42__ : Sort by playcount <em>(String: <b><c>PlayCount</c></b>)</em>
135 SortByPlaycount,
136 /// __43__ : Sort by listener <em>(String: <b><c>Listeners</c></b>)</em>
137 SortByListeners,
138 /// __44__ : Sort by bitrate <em>(String: <b><c>Bitrate</c></b>)</em>
139 SortByBitrate,
140 /// __45__ : Sort by random <em>(String: <b><c>Random</c></b>)</em>
141 SortByRandom,
142 /// __46__ : Sort by channel <em>(String: <b><c>Channel</c></b>)</em>
143 SortByChannel,
144 /// __47__ : Sort by channel number <em>(String: <b><c>ChannelNumber</c></b>)</em>
145 SortByChannelNumber,
146 /// __48__ : Sort by date taken <em>(String: <b><c>DateTaken</c></b>)</em>
147 SortByDateTaken,
148 /// __49__ : Sort by relevance
149 SortByRelevance,
150 /// __50__ : Sort by installation date <en>(String: <b><c>installdate</c></b>)</em>
151 SortByInstallDate,
152 /// __51__ : Sort by last updated <en>(String: <b><c>lastupdated</c></b>)</em>
153 SortByLastUpdated,
154 /// __52__ : Sort by last used <em>(String: <b><c>lastused</c></b>)</em>
155 SortByLastUsed,
156 /// __53__ : Sort by client channel order <em>(String: <b><c>ClientChannelOrder</c></b>)</em>
157 SortByClientChannelOrder,
158 /// __54__ : Sort by total number of discs <em>(String: <b><c>totaldiscs</c></b>)</em>
159 SortByTotalDiscs,
160 /// __55__ : Sort by original release date <em>(String: <b><c>Originaldate</c></b>)</em>
161 SortByOrigDate,
162 /// __56__ : Sort by BPM <em>(String: <b><c>bpm</c></b>)</em>
163 SortByBPM,
164} SortBy;
165///@}
166
167typedef struct SortDescription {
168 SortBy sortBy = SortByNone;
169 SortOrder sortOrder = SortOrderAscending;
170 SortAttribute sortAttributes = SortAttributeNone;
171 int limitStart = 0;
172 int limitEnd = -1;
173} SortDescription;
174
175typedef struct GUIViewSortDetails
176{
177 SortDescription m_sortDescription;
178 int m_buttonLabel;
179 LABEL_MASKS m_labelMasks;
180} GUIViewSortDetails;
181
182typedef DatabaseResult SortItem;
183typedef std::shared_ptr<SortItem> SortItemPtr;
184typedef std::vector<SortItemPtr> SortItems;
185
186class SortUtils
187{
188public:
189 static SORT_METHOD TranslateOldSortMethod(SortBy sortBy, bool ignoreArticle);
190 static SortDescription TranslateOldSortMethod(SORT_METHOD sortBy);
191
192 static SortBy SortMethodFromString(const std::string& sortMethod);
193 static const std::string& SortMethodToString(SortBy sortMethod);
194 static SortOrder SortOrderFromString(const std::string& sortOrder);
195 static const std::string& SortOrderToString(SortOrder sortOrder);
196
197 /*! \brief retrieve the label id associated with a sort method for displaying in the UI.
198 \param sortBy the sort method in question.
199 \return the label id of the sort method.
200 */
201 static int GetSortLabel(SortBy sortBy);
202
203 static void Sort(SortBy sortBy, SortOrder sortOrder, SortAttribute attributes, DatabaseResults& items, int limitEnd = -1, int limitStart = 0);
204 static void Sort(SortBy sortBy, SortOrder sortOrder, SortAttribute attributes, SortItems& items, int limitEnd = -1, int limitStart = 0);
205 static void Sort(const SortDescription &sortDescription, DatabaseResults& items);
206 static void Sort(const SortDescription &sortDescription, SortItems& items);
207 static bool SortFromDataset(const SortDescription &sortDescription, const MediaType &mediaType, const std::unique_ptr<dbiplus::Dataset> &dataset, DatabaseResults &results);
208
209 static void GetFieldsForSQLSort(const MediaType& mediaType, SortBy sortMethod, FieldList& fields);
210 static const Fields& GetFieldsForSorting(SortBy sortBy);
211 static std::string RemoveArticles(const std::string &label);
212
213 typedef std::string (*SortPreparator) (SortAttribute, const SortItem&);
214 typedef bool (*Sorter) (const DatabaseResult &, const DatabaseResult &);
215 typedef bool (*SorterIndirect) (const SortItemPtr &, const SortItemPtr &);
216
217private:
218 static const SortPreparator& getPreparator(SortBy sortBy);
219 static Sorter getSorter(SortOrder sortOrder, SortAttribute attributes);
220 static SorterIndirect getSorterIndirect(SortOrder sortOrder, SortAttribute attributes);
221
222 static std::map<SortBy, SortPreparator> m_preparators;
223 static std::map<SortBy, Fields> m_sortingFields;
224};