Editor: keep last selection as last when sorting

sort selections 'circularly', keeping the last one
at the end of the list.
This commit is contained in:
Maxime Coste 2013-01-02 14:25:28 +01:00
parent a9d5f126a0
commit 9fb0129061

View File

@ -125,22 +125,37 @@ std::vector<String> Editor::selections_content() const
{ {
std::vector<String> contents; std::vector<String> contents;
for (auto& sel : m_selections) for (auto& sel : m_selections)
contents.push_back(m_buffer->string(sel.begin(), contents.push_back(m_buffer->string(sel.begin(), sel.end()));
sel.end()));
return contents; return contents;
} }
static bool compare_selections(const Selection& lhs, const Selection& rhs)
{
return lhs.begin() < rhs.begin();
}
static void sort_and_merge_overlapping(SelectionList& selections) static void sort_and_merge_overlapping(SelectionList& selections)
{ {
std::sort(selections.begin(), selections.end(), if (selections.size() == 1)
[](const Selection& lhs, const Selection& rhs) return;
{ return lhs.begin() < rhs.begin(); });
for (size_t i = 0; i < selections.size()-1;) Range back = selections.back();
auto back_rank = std::count_if(selections.begin(), selections.end(),
[&](const Selection& sel)
{ return sel.begin() < back.begin(); });
std::sort(selections.begin(), selections.end(), compare_selections);
if (back_rank < selections.size() - 1)
std::rotate(selections.begin(), selections.begin() + back_rank + 1,
selections.end());
assert(selections.back() == back);
for (size_t i = 0; i < selections.size() and selections.size() > 1;)
{ {
if (overlaps(selections[i], selections[i+1])) size_t next = (i + 1) % selections.size();
if (overlaps(selections[i], selections[next]))
{ {
selections[i].merge_with(selections[i+1]); selections[i].merge_with(selections[next]);
selections.erase(selections.begin() + i + 1); selections.erase(selections.begin() + next);
} }
else else
++i; ++i;
@ -350,6 +365,11 @@ void Editor::check_invariant() const
{ {
assert(not m_selections.empty()); assert(not m_selections.empty());
m_selections.check_invariant(); m_selections.check_invariant();
auto it = ++std::max_element(m_selections.begin(), m_selections.end(),
compare_selections);
assert(std::is_sorted(m_selections.begin(), it, compare_selections));
assert(std::is_sorted(it, m_selections.end(), compare_selections));
} }
void Editor::begin_edition() void Editor::begin_edition()