diff --git a/Telegram/SourceFiles/boxes/generic_box.h b/Telegram/SourceFiles/boxes/generic_box.h index 317bc4908..47a0e6da7 100644 --- a/Telegram/SourceFiles/boxes/generic_box.h +++ b/Telegram/SourceFiles/boxes/generic_box.h @@ -34,6 +34,9 @@ public: void setWidth(int width) { _width = width; } + void setFocusCallback(Fn callback) { + _focus = callback; + } int rowsCount() const { return _content->count(); @@ -65,6 +68,12 @@ public: void addSkip(int height); + void setInnerFocus() override { + if (_focus) { + _focus(); + } + } + protected: void prepare() override; @@ -90,6 +99,7 @@ private: -> Initer, std::decay_t...>; FnMut)> _init; + Fn _focus; object_ptr _content; int _width = 0; diff --git a/Telegram/SourceFiles/boxes/peers/add_to_contacts_box.h b/Telegram/SourceFiles/boxes/peers/add_to_contacts_box.h deleted file mode 100644 index cd4e42e06..000000000 --- a/Telegram/SourceFiles/boxes/peers/add_to_contacts_box.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -This file is part of Telegram Desktop, -the official desktop application for the Telegram messaging service. - -For license and copyright information please follow this link: -https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL -*/ -#pragma once - -#include "boxes/abstract_box.h" - -class UserData; - -namespace Window { -class Controller; -} // namespace Window - -namespace Ui { -class VerticalLayout; -} // namespace Ui - -class AddToContactsBox : public BoxContent { -public: - AddToContactsBox( - QWidget*, - not_null window, - not_null user); - -protected: - void prepare() override; - - void setInnerFocus() override; - -private: - void setupContent(); - void setupCover(not_null container); - void setupNameFields(not_null container); - void setupWarning(not_null container); - void initNameFields( - not_null first, - not_null last, - bool inverted); - - not_null _window; - not_null _user; - QString _phone; - Fn _focus; - Fn _save; - -}; diff --git a/Telegram/SourceFiles/boxes/peers/add_to_contacts_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp similarity index 54% rename from Telegram/SourceFiles/boxes/peers/add_to_contacts_box.cpp rename to Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp index 31fffd2ce..5d2546c51 100644 --- a/Telegram/SourceFiles/boxes/peers/add_to_contacts_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp @@ -5,8 +5,9 @@ the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ -#include "boxes/peers/add_to_contacts_box.h" +#include "boxes/peers/edit_contact_box.h" +#include "boxes/generic_box.h" #include "data/data_user.h" #include "data/data_session.h" #include "ui/wrap/vertical_layout.h" @@ -31,83 +32,162 @@ QString UserPhone(not_null user) { : phone; } -} // namespace +class Builder { +public: + Builder( + not_null box, + not_null window, + not_null user); -AddToContactsBox::AddToContactsBox( - QWidget*, + void build(); + +private: + void setupContent(); + void setupCover(); + void setupNameFields(); + void setupWarning(); + void initNameFields( + not_null first, + not_null last, + bool inverted); + + not_null _box; + not_null _window; + not_null _user; + QString _phone; + Fn _focus; + Fn _save; + +}; + +Builder::Builder( + not_null box, not_null window, not_null user) -: _window(window) +: _box(box) +, _window(window) , _user(user) , _phone(UserPhone(user)) { } -void AddToContactsBox::prepare() { +void Builder::build() { + const auto box = _box; + setupContent(); - setTitle(langFactory(lng_enter_contact_data)); + box->setTitle(langFactory(_user->isContact() + ? lng_edit_contact_title + : lng_enter_contact_data)); - addButton(langFactory(lng_box_done), [=] { _save(); }); - addButton(langFactory(lng_cancel), [=] { closeBox(); }); + box->addButton(langFactory(lng_box_done), _save); + box->addButton(langFactory(lng_cancel), [=] { box->closeBox(); }); + box->setFocusCallback(_focus); } -void AddToContactsBox::setInnerFocus() { - _focus(); +void Builder::setupContent() { + setupCover(); + setupNameFields(); + setupWarning(); } -void AddToContactsBox::setupContent() { - const auto content = Ui::CreateChild(this); - - setupCover(content); - setupNameFields(content); - setupWarning(content); - - setDimensionsToContent(st::boxWidth, content); +void Builder::setupCover() { + _box->addRow( + object_ptr( + _box, + _user, + _window->sessionController(), + (_phone.isEmpty() + ? Lang::Viewer(lng_contact_mobile_hidden) + : rpl::single(App::formatPhone(_phone)))), + style::margins())->setAttribute(Qt::WA_TransparentForMouseEvents); } -void AddToContactsBox::setupCover(not_null container) { - container->add(object_ptr( - container, - _user, - _window->sessionController(), - (_phone.isEmpty() - ? Lang::Viewer(lng_contact_mobile_hidden) - : rpl::single(App::formatPhone(_phone)))) - )->setAttribute(Qt::WA_TransparentForMouseEvents); -} - -void AddToContactsBox::setupNameFields( - not_null container) { +void Builder::setupNameFields() { const auto inverted = langFirstNameGoesSecond(); - const auto first = container->add( + const auto first = _box->addRow( object_ptr( - container, + _box, st::defaultInputField, langFactory(lng_signup_firstname), _user->firstName), st::addContactFieldMargin); auto preparedLast = object_ptr( - container, + _box, st::defaultInputField, langFactory(lng_signup_lastname), _user->lastName); const auto last = inverted - ? container->insert( - container->count() - 1, + ? _box->insertRow( + _box->rowsCount() - 1, std::move(preparedLast), st::addContactFieldMargin) - : container->add(std::move(preparedLast), st::addContactFieldMargin); + : _box->addRow(std::move(preparedLast), st::addContactFieldMargin); initNameFields(first, last, inverted); } -void AddToContactsBox::initNameFields( +void Builder::initNameFields( not_null first, not_null last, bool inverted) { + const auto box = _box; + const auto phone = _phone; + const auto user = _user; + const auto getValue = [](not_null field) { + return TextUtilities::SingleLine(field->getLastText()).trimmed(); + }; + if (inverted) { - setTabOrder(last, first); + box->setTabOrder(last, first); } + const auto focus = [=] { + const auto firstValue = getValue(first); + const auto lastValue = getValue(last); + const auto empty = firstValue.isEmpty() && lastValue.isEmpty(); + const auto focusFirst = (inverted != empty); + (focusFirst ? first : last)->setFocusFast(); + }; + const auto save = [=] { + const auto firstValue = getValue(first); + const auto lastValue = getValue(last); + const auto empty = firstValue.isEmpty() && lastValue.isEmpty(); + if (empty) { + focus(); + (inverted ? last : first)->showError(); + return; + } + const auto wasContact = user->isContact(); + const auto weak = make_weak(box); + user->session().api().request(MTPcontacts_AddContact( + MTP_flags(0), + user->inputUser, + MTP_string(firstValue), + MTP_string(lastValue), + MTP_string(phone) + )).done([=](const MTPUpdates &result) { + user->setName( + firstValue, + lastValue, + user->nameOrPhone, + user->username); + user->session().api().applyUpdates(result); + if (const auto settings = user->settings()) { + using Flag = MTPDpeerSettings::Flag; + const auto flags = Flag::f_add_contact + | Flag::f_block_contact + | Flag::f_report_spam; + user->setSettings(*settings & ~flags); + } + if (weak) { + weak->closeBox(); + } + if (!wasContact) { + Ui::Toast::Show( + lng_new_contact_add_done(lt_user, firstValue)); + } + }).fail([=](const RPCError &error) { + }).send(); + }; const auto submit = [=] { const auto firstValue = first->getLastText().trimmed(); const auto lastValue = last->getLastText().trimmed(); @@ -120,53 +200,17 @@ void AddToContactsBox::initNameFields( _save(); } }; - connect(first, &Ui::InputField::submitted, [=] { submit(); }); - connect(last, &Ui::InputField::submitted, [=] { submit(); }); + QObject::connect(first, &Ui::InputField::submitted, [=] { submit(); }); + QObject::connect(last, &Ui::InputField::submitted, [=] { submit(); }); - _focus = [=] { - const auto firstValue = first->getLastText().trimmed(); - const auto lastValue = last->getLastText().trimmed(); - const auto empty = firstValue.isEmpty() && lastValue.isEmpty(); - const auto focusFirst = (inverted != empty); - (focusFirst ? first : last)->setFocusFast(); - }; - _save = [=] { - const auto firstValue = first->getLastText().trimmed(); - const auto lastValue = last->getLastText().trimmed(); - const auto empty = firstValue.isEmpty() && lastValue.isEmpty(); - if (empty) { - _focus(); - (inverted ? last : first)->showError(); - return; - } - const auto user = _user; - const auto box = make_weak(this); - user->session().api().request(MTPcontacts_AddContact( - MTP_flags(0), - user->inputUser, - MTP_string(firstValue), - MTP_string(lastValue), - MTP_string(_phone) - )).done([=](const MTPUpdates &result) { - user->session().api().applyUpdates(result); - if (const auto settings = user->settings()) { - using Flag = MTPDpeerSettings::Flag; - const auto flags = Flag::f_add_contact - | Flag::f_block_contact - | Flag::f_report_spam; - user->setSettings(*settings & ~flags); - } - if (box) { - box->closeBox(); - } - Ui::Toast::Show(lng_new_contact_add_done(lt_user, firstValue)); - }).fail([=](const RPCError &error) { - }).send(); - }; + _focus = focus; + _save = save; } -void AddToContactsBox::setupWarning( - not_null container) { +void Builder::setupWarning() { + if (_user->isContact()) { + return; + } const auto name = _user->shortName(); const auto nameWithEntities = TextWithEntities{ name }; const auto text = _phone.isEmpty() @@ -182,10 +226,19 @@ void AddToContactsBox::setupWarning( Ui::Text::Bold(lang(lng_box_done).toUpper()), lt_user, TextWithEntities{ name }); - container->add( + _box->addRow( object_ptr( - container, + _box, rpl::single(text), st::changePhoneLabel), st::addContactWarningMargin); -} \ No newline at end of file +} + +} // namespace + +void EditContactBox( + not_null box, + not_null window, + not_null user) { + Builder(box, window, user).build(); +} diff --git a/Telegram/SourceFiles/boxes/peers/edit_contact_box.h b/Telegram/SourceFiles/boxes/peers/edit_contact_box.h new file mode 100644 index 000000000..da19edcf4 --- /dev/null +++ b/Telegram/SourceFiles/boxes/peers/edit_contact_box.h @@ -0,0 +1,20 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +class UserData; +class GenericBox; + +namespace Window { +class Controller; +} // namespace Window + +void EditContactBox( + not_null box, + not_null window, + not_null user); diff --git a/Telegram/SourceFiles/history/view/history_view_contact_status.cpp b/Telegram/SourceFiles/history/view/history_view_contact_status.cpp index c3dfc2d6c..48ac1db23 100644 --- a/Telegram/SourceFiles/history/view/history_view_contact_status.cpp +++ b/Telegram/SourceFiles/history/view/history_view_contact_status.cpp @@ -22,7 +22,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "auth_session.h" #include "boxes/confirm_box.h" -#include "boxes/generic_box.h" +#include "boxes/generic_box.h" // window->show(Box(InitMethod())) +#include "boxes/peers/edit_contact_box.h" #include "styles/style_history.h" #include "styles/style_boxes.h" @@ -293,14 +294,14 @@ void ContactStatus::setupHandlers(not_null peer) { void ContactStatus::setupAddHandler(not_null user) { _bar.entity()->addClicks( ) | rpl::start_with_next([=] { - Window::PeerMenuAddContact(user); + _window->show(Box(EditContactBox, _window, user)); }, _bar.lifetime()); } void ContactStatus::setupBlockHandler(not_null user) { _bar.entity()->blockClicks( ) | rpl::start_with_next([=] { - _window->show(Box(Window::PeerMenuBlockUserBox, user, _window)); + _window->show(Box(Window::PeerMenuBlockUserBox, _window, user)); }, _bar.lifetime()); } diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index 9aed1af2a..b89879246 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -24,7 +24,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peer_list_controllers.h" #include "boxes/add_contact_box.h" #include "boxes/report_box.h" -#include "boxes/generic_box.h" +#include "boxes/generic_box.h" // window->show(Box(InitMethod())) +#include "boxes/peers/edit_contact_box.h" #include "lang/lang_keys.h" #include "info/info_controller.h" #include "info/info_memento.h" @@ -34,7 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/profile/info_profile_text.h" #include "support/support_helper.h" #include "window/window_session_controller.h" -#include "window/window_controller.h" +#include "window/window_controller.h" // Window::Controller::show. #include "window/window_peer_menu.h" #include "mainwidget.h" #include "mainwindow.h" // MainWindow::controller. @@ -405,11 +406,12 @@ Ui::MultiSlideTracker DetailsFiller::fillUserButtons( } else { addSendMessageButton(); + const auto window = &_controller->parentController()->window()->controller(); AddMainButton( _wrap, Lang::Viewer(lng_info_add_as_contact), CanAddContactValue(user), - [user] { Window::PeerMenuAddContact(user); }, + [=] { window->show(Box(EditContactBox, window, user)); }, tracker); } return tracker; @@ -483,11 +485,12 @@ void ActionsFiller::addShareContactAction(not_null user) { } void ActionsFiller::addEditContactAction(not_null user) { + const auto window = &_controller->parentController()->window()->controller(); AddActionButton( _wrap, Lang::Viewer(lng_info_edit_contact), IsContactValue(user), - [=] { Ui::show(Box(user)); }); + [=] { window->show(Box(EditContactBox, window, user)); }); } void ActionsFiller::addDeleteContactAction( @@ -603,7 +606,7 @@ void ActionsFiller::addBlockAction(not_null user) { } else if (user->isBot()) { user->session().api().blockUser(user); } else { - window->show(Box(Window::PeerMenuBlockUserBox, user, window)); + window->show(Box(Window::PeerMenuBlockUserBox, window, user)); } }; AddActionButton( diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 90ac604f7..fa89ff510 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -15,7 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/generic_box.h" #include "boxes/create_poll_box.h" #include "boxes/peers/add_participants_box.h" -#include "boxes/peers/add_to_contacts_box.h" +#include "boxes/peers/edit_contact_box.h" #include "ui/toast/toast.h" #include "ui/text/text_utilities.h" #include "ui/widgets/labels.h" @@ -345,7 +345,7 @@ void Filler::addBlockUser(not_null user) { } else if (user->isBot()) { user->session().api().blockUser(user); } else { - window->show(Box(PeerMenuBlockUserBox, user, window)); + window->show(Box(PeerMenuBlockUserBox, window, user)); } }); @@ -363,6 +363,7 @@ void Filler::addBlockUser(not_null user) { } void Filler::addUserActions(not_null user) { + const auto window = &_controller->window()->controller(); if (_source != PeerMenuSource::ChatsList) { if (Auth().supportMode()) { _addAction("Edit support info", [=] { @@ -372,7 +373,7 @@ void Filler::addUserActions(not_null user) { if (!user->isContact() && !user->isSelf() && !user->isBot()) { _addAction( lang(lng_info_add_as_contact), - [=] { PeerMenuAddContact(user); }); + [=] { window->show(Box(EditContactBox, window, user)); }); } if (user->canShareThisContact()) { _addAction( @@ -382,7 +383,7 @@ void Filler::addUserActions(not_null user) { if (user->isContact() && !user->isSelf()) { _addAction( lang(lng_info_edit_contact), - [=] { Ui::show(Box(user)); }); + [=] { window->show(Box(EditContactBox, window, user)); }); _addAction( lang(lng_info_delete_contact), [=] { PeerMenuDeleteContact(user); }); @@ -413,10 +414,11 @@ void Filler::addUserActions(not_null user) { void Filler::addChatActions(not_null chat) { if (_source != PeerMenuSource::ChatsList) { + const auto controller = _controller; if (EditPeerInfoBox::Available(chat)) { const auto text = lang(lng_manage_group_title); _addAction(text, [=] { - App::wnd()->sessionController()->showEditPeerBox(chat); + controller->showEditPeerBox(chat); }); } if (chat->canAddMembers()) { @@ -456,11 +458,12 @@ void Filler::addChannelActions(not_null channel) { //} if (_source != PeerMenuSource::ChatsList) { if (EditPeerInfoBox::Available(channel)) { + const auto controller = _controller; const auto text = lang(isGroup ? lng_manage_group_title : lng_manage_channel_title); _addAction(text, [=] { - App::wnd()->sessionController()->showEditPeerBox(channel); + controller->showEditPeerBox(channel); }); } if (channel->canAddMembers()) { @@ -636,10 +639,6 @@ void PeerMenuDeleteContact(not_null user) { deleteSure)); } -void PeerMenuAddContact(not_null user) { - Ui::show(Box(&App::wnd()->controller(), user)); -} - void PeerMenuShareContactBox(not_null user) { const auto weak = std::make_shared>(); auto callback = [=](not_null peer) { @@ -706,8 +705,8 @@ void PeerMenuCreatePoll(not_null peer) { void PeerMenuBlockUserBox( not_null box, - not_null user, - not_null window) { + not_null window, + not_null user) { using Flag = MTPDpeerSettings::Flag; const auto settings = user->settings().value_or(Flag(0)); diff --git a/Telegram/SourceFiles/window/window_peer_menu.h b/Telegram/SourceFiles/window/window_peer_menu.h index cf6fe0384..36712d6da 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.h +++ b/Telegram/SourceFiles/window/window_peer_menu.h @@ -50,14 +50,13 @@ void PeerMenuAddMuteAction( void PeerMenuExportChat(not_null peer); void PeerMenuDeleteContact(not_null user); void PeerMenuShareContactBox(not_null user); -void PeerMenuAddContact(not_null user); void PeerMenuAddChannelMembers(not_null channel); //void PeerMenuUngroupFeed(not_null feed); // #feed void PeerMenuCreatePoll(not_null peer); void PeerMenuBlockUserBox( not_null box, - not_null user, - not_null window); + not_null window, + not_null user); void ToggleHistoryArchived(not_null history, bool archived); Fn ClearHistoryHandler(not_null peer); diff --git a/Telegram/gyp/telegram_sources.txt b/Telegram/gyp/telegram_sources.txt index 7f13699b2..eb5a0e9b0 100644 --- a/Telegram/gyp/telegram_sources.txt +++ b/Telegram/gyp/telegram_sources.txt @@ -1,7 +1,7 @@ <(src_loc)/boxes/peers/add_participants_box.cpp <(src_loc)/boxes/peers/add_participants_box.h -<(src_loc)/boxes/peers/add_to_contacts_box.cpp -<(src_loc)/boxes/peers/add_to_contacts_box.h +<(src_loc)/boxes/peers/edit_contact_box.cpp +<(src_loc)/boxes/peers/edit_contact_box.h <(src_loc)/boxes/peers/edit_linked_chat_box.cpp <(src_loc)/boxes/peers/edit_linked_chat_box.h <(src_loc)/boxes/peers/edit_participant_box.cpp