Sort file numbers naturally (#2467)

This commit is contained in:
Flössie 2018-05-16 19:53:10 +02:00
parent 17f7a92fbb
commit 66bbab9ae2

View File

@ -23,6 +23,153 @@
#include "../rtengine/mytime.h"
namespace
{
Glib::ustring getPaddedName(const Glib::ustring& name)
{
enum class State {
OTHER,
NUMBER,
FRACTION
};
constexpr unsigned int pad_width = 17; // Must be at least 1
Glib::ustring res;
State state = State::OTHER;
Glib::ustring number;
for (auto c : name) {
switch (state) {
case State::OTHER: {
switch (c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': {
number += c;
state = State::NUMBER;
break;
}
case '.': {
res += c;
state = State::FRACTION;
break;
}
default: {
res += c;
break;
}
}
break;
}
case State::NUMBER: {
switch (c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': {
number += c;
break;
}
default: {
if (number.size() < pad_width) {
res.append(pad_width - number.size(), '0');
}
res += number;
res += c;
number.clear();
state =
c == '.'
? State::FRACTION
: State::OTHER;
break;
}
}
break;
}
case State::FRACTION: {
switch (c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': {
number += c;
break;
}
default: {
res += number;
if (!number.empty() && number.size() < pad_width) {
res.append(pad_width - number.size(), '0');
}
res += c;
number.clear();
if (c != '.') {
state = State::OTHER;
}
break;
}
}
break;
}
}
}
switch (state) {
case State::OTHER: {
break;
}
case State::NUMBER: {
if (number.size() < pad_width) {
res.append(pad_width - number.size(), '0');
}
res += number;
break;
}
case State::FRACTION: {
res += number;
if (!number.empty() && number.size() < pad_width) {
res.append(pad_width - number.size(), '0');
}
break;
}
}
return res;
}
}
ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) :
fnlabw(0),
fnlabh(0),
@ -57,7 +204,7 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) :
bbFramed(false),
bbPreview(nullptr),
cursor_type(CSUndefined),
collate_name(dispname.casefold().collate_key()),
collate_name(getPaddedName(dispname).casefold_collate_key()),
thumbnail(nullptr),
filename(fname),
shortname(dispname),