commit 1dcb08104cd11974111749257f955bbcb3daffa9
Author: Jean-Marc Lasgouttes <[email protected]>
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();
--
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs