20#include "pedigree/kernel/debugger/Scrollable.h"
23void drawClippedString(
DebuggerIO* screen,
const char* text,
size_t row,
size_t column,
26 if (!text || column >= width) {
30 const size_t length = StringLength(text);
31 if (offset >= length) {
36 screen->
drawString(clipped, row, column, colour, bgColour);
39void drawScrolledString(
DebuggerIO* screen,
const char* text,
size_t row,
size_t left,
size_t right,
42 if (horizontalOffset < logicalColumn) {
43 drawClippedString(screen, text, row, left + logicalColumn - horizontalOffset, right, 0, colour,
46 drawClippedString(screen, text, row, left, right, horizontalOffset - logicalColumn, colour,
52Scrollable::Scrollable()
61Scrollable::~Scrollable() =
default;
63void Scrollable::move(
size_t x,
size_t y) {
68void Scrollable::resize(
size_t width,
size_t height) {
71 horizontalScrollTo(m_column);
74void Scrollable::scroll(ssize_t lines) {
77 if (m_line > (
static_cast<ssize_t
>(getLineCount()) -
static_cast<ssize_t
>(m_height)))
78 m_line =
static_cast<ssize_t
>(getLineCount()) -
static_cast<ssize_t
>(m_height);
84void Scrollable::scrollTo(
size_t absolute) {
87 if (m_line > (
static_cast<ssize_t
>(getLineCount()) -
static_cast<ssize_t
>(m_height)))
88 m_line =
static_cast<ssize_t
>(getLineCount()) -
static_cast<ssize_t
>(m_height);
94void Scrollable::scrollHorizontal(ssize_t columns) {
96 static_cast<size_t>(max(
static_cast<ssize_t
>(0),
static_cast<ssize_t
>(m_column) + columns)));
99void Scrollable::horizontalScrollTo(
size_t absolute) {
100 const ssize_t maxColumn = max(
static_cast<ssize_t
>(0),
static_cast<ssize_t
>(getContentWidth()) -
101 static_cast<ssize_t
>(m_width));
102 m_column = min(absolute,
static_cast<size_t>(maxColumn));
105void Scrollable::refresh(
DebuggerIO* pScreen) {
106 pScreen->disableRefreshes();
111 bool bCanScrollUp = (m_line > 0);
112 bool bCanScrollDown = ((m_line + m_height) < getLineCount());
115 ssize_t line = m_line;
116 for (
size_t i = 0; i < m_height; i++) {
120 if (line >= 0 && line <
static_cast<ssize_t
>(getLineCount())) {
124 const char* Line = getLine1(line, colour, bgColour);
125 drawScrolledString(pScreen, Line, m_y + i, m_x, m_x + m_width, 0, m_column, colour, bgColour);
127 colour = DebuggerIO::White;
128 bgColour = DebuggerIO::Black;
129 Line = getLine2(line, colOffset, colour, bgColour);
130 drawScrolledString(pScreen, Line, m_y + i, m_x, m_x + m_width, colOffset, m_column, colour,
137 char str[4] = {
'^',
' ', m_ScrollUp,
'\0'};
139 pScreen->
drawString(str, m_y, m_x + m_width - 3, DebuggerIO::White, DebuggerIO::Blue);
141 str[2] = m_ScrollDown;
143 pScreen->
drawString(str, m_y + m_height - 1, m_x + m_width - 3, DebuggerIO::White,
149void Scrollable::setScrollKeys(
char up,
char down) {
154ssize_t Scrollable::getLine() {
158void Scrollable::centreOn(
size_t line) {
159 if (line > getLineCount())
160 line = getLineCount();
162 if (line < m_height) {
167 scrollTo(line - (m_height / 2));
170size_t Scrollable::height()
const {
173size_t Scrollable::width()
const {
177size_t Scrollable::getContentWidth() {
virtual void enableRefreshes()=0
virtual void drawString(const char *str, size_t row, size_t col, Colour foreColour, Colour backColour)=0
virtual void drawHorizontalLine(char c, size_t row, size_t colStart, size_t colEnd, Colour foreColour, Colour backColour)=0