diff --git a/aegisub/libaegisub/include/libaegisub/signal.h b/aegisub/libaegisub/include/libaegisub/signal.h index 35dd22248..fe9d3b6bc 100644 --- a/aegisub/libaegisub/include/libaegisub/signal.h +++ b/aegisub/libaegisub/include/libaegisub/signal.h @@ -215,6 +215,18 @@ public: UnscopedConnection Connect(void (T::*func)(Arg1, Arg2), T* a1) { return Connect(std::bind(func, a1, _1, _2)); } + + /// @brief Connect a member function with the correct signature to this signal + /// @param func Function to connect + /// @param a1 Object + /// + /// This overload is purely for convenience so that classes can do + /// sig.Connect(&Class::Foo, this) rather than + /// sig.Connect(&Class::Foo, this, _1) + template + UnscopedConnection Connect(void (T::*func)(Arg1), T* a1) { + return Connect(std::bind(func, a1, _1)); + } }; /// @class Signal diff --git a/aegisub/src/ass_file.cpp b/aegisub/src/ass_file.cpp index 133eb55dc..7cdb1741e 100644 --- a/aegisub/src/ass_file.cpp +++ b/aegisub/src/ass_file.cpp @@ -372,6 +372,10 @@ void AssFile::AddToRecent(wxString const& file) const { } int AssFile::Commit(wxString const& desc, int type, int amendId, AssEntry *single_line) { + std::set changed_lines; + if (single_line) + changed_lines.insert(single_line); + ++commitId; // Allow coalescing only if it's the last change and the file has not been // saved since the last change @@ -389,7 +393,7 @@ int AssFile::Commit(wxString const& desc, int type, int amendId, AssEntry *singl else { UndoStack.back() = *this; } - AnnounceCommit(type); + AnnounceCommit(type, changed_lines); return commitId; } @@ -408,7 +412,7 @@ int AssFile::Commit(wxString const& desc, int type, int amendId, AssEntry *singl if (UndoStack.size() > 1 && OPT_GET("App/Auto/Save on Every Change")->GetBool() && !filename.empty() && CanSave()) Save(filename); - AnnounceCommit(type); + AnnounceCommit(type, changed_lines); return commitId; } @@ -420,7 +424,7 @@ void AssFile::Undo() { UndoStack.pop_back(); *this = UndoStack.back(); - AnnounceCommit(COMMIT_NEW); + AnnounceCommit(COMMIT_NEW, std::set()); } void AssFile::Redo() { @@ -430,7 +434,7 @@ void AssFile::Redo() { UndoStack.push_back(*this); RedoStack.pop_back(); - AnnounceCommit(COMMIT_NEW); + AnnounceCommit(COMMIT_NEW, std::set()); } wxString AssFile::GetUndoDescription() const { diff --git a/aegisub/src/ass_file.h b/aegisub/src/ass_file.h index 268dbebef..165126148 100644 --- a/aegisub/src/ass_file.h +++ b/aegisub/src/ass_file.h @@ -33,14 +33,12 @@ /// #include - +#include #include #include #include -#include - #include #include "ass_entry.h" @@ -65,7 +63,7 @@ class AssFile { int autosavedCommitId; /// A set of changes has been committed to the file (AssFile::CommitType) - agi::signal::Signal AnnounceCommit; + agi::signal::Signal const&> AnnounceCommit; /// A new file has been opened (filename) agi::signal::Signal FileOpen; /// The file is about to be saved diff --git a/aegisub/src/audio_karaoke.cpp b/aegisub/src/audio_karaoke.cpp index a6674d5c5..5ea4939e3 100644 --- a/aegisub/src/audio_karaoke.cpp +++ b/aegisub/src/audio_karaoke.cpp @@ -118,8 +118,8 @@ void AudioKaraoke::OnActiveLineChanged(AssDialogue *new_line) { } } -void AudioKaraoke::OnFileChanged(int type) { - if (enabled && (type & AssFile::COMMIT_DIAG_FULL)) { +void AudioKaraoke::OnFileChanged(int type, std::set const& changed) { + if (enabled && (type & AssFile::COMMIT_DIAG_FULL) && (changed.empty() || changed.count(active_line))) { LoadFromLine(); split_area->Refresh(false); } diff --git a/aegisub/src/audio_karaoke.h b/aegisub/src/audio_karaoke.h index c4a769b30..0f5483a1c 100644 --- a/aegisub/src/audio_karaoke.h +++ b/aegisub/src/audio_karaoke.h @@ -30,6 +30,7 @@ #include class AssDialogue; +class AssEntry; class AssKaraoke; class wxButton; @@ -136,7 +137,7 @@ class AudioKaraoke : public wxWindow { void OnActiveLineChanged(AssDialogue *new_line); void OnContextMenu(wxContextMenuEvent&); void OnEnableButton(wxCommandEvent &evt); - void OnFileChanged(int type); + void OnFileChanged(int type, std::set const& changed); void OnMouse(wxMouseEvent &event); void OnPaint(wxPaintEvent &event); void OnSize(wxSizeEvent &event);