forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
@@ -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;
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user