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());
}
rpl::producer<not_null<QEvent*>> RpWidgetMethods::events() const {
auto &stream = eventStreams().events;
return stream.events();
}
rpl::producer<QRect> RpWidgetMethods::geometryValue() const {
auto &stream = eventStreams().geometry;
return stream.events_starting_with_copy(callGetGeometry());
@ -110,11 +115,27 @@ rpl::lifetime &RpWidgetMethods::lifetime() {
}
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()) {
case QEvent::Move:
case QEvent::Resize:
if (auto streams = _eventStreams.get()) {
auto that = callCreateWeak();
if (streams->geometry.has_consumers()) {
if (!that) {
that = callCreateWeak();
}
streams->geometry.fire_copy(callGetGeometry());
if (!that) {
return true;
@ -123,10 +144,12 @@ bool RpWidgetMethods::handleEvent(QEvent *event) {
break;
case QEvent::Paint:
if (auto streams = _eventStreams.get()) {
auto that = callCreateWeak();
streams->paint.fire_copy(
static_cast<QPaintEvent*>(event)->rect());
if (streams->paint.has_consumers()) {
if (!that) {
that = callCreateWeak();
}
const auto rect = static_cast<QPaintEvent*>(event)->rect();
streams->paint.fire_copy(rect);
if (!that) {
return true;
}

View file

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