7#include "xfa/fwl/cfwl_scrollbar.h"
13#include "xfa/fwl/cfwl_app.h"
14#include "xfa/fwl/cfwl_messagemouse.h"
15#include "xfa/fwl/cfwl_messagemousewheel.h"
16#include "xfa/fwl/cfwl_notedriver.h"
17#include "xfa/fwl/cfwl_themebackground.h"
18#include "xfa/fwl/cfwl_themepart.h"
19#include "xfa/fwl/ifwl_themeprovider.h"
25constexpr int kScrollbarElapsedMsecs = 500;
26constexpr float kMinThumbSize = 5.0f;
30CFWL_ScrollBar::CFWL_ScrollBar(CFWL_App* app,
56 DrawLowerTrack(pGraphics, matrix);
57 DrawUpperTrack(pGraphics, matrix);
58 DrawMinArrowBtn(pGraphics, matrix);
59 DrawMaxArrowBtn(pGraphics, matrix);
60 DrawThumb(pGraphics, matrix);
64 m_fTrackPos = fTrackPos;
65 m_ThumbRect
= CalcThumbButtonRect(m_ThumbRect);
66 m_MinTrackRect
= CalcMinTrackRect(m_MinTrackRect);
67 m_MaxTrackRect
= CalcMaxTrackRect(m_MaxTrackRect);
70bool CFWL_ScrollBar::DoScroll(CFWL_EventScroll::
Code dwCode,
float fPos) {
73 return OnScroll(dwCode, fPos);
129 : m_iThumbButtonState;
135void CFWL_ScrollBar::Layout() {
139 m_MinBtnRect
= CalcMinButtonRect();
140 m_MaxBtnRect
= CalcMaxButtonRect();
141 m_ThumbRect
= CalcThumbButtonRect(m_ThumbRect);
142 m_MinTrackRect
= CalcMinTrackRect(m_MinTrackRect);
143 m_MaxTrackRect
= CalcMaxTrackRect(m_MaxTrackRect);
146void CFWL_ScrollBar::CalcButtonLen() {
147 m_fButtonLen = IsVertical() ? m_ClientRect
.width : m_ClientRect
.height;
148 float fLength = IsVertical() ? m_ClientRect
.height : m_ClientRect
.width;
149 if (fLength < m_fButtonLen * 2) {
150 m_fButtonLen = fLength / 2;
157CFX_RectF CFWL_ScrollBar::CalcMinButtonRect() {
159 return CFX_RectF(m_ClientRect.TopLeft(), m_ClientRect
.width, m_fButtonLen);
160 return CFX_RectF(m_ClientRect.TopLeft(), m_fButtonLen, m_ClientRect
.height);
163CFX_RectF CFWL_ScrollBar::CalcMaxButtonRect() {
183 float fRange = m_fRangeMax - m_fRangeMin;
194 float fLength = IsVertical() ? rtClient
.height : rtClient
.width;
195 float fSize = m_fButtonLen;
196 fLength -= fSize * 2.0f;
200 float fThumbSize = fLength * fLength / (fRange + fLength);
201 fThumbSize =
std::max(fThumbSize, kMinThumbSize);
203 float fDiff =
std::max(fLength - fThumbSize, 0.0f);
204 float fTrackPos =
std::clamp(m_fTrackPos, m_fRangeMin, m_fRangeMax);
208 float iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange;
245 return CFX_RectF(rtMaxRect.TopLeft(), 0, 0);
258float CFWL_ScrollBar::GetTrackPointPos(
const CFX_PointF& point) {
260 float fRange = m_fRangeMax - m_fRangeMin;
264 fPos = fRange * diff.y /
267 fPos = fRange * diff.x /
271 fPos += m_fLastTrackPos;
272 return std::clamp(fPos, m_fRangeMin, m_fRangeMax);
275bool CFWL_ScrollBar::SendEvent() {
286 return m_ThumbRect.Contains(m_cpTrackPoint);
290 return m_ThumbRect.Contains(m_cpTrackPoint);
293 CFWL_EventScroll::
Code dwCode = m_iMouseWheel < 0
296 DoScroll(dwCode, m_fTrackPos);
301bool CFWL_ScrollBar::OnScroll(CFWL_EventScroll::
Code dwCode,
float fPos) {
302 CFWL_EventScroll ev(
this, dwCode, fPos);
310 CFWL_MessageMouse* pMsg =
static_cast<CFWL_MessageMouse*>(pMessage);
313 OnLButtonDown(pMsg->m_pos);
316 OnLButtonUp(pMsg->m_pos);
319 OnMouseMove(pMsg->m_pos);
328 auto* pMsg =
static_cast<CFWL_MessageMouseWheel*>(pMessage);
338void CFWL_ScrollBar::OnLButtonDown(
const CFX_PointF& point) {
345 m_cpTrackPoint = point;
346 m_fLastTrackPos = m_fTrackPos;
348 DoMouseDown(0, m_MinBtnRect, &m_iMinButtonState, point);
350 DoMouseDown(1, m_ThumbRect, &m_iThumbButtonState, point);
352 DoMouseDown(2, m_MaxBtnRect, &m_iMaxButtonState, point);
354 DoMouseDown(3, m_MinTrackRect, &m_iMinTrackState, point);
356 DoMouseDown(4, m_MaxTrackRect, &m_iMaxTrackState, point);
359 m_pTimer = std::make_unique<CFX_Timer>(GetFWLApp()->GetTimerHandler(),
this,
360 kScrollbarElapsedMsecs);
364void CFWL_ScrollBar::OnLButtonUp(
const CFX_PointF& point) {
366 m_bMouseDown =
false;
367 DoMouseUp(0, m_MinBtnRect, &m_iMinButtonState, point);
368 DoMouseUp(1, m_ThumbRect, &m_iThumbButtonState, point);
369 DoMouseUp(2, m_MaxBtnRect, &m_iMaxButtonState, point);
370 DoMouseUp(3, m_MinTrackRect, &m_iMinTrackState, point);
371 DoMouseUp(4, m_MaxTrackRect, &m_iMaxTrackState, point);
375void CFWL_ScrollBar::OnMouseMove(
const CFX_PointF& point) {
376 DoMouseMove(0, m_MinBtnRect, &m_iMinButtonState, point);
377 DoMouseMove(1, m_ThumbRect, &m_iThumbButtonState, point);
378 DoMouseMove(2, m_MaxBtnRect, &m_iMaxButtonState, point);
379 DoMouseMove(3, m_MinTrackRect, &m_iMinTrackState, point);
380 DoMouseMove(4, m_MaxTrackRect, &m_iMaxTrackState, point);
383void CFWL_ScrollBar::OnMouseLeave() {
384 DoMouseLeave(0, m_MinBtnRect, &m_iMinButtonState);
385 DoMouseLeave(1, m_ThumbRect, &m_iThumbButtonState);
386 DoMouseLeave(2, m_MaxBtnRect, &m_iMaxButtonState);
387 DoMouseLeave(3, m_MinTrackRect, &m_iMinTrackState);
388 DoMouseLeave(4, m_MaxTrackRect, &m_iMaxTrackState);
391void CFWL_ScrollBar::OnMouseWheel(
const CFX_Vector& delta) {
392 m_iMouseWheel = delta.y;
397void CFWL_ScrollBar::DoMouseDown(int32_t iItem,
410void CFWL_ScrollBar::DoMouseUp(int32_t iItem,
416 if (*pState == iNewState)
424void CFWL_ScrollBar::DoMouseMove(int32_t iItem,
431 if (*pState == iNewState)
436 }
else if ((2 == iItem) &&
438 m_fTrackPos = GetTrackPointPos(point);
443void CFWL_ScrollBar::DoMouseLeave(int32_t iItem,
453void CFWL_ScrollBar::DoMouseHover(int32_t iItem,
467 std::make_unique<CFX_Timer>(GetFWLApp()->GetTimerHandler(),
this, 0);
CFX_Matrix & operator=(const CFX_Matrix &other)=default
CFX_RectF & operator=(const CFX_RectF &other)=default
bool Contains(const PointType &p) const
constexpr CFX_RectF(float dst_left, float dst_top, float dst_width, float dst_height)
const CFX_Vector & delta() const
const MouseCommand m_dwCmd
CFX_VTemplate< int32_t > CFX_Vector
CFX_PTemplate< float > CFX_PointF