ScrollBar::ScrollBar() : currentValue_(0), maxValue_(1), stepSize_(0.1) { setOutlineColor(DEFAULT_OUTLINE_COLOR); setOutlineThickness(DEFAULT_OUTLINE_THICKNESS); scrollIndicator_ = new RectangularWidget(); scrollIndicator_->setSize({this->getSize().x, 4}); scrollIndicator_->setAnchor({0.5, 0.5}); scrollIndicator_->setParentAnchor({0.5, 0}); scrollIndicator_->setFillColor(sf::Color::Red); updateScrollIndicator(); addWidget(scrollIndicator_); scrollUpButton_ = new Button(); scrollUpButton_->signalLeftMouseButtonPressed.connect([this] { stepScroll(UP); }); scrollUpButton_->signalLeftMouseButtonHeld.connect([this] (float frameTimeInSeconds) { smoothScroll(UP, frameTimeInSeconds); }); // scrollUpButton_->setText("^"); scrollUpButton_->setSize(this->getSize()); scrollUpButton_->setOutlineThickness(1); scrollUpButton_->setOutlineColor(DEFAULT_OUTLINE_COLOR); addWidget(scrollUpButton_); scrollDownButton_ = new Button(); scrollDownButton_->signalLeftMouseButtonPressed.connect([this] { stepScroll(DOWN); }); scrollDownButton_->signalLeftMouseButtonHeld.connect([this] (float frameTimeInSeconds) { smoothScroll(DOWN, frameTimeInSeconds); }); // scrollDownButton_->setText("v"); scrollDownButton_->setSize(this->getSize()); scrollDownButton_->setOutlineThickness(1); scrollDownButton_->setOutlineColor(DEFAULT_OUTLINE_COLOR); scrollDownButton_->setAnchor({0, 1}); scrollDownButton_->setParentAnchor({0, 1}); addWidget(scrollDownButton_); }
void HFViewport::onTouchesMoved(const std::vector<Touch*>& pTouches, Event *pEvent) { if (notMove) { return; } CC_ASSERT(this->m_TargetNode); if( m_TargetNode == NULL ) return; vector<CCTouch*> tmpTouches; auto tmpIt = pTouches.begin(); while (tmpIt != pTouches.end()) { auto tmpTouch = dynamic_cast<CCTouch*>(*tmpIt); if (mFingerMap.find(tmpTouch->getID()) != mFingerMap.end()) { tmpTouches.push_back(tmpTouch); } ++tmpIt; } switch(tmpTouches.size()) { case 1: { CCTouch* ptouch = *tmpTouches.begin(); if (!m_bTouchMoved && !moveableCheck(ptouch)) { return; } CC_BREAK_IF(this->mTouchMode != TouchMode_Scroll); if (!mForceStopScroll && mMovable) { CCPoint newPoint, moveDistance; stepScroll(ptouch); m_tTouchTime = getNowTime(); newPoint = this->convertTouchToNodeSpace(ptouch); moveDistance = ccpSub(newPoint, m_tTouchPoint); if (!mIsProcessingScroll) { m_tTouchPoint = CCPointZero; } float dis = 0.0f; dis = sqrtf(moveDistance.x*moveDistance.x + moveDistance.y*moveDistance.y); if (fabs(convertDistanceFromPointToInch(dis)) < MOVE_INCH ) { //CCLOG("Invalid movement, distance = [%f, %f], disInch = %f", moveDistance.x, moveDistance.y); return; } if (!m_bTouchMoved) { moveDistance = CCPointZero; } m_tTouchPoint = newPoint; m_bTouchMoved = true; m_tScrollDistance = moveDistance; } } break; case 2: CC_BREAK_IF(this->mTouchMode != TouchMode_Zoom); do { CCTouch* objTouch1 = *tmpTouches.begin(); CCTouch* objTouch2 = tmpTouches.back(); stepZoom(objTouch1->getLocation(), objTouch2->getLocation()); } while(0); break; default: CCLOG("move:Touch not support with %d fingers", pTouches.size()); mFingerMap.clear(); } }
void ScrollBar::smoothScroll(float direction, float elapsedTimeInSeconds) { stepScroll(direction, elapsedTimeInSeconds * 20); }