Allow custom event filters in RpWidget.
This commit is contained in:
parent
34b05c25fc
commit
15b0e73d3b
2 changed files with 31 additions and 7 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue