Terminal: Fix "flicker" while searching

Previously the search results would be removed every
time the terminal updates before the new hits were
resolved.

This patch fixed that by keeping the old hits until the
new hits are found.

To not keep old hits around when the terminal is cleared
a signal is introduced that the SearchableTerminal can connect
to and clear its Hits immediately.

Fixes: QTCREATORBUG-32066
Change-Id: If0bcf133098f06df53b52aae9b1036f0bc58870d
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-11-26 09:08:36 +01:00
parent 66e465420f
commit 2b7b8ef5a9
6 changed files with 23 additions and 7 deletions

View File

@@ -120,6 +120,7 @@ struct TerminalSurfacePrivate
}; };
m_vtermScreenCallbacks.sb_clear = [](void *user) { m_vtermScreenCallbacks.sb_clear = [](void *user) {
auto p = static_cast<TerminalSurfacePrivate *>(user); auto p = static_cast<TerminalSurfacePrivate *>(user);
emit p->q->cleared();
return p->sb_clear(); return p->sb_clear();
}; };
m_vtermScreenCallbacks.bell = [](void *user) { m_vtermScreenCallbacks.bell = [](void *user) {

View File

@@ -111,6 +111,7 @@ signals:
void cursorChanged(Cursor oldCursor, Cursor newCursor); void cursorChanged(Cursor oldCursor, Cursor newCursor);
void altscreenChanged(bool altScreen); void altscreenChanged(bool altScreen);
void unscroll(); void unscroll();
void cleared();
private: private:
std::unique_ptr<TerminalSurfacePrivate> d; std::unique_ptr<TerminalSurfacePrivate> d;

View File

@@ -176,6 +176,7 @@ TerminalSurface *TerminalView::surface() const
void TerminalView::setupSurface() void TerminalView::setupSurface()
{ {
d->m_surface = std::make_unique<TerminalSurface>(QSize{80, 60}); d->m_surface = std::make_unique<TerminalSurface>(QSize{80, 60});
connect(d->m_surface.get(), &TerminalSurface::cleared, this, &TerminalView::cleared);
if (d->m_surfaceIntegration) if (d->m_surfaceIntegration)
d->m_surface->setSurfaceIntegration(d->m_surfaceIntegration); d->m_surface->setSurfaceIntegration(d->m_surfaceIntegration);

View File

@@ -224,6 +224,9 @@ protected:
private: private:
void scheduleViewportUpdate(); void scheduleViewportUpdate();
signals:
void cleared();
private: private:
std::unique_ptr<TerminalViewPrivate> d; std::unique_ptr<TerminalViewPrivate> d;
}; };

View File

@@ -47,6 +47,18 @@ void TerminalSearch::setSearchString(const QString &searchString, FindFlags find
} }
} }
void TerminalSearch::clearAndSearchAgain()
{
if (!m_hits.isEmpty()) {
m_hits.clear();
m_currentHit = -1;
emit hitsChanged();
emit currentHitChanged();
}
m_debounceTimer.start();
}
void TerminalSearch::nextHit() void TerminalSearch::nextHit()
{ {
if (m_hits.isEmpty()) if (m_hits.isEmpty())
@@ -67,13 +79,6 @@ void TerminalSearch::previousHit()
void TerminalSearch::updateHits() void TerminalSearch::updateHits()
{ {
if (!m_hits.isEmpty()) {
m_hits.clear();
m_currentHit = -1;
emit hitsChanged();
emit currentHitChanged();
}
m_debounceTimer.start(); m_debounceTimer.start();
} }
@@ -282,6 +287,10 @@ SearchableTerminal::SearchableTerminal(QWidget *parent)
m_aggregate->add(this); m_aggregate->add(this);
surfaceChanged(); surfaceChanged();
connect(this, &TerminalSolution::TerminalView::cleared, this, [this] {
m_search->clearAndSearchAgain();
});
} }
SearchableTerminal::~SearchableTerminal() = default; SearchableTerminal::~SearchableTerminal() = default;

View File

@@ -25,6 +25,7 @@ public:
void setCurrentSelection(std::optional<SearchHitWithText> selection); void setCurrentSelection(std::optional<SearchHitWithText> selection);
void setSearchString(const QString &searchString, Utils::FindFlags findFlags); void setSearchString(const QString &searchString, Utils::FindFlags findFlags);
void clearAndSearchAgain();
void nextHit(); void nextHit();
void previousHit(); void previousHit();