diff --git a/Telegram/SourceFiles/boxes/sessions_box.cpp b/Telegram/SourceFiles/boxes/sessions_box.cpp index 3a459c6bfa..2b3bded588 100644 --- a/Telegram/SourceFiles/boxes/sessions_box.cpp +++ b/Telegram/SourceFiles/boxes/sessions_box.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "boxes/sessions_box.h" +#include "base/timer.h" #include "lang/lang_keys.h" #include "storage/localstorage.h" #include "mainwidget.h" @@ -32,7 +33,58 @@ constexpr auto kSessionsShortPollTimeout = 60 * crl::time(1000); } // namespace -class SessionsBox::List : public Ui::RpWidget { +class SessionsContent : public Ui::RpWidget { +public: + SessionsContent(QWidget*, not_null session); + + void setupContent(); + +protected: + void resizeEvent(QResizeEvent *e) override; + void paintEvent(QPaintEvent *e) override; + +private: + struct Entry { + uint64 hash = 0; + + bool incomplete = false; + TimeId activeTime = 0; + int nameWidth, activeWidth, infoWidth, ipWidth; + QString name, active, info, ip; + }; + struct Full { + Entry current; + std::vector incomplete; + std::vector list; + }; + class Inner; + class List; + + static Entry ParseEntry(const MTPDauthorization &data); + static void ResizeEntry(Entry &entry); + void shortPollSessions(); + + void got(const MTPaccount_Authorizations &result); + + void terminate(Fn terminateRequest, QString message); + void terminateOne(uint64 hash); + void terminateAll(); + + const not_null _session; + MTP::Sender _api; + + rpl::variable _loading = false; + Full _data; + + object_ptr _inner; + QPointer _terminateBox; + + base::Timer _shortPollTimer; + mtpRequestId _shortPollRequest = 0; + +}; + +class SessionsContent::List : public Ui::RpWidget { public: List(QWidget *parent); @@ -55,7 +107,7 @@ private: }; -class SessionsBox::Inner : public Ui::RpWidget { +class SessionsContent::Inner : public Ui::RpWidget { public: Inner(QWidget *parent); @@ -75,22 +127,22 @@ private: }; -SessionsBox::SessionsBox(QWidget*, not_null session) +SessionsContent::SessionsContent(QWidget*, not_null session) : _session(session) , _api(&_session->mtp()) +, _inner(this) , _shortPollTimer([=] { shortPollSessions(); }) { } -void SessionsBox::prepare() { - setTitle(tr::lng_sessions_other_header()); - - addButton(tr::lng_close(), [=] { closeBox(); }); - - setDimensions(st::boxWideWidth, st::sessionsHeight); - - _inner = setInnerWidget(object_ptr(this), st::sessionsScroll); +void SessionsContent::setupContent() { _inner->resize(width(), st::noContactsHeight); + _inner->heightValue( + ) | rpl::distinct_until_changed( + ) | rpl::start_with_next([=](int height) { + resize(width(), height); + }, _inner->lifetime()); + _inner->terminateOne( ) | rpl::start_with_next([=](uint64 hash) { terminateOne(hash); @@ -108,21 +160,21 @@ void SessionsBox::prepare() { _loading.changes( ) | rpl::start_with_next([=](bool value) { - setInnerVisible(!value); + _inner->setVisible(!value); }, lifetime()); _loading = true; shortPollSessions(); } -void SessionsBox::resizeEvent(QResizeEvent *e) { - BoxContent::resizeEvent(e); +void SessionsContent::resizeEvent(QResizeEvent *e) { + RpWidget::resizeEvent(e); _inner->resize(width(), _inner->height()); } -void SessionsBox::paintEvent(QPaintEvent *e) { - BoxContent::paintEvent(e); +void SessionsContent::paintEvent(QPaintEvent *e) { + RpWidget::paintEvent(e); Painter p(this); @@ -136,7 +188,7 @@ void SessionsBox::paintEvent(QPaintEvent *e) { } } -void SessionsBox::got(const MTPaccount_Authorizations &result) { +void SessionsContent::got(const MTPaccount_Authorizations &result) { _shortPollRequest = 0; _loading = false; _data = Full(); @@ -168,7 +220,7 @@ void SessionsBox::got(const MTPaccount_Authorizations &result) { _shortPollTimer.callOnce(kSessionsShortPollTimeout); } -SessionsBox::Entry SessionsBox::ParseEntry(const MTPDauthorization &data) { +SessionsContent::Entry SessionsContent::ParseEntry(const MTPDauthorization &data) { auto result = Entry(); result.hash = data.is_current() ? 0 : data.vhash().v; @@ -249,7 +301,7 @@ SessionsBox::Entry SessionsBox::ParseEntry(const MTPDauthorization &data) { return result; } -void SessionsBox::ResizeEntry(Entry &entry) { +void SessionsContent::ResizeEntry(Entry &entry) { const auto available = st::boxWideWidth - st::sessionPadding.left() - st::sessionTerminateSkip; @@ -275,7 +327,7 @@ void SessionsBox::ResizeEntry(Entry &entry) { resize(st::sessionInfoFont, entry.ip, entry.ipWidth, available); } -void SessionsBox::shortPollSessions() { +void SessionsContent::shortPollSessions() { if (_shortPollRequest) { return; } @@ -286,7 +338,7 @@ void SessionsBox::shortPollSessions() { update(); } -void SessionsBox::terminate(Fn terminateRequest, QString message) { +void SessionsContent::terminate(Fn terminateRequest, QString message) { if (_terminateBox) { _terminateBox->deleteLater(); } @@ -306,7 +358,7 @@ void SessionsBox::terminate(Fn terminateRequest, QString message) { Ui::LayerOption::KeepOther); } -void SessionsBox::terminateOne(uint64 hash) { +void SessionsContent::terminateOne(uint64 hash) { auto callback = [=] { _api.request(MTPaccount_ResetAuthorization( MTP_long(hash) @@ -331,7 +383,7 @@ void SessionsBox::terminateOne(uint64 hash) { terminate(std::move(callback), tr::lng_settings_reset_one_sure(tr::now)); } -void SessionsBox::terminateAll() { +void SessionsContent::terminateAll() { auto callback = [=] { _api.request(MTPauth_ResetAuthorizations( )).done([=](const MTPBool &result) { @@ -346,12 +398,12 @@ void SessionsBox::terminateAll() { terminate(std::move(callback), tr::lng_settings_reset_sure(tr::now)); } -SessionsBox::Inner::Inner(QWidget *parent) +SessionsContent::Inner::Inner(QWidget *parent) : RpWidget(parent) { setupContent(); } -void SessionsBox::Inner::setupContent() { +void SessionsContent::Inner::setupContent() { using namespace Settings; using namespace rpl::mappers; @@ -414,32 +466,32 @@ void SessionsBox::Inner::setupContent() { Ui::ResizeFitChild(this, content); } -void SessionsBox::Inner::showData(const Full &data) { +void SessionsContent::Inner::showData(const Full &data) { _current->showData({ &data.current, &data.current + 1 }); _list->showData(data.list); _incomplete->showData(data.incomplete); } -rpl::producer<> SessionsBox::Inner::terminateAll() const { +rpl::producer<> SessionsContent::Inner::terminateAll() const { return _terminateAll->clicks() | rpl::to_empty; } -rpl::producer SessionsBox::Inner::terminateOne() const { +rpl::producer SessionsContent::Inner::terminateOne() const { return rpl::merge( _incomplete->terminate(), _list->terminate()); } -void SessionsBox::Inner::terminatingOne(uint64 hash, bool terminating) { +void SessionsContent::Inner::terminatingOne(uint64 hash, bool terminating) { _incomplete->terminating(hash, terminating); _list->terminating(hash, terminating); } -SessionsBox::List::List(QWidget *parent) : RpWidget(parent) { +SessionsContent::List::List(QWidget *parent) : RpWidget(parent) { setAttribute(Qt::WA_OpaquePaintEvent); } -void SessionsBox::List::showData(gsl::span items) { +void SessionsContent::List::showData(gsl::span items) { auto buttons = base::take(_terminateButtons); _items.clear(); _items.insert(begin(_items), items.begin(), items.end()); @@ -462,24 +514,27 @@ void SessionsBox::List::showData(gsl::span items) { _terminate.fire_copy(hash); }); button->show(); - button->moveToRight( - st::sessionTerminateSkip, - ((_terminateButtons.size() - 1) * st::sessionHeight - + st::sessionTerminateTop)); + const auto number = _terminateButtons.size() - 1; + widthValue( + ) | rpl::start_with_next([=] { + button->moveToRight( + st::sessionTerminateSkip, + (number * st::sessionHeight + st::sessionTerminateTop)); + }, lifetime()); } resizeToWidth(width()); _itemsCount.fire(_items.size()); } -rpl::producer SessionsBox::List::itemsCount() const { +rpl::producer SessionsContent::List::itemsCount() const { return _itemsCount.events_starting_with(_items.size()); } -rpl::producer SessionsBox::List::terminate() const { +rpl::producer SessionsContent::List::terminate() const { return _terminate.events(); } -void SessionsBox::List::terminating(uint64 hash, bool terminating) { +void SessionsContent::List::terminating(uint64 hash, bool terminating) { const auto i = _terminateButtons.find(hash); if (i != _terminateButtons.cend()) { if (terminating) { @@ -491,11 +546,11 @@ void SessionsBox::List::terminating(uint64 hash, bool terminating) { } } -int SessionsBox::List::resizeGetHeight(int newWidth) { +int SessionsContent::List::resizeGetHeight(int newWidth) { return _items.size() * st::sessionHeight; } -void SessionsBox::List::paintEvent(QPaintEvent *e) { +void SessionsContent::List::paintEvent(QPaintEvent *e) { QRect r(e->rect()); Painter p(this); @@ -538,3 +593,23 @@ void SessionsBox::List::paintEvent(QPaintEvent *e) { p.translate(0, st::sessionHeight); } } + +SessionsBox::SessionsBox(QWidget*, not_null session) +: _session(session) { +} + +void SessionsBox::prepare() { + setTitle(tr::lng_sessions_other_header()); + + addButton(tr::lng_close(), [=] { closeBox(); }); + + const auto w = st::boxWideWidth; + + const auto content = setInnerWidget( + object_ptr(this, _session), + st::sessionsScroll); + content->resize(w, st::noContactsHeight); + content->setupContent(); + + setDimensions(w, st::sessionsHeight); +} diff --git a/Telegram/SourceFiles/boxes/sessions_box.h b/Telegram/SourceFiles/boxes/sessions_box.h index 32d25f72fb..395bbcabed 100644 --- a/Telegram/SourceFiles/boxes/sessions_box.h +++ b/Telegram/SourceFiles/boxes/sessions_box.h @@ -8,15 +8,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "boxes/abstract_box.h" -#include "mtproto/sender.h" -#include "base/timer.h" - -class ConfirmBox; - -namespace Ui { -class IconButton; -class LinkButton; -} // namespace Ui namespace Main { class Session; @@ -29,46 +20,7 @@ public: protected: void prepare() override; - void resizeEvent(QResizeEvent *e) override; - void paintEvent(QPaintEvent *e) override; - private: - struct Entry { - uint64 hash = 0; - - bool incomplete = false; - TimeId activeTime = 0; - int nameWidth, activeWidth, infoWidth, ipWidth; - QString name, active, info, ip; - }; - struct Full { - Entry current; - std::vector incomplete; - std::vector list; - }; - class Inner; - class List; - - static Entry ParseEntry(const MTPDauthorization &data); - static void ResizeEntry(Entry &entry); - void shortPollSessions(); - - void got(const MTPaccount_Authorizations &result); - - void terminate(Fn terminateRequest, QString message); - void terminateOne(uint64 hash); - void terminateAll(); - const not_null _session; - MTP::Sender _api; - - rpl::variable _loading = false; - Full _data; - - QPointer _inner; - QPointer _terminateBox; - - base::Timer _shortPollTimer; - mtpRequestId _shortPollRequest = 0; };