From facc729234665ba6f21ee7fab2c0320bbaedce9e Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 20 Mar 2017 18:41:17 +0300 Subject: [PATCH] Edit account self destruct time in Settings. Also accept lambda_once in rpcDone() and rpcFail() lambda wrappers. --- Telegram/Resources/langs/lang.strings | 7 ++ Telegram/SourceFiles/boxes/autolockbox.cpp | 3 - .../boxes/self_destruction_box.cpp | 81 +++++++++++++ .../SourceFiles/boxes/self_destruction_box.h | 47 ++++++++ Telegram/SourceFiles/core/lambda.h | 2 +- Telegram/SourceFiles/mtproto/rpc_sender.h | 106 +++++++++--------- .../settings/settings_privacy_widget.cpp | 6 + .../settings/settings_privacy_widget.h | 2 + Telegram/gyp/telegram_sources.txt | 2 + 9 files changed, 199 insertions(+), 57 deletions(-) create mode 100644 Telegram/SourceFiles/boxes/self_destruction_box.cpp create mode 100644 Telegram/SourceFiles/boxes/self_destruction_box.h diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index a90391d63..0ae0fc3a3 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -408,6 +408,8 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org "lng_settings_last_seen_privacy" = "Last seen privacy"; "lng_settings_groups_invite_privacy" = "Group invite settings"; "lng_settings_show_sessions" = "Show all sessions"; +"lng_settings_self_destruct" = "Account self-destruct settings"; + "lng_settings_reset" = "Terminate all other sessions"; "lng_settings_reset_sure" = "Are you sure you want to terminate\nall other sessions?"; "lng_settings_reset_one_sure" = "Do you want to terminate this session?"; @@ -463,6 +465,11 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org "lng_edit_privacy_groups_always_title" = "Always allow"; "lng_edit_privacy_groups_never_title" = "Never allow"; +"lng_self_destruct_title" = "Account self-destruction"; +"lng_self_destruct_description" = "If you don't come online at least once within this period, your account will be deleted along with all groups, messages and contacts."; +"lng_self_destruct_months" = "{count:_not_used_|# month|# months}"; +"lng_self_destruct_years" = "{count:_not_used_|# year|# years}"; + "lng_preview_loading" = "Getting Link Info..."; "lng_profile_chat_unaccessible" = "Group is inaccessible"; diff --git a/Telegram/SourceFiles/boxes/autolockbox.cpp b/Telegram/SourceFiles/boxes/autolockbox.cpp index 615fa537d..9a331a88b 100644 --- a/Telegram/SourceFiles/boxes/autolockbox.cpp +++ b/Telegram/SourceFiles/boxes/autolockbox.cpp @@ -22,11 +22,8 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "lang.h" #include "storage/localstorage.h" -#include "boxes/confirmbox.h" -#include "mainwidget.h" #include "mainwindow.h" #include "ui/widgets/checkbox.h" -#include "ui/widgets/buttons.h" #include "styles/style_boxes.h" void AutoLockBox::prepare() { diff --git a/Telegram/SourceFiles/boxes/self_destruction_box.cpp b/Telegram/SourceFiles/boxes/self_destruction_box.cpp new file mode 100644 index 000000000..c35c05885 --- /dev/null +++ b/Telegram/SourceFiles/boxes/self_destruction_box.cpp @@ -0,0 +1,81 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +It is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +In addition, as a special exception, the copyright holders give permission +to link the code of portions of this program with the OpenSSL library. + +Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org +*/ +#include "boxes/self_destruction_box.h" + +#include "lang.h" +#include "ui/widgets/checkbox.h" +#include "ui/widgets/labels.h" +#include "styles/style_boxes.h" + +void SelfDestructionBox::prepare() { + setTitle(lang(lng_self_destruct_title)); + + _ttlValues = { 30, 90, 180, 365 }; + + auto fake = object_ptr(this, lang(lng_self_destruct_description), Ui::FlatLabel::InitType::Simple, st::boxLabel); + auto boxHeight = st::boxOptionListPadding.top() + + fake->height() + st::boxMediumSkip + + _ttlValues.size() * (st::langsButton.height + st::boxOptionListSkip) - st::boxOptionListSkip + + st::boxOptionListPadding.bottom() + st::boxPadding.bottom(); + fake.destroy(); + + setDimensions(st::boxWidth, boxHeight); + + auto loading = object_ptr(this, lang(lng_contacts_loading), Ui::FlatLabel::InitType::Simple, st::membersAbout); + loading->moveToLeft((st::boxWidth - loading->width()) / 2, boxHeight / 3); + + addButton(lang(lng_cancel), [this] { closeBox(); }); + + MTP::send(MTPaccount_GetAccountTTL(), rpcDone(base::lambda_guarded(this, [this, loading = std::move(loading)](const MTPAccountDaysTTL &result) mutable { + Expects(result.type() == mtpc_accountDaysTTL); + Expects(!_ttlValues.empty()); + + loading.destroy(); + auto y = st::boxOptionListPadding.top(); + _description.create(this, lang(lng_self_destruct_description), Ui::FlatLabel::InitType::Simple, st::boxLabel); + _description->moveToLeft(st::boxPadding.left(), y); + y += _description->height() + st::boxMediumSkip; + + auto current = result.c_accountDaysTTL().vdays.v; + auto currentAdjusted = _ttlValues[0]; + for (auto days : _ttlValues) { + if (qAbs(current - days) < qAbs(current - currentAdjusted)) { + currentAdjusted = days; + } + } + auto group = std::make_shared(currentAdjusted); + auto count = int(_ttlValues.size()); + _options.reserve(count); + for (auto days : _ttlValues) { + _options.emplace_back(this, group, days, (days > 364) ? lng_self_destruct_years(lt_count, days / 365) : lng_self_destruct_months(lt_count, qMax(days / 30, 1)), st::langsButton); + _options.back()->moveToLeft(st::boxPadding.left(), y); + y += _options.back()->heightNoMargins() + st::boxOptionListSkip; + } + showChildren(); + + clearButtons(); + addButton(lang(lng_settings_save), [this, group] { + MTP::send(MTPaccount_SetAccountTTL(MTP_accountDaysTTL(MTP_int(group->value())))); + closeBox(); + }); + addButton(lang(lng_cancel), [this] { closeBox(); }); + }))); +} diff --git a/Telegram/SourceFiles/boxes/self_destruction_box.h b/Telegram/SourceFiles/boxes/self_destruction_box.h new file mode 100644 index 000000000..27eb2d9d0 --- /dev/null +++ b/Telegram/SourceFiles/boxes/self_destruction_box.h @@ -0,0 +1,47 @@ +/* +This file is part of Telegram Desktop, +the official desktop version of Telegram messaging app, see https://telegram.org + +Telegram Desktop is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +It is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +In addition, as a special exception, the copyright holders give permission +to link the code of portions of this program with the OpenSSL library. + +Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE +Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org +*/ +#pragma once + +#include "boxes/abstractbox.h" + +namespace Ui { +class RadiobuttonGroup; +class Radiobutton; +class FlatLabel; +} // namespace Ui + +class SelfDestructionBox : public BoxContent { + Q_OBJECT + +public: + SelfDestructionBox(QWidget*) { + } + +protected: + void prepare() override; + +private: + std::vector _ttlValues; + object_ptr _description = { nullptr }; + std::shared_ptr _ttlGroup; + std::vector> _options; + +}; diff --git a/Telegram/SourceFiles/core/lambda.h b/Telegram/SourceFiles/core/lambda.h index 3e59baa45..5e9250243 100644 --- a/Telegram/SourceFiles/core/lambda.h +++ b/Telegram/SourceFiles/core/lambda.h @@ -42,7 +42,7 @@ struct type_resolver { template struct type_resolver { - using type = lambda; + using type = lambda_once; static constexpr auto is_mutable = true; }; diff --git a/Telegram/SourceFiles/mtproto/rpc_sender.h b/Telegram/SourceFiles/mtproto/rpc_sender.h index ac23fd6e4..22f6f7a44 100644 --- a/Telegram/SourceFiles/mtproto/rpc_sender.h +++ b/Telegram/SourceFiles/mtproto/rpc_sender.h @@ -80,7 +80,7 @@ inline bool isDefaultHandledError(const RPCError &error) { class RPCAbstractDoneHandler { // abstract done public: - virtual void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const = 0; + virtual void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) = 0; virtual ~RPCAbstractDoneHandler() { } @@ -89,7 +89,7 @@ using RPCDoneHandlerPtr = QSharedPointer; class RPCAbstractFailHandler { // abstract fail public: - virtual bool operator()(mtpRequestId requestId, const RPCError &e) const = 0; + virtual bool operator()(mtpRequestId requestId, const RPCError &e) = 0; virtual ~RPCAbstractFailHandler() { } }; @@ -117,7 +117,7 @@ class RPCDoneHandlerBare : public RPCAbstractDoneHandler { // done(from, end) public: RPCDoneHandlerBare(CallbackType onDone) : _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { (*_onDone)(from, end); } @@ -133,7 +133,7 @@ class RPCDoneHandlerBareReq : public RPCAbstractDoneHandler { // done(from, end, public: RPCDoneHandlerBareReq(CallbackType onDone) : _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { (*_onDone)(from, end, requestId); } @@ -149,7 +149,7 @@ class RPCDoneHandlerPlain : public RPCAbstractDoneHandler { // done(result) public: RPCDoneHandlerPlain(CallbackType onDone) : _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { auto response = TResponse(); response.read(from, end); (*_onDone)(std::move(response)); @@ -167,7 +167,7 @@ class RPCDoneHandlerReq : public RPCAbstractDoneHandler { // done(result, req_id public: RPCDoneHandlerReq(CallbackType onDone) : _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { auto response = TResponse(); response.read(from, end); (*_onDone)(std::move(response), requestId); @@ -185,7 +185,7 @@ class RPCDoneHandlerNo : public RPCAbstractDoneHandler { // done() public: RPCDoneHandlerNo(CallbackType onDone) : _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { (*_onDone)(); } @@ -201,7 +201,7 @@ class RPCDoneHandlerNoReq : public RPCAbstractDoneHandler { // done(req_id) public: RPCDoneHandlerNoReq(CallbackType onDone) : _onDone(onDone) { } - virtual void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { (*_onDone)(requestId); } @@ -216,7 +216,7 @@ class RPCFailHandlerPlain : public RPCAbstractFailHandler { // fail(error) public: RPCFailHandlerPlain(CallbackType onFail) : _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return (*_onFail)(e); } @@ -231,7 +231,7 @@ class RPCFailHandlerReq : public RPCAbstractFailHandler { // fail(error, req_id) public: RPCFailHandlerReq(CallbackType onFail) : _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return (*_onFail)(e, requestId); } @@ -246,7 +246,7 @@ class RPCFailHandlerNo : public RPCAbstractFailHandler { // fail() public: RPCFailHandlerNo(CallbackType onFail) : _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return (*_onFail)(); } @@ -261,7 +261,7 @@ class RPCFailHandlerNoReq : public RPCAbstractFailHandler { // fail(req_id) public: RPCFailHandlerNoReq(CallbackType onFail) : _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return (*_onFail)(requestId); } @@ -362,7 +362,7 @@ class RPCDoneHandlerBareOwned : public RPCOwnedDoneHandler { // done(from, end) public: RPCDoneHandlerBareOwned(TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(from, end); } @@ -378,7 +378,7 @@ class RPCDoneHandlerBareOwnedReq : public RPCOwnedDoneHandler { // done(from, en public: RPCDoneHandlerBareOwnedReq(TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(from, end, requestId); } @@ -394,7 +394,7 @@ class RPCDoneHandlerOwned : public RPCOwnedDoneHandler { // done(result) public: RPCDoneHandlerOwned(TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) { auto response = TResponse(); response.read(from, end); @@ -414,7 +414,7 @@ class RPCDoneHandlerOwnedReq : public RPCOwnedDoneHandler { // done(result, req_ public: RPCDoneHandlerOwnedReq(TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) { auto response = TResponse(); response.read(from, end); @@ -434,7 +434,7 @@ class RPCDoneHandlerOwnedNo : public RPCOwnedDoneHandler { // done() public: RPCDoneHandlerOwnedNo(TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(); } @@ -450,7 +450,7 @@ class RPCDoneHandlerOwnedNoReq : public RPCOwnedDoneHandler { // done(req_id) public: RPCDoneHandlerOwnedNoReq(TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(requestId); } @@ -466,7 +466,7 @@ class RPCBindedDoneHandlerBareOwned : public RPCOwnedDoneHandler { // done(b, fr public: RPCBindedDoneHandlerBareOwned(T b, TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _b(b), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(_b, from, end); } @@ -483,7 +483,7 @@ class RPCBindedDoneHandlerBareOwnedReq : public RPCOwnedDoneHandler { // done(b, public: RPCBindedDoneHandlerBareOwnedReq(T b, TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _b(b), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(_b, from, end, requestId); } @@ -500,7 +500,7 @@ class RPCBindedDoneHandlerOwned : public RPCOwnedDoneHandler { // done(b, result public: RPCBindedDoneHandlerOwned(T b, TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone), _b(b) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) { auto response = TResponse(); response.read(from, end); @@ -521,7 +521,7 @@ class RPCBindedDoneHandlerOwnedReq : public RPCOwnedDoneHandler { // done(b, res public: RPCBindedDoneHandlerOwnedReq(T b, TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _onDone(onDone), _b(b) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) { auto response = TResponse(); response.read(from, end); @@ -542,7 +542,7 @@ class RPCBindedDoneHandlerOwnedNo : public RPCOwnedDoneHandler { // done(b) public: RPCBindedDoneHandlerOwnedNo(T b, TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _b(b), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(_b); } @@ -559,7 +559,7 @@ class RPCBindedDoneHandlerOwnedNoReq : public RPCOwnedDoneHandler { // done(b, r public: RPCBindedDoneHandlerOwnedNoReq(T b, TReceiver *receiver, CallbackType onDone) : RPCOwnedDoneHandler(receiver), _b(b), _onDone(onDone) { } - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (_owner) (static_cast(_owner)->*_onDone)(_b, requestId); } @@ -576,7 +576,7 @@ class RPCFailHandlerOwned : public RPCOwnedFailHandler { // fail(error) public: RPCFailHandlerOwned(TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)(e) : true; } @@ -592,7 +592,7 @@ class RPCFailHandlerOwnedReq : public RPCOwnedFailHandler { // fail(error, req_i public: RPCFailHandlerOwnedReq(TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)(e, requestId) : true; } @@ -608,7 +608,7 @@ class RPCFailHandlerOwnedNo : public RPCOwnedFailHandler { // fail() public: RPCFailHandlerOwnedNo(TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)() : true; } @@ -624,7 +624,7 @@ class RPCFailHandlerOwnedNoReq : public RPCOwnedFailHandler { // fail(req_id) public: RPCFailHandlerOwnedNoReq(TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)(requestId) : true; } @@ -640,7 +640,7 @@ class RPCBindedFailHandlerOwned : public RPCOwnedFailHandler { // fail(b, error) public: RPCBindedFailHandlerOwned(T b, TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail), _b(b) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)(_b, e) : true; } @@ -657,7 +657,7 @@ class RPCBindedFailHandlerOwnedReq : public RPCOwnedFailHandler { // fail(b, err public: RPCBindedFailHandlerOwnedReq(T b, TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail), _b(b) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)(_b, e, requestId) : true; } @@ -674,7 +674,7 @@ class RPCBindedFailHandlerOwnedNo : public RPCOwnedFailHandler { // fail(b) public: RPCBindedFailHandlerOwnedNo(T b, TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail), _b(b) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)(_b) : true; } @@ -691,7 +691,7 @@ class RPCBindedFailHandlerOwnedNoReq : public RPCOwnedFailHandler { // fail(b, r public: RPCBindedFailHandlerOwnedNoReq(T b, TReceiver *receiver, CallbackType onFail) : RPCOwnedFailHandler(receiver), _onFail(onFail), _b(b) { } - bool operator()(mtpRequestId requestId, const RPCError &e) const override { + bool operator()(mtpRequestId requestId, const RPCError &e) override { return _owner ? (static_cast(_owner)->*_onFail)(_b, requestId) : true; } @@ -855,7 +855,7 @@ using MTPSessionResetHandler = void (*)(int32 dcId); template class RPCHandlerImplementation : public Base { protected: - using Lambda = base::lambda; + using Lambda = base::lambda_once; using Parent = RPCHandlerImplementation; public: @@ -874,7 +874,7 @@ template class RPCDoneHandlerImplementationBare : public RPCDoneHandlerImplementation { // done(from, end) public: using RPCDoneHandlerImplementation::Parent::Parent; - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { return this->_handler ? this->_handler(from, end) : void(0); } @@ -884,7 +884,7 @@ template class RPCDoneHandlerImplementationBareReq : public RPCDoneHandlerImplementation { // done(from, end, req_id) public: using RPCDoneHandlerImplementation::Parent::Parent; - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { return this->_handler ? this->_handler(from, end, requestId) : void(0); } @@ -894,7 +894,7 @@ template class RPCDoneHandlerImplementationPlain : public RPCDoneHandlerImplementation { // done(result) public: using RPCDoneHandlerImplementation::Parent::Parent; - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (this->_handler) { auto response = TResponse(); response.read(from, end); @@ -908,7 +908,7 @@ template class RPCDoneHandlerImplementationReq : public RPCDoneHandlerImplementation { // done(result, req_id) public: using RPCDoneHandlerImplementation::Parent::Parent; - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { if (this->_handler) { auto response = TResponse(); response.read(from, end); @@ -922,7 +922,7 @@ template class RPCDoneHandlerImplementationNo : public RPCDoneHandlerImplementation { // done() public: using RPCDoneHandlerImplementation::Parent::Parent; - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { return this->_handler ? this->_handler() : void(0); } @@ -932,39 +932,39 @@ template class RPCDoneHandlerImplementationNoReq : public RPCDoneHandlerImplementation { // done(req_id) public: using RPCDoneHandlerImplementation::Parent::Parent; - void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) const override { + void operator()(mtpRequestId requestId, const mtpPrime *from, const mtpPrime *end) override { return this->_handler ? this->_handler(requestId) : void(0); } }; template -inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda lambda) { +inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda_once lambda) { return RPCDoneHandlerPtr(new RPCDoneHandlerImplementationBare(std::move(lambda))); } template -inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda lambda) { +inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda_once lambda) { return RPCDoneHandlerPtr(new RPCDoneHandlerImplementationBareReq(std::move(lambda))); } template -inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda lambda) { +inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda_once lambda) { return RPCDoneHandlerPtr(new RPCDoneHandlerImplementationPlain(std::move(lambda))); } template -inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda lambda) { +inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda_once lambda) { return RPCDoneHandlerPtr(new RPCDoneHandlerImplementationReq(std::move(lambda))); } template -inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda lambda) { +inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda_once lambda) { return RPCDoneHandlerPtr(new RPCDoneHandlerImplementationNo(std::move(lambda))); } template -inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda lambda) { +inline RPCDoneHandlerPtr rpcDone_lambda_wrap_helper(base::lambda_once lambda) { return RPCDoneHandlerPtr(new RPCDoneHandlerImplementationNoReq(std::move(lambda))); } @@ -979,7 +979,7 @@ using RPCFailHandlerImplementation = RPCHandlerImplementation { // fail(error) public: using Parent::Parent; - bool operator()(mtpRequestId requestId, const RPCError &error) const override { + bool operator()(mtpRequestId requestId, const RPCError &error) override { return _handler ? _handler(error) : true; } @@ -988,7 +988,7 @@ public: class RPCFailHandlerImplementationReq : public RPCFailHandlerImplementation { // fail(error, req_id) public: using Parent::Parent; - bool operator()(mtpRequestId requestId, const RPCError &error) const override { + bool operator()(mtpRequestId requestId, const RPCError &error) override { return this->_handler ? this->_handler(error, requestId) : true; } @@ -997,7 +997,7 @@ public: class RPCFailHandlerImplementationNo : public RPCFailHandlerImplementation { // fail() public: using Parent::Parent; - bool operator()(mtpRequestId requestId, const RPCError &error) const override { + bool operator()(mtpRequestId requestId, const RPCError &error) override { return this->_handler ? this->_handler() : true; } @@ -1006,25 +1006,25 @@ public: class RPCFailHandlerImplementationNoReq : public RPCFailHandlerImplementation { // fail(req_id) public: using Parent::Parent; - bool operator()(mtpRequestId requestId, const RPCError &error) const override { + bool operator()(mtpRequestId requestId, const RPCError &error) override { return this->_handler ? this->_handler(requestId) : true; } }; -inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda lambda) { +inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda_once lambda) { return RPCFailHandlerPtr(new RPCFailHandlerImplementationPlain(std::move(lambda))); } -inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda lambda) { +inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda_once lambda) { return RPCFailHandlerPtr(new RPCFailHandlerImplementationReq(std::move(lambda))); } -inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda lambda) { +inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda_once lambda) { return RPCFailHandlerPtr(new RPCFailHandlerImplementationNo(std::move(lambda))); } -inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda lambda) { +inline RPCFailHandlerPtr rpcFail_lambda_wrap_helper(base::lambda_once lambda) { return RPCFailHandlerPtr(new RPCFailHandlerImplementationNoReq(std::move(lambda))); } diff --git a/Telegram/SourceFiles/settings/settings_privacy_widget.cpp b/Telegram/SourceFiles/settings/settings_privacy_widget.cpp index 0e2a71611..2bd1bf6ab 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_widget.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_widget.cpp @@ -31,6 +31,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "boxes/autolockbox.h" #include "boxes/peer_list_box.h" #include "boxes/edit_privacy_box.h" +#include "boxes/self_destruction_box.h" #include "settings/settings_privacy_controllers.h" namespace Settings { @@ -185,6 +186,7 @@ void PrivacyWidget::createControls() { } addChildRow(_cloudPasswordState, marginSmall); addChildRow(_showAllSessions, marginSmall, lang(lng_settings_show_sessions), SLOT(onShowSessions())); + addChildRow(_selfDestruction, marginSmall, lang(lng_settings_self_destruct), SLOT(onSelfDestruction())); } void PrivacyWidget::autoLockUpdated() { @@ -216,4 +218,8 @@ void PrivacyWidget::onShowSessions() { Ui::show(Box()); } +void PrivacyWidget::onSelfDestruction() { + Ui::show(Box()); +} + } // namespace Settings diff --git a/Telegram/SourceFiles/settings/settings_privacy_widget.h b/Telegram/SourceFiles/settings/settings_privacy_widget.h index 2288c32ba..00a11ea96 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_widget.h +++ b/Telegram/SourceFiles/settings/settings_privacy_widget.h @@ -90,6 +90,7 @@ private slots: void onGroupsInvitePrivacy(); void onAutoLock(); void onShowSessions(); + void onSelfDestruction(); private: void createControls(); @@ -102,6 +103,7 @@ private: object_ptr> _autoLock = { nullptr }; object_ptr _cloudPasswordState = { nullptr }; object_ptr _showAllSessions = { nullptr }; + object_ptr _selfDestruction = { nullptr }; }; diff --git a/Telegram/gyp/telegram_sources.txt b/Telegram/gyp/telegram_sources.txt index ece75c3d1..df2b9a87e 100644 --- a/Telegram/gyp/telegram_sources.txt +++ b/Telegram/gyp/telegram_sources.txt @@ -42,6 +42,8 @@ <(src_loc)/boxes/photocropbox.h <(src_loc)/boxes/report_box.cpp <(src_loc)/boxes/report_box.h +<(src_loc)/boxes/self_destruction_box.cpp +<(src_loc)/boxes/self_destruction_box.h <(src_loc)/boxes/send_files_box.cpp <(src_loc)/boxes/send_files_box.h <(src_loc)/boxes/sessionsbox.cpp