Remove the added/removed items arguments from the selection changed signal

They're only used by one thing (the drag visual tool), so calculating
them is pointless overhead most of the time, and it simplifies the
visual tool code much less than it complicates the grid code.
This commit is contained in:
Thomas Goyne 2014-03-05 08:28:14 -08:00
parent c3fb54153f
commit c9582fe7cf
8 changed files with 36 additions and 63 deletions

View File

@ -373,9 +373,8 @@ class AudioTimingControllerDialogue : public AudioTimingController {
/// @param user_triggered Is this a user-initiated commit or an autocommit /// @param user_triggered Is this a user-initiated commit or an autocommit
void DoCommit(bool user_triggered); void DoCommit(bool user_triggered);
// SubtitleSelectionListener interface void OnActiveLineChanged();
void OnActiveLineChanged(AssDialogue *new_line); void OnSelectedSetChanged();
void OnSelectedSetChanged(const SubtitleSelection &lines_added, const SubtitleSelection &lines_removed);
// AssFile events // AssFile events
void OnFileChanged(int type); void OnFileChanged(int type);
@ -457,12 +456,12 @@ void AudioTimingControllerDialogue::GetMarkers(const TimeRange &range, AudioMark
video_position_provider.GetMarkers(range, out_markers); video_position_provider.GetMarkers(range, out_markers);
} }
void AudioTimingControllerDialogue::OnActiveLineChanged(AssDialogue *new_line) void AudioTimingControllerDialogue::OnActiveLineChanged()
{ {
Revert(); Revert();
} }
void AudioTimingControllerDialogue::OnSelectedSetChanged(SubtitleSelection const&, SubtitleSelection const&) void AudioTimingControllerDialogue::OnSelectedSetChanged()
{ {
RegenerateSelectedLines(); RegenerateSelectedLines();
RegenerateInactiveLines(); RegenerateInactiveLines();

View File

@ -249,15 +249,13 @@ void BaseGrid::UpdateStyle() {
} }
void BaseGrid::ClearMaps() { void BaseGrid::ClearMaps() {
Selection old_selection(selection);
index_line_map.clear(); index_line_map.clear();
line_index_map.clear(); line_index_map.clear();
selection.clear(); selection.clear();
yPos = 0; yPos = 0;
AdjustScrollbar(); AdjustScrollbar();
AnnounceSelectedSetChanged(Selection(), old_selection); AnnounceSelectedSetChanged();
} }
void BaseGrid::UpdateMaps() { void BaseGrid::UpdateMaps() {
@ -307,10 +305,9 @@ void BaseGrid::EndBatch() {
if (batch_active_line_changed) if (batch_active_line_changed)
AnnounceActiveLineChanged(active_line); AnnounceActiveLineChanged(active_line);
batch_active_line_changed = false; batch_active_line_changed = false;
if (!batch_selection_added.empty() || !batch_selection_removed.empty()) if (batch_selection_changed)
AnnounceSelectedSetChanged(batch_selection_added, batch_selection_removed); AnnounceSelectedSetChanged();
batch_selection_added.clear(); batch_selection_changed = false;
batch_selection_removed.clear();
} }
AdjustScrollbar(); AdjustScrollbar();
@ -339,19 +336,11 @@ void BaseGrid::SelectRow(int row, bool addToSelected, bool select) {
if (select && selection.find(line) == selection.end()) { if (select && selection.find(line) == selection.end()) {
selection.insert(line); selection.insert(line);
AnnounceSelectedSetChanged();
Selection added;
added.insert(line);
AnnounceSelectedSetChanged(added, Selection());
} }
else if (!select && selection.find(line) != selection.end()) { else if (!select && selection.find(line) != selection.end()) {
selection.erase(line); selection.erase(line);
AnnounceSelectedSetChanged();
Selection removed;
removed.insert(line);
AnnounceSelectedSetChanged(Selection(), removed);
} }
int w = GetClientSize().GetWidth(); int w = GetClientSize().GetWidth();
@ -976,11 +965,8 @@ void BaseGrid::SetByFrame(bool state) {
} }
void BaseGrid::SetSelectedSet(const Selection &new_selection) { void BaseGrid::SetSelectedSet(const Selection &new_selection) {
Selection inserted, removed;
set_difference(new_selection, selection, inserted);
set_difference(selection, new_selection, removed);
selection = new_selection; selection = new_selection;
AnnounceSelectedSetChanged(inserted, removed); AnnounceSelectedSetChanged();
Refresh(false); Refresh(false);
} }
@ -1023,23 +1009,9 @@ void BaseGrid::AnnounceActiveLineChanged(AssDialogue *new_line) {
SubtitleSelectionController::AnnounceActiveLineChanged(new_line); SubtitleSelectionController::AnnounceActiveLineChanged(new_line);
} }
void BaseGrid::AnnounceSelectedSetChanged(const Selection &lines_added, const Selection &lines_removed) { void BaseGrid::AnnounceSelectedSetChanged() {
if (batch_level > 0) { if (batch_level > 0)
// Remove all previously added lines that are now removed batch_selection_changed = true;
Selection temp; else
set_difference(batch_selection_added, lines_removed, temp); SubtitleSelectionController::AnnounceSelectedSetChanged();
std::swap(temp, batch_selection_added);
temp.clear();
// Remove all previously removed lines that are now added
set_difference(batch_selection_removed, lines_added, temp);
std::swap(temp, batch_selection_removed);
// Add new stuff to batch sets
batch_selection_added.insert(lines_added.begin(), lines_added.end());
batch_selection_removed.insert(lines_removed.begin(), lines_removed.end());
}
else {
SubtitleSelectionController::AnnounceSelectedSetChanged(lines_added, lines_removed);
}
} }

View File

@ -71,12 +71,8 @@ class BaseGrid : public wxWindow, public SubtitleSelectionController {
int batch_level = 0; int batch_level = 0;
/// Has the active line been changed in the current batch? /// Has the active line been changed in the current batch?
bool batch_active_line_changed = false; bool batch_active_line_changed = false;
/// Lines which will be added to the selection when the current batch is /// Has the selection been changed in the current batch?
/// completed; should be disjoint from selection bool batch_selection_changed = false;
Selection batch_selection_added;
/// Lines which will be removed from the selection when the current batch
/// is completed; should be a subset of selection
Selection batch_selection_removed;
/// Connection for video seek event. Stored explicitly so that it can be /// Connection for video seek event. Stored explicitly so that it can be
/// blocked if the relevant option is disabled /// blocked if the relevant option is disabled
@ -121,7 +117,7 @@ class BaseGrid : public wxWindow, public SubtitleSelectionController {
// Re-implement functions from BaseSelectionController to add batching // Re-implement functions from BaseSelectionController to add batching
void AnnounceActiveLineChanged(AssDialogue *new_line); void AnnounceActiveLineChanged(AssDialogue *new_line);
void AnnounceSelectedSetChanged(const Selection &lines_added, const Selection &lines_removed); void AnnounceSelectedSetChanged();
protected: protected:
agi::Context *context; ///< Current project context agi::Context *context; ///< Current project context

View File

@ -65,7 +65,7 @@ public:
protected: protected:
agi::signal::Signal<ItemDataType> AnnounceActiveLineChanged; agi::signal::Signal<ItemDataType> AnnounceActiveLineChanged;
agi::signal::Signal<Selection const&, Selection const&> AnnounceSelectedSetChanged; agi::signal::Signal<> AnnounceSelectedSetChanged;
public: public:
/// Virtual destructor for safety /// Virtual destructor for safety

View File

@ -378,7 +378,7 @@ void SubsEditBox::OnActiveLineChanged(AssDialogue *new_line) {
} }
} }
void SubsEditBox::OnSelectedSetChanged(const SubtitleSelection &, const SubtitleSelection &) { void SubsEditBox::OnSelectedSetChanged() {
sel = c->selectionController->GetSelectedSet(); sel = c->selectionController->GetSelectedSet();
initial_times.clear(); initial_times.clear();
} }

View File

@ -148,7 +148,7 @@ class SubsEditBox : public wxPanel {
void OnKeyDown(wxKeyEvent &event); void OnKeyDown(wxKeyEvent &event);
void OnActiveLineChanged(AssDialogue *new_line); void OnActiveLineChanged(AssDialogue *new_line);
void OnSelectedSetChanged(const SubtitleSelection &, const SubtitleSelection &); void OnSelectedSetChanged();
void OnLineInitialTextChanged(std::string const& new_text); void OnLineInitialTextChanged(std::string const& new_text);
void OnFrameTimeRadio(wxCommandEvent &event); void OnFrameTimeRadio(wxCommandEvent &event);

View File

@ -36,6 +36,7 @@
#include <algorithm> #include <algorithm>
#include <boost/format.hpp> #include <boost/format.hpp>
#include <boost/range/algorithm/binary_search.hpp>
#include <functional> #include <functional>
#include <wx/toolbar.h> #include <wx/toolbar.h>
@ -49,8 +50,9 @@ static const DraggableFeatureType DRAG_END = DRAG_BIG_CIRCLE;
VisualToolDrag::VisualToolDrag(VideoDisplay *parent, agi::Context *context) VisualToolDrag::VisualToolDrag(VideoDisplay *parent, agi::Context *context)
: VisualTool<VisualToolDragDraggableFeature>(parent, context) : VisualTool<VisualToolDragDraggableFeature>(parent, context)
{ {
c->selectionController->GetSelectedSet(selection);
connections.push_back(c->selectionController->AddSelectionListener(&VisualToolDrag::OnSelectedSetChanged, this)); connections.push_back(c->selectionController->AddSelectionListener(&VisualToolDrag::OnSelectedSetChanged, this));
auto const& sel_set = c->selectionController->GetSelectedSet();
selection.insert(begin(selection), begin(sel_set), end(sel_set));
} }
void VisualToolDrag::SetToolbar(wxToolBar *tb) { void VisualToolDrag::SetToolbar(wxToolBar *tb) {
@ -155,17 +157,20 @@ template<class C, class T> static bool line_not_present(C const& set, T const& i
}); });
} }
void VisualToolDrag::OnSelectedSetChanged(const SubtitleSelection &added, const SubtitleSelection &removed) { void VisualToolDrag::OnSelectedSetChanged() {
c->selectionController->GetSelectedSet(selection); auto const& new_sel_set = c->selectionController->GetSelectedSet();
std::vector<AssDialogue *> new_sel(begin(new_sel_set), end(new_sel_set));
bool any_changed = false; bool any_changed = false;
for (auto it = features.begin(); it != features.end(); ) { for (auto it = features.begin(); it != features.end(); ) {
if (removed.count(it->line)) { bool was_selected = boost::binary_search(selection, it->line);
bool is_selected = boost::binary_search(new_sel, it->line);
if (was_selected && !is_selected) {
sel_features.erase(&*it++); sel_features.erase(&*it++);
any_changed = true; any_changed = true;
} }
else { else {
if (added.count(it->line) && it->type == DRAG_START && line_not_present(sel_features, it)) { if (is_selected && !was_selected && it->type == DRAG_START && line_not_present(sel_features, it)) {
sel_features.insert(&*it); sel_features.insert(&*it);
any_changed = true; any_changed = true;
} }
@ -175,6 +180,7 @@ void VisualToolDrag::OnSelectedSetChanged(const SubtitleSelection &added, const
if (any_changed) if (any_changed)
parent->Render(); parent->Render();
selection = std::move(new_sel);
} }
void VisualToolDrag::Draw() { void VisualToolDrag::Draw() {
@ -232,7 +238,7 @@ void VisualToolDrag::MakeFeatures(AssDialogue *diag, feature_list::iterator pos)
feat->type = DRAG_START; feat->type = DRAG_START;
feat->line = diag; feat->line = diag;
if (selection.count(diag)) if (boost::binary_search(selection, diag))
sel_features.insert(feat.get()); sel_features.insert(feat.get());
features.insert(pos, *feat.release()); features.insert(pos, *feat.release());

View File

@ -45,7 +45,7 @@ class VisualToolDrag : public VisualTool<VisualToolDragDraggableFeature> {
/// longer exists /// longer exists
Feature *primary = nullptr; Feature *primary = nullptr;
/// The last announced selection set /// The last announced selection set
SubtitleSelection selection; std::vector<AssDialogue *> selection;
/// When the button is pressed, will it convert the line to a move (vs. from /// When the button is pressed, will it convert the line to a move (vs. from
/// move to pos)? Used to avoid changing the button's icon unnecessarily /// move to pos)? Used to avoid changing the button's icon unnecessarily
@ -57,7 +57,7 @@ class VisualToolDrag : public VisualTool<VisualToolDragDraggableFeature> {
void MakeFeatures(AssDialogue *diag, feature_list::iterator pos); void MakeFeatures(AssDialogue *diag, feature_list::iterator pos);
void MakeFeatures(AssDialogue *diag); void MakeFeatures(AssDialogue *diag);
void OnSelectedSetChanged(SubtitleSelection const& lines_added, SubtitleSelection const& lines_removed); void OnSelectedSetChanged();
void OnFrameChanged() override; void OnFrameChanged() override;
void OnFileChanged() override; void OnFileChanged() override;