BinEditor: Fix crash when selecting "None" in codec chooser

The find support was unconditionally using the codec instance, but that
can be nullptr.

Amends d16d2d66a3

Change-Id: Ic1db3205e4a53de6ee031d134652e7f39ed1a18f
Reviewed-by: Artem Sokolovskii <artem.sokolovskii@qt.io>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Eike Ziller
2024-09-03 15:39:14 +02:00
parent c7c99d5bad
commit 5c159641e6

View File

@@ -249,6 +249,7 @@ public:
void setMarkup(const QList<Markup> &markup); void setMarkup(const QList<Markup> &markup);
void setNewWindowRequestAllowed(bool c) { m_canRequestNewWindow = c; } void setNewWindowRequestAllowed(bool c) { m_canRequestNewWindow = c; }
void setCodec(QTextCodec *codec); void setCodec(QTextCodec *codec);
QByteArray toByteArray(const QString &s) const;
void clearMarkup() { m_markup.clear(); } void clearMarkup() { m_markup.clear(); }
void addMarkup(quint64 a, quint64 l, const QColor &c, const QString &t) { m_markup.append(Markup(a, l, c, t)); } void addMarkup(quint64 a, quint64 l, const QColor &c, const QString &t) { m_markup.append(Markup(a, l, c, t)); }
@@ -1882,6 +1883,13 @@ void BinEditorWidget::setCodec(QTextCodec *codec)
viewport()->update(); viewport()->update();
} }
QByteArray BinEditorWidget::toByteArray(const QString &s) const
{
if (m_codec)
return m_codec->fromUnicode(s);
return s.toLatin1();
}
void BinEditorDocument::updateContents() void BinEditorDocument::updateContents()
{ {
m_oldData = m_data; m_oldData = m_data;
@@ -1967,8 +1975,8 @@ public:
{ {
m_lastText = txt; m_lastText = txt;
m_lastFindFlags = findFlags; m_lastFindFlags = findFlags;
m_widget->highlightSearchResults(m_codec->fromUnicode(txt), m_widget->highlightSearchResults(
Utils::textDocumentFlagsForFindFlags(findFlags)); m_widget->toByteArray(txt), Utils::textDocumentFlagsForFindFlags(findFlags));
} }
void clearHighlights() final void clearHighlights() final
@@ -1997,17 +2005,9 @@ 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 = m_codec->fromUnicode(txt); QByteArray pattern = m_widget->toByteArray(txt);
if (txt != m_lastText) if (txt != m_lastText)
resetIncrementalSearch(); // Because we don't search for nibbles. resetIncrementalSearch(); // Because we don't search for nibbles.
m_lastText = txt; m_lastText = txt;
@@ -2043,7 +2043,7 @@ public:
Result findStep(const QString &txt, FindFlags findFlags) final Result findStep(const QString &txt, FindFlags findFlags) final
{ {
QByteArray pattern = m_codec->fromUnicode(txt); QByteArray pattern = m_widget->toByteArray(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;
@@ -2081,7 +2081,6 @@ private:
bool m_incrementalWrappedState = false; bool m_incrementalWrappedState = false;
QString m_lastText; QString m_lastText;
FindFlags m_lastFindFlags; FindFlags m_lastFindFlags;
QTextCodec *m_codec;
}; };
@@ -2250,9 +2249,11 @@ 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, connect(
binEditorFind, &BinEditorFind::setCodec); codecChooser,
binEditorFind->setCodec(codecChooser->currentCodec()); &CodecChooser::codecChanged,
binEditorFind,
&BinEditorFind::rehighlightAll);
aggregate->add(binEditorFind); aggregate->add(binEditorFind);
aggregate->add(m_widget); aggregate->add(m_widget);