diff --git a/src/commands/CmdProjects.cpp b/src/commands/CmdProjects.cpp index e9b1482fd..16d9503bc 100644 --- a/src/commands/CmdProjects.cpp +++ b/src/commands/CmdProjects.cpp @@ -112,29 +112,7 @@ int CmdProjects::execute (std::string& output) // create sorted list of table entries std::list > sorted_view; - for (auto& project : unique) - { - const std::vector parents = extractParents (project.first); - if (parents.size ()) { - // if parents exist: store iterator position of last parent - std::list>::iterator parent_pos; - for (auto& parent : parents) - { - parent_pos = std::find_if (sorted_view.begin (), sorted_view.end (), - [&parent](const std::pair& element) { return element.first == parent; } - ); - // if parent does not exist yet: insert into sorted view - if (parent_pos == sorted_view.end()) { - sorted_view.insert (parent_pos, std::make_pair(parent, 1)); - } - } - // insert new element below latest parent - sorted_view.insert (++parent_pos, project); - } else { - // if has no parents: simply push to end of list - sorted_view.push_back (project); - } - } + sort_projects (sorted_view, unique); // construct view from sorted list for (auto& item: sorted_view) { diff --git a/src/commands/CmdSummary.cpp b/src/commands/CmdSummary.cpp index 3ae204227..e76acd8c6 100644 --- a/src/commands/CmdSummary.cpp +++ b/src/commands/CmdSummary.cpp @@ -148,53 +148,24 @@ int CmdSummary::execute (std::string& output) } // sort projects into sorted list - std::list sortedProjects; - for (auto& i : allProjects) - { - if (showAllProjects || countPending[i.first] > 0) - { - const std::vector parents = extractParents (i.first); - if (parents.size ()) - { - // if parents exist: store iterator position of last parent - std::list::iterator parent_pos; - for (auto& parent : parents) - { - parent_pos = std::find (sortedProjects.begin (), sortedProjects.end (), parent); - // if parent does not exist yet: insert into sorted view - if (parent_pos == sortedProjects.end ()) - { - sortedProjects.push_back (parent); - } - } - // insert new element below latest parent - if (parent_pos == sortedProjects.end ()) { - sortedProjects.push_back (i.first); - } else { - sortedProjects.insert (++parent_pos, i.first); - } - } else { - // if has no parents: simply push to end of list - sortedProjects.push_back (i.first); - } - } - } + std::list> sortedProjects; + sort_projects (sortedProjects, allProjects); int barWidth = 30; // construct view from sorted list for (auto& i : sortedProjects) { int row = view.addRow (); - view.set (row, 0, (i == "" + view.set (row, 0, (i.first == "" ? "(none)" - : indentProject (i, " ", '.'))); + : indentProject (i.first, " ", '.'))); - view.set (row, 1, countPending[i]); - if (counter[i]) - view.set (row, 2, Duration ((int) (sumEntry[i] / (double)counter[i])).formatVague ()); + view.set (row, 1, countPending[i.first]); + if (counter[i.first]) + view.set (row, 2, Duration ((int) (sumEntry[i.first] / (double)counter[i.first])).formatVague ()); - int c = countCompleted[i]; - int p = countPending[i]; + int c = countCompleted[i.first]; + int p = countPending[i.first]; int completedBar = 0; if (c + p) completedBar = (c * barWidth) / (c + p); diff --git a/src/main.h b/src/main.h index 511692dd7..9874c20d6 100644 --- a/src/main.h +++ b/src/main.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -81,6 +82,8 @@ std::string onExpiration (Task&); // sort.cpp void sort_tasks (std::vector &, std::vector &, const std::string&); +void sort_projects (std::list >& sorted, std::map & allProjects); +void sort_projects (std::list >& sorted, std::map & allProjects); // legacy.cpp void legacyColumnMap (std::string&); diff --git a/src/sort.cpp b/src/sort.cpp index fab503293..f12d29fb7 100644 --- a/src/sort.cpp +++ b/src/sort.cpp @@ -27,12 +27,15 @@ #include #include #include +#include +#include #include #include #include #include #include #include +#include #include static std::vector * global_data = nullptr; @@ -59,6 +62,49 @@ void sort_tasks ( Context::getContext ().time_sort_us += timer.total_us (); } +void sort_projects ( + std::list >& sorted, + std::map & allProjects) +{ + for (auto& project : allProjects) + { + const std::vector parents = extractParents (project.first); + if (parents.size ()) + { + // if parents exist: store iterator position of last parent + std::list >::iterator parent_pos; + for (auto& parent : parents) + { + parent_pos = std::find_if (sorted.begin (), sorted.end (), + [&parent](const std::pair & item) { return item.first == parent; } + ); + // if parent does not exist yet: insert into sorted view + if (parent_pos == sorted.end ()) { + sorted.push_back (std::make_pair (parent, 1)); + } + } + // insert new element below latest parent + sorted.insert ((parent_pos == sorted.end ()) ? parent_pos : ++parent_pos, project); + } else { + // if has no parents: simply push to end of list + sorted.push_back (project); + } + } +} + +void sort_projects ( + std::list >& sorted, + std::map & allProjects) +{ + std::map allProjectsInt; + for (auto& p : allProjects) + { + allProjectsInt[p.first] = (int) p.second; + } + sort_projects (sorted, allProjectsInt); +} + + //////////////////////////////////////////////////////////////////////////////// // Re-implementation, using direct Task access instead of data copies that // require re-parsing.