Fix scrolling by scrollbar drag.
This commit is contained in:
parent
7135f3ed87
commit
081d1725af
2 changed files with 20 additions and 5 deletions
|
|
@ -53,21 +53,24 @@ void ElasticScrollBar::refreshGeometry() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto available = extSize - fullSkip;
|
const auto available = extSize - fullSkip;
|
||||||
const auto scale = [&](int value) {
|
|
||||||
return (available * value) / _state.fullSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
_area = _vertical
|
_area = _vertical
|
||||||
? QRect(skip, _st.deltat, thickness, available)
|
? QRect(skip, _st.deltat, thickness, available)
|
||||||
: QRect(_st.deltat, skip, available, thickness);
|
: QRect(_st.deltat, skip, available, thickness);
|
||||||
const auto barMin = std::min(st::scrollBarMin, available / 2);
|
const auto barMin = std::min(st::scrollBarMin, available / 2);
|
||||||
const auto barWanted = scale(_state.visibleTill - _state.visibleFrom);
|
const auto visibleHeight = _state.visibleTill - _state.visibleFrom;
|
||||||
|
const auto scrollableHeight = _state.fullSize - visibleHeight;
|
||||||
|
const auto barWanted = (available * visibleHeight) / _state.fullSize;
|
||||||
if (barWanted >= available) {
|
if (barWanted >= available) {
|
||||||
_bar = _area = QRect();
|
_bar = _area = QRect();
|
||||||
hide();
|
hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto bar = std::max(barMin, barWanted);
|
const auto bar = std::max(barMin, barWanted);
|
||||||
|
const auto outsideBar = available - bar;
|
||||||
|
|
||||||
|
const auto scale = [&](int value) {
|
||||||
|
return (outsideBar * value) / scrollableHeight;
|
||||||
|
};
|
||||||
const auto barFrom = scale(_state.visibleFrom);
|
const auto barFrom = scale(_state.visibleFrom);
|
||||||
const auto barTill = barFrom + bar;
|
const auto barTill = barFrom + bar;
|
||||||
const auto cutFrom = std::clamp(barFrom, 0, available - thickness);
|
const auto cutFrom = std::clamp(barFrom, 0, available - thickness);
|
||||||
|
|
@ -224,6 +227,16 @@ void ElasticScrollBar::leaveEventHook(QEvent *e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ElasticScrollBar::scaleToBar(int change) const {
|
||||||
|
const auto scrollable = _state.fullSize
|
||||||
|
- (_state.visibleTill - _state.visibleFrom);
|
||||||
|
const auto outsideBar = (_vertical ? _area.height() : _area.width())
|
||||||
|
- (_vertical ? _bar.height() : _bar.width());
|
||||||
|
return (outsideBar <= 0 || scrollable <= outsideBar)
|
||||||
|
? change
|
||||||
|
: (change * scrollable / outsideBar);
|
||||||
|
}
|
||||||
|
|
||||||
void ElasticScrollBar::mouseMoveEvent(QMouseEvent *e) {
|
void ElasticScrollBar::mouseMoveEvent(QMouseEvent *e) {
|
||||||
toggleOverBar(_bar.contains(e->pos()));
|
toggleOverBar(_bar.contains(e->pos()));
|
||||||
if (_dragging && !_bar.isEmpty()) {
|
if (_dragging && !_bar.isEmpty()) {
|
||||||
|
|
@ -231,6 +244,7 @@ void ElasticScrollBar::mouseMoveEvent(QMouseEvent *e) {
|
||||||
const auto delta = position - _dragPosition;
|
const auto delta = position - _dragPosition;
|
||||||
_dragPosition = position;
|
_dragPosition = position;
|
||||||
if (auto change = _vertical ? delta.y() : delta.x()) {
|
if (auto change = _vertical ? delta.y() : delta.x()) {
|
||||||
|
change = scaleToBar(change);
|
||||||
if (_dragOverscrollAccumulated * change < 0) {
|
if (_dragOverscrollAccumulated * change < 0) {
|
||||||
const auto overscroll = (change < 0)
|
const auto overscroll = (change < 0)
|
||||||
? std::max(_dragOverscrollAccumulated + change, 0)
|
? std::max(_dragOverscrollAccumulated + change, 0)
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ private:
|
||||||
void leaveEventHook(QEvent *e) override;
|
void leaveEventHook(QEvent *e) override;
|
||||||
void resizeEvent(QResizeEvent *e) override;
|
void resizeEvent(QResizeEvent *e) override;
|
||||||
|
|
||||||
|
[[nodiscard]] int scaleToBar(int change) const;
|
||||||
[[nodiscard]] bool barHighlighted() const;
|
[[nodiscard]] bool barHighlighted() const;
|
||||||
void toggleOver(bool over, anim::type animated = anim::type::normal);
|
void toggleOver(bool over, anim::type animated = anim::type::normal);
|
||||||
void toggleOverBar(bool over, anim::type animated = anim::type::normal);
|
void toggleOverBar(bool over, anim::type animated = anim::type::normal);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue