Chromium Code Reviews| Index: xfa/fwl/core/ifwl_scrollbar.cpp |
| diff --git a/xfa/fwl/core/ifwl_scrollbar.cpp b/xfa/fwl/core/ifwl_scrollbar.cpp |
| index c651abecb19894ecc3ccf41a7f4af615930017c7..251de8d66b744d39fd20449f1e3b369a223c6cff 100644 |
| --- a/xfa/fwl/core/ifwl_scrollbar.cpp |
| +++ b/xfa/fwl/core/ifwl_scrollbar.cpp |
| @@ -59,30 +59,29 @@ FWL_Type IFWL_ScrollBar::GetClassID() const { |
| } |
| void IFWL_ScrollBar::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) { |
| - if (bAutoSize) { |
| - rect.Set(0, 0, 0, 0); |
| - FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>( |
| - GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth)); |
| - if (!pfMinWidth) |
| - return; |
| - if (IsVertical()) { |
| - rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3); |
| - } else { |
| - rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth)); |
| - } |
| - IFWL_Widget::GetWidgetRect(rect, true); |
| - } else { |
| + if (!bAutoSize) { |
| rect = m_pProperties->m_rtWidget; |
| + return; |
| } |
| + |
| + rect.Set(0, 0, 0, 0); |
| + FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>( |
| + GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth)); |
| + if (!pfMinWidth) |
| + return; |
| + if (IsVertical()) |
| + rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3); |
| + else |
| + rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth)); |
| + IFWL_Widget::GetWidgetRect(rect, true); |
| } |
| void IFWL_ScrollBar::Update() { |
| - if (IsLocked()) { |
| + if (IsLocked()) |
| return; |
| - } |
| - if (!m_pProperties->m_pThemeProvider) { |
| + if (!m_pProperties->m_pThemeProvider) |
| m_pProperties->m_pThemeProvider = GetAvailableTheme(); |
| - } |
| + |
| Layout(); |
| } |
| @@ -92,13 +91,12 @@ void IFWL_ScrollBar::DrawWidget(CFX_Graphics* pGraphics, |
| return; |
| if (!m_pProperties->m_pThemeProvider) |
| return; |
| + |
| IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider; |
| - if (HasBorder()) { |
| + if (HasBorder()) |
| DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix); |
| - } |
| - if (HasEdge()) { |
| + if (HasEdge()) |
| DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix); |
| - } |
| DrawTrack(pGraphics, pTheme, true, pMatrix); |
| DrawTrack(pGraphics, pTheme, false, pMatrix); |
| DrawArrowBtn(pGraphics, pTheme, true, pMatrix); |
| @@ -148,9 +146,8 @@ void IFWL_ScrollBar::DrawArrowBtn(CFX_Graphics* pGraphics, |
| param.m_pGraphics = pGraphics; |
| param.m_matrix.Concat(*pMatrix); |
| param.m_rtPart = bMinBtn ? m_rtMinBtn : m_rtMaxBtn; |
| - if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0) { |
| + if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0) |
| pTheme->DrawBackground(¶m); |
| - } |
| } |
| void IFWL_ScrollBar::DrawThumb(CFX_Graphics* pGraphics, |
| @@ -225,54 +222,45 @@ void IFWL_ScrollBar::CalcThumbButtonRect(CFX_RectF& rect) { |
| m_rtThumb.Empty(); |
| return; |
| } |
| + |
| FX_FLOAT fRange = m_fRangeMax - m_fRangeMin; |
| memset(&rect, 0, sizeof(CFX_Rect)); |
| if (fRange < 0) { |
| - if (IsVertical()) { |
| + if (IsVertical()) |
| rect.Set(m_rtClient.left, m_rtMaxBtn.bottom(), m_rtClient.width, 0); |
| - } else { |
| + else |
| rect.Set(m_rtMaxBtn.right(), m_rtClient.top, 0, m_rtClient.height); |
| - } |
| return; |
| } |
| + |
| CFX_RectF rtClient = m_rtClient; |
| FX_FLOAT fLength = IsVertical() ? rtClient.height : rtClient.width; |
| FX_FLOAT fSize = m_fButtonLen; |
| if (m_bCustomLayout) { |
| if (IsVertical()) { |
| fLength = fLength - m_rtMinBtn.height - m_rtMaxBtn.height; |
| - if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height) { |
| + if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height) |
| fLength = 0.0f; |
| - } |
| } else { |
| fLength = fLength - m_rtMinBtn.width - m_rtMaxBtn.width; |
| - if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width) { |
| + if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width) |
| fLength = 0.0f; |
| - } |
| } |
| } else { |
| fLength -= fSize * 2.0f; |
| - if (fLength < fSize) { |
| + if (fLength < fSize) |
| fLength = 0.0f; |
| - } |
| } |
| + |
| FX_FLOAT fThumbSize = fLength * fLength / (fRange + fLength); |
| - if (fThumbSize < m_fMinThumb) { |
| - fThumbSize = m_fMinThumb; |
| - } |
| - FX_FLOAT fDiff = fLength - fThumbSize; |
| - if (fDiff < 0.0f) { |
| - fDiff = 0.0f; |
| - } |
| - FX_FLOAT fTrackPos = m_fTrackPos; |
| - if (fTrackPos > m_fRangeMax) { |
| - fTrackPos = m_fRangeMax; |
| - } |
| - if (fTrackPos < m_fRangeMin) { |
| - fTrackPos = m_fRangeMin; |
| - } |
| + fThumbSize = std::max(fThumbSize, m_fMinThumb); |
| + |
| + FX_FLOAT fDiff = std::max(fLength - fThumbSize, 0.0f); |
| + FX_FLOAT fTrackPos = |
| + std::min(std::max(m_fTrackPos, m_fRangeMin), m_fRangeMax); |
|
npm
2016/11/16 20:57:54
Shoudln't this be:
std::max(std::min(m_fRangeMax,
dsinclair
2016/11/16 21:31:27
Done.
|
| if (!fRange) |
| return; |
| + |
| if (m_bCustomLayout) { |
| FX_FLOAT iPos = fDiff * (fTrackPos - m_fRangeMin) / fRange; |
| rect.left = rtClient.left; |
| @@ -300,13 +288,13 @@ void IFWL_ScrollBar::CalcThumbButtonRect(CFX_RectF& rect) { |
| } else { |
| FX_FLOAT iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange; |
| rect.left = rtClient.left; |
| - if (!IsVertical()) { |
| + if (!IsVertical()) |
| rect.left += iPos; |
| - } |
| + |
| rect.top = rtClient.top; |
| - if (IsVertical()) { |
| + if (IsVertical()) |
| rect.top += iPos; |
| - } |
| + |
| rect.width = IsVertical() ? rtClient.width : fThumbSize; |
| rect.height = IsVertical() ? fThumbSize : rtClient.height; |
| } |
| @@ -317,6 +305,7 @@ void IFWL_ScrollBar::CalcMinTrackRect(CFX_RectF& rect) { |
| rect.Empty(); |
| return; |
| } |
| + |
| FX_FLOAT fBottom = m_rtThumb.bottom(); |
| FX_FLOAT fRight = m_rtThumb.right(); |
| FX_FLOAT ix = (m_rtThumb.left + fRight) / 2; |
| @@ -326,22 +315,21 @@ void IFWL_ScrollBar::CalcMinTrackRect(CFX_RectF& rect) { |
| bool bVertical = IsVertical(); |
| rect.width = bVertical ? m_rtClient.width : ix; |
| rect.height = bVertical ? iy : m_rtClient.height; |
| - if (m_bCustomLayout) { |
| - if (bVertical) { |
| - if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) { |
| - rect.top = m_rtClient.top; |
| - } else if (m_rtMinBtn.top < m_rtThumb.top) { |
| - rect.top = m_rtMinBtn.bottom(); |
| - rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top); |
| - } |
| - } else { |
| - if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) { |
| - rect.left = m_rtClient.left; |
| - } else if (m_rtMinBtn.left < m_rtThumb.left) { |
| - rect.left = m_rtMinBtn.right(); |
| - rect.width -= (m_rtMinBtn.right() - m_rtClient.left); |
| - } |
| + if (!m_bCustomLayout) |
| + return; |
| + |
| + if (bVertical) { |
| + if (m_rtMinBtn.height == 0 && m_rtMaxBtn.height == 0) { |
| + rect.top = m_rtClient.top; |
| + } else if (m_rtMinBtn.top < m_rtThumb.top) { |
| + rect.top = m_rtMinBtn.bottom(); |
| + rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top); |
| } |
| + } else if (m_rtMinBtn.width == 0 && m_rtMaxBtn.width == 0) { |
| + rect.left = m_rtClient.left; |
| + } else if (m_rtMinBtn.left < m_rtThumb.left) { |
| + rect.left = m_rtMinBtn.right(); |
| + rect.width -= (m_rtMinBtn.right() - m_rtClient.left); |
| } |
| } |
| @@ -350,6 +338,7 @@ void IFWL_ScrollBar::CalcMaxTrackRect(CFX_RectF& rect) { |
| rect.Empty(); |
| return; |
| } |
| + |
| FX_FLOAT ix = (m_rtThumb.left + m_rtThumb.right()) / 2; |
| FX_FLOAT iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2; |
| bool bVertical = IsVertical(); |
| @@ -357,22 +346,21 @@ void IFWL_ScrollBar::CalcMaxTrackRect(CFX_RectF& rect) { |
| rect.top = bVertical ? iy : m_rtClient.top; |
| rect.width = bVertical ? m_rtClient.width : m_rtClient.right() - ix; |
| rect.height = bVertical ? m_rtClient.bottom() - iy : m_rtClient.height; |
| - if (m_bCustomLayout) { |
| - if (bVertical) { |
| - if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 && |
| - m_rtMaxBtn.height > 0) { |
| - rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top); |
| - } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) { |
| - rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top); |
| - } |
| - } else { |
| - if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 && |
| - m_rtMaxBtn.width > 0) { |
| - rect.width -= (m_rtClient.right() - m_rtMinBtn.left); |
| - } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) { |
| - rect.width -= (m_rtClient.right() - m_rtMaxBtn.left); |
| - } |
| + if (!m_bCustomLayout) |
| + return; |
| + |
| + if (bVertical) { |
| + if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 && |
| + m_rtMaxBtn.height > 0) { |
| + rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top); |
| + } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) { |
| + rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top); |
| } |
| + } else if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 && |
| + m_rtMaxBtn.width > 0) { |
| + rect.width -= (m_rtClient.right() - m_rtMinBtn.left); |
| + } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) { |
| + rect.width -= (m_rtClient.right() - m_rtMaxBtn.left); |
| } |
| } |
| @@ -383,7 +371,7 @@ FX_FLOAT IFWL_ScrollBar::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) { |
| FX_FLOAT fPos; |
| if (m_bCustomLayout) { |
| if (IsVertical()) { |
| - if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) { |
| + if (m_rtMinBtn.height == 0 && m_rtMaxBtn.height == 0) { |
| fPos = fRange * fDiffY / (m_rtClient.height - m_rtThumb.height); |
| } else if (m_rtMinBtn.bottom() == m_rtMaxBtn.top) { |
| fPos = fRange * fDiffY / |
| @@ -393,7 +381,7 @@ FX_FLOAT IFWL_ScrollBar::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) { |
| (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height); |
| } |
| } else { |
| - if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) { |
| + if (m_rtMinBtn.width == 0 && m_rtMaxBtn.width == 0) { |
| fPos = fRange * fDiffX / (m_rtClient.width - m_rtThumb.width); |
| } else if (m_rtMinBtn.right() == m_rtMaxBtn.left) { |
| fPos = fRange * fDiffX / |
| @@ -413,51 +401,47 @@ FX_FLOAT IFWL_ScrollBar::GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy) { |
| } |
| } |
| fPos += m_fLastTrackPos; |
| - if (fPos < m_fRangeMin) { |
| - fPos = m_fRangeMin; |
| - } |
| - if (fPos > m_fRangeMax) { |
| - fPos = m_fRangeMax; |
| - } |
| - return fPos; |
| + return std::min(std::max(fPos, m_fRangeMin), m_fRangeMax); |
| } |
| void IFWL_ScrollBar::GetTrackRect(CFX_RectF& rect, bool bLower) { |
| bool bDisabled = !!(m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled); |
| if (bDisabled || m_bCustomLayout) { |
| rect = bLower ? m_rtMinTrack : m_rtMaxTrack; |
| - } else { |
| - FX_FLOAT fW = m_rtThumb.width / 2; |
| - FX_FLOAT fH = m_rtThumb.height / 2; |
| - bool bVert = IsVertical(); |
| - if (bLower) { |
| - if (bVert) { |
| - FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height; |
| - fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f; |
| - rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height, |
| - m_rtMinTrack.width, fMinTrackHeight); |
| - } else { |
| - FX_FLOAT fMinTrackWidth = |
| - m_rtMinTrack.width - fW - m_rtMinBtn.width + 2; |
| - fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f; |
| - rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top, |
| - fMinTrackWidth, m_rtMinTrack.height); |
| - } |
| - } else { |
| - if (bVert) { |
| - FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height; |
| - fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f; |
| - rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width, |
| - fMaxTrackHeight); |
| - } else { |
| - FX_FLOAT fMaxTrackWidth = |
| - m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2; |
| - fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f; |
| - rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth, |
| - m_rtMaxTrack.height); |
| - } |
| + return; |
| + } |
| + |
| + FX_FLOAT fW = m_rtThumb.width / 2; |
| + FX_FLOAT fH = m_rtThumb.height / 2; |
| + bool bVert = IsVertical(); |
| + if (bLower) { |
| + if (bVert) { |
| + FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height; |
| + fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f; |
| + rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height, |
| + m_rtMinTrack.width, fMinTrackHeight); |
| + return; |
| } |
| + |
| + FX_FLOAT fMinTrackWidth = m_rtMinTrack.width - fW - m_rtMinBtn.width + 2; |
| + fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f; |
| + rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top, |
| + fMinTrackWidth, m_rtMinTrack.height); |
| + return; |
| + } |
| + |
| + if (bVert) { |
| + FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height; |
| + fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f; |
| + rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width, |
| + fMaxTrackHeight); |
| + return; |
| } |
| + |
| + FX_FLOAT fMaxTrackWidth = m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2; |
| + fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f; |
| + rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth, |
| + m_rtMaxTrack.height); |
| } |
| bool IFWL_ScrollBar::SendEvent() { |
| @@ -601,6 +585,7 @@ void IFWL_ScrollBar::DoMouseDown(int32_t iItem, |
| return; |
| if (iState == CFWL_PartState_Pressed) |
| return; |
| + |
| iState = CFWL_PartState_Pressed; |
| Repaint(&rtItem); |
| } |