mirror of https://github.com/OpenTTD/OpenTTD
(svn r24983) -Change: Apply the same name sorting rules to content and NewGRF list as for the server list.
parent
4e61c1770d
commit
3e02890b73
|
@ -323,7 +323,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
|
||||||
/** Sort content by name. */
|
/** Sort content by name. */
|
||||||
static int CDECL NameSorter(const ContentInfo * const *a, const ContentInfo * const *b)
|
static int CDECL NameSorter(const ContentInfo * const *a, const ContentInfo * const *b)
|
||||||
{
|
{
|
||||||
return strnatcmp((*a)->name, (*b)->name); // Sort by name (natural sorting).
|
return strnatcmp((*a)->name, (*b)->name, true); // Sort by name (natural sorting).
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sort content by type. */
|
/** Sort content by type. */
|
||||||
|
|
|
@ -263,24 +263,10 @@ protected:
|
||||||
this->UpdateListPos();
|
this->UpdateListPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Skip some of the 'garbage' in the string that we don't want to use
|
|
||||||
* to sort on. This way the alphabetical sorting will work better as
|
|
||||||
* we would be actually using those characters instead of some other
|
|
||||||
* characters such as spaces and tildes at the begin of the name.
|
|
||||||
* @param str The string to skip the initial garbage of.
|
|
||||||
* @return The string with the garbage skipped.
|
|
||||||
*/
|
|
||||||
static const char *SkipGarbage(const char *str)
|
|
||||||
{
|
|
||||||
while (*str != '\0' && (*str < 'A' || IsInsideMM(*str, '[', '`' + 1) || IsInsideMM(*str, '{', '~' + 1))) str++;
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sort servers by name. */
|
/** Sort servers by name. */
|
||||||
static int CDECL NGameNameSorter(NetworkGameList * const *a, NetworkGameList * const *b)
|
static int CDECL NGameNameSorter(NetworkGameList * const *a, NetworkGameList * const *b)
|
||||||
{
|
{
|
||||||
int r = strnatcmp(SkipGarbage((*a)->info.server_name), SkipGarbage((*b)->info.server_name)); // Sort by name (natural sorting).
|
int r = strnatcmp((*a)->info.server_name, (*b)->info.server_name, true); // Sort by name (natural sorting).
|
||||||
return r == 0 ? (*a)->address.CompareTo((*b)->address) : r;
|
return r == 0 ? (*a)->address.CompareTo((*b)->address) : r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1368,7 +1368,7 @@ private:
|
||||||
/** Sort grfs by name. */
|
/** Sort grfs by name. */
|
||||||
static int CDECL NameSorter(const GRFConfig * const *a, const GRFConfig * const *b)
|
static int CDECL NameSorter(const GRFConfig * const *a, const GRFConfig * const *b)
|
||||||
{
|
{
|
||||||
int i = strnatcmp((*a)->GetName(), (*b)->GetName()); // Sort by name (natural sorting).
|
int i = strnatcmp((*a)->GetName(), (*b)->GetName(), true); // Sort by name (natural sorting).
|
||||||
if (i != 0) return i;
|
if (i != 0) return i;
|
||||||
|
|
||||||
i = (*a)->version - (*b)->version;
|
i = (*a)->version - (*b)->version;
|
||||||
|
|
|
@ -596,15 +596,34 @@ char *strcasestr(const char *haystack, const char *needle)
|
||||||
}
|
}
|
||||||
#endif /* DEFINE_STRCASESTR */
|
#endif /* DEFINE_STRCASESTR */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skip some of the 'garbage' in the string that we don't want to use
|
||||||
|
* to sort on. This way the alphabetical sorting will work better as
|
||||||
|
* we would be actually using those characters instead of some other
|
||||||
|
* characters such as spaces and tildes at the begin of the name.
|
||||||
|
* @param str The string to skip the initial garbage of.
|
||||||
|
* @return The string with the garbage skipped.
|
||||||
|
*/
|
||||||
|
static const char *SkipGarbage(const char *str)
|
||||||
|
{
|
||||||
|
while (*str != '\0' && (*str < 'A' || IsInsideMM(*str, '[', '`' + 1) || IsInsideMM(*str, '{', '~' + 1))) str++;
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compares two strings using case insensitive natural sort.
|
* Compares two strings using case insensitive natural sort.
|
||||||
*
|
*
|
||||||
* @param s1 First string to compare.
|
* @param s1 First string to compare.
|
||||||
* @param s2 Second string to compare.
|
* @param s2 Second string to compare.
|
||||||
|
* @param ignore_garbage_at_front Skip punctuation characters in the front
|
||||||
* @return Less than zero if s1 < s2, zero if s1 == s2, greater than zero if s1 > s2.
|
* @return Less than zero if s1 < s2, zero if s1 == s2, greater than zero if s1 > s2.
|
||||||
*/
|
*/
|
||||||
int strnatcmp(const char *s1, const char *s2)
|
int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front)
|
||||||
{
|
{
|
||||||
|
if (ignore_garbage_at_front) {
|
||||||
|
s1 = SkipGarbage(s1);
|
||||||
|
s2 = SkipGarbage(s2);
|
||||||
|
}
|
||||||
#ifdef WITH_ICU
|
#ifdef WITH_ICU
|
||||||
if (_current_collator != NULL) {
|
if (_current_collator != NULL) {
|
||||||
UErrorCode status = U_ZERO_ERROR;
|
UErrorCode status = U_ZERO_ERROR;
|
||||||
|
|
|
@ -211,6 +211,6 @@ char *strndup(const char *s, size_t len);
|
||||||
char *strcasestr(const char *haystack, const char *needle);
|
char *strcasestr(const char *haystack, const char *needle);
|
||||||
#endif /* strcasestr is available */
|
#endif /* strcasestr is available */
|
||||||
|
|
||||||
int strnatcmp(const char *s1, const char *s2);
|
int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front = false);
|
||||||
|
|
||||||
#endif /* STRING_FUNC_H */
|
#endif /* STRING_FUNC_H */
|
||||||
|
|
Loading…
Reference in New Issue