Skip to content

Commit

Permalink
GUI: Fix the caret drawing over the scroll bar in the list widget
Browse files Browse the repository at this point in the history
Also remove the unused linesWidth variable and fix the hlLeftPadding and
hlRightPadding widget attributes to actually work.

There are still issues remaining with the caret in the list widget due
to the ellipsis being used to shorten long text. Ellipsis is accounted
for when drawing the text but not when computing the caret position.
  • Loading branch information
bgK committed Jan 27, 2018
1 parent 5878c61 commit 7dc602f
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 29 deletions.
36 changes: 10 additions & 26 deletions gui/widgets/list.cpp
Expand Up @@ -37,7 +37,6 @@ ListWidget::ListWidget(Dialog *boss, const String &name, const char *tooltip, ui
: EditableWidget(boss, name, tooltip), _cmd(cmd) {

_scrollBar = NULL;
_textWidth = NULL;

// This ensures that _entriesPerPage is properly initialized.
reflowLayout();
Expand Down Expand Up @@ -69,7 +68,6 @@ ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h, const char *too
: EditableWidget(boss, x, y, w, h, tooltip), _cmd(cmd) {

_scrollBar = NULL;
_textWidth = NULL;

// This ensures that _entriesPerPage is properly initialized.
reflowLayout();
Expand Down Expand Up @@ -97,10 +95,6 @@ ListWidget::ListWidget(Dialog *boss, int x, int y, int w, int h, const char *too
_editColor = ThemeEngine::kFontColorNormal;
}

ListWidget::~ListWidget() {
delete[] _textWidth;
}

bool ListWidget::containsWidget(Widget *w) const {
if (w == _scrollBar || _scrollBar->containsWidget(w))
return true;
Expand Down Expand Up @@ -502,7 +496,6 @@ void ListWidget::drawWidget() {

// Draw a thin frame around the list.
g_gui.theme()->drawWidgetBackgroundClip(Common::Rect(_x, _y, _x + _w, _y + _h), getBossClipRect(), 0, ThemeEngine::kWidgetBackgroundBorder);
const int scrollbarW = (_scrollBar && _scrollBar->isVisible()) ? _scrollBarWidth : 0;

// Draw the list items
for (i = 0, pos = _currentPos; i < _entriesPerPage && pos < len; i++, pos++) {
Expand All @@ -520,13 +513,11 @@ void ListWidget::drawWidget() {
// If in numbering mode, we first print a number prefix
if (_numberingMode != kListNumberingOff) {
buffer = Common::String::format("%2d. ", (pos + _numberingMode));
g_gui.theme()->drawTextClip(Common::Rect(_x, y, _x + r.left + _leftPadding, y + fontHeight - 2), getBossClipRect(),
buffer, _state, Graphics::kTextAlignLeft, inverted, _leftPadding, true);
g_gui.theme()->drawTextClip(Common::Rect(_x + _hlLeftPadding, y, _x + r.left + _leftPadding, y + fontHeight - 2),
getBossClipRect(), buffer, _state, Graphics::kTextAlignLeft, inverted, _leftPadding, true);
pad = 0;
}

int width;

ThemeEngine::FontColor color = ThemeEngine::kFontColorNormal;

if (!_listColors.empty()) {
Expand All @@ -540,22 +531,21 @@ void ListWidget::drawWidget() {
buffer = _editString;
color = _editColor;
adjustOffset();
width = _w - r.left - _hlRightPadding - _leftPadding - scrollbarW;
g_gui.theme()->drawTextClip(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), getBossClipRect(), buffer, _state,
Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
g_gui.theme()->drawTextClip(Common::Rect(_x + r.left, y, _x + r.right, y + fontHeight - 2),
getBossClipRect(), buffer, _state,
Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
} else {
buffer = _list[pos];
width = _w - r.left - scrollbarW;
g_gui.theme()->drawTextClip(Common::Rect(_x + r.left, y, _x + r.left + width, y + fontHeight - 2), getBossClipRect(), buffer, _state,
Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
g_gui.theme()->drawTextClip(Common::Rect(_x + r.left, y, _x + r.right, y + fontHeight - 2),
getBossClipRect(), buffer, _state,
Graphics::kTextAlignLeft, inverted, pad, true, ThemeEngine::kFontStyleBold, color);
}

_textWidth[i] = width;
}
}

Common::Rect ListWidget::getEditRect() const {
Common::Rect r(_hlLeftPadding, 0, _w - _hlLeftPadding - _hlRightPadding, kLineHeight - 2);
const int scrollbarW = (_scrollBar && _scrollBar->isVisible()) ? _scrollBarWidth : 0;
Common::Rect r(_hlLeftPadding, 0, _w - _hlRightPadding - scrollbarW, kLineHeight - 2);
const int offset = (_selectedItem - _currentPos) * kLineHeight + _topPadding;
r.top += offset;
r.bottom += offset;
Expand Down Expand Up @@ -668,12 +658,6 @@ void ListWidget::reflowLayout() {
_entriesPerPage = fracToInt(entriesPerPage);
assert(_entriesPerPage > 0);

delete[] _textWidth;
_textWidth = new int[_entriesPerPage];

for (int i = 0; i < _entriesPerPage; i++)
_textWidth[i] = 0;

if (_scrollBar) {
_scrollBar->resize(_w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h);
scrollBarRecalc();
Expand Down
3 changes: 0 additions & 3 deletions gui/widgets/list.h
Expand Up @@ -87,7 +87,6 @@ class ListWidget : public EditableWidget {
public:
ListWidget(Dialog *boss, const String &name, const char *tooltip = 0, uint32 cmd = 0);
ListWidget(Dialog *boss, int x, int y, int w, int h, const char *tooltip = 0, uint32 cmd = 0);
virtual ~ListWidget();

virtual bool containsWidget(Widget *) const;
virtual Widget *findWidget(int x, int y);
Expand Down Expand Up @@ -149,8 +148,6 @@ class ListWidget : public EditableWidget {
void lostFocusWidget();
void checkBounds();
void scrollToCurrent();

int *_textWidth;
};

} // End of namespace GUI
Expand Down

0 comments on commit 7dc602f

Please sign in to comment.