Track: Move less_than() function into the queue code
The track provides ways of accessing these fields, but I want the queue to decide how to sort. Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
parent
b5a529795d
commit
50a627412f
|
@ -61,6 +61,37 @@ bool Queue :: has_flag(queue_flags f)
|
||||||
return (_flags & f) == (unsigned int)f;
|
return (_flags & f) == (unsigned int)f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns:
|
||||||
|
* 0: lhs == rhs
|
||||||
|
* < 0: lhs < rhs, or rhs is empty
|
||||||
|
* > 0: lhs > rhs, or lhs is empty
|
||||||
|
*/
|
||||||
|
static inline int track_compare(Track *lhs, Track *rhs, sort_t field)
|
||||||
|
{
|
||||||
|
switch (field) {
|
||||||
|
case SORT_ARTIST:
|
||||||
|
return lhs->artist()->compare(rhs->artist());
|
||||||
|
case SORT_ALBUM:
|
||||||
|
return lhs->album()->compare(rhs->album());
|
||||||
|
case SORT_COUNT:
|
||||||
|
return lhs->count() - rhs->count();
|
||||||
|
case SORT_GENRE:
|
||||||
|
return lhs->genre()->compare(rhs->genre());
|
||||||
|
case SORT_LENGTH:
|
||||||
|
return lhs->length() - rhs->length();
|
||||||
|
case SORT_PLAYED:
|
||||||
|
return rhs->compare_date(rhs);
|
||||||
|
case SORT_TITLE:
|
||||||
|
return lhs->compare(rhs);
|
||||||
|
case SORT_TRACK:
|
||||||
|
return lhs->track() - rhs->track();
|
||||||
|
case SORT_YEAR:
|
||||||
|
return lhs->album()->year() - rhs->album()->year();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static bool track_less_than(Track *lhs, Track *rhs,
|
static bool track_less_than(Track *lhs, Track *rhs,
|
||||||
std::vector<struct sort_info> &order)
|
std::vector<struct sort_info> &order)
|
||||||
{
|
{
|
||||||
|
@ -68,9 +99,9 @@ static bool track_less_than(Track *lhs, Track *rhs,
|
||||||
|
|
||||||
for (unsigned int i = 0; i < order.size(); i++) {
|
for (unsigned int i = 0; i < order.size(); i++) {
|
||||||
if (order[i].ascending == true)
|
if (order[i].ascending == true)
|
||||||
res = lhs->less_than(rhs, order[i].field);
|
res = track_compare(lhs, rhs, order[i].field);
|
||||||
else
|
else
|
||||||
res = rhs->less_than(lhs, order[i].field);
|
res = track_compare(rhs, lhs, order[i].field);
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -53,64 +53,6 @@ void Track :: write(File &f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns:
|
|
||||||
* 0: lhs == rhs
|
|
||||||
* < 0: lhs < rhs, or rhs is empty
|
|
||||||
* > 0: lhs > rhs, or lhs is empty
|
|
||||||
*/
|
|
||||||
static inline int compare_string(const std::string &a, const std::string &b)
|
|
||||||
{
|
|
||||||
if (a.size() == 0)
|
|
||||||
return 1;
|
|
||||||
else if (b.size() == 0)
|
|
||||||
return -1;
|
|
||||||
return a.compare(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int compare_uint(unsigned int a, unsigned int b)
|
|
||||||
{
|
|
||||||
if (a == b)
|
|
||||||
return 0;
|
|
||||||
if (a < b)
|
|
||||||
return -1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Track :: less_than(Track *rhs, sort_t field)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
switch (field) {
|
|
||||||
case SORT_ARTIST:
|
|
||||||
return _artist->compare(rhs->artist());
|
|
||||||
case SORT_ALBUM:
|
|
||||||
return _album->compare(rhs->album());
|
|
||||||
case SORT_COUNT:
|
|
||||||
return compare_uint(_count, rhs->_count);
|
|
||||||
case SORT_GENRE:
|
|
||||||
return _genre->compare(rhs->genre());
|
|
||||||
case SORT_LENGTH:
|
|
||||||
return compare_uint(_length, rhs->_length);
|
|
||||||
case SORT_PLAYED:
|
|
||||||
ret = compare_uint(_date.year, rhs->_date.year);
|
|
||||||
if (ret == 0) {
|
|
||||||
ret = compare_uint(_date.month, rhs->_date.month);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = compare_uint(_date.day, rhs->_date.day);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
case SORT_TITLE:
|
|
||||||
return compare(rhs);
|
|
||||||
case SORT_TRACK:
|
|
||||||
return compare_uint(_track, rhs->_track);
|
|
||||||
case SORT_YEAR:
|
|
||||||
return compare_uint(_album->year(), rhs->album()->year());
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Tagdb functions
|
* Tagdb functions
|
||||||
|
|
|
@ -35,6 +35,31 @@ enum queue_flags {
|
||||||
static const unsigned int Q_FLAG_MASK = Q_ENABLED | Q_RANDOM | Q_REPEAT | Q_NO_SORT;
|
static const unsigned int Q_FLAG_MASK = Q_ENABLED | Q_RANDOM | Q_REPEAT | Q_NO_SORT;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Track fields that can be compared.
|
||||||
|
*/
|
||||||
|
enum sort_t {
|
||||||
|
/** Artist name */
|
||||||
|
SORT_ARTIST,
|
||||||
|
/** Album name */
|
||||||
|
SORT_ALBUM,
|
||||||
|
/** Play count */
|
||||||
|
SORT_COUNT,
|
||||||
|
/** Genre */
|
||||||
|
SORT_GENRE,
|
||||||
|
/** Track length */
|
||||||
|
SORT_LENGTH,
|
||||||
|
/** Date the track was last played */
|
||||||
|
SORT_PLAYED,
|
||||||
|
/** Track title */
|
||||||
|
SORT_TITLE,
|
||||||
|
/** Track number */
|
||||||
|
SORT_TRACK,
|
||||||
|
/** Track year */
|
||||||
|
SORT_YEAR,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Struct for passing sort parameters.
|
* Struct for passing sort parameters.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -12,31 +12,6 @@
|
||||||
#include <core/tags/library.h>
|
#include <core/tags/library.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Track fields that can be compared.
|
|
||||||
*/
|
|
||||||
enum sort_t {
|
|
||||||
/** Artist name */
|
|
||||||
SORT_ARTIST,
|
|
||||||
/** Album name */
|
|
||||||
SORT_ALBUM,
|
|
||||||
/** Play count */
|
|
||||||
SORT_COUNT,
|
|
||||||
/** Genre */
|
|
||||||
SORT_GENRE,
|
|
||||||
/** Track length */
|
|
||||||
SORT_LENGTH,
|
|
||||||
/** Date the track was last played */
|
|
||||||
SORT_PLAYED,
|
|
||||||
/** Track title */
|
|
||||||
SORT_TITLE,
|
|
||||||
/** Track number */
|
|
||||||
SORT_TRACK,
|
|
||||||
/** Track year */
|
|
||||||
SORT_YEAR,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/** Structure used to represent dates. */
|
/** Structure used to represent dates. */
|
||||||
struct date {
|
struct date {
|
||||||
unsigned int day; /**< Day of the month (1 - 31). */
|
unsigned int day; /**< Day of the month (1 - 31). */
|
||||||
|
@ -139,16 +114,6 @@ public:
|
||||||
* @param file The file to write to
|
* @param file The file to write to
|
||||||
*/
|
*/
|
||||||
void write(File &);
|
void write(File &);
|
||||||
|
|
||||||
/**
|
|
||||||
* Compare two tracks based on a specific field.
|
|
||||||
* @param rhs The other track to compare.
|
|
||||||
* @param field The field to compare.
|
|
||||||
* @return 0 if lhs == rhs
|
|
||||||
* @return < 0 if lhs < rhs, or rhs is NULL
|
|
||||||
* @return > 0 if lhs > rhs
|
|
||||||
*/
|
|
||||||
int less_than(Track *, sort_t);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* OCARINA_CORE_TAGS_TRACK_H */
|
#endif /* OCARINA_CORE_TAGS_TRACK_H */
|
||||||
|
|
Loading…
Reference in New Issue