Sort file numbers naturally (#2467)
This commit is contained in:
parent
17f7a92fbb
commit
66bbab9ae2
@ -23,6 +23,153 @@
|
|||||||
|
|
||||||
#include "../rtengine/mytime.h"
|
#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) :
|
ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) :
|
||||||
fnlabw(0),
|
fnlabw(0),
|
||||||
fnlabh(0),
|
fnlabh(0),
|
||||||
@ -57,7 +204,7 @@ ThumbBrowserEntryBase::ThumbBrowserEntryBase (const Glib::ustring& fname) :
|
|||||||
bbFramed(false),
|
bbFramed(false),
|
||||||
bbPreview(nullptr),
|
bbPreview(nullptr),
|
||||||
cursor_type(CSUndefined),
|
cursor_type(CSUndefined),
|
||||||
collate_name(dispname.casefold().collate_key()),
|
collate_name(getPaddedName(dispname).casefold_collate_key()),
|
||||||
thumbnail(nullptr),
|
thumbnail(nullptr),
|
||||||
filename(fname),
|
filename(fname),
|
||||||
shortname(dispname),
|
shortname(dispname),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user