Fix console not keeping scroll position when backlog is full

The console was not keeping its current scoll position if entries from the backlog are removed due to being recycled when new entries are added. For this purpose, a callback function is added to the ringbuffer to handle popped items, so the scrolling position of the console can be updated based on the number of lines of the removed backlog entries.
This commit is contained in:
Robert Müller 2024-04-21 12:48:41 +02:00
parent 151b2854e3
commit fbe559ea79
3 changed files with 31 additions and 1 deletions

View file

@ -123,11 +123,21 @@ void *CRingBufferBase::Allocate(int Size)
return (void *)(pBlock + 1);
}
void CRingBufferBase::SetPopCallback(std::function<void(void *pCurrent)> PopCallback)
{
m_PopCallback = std::move(PopCallback);
}
int CRingBufferBase::PopFirst()
{
if(m_pConsume->m_Free)
return 0;
if(m_PopCallback)
{
m_PopCallback(m_pConsume + 1);
}
// set the free flag
m_pConsume->m_Free = 1;

View file

@ -5,6 +5,8 @@
#include <base/system.h>
#include <functional>
class CRingBufferBase
{
class CItem
@ -25,6 +27,8 @@ class CRingBufferBase
int m_Size;
int m_Flags;
std::function<void(void *pCurrent)> m_PopCallback = nullptr;
CItem *NextBlock(CItem *pItem);
CItem *PrevBlock(CItem *pItem);
CItem *MergeBack(CItem *pItem);
@ -39,6 +43,7 @@ protected:
void Init(void *pMemory, int Size, int Flags);
int PopFirst();
void SetPopCallback(const std::function<void(void *pCurrent)> PopCallback);
public:
enum
@ -55,6 +60,12 @@ class CTypedRingBuffer : public CRingBufferBase
public:
T *Allocate(int Size) { return (T *)CRingBufferBase::Allocate(Size); }
int PopFirst() { return CRingBufferBase::PopFirst(); }
void SetPopCallback(std::function<void(T *pCurrent)> PopCallback)
{
CRingBufferBase::SetPopCallback([PopCallback](void *pCurrent) {
PopCallback((T *)pCurrent);
});
}
T *Prev(T *pCurrent) { return (T *)CRingBufferBase::Prev(pCurrent); }
T *Next(T *pCurrent) { return (T *)CRingBufferBase::Next(pCurrent); }

View file

@ -208,6 +208,13 @@ CGameConsole::CInstance::CInstance(int Type)
m_IsCommand = false;
m_Backlog.SetPopCallback([this](CBacklogEntry *pEntry) {
if(pEntry->m_LineCount != -1)
{
m_NewLineCounter -= pEntry->m_LineCount;
}
});
m_Input.SetClipboardLineCallback([this](const char *pStr) { ExecuteLine(pStr); });
m_CurrentMatchIndex = -1;
@ -1135,7 +1142,7 @@ void CGameConsole::OnRender()
}
pConsole->PumpBacklogPending();
if(pConsole->m_NewLineCounter > 0)
if(pConsole->m_NewLineCounter != 0)
{
pConsole->UpdateSearch();
@ -1145,6 +1152,8 @@ void CGameConsole::OnRender()
pConsole->m_BacklogCurLine += pConsole->m_NewLineCounter;
pConsole->m_BacklogLastActiveLine += pConsole->m_NewLineCounter;
}
if(pConsole->m_NewLineCounter < 0)
pConsole->m_NewLineCounter = 0;
}
// render console log (current entry, status, wrap lines)