From 39f362b0c06bffff612676b01958e8d0bb2dccb2 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Tue, 25 Oct 2016 11:06:12 +0200 Subject: [PATCH] textbox: fix round corners/scrollbar handling Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/be9143a511758d94ebdb3505a5ccd4f870421653 Author: vanhofen Date: 2016-10-25 (Tue, 25 Oct 2016) Origin message was: ------------------ - textbox: fix round corners/scrollbar handling --- src/gui/widget/textbox.cpp | 66 ++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/src/gui/widget/textbox.cpp b/src/gui/widget/textbox.cpp index 93358b8e4..a4f719240 100644 --- a/src/gui/widget/textbox.cpp +++ b/src/gui/widget/textbox.cpp @@ -296,9 +296,9 @@ void CTextBox::initFramesRel(void) if(m_nMode & SCROLL) { m_cFrameScrollRel.iX = m_cFrame.iWidth - SCROLL_FRAME_WIDTH; - m_cFrameScrollRel.iY = m_cFrameTextRel.iY; + m_cFrameScrollRel.iY = m_cFrameTextRel.iY + m_nBgRadius; m_cFrameScrollRel.iWidth = SCROLL_FRAME_WIDTH; - m_cFrameScrollRel.iHeight = m_cFrameTextRel.iHeight; + m_cFrameScrollRel.iHeight = m_cFrameTextRel.iHeight - 2*m_nBgRadius; } else { @@ -494,25 +494,44 @@ void CTextBox::refreshScroll(void) if( frameBuffer == NULL) return; + /* + FIXME: Find right conditions. + So long let's paint scrollbar background in every case + to avoid transparent spaces in scrollbar corners. + */ + if (1) + { + /* + Why we paint scrollbar background seperately? + So we have to reduce roundings from the left side of background. + */ + int BgRadiusType = CORNER_NONE; + if (m_nBgRadiusType == CORNER_ALL) + BgRadiusType = CORNER_RIGHT; + else if (m_nBgRadiusType == CORNER_TOP) + BgRadiusType = CORNER_TOP_RIGHT; + else if (m_nBgRadiusType == CORNER_BOTTOM) + BgRadiusType = CORNER_BOTTOM_RIGHT; + + frameBuffer->paintBoxRel(m_cFrameScrollRel.iX+m_cFrame.iX, m_cFrame.iY, + m_cFrameScrollRel.iWidth, m_cFrame.iHeight, + m_textBackgroundColor, m_nBgRadius, BgRadiusType); + } + if (m_nNrOfPages > 1) { frameBuffer->paintBoxRel(m_cFrameScrollRel.iX+m_cFrame.iX, m_cFrameScrollRel.iY+m_cFrame.iY, m_cFrameScrollRel.iWidth, m_cFrameScrollRel.iHeight, - COL_SCROLLBAR_PASSIVE_PLUS_0); - unsigned int marker_size = m_cFrameScrollRel.iHeight / m_nNrOfPages; - frameBuffer->paintBoxRel(m_cFrameScrollRel.iX + SCROLL_MARKER_BORDER+m_cFrame.iX, - m_cFrameScrollRel.iY + m_nCurrentPage * marker_size+m_cFrame.iY, + COL_SCROLLBAR_PASSIVE_PLUS_0, RADIUS_MIN); + unsigned int marker_size = (m_cFrameScrollRel.iHeight - 2*SCROLL_MARKER_BORDER) / m_nNrOfPages; + frameBuffer->paintBoxRel(m_cFrameScrollRel.iX + SCROLL_MARKER_BORDER + m_cFrame.iX, + m_cFrameScrollRel.iY + SCROLL_MARKER_BORDER + m_nCurrentPage * marker_size + m_cFrame.iY, m_cFrameScrollRel.iWidth - 2*SCROLL_MARKER_BORDER, - marker_size, COL_SCROLLBAR_ACTIVE_PLUS_0); + marker_size, COL_SCROLLBAR_ACTIVE_PLUS_0, RADIUS_MIN); m_has_scrolled = true; } else - { - frameBuffer->paintBoxRel(m_cFrameScrollRel.iX+m_cFrame.iX, m_cFrameScrollRel.iY+m_cFrame.iY, - m_cFrameScrollRel.iWidth, m_cFrameScrollRel.iHeight, - m_textBackgroundColor); m_has_scrolled = false; - } } //evaluate comparsion between old and current properties WITHOUT text contents, return true if found changes @@ -570,6 +589,12 @@ void CTextBox::refreshText(void) int dx = m_old_cText != m_cText || m_nNrOfPages>1 ? m_cFrameTextRel.iWidth : m_nMaxTextWidth; int dy = m_cFrameTextRel.iHeight; + //avoid artefacts in transparent cornes + /* + This happens, when text width is smaller then the radius width. + */ + dx = std::max(dx, 2*m_nBgRadius); + //find changes bool has_changed = hasChanged(&ax, &ay, &dx, &dy); @@ -604,10 +629,23 @@ void CTextBox::refreshText(void) bool allow_paint_bg = (m_old_cText != m_cText || has_changed || m_has_scrolled); if (m_nPaintBackground && !m_SaveScreen){ clearScreenBuffer(); - if (allow_paint_bg){ + if (allow_paint_bg) + { + /* + Why we paint scrollbar background seperately? + So we have to reduce roundings from the right side of background. + */ + int BgRadiusType = CORNER_NONE; + if (m_nBgRadiusType == CORNER_ALL) + BgRadiusType = CORNER_LEFT; + else if (m_nBgRadiusType == CORNER_TOP) + BgRadiusType = CORNER_TOP_LEFT; + else if (m_nBgRadiusType == CORNER_BOTTOM) + BgRadiusType = CORNER_BOTTOM_LEFT; + //TRACE("[CTextBox] %s paint bg %d\r\n", __FUNCTION__, __LINE__); //paint full background only on new text, otherwise paint required background - frameBuffer->paintBoxRel(ax, ay, dx, dy, m_textBackgroundColor, m_nBgRadius, m_nBgRadiusType); + frameBuffer->paintBoxRel(ax, ay, dx, dy, m_textBackgroundColor, m_nBgRadius, BgRadiusType); } } else{