[LyX/master] Make spellchecker work in read-only document

Jean-Marc Lasgouttes lasgouttes at lyx.org
Mon Dec 7 17:04:30 UTC 2020


commit 1dcb08104cd11974111749257f955bbcb3daffa9
Author: Jean-Marc Lasgouttes <lasgouttes at lyx.org>
Date:   Mon Dec 7 17:53:40 2020 +0100

    Make spellchecker work in read-only document
    
    Mistakes are visible but word replacement is disabled. Disable relevant
    widgets depending on the situation.
    
    Move updateView code to SpellcheckerWidget::Private.
---
 src/frontends/qt/GuiSpellchecker.cpp |   62 +++++++++++++++++++++++-----------
 src/frontends/qt/GuiView.cpp         |    1 -
 2 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/src/frontends/qt/GuiSpellchecker.cpp b/src/frontends/qt/GuiSpellchecker.cpp
index 9fcf20c..009c124 100644
--- a/src/frontends/qt/GuiSpellchecker.cpp
+++ b/src/frontends/qt/GuiSpellchecker.cpp
@@ -62,6 +62,8 @@ struct SpellcheckerWidget::Private
 {
 	Private(SpellcheckerWidget * parent, DockView * dv, GuiView * gv)
 		: p(parent), dv_(dv), gv_(gv), incheck_(false), wrap_around_(false) {}
+	///
+	void updateView();
 	/// update from controller
 	void updateSuggestions(docstring_list & words);
 	/// move to next position after current word
@@ -146,9 +148,6 @@ SpellcheckerWidget::SpellcheckerWidget(GuiView * gv, DockView * dv, QWidget * pa
 	language_model->sort(0);
 	d->ui.languageCO->setModel(language_model);
 	d->ui.languageCO->setModelColumn(1);
-
-	d->ui.wordED->setReadOnly(true);
-
 	d->ui.suggestionsLW->installEventFilter(this);
 }
 
@@ -208,27 +207,48 @@ void SpellcheckerWidget::on_replaceCO_highlighted(const QString & str)
 
 void SpellcheckerWidget::updateView()
 {
-	BufferView * bv = d->gv_->documentBufferView();
-	// we need a buffer view and the buffer has to be writable
-	bool const enabled = bv != 0 && !bv->buffer().isReadonly();
-	setEnabled(enabled);
-	if (enabled && hasFocus()) {
-		Cursor const & cursor = bv->cursor();
-		if (d->start_.empty() || !d->isCurrentBuffer(cursor)) {
-			if (cursor.selection()) {
-				d->begin_ = cursor.selectionBegin();
-				d->end_   = cursor.selectionEnd();
-				d->start_ = d->begin_;
-				bv->cursor().setCursor(d->start_);
+	d->updateView();
+}
+
+
+void SpellcheckerWidget::Private::updateView()
+{
+	BufferView * bv = gv_->documentBufferView();
+	bool const enabled = bv != nullptr;
+	// Check cursor position
+	if (enabled && p->hasFocus()) {
+		Cursor const & cur = bv->cursor();
+		if (start_.empty() || !isCurrentBuffer(cur)) {
+			if (cur.selection()) {
+				begin_ = cur.selectionBegin();
+				end_   = cur.selectionEnd();
+				start_ = begin_;
+				bv->cursor().setCursor(start_);
 			} else {
-				d->begin_ = DocIterator();
-				d->end_   = DocIterator();
-				d->start_ = cursor;
+				begin_ = DocIterator();
+				end_   = DocIterator();
+				start_ = cur;
 			}
-			d->wrapAround(false);
-			d->check();
+			wrapAround(false);
+			check();
 		}
 	}
+
+	// Enable widgets as needed.
+	bool const has_word = enabled && !ui.wordED->text().isEmpty();
+	bool const can_replace = has_word && !bv->buffer().isReadonly();
+	ui.findNextPB->setEnabled(enabled);
+	ui.TextLabel3->setEnabled(enabled);
+	ui.wordED->setEnabled(enabled);
+	ui.ignorePB->setEnabled(has_word);
+	ui.ignoreAllPB->setEnabled(has_word);
+	ui.addPB->setEnabled(has_word);
+	ui.TextLabel1->setEnabled(can_replace);
+	ui.replaceCO->setEnabled(can_replace);
+	ui.TextLabel2->setEnabled(has_word);
+	ui.suggestionsLW->setEnabled(has_word);
+	ui.replacePB->setEnabled(can_replace);
+	ui.replaceAllPB->setEnabled(can_replace);
 }
 
 DocIterator const SpellcheckerWidget::Private::cursor() const
@@ -587,6 +607,8 @@ void SpellcheckerWidget::Private::check()
 	setLanguage(word_lang.lang());
 	// mark misspelled word
 	setSelection(from, to);
+	// enable relevant widgets
+	updateView();
 }
 
 
diff --git a/src/frontends/qt/GuiView.cpp b/src/frontends/qt/GuiView.cpp
index c4a406c..6f50a15 100644
--- a/src/frontends/qt/GuiView.cpp
+++ b/src/frontends/qt/GuiView.cpp
@@ -2193,7 +2193,6 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 			enable = FileName(doc_buffer->logName()).isReadableFile();
 		else if (name == "spellchecker")
 			enable = theSpellChecker()
-				&& !doc_buffer->isReadonly()
 				&& !doc_buffer->text().empty();
 		else if (name == "vclog")
 			enable = doc_buffer->lyxvc().inUse();


More information about the lyx-cvs mailing list