BinEditor: Fix search

Added applying encoding to the search string.
Added all available encodings to the CodecChooser.

Fixes: QTCREATORBUG-30589
Change-Id: I44b44e51401626949203cba186cb075b54813314
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Artem Sokolovskii
2024-08-29 12:21:50 +02:00
parent 54b7ba9060
commit d16d2d66a3

View File

@@ -1958,9 +1958,16 @@ public:
m_incrementalWrappedState = false; m_incrementalWrappedState = false;
} }
void rehighlightAll()
{
findIncremental(m_lastText, m_lastFindFlags);
}
void highlightAll(const QString &txt, FindFlags findFlags) final void highlightAll(const QString &txt, FindFlags findFlags) final
{ {
m_widget->highlightSearchResults(txt.toLatin1(), m_lastText = txt;
m_lastFindFlags = findFlags;
m_widget->highlightSearchResults(m_codec->fromUnicode(txt),
Utils::textDocumentFlagsForFindFlags(findFlags)); Utils::textDocumentFlagsForFindFlags(findFlags));
} }
@@ -1990,12 +1997,21 @@ public:
return res; return res;
} }
void setCodec(QTextCodec *codec)
{
if (codec == m_codec)
return;
m_codec = codec;
rehighlightAll();
}
Result findIncremental(const QString &txt, FindFlags findFlags) final Result findIncremental(const QString &txt, FindFlags findFlags) final
{ {
QByteArray pattern = txt.toLatin1(); QByteArray pattern = m_codec->fromUnicode(txt);
if (pattern != m_lastPattern) if (txt != m_lastText)
resetIncrementalSearch(); // Because we don't search for nibbles. resetIncrementalSearch(); // Because we don't search for nibbles.
m_lastPattern = pattern; m_lastText = txt;
m_lastFindFlags = findFlags;
if (m_incrementalStartPos < 0) if (m_incrementalStartPos < 0)
m_incrementalStartPos = m_widget->selectionStart(); m_incrementalStartPos = m_widget->selectionStart();
if (m_contPos == -1) if (m_contPos == -1)
@@ -2027,7 +2043,7 @@ public:
Result findStep(const QString &txt, FindFlags findFlags) final Result findStep(const QString &txt, FindFlags findFlags) final
{ {
QByteArray pattern = txt.toLatin1(); QByteArray pattern = m_codec->fromUnicode(txt);
bool wasReset = (m_incrementalStartPos < 0); bool wasReset = (m_incrementalStartPos < 0);
if (m_contPos == -1) { if (m_contPos == -1) {
m_contPos = m_widget->cursorPosition() + 1; m_contPos = m_widget->cursorPosition() + 1;
@@ -2063,7 +2079,9 @@ private:
qint64 m_incrementalStartPos = -1; qint64 m_incrementalStartPos = -1;
qint64 m_contPos = -1; // Only valid if last result was NotYetFound. qint64 m_contPos = -1; // Only valid if last result was NotYetFound.
bool m_incrementalWrappedState = false; bool m_incrementalWrappedState = false;
QByteArray m_lastPattern; QString m_lastText;
FindFlags m_lastFindFlags;
QTextCodec *m_codec;
}; };
@@ -2181,10 +2199,12 @@ public:
setWidget(m_widget); setWidget(m_widget);
setDuplicateSupported(true); setDuplicateSupported(true);
auto codecChooser = new CodecChooser(CodecChooser::Filter::SingleByte); auto codecChooser = new CodecChooser(CodecChooser::Filter::All);
codecChooser->prependNone(); codecChooser->prependNone();
connect(codecChooser, &CodecChooser::codecChanged, connect(codecChooser, &CodecChooser::codecChanged,
m_widget, &BinEditorWidget::setCodec); m_widget, &BinEditorWidget::setCodec);
m_widget->setCodec(codecChooser->currentCodec());
const QVariant setting = ICore::settings()->value(C_ENCODING_SETTING); const QVariant setting = ICore::settings()->value(C_ENCODING_SETTING);
if (!setting.isNull()) if (!setting.isNull())
codecChooser->setAssignedCodec(QTextCodec::codecForName(setting.toByteArray())); codecChooser->setAssignedCodec(QTextCodec::codecForName(setting.toByteArray()));
@@ -2230,6 +2250,10 @@ public:
auto aggregate = new Aggregation::Aggregate; auto aggregate = new Aggregation::Aggregate;
auto binEditorFind = new BinEditorFind(m_widget); auto binEditorFind = new BinEditorFind(m_widget);
connect(codecChooser, &CodecChooser::codecChanged,
binEditorFind, &BinEditorFind::setCodec);
binEditorFind->setCodec(codecChooser->currentCodec());
aggregate->add(binEditorFind); aggregate->add(binEditorFind);
aggregate->add(m_widget); aggregate->add(m_widget);
} }