Fix crash on admin log exit by Escape.

This commit is contained in:
John Preston 2019-09-02 12:23:06 +03:00
parent 85cca51154
commit 8000dfac01
3 changed files with 42 additions and 12 deletions

View file

@ -283,6 +283,18 @@ Main::Session &InnerWidget::session() const {
return _controller->session();
}
rpl::producer<> InnerWidget::showSearchSignal() const {
return _showSearchSignal.events();
}
rpl::producer<int> InnerWidget::scrollToSignal() const {
return _scrollToSignal.events();
}
rpl::producer<> InnerWidget::cancelSignal() const {
return _cancelSignal.events();
}
void InnerWidget::visibleTopBottomUpdated(
int visibleTop,
int visibleBottom) {
@ -765,10 +777,10 @@ int InnerWidget::resizeGetHeight(int newWidth) {
}
void InnerWidget::restoreScrollPosition() {
auto newVisibleTop = _visibleTopItem
const auto newVisibleTop = _visibleTopItem
? (itemTop(_visibleTopItem) + _visibleTopFromItem)
: ScrollMax;
scrollToSignal.notify(newVisibleTop, true);
_scrollToSignal.fire_copy(newVisibleTop);
}
void InnerWidget::paintEvent(QPaintEvent *e) {
@ -919,7 +931,7 @@ TextForMimeData InnerWidget::getSelectedText() const {
void InnerWidget::keyPressEvent(QKeyEvent *e) {
if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Back) {
cancelledSignal.notify(true);
_cancelSignal.fire({});
} else if (e == QKeySequence::Copy && _selectedItem != nullptr) {
copySelectedText();
#ifdef Q_OS_MAC

View file

@ -52,13 +52,13 @@ public:
not_null<Window::SessionController*> controller,
not_null<ChannelData*> channel);
Main::Session &session() const;
[[nodiscard]] Main::Session &session() const;
base::Observable<void> showSearchSignal;
base::Observable<int> scrollToSignal;
base::Observable<void> cancelledSignal;
[[nodiscard]] rpl::producer<> showSearchSignal() const;
[[nodiscard]] rpl::producer<int> scrollToSignal() const;
[[nodiscard]] rpl::producer<> cancelSignal() const;
not_null<ChannelData*> channel() const {
[[nodiscard]] not_null<ChannelData*> channel() const {
return _channel;
}
@ -276,6 +276,10 @@ private:
std::vector<not_null<UserData*>> _adminsCanEdit;
Fn<void(FilterValue &&filter)> _showFilterCallback;
rpl::event_stream<> _showSearchSignal;
rpl::event_stream<int> _scrollToSignal;
rpl::event_stream<> _cancelSignal;
};
} // namespace AdminLog

View file

@ -250,7 +250,11 @@ void FixedBar::mousePressEvent(QMouseEvent *e) {
}
}
Widget::Widget(QWidget *parent, not_null<Window::SessionController*> controller, not_null<ChannelData*> channel) : Window::SectionWidget(parent, controller)
Widget::Widget(
QWidget *parent,
not_null<Window::SessionController*> controller,
not_null<ChannelData*> channel)
: Window::SectionWidget(parent, controller)
, _scroll(this, st::historyScroll, false)
, _fixedBar(this, controller, channel)
, _fixedBarShadow(this)
@ -267,9 +271,19 @@ Widget::Widget(QWidget *parent, not_null<Window::SessionController*> controller,
subscribe(Adaptive::Changed(), [this] { updateAdaptiveLayout(); });
_inner = _scroll->setOwnedWidget(object_ptr<InnerWidget>(this, controller, channel));
subscribe(_inner->showSearchSignal, [this] { _fixedBar->showSearch(); });
subscribe(_inner->cancelledSignal, [this] { _fixedBar->goBack(); });
subscribe(_inner->scrollToSignal, [this](int top) { _scroll->scrollToY(top); });
_inner->showSearchSignal(
) | rpl::start_with_next([=] {
_fixedBar->showSearch();
}, lifetime());
_inner->cancelSignal(
) | rpl::start_with_next([=] {
_fixedBar->goBack();
}, lifetime());
_inner->scrollToSignal(
) | rpl::start_with_next([=](int top) {
_scroll->scrollToY(top);
}, lifetime());
_scroll->move(0, _fixedBar->height());
_scroll->show();