From 3790f8dfa0abb83ddede5a80cd42ffb1e75f163d Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Fri, 2 Nov 2018 18:07:06 +0100 Subject: Allow changing the sort column Directories always come first and the .. entry even before that. --- sdn.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/sdn.cpp b/sdn.cpp index ff59b18..50823ba 100644 --- a/sdn.cpp +++ b/sdn.cpp @@ -373,7 +373,7 @@ enum { ALT = 1 << 24, SYM = 1 << 25 }; // Outside the range of Unicode #define CTRL 31 & #define ACTIONS(XX) XX(NONE) XX(HELP) XX(QUIT) XX(QUIT_NO_CHDIR) \ - XX(CHOOSE) XX(CHOOSE_FULL) \ + XX(CHOOSE) XX(CHOOSE_FULL) XX(SORT_LEFT) XX(SORT_RIGHT) \ XX(UP) XX(DOWN) XX(TOP) XX(BOTTOM) XX(PAGE_PREVIOUS) XX(PAGE_NEXT) \ XX(SCROLL_UP) XX(SCROLL_DOWN) XX(CHDIR) XX(GO_START) XX(GO_HOME) \ XX(SEARCH) XX(RENAME) XX(RENAME_PREFILL) \ @@ -394,6 +394,7 @@ static map g_normal_actions { {'q', ACTION_QUIT}, {ALT | 'q', ACTION_QUIT_NO_CHDIR}, // M-o ought to be the same shortcut the navigator is launched with {ALT | 'o', ACTION_QUIT}, + {'<', ACTION_SORT_LEFT}, {'>', ACTION_SORT_RIGHT}, {'k', ACTION_UP}, {CTRL 'p', ACTION_UP}, {KEY (UP), ACTION_UP}, {'j', ACTION_DOWN}, {CTRL 'n', ACTION_DOWN}, {KEY (DOWN), ACTION_DOWN}, {'g', ACTION_TOP}, {ALT | '<', ACTION_TOP}, {KEY (HOME), ACTION_TOP}, @@ -463,6 +464,7 @@ static struct { bool reverse_sort; ///< Reverse sort bool show_hidden; ///< Show hidden files int max_widths[entry::COLUMNS]; ///< Column widths + int sort_column = entry::FILENAME; ///< Sorting column wstring message; ///< Message for the user int message_ttl; ///< Time to live for the message @@ -694,9 +696,32 @@ fun operator< (const entry &e1, const entry &e2) -> bool { auto t2 = make_tuple (e2.filename != "..", !S_ISDIR (e2.info.st_mode)); if (t1 != t2) return t1 < t2; - return g.reverse_sort - ? e2.filename < e1.filename - : e1.filename < e2.filename; + + const auto &a = g.reverse_sort ? e2 : e1; + const auto &b = g.reverse_sort ? e1 : e2; + switch (g.sort_column) { + case entry::MODES: + if (a.info.st_mode != b.info.st_mode) + return a.info.st_mode < b.info.st_mode; + break; + case entry::USER: + if (a.info.st_uid != b.info.st_uid) + return a.info.st_uid < b.info.st_uid; + break; + case entry::GROUP: + if (a.info.st_gid != b.info.st_gid) + return a.info.st_gid < b.info.st_gid; + break; + case entry::SIZE: + if (a.info.st_size != b.info.st_size) + return a.info.st_size < b.info.st_size; + break; + case entry::MTIME: + if (a.info.st_mtime != b.info.st_mtime) + return a.info.st_mtime < b.info.st_mtime; + break; + } + return a.filename < b.filename; } fun reload () { @@ -938,6 +963,15 @@ fun handle (wint_t c) -> bool { case ACTION_QUIT: return false; + case ACTION_SORT_LEFT: + g.sort_column = (g.sort_column + entry::COLUMNS - 1) % entry::COLUMNS; + reload (); + break; + case ACTION_SORT_RIGHT: + g.sort_column = (g.sort_column + entry::COLUMNS + 1) % entry::COLUMNS; + reload (); + break; + case ACTION_UP: g.cursor--; break; @@ -1269,14 +1303,16 @@ fun load_config () { if (tokens.empty ()) continue; - if (tokens.front () == "full-view") - g.full_view = tokens.size () > 1 && tokens.at (1) == "1"; - else if (tokens.front () == "gravity") - g.gravity = tokens.size () > 1 && tokens.at (1) == "1"; - else if (tokens.front () == "reverse-sort") - g.reverse_sort = tokens.size () > 1 && tokens.at (1) == "1"; - else if (tokens.front () == "show-hidden") - g.show_hidden = tokens.size () > 1 && tokens.at (1) == "1"; + if (tokens.front () == "full-view" && tokens.size () > 1) + g.full_view = tokens.at (1) == "1"; + else if (tokens.front () == "gravity" && tokens.size () > 1) + g.gravity = tokens.at (1) == "1"; + else if (tokens.front () == "reverse-sort" && tokens.size () > 1) + g.reverse_sort = tokens.at (1) == "1"; + else if (tokens.front () == "show-hidden" && tokens.size () > 1) + g.show_hidden = tokens.at (1) == "1"; + else if (tokens.front () == "sort-column" && tokens.size () > 1) + g.sort_column = stoi (tokens.at (1)); else if (tokens.front () == "history") load_history_level (tokens); } @@ -1292,6 +1328,8 @@ fun save_config () { write_line (*config, {"reverse-sort", g.reverse_sort ? "1" : "0"}); write_line (*config, {"show-hidden", g.show_hidden ? "1" : "0"}); + write_line (*config, {"sort-column", to_string (g.sort_column)}); + char hostname[256]; if (gethostname (hostname, sizeof hostname)) *hostname = 0; -- cgit v1.2.3-70-g09d2