Skip to content

Commit

Permalink
Removed Q_OBJECT from ScrollArea.
Browse files Browse the repository at this point in the history
  • Loading branch information
23rd committed Sep 29, 2021
1 parent b64f68d commit 7182fad
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 52 deletions.
12 changes: 10 additions & 2 deletions ui/layers/box_content.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#include "styles/style_layers.h"
#include "styles/palette.h"

#include <QtCore/QTimer>

namespace Ui {

void BoxContent::setTitle(rpl::producer<QString> title) {
Expand Down Expand Up @@ -85,8 +87,14 @@ void BoxContent::finishScrollCreate() {
_scroll->show();
}
updateScrollAreaGeometry();
connect(_scroll, SIGNAL(scrolled()), this, SLOT(onScroll()));
connect(_scroll, SIGNAL(innerResized()), this, SLOT(onInnerResize()));
_scroll->scrolls(
) | rpl::start_with_next([=] {
onScroll();
}, lifetime());
_scroll->innerResizes(
) | rpl::start_with_next([=] {
onInnerResize();
}, lifetime());
}

void BoxContent::scrollToWidget(not_null<QWidget*> widget) {
Expand Down
5 changes: 4 additions & 1 deletion ui/widgets/inner_dropdown.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ InnerDropdown::InnerDropdown(
, _roundRect(ImageRoundRadius::Small, _st.bg)
, _hideTimer([=] { hideAnimated(); })
, _scroll(this, _st.scroll) {
connect(_scroll, &ScrollArea::scrolled, [=] { scrolled(); });
_scroll->scrolls(
) | rpl::start_with_next([=] {
scrolled();
}, lifetime());

hide();

Expand Down
55 changes: 30 additions & 25 deletions ui/widgets/scroll_area.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ ScrollBar::ScrollBar(ScrollArea *parent, bool vert, const style::ScrollArea *st)
recountSize();

connect(_connected, &QAbstractSlider::valueChanged, [=] {
area()->onScrolled();
area()->scrolled();
updateBar();
});
connect(_connected, &QAbstractSlider::rangeChanged, [=] {
area()->onInnerResized();
area()->innerResized();
updateBar();
});

Expand Down Expand Up @@ -266,15 +266,13 @@ void ScrollBar::mousePressEvent(QMouseEvent *e) {
}

area()->setMovingByScrollBar(true);
area()->scrollStarted();
}

void ScrollBar::mouseReleaseEvent(QMouseEvent *e) {
if (_moving) {
setMoving(false);

area()->setMovingByScrollBar(false);
area()->scrollFinished();
}
if (!_over) {
setMouseTracking(false);
Expand Down Expand Up @@ -306,7 +304,7 @@ ScrollArea::ScrollArea(QWidget *parent, const style::ScrollArea &st, bool handle
((data.type == ScrollShadow::Type::Top)
? _topShadow
: _bottomShadow)->changeVisibility(data.visible);
}, _lifetime);
}, lifetime());

_verticalBar->updateBar(true);

Expand All @@ -324,9 +322,8 @@ ScrollArea::ScrollArea(QWidget *parent, const style::ScrollArea &st, bool handle

if (_touchEnabled) {
viewport()->setAttribute(Qt::WA_AcceptTouchEvents);
_touchTimer.setSingleShot(true);
connect(&_touchTimer, SIGNAL(timeout()), this, SLOT(onTouchTimer()));
connect(&_touchScrollTimer, SIGNAL(timeout()), this, SLOT(onTouchScrollTimer()));
_touchTimer.setCallback([=] { _touchRightButton = true; });
_touchScrollTimer.setCallback([=] { touchScrollTimer(); });
}
}

Expand All @@ -337,7 +334,7 @@ void ScrollArea::touchDeaccelerate(int32 elapsed) {
_touchSpeed.setY((y == 0) ? y : (y > 0) ? qMax(0, y - elapsed) : qMin(0, y + elapsed));
}

void ScrollArea::onScrolled() {
void ScrollArea::scrolled() {
if (const auto inner = widget()) {
SendPendingMoveResizeEvents(inner);
}
Expand Down Expand Up @@ -369,15 +366,15 @@ void ScrollArea::onScrolled() {
}
}
if (em) {
scrolled();
_scrolls.fire({});
if (!_movingByScrollBar) {
SendSynteticMouseEvent(this, QEvent::MouseMove, Qt::NoButton);
}
}
}

void ScrollArea::onInnerResized() {
innerResized();
void ScrollArea::innerResized() {
_innerResizes.fire({});
}

int ScrollArea::scrollWidth() const {
Expand Down Expand Up @@ -406,11 +403,7 @@ int ScrollArea::scrollTop() const {
return _verticalValue;
}

void ScrollArea::onTouchTimer() {
_touchRightButton = true;
}

void ScrollArea::onTouchScrollTimer() {
void ScrollArea::touchScrollTimer() {
auto nowTime = crl::now();
if (_touchScrollState == TouchScrollState::Acceleration && _touchWaitingAcceleration && (nowTime - _touchAccelerationTime) > 40) {
_touchScrollState = TouchScrollState::Manual;
Expand All @@ -423,7 +416,7 @@ void ScrollArea::onTouchScrollTimer() {
if (_touchSpeed.isNull() || !hasScrolled) {
_touchScrollState = TouchScrollState::Manual;
_touchScroll = false;
_touchScrollTimer.stop();
_touchScrollTimer.cancel();
} else {
_touchTime = nowTime;
}
Expand Down Expand Up @@ -518,7 +511,7 @@ void ScrollArea::touchEvent(QTouchEvent *e) {
_touchStart = _touchPos;
} else {
_touchScroll = false;
_touchTimer.start(QApplication::startDragTime());
_touchTimer.callOnce(QApplication::startDragTime());
}
_touchStart = _touchPrevPos = _touchPos;
_touchRightButton = false;
Expand All @@ -527,7 +520,7 @@ void ScrollArea::touchEvent(QTouchEvent *e) {
case QEvent::TouchUpdate: {
if (!_touchPress) return;
if (!_touchScroll && (_touchPos - _touchStart).manhattanLength() >= QApplication::startDragDistance()) {
_touchTimer.stop();
_touchTimer.cancel();
_touchScroll = true;
touchUpdateSpeed();
}
Expand All @@ -552,7 +545,7 @@ void ScrollArea::touchEvent(QTouchEvent *e) {
if (_touchScrollState == TouchScrollState::Manual) {
_touchScrollState = TouchScrollState::Auto;
_touchPrevPosValid = false;
_touchScrollTimer.start(15);
_touchScrollTimer.callEach(15);
_touchTime = crl::now();
} else if (_touchScrollState == TouchScrollState::Auto) {
_touchScrollState = TouchScrollState::Manual;
Expand All @@ -579,7 +572,7 @@ void ScrollArea::touchEvent(QTouchEvent *e) {
}
}
if (weak) {
_touchTimer.stop();
_touchTimer.cancel();
_touchRightButton = false;
}
} break;
Expand All @@ -588,7 +581,7 @@ void ScrollArea::touchEvent(QTouchEvent *e) {
_touchPress = false;
_touchScroll = false;
_touchScrollState = TouchScrollState::Manual;
_touchTimer.stop();
_touchTimer.cancel();
} break;
}
}
Expand Down Expand Up @@ -628,12 +621,12 @@ void ScrollArea::resizeEvent(QResizeEvent *e) {
_verticalBar->recountSize();
_topShadow->setGeometry(QRect(0, 0, width(), qAbs(_st.topsh)));
_bottomShadow->setGeometry(QRect(0, height() - qAbs(_st.bottomsh), width(), qAbs(_st.bottomsh)));
geometryChanged();
_geometryChanged.fire({});
}

void ScrollArea::moveEvent(QMoveEvent *e) {
QScrollArea::moveEvent(e);
geometryChanged();
_geometryChanged.fire({});
}

void ScrollArea::keyPressEvent(QKeyEvent *e) {
Expand Down Expand Up @@ -748,4 +741,16 @@ void ScrollArea::setMovingByScrollBar(bool movingByScrollBar) {
_movingByScrollBar = movingByScrollBar;
}

rpl::producer<> ScrollArea::scrolls() const {
return _scrolls.events();
}

rpl::producer<> ScrollArea::innerResizes() const {
return _innerResizes.events();
}

rpl::producer<> ScrollArea::geometryChanged() const {
return _geometryChanged.events();
}

} // namespace Ui
40 changes: 16 additions & 24 deletions ui/widgets/scroll_area.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#include "styles/style_widgets.h"

#include <QtWidgets/QScrollArea>
#include <QtCore/QTimer>
#include <QtGui/QtEvents>

namespace Ui {
Expand Down Expand Up @@ -127,10 +126,8 @@ class ScrollBar : public TWidget {
};

class ScrollArea : public RpWidgetBase<QScrollArea> {
Q_OBJECT

using Parent = RpWidgetBase<QScrollArea>;
public:
using Parent = RpWidgetBase<QScrollArea>;
ScrollArea(QWidget *parent, const style::ScrollArea &st = st::defaultScrollArea, bool handleTouch = true);

int scrollWidth() const;
Expand Down Expand Up @@ -172,6 +169,15 @@ class ScrollArea : public RpWidgetBase<QScrollArea> {
void scrollTo(ScrollToRequest request);
void scrollToWidget(not_null<QWidget*> widget);

void scrollToY(int toTop, int toBottom = -1);
void disableScroll(bool dis);
void scrolled();
void innerResized();

[[nodiscard]] rpl::producer<> scrolls() const;
[[nodiscard]] rpl::producer<> innerResizes() const;
[[nodiscard]] rpl::producer<> geometryChanged() const;

protected:
bool eventFilter(QObject *obj, QEvent *e) override;

Expand All @@ -182,22 +188,6 @@ class ScrollArea : public RpWidgetBase<QScrollArea> {
void enterEventHook(QEvent *e) override;
void leaveEventHook(QEvent *e) override;

public Q_SLOTS:
void scrollToY(int toTop, int toBottom = -1);
void disableScroll(bool dis);
void onScrolled();
void onInnerResized();

void onTouchTimer();
void onTouchScrollTimer();

Q_SIGNALS:
void scrolled();
void innerResized();
void scrollStarted();
void scrollFinished();
void geometryChanged();

protected:
void scrollContentsBy(int dx, int dy) override;

Expand All @@ -207,8 +197,8 @@ public Q_SLOTS:

void setWidget(QWidget *widget);

void touchScrollTimer();
bool touchScroll(const QPoint &delta);

void touchScrollUpdated(const QPoint &screenPos);

void touchResetSpeed();
Expand All @@ -224,7 +214,7 @@ public Q_SLOTS:
int _horizontalValue, _verticalValue;

bool _touchEnabled;
QTimer _touchTimer;
base::Timer _touchTimer;
bool _touchScroll = false;
bool _touchPress = false;
bool _touchRightButton = false;
Expand All @@ -237,14 +227,16 @@ public Q_SLOTS:
crl::time _touchSpeedTime = 0;
crl::time _touchAccelerationTime = 0;
crl::time _touchTime = 0;
QTimer _touchScrollTimer;
base::Timer _touchScrollTimer;

bool _widgetAcceptsTouch = false;

object_ptr<QWidget> _widget = { nullptr };

rpl::event_stream<int> _scrollTopUpdated;
rpl::lifetime _lifetime;
rpl::event_stream<> _scrolls;
rpl::event_stream<> _innerResizes;
rpl::event_stream<> _geometryChanged;

};

Expand Down

0 comments on commit 7182fad

Please sign in to comment.