From b16c79a5c9f8e403bc4b05559d03649cbca0680d Mon Sep 17 00:00:00 2001 From: Hirako San Date: Tue, 22 Mar 2022 02:29:29 +0700 Subject: [PATCH] [harmony] - Refactors the sorting logic and reuse it for across both dialogs #169 --- src/harmony/app/canvas.cpy | 4 ++-- src/harmony/app/dialogs.cpy | 27 ++------------------------- src/rmkit/util/lsdir.cpy | 28 +++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/harmony/app/canvas.cpy b/src/harmony/app/canvas.cpy index 6280c4e6..873c20e4 100644 --- a/src/harmony/app/canvas.cpy +++ b/src/harmony/app/canvas.cpy @@ -327,8 +327,8 @@ namespace app_ui: self.project_name = file_tokens[0] void load_project_from_dir(string dir): - vector filenames = util::lsdir(dir, ".raw") - sort(filenames.begin(), filenames.end()) + filenames := util::lsdir(dir, ".raw") + sort(filenames.begin(), filenames.end()) // do we really need to sort? for auto f : filenames: tokens := str_utils::split(f, '.') diff --git a/src/harmony/app/dialogs.cpy b/src/harmony/app/dialogs.cpy index 4be30663..1acd7a15 100644 --- a/src/harmony/app/dialogs.cpy +++ b/src/harmony/app/dialogs.cpy @@ -1,7 +1,3 @@ -#include -#include -#include - string ABOUT_TEXT = "\ rmHarmony is a sketching app based on libremarkable and mr. doob's harmony. \ brought to you by the letters N and O. icons are from fontawesome \n\n\ @@ -70,25 +66,7 @@ namespace app_ui: self.page_size = self.h / self.opt_h - 1 void populate(): - - vector> entries; - - filenames := util::lsdir(SAVE_DIR, ".png") - char full_path[PATH_MAX] - struct stat buf - for (auto filename : filenames) - sprintf(full_path, "%s/%s", SAVE_DIR, filename.c_str()) - if(stat(full_path, &buf)) - debug "Failed stat() on ", full_path - continue - entries.push_back({buf.st_mtime, filename}) - filenames.clear() - sort(entries.begin(), entries.end()) - - for (auto e : entries) - filenames.push_back(std::get<1>(e)) - reverse(filenames.begin(),filenames.end()) - + filenames := util::lsdir(SAVE_DIR, ".png", util::MODIFIED_DATE_DESC) self.options = filenames void on_row_selected(string name): @@ -118,7 +96,6 @@ namespace app_ui: ui::MainLoop::hide_overlay() void populate(): - vector filenames = util::lsdir(SAVE_DIR, ".hrm") - sort(filenames.begin(),filenames.end()) + filenames := util::lsdir(SAVE_DIR, ".hrm", util::MODIFIED_DATE_DESC) self.options = filenames diff --git a/src/rmkit/util/lsdir.cpy b/src/rmkit/util/lsdir.cpy index 1643960a..695a112f 100644 --- a/src/rmkit/util/lsdir.cpy +++ b/src/rmkit/util/lsdir.cpy @@ -1,8 +1,31 @@ +#include #include +#include #include "../shared/string.h" namespace util: - vector lsdir(string dirname, string ext=""): + + enum SORTING { DEFAULT, MODIFIED_DATE_DESC } + + void sort_by_modified_date(vector &filenames, string dirname): + struct stat buf + vector> entries + for (auto filename : filenames) + string full_path = "" + full_path.append(dirname).append("/").append(filename) + if(stat(full_path.c_str(), &buf)) + debug "Failed stat() on ", full_path + continue + entries.push_back({buf.st_mtime, filename}) + + sort(entries.begin(), entries.end()) + filenames.clear() + for (auto e : entries) + filenames.push_back(std::get<1>(e)) + + reverse(filenames.begin(), filenames.end()) + + vector lsdir(string dirname, string ext="", SORTING sort=DEFAULT): DIR *dir struct dirent *ent @@ -16,4 +39,7 @@ namespace util: else: perror ("") + if (sort == MODIFIED_DATE_DESC) + sort_by_modified_date(filenames, dirname) + return filenames