From fee60be5db6e6a5d3239872e839d4c9471cdbd56 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Mon, 17 Dec 2012 07:54:19 -0800 Subject: [PATCH] Announce the set of lines changed in commits Currently this is only populated when commits are amended, for the simple reason that it's the only time that AssFile knows what lines changed. It is probably worth expanding this in the future. --- aegisub/libaegisub/include/libaegisub/signal.h | 12 ++++++++++++ aegisub/src/ass_file.cpp | 12 ++++++++---- aegisub/src/ass_file.h | 6 ++---- aegisub/src/audio_karaoke.cpp | 4 ++-- aegisub/src/audio_karaoke.h | 3 ++- 5 files changed, 26 insertions(+), 11 deletions(-) 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);