mirror of https://github.com/procxx/kepka.git
NB Broken! Moving from registerPeerObserver() to base::Subscriber.
This commit is contained in:
parent
8546814a25
commit
c91bdf3fef
|
@ -271,10 +271,10 @@ using SubscriptionHandler = typename SubscriptionHandlerHelper<EventType>::type;
|
||||||
class BaseObservableData {
|
class BaseObservableData {
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
class CommonObservableData;
|
class CommonObservableData;
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
class ObservableData;
|
class ObservableData;
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
@ -317,43 +317,41 @@ private:
|
||||||
Node *_node = nullptr;
|
Node *_node = nullptr;
|
||||||
RemoveMethod _removeMethod;
|
RemoveMethod _removeMethod;
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
friend class internal::CommonObservableData;
|
friend class internal::CommonObservableData;
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
friend class internal::ObservableData;
|
friend class internal::ObservableData;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
class Observable;
|
class Observable;
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
class CommonObservable {
|
class CommonObservable {
|
||||||
public:
|
public:
|
||||||
using Handler = typename CommonObservableData<EventType>::Handler;
|
|
||||||
|
|
||||||
Subscription subscribe(Handler &&handler) {
|
Subscription subscribe(Handler &&handler) {
|
||||||
if (!_data) {
|
if (!_data) {
|
||||||
_data = MakeShared<ObservableData<EventType>>(this);
|
_data = MakeShared<ObservableData<EventType, Handler>>(this);
|
||||||
}
|
}
|
||||||
return _data->append(std_::forward<Handler>(handler));
|
return _data->append(std_::forward<Handler>(handler));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSharedPointer<ObservableData<EventType>> _data;
|
QSharedPointer<ObservableData<EventType, Handler>> _data;
|
||||||
|
|
||||||
friend class CommonObservableData<EventType>;
|
friend class CommonObservableData<EventType, Handler>;
|
||||||
friend class Observable<EventType>;
|
friend class Observable<EventType, Handler>;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler = internal::SubscriptionHandler<EventType>>
|
||||||
class Observable : public internal::CommonObservable<EventType> {
|
class Observable : public internal::CommonObservable<EventType, Handler> {
|
||||||
public:
|
public:
|
||||||
void notify(EventType &&event, bool sync = false) {
|
void notify(EventType &&event, bool sync = false) {
|
||||||
if (this->_data) {
|
if (this->_data) {
|
||||||
|
@ -365,12 +363,10 @@ public:
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
class CommonObservableData : public BaseObservableData {
|
class CommonObservableData : public BaseObservableData {
|
||||||
public:
|
public:
|
||||||
using Handler = SubscriptionHandler<EventType>;
|
CommonObservableData(CommonObservable<EventType, Handler> *observable) : _observable(observable) {
|
||||||
|
|
||||||
CommonObservableData(CommonObservable<EventType> *observable) : _observable(observable) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Subscription append(Handler &&handler) {
|
Subscription append(Handler &&handler) {
|
||||||
|
@ -441,20 +437,20 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CommonObservable<EventType> *_observable = nullptr;
|
CommonObservable<EventType, Handler> *_observable = nullptr;
|
||||||
Node *_begin = nullptr;
|
Node *_begin = nullptr;
|
||||||
Node *_current = nullptr;
|
Node *_current = nullptr;
|
||||||
Node *_end = nullptr;
|
Node *_end = nullptr;
|
||||||
ObservableCallHandlers _callHandlers;
|
ObservableCallHandlers _callHandlers;
|
||||||
|
|
||||||
friend class ObservableData<EventType>;
|
friend class ObservableData<EventType, Handler>;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename EventType>
|
template <typename EventType, typename Handler>
|
||||||
class ObservableData : public CommonObservableData<EventType> {
|
class ObservableData : public CommonObservableData<EventType, Handler> {
|
||||||
public:
|
public:
|
||||||
using CommonObservableData<EventType>::CommonObservableData;
|
using CommonObservableData<EventType, Handler>::CommonObservableData;
|
||||||
|
|
||||||
void notify(EventType &&event, bool sync) {
|
void notify(EventType &&event, bool sync) {
|
||||||
if (_handling) {
|
if (_handling) {
|
||||||
|
@ -498,10 +494,10 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <class Handler>
|
||||||
class ObservableData<void> : public CommonObservableData<void> {
|
class ObservableData<void, Handler> : public CommonObservableData<void, Handler> {
|
||||||
public:
|
public:
|
||||||
using CommonObservableData<void>::CommonObservableData;
|
using CommonObservableData<void, Handler>::CommonObservableData;
|
||||||
|
|
||||||
void notify(bool sync) {
|
void notify(bool sync) {
|
||||||
if (_handling) {
|
if (_handling) {
|
||||||
|
@ -547,8 +543,8 @@ private:
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
template <>
|
template <typename Handler>
|
||||||
class Observable<void> : public internal::CommonObservable<void> {
|
class Observable<void, Handler> : public internal::CommonObservable<void, Handler> {
|
||||||
public:
|
public:
|
||||||
void notify(bool sync = false) {
|
void notify(bool sync = false) {
|
||||||
if (_data) {
|
if (_data) {
|
||||||
|
@ -560,14 +556,14 @@ public:
|
||||||
|
|
||||||
class Subscriber {
|
class Subscriber {
|
||||||
protected:
|
protected:
|
||||||
template <typename EventType, typename Lambda>
|
template <typename EventType, typename Handler, typename Lambda>
|
||||||
int subscribe(base::Observable<EventType> &observable, Lambda &&handler) {
|
int subscribe(base::Observable<EventType, Handler> &observable, Lambda &&handler) {
|
||||||
_subscriptions.push_back(observable.subscribe(std_::forward<Lambda>(handler)));
|
_subscriptions.push_back(observable.subscribe(std_::forward<Lambda>(handler)));
|
||||||
return _subscriptions.size() - 1;
|
return _subscriptions.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename EventType, typename Lambda>
|
template <typename EventType, typename Handler, typename Lambda>
|
||||||
int subscribe(base::Observable<EventType> *observable, Lambda &&handler) {
|
int subscribe(base::Observable<EventType, Handler> *observable, Lambda &&handler) {
|
||||||
return subscribe(*observable, std_::forward<Lambda>(handler));
|
return subscribe(*observable, std_::forward<Lambda>(handler));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
||||||
|
|
||||||
class LayerWidget;
|
class LayerWidget;
|
||||||
namespace base {
|
namespace base {
|
||||||
template <typename Type>
|
template <typename Type, typename>
|
||||||
class Observable;
|
class Observable;
|
||||||
} // namespace base
|
} // namespace base
|
||||||
namespace InlineBots {
|
namespace InlineBots {
|
||||||
|
|
|
@ -48,6 +48,8 @@ void FinishCallback() {
|
||||||
}
|
}
|
||||||
ObservedEventRegistrator<PeerUpdate::Flags, PeerUpdateHandler> creator(StartCallback, FinishCallback);
|
ObservedEventRegistrator<PeerUpdate::Flags, PeerUpdateHandler> creator(StartCallback, FinishCallback);
|
||||||
|
|
||||||
|
base::Observable<PeerUpdate, PeerUpdatedHandler> PeerUpdatedObservable;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
@ -116,10 +118,20 @@ void peerUpdatedSendDelayed() {
|
||||||
for_const (auto &update, allList) {
|
for_const (auto &update, allList) {
|
||||||
creator.notify(update.flags, update);
|
creator.notify(update.flags, update);
|
||||||
}
|
}
|
||||||
|
for (auto &update : smallList) {
|
||||||
|
PeerUpdated().notify(std_::move(update), true);
|
||||||
|
}
|
||||||
|
for (auto &update : allList) {
|
||||||
|
PeerUpdated().notify(std_::move(update), true);
|
||||||
|
}
|
||||||
if (SmallUpdates->isEmpty()) {
|
if (SmallUpdates->isEmpty()) {
|
||||||
std::swap(smallList, *SmallUpdates);
|
std::swap(smallList, *SmallUpdates);
|
||||||
SmallUpdates->resize(0);
|
SmallUpdates->resize(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base::Observable<PeerUpdate, PeerUpdatedHandler> &PeerUpdated() {
|
||||||
|
return PeerUpdatedObservable;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Notify
|
} // namespace Notify
|
||||||
|
|
|
@ -102,4 +102,22 @@ void registerPeerObserver(PeerUpdate::Flags events, ObserverType *observer, Lamb
|
||||||
observerRegistered(observer, connection);
|
observerRegistered(observer, connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PeerUpdatedHandler {
|
||||||
|
public:
|
||||||
|
template <typename Lambda>
|
||||||
|
PeerUpdatedHandler(PeerUpdate::Flags events, Lambda &&handler) : _events(events), _handler(std_::move(handler)) {
|
||||||
|
}
|
||||||
|
void operator()(const PeerUpdate &update) const {
|
||||||
|
if (update.flags & _events) {
|
||||||
|
_handler(update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
PeerUpdate::Flags _events;
|
||||||
|
base::lambda_unique<void(const PeerUpdate&)> _handler;
|
||||||
|
|
||||||
|
};
|
||||||
|
base::Observable<PeerUpdate, PeerUpdatedHandler> &PeerUpdated();
|
||||||
|
|
||||||
} // namespace Notify
|
} // namespace Notify
|
||||||
|
|
|
@ -34,9 +34,9 @@ using UpdateFlag = Notify::PeerUpdate::Flag;
|
||||||
|
|
||||||
InfoWidget::InfoWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_info)) {
|
InfoWidget::InfoWidget(QWidget *parent, UserData *self) : BlockWidget(parent, self, lang(lng_settings_section_info)) {
|
||||||
auto observeEvents = UpdateFlag::UsernameChanged | UpdateFlag::UserPhoneChanged;
|
auto observeEvents = UpdateFlag::UsernameChanged | UpdateFlag::UserPhoneChanged;
|
||||||
Notify::registerPeerObserver(observeEvents, this, [this](const Notify::PeerUpdate &update) {
|
subscribe(Notify::PeerUpdated(), Notify::PeerUpdatedHandler(observeEvents, [this](const Notify::PeerUpdate &update) {
|
||||||
notifyPeerUpdated(update);
|
notifyPeerUpdated(update);
|
||||||
});
|
}));
|
||||||
|
|
||||||
createControls();
|
createControls();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue