From dfb844b6ab9228aadc9383ed1c5ff0b551325cc2 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Mon, 28 Jun 2010 07:13:03 +0000 Subject: [PATCH] Make lines_added and lines_removed in SelectionListener::OnSelectedSetChanged mutually exclusive. Originally committed to SVN as r4629. --- aegisub/src/base_grid.cpp | 49 ++++++++++++++---------------- aegisub/src/selection_controller.h | 5 +-- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/aegisub/src/base_grid.cpp b/aegisub/src/base_grid.cpp index c899a5b64..600f5cc67 100644 --- a/aegisub/src/base_grid.cpp +++ b/aegisub/src/base_grid.cpp @@ -61,6 +61,13 @@ #include "video_context.h" #include "video_slider.h" +template +static inline void set_difference(const S1 &src1, const S2 &src2, D &dst) { + std::set_difference( + src1.begin(), src1.end(), src2.begin(), src2.end(), + std::inserter(dst, dst.begin())); +} + /// @brief Constructor /// @param parent @@ -236,12 +243,9 @@ void BaseGrid::SelectRow(int row, bool addToSelected, bool select) { AssDialogue *line = index_line_map[row]; if (!addToSelected) { - Selection old_selection(selection); - selection.clear(); - if (select) { - selection.insert(line); - } - AnnounceSelectedSetChanged(selection, old_selection); + Selection sel; + if (select) sel.insert(line); + SetSelectedSet(sel); } else if (select && selection.find(line) == selection.end()) { @@ -278,28 +282,22 @@ void BaseGrid::SelectRow(int row, bool addToSelected, bool select) { /// @brief Selects visible lines /// void BaseGrid::SelectVisible() { - Selection lines_removed; - GetSelectedSet(lines_removed); + Selection new_selection; int rows = GetRows(); bool selectedOne = false; for (int i=0;i 0) { // Remove all previously added lines that are now removed Selection temp; - std::set_difference( - batch_selection_added.begin(), batch_selection_added.end(), - lines_removed.begin(), lines_removed.end(), - std::inserter(temp, temp.begin())); + set_difference(batch_selection_added, lines_removed, temp); std::swap(temp, batch_selection_added); temp.clear(); // Remove all previously removed lines that are now added - std::set_difference( - batch_selection_removed.begin(), batch_selection_removed.end(), - lines_added.begin(), lines_added.end(), - std::inserter(temp, temp.begin())); + set_difference(batch_selection_removed, lines_added, temp); std::swap(temp, batch_selection_removed); // Add new stuff to batch sets diff --git a/aegisub/src/selection_controller.h b/aegisub/src/selection_controller.h index d064a2f44..466d3e2ab 100644 --- a/aegisub/src/selection_controller.h +++ b/aegisub/src/selection_controller.h @@ -61,10 +61,7 @@ public: /// @param lines_added Lines added to the selection /// @param lines_removed Lines removed from the selection /// - /// Conceptually, removal happens before addition, for the purpose of this change notification. - /// - /// In case the two sets overlap, the intersection are lines that were previously selected - /// and remain selected. + /// The two sets must not intersect. virtual void OnSelectedSetChanged(const Selection &lines_added, const Selection &lines_removed) = 0; };