commit 890fb133b1b2349588705d32fe0c9b95eb50503a
Author: Scott Kostyshak <[email protected]>
Date: Fri May 4 18:21:54 2018 -0400
Only show Accept/Reject Change options if relevant
In the context menu for a selection, we now only show the options
"Accept Change" and "Reject Change" if there is actually a change in
the selection. Similarly, in the toolbar, the buttons are only
enabled when there is a change in the selection.
This fixes #10338.
(cherry picked from commit 23de5e5e195f8f76aea4760f0e6999a9a4174612)
---
src/Paragraph.h | 4 +++-
src/Text3.cpp | 32 +++++++++++++++++++++++---------
2 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/src/Paragraph.h b/src/Paragraph.h
index 31157b5..34ae917 100644
--- a/src/Paragraph.h
+++ b/src/Paragraph.h
@@ -263,10 +263,12 @@ public:
/// look up change at given pos
Change const & lookupChange(pos_type pos) const;
- /// is there a change within the given range ?
+ /// is there a change within the given range (does not
+ /// check contained paragraphs)
bool isChanged(pos_type start, pos_type end) const;
/// is there an unchanged char at the given pos ?
bool isChanged(pos_type pos) const;
+
/// is there an insertion at the given pos ?
bool isInserted(pos_type pos) const;
/// is there a deletion at the given pos ?
diff --git a/src/Text3.cpp b/src/Text3.cpp
index b86819b..e75fad0 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -3195,17 +3195,31 @@ bool Text::getStatus(Cursor & cur, FuncRequest const &
cmd,
case LFUN_CHANGE_ACCEPT:
case LFUN_CHANGE_REJECT:
- // In principle, these LFUNs should only be enabled if there
- // is a change at the current position/in the current selection.
- // However, without proper optimizations, this will inevitably
- // result in unacceptable performance - just imagine a user who
- // wants to select the complete content of a long document.
if (!cur.selection())
enable = cur.paragraph().isChanged(cur.pos());
- else
- // TODO: context-sensitive enabling of
LFUN_CHANGE_ACCEPT/REJECT
- // for selections.
- enable = true;
+ else {
+ // will enable if there is a change in the selection
+ enable = false;
+
+ // cheap improvement for efficiency: using cached
+ // buffer variable, if there is no change in the
+ // document, no need to check further.
+ if (!cur.buffer()->areChangesPresent())
+ break;
+
+ for (DocIterator it = cur.selectionBegin(); it <
cur.selectionEnd(); it.forwardPar()) {
+ pos_type const beg = it.pos();
+ pos_type end;
+ if (it.paragraph().id() ==
cur.selectionEnd().paragraph().id())
+ end = cur.selectionEnd().pos();
+ else
+ end = it.paragraph().size();
+ if (beg != end && it.paragraph().isChanged(beg,
end)) {
+ enable = true;
+ break;
+ }
+ }
+ }
break;
case LFUN_OUTLINE_UP: