From 31a66d66e26d5bb7d94542efb8cbafdb7cdac3ac Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 18 Nov 2016 16:34:58 +0300 Subject: [PATCH] Layers show/hide rewritten, animated show over mainmenu and settings. --- Telegram/Resources/basic.style | 4 - Telegram/SourceFiles/application.cpp | 2 +- Telegram/SourceFiles/boxes/aboutbox.cpp | 8 - Telegram/SourceFiles/boxes/aboutbox.h | 2 - Telegram/SourceFiles/boxes/abstractbox.cpp | 1 - Telegram/SourceFiles/boxes/abstractbox.h | 5 - Telegram/SourceFiles/boxes/addcontactbox.cpp | 72 +- Telegram/SourceFiles/boxes/addcontactbox.h | 5 - Telegram/SourceFiles/boxes/autolockbox.cpp | 7 - Telegram/SourceFiles/boxes/autolockbox.h | 2 - Telegram/SourceFiles/boxes/boxes.style | 13 +- Telegram/SourceFiles/boxes/confirmbox.cpp | 38 - Telegram/SourceFiles/boxes/confirmbox.h | 11 - .../SourceFiles/boxes/confirmphonebox.cpp | 1 + Telegram/SourceFiles/boxes/confirmphonebox.h | 3 - Telegram/SourceFiles/boxes/connectionbox.cpp | 27 +- Telegram/SourceFiles/boxes/connectionbox.h | 5 +- Telegram/SourceFiles/boxes/contactsbox.cpp | 30 +- Telegram/SourceFiles/boxes/contactsbox.h | 1 - .../SourceFiles/boxes/downloadpathbox.cpp | 19 +- Telegram/SourceFiles/boxes/downloadpathbox.h | 3 +- Telegram/SourceFiles/boxes/languagebox.cpp | 7 - Telegram/SourceFiles/boxes/languagebox.h | 2 - .../SourceFiles/boxes/localstoragebox.cpp | 7 +- Telegram/SourceFiles/boxes/localstoragebox.h | 2 - Telegram/SourceFiles/boxes/passcodebox.cpp | 69 +- Telegram/SourceFiles/boxes/passcodebox.h | 14 +- Telegram/SourceFiles/boxes/photocropbox.cpp | 5 - Telegram/SourceFiles/boxes/photocropbox.h | 2 - Telegram/SourceFiles/boxes/photosendbox.cpp | 23 +- Telegram/SourceFiles/boxes/photosendbox.h | 2 - Telegram/SourceFiles/boxes/report_box.h | 3 - Telegram/SourceFiles/boxes/sessionsbox.cpp | 77 +- Telegram/SourceFiles/boxes/sessionsbox.h | 5 +- Telegram/SourceFiles/boxes/stickers_box.cpp | 14 - Telegram/SourceFiles/boxes/stickers_box.h | 1 - Telegram/SourceFiles/boxes/stickersetbox.cpp | 9 +- Telegram/SourceFiles/boxes/stickersetbox.h | 4 +- Telegram/SourceFiles/boxes/usernamebox.cpp | 9 +- Telegram/SourceFiles/boxes/usernamebox.h | 1 - Telegram/SourceFiles/core/utils.h | 25 + Telegram/SourceFiles/historywidget.cpp | 23 +- Telegram/SourceFiles/historywidget.h | 1 + Telegram/SourceFiles/layerwidget.cpp | 741 ++++++++++-------- Telegram/SourceFiles/layerwidget.h | 64 +- Telegram/SourceFiles/mainwindow.cpp | 13 +- .../settings/settings_advanced_widget.cpp | 8 +- .../settings/settings_advanced_widget.h | 2 - .../settings/settings_inner_widget.cpp | 3 + .../SourceFiles/settings/settings_widget.cpp | 2 +- .../SourceFiles/settings/settings_widget.h | 2 +- Telegram/SourceFiles/ui/countryinput.cpp | 6 - Telegram/SourceFiles/ui/countryinput.h | 1 - .../window/window_theme_warning.cpp | 2 +- 54 files changed, 584 insertions(+), 824 deletions(-) diff --git a/Telegram/Resources/basic.style b/Telegram/Resources/basic.style index 6608cb298..f4bf337d3 100644 --- a/Telegram/Resources/basic.style +++ b/Telegram/Resources/basic.style @@ -315,10 +315,6 @@ searchedBarBG: #ebeef1; searchedBarBorder: unreadBarBorder; searchedBarColor: #a2aeb7; -layerSlideDuration: 200; -layerHideDuration: 200; -layerPadding: margins(10px, 10px, 10px, 10px); - simpleCloseIcon: icon {{ "simple_close", #c7c7c7 }}; simpleCloseIconOver: icon {{ "simple_close", #a3a3a3 }}; dialogsForwardCancelIcon: icon {{ "simple_close", dialogsForwardFg }}; diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index 05a25793a..9e8ba6ebd 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -834,7 +834,7 @@ void AppClass::cancelPhotoUpdate(const PeerId &peer) { void AppClass::mtpPause() { MTP::pause(); - _mtpUnpauseTimer.start(st::layerSlideDuration * 2); + _mtpUnpauseTimer.start(st::slideDuration * 2); } void AppClass::mtpUnpause() { diff --git a/Telegram/SourceFiles/boxes/aboutbox.cpp b/Telegram/SourceFiles/boxes/aboutbox.cpp index a6d51ee22..7a47d3513 100644 --- a/Telegram/SourceFiles/boxes/aboutbox.cpp +++ b/Telegram/SourceFiles/boxes/aboutbox.cpp @@ -49,14 +49,6 @@ AboutBox::AboutBox() : AbstractBox(st::aboutWidth) setAcceptDrops(true); } -void AboutBox::showAll() { - _version->show(); - _text1->show(); - _text2->show(); - _text3->show(); - _done->show(); -} - void AboutBox::resizeEvent(QResizeEvent *e) { _version->moveToLeft(st::boxPadding.left(), titleHeight() + st::aboutVersionTop); _text1->moveToLeft(st::boxPadding.left(), titleHeight() + st::aboutTextTop); diff --git a/Telegram/SourceFiles/boxes/aboutbox.h b/Telegram/SourceFiles/boxes/aboutbox.h index 83abd91b0..cf85b6b1f 100644 --- a/Telegram/SourceFiles/boxes/aboutbox.h +++ b/Telegram/SourceFiles/boxes/aboutbox.h @@ -44,8 +44,6 @@ protected: void dragEnterEvent(QDragEnterEvent *e) override; void dropEvent(QDropEvent *e) override; - void showAll() override; - private: ChildWidget _version; ChildWidget _text1; diff --git a/Telegram/SourceFiles/boxes/abstractbox.cpp b/Telegram/SourceFiles/boxes/abstractbox.cpp index 4a65b5017..5a6bbe6e0 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.cpp +++ b/Telegram/SourceFiles/boxes/abstractbox.cpp @@ -36,7 +36,6 @@ AbstractBox::AbstractBox(int w) : LayerWidget(App::wnd()->bodyWidget()) { void AbstractBox::prepare() { raiseShadow(); - showAll(); } void AbstractBox::keyPressEvent(QKeyEvent *e) { diff --git a/Telegram/SourceFiles/boxes/abstractbox.h b/Telegram/SourceFiles/boxes/abstractbox.h index bb7419fc9..9d6608183 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.h +++ b/Telegram/SourceFiles/boxes/abstractbox.h @@ -35,9 +35,6 @@ class AbstractBox : public LayerWidget, protected base::Subscriber { public: AbstractBox(int w = 0); void parentResized() override; - void showDone() override { - showAll(); - } void setBlockTitle(bool block); void raiseShadow(); @@ -59,8 +56,6 @@ protected: virtual void closePressed() { } - virtual void showAll() { - } private: int _maxHeight = 0; diff --git a/Telegram/SourceFiles/boxes/addcontactbox.cpp b/Telegram/SourceFiles/boxes/addcontactbox.cpp index 51c0392fc..4d4236d1f 100644 --- a/Telegram/SourceFiles/boxes/addcontactbox.cpp +++ b/Telegram/SourceFiles/boxes/addcontactbox.cpp @@ -90,14 +90,6 @@ void AddContactBox::initBox() { prepare(); } -void AddContactBox::showAll() { - _first->show(); - _last->show(); - _phone->show(); - _save->show(); - _cancel->show(); -} - void AddContactBox::doSetInnerFocus() { if ((_first->getLastText().isEmpty() && _last->getLastText().isEmpty()) || !_phone->isEnabled()) { (_invertOrder ? _last : _first)->setFocus(); @@ -230,10 +222,7 @@ void AddContactBox::onImportDone(const MTPcontacts_ImportedContacts &res) { Notify::userIsContactChanged(user, true); Ui::hideLayer(); } else { - _save->hide(); - _first->hide(); - _last->hide(); - _phone->hide(); + hideChildren(); _retry->show(); resizeEvent(0); update(); @@ -249,10 +238,9 @@ void AddContactBox::onSaveUserDone(const MTPcontacts_ImportedContacts &res) { void AddContactBox::onRetry() { _addRequest = 0; _contactId = 0; - _save->show(); + showChildren(); _retry->hide(); resizeEvent(0); - showAll(); _first->setText(QString()); _first->updatePlaceholder(); _last->setText(QString()); @@ -280,6 +268,7 @@ _creationRequestId(0), _createdChannel(0) { _description->setMaxLength(MaxChannelDescription); _description->resize(width() - st::boxPadding.left() - st::newGroupInfoPadding.left() - st::boxPadding.right(), _description->height()); + _description->setVisible(_creating == CreatingGroupChannel); updateMaxHeight(); connect(_description, SIGNAL(resized()), this, SLOT(onDescriptionResized())); @@ -298,17 +287,6 @@ _creationRequestId(0), _createdChannel(0) { prepare(); } -void GroupInfoBox::showAll() { - _title->show(); - if (_creating == CreatingGroupChannel) { - _description->show(); - } else { - _description->hide(); - } - _cancel->show(); - _next->show(); -} - void GroupInfoBox::doSetInnerFocus() { _title->setFocus(); } @@ -554,6 +532,7 @@ SetupChannelBox::SetupChannelBox(ChannelData *channel, bool existing) : Abstract connect(_skip, SIGNAL(clicked()), this, SLOT(onClose())); connect(_link, SIGNAL(changed()), this, SLOT(onChange())); + _link->setVisible(_public->checked()); _checkTimer.setSingleShot(true); connect(&_checkTimer, SIGNAL(timeout()), this, SLOT(onCheck())); @@ -564,18 +543,6 @@ SetupChannelBox::SetupChannelBox(ChannelData *channel, bool existing) : Abstract prepare(); } -void SetupChannelBox::showAll() { - _public->show(); - _private->show(); - if (_public->checked()) { - _link->show(); - } else { - _link->hide(); - } - _save->show(); - _skip->show(); -} - void SetupChannelBox::doSetInnerFocus() { if (_link->isHidden()) { setFocus(); @@ -937,21 +904,11 @@ _invertOrder(!peer->isChat() && langFirstNameGoesSecond()) { connect(_first, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); connect(_last, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + _last->setVisible(!_peer->isChat()); prepare(); } -void EditNameTitleBox::showAll() { - _first->show(); - if (_peer->isChat()) { - _last->hide(); - } else { - _last->show(); - } - _save->show(); - _cancel->show(); -} - void EditNameTitleBox::doSetInnerFocus() { (_invertOrder ? _last : _first)->setFocus(); } @@ -1109,27 +1066,12 @@ EditChannelBox::EditChannelBox(ChannelData *channel) : AbstractBox() connect(_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(_publicLink, SIGNAL(clicked()), this, SLOT(onPublicLink())); + _publicLink->setVisible(_channel->canEditUsername()); + _sign->setVisible(!_channel->isMegagroup()); prepare(); } -void EditChannelBox::showAll() { - _title->show(); - _description->show(); - _save->show(); - _cancel->show(); - if (_channel->canEditUsername()) { - _publicLink->show(); - } else { - _publicLink->hide(); - } - if (_channel->isMegagroup()) { - _sign->hide(); - } else { - _sign->show(); - } -} - void EditChannelBox::doSetInnerFocus() { _title->setFocus(); } diff --git a/Telegram/SourceFiles/boxes/addcontactbox.h b/Telegram/SourceFiles/boxes/addcontactbox.h index 0b1f9345f..94ac30225 100644 --- a/Telegram/SourceFiles/boxes/addcontactbox.h +++ b/Telegram/SourceFiles/boxes/addcontactbox.h @@ -53,7 +53,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: @@ -104,7 +103,6 @@ protected: void mousePressEvent(QMouseEvent *e) override; void leaveEvent(QEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: @@ -165,7 +163,6 @@ protected: void leaveEvent(QEvent *e) override; void closePressed() override; - void showAll() override; void doSetInnerFocus() override; private: @@ -226,7 +223,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: @@ -270,7 +266,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: diff --git a/Telegram/SourceFiles/boxes/autolockbox.cpp b/Telegram/SourceFiles/boxes/autolockbox.cpp index feaf0e0fe..f4492fe0c 100644 --- a/Telegram/SourceFiles/boxes/autolockbox.cpp +++ b/Telegram/SourceFiles/boxes/autolockbox.cpp @@ -55,13 +55,6 @@ _close(this, lang(lng_box_ok), st::defaultBoxButton) { prepare(); } -void AutoLockBox::showAll() { - _close->show(); - for (int32 i = 0, l = _options.size(); i < l; ++i) { - _options[i]->show(); - } -} - void AutoLockBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; diff --git a/Telegram/SourceFiles/boxes/autolockbox.h b/Telegram/SourceFiles/boxes/autolockbox.h index 9ef8c3132..7ae6789cb 100644 --- a/Telegram/SourceFiles/boxes/autolockbox.h +++ b/Telegram/SourceFiles/boxes/autolockbox.h @@ -39,8 +39,6 @@ public slots: protected: void paintEvent(QPaintEvent *e) override; - void showAll() override; - private: QVector _options; ChildWidget _close; diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index b206cac45..1be240156 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -23,6 +23,8 @@ using "basic.style"; using "ui/widgets/widgets.style"; using "intro/intro.style"; +boxDuration: 200; + boxButtonFont: font(boxFontSize semibold); defaultBoxButton: RoundButton { textFg: #2f9fea; @@ -297,15 +299,8 @@ contactsMultiSelect: MultiSelect { fieldIcon: boxFieldSearchIcon; fieldIconSkip: 36px; - fieldCancel: IconButton { - width: 41px; - height: 48px; - - icon: boxSearchCancelIcon; - iconOver: boxSearchCancelIconOver; - iconPosition: point(8px, 18px); - } - fieldCancelSkip: 34px; + fieldCancel: boxBlockTitleClose; + fieldCancelSkip: 40px; } contactsPhotoCheckbox: RoundImageCheckbox { imageRadius: 21px; diff --git a/Telegram/SourceFiles/boxes/confirmbox.cpp b/Telegram/SourceFiles/boxes/confirmbox.cpp index 9f8b9c1c1..96c453270 100644 --- a/Telegram/SourceFiles/boxes/confirmbox.cpp +++ b/Telegram/SourceFiles/boxes/confirmbox.cpp @@ -145,15 +145,6 @@ void ConfirmBox::closePressed() { emit cancelled(); } -void ConfirmBox::showAll() { - if (_informative) { - _confirm->show(); - } else { - _confirm->show(); - _cancel->show(); - } -} - void ConfirmBox::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { onConfirmPressed(); @@ -269,10 +260,6 @@ void MaxInviteBox::step_good(float64 ms, bool timer) { if (timer) update(); } -void MaxInviteBox::showAll() { - _close->show(); -} - void MaxInviteBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; @@ -362,11 +349,6 @@ bool ConvertToSupergroupBox::convertFail(const RPCError &error) { return true; } -void ConvertToSupergroupBox::showAll() { - _convert->show(); - _cancel->show(); -} - void ConvertToSupergroupBox::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { onConvert(); @@ -427,13 +409,6 @@ void PinMessageBox::onPin() { _requestId = MTP::send(MTPchannels_UpdatePinnedMessage(MTP_flags(flags), _channel->inputChannel, MTP_int(_msgId)), rpcDone(&PinMessageBox::pinDone), rpcFail(&PinMessageBox::pinFail)); } -void PinMessageBox::showAll() { - _text->show(); - _notify->show(); - _pin->show(); - _cancel->show(); -} - void PinMessageBox::pinDone(const MTPUpdates &updates) { if (App::main()) { App::main()->sentUpdatesReceived(updates); @@ -499,15 +474,6 @@ void RichDeleteMessageBox::onDelete() { Ui::hideLayer(); } -void RichDeleteMessageBox::showAll() { - _text->show(); - _banUser->show(); - _reportSpam->show(); - _deleteAll->show(); - _delete->show(); - _cancel->show(); -} - KickMemberBox::KickMemberBox(PeerData *chat, UserData *member) : ConfirmBox(lng_profile_sure_kick(lt_user, member->firstName), lang(lng_box_remove)) , _chat(chat) @@ -599,7 +565,3 @@ void ConfirmInviteBox::paintEvent(QPaintEvent *e) { left += _userWidth; } } - -void ConfirmInviteBox::showAll() { - showChildren(); -} diff --git a/Telegram/SourceFiles/boxes/confirmbox.h b/Telegram/SourceFiles/boxes/confirmbox.h index 410340971..fb4cdbc02 100644 --- a/Telegram/SourceFiles/boxes/confirmbox.h +++ b/Telegram/SourceFiles/boxes/confirmbox.h @@ -69,7 +69,6 @@ protected: void leaveEvent(QEvent *e) override; void closePressed() override; - void showAll() override; private slots: void onConfirmPressed(); @@ -163,8 +162,6 @@ protected: void mousePressEvent(QMouseEvent *e) override; void leaveEvent(QEvent *e) override; - void showAll() override; - private: void updateSelected(const QPoint &cursorGlobalPosition); void step_good(float64 ms, bool timer); @@ -200,8 +197,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; - private: void convertDone(const MTPUpdates &updates); bool convertFail(const RPCError &error); @@ -227,8 +222,6 @@ public slots: protected: void resizeEvent(QResizeEvent *e) override; - void showAll() override; - private: void pinDone(const MTPUpdates &updates); bool pinFail(const RPCError &error); @@ -258,8 +251,6 @@ public slots: protected: void resizeEvent(QResizeEvent *e) override; - void showAll() override; - private: ChannelData *_channel; UserData *_from; @@ -300,8 +291,6 @@ protected: void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override; - void showAll() override; - private: ChildWidget _title; ChildWidget _status; diff --git a/Telegram/SourceFiles/boxes/confirmphonebox.cpp b/Telegram/SourceFiles/boxes/confirmphonebox.cpp index 85e03a2ea..6b444d442 100644 --- a/Telegram/SourceFiles/boxes/confirmphonebox.cpp +++ b/Telegram/SourceFiles/boxes/confirmphonebox.cpp @@ -123,6 +123,7 @@ void ConfirmPhoneBox::launch() { connect(&_callTimer, SIGNAL(timeout()), this, SLOT(onCallStatusTimer())); + showChildren(); prepare(); Ui::showLayer(this); diff --git a/Telegram/SourceFiles/boxes/confirmphonebox.h b/Telegram/SourceFiles/boxes/confirmphonebox.h index b852d1c32..915aa4a5c 100644 --- a/Telegram/SourceFiles/boxes/confirmphonebox.h +++ b/Telegram/SourceFiles/boxes/confirmphonebox.h @@ -44,9 +44,6 @@ private slots: protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override { - showChildren(); - } void doSetInnerFocus() override; private: diff --git a/Telegram/SourceFiles/boxes/connectionbox.cpp b/Telegram/SourceFiles/boxes/connectionbox.cpp index 5e22dc7b5..646977d27 100644 --- a/Telegram/SourceFiles/boxes/connectionbox.cpp +++ b/Telegram/SourceFiles/boxes/connectionbox.cpp @@ -55,15 +55,12 @@ ConnectionBox::ConnectionBox() : AbstractBox(st::boxWidth) connect(_userInput, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); connect(_passwordInput, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + updateControlsVisibility(); + prepare(); } -void ConnectionBox::showAll() { - _autoRadio->show(); - _httpProxyRadio->show(); - _tcpProxyRadio->show(); - _tryIPv6->show(); - +void ConnectionBox::updateControlsVisibility() { int32 h = titleHeight() + st::boxOptionListPadding.top() + _autoRadio->height() + st::boxOptionListPadding.top() + _httpProxyRadio->height() + st::boxOptionListPadding.top() + _tcpProxyRadio->height() + st::boxOptionListPadding.top() + st::connectionIPv6Skip + _tryIPv6->height() + st::boxOptionListPadding.bottom() + st::boxPadding.bottom() + st::boxButtonPadding.top() + _save->height() + st::boxButtonPadding.bottom(); if (_httpProxyRadio->checked() || _tcpProxyRadio->checked()) { h += 2 * st::boxOptionListPadding.top() + 2 * _hostInput->height(); @@ -78,9 +75,6 @@ void ConnectionBox::showAll() { _passwordInput->hide(); } - _save->show(); - _cancel->show(); - setMaxHeight(h); resizeEvent(0); } @@ -130,7 +124,7 @@ void ConnectionBox::resizeEvent(QResizeEvent *e) { } void ConnectionBox::onChange() { - showAll(); + updateControlsVisibility(); if (_httpProxyRadio->checked() || _tcpProxyRadio->checked()) { _hostInput->setFocus(); if (_httpProxyRadio->checked() && !_portInput->getLastText().toInt()) { @@ -235,19 +229,6 @@ AutoDownloadBox::AutoDownloadBox() : AbstractBox(st::boxWidth) prepare(); } -void AutoDownloadBox::showAll() { - _photoPrivate->show(); - _photoGroups->show(); - _audioPrivate->show(); - _audioGroups->show(); - _gifPrivate->show(); - _gifGroups->show(); - _gifPlay->show(); - - _save->show(); - _cancel->show(); -} - void AutoDownloadBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; diff --git a/Telegram/SourceFiles/boxes/connectionbox.h b/Telegram/SourceFiles/boxes/connectionbox.h index 346fcdde4..ac0147634 100644 --- a/Telegram/SourceFiles/boxes/connectionbox.h +++ b/Telegram/SourceFiles/boxes/connectionbox.h @@ -46,10 +46,11 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: + void updateControlsVisibility(); + ChildWidget _hostInput; ChildWidget _portInput; ChildWidget _userInput; @@ -77,8 +78,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; - private: ChildWidget _photoPrivate; ChildWidget _photoGroups; diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index cd40cbcb0..fe2b8e8f5 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -134,7 +134,11 @@ void ContactsBox::init() { } updateScrollSkips(); }); - + if (_inner->chat() && _inner->membersFilter() == MembersFilter::Admins && _inner->allAdmins()) { + _select->hideFast(); + } else { + _select->showFast(); + } if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { _next->hide(); _cancel->hide(); @@ -239,30 +243,6 @@ bool ContactsBox::peopleFailed(const RPCError &error, mtpRequestId req) { return true; } -void ContactsBox::showAll() { - if (_inner->chat() && _inner->membersFilter() == MembersFilter::Admins && _inner->allAdmins()) { - _select->hideFast(); - } else { - _select->showFast(); - } - if (_inner->channel() && _inner->membersFilter() == MembersFilter::Admins) { - _next->hide(); - _cancel->hide(); - } else if (_inner->chat() || _inner->channel()) { - _next->show(); - _cancel->show(); - } else if (_inner->creating() != CreatingGroupNone) { - _next->show(); - _cancel->show(); - } else { - _next->hide(); - _cancel->hide(); - } - _topShadow->show(); - if (_bottomShadow) _bottomShadow->show(); - ItemListBox::showAll(); -} - void ContactsBox::doSetInnerFocus() { if (_select->isHidden()) { _inner->setFocus(); diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 2dd846199..5df204e0b 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -79,7 +79,6 @@ protected: void resizeEvent(QResizeEvent *e) override; void closePressed() override; - void showAll() override; void doSetInnerFocus() override; private: diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.cpp b/Telegram/SourceFiles/boxes/downloadpathbox.cpp index 8f3051691..728b98612 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.cpp +++ b/Telegram/SourceFiles/boxes/downloadpathbox.cpp @@ -50,22 +50,13 @@ DownloadPathBox::DownloadPathBox() : AbstractBox() if (!_path.isEmpty() && _path != qsl("tmp")) { setPathText(QDir::toNativeSeparators(_path)); } + updateControlsVisibility(); + prepare(); } -void DownloadPathBox::showAll() { - _default->show(); - _temp->show(); - _dir->show(); - - if (_dir->checked()) { - _pathLink->show(); - } else { - _pathLink->hide(); - } - - _save->show(); - _cancel->show(); +void DownloadPathBox::updateControlsVisibility() { + _pathLink->setVisible(_dir->checked()); int32 h = titleHeight() + st::boxOptionListPadding.top() + _default->height() + st::boxOptionListPadding.top() + _temp->height() + st::boxOptionListPadding.top() + _dir->height(); if (_dir->checked()) h += st::downloadPathSkip + _pathLink->height(); @@ -111,7 +102,7 @@ void DownloadPathBox::onChange() { } else { _path = QString(); } - showAll(); + updateControlsVisibility(); update(); } diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.h b/Telegram/SourceFiles/boxes/downloadpathbox.h index 4d543da4b..38cccc0bf 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.h +++ b/Telegram/SourceFiles/boxes/downloadpathbox.h @@ -44,9 +44,8 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; - private: + void updateControlsVisibility(); void setPathText(const QString &text); QString _path; diff --git a/Telegram/SourceFiles/boxes/languagebox.cpp b/Telegram/SourceFiles/boxes/languagebox.cpp index e07104148..5114bc032 100644 --- a/Telegram/SourceFiles/boxes/languagebox.cpp +++ b/Telegram/SourceFiles/boxes/languagebox.cpp @@ -66,13 +66,6 @@ _close(this, lang(lng_box_ok), st::defaultBoxButton) { prepare(); } -void LanguageBox::showAll() { - _close->show(); - for (int32 i = 0, l = _langs.size(); i < l; ++i) { - _langs[i]->show(); - } -} - void LanguageBox::mousePressEvent(QMouseEvent *e) { if ((e->modifiers() & Qt::CTRL) && (e->modifiers() & Qt::ALT) && (e->modifiers() & Qt::SHIFT)) { for (int32 i = 1; i < languageCount; ++i) { diff --git a/Telegram/SourceFiles/boxes/languagebox.h b/Telegram/SourceFiles/boxes/languagebox.h index 860fc5ac9..61780df76 100644 --- a/Telegram/SourceFiles/boxes/languagebox.h +++ b/Telegram/SourceFiles/boxes/languagebox.h @@ -42,8 +42,6 @@ protected: void mousePressEvent(QMouseEvent *e) override; void paintEvent(QPaintEvent *e) override; - void showAll() override; - private: QVector _langs; ChildWidget _close; diff --git a/Telegram/SourceFiles/boxes/localstoragebox.cpp b/Telegram/SourceFiles/boxes/localstoragebox.cpp index afbd1eeb5..4962518b4 100644 --- a/Telegram/SourceFiles/boxes/localstoragebox.cpp +++ b/Telegram/SourceFiles/boxes/localstoragebox.cpp @@ -38,6 +38,8 @@ LocalStorageBox::LocalStorageBox() : AbstractBox() subscribe(FileDownload::ImageLoaded(), [this] { update(); }); + updateControls(); + checkLocalStoredCounts(); prepare(); } @@ -56,11 +58,6 @@ void LocalStorageBox::updateControls() { update(); } -void LocalStorageBox::showAll() { - showChildren(); - _clear->setVisible(_imagesCount > 0 || _audiosCount > 0); -} - void LocalStorageBox::checkLocalStoredCounts() { int imagesCount = Local::hasImages() + Local::hasStickers() + Local::hasWebFiles(); int audiosCount = Local::hasAudios(); diff --git a/Telegram/SourceFiles/boxes/localstoragebox.h b/Telegram/SourceFiles/boxes/localstoragebox.h index 9bb5120e8..f8dd5dd50 100644 --- a/Telegram/SourceFiles/boxes/localstoragebox.h +++ b/Telegram/SourceFiles/boxes/localstoragebox.h @@ -41,8 +41,6 @@ private slots: protected: void paintEvent(QPaintEvent *e) override; - void showAll() override; - private: void updateControls(); void checkLocalStoredCounts(); diff --git a/Telegram/SourceFiles/boxes/passcodebox.cpp b/Telegram/SourceFiles/boxes/passcodebox.cpp index 54e305519..3c3be77ec 100644 --- a/Telegram/SourceFiles/boxes/passcodebox.cpp +++ b/Telegram/SourceFiles/boxes/passcodebox.cpp @@ -30,13 +30,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "ui/widgets/input_fields.h" PasscodeBox::PasscodeBox(bool turningOff) : AbstractBox(st::boxWidth) -, _replacedBy(0) , _turningOff(turningOff) -, _cloudPwd(false) -, _setRequest(0) -, _hasRecovery(false) -, _skipEmailWarning(false) -, _aboutHeight(0) , _about(st::boxWidth - st::boxPadding.left() * 1.5) , _saveButton(this, lang(_turningOff ? lng_passcode_remove_button : lng_settings_save), st::defaultBoxButton) , _cancelButton(this, lang(lng_cancel), st::cancelBoxButton) @@ -47,19 +41,14 @@ PasscodeBox::PasscodeBox(bool turningOff) : AbstractBox(st::boxWidth) , _recoverEmail(this, st::defaultInputField, lang(lng_cloud_password_email)) , _recover(this, lang(lng_signin_recover)) { init(); - prepare(); } PasscodeBox::PasscodeBox(const QByteArray &newSalt, const QByteArray &curSalt, bool hasRecovery, const QString &hint, bool turningOff) : AbstractBox(st::boxWidth) -, _replacedBy(0) , _turningOff(turningOff) , _cloudPwd(true) -, _setRequest(0) , _newSalt(newSalt) , _curSalt(curSalt) , _hasRecovery(hasRecovery) -, _skipEmailWarning(false) -, _aboutHeight(0) , _about(st::boxWidth - st::boxPadding.left() * 1.5) , _saveButton(this, lang(_turningOff ? lng_passcode_remove_button : lng_settings_save), st::defaultBoxButton) , _cancelButton(this, lang(lng_cancel), st::cancelBoxButton) @@ -72,8 +61,8 @@ PasscodeBox::PasscodeBox(const QByteArray &newSalt, const QByteArray &curSalt, b textstyleSet(&st::usernameTextStyle); if (!hint.isEmpty()) _hintText.setText(st::normalFont, lng_signin_hint(lt_password_hint, hint)); textstyleRestore(); + init(); - prepare(); } void PasscodeBox::init() { @@ -116,49 +105,16 @@ void PasscodeBox::init() { connect(_recoverEmail, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); connect(_recover, SIGNAL(clicked()), this, SLOT(onRecoverByEmail())); -} -void PasscodeBox::showAll() { bool has = _cloudPwd ? (!_curSalt.isEmpty()) : Global::LocalPasscode(); - if (_turningOff) { - _oldPasscode->show(); - if (_cloudPwd && _hasRecovery) { - _recover->show(); - } else { - _recover->hide(); - } - _newPasscode->hide(); - _reenterPasscode->hide(); - _passwordHint->hide(); - _recoverEmail->hide(); - } else { - if (has) { - _oldPasscode->show(); - if (_cloudPwd && _hasRecovery) { - _recover->show(); - } else { - _recover->hide(); - } - } else { - _oldPasscode->hide(); - _recover->hide(); - } - _newPasscode->show(); - _reenterPasscode->show(); - if (_cloudPwd) { - _passwordHint->show(); - } else { - _passwordHint->hide(); - } - if (_cloudPwd && _curSalt.isEmpty()) { - _recoverEmail->show(); - } else { - _recoverEmail->hide(); - } - } - _saveButton->show(); - _cancelButton->show(); - AbstractBox::showAll(); + _oldPasscode->setVisible(_turningOff || has); + _recover->setVisible((_turningOff || has) && _cloudPwd && _hasRecovery); + _newPasscode->setVisible(!_turningOff); + _reenterPasscode->setVisible(!_turningOff); + _passwordHint->setVisible(!_turningOff && _cloudPwd); + _recoverEmail->setVisible(!_turningOff && _cloudPwd && _curSalt.isEmpty()); + + prepare(); } void PasscodeBox::onSubmit() { @@ -511,13 +467,6 @@ RecoverBox::RecoverBox(const QString &pattern) : AbstractBox(st::boxWidth) prepare(); } -void RecoverBox::showAll() { - _recoverCode->show(); - _saveButton->show(); - _cancelButton->show(); - AbstractBox::showAll(); -} - void RecoverBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; diff --git a/Telegram/SourceFiles/boxes/passcodebox.h b/Telegram/SourceFiles/boxes/passcodebox.h index 251da9c91..c4c7469a7 100644 --- a/Telegram/SourceFiles/boxes/passcodebox.h +++ b/Telegram/SourceFiles/boxes/passcodebox.h @@ -54,7 +54,6 @@ signals: protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: @@ -69,14 +68,16 @@ private: void recover(); QString _pattern; - AbstractBox *_replacedBy; - bool _turningOff, _cloudPwd; - mtpRequestId _setRequest; + AbstractBox *_replacedBy = nullptr; + bool _turningOff = false; + bool _cloudPwd = false; + mtpRequestId _setRequest = 0; QByteArray _newSalt, _curSalt; - bool _hasRecovery, _skipEmailWarning = false; + bool _hasRecovery = false; + bool _skipEmailWarning = false; - int32 _aboutHeight; + int _aboutHeight = 0; QString _boxTitle; Text _about, _hintText; @@ -112,7 +113,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: diff --git a/Telegram/SourceFiles/boxes/photocropbox.cpp b/Telegram/SourceFiles/boxes/photocropbox.cpp index 60e3d031d..9ecd1b178 100644 --- a/Telegram/SourceFiles/boxes/photocropbox.cpp +++ b/Telegram/SourceFiles/boxes/photocropbox.cpp @@ -304,8 +304,3 @@ void PhotoCropBox::onSend() { void PhotoCropBox::onReady(const QImage &tosend) { App::app()->uploadProfilePhoto(tosend, _peerId); } - -void PhotoCropBox::showAll() { - _done->show(); - _cancel->show(); -} diff --git a/Telegram/SourceFiles/boxes/photocropbox.h b/Telegram/SourceFiles/boxes/photocropbox.h index 65671f206..4e73cdf21 100644 --- a/Telegram/SourceFiles/boxes/photocropbox.h +++ b/Telegram/SourceFiles/boxes/photocropbox.h @@ -50,8 +50,6 @@ protected: void mouseReleaseEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; - void showAll() override; - private: void init(const QImage &img, PeerData *peer); diff --git a/Telegram/SourceFiles/boxes/photosendbox.cpp b/Telegram/SourceFiles/boxes/photosendbox.cpp index 24acd18f0..a2739fc71 100644 --- a/Telegram/SourceFiles/boxes/photosendbox.cpp +++ b/Telegram/SourceFiles/boxes/photosendbox.cpp @@ -137,6 +137,7 @@ PhotoSendBox::PhotoSendBox(const FileLoadResultPtr &file) : AbstractBox(st::boxW _statusw = qMax(_name.maxWidth(), st::normalFont->width(_status)); _isImage = fileIsImage(_file->filename, _file->filemime); } + if (_file->type != PreparePhoto) { _compressed->hide(); } @@ -172,6 +173,7 @@ PhotoSendBox::PhotoSendBox(const QString &phone, const QString &fname, const QSt connect(_cancel, SIGNAL(clicked()), this, SLOT(onClose())); _compressed->hide(); + _caption->hide(); _name.setText(st::semiboldFont, lng_full_name(lt_first_name, _fname, lt_last_name, _lname), _textNameOptions); _status = _phone; @@ -182,7 +184,6 @@ PhotoSendBox::PhotoSendBox(const QString &phone, const QString &fname, const QSt } void PhotoSendBox::onCompressedChange() { - showAll(); if (_caption->isHidden()) { setFocus(); } else { @@ -313,20 +314,6 @@ void PhotoSendBox::closePressed() { } } -void PhotoSendBox::showAll() { - _send->show(); - _cancel->show(); - if (_file) { - if (_file->type == PreparePhoto) { - _compressed->show(); - } - _caption->show(); - } else { - _caption->hide(); - _compressed->hide(); - } -} - void PhotoSendBox::doSetInnerFocus() { if (_caption->isHidden()) { setFocus(); @@ -630,12 +617,6 @@ void EditCaptionBox::resizeEvent(QResizeEvent *e) { AbstractBox::resizeEvent(e); } -void EditCaptionBox::showAll() { - _save->show(); - _cancel->show(); - _field->show(); -} - void EditCaptionBox::doSetInnerFocus() { _field->setFocus(); } diff --git a/Telegram/SourceFiles/boxes/photosendbox.h b/Telegram/SourceFiles/boxes/photosendbox.h index 0d1588430..c51641021 100644 --- a/Telegram/SourceFiles/boxes/photosendbox.h +++ b/Telegram/SourceFiles/boxes/photosendbox.h @@ -47,7 +47,6 @@ protected: void resizeEvent(QResizeEvent *e) override; void closePressed() override; - void showAll() override; void doSetInnerFocus() override; private: @@ -95,7 +94,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: diff --git a/Telegram/SourceFiles/boxes/report_box.h b/Telegram/SourceFiles/boxes/report_box.h index 28520ee20..b7f0d2c3b 100644 --- a/Telegram/SourceFiles/boxes/report_box.h +++ b/Telegram/SourceFiles/boxes/report_box.h @@ -43,9 +43,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override { - showChildren(); - } void doSetInnerFocus() override; private: diff --git a/Telegram/SourceFiles/boxes/sessionsbox.cpp b/Telegram/SourceFiles/boxes/sessionsbox.cpp index 6b757699c..457f28958 100644 --- a/Telegram/SourceFiles/boxes/sessionsbox.cpp +++ b/Telegram/SourceFiles/boxes/sessionsbox.cpp @@ -32,7 +32,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org #include "styles/style_boxes.h" SessionsBox::SessionsBox() : ScrollableBox(st::sessionsScroll) -, _loading(true) +, _loading(false) , _inner(this, &_list, &_current) , _shadow(this) , _done(this, lang(lng_about_done), st::defaultBoxButton) @@ -49,27 +49,25 @@ SessionsBox::SessionsBox() : ScrollableBox(st::sessionsScroll) init(_inner, st::boxButtonPadding.bottom() + _done->height() + st::boxButtonPadding.top(), titleHeight()); _inner->resize(width(), st::noContactsHeight); + setLoading(true); + prepare(); MTP::send(MTPaccount_GetAuthorizations(), rpcDone(&SessionsBox::gotAuthorizations)); } -void SessionsBox::resizeEvent(QResizeEvent *e) { - ScrollableBox::resizeEvent(e); - _shadow.setGeometry(0, height() - st::boxButtonPadding.bottom() - _done->height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); - _done->moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _done->height()); +void SessionsBox::setLoading(bool loading) { + if (_loading != loading) { + _loading = loading; + scrollArea()->setVisible(!_loading); + _shadow->setVisible(!_loading); + } } -void SessionsBox::showAll() { - _done->show(); - if (_loading) { - scrollArea()->hide(); - _shadow.hide(); - } else { - scrollArea()->show(); - _shadow.show(); - } - ScrollableBox::showAll(); +void SessionsBox::resizeEvent(QResizeEvent *e) { + ScrollableBox::resizeEvent(e); + _shadow->setGeometry(0, height() - st::boxButtonPadding.bottom() - _done->height() - st::boxButtonPadding.top() - st::lineWidth, width(), st::lineWidth); + _done->moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _done->height()); } void SessionsBox::paintEvent(QPaintEvent *e) { @@ -80,28 +78,33 @@ void SessionsBox::paintEvent(QPaintEvent *e) { p.translate(0, titleHeight()); if (_loading) { - p.setFont(st::noContactsFont->f); - p.setPen(st::noContactsColor->p); + p.setFont(st::noContactsFont); + p.setPen(st::noContactsColor); p.drawText(QRect(0, 0, width(), st::noContactsHeight), lang(lng_contacts_loading), style::al_center); } } void SessionsBox::gotAuthorizations(const MTPaccount_Authorizations &result) { - _loading = false; _shortPollRequest = 0; + setLoading(false); - int32 availCurrent = st::boxWideWidth - st::sessionPadding.left() - st::sessionTerminateSkip; - int32 availOther = availCurrent - st::sessionTerminate.iconPosition.x();// -st::sessionTerminate.width - st::sessionTerminateSkip; + auto availCurrent = st::boxWideWidth - st::sessionPadding.left() - st::sessionTerminateSkip; + auto availOther = availCurrent - st::sessionTerminate.iconPosition.x();// -st::sessionTerminate.width - st::sessionTerminateSkip; _list.clear(); - const auto &v(result.c_account_authorizations().vauthorizations.c_vector().v); - int32 l = v.size(); - if (l > 1) _list.reserve(l - 1); + if (result.type() != mtpc_account_authorizations) { + return; + } + auto &v = result.c_account_authorizations().vauthorizations.c_vector().v; + _list.reserve(v.size()); const CountriesByISO2 &countries(countriesByISO2()); - for (int32 i = 0; i < l; ++i) { - const auto &d(v.at(i).c_authorization()); + for_const (auto &auth, v) { + if (auth.type() != mtpc_authorization) { + continue; + } + auto &d = auth.c_authorization(); Data data; data.hash = d.vhash.v; @@ -195,30 +198,20 @@ void SessionsBox::gotAuthorizations(const MTPaccount_Authorizations &result) { } } _inner->listUpdated(); - if (!_done->isHidden()) { - showAll(); - update(); - } + + update(); _shortPollTimer.start(SessionsShortPollTimeout); } void SessionsBox::onOneTerminated() { - if (_list.isEmpty()) { - if (!_done->isHidden()) { - showAll(); - update(); - } - } + update(); } void SessionsBox::onShortPollAuthorizations() { if (!_shortPollRequest) { _shortPollRequest = MTP::send(MTPaccount_GetAuthorizations(), rpcDone(&SessionsBox::gotAuthorizations)); - if (!_done->isHidden()) { - showAll(); - update(); - } + update(); } } @@ -236,11 +229,7 @@ void SessionsBox::onAllTerminated() { } void SessionsBox::onTerminateAll() { - _loading = true; - if (!_done->isHidden()) { - showAll(); - update(); - } + setLoading(true); } SessionsBox::Inner::Inner(QWidget *parent, SessionsBox::List *list, SessionsBox::Data *current) : TWidget(parent) diff --git a/Telegram/SourceFiles/boxes/sessionsbox.h b/Telegram/SourceFiles/boxes/sessionsbox.h index 141a4adda..5a48aea7e 100644 --- a/Telegram/SourceFiles/boxes/sessionsbox.h +++ b/Telegram/SourceFiles/boxes/sessionsbox.h @@ -48,9 +48,8 @@ protected: void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override; - void showAll() override; - private: + void setLoading(bool loading); struct Data { uint64 hash; @@ -69,7 +68,7 @@ private: class Inner; ChildWidget _inner; - ScrollableBoxShadow _shadow; + ChildWidget _shadow; ChildWidget _done; SingleTimer _shortPollTimer; diff --git a/Telegram/SourceFiles/boxes/stickers_box.cpp b/Telegram/SourceFiles/boxes/stickers_box.cpp index d56ab53a2..3daca8242 100644 --- a/Telegram/SourceFiles/boxes/stickers_box.cpp +++ b/Telegram/SourceFiles/boxes/stickers_box.cpp @@ -488,20 +488,6 @@ void StickersBox::onSave() { } } -void StickersBox::showAll() { - if (_topShadow) { - _topShadow->show(); - } - if (_save) { - _save->show(); - } - if (_cancel) { - _cancel->show(); - _bottomShadow->show(); - } - ItemListBox::showAll(); -} - StickersBox::Inner::Inner(QWidget *parent, StickersBox::Section section) : TWidget(parent) , _section(section) , _rowHeight(st::contactsPadding.top() + st::contactsPhotoSize + st::contactsPadding.bottom()) diff --git a/Telegram/SourceFiles/boxes/stickers_box.h b/Telegram/SourceFiles/boxes/stickers_box.h index f8a66809c..a63a5b57d 100644 --- a/Telegram/SourceFiles/boxes/stickers_box.h +++ b/Telegram/SourceFiles/boxes/stickers_box.h @@ -62,7 +62,6 @@ protected: void paintEvent(QPaintEvent *e) override; void closePressed() override; - void showAll() override; private: void setup(); diff --git a/Telegram/SourceFiles/boxes/stickersetbox.cpp b/Telegram/SourceFiles/boxes/stickersetbox.cpp index 8c69d9b5b..ae3fe9294 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.cpp +++ b/Telegram/SourceFiles/boxes/stickersetbox.cpp @@ -57,6 +57,7 @@ StickerSetBox::StickerSetBox(const MTPInputStickerSet &set) : ScrollableBox(st:: connect(_inner, SIGNAL(installed(uint64)), this, SLOT(onInstalled(uint64))); onStickersUpdated(); + updateControlsVisibility(); onScroll(); @@ -69,7 +70,7 @@ void StickerSetBox::onInstalled(uint64 setId) { } void StickerSetBox::onStickersUpdated() { - showAll(); + updateControlsVisibility(); } void StickerSetBox::onAddStickers() { @@ -84,7 +85,7 @@ void StickerSetBox::onShareStickers() { void StickerSetBox::onUpdateButtons() { if (!_cancel->isHidden() || !_done->isHidden()) { - showAll(); + updateControlsVisibility(); } } @@ -94,9 +95,7 @@ void StickerSetBox::onScroll() { _inner->setVisibleTopBottom(scrollTop, scrollTop + scroll->height()); } -void StickerSetBox::showAll() { - ScrollableBox::showAll(); - int32 cnt = _inner->notInstalled(); +void StickerSetBox::updateControlsVisibility() { if (_inner->loaded()) { _shadow.show(); if (_inner->notInstalled()) { diff --git a/Telegram/SourceFiles/boxes/stickersetbox.h b/Telegram/SourceFiles/boxes/stickersetbox.h index 52ebf0e47..691ce6919 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.h +++ b/Telegram/SourceFiles/boxes/stickersetbox.h @@ -54,9 +54,9 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; - private: + void updateControlsVisibility(); + class Inner; ChildWidget _inner; ScrollableBoxShadow _shadow; diff --git a/Telegram/SourceFiles/boxes/usernamebox.cpp b/Telegram/SourceFiles/boxes/usernamebox.cpp index b0772ea66..66aea8efc 100644 --- a/Telegram/SourceFiles/boxes/usernamebox.cpp +++ b/Telegram/SourceFiles/boxes/usernamebox.cpp @@ -55,16 +55,9 @@ _about(st::boxWidth - st::usernamePadding.left()) { _checkTimer.setSingleShot(true); connect(&_checkTimer, SIGNAL(timeout()), this, SLOT(onCheck())); - prepare(); -} - -void UsernameBox::showAll() { - _username->show(); - _save->show(); - _cancel->show(); updateLinkText(); - AbstractBox::showAll(); + prepare(); } void UsernameBox::doSetInnerFocus() { diff --git a/Telegram/SourceFiles/boxes/usernamebox.h b/Telegram/SourceFiles/boxes/usernamebox.h index afe476fd0..f827996b3 100644 --- a/Telegram/SourceFiles/boxes/usernamebox.h +++ b/Telegram/SourceFiles/boxes/usernamebox.h @@ -46,7 +46,6 @@ protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; - void showAll() override; void doSetInnerFocus() override; private: diff --git a/Telegram/SourceFiles/core/utils.h b/Telegram/SourceFiles/core/utils.h index 7f6ea2715..35ae9f7a6 100644 --- a/Telegram/SourceFiles/core/utils.h +++ b/Telegram/SourceFiles/core/utils.h @@ -56,6 +56,31 @@ inline constexpr D up_cast(T object) { return internal::up_cast_helper(std_::integral_constant::value || std_::is_same::value>(), object); } +template +class scope_guard_helper { +public: + scope_guard_helper(Lambda on_scope_exit) : _handler(std_::move(on_scope_exit)) { + } + void dismiss() { + _dismissed = true; + } + ~scope_guard_helper() { + if (!_dismissed) { + _handler(); + } + } + +private: + Lambda _handler; + bool _dismissed = false; + +}; + +template +scope_guard_helper scope_guard(Lambda on_scope_exit) { + return scope_guard_helper(std_::move(on_scope_exit)); +} + } // namespace base template diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 265cfca37..73a1fc60c 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -5679,11 +5679,12 @@ void HistoryWidget::leaveEvent(QEvent *e) { } void HistoryWidget::mouseMoveEvent(QMouseEvent *e) { - QPoint pos(e ? e->pos() : mapFromGlobal(QCursor::pos())); - bool inRecord = _send->geometry().contains(pos); - bool inField = pos.y() >= (_scroll->y() + _scroll->height()) && pos.y() < height() && pos.x() >= 0 && pos.x() < width(); - bool inReplyEdit = QRect(st::historyReplySkip, _field->y() - st::historySendPadding - st::historyReplyHeight, width() - st::historyReplySkip - _fieldBarCancel->width(), st::historyReplyHeight).contains(pos) && (_editMsgId || replyToId()); - bool inPinnedMsg = QRect(0, 0, width(), st::historyReplyHeight).contains(pos) && _pinnedBar; + auto pos = e ? e->pos() : mapFromGlobal(QCursor::pos()); + auto inRecord = _send->geometry().contains(pos); + auto inField = pos.y() >= (_scroll->y() + _scroll->height()) && pos.y() < height() && pos.x() >= 0 && pos.x() < width(); + auto inReplyEdit = QRect(st::historyReplySkip, _field->y() - st::historySendPadding - st::historyReplyHeight, width() - st::historyReplySkip - _fieldBarCancel->width(), st::historyReplyHeight).contains(pos) && (_editMsgId || replyToId()); + auto inPinnedMsg = QRect(0, 0, width(), st::historyReplyHeight).contains(pos) && _pinnedBar; + auto inClickable = inRecord || inReplyEdit || inPinnedMsg; if (inRecord != _inRecord) { _inRecord = inRecord; update(_send->geometry()); @@ -5694,13 +5695,11 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) { a_recordCancelActive.start(_inField ? 0. : 1.); _a_record.start(); } - if (inReplyEdit != _inReplyEdit) { - _inReplyEdit = inReplyEdit; - setCursor(inReplyEdit ? style::cur_pointer : style::cur_default); - } - if (inPinnedMsg != _inPinnedMsg) { - _inPinnedMsg = inPinnedMsg; - setCursor(inPinnedMsg ? style::cur_pointer : style::cur_default); + _inReplyEdit = inReplyEdit; + _inPinnedMsg = inPinnedMsg; + if (inClickable != _inClickable) { + _inClickable = inClickable; + setCursor(_inClickable ? style::cur_pointer : style::cur_default); } } diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index b67ce76df..2ee78b572 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -1103,6 +1103,7 @@ private: bool _inField = false; bool _inReplyEdit = false; bool _inPinnedMsg = false; + bool _inClickable = false; anim::ivalue a_recordingLevel = { 0, 0 }; int32 _recordingSamples = 0; anim::fvalue a_recordDown = { 0, 0 }; diff --git a/Telegram/SourceFiles/layerwidget.cpp b/Telegram/SourceFiles/layerwidget.cpp index e297ede63..235f87acd 100644 --- a/Telegram/SourceFiles/layerwidget.cpp +++ b/Telegram/SourceFiles/layerwidget.cpp @@ -37,178 +37,315 @@ constexpr int kStickerPreviewEmojiLimit = 10; } // namespace -void LayerWidget::setInnerFocus() { - auto focused = App::wnd()->focusWidget(); - if (!isAncestorOf(focused)) { - doSetInnerFocus(); - } -} - class LayerStackWidget::BackgroundWidget : public TWidget { public: BackgroundWidget(QWidget *parent) : TWidget(parent) , _shadow(st::boxShadow) { } - void setBodyCache(QPixmap &&bodyCache) { - _bodyCache = std_::move(bodyCache); + void setDoneCallback(base::lambda_unique callback) { + _doneCallback = std_::move(callback); } - void setMainMenuCache(QPixmap &&mainMenuCache) { - _mainMenuCache = std_::move(mainMenuCache); - if (!_mainMenuCache.isNull()) { - _mainMenuWidth = _mainMenuCache.width() / cIntRetinaFactor(); - _mainMenuRight = 0; - } - } - void setMainMenuRight(int right) { - _mainMenuRight = right; - } - void setLayerBox(const QRect &box, const QRect &hiddenSpecialBox) { - _box = box; - _hiddenSpecialBox = hiddenSpecialBox; - update(); - } - void setOpacity(float64 opacity) { - _opacity = opacity; + + void setLayerBoxes(const QRect &specialLayerBox, const QRect &layerBox); + void setCacheImages(QPixmap &&bodyCache, QPixmap &&mainMenuCache, QPixmap &&specialLayerCache, QPixmap &&layerCache); + void startAnimation(Action action); + void finishAnimation(); + + bool animating() const { + return _a_mainMenuShown.animating() || _a_specialLayerShown.animating() || _a_layerShown.animating(); } protected: - void paintEvent(QPaintEvent *e) override { - Painter p(this); - - auto hasMainMenuCache = !_mainMenuCache.isNull(); - if (hasMainMenuCache || _mainMenuRight) { - auto boxLeft = _mainMenuRight; - auto cacheWidth = boxLeft * cIntRetinaFactor(); - if (left > 0 && hasMainMenuCache) { - p.drawPixmapLeft(0, 0, width(), _mainMenuCache, rtlrect(_mainMenuCache.width() - cacheWidth, 0, cacheWidth, height() * cIntRetinaFactor(), _mainMenuCache.width())); - } - if (!_bodyCache.isNull()) { - p.drawPixmapLeft(boxLeft, 0, width(), _bodyCache, rtlrect(cacheWidth, 0, _bodyCache.width() - cacheWidth, height() * cIntRetinaFactor(), _bodyCache.width() - cacheWidth)); - } - _shadow.paint(p, QRect(0, 0, boxLeft, height()), 0, Ui::RectShadow::Side::Right); - - p.setOpacity(_opacity); - p.fillRect(myrtlrect(boxLeft, 0, width() - boxLeft, height()), st::layerBg); - return; - } - if (!_bodyCache.isNull()) { - p.drawPixmap(0, 0, _bodyCache); - } - p.setOpacity(_opacity); - if (_box.isNull()) { - p.fillRect(rect(), st::layerBg); - } else { - auto clip = QRegion(rect()) - _box; - for (auto &r : clip.rects()) { - p.fillRect(r, st::layerBg); - } - p.setClipRegion(clip); - _shadow.paint(p, _box, st::boxShadowShift); - if (!_hiddenSpecialBox.isNull()) { - p.setClipRegion(QRegion(rect()) - _hiddenSpecialBox); - _shadow.paint(p, _hiddenSpecialBox, st::boxShadowShift); - } - } - } + void paintEvent(QPaintEvent *e) override; private: + bool isShown() const { + return _mainMenuShown || _specialLayerShown || _layerShown; + } + void checkIfDone(); + void setMainMenuShown(bool shown); + void setSpecialLayerShown(bool shown); + void setLayerShown(bool shown); + void checkWasShown(bool wasShown); + void animationCallback(); + QPixmap _bodyCache; QPixmap _mainMenuCache; - int _mainMenuWidth = 0; - int _mainMenuRight = 0; + QPixmap _specialLayerCache; + QPixmap _layerCache; - QRect _box, _hiddenSpecialBox; - float64 _opacity = 0.; + base::lambda_unique _doneCallback; + + bool _wasAnimating = false; + bool _inPaintEvent = false; + FloatAnimation _a_shown; + FloatAnimation _a_mainMenuShown; + FloatAnimation _a_specialLayerShown; + FloatAnimation _a_layerShown; Ui::RectShadow _shadow; + QRect _specialLayerBox, _specialLayerCacheBox; + QRect _layerBox, _layerCacheBox; + int _mainMenuRight = 0; + + bool _mainMenuShown = false; + bool _specialLayerShown = false; + bool _layerShown = false; + }; -LayerStackWidget::LayerStackWidget(QWidget *parent) : TWidget(parent) -, _background(this) -, a_bg(0) -, a_layer(0) -, _a_background(animation(this, &LayerStackWidget::step_background)) { - setGeometry(parentWidget()->rect()); - hide(); +void LayerStackWidget::BackgroundWidget::setCacheImages(QPixmap &&bodyCache, QPixmap &&mainMenuCache, QPixmap &&specialLayerCache, QPixmap &&layerCache) { + _bodyCache = std_::move(bodyCache); + _mainMenuCache = std_::move(mainMenuCache); + _specialLayerCache = std_::move(specialLayerCache); + _layerCache = std_::move(layerCache); + _specialLayerCacheBox = _specialLayerBox; + _layerCacheBox = _layerBox; + setAttribute(Qt::WA_OpaquePaintEvent, !_bodyCache.isNull()); } -void LayerStackWidget::paintEvent(QPaintEvent *e) { - if (!layer() && !_specialLayer && _layerCache.isNull()) { +void LayerStackWidget::BackgroundWidget::startAnimation(Action action) { + if (action == Action::ShowMainMenu) { + setMainMenuShown(true); + } else if (action != Action::HideLayer) { + setMainMenuShown(false); + } + if (action == Action::ShowSpecialLayer) { + setSpecialLayerShown(true); + } else if (action == Action::ShowMainMenu || action == Action::HideAll) { + setSpecialLayerShown(false); + } + if (action == Action::ShowLayer) { + setLayerShown(true); + } else { + setLayerShown(false); + } + _wasAnimating = true; + checkIfDone(); +} + +void LayerStackWidget::BackgroundWidget::checkIfDone() { + if (!_wasAnimating || _inPaintEvent || animating()) { + return; + } + _wasAnimating = false; + _bodyCache = _mainMenuCache = _specialLayerCache = _layerCache = QPixmap(); + setAttribute(Qt::WA_OpaquePaintEvent, false); + if (_doneCallback) { + _doneCallback(); + } +} + +void LayerStackWidget::BackgroundWidget::setMainMenuShown(bool shown) { + auto wasShown = isShown(); + if (_mainMenuShown != shown) { + _mainMenuShown = shown; + _a_mainMenuShown.start([this] { animationCallback(); }, _mainMenuShown ? 0. : 1., _mainMenuShown ? 1. : 0., st::boxDuration, anim::easeOutCirc); + } + _mainMenuRight = _mainMenuShown ? (_mainMenuCache.width() / cIntRetinaFactor()) : 0; + checkWasShown(wasShown); +} + +void LayerStackWidget::BackgroundWidget::setSpecialLayerShown(bool shown) { + auto wasShown = isShown(); + if (_specialLayerShown != shown) { + _specialLayerShown = shown; + _a_specialLayerShown.start([this] { animationCallback(); }, _specialLayerShown ? 0. : 1., _specialLayerShown ? 1. : 0., st::boxDuration); + } + checkWasShown(wasShown); +} + +void LayerStackWidget::BackgroundWidget::setLayerShown(bool shown) { + auto wasShown = isShown(); + if (_layerShown != shown) { + _layerShown = shown; + _a_layerShown.start([this] { animationCallback(); }, _layerShown ? 0. : 1., _layerShown ? 1. : 0., st::boxDuration); + } + checkWasShown(wasShown); +} + +void LayerStackWidget::BackgroundWidget::checkWasShown(bool wasShown) { + if (isShown() != wasShown) { + _a_shown.start([this] { animationCallback(); }, wasShown ? 1. : 0., wasShown ? 0. : 1., st::boxDuration, anim::easeOutCirc); + } +} + +void LayerStackWidget::BackgroundWidget::setLayerBoxes(const QRect &specialLayerBox, const QRect &layerBox) { + _specialLayerBox = specialLayerBox; + _layerBox = layerBox; + update(); +} + +void LayerStackWidget::BackgroundWidget::paintEvent(QPaintEvent *e) { + Painter p(this); + + _inPaintEvent = true; + auto guard = base::scope_guard([this] { + _inPaintEvent = false; + checkIfDone(); + }); + + if (!_bodyCache.isNull()) { + p.drawPixmap(0, 0, _bodyCache); + } + + auto specialLayerBox = _specialLayerCache.isNull() ? _specialLayerBox : _specialLayerCacheBox; + auto layerBox = _layerCache.isNull() ? _layerBox : _layerCacheBox; + + auto ms = getms(); + auto mainMenuProgress = _a_mainMenuShown.current(ms, -1); + auto mainMenuRight = (_mainMenuCache.isNull() || mainMenuProgress < 0) ? _mainMenuRight : (mainMenuProgress < 0) ? _mainMenuRight : anim::interpolate(0, _mainMenuCache.width() / cIntRetinaFactor(), mainMenuProgress); + if (mainMenuRight) { + if (!_specialLayerCache.isNull()) { + specialLayerBox.setX(specialLayerBox.x() + mainMenuRight / 2); + } + if (!_layerCache.isNull()) { + layerBox.setX(layerBox.x() + mainMenuRight / 2); + } + } + auto bgOpacity = _a_shown.current(ms, isShown() ? 1. : 0.); + auto specialLayerOpacity = _a_specialLayerShown.current(ms, _specialLayerShown ? 1. : 0.); + auto layerOpacity = _a_layerShown.current(ms, _layerShown ? 1. : 0.); + if (bgOpacity == 0.) { return; } - if (!_layerCache.isNull()) { - Painter p(this); - p.setClipRect(rect()); - p.setOpacity(a_layer.current()); - if (!_hiddenSpecialLayerCache.isNull()) { - p.drawPixmap(_hiddenSpecialLayerCacheBox.topLeft(), _hiddenSpecialLayerCache); + p.setOpacity(bgOpacity); + auto bg = myrtlrect(mainMenuRight, 0, width() - mainMenuRight, height()); + p.fillRect(bg, st::layerBg); + if (mainMenuRight > 0) { + _shadow.paint(p, myrtlrect(0, 0, mainMenuRight, height()), 0, Ui::RectShadow::Side::Right); + } + if (!specialLayerBox.isEmpty()) { + p.setClipRegion(QRegion(bg) - specialLayerBox); + _shadow.paint(p, specialLayerBox, st::boxShadowShift); + } + + p.setClipping(false); + if (!_specialLayerCache.isNull() && specialLayerOpacity > 0) { + p.setOpacity(specialLayerOpacity); + p.drawPixmap(specialLayerBox.topLeft(), _specialLayerCache); + } + if (!layerBox.isEmpty()) { + if (!_specialLayerCache.isNull()) { + p.setOpacity(layerOpacity * specialLayerOpacity); + p.setClipRegion(QRegion(specialLayerBox) - layerBox); + p.fillRect(specialLayerBox, st::layerBg); } - p.drawPixmap(_layerCacheBox.topLeft(), _layerCache); + p.setOpacity(layerOpacity); + p.setClipRegion(QRegion(bg) - layerBox); + _shadow.paint(p, layerBox, st::boxShadowShift); + p.setClipping(false); + } + if (!_layerCache.isNull() && layerOpacity > 0) { + p.setOpacity(layerOpacity); + p.drawPixmap(layerBox.topLeft(), _layerCache); + } + if (!_mainMenuCache.isNull() && mainMenuRight > 0) { + p.setOpacity(1.); + auto shownWidth = mainMenuRight * cIntRetinaFactor(); + auto shownRect = rtlrect(_mainMenuCache.width() - shownWidth, 0, shownWidth, _mainMenuCache.height(), _mainMenuCache.width()); + p.drawPixmapLeft(0, 0, mainMenuRight, height(), width(), _mainMenuCache, shownRect); + } +} + +void LayerStackWidget::BackgroundWidget::finishAnimation() { + _a_shown.finish(); + _a_mainMenuShown.finish(); + _a_specialLayerShown.finish(); + _a_layerShown.finish(); + checkIfDone(); +} + +void LayerStackWidget::BackgroundWidget::animationCallback() { + update(); + checkIfDone(); +} + +LayerStackWidget::LayerStackWidget(QWidget *parent) : TWidget(parent) +, _background(this) { + setGeometry(parentWidget()->rect()); + hide(); + _background->setDoneCallback([this] { animationDone(); }); +} + +void LayerWidget::setInnerFocus() { + if (!isAncestorOf(App::wnd()->focusWidget())) { + doSetInnerFocus(); } } void LayerStackWidget::keyPressEvent(QKeyEvent *e) { if (e->key() == Qt::Key_Escape) { - onCloseCurrent(); + hideCurrent(); } } void LayerStackWidget::mousePressEvent(QMouseEvent *e) { - onCloseCurrent(); + hideCurrent(); } -void LayerStackWidget::onCloseCurrent() { - if (layer()) { - onCloseLayers(); - } else { - onClose(); - } +void LayerStackWidget::hideCurrent() { + return currentLayer() ? hideLayers() : hideAll(); } -void LayerStackWidget::onCloseLayers() { - if (_specialLayer) { +void LayerStackWidget::hideLayers() { + startAnimation([] {}, [this] { clearLayers(); - fixOrder(); - if (App::wnd()) App::wnd()->setInnerFocus(); - } else { - onClose(); + }, Action::HideLayer); +} + +void LayerStackWidget::hideAll() { + startAnimation([] {}, [this] { + clearLayers(); + _specialLayer.destroyDelayed(); + _mainMenu.destroyDelayed(); + }, Action::HideAll); +} + +void LayerStackWidget::setCacheImages() { + auto bodyCache = QPixmap(), mainMenuCache = QPixmap(); + if (isAncestorOf(App::wnd()->focusWidget())) { + setFocus(); } + if (_mainMenu) { + hideChildren(); + bodyCache = myGrab(App::wnd()->bodyWidget()); + showChildren(); + mainMenuCache = myGrab(_mainMenu); + } + auto specialLayerCache = _specialLayer ? myGrab(_specialLayer) : QPixmap(); + auto layerCache = QPixmap(); + if (auto layer = currentLayer()) { + layerCache = myGrab(layer); + } + setAttribute(Qt::WA_OpaquePaintEvent, !bodyCache.isNull()); + updateLayerBoxes(); + _background->setCacheImages(std_::move(bodyCache), std_::move(mainMenuCache), std_::move(specialLayerCache), std_::move(layerCache)); } -void LayerStackWidget::onClose() { - startHide(); -} - -void LayerStackWidget::onLayerClosed(LayerWidget *l) { - l->deleteLater(); - if (l == _specialLayer) { - onClose(); - _specialLayer = nullptr; - } else if (l == layer()) { - _layers.pop_back(); - if (auto newLayer = layer()) { - l->hide(); - newLayer->parentResized(); - if (!_a_background.animating()) { - newLayer->show(); - } - } else if (_specialLayer) { - l->hide(); +void LayerStackWidget::onLayerClosed(LayerWidget *layer) { + layer->deleteLater(); + if (layer == _specialLayer) { + hideAll(); + } else if (layer == currentLayer()) { + if (_layers.size() == 1) { + hideCurrent(); } else { - _layers.push_back(l); // For animation cache grab. - onClose(); + layer->hide(); _layers.pop_back(); + layer = currentLayer(); + layer->parentResized(); + if (!_background->animating()) { + layer->show(); + showFinished(); + } } - fixOrder(); - if (App::wnd()) App::wnd()->setInnerFocus(); - updateLayerBox(); - sendFakeMouseEvent(); } else { for (auto i = _layers.begin(), e = _layers.end(); i != e; ++i) { - if (l == *i) { + if (layer == *i) { _layers.erase(i); break; } @@ -217,94 +354,35 @@ void LayerStackWidget::onLayerClosed(LayerWidget *l) { } void LayerStackWidget::onLayerResized() { - updateLayerBox(); + updateLayerBoxes(); } -void LayerStackWidget::updateLayerBox() { +void LayerStackWidget::updateLayerBoxes() { auto getLayerBox = [this]() { - if (!_layerCache.isNull()) { - return _layerCacheBox; - } else if (auto l = layer()) { - return l->geometry(); - } else if (_specialLayer) { - return _specialLayer->geometry(); + if (auto layer = currentLayer()) { + return layer->geometry(); } return QRect(); }; auto getSpecialLayerBox = [this]() { - if (!_layerCache.isNull()) { - return _hiddenSpecialLayerCacheBox; - } else if (auto l = layer()) { - return _specialLayer ? _specialLayer->geometry() : QRect(); - } - return QRect(); + return _specialLayer ? _specialLayer->geometry() : QRect(); }; - _background->setLayerBox(getLayerBox(), getSpecialLayerBox()); + _background->setLayerBoxes(getSpecialLayerBox(), getLayerBox()); update(); } -void LayerStackWidget::startShow() { - startAnimation(1); - show(); -} - -void LayerStackWidget::showFast() { - if (_a_background.animating()) { - _a_background.step(getms() + st::layerSlideDuration + 1); - } -} - -void LayerStackWidget::startHide() { - if (isHidden() || _hiding) { - return; - } - _hiding = true; - startAnimation(0); -} - -void LayerStackWidget::startAnimation(float64 toOpacity) { - if (_mainMenu) { - setAttribute(Qt::WA_OpaquePaintEvent); - hide(); - _background->setBodyCache(myGrab(App::wnd()->bodyWidget())); - show(); - _mainMenu->hide(); - _background->setMainMenuCache(myGrab(_mainMenu)); - _background->setMainMenuRight(toOpacity ? 0 : _mainMenu->width()); - } - - if (App::app()) App::app()->mtpPause(); - a_bg.start(toOpacity); - a_layer.start(toOpacity); - _a_background.start(); - if (_layerCache.isNull()) { - if (auto cacheLayer = layer() ? layer() : _specialLayer.ptr()) { - _layerCache = myGrab(cacheLayer); - _layerCacheBox = cacheLayer->geometry(); - if (layer() && _specialLayer) { - _hiddenSpecialLayerCache = myGrab(_specialLayer); - _hiddenSpecialLayerCacheBox = _specialLayer->geometry(); - } - } - } - if (_specialLayer) { - _specialLayer->hide(); - } - if (auto l = layer()) { - l->hide(); - } - updateLayerBox(); - if (App::wnd()) App::wnd()->setInnerFocus(); +void LayerStackWidget::finishAnimation() { + _background->finishAnimation(); } bool LayerStackWidget::canSetFocus() const { - return (layer() || _specialLayer || _mainMenu) && !_hiding; + return (currentLayer() || _specialLayer || _mainMenu); } void LayerStackWidget::setInnerFocus() { - if (_a_background.animating()) { + if (_background->animating()) { setFocus(); - } else if (auto l = layer()) { + } else if (auto l = currentLayer()) { l->setInnerFocus(); } else if (_specialLayer) { _specialLayer->setInnerFocus(); @@ -320,123 +398,179 @@ bool LayerStackWidget::contentOverlapped(const QRect &globalRect) { if (_specialLayer && _specialLayer->overlaps(globalRect)) { return true; } - if (auto l = layer()) { - return l->overlaps(globalRect); + if (auto layer = currentLayer()) { + return layer->overlaps(globalRect); } return false; } +template +void LayerStackWidget::startAnimation(SetupNew setupNewWidgets, ClearOld clearOldWidgets, Action action) { + if (App::quitting()) return; + + setupNewWidgets(); + setCacheImages(); + clearOldWidgets(); + prepareForAnimation(); + _background->startAnimation(action); +} + void LayerStackWidget::resizeEvent(QResizeEvent *e) { _background->setGeometry(rect()); if (_specialLayer) { _specialLayer->parentResized(); } - if (auto l = layer()) { - l->parentResized(); + if (auto layer = currentLayer()) { + layer->parentResized(); } if (_mainMenu) { _mainMenu->resize(_mainMenu->width(), height()); } - updateLayerBox(); + updateLayerBoxes(); } -void LayerStackWidget::showLayer(LayerWidget *l) { - clearLayers(); - appendLayer(l); -} +void LayerStackWidget::showLayer(LayerWidget *layer) { + appendLayer(layer); + while (!_layers.isEmpty() && _layers.front() != layer) { + auto removingLayer = _layers.front(); + _layers.pop_front(); -void LayerStackWidget::showSpecialLayer(LayerWidget *l) { - clearLayers(); - if (_specialLayer) { - _specialLayer.destroyDelayed(); + removingLayer->hide(); + removingLayer->deleteLater(); } - _specialLayer = l; - activateLayer(l); +} + +void LayerStackWidget::prepareForAnimation() { + if (isHidden()) { + show(); + } + if (_mainMenu) { + _mainMenu->hide(); + } + if (_specialLayer) { + _specialLayer->hide(); + } + if (auto layer = currentLayer()) { + layer->hide(); + } + if (auto app = App::app()) { + app->mtpPause(); + } +} + +void LayerStackWidget::animationDone() { + bool hidden = true; + if (_mainMenu) { + _mainMenu->show(); + hidden = false; + } + if (_specialLayer) { + _specialLayer->show(); + hidden = false; + } + if (auto layer = currentLayer()) { + layer->show(); + hidden = false; + } + if (hidden) { + App::wnd()->layerFinishedHide(this); + } else { + showFinished(); + } + if (auto app = App::app()) { + app->mtpUnpause(); + } + setAttribute(Qt::WA_OpaquePaintEvent, false); +} + +void LayerStackWidget::showFinished() { + fixOrder(); + sendFakeMouseEvent(); + updateLayerBoxes(); + if (_mainMenu) { + _mainMenu->showFinished(); + } + if (_specialLayer) { + _specialLayer->showFinished(); + } + if (auto layer = currentLayer()) { + layer->showFinished(); + } + if (auto window = App::wnd()) { + window->setInnerFocus(); + } +} + +void LayerStackWidget::showSpecialLayer(LayerWidget *layer) { + startAnimation([this, layer] { + _specialLayer.destroyDelayed(); + _specialLayer = layer; + initChildLayer(_specialLayer); + }, [this] { + clearLayers(); + _mainMenu.destroyDelayed(); + }, Action::ShowSpecialLayer); } void LayerStackWidget::showMainMenu() { - clearLayers(); - if (_specialLayer) { + startAnimation([this] { + _mainMenu.create(this); + _mainMenu->setGeometryToLeft(0, 0, _mainMenu->width(), height()); + _mainMenu->setParent(this); + }, [this] { + clearLayers(); _specialLayer.destroyDelayed(); - } - _mainMenu.create(this); - _mainMenu->setGeometryToLeft(0, 0, _mainMenu->width(), height()); - - _mainMenu->setParent(this); - fixOrder(); - - if (isHidden()) { - startShow(); - } else { - _mainMenu->show(); - _mainMenu->showFinished(); - if (App::wnd()) App::wnd()->setInnerFocus(); - updateLayerBox(); - } - fixOrder(); - sendFakeMouseEvent(); + }, Action::ShowMainMenu); } -void LayerStackWidget::appendLayer(LayerWidget *l) { - if (auto oldLayer = layer()) { +void LayerStackWidget::appendLayer(LayerWidget *layer) { + auto oldLayer = currentLayer(); + if (oldLayer) { oldLayer->hide(); } - _layers.push_back(l); - activateLayer(l); + _layers.push_back(layer); + initChildLayer(layer); + + if (_layers.size() > 1) { + if (!_background->animating()) { + layer->show(); + showFinished(); + } + } else { + startAnimation([] {}, [this] { + _mainMenu.destroyDelayed(); + }, Action::ShowLayer); + } } -void LayerStackWidget::prependLayer(LayerWidget *l) { +void LayerStackWidget::prependLayer(LayerWidget *layer) { if (_layers.empty()) { - showLayer(l); - } else { - l->hide(); - _layers.push_front(l); - initChildLayer(l); + return showLayer(layer); } + layer->hide(); + _layers.push_front(layer); + initChildLayer(layer); } void LayerStackWidget::clearLayers() { - for_const (auto oldLayer, _layers) { - oldLayer->hide(); - oldLayer->deleteLater(); + for (auto layer : base::take(_layers)) { + layer->hide(); + layer->deleteLater(); } - _layers.clear(); - updateLayerBox(); - sendFakeMouseEvent(); } -void LayerStackWidget::initChildLayer(LayerWidget *l) { - l->setParent(this); - connect(l, SIGNAL(closed(LayerWidget*)), this, SLOT(onLayerClosed(LayerWidget*))); - connect(l, SIGNAL(resized()), this, SLOT(onLayerResized())); - connect(l, SIGNAL(destroyed(QObject*)), this, SLOT(onLayerDestroyed(QObject*))); - l->parentResized(); - fixOrder(); -} - -void LayerStackWidget::activateLayer(LayerWidget *l) { - if (_mainMenu) { - _mainMenu.destroyDelayed(); - _background->setMainMenuRight(0); - _background->setMainMenuCache(QPixmap()); - } - initChildLayer(l); - if (isHidden()) { - startShow(); - } else { - l->show(); - l->showDone(); - if (App::wnd()) App::wnd()->setInnerFocus(); - updateLayerBox(); - } - fixOrder(); - sendFakeMouseEvent(); +void LayerStackWidget::initChildLayer(LayerWidget *layer) { + layer->setParent(this); + connect(layer, SIGNAL(closed(LayerWidget*)), this, SLOT(onLayerClosed(LayerWidget*))); + connect(layer, SIGNAL(resized()), this, SLOT(onLayerResized())); + connect(layer, SIGNAL(destroyed(QObject*)), this, SLOT(onLayerDestroyed(QObject*))); + layer->parentResized(); } void LayerStackWidget::fixOrder() { - if (auto l = layer()) { + if (auto layer = currentLayer()) { _background->raise(); - l->raise(); + layer->raise(); } else if (_specialLayer) { _specialLayer->raise(); } @@ -449,72 +583,21 @@ void LayerStackWidget::sendFakeMouseEvent() { sendSynteticMouseEvent(this, QEvent::MouseMove, Qt::NoButton); } -void LayerStackWidget::step_background(float64 ms, bool timer) { - float64 dt = ms / (_hiding ? st::layerHideDuration : st::layerSlideDuration); - if (dt >= 1) { - a_bg.finish(); - a_layer.finish(); - _a_background.stop(); - _layerCache = _hiddenSpecialLayerCache = QPixmap(); - setAttribute(Qt::WA_OpaquePaintEvent, false); - _background->setBodyCache(QPixmap()); - if (_hiding) { - App::wnd()->layerFinishedHide(this); - if (_mainMenu) { - _background->setMainMenuRight(0); - _background->setMainMenuCache(QPixmap()); - _mainMenu.destroyDelayed(); - } - } else { - if (_specialLayer) { - _specialLayer->show(); - _specialLayer->showDone(); - } - if (auto l = layer()) { - l->show(); - l->showDone(); - } - if (_mainMenu) { - _background->setMainMenuRight(_mainMenu->width()); - _background->setMainMenuCache(QPixmap()); - _mainMenu->show(); - _mainMenu->showFinished(); - } - if (App::wnd()) App::wnd()->setInnerFocus(); - } - updateLayerBox(); - if (App::app()) App::app()->mtpUnpause(); - } else { - a_bg.update(dt, anim::easeOutCirc); - a_layer.update(dt, anim::linear); - if (_mainMenu) { - _background->setMainMenuRight(a_bg.current() * _mainMenu->width()); - } - } - _background->setOpacity(a_bg.current()); - if (timer) { - _background->update(); - update(); - } -} - void LayerStackWidget::onLayerDestroyed(QObject *obj) { if (obj == _specialLayer) { _specialLayer = nullptr; - onClose(); - } else if (obj == layer()) { + hideAll(); + } else if (obj == currentLayer()) { _layers.pop_back(); - if (auto newLayer = layer()) { + if (auto newLayer = currentLayer()) { newLayer->parentResized(); - if (!_a_background.animating()) { + if (!_background->animating()) { newLayer->show(); + showFinished(); } } else if (!_specialLayer) { - onClose(); + hideAll(); } - fixOrder(); - if (App::wnd()) App::wnd()->setInnerFocus(); - updateLayerBox(); } else { for (auto i = _layers.begin(), e = _layers.end(); i != e; ++i) { if (obj == *i) { diff --git a/Telegram/SourceFiles/layerwidget.h b/Telegram/SourceFiles/layerwidget.h index bd0eb45a1..6834bbc0a 100644 --- a/Telegram/SourceFiles/layerwidget.h +++ b/Telegram/SourceFiles/layerwidget.h @@ -33,7 +33,7 @@ public: using TWidget::TWidget; virtual void parentResized() = 0; - virtual void showDone() { + virtual void showFinished() { } void setInnerFocus(); @@ -65,55 +65,63 @@ class LayerStackWidget : public TWidget { public: LayerStackWidget(QWidget *parent); - void showFast(); + void finishAnimation(); - void showLayer(LayerWidget *l); - void showSpecialLayer(LayerWidget *l); + void showLayer(LayerWidget *layer); + void showSpecialLayer(LayerWidget *layer); void showMainMenu(); - void appendLayer(LayerWidget *l); - void prependLayer(LayerWidget *l); + void appendLayer(LayerWidget *layer); + void prependLayer(LayerWidget *layer); bool canSetFocus() const; void setInnerFocus(); bool contentOverlapped(const QRect &globalRect); - void onCloseCurrent(); - void onCloseLayers(); - void onClose(); + void hideLayers(); + void hideAll(); ~LayerStackWidget(); protected: - void paintEvent(QPaintEvent *e) override; void keyPressEvent(QKeyEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void resizeEvent(QResizeEvent *e) override; private slots: void onLayerDestroyed(QObject *obj); - void onLayerClosed(LayerWidget *l); + void onLayerClosed(LayerWidget *layer); void onLayerResized(); private: + void showFinished(); + void hideCurrent(); + + enum class Action { + ShowMainMenu, + ShowSpecialLayer, + ShowLayer, + HideLayer, + HideAll, + }; + template + void startAnimation(SetupNew setupNewWidgets, ClearOld clearOldWidgets, Action action); + + void prepareForAnimation(); + void animationDone(); + + void setCacheImages(); void clearLayers(); - void initChildLayer(LayerWidget *l); - void activateLayer(LayerWidget *l); - void updateLayerBox(); + void initChildLayer(LayerWidget *layer); + void updateLayerBoxes(); void fixOrder(); void sendFakeMouseEvent(); - void startShow(); - void startHide(); - void startAnimation(float64 toOpacity); - - void step_background(float64 ms, bool timer); - - LayerWidget *layer() { + LayerWidget *currentLayer() { return _layers.empty() ? nullptr : _layers.back(); } - const LayerWidget *layer() const { - return const_cast(this)->layer(); + const LayerWidget *currentLayer() const { + return const_cast(this)->currentLayer(); } using Layers = QList; @@ -125,16 +133,6 @@ private: class BackgroundWidget; ChildWidget _background; - anim::fvalue a_bg, a_layer; - Animation _a_background; - - QPixmap _layerCache; - QRect _layerCacheBox; - QPixmap _hiddenSpecialLayerCache; - QRect _hiddenSpecialLayerCacheBox; - - bool _hiding = false; - }; class MediaPreviewWidget : public TWidget, private base::Subscriber { diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index 7f26e1c13..b9d1853c8 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -421,7 +421,7 @@ void MainWindow::showMainMenu() { void MainWindow::ui_hideSettingsAndLayer(ShowLayerOptions options) { if (_layerBg) { - _layerBg->onClose(); + _layerBg->hideAll(); } } @@ -498,14 +498,14 @@ void MainWindow::ui_showLayer(LayerWidget *box, ShowLayerOptions options) { _layerBg->showLayer(box); } if (options.testFlag(ForceFastShowLayer)) { - _layerBg->showFast(); + _layerBg->finishAnimation(); } } else { if (_layerBg) { if (_settings) { - _layerBg->onCloseLayers(); + _layerBg->hideLayers(); } else { - _layerBg->onClose(); + _layerBg->hideAll(); if (options.testFlag(ForceFastShowLayer)) { _layerBg.destroyDelayed(); } @@ -606,6 +606,7 @@ void MainWindow::layerHidden() { _layerBg.destroyDelayed(); hideMediaview(); setInnerFocus(); + checkHistoryActivation(); } void MainWindow::onReActivate() { @@ -1469,13 +1470,9 @@ MainWindow::~MainWindow() { _clearManager->stop(); _clearManager = nullptr; } - delete _connecting; delete _mediaView; delete trayIcon; delete trayIconMenu; - delete _intro; - delete _main; - delete _settings; } PreLaunchWindow *PreLaunchWindowInstance = 0; diff --git a/Telegram/SourceFiles/settings/settings_advanced_widget.cpp b/Telegram/SourceFiles/settings/settings_advanced_widget.cpp index e7485d0ae..73ee6bd43 100644 --- a/Telegram/SourceFiles/settings/settings_advanced_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_advanced_widget.cpp @@ -64,8 +64,7 @@ void AdvancedWidget::createControls() { if (self()) { addChildRow(_askQuestion, marginSmall, lang(lng_settings_ask_question), SLOT(onAskQuestion())); } - addChildRow(_telegramFAQ, marginSmall, lang(lng_settings_faq), SLOT(onTelegramFAQ())); - addChildRow(_about, marginLarge, lang(lng_menu_about), SLOT(onAbout())); + addChildRow(_telegramFAQ, marginLarge, lang(lng_settings_faq), SLOT(onTelegramFAQ())); if (self()) { style::margins marginLogout(0, 0, 0, 2 * st::settingsLargeSkip); addChildRow(_logOut, marginLogout, lang(lng_settings_logout), SLOT(onLogOut())); @@ -125,13 +124,8 @@ void AdvancedWidget::onTelegramFAQ() { QDesktopServices::openUrl(telegramFaqLink()); } -void AdvancedWidget::onAbout() { - Ui::showLayer(new AboutBox()); -} - void AdvancedWidget::onLogOut() { App::wnd()->onLogout(); } - } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_advanced_widget.h b/Telegram/SourceFiles/settings/settings_advanced_widget.h index 5fb013d45..5b26f08e8 100644 --- a/Telegram/SourceFiles/settings/settings_advanced_widget.h +++ b/Telegram/SourceFiles/settings/settings_advanced_widget.h @@ -39,7 +39,6 @@ private slots: void onAskQuestion(); void onAskQuestionSure(); void onTelegramFAQ(); - void onAbout(); void onLogOut(); private: @@ -55,7 +54,6 @@ private: #endif // !TDESKTOP_DISABLE_NETWORK_PROXY ChildWidget _askQuestion = { nullptr }; ChildWidget _telegramFAQ = { nullptr }; - ChildWidget _about = { nullptr }; ChildWidget _logOut = { nullptr }; mtpRequestId _supportGetRequest = 0; diff --git a/Telegram/SourceFiles/settings/settings_inner_widget.cpp b/Telegram/SourceFiles/settings/settings_inner_widget.cpp index 15b342cca..43f25bd3c 100644 --- a/Telegram/SourceFiles/settings/settings_inner_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_inner_widget.cpp @@ -64,6 +64,9 @@ void InnerWidget::refreshBlocks() { } _blocks.clear(); + if (App::quitting()) { + return; + } if (_self) { _cover = new CoverWidget(this, _self); _blocks.push_back(new InfoWidget(this, _self)); diff --git a/Telegram/SourceFiles/settings/settings_widget.cpp b/Telegram/SourceFiles/settings/settings_widget.cpp index 7a30ef9ef..92c3c7394 100644 --- a/Telegram/SourceFiles/settings/settings_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_widget.cpp @@ -193,7 +193,7 @@ void Widget::resizeUsingInnerHeight(int newWidth, int newContentLeft) { update(); } -void Widget::showDone() { +void Widget::showFinished() { _inner->showFinished(); } diff --git a/Telegram/SourceFiles/settings/settings_widget.h b/Telegram/SourceFiles/settings/settings_widget.h index 0ec4dcc37..5eaa17247 100644 --- a/Telegram/SourceFiles/settings/settings_widget.h +++ b/Telegram/SourceFiles/settings/settings_widget.h @@ -39,7 +39,7 @@ public: Widget(QWidget *parent); void parentResized() override; - void showDone() override; + void showFinished() override; protected: void paintEvent(QPaintEvent *e) override; diff --git a/Telegram/SourceFiles/ui/countryinput.cpp b/Telegram/SourceFiles/ui/countryinput.cpp index 4a9333936..eaf1aef4b 100644 --- a/Telegram/SourceFiles/ui/countryinput.cpp +++ b/Telegram/SourceFiles/ui/countryinput.cpp @@ -246,12 +246,6 @@ void CountrySelectBox::resizeEvent(QResizeEvent *e) { _topShadow.setGeometry(0, titleHeight() + _select->height(), width(), st::lineWidth); } -void CountrySelectBox::showAll() { - _select->show(); - _topShadow.show(); - ItemListBox::showAll(); -} - void CountrySelectBox::onFilterUpdate(const QString &query) { scrollArea()->scrollToY(0); _inner->updateFilter(query); diff --git a/Telegram/SourceFiles/ui/countryinput.h b/Telegram/SourceFiles/ui/countryinput.h index eeaaceffc..8b775299c 100644 --- a/Telegram/SourceFiles/ui/countryinput.h +++ b/Telegram/SourceFiles/ui/countryinput.h @@ -83,7 +83,6 @@ protected: void resizeEvent(QResizeEvent *e) override; void doSetInnerFocus() override; - void showAll() override; private: void onFilterUpdate(const QString &query); diff --git a/Telegram/SourceFiles/window/window_theme_warning.cpp b/Telegram/SourceFiles/window/window_theme_warning.cpp index ffcae6d66..7e84788b6 100644 --- a/Telegram/SourceFiles/window/window_theme_warning.cpp +++ b/Telegram/SourceFiles/window/window_theme_warning.cpp @@ -141,7 +141,7 @@ void WarningWidget::startAnimation(bool hiding) { _hiddenCallback(); } } - }, _hiding ? 1. : 0., _hiding ? 0. : 1., st::layerSlideDuration); + }, _hiding ? 1. : 0., _hiding ? 0. : 1., st::boxDuration); } } // namespace Theme