From 66bbab9ae2d9f9cdd1dceeef53710eda0957c1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 16 May 2018 19:53:10 +0200 Subject: [PATCH 1/3] Sort file numbers naturally (#2467) --- rtgui/thumbbrowserentrybase.cc | 149 ++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 1 deletion(-) diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index 2fff95904..bc9506e3f 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -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), From 70eefd049b4eb5a50907de65a02f345472583d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Wed, 16 May 2018 20:09:39 +0200 Subject: [PATCH 2/3] Tidy negative number parsing relict --- rtgui/thumbbrowserentrybase.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index bc9506e3f..dbab6837b 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -34,7 +34,7 @@ Glib::ustring getPaddedName(const Glib::ustring& name) FRACTION }; - constexpr unsigned int pad_width = 17; // Must be at least 1 + constexpr unsigned int pad_width = 16; Glib::ustring res; From 579aae510c8c112f7f40ba525d6f89b9717627ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Fri, 18 May 2018 20:00:40 +0200 Subject: [PATCH 3/3] Consider integers only (#2467) --- rtgui/thumbbrowserentrybase.cc | 56 ++-------------------------------- 1 file changed, 3 insertions(+), 53 deletions(-) diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index dbab6837b..34557ccc4 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -30,8 +30,7 @@ Glib::ustring getPaddedName(const Glib::ustring& name) { enum class State { OTHER, - NUMBER, - FRACTION + NUMBER }; constexpr unsigned int pad_width = 16; @@ -56,13 +55,8 @@ Glib::ustring getPaddedName(const Glib::ustring& name) case '8': case '9': { number += c; - state = State::NUMBER; - break; - } - case '.': { - res += c; - state = State::FRACTION; + state = State::NUMBER; break; } @@ -98,43 +92,7 @@ Glib::ustring getPaddedName(const Glib::ustring& name) 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; - } + state = State::OTHER; break; } } @@ -155,14 +113,6 @@ Glib::ustring getPaddedName(const Glib::ustring& name) 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;