Allow custom event filters in RpWidget.

This commit is contained in:
John Preston 2019-09-19 20:09:37 +03:00
parent 34b05c25fc
commit 15b0e73d3b
2 changed files with 31 additions and 7 deletions

View file

@ -27,6 +27,11 @@ void ResizeFitChild(
}, child->lifetime()); }, child->lifetime());
} }
rpl::producer<not_null<QEvent*>> RpWidgetMethods::events() const {
auto &stream = eventStreams().events;
return stream.events();
}
rpl::producer<QRect> RpWidgetMethods::geometryValue() const { rpl::producer<QRect> RpWidgetMethods::geometryValue() const {
auto &stream = eventStreams().geometry; auto &stream = eventStreams().geometry;
return stream.events_starting_with_copy(callGetGeometry()); return stream.events_starting_with_copy(callGetGeometry());
@ -110,11 +115,27 @@ rpl::lifetime &RpWidgetMethods::lifetime() {
} }
bool RpWidgetMethods::handleEvent(QEvent *event) { bool RpWidgetMethods::handleEvent(QEvent *event) {
Expects(event != nullptr);
auto streams = _eventStreams.get();
if (!streams) {
return eventHook(event);
}
auto that = QPointer<QObject>();
if (streams->events.has_consumers()) {
that = callCreateWeak();
streams->events.fire_copy(event);
if (!that) {
return true;
}
}
switch (event->type()) { switch (event->type()) {
case QEvent::Move: case QEvent::Move:
case QEvent::Resize: case QEvent::Resize:
if (auto streams = _eventStreams.get()) { if (streams->geometry.has_consumers()) {
auto that = callCreateWeak(); if (!that) {
that = callCreateWeak();
}
streams->geometry.fire_copy(callGetGeometry()); streams->geometry.fire_copy(callGetGeometry());
if (!that) { if (!that) {
return true; return true;
@ -123,10 +144,12 @@ bool RpWidgetMethods::handleEvent(QEvent *event) {
break; break;
case QEvent::Paint: case QEvent::Paint:
if (auto streams = _eventStreams.get()) { if (streams->paint.has_consumers()) {
auto that = callCreateWeak(); if (!that) {
streams->paint.fire_copy( that = callCreateWeak();
static_cast<QPaintEvent*>(event)->rect()); }
const auto rect = static_cast<QPaintEvent*>(event)->rect();
streams->paint.fire_copy(rect);
if (!that) { if (!that) {
return true; return true;
} }

View file

@ -252,6 +252,7 @@ class RpWidgetWrap;
class RpWidgetMethods { class RpWidgetMethods {
public: public:
rpl::producer<not_null<QEvent*>> events() const;
rpl::producer<QRect> geometryValue() const; rpl::producer<QRect> geometryValue() const;
rpl::producer<QSize> sizeValue() const; rpl::producer<QSize> sizeValue() const;
rpl::producer<int> heightValue() const; rpl::producer<int> heightValue() const;
@ -275,7 +276,6 @@ public:
}, lifetime()); }, lifetime());
} }
rpl::lifetime &lifetime(); rpl::lifetime &lifetime();
virtual ~RpWidgetMethods() = default; virtual ~RpWidgetMethods() = default;
@ -289,6 +289,7 @@ private:
friend class RpWidgetWrap; friend class RpWidgetWrap;
struct EventStreams { struct EventStreams {
rpl::event_stream<not_null<QEvent*>> events;
rpl::event_stream<QRect> geometry; rpl::event_stream<QRect> geometry;
rpl::event_stream<QRect> paint; rpl::event_stream<QRect> paint;
rpl::event_stream<bool> shown; rpl::event_stream<bool> shown;