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());
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue