//----------------------------------------------------------------------------// void Scrollbar::setConfig(const float* const document_size, const float* const page_size, const float* const step_size, const float* const overlap_size, const float* const position) { const bool reset_max_position = d_endLockPosition && isAtEnd(); bool config_changed = false; bool position_changed = false; if (document_size && (d_documentSize != *document_size)) { d_documentSize = *document_size; config_changed = true; } if (page_size && (d_pageSize != *page_size)) { d_pageSize = *page_size; config_changed = true; } if (step_size && (d_stepSize != *step_size)) { d_stepSize = *step_size; config_changed = true; } if (overlap_size && (d_overlapSize != *overlap_size)) { d_overlapSize = *overlap_size; config_changed = true; } if (position) position_changed = setScrollPosition_impl(*position); else if (reset_max_position) position_changed = setScrollPosition_impl(getMaxScrollPosition()); // _always_ update the thumb to keep things in sync. (though this // can cause a double-trigger of EventScrollPositionChanged, which // also happens with setScrollPosition anyway). updateThumb(); // // Fire appropriate events based on actions we took. // if (config_changed) { WindowEventArgs args(this); onScrollConfigChanged(args); } if (position_changed) { WindowEventArgs args(this); onScrollPositionChanged(args); } }
//----------------------------------------------------------------------------// void Scrollbar::setScrollPosition(float position) { const bool modified = setScrollPosition_impl(position); updateThumb(); // notification if required if (modified) { WindowEventArgs args(this); onScrollPositionChanged(args); } }
void GUIScrollBar::scroll(float amount) { float newHandlePos = Math::clamp01(mHandleBtn->getHandlePos() - amount); float oldHandlePos = mHandleBtn->getHandlePos(); mHandleBtn->_setHandlePos(newHandlePos); if (oldHandlePos != mHandleBtn->getHandlePos()) { mHandleBtn->_markLayoutAsDirty(); if (!onScrollPositionChanged.empty()) onScrollPositionChanged(newHandlePos); } }
/************************************************************************* Set the current position of scroll bar within the document. *************************************************************************/ void Scrollbar::setScrollPosition(float position) { float old_pos = d_position; // max position is (docSize - pageSize), but must be at least 0 (in case doc size is very small) float max_pos = ceguimax((d_documentSize - d_pageSize), 0.0f); // limit position to valid range: 0 <= position <= max_pos d_position = (position >= 0) ? ((position <= max_pos) ? position : max_pos) : 0.0f; updateThumb(); // notification if required if (d_position != old_pos) { WindowEventArgs args(this); onScrollPositionChanged(args); } }
void GUIScrollBar::handleMoved(float handlePct) { if(!onScrollPositionChanged.empty()) onScrollPositionChanged(handlePct); }