diff options
Diffstat (limited to 'gui')
-rw-r--r-- | gui/widgets/editable.cpp | 36 | ||||
-rw-r--r-- | gui/widgets/editable.h | 5 | ||||
-rw-r--r-- | gui/widgets/edittext.cpp | 2 | ||||
-rw-r--r-- | gui/widgets/list.cpp | 2 |
4 files changed, 36 insertions, 9 deletions
diff --git a/gui/widgets/editable.cpp b/gui/widgets/editable.cpp index 667850d6cc..6f550b5642 100644 --- a/gui/widgets/editable.cpp +++ b/gui/widgets/editable.cpp @@ -261,23 +261,45 @@ void EditableWidget::drawCaret(bool erase) { int x = editRect.left; int y = editRect.top; - x += getCaretOffset(); + const int caretOffset = getCaretOffset(); + x += caretOffset; - if (y < 0 || y + editRect.height() - 2 >= _h) + if (y < 0 || y + editRect.height() > _h) return; x += getAbsX(); y += getAbsY(); - g_gui.theme()->drawCaret(Common::Rect(x, y, x + 1, y + editRect.height() - 2), erase); + g_gui.theme()->drawCaret(Common::Rect(x, y, x + 1, y + editRect.height()), erase); if (erase) { + GUI::EditableWidget::String character; + int width; + if ((uint)_caretPos < _editString.size()) { - GUI::EditableWidget::String chr(_editString[_caretPos]); - int chrWidth = g_gui.getCharWidth(_editString[_caretPos], _font); + const byte chr = _editString[_caretPos]; + width = g_gui.getCharWidth(chr, _font); + character = chr; + const uint last = (_caretPos > 0) ? _editString[_caretPos - 1] : 0; - x += g_gui.getKerningOffset(last, _editString[_caretPos], _font); - g_gui.theme()->drawText(Common::Rect(x, y, x + chrWidth, y + editRect.height() - 2), chr, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea); + x += g_gui.getKerningOffset(last, chr, _font); + } else { + // We draw a fake space here to assure that removing the caret + // does not result in color glitches in case the edit rect is + // drawn with an inversion. + width = g_gui.getCharWidth(' ', _font); + character = " "; + } + + // TODO: Right now we manually prevent text from being drawn outside + // the edit area here. We might want to consider to use + // setTextDrawableArea for this. However, it seems that only + // EditTextWidget uses that but not ListWidget. Thus, one should check + // whether we can unify the drawing in the text area first to avoid + // possible glitches due to different methods used. + width = MIN(editRect.width() - caretOffset, width); + if (width > 0) { + g_gui.theme()->drawText(Common::Rect(x, y, x + width, y + editRect.height()), character, _state, Graphics::kTextAlignLeft, _inversion, 0, false, _font, ThemeEngine::kFontColorNormal, true, _textDrawableArea); } } diff --git a/gui/widgets/editable.h b/gui/widgets/editable.h index 4a18d5e689..63a1942311 100644 --- a/gui/widgets/editable.h +++ b/gui/widgets/editable.h @@ -78,6 +78,11 @@ protected: virtual void startEditMode() = 0; virtual void endEditMode() = 0; virtual void abortEditMode() = 0; + /** + * The area where text input is being made. This should exactly match the + * rect with which the actual edit string is drawn otherwise nasty + * graphics glitches when redrawing the caret can occur. + */ virtual Common::Rect getEditRect() const = 0; virtual int getCaretOffset() const; void drawCaret(bool erase); diff --git a/gui/widgets/edittext.cpp b/gui/widgets/edittext.cpp index 52527effd8..c54ca573ba 100644 --- a/gui/widgets/edittext.cpp +++ b/gui/widgets/edittext.cpp @@ -101,7 +101,7 @@ void EditTextWidget::drawWidget() { } Common::Rect EditTextWidget::getEditRect() const { - Common::Rect r(2 + _leftPadding, 2, _w - 2 - _leftPadding - _rightPadding, _h - 1); + Common::Rect r(2 + _leftPadding, 2, _w - 2 - _leftPadding - _rightPadding, _h); return r; } diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp index 8ecb31311f..8b8eb31db9 100644 --- a/gui/widgets/list.cpp +++ b/gui/widgets/list.cpp @@ -541,7 +541,7 @@ void ListWidget::drawWidget() { } Common::Rect ListWidget::getEditRect() const { - Common::Rect r(_hlLeftPadding, 0, _w - _hlLeftPadding - _hlRightPadding, kLineHeight - 1); + Common::Rect r(_hlLeftPadding, 0, _w - _hlLeftPadding - _hlRightPadding, kLineHeight - 2); const int offset = (_selectedItem - _currentPos) * kLineHeight + _topPadding; r.top += offset; r.bottom += offset; |