diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 5ca48ca666..93e381497e 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -407,6 +407,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_username_link" = "This link opens a chat with you:"; "lng_username_copied" = "Link copied to clipboard."; +"lng_usernames_edit" = "click to edit"; "lng_usernames_active" = "active"; "lng_usernames_non_active" = "non active"; "lng_usernames_subtitle" = "Usernames order"; @@ -415,7 +416,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_channel_usernames_subtitle" = "Links order"; "lng_usernames_deactivate_description" = "Do you want to hide this username from your info page?"; "lng_usernames_deactivate_confirm" = "Hide"; -"lng_usernames_deactivate_error" = "Sorry, you can't deactivate this username from your info page. "; "lng_usernames_description" = "Drag and drop links to change the order in which they will be displayed on your info page."; "lng_channel_usernames_activate_description" = "Do you want to show this link on the channel info page?"; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp index f6ce4ceea3..bae93788d9 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_type_box.cpp @@ -88,6 +88,10 @@ public: return _controls.requestToJoin && _controls.requestToJoin->toggled(); } + [[nodiscard]] rpl::producer scrollToRequests() const { + return _scrollToRequests.events(); + } + void showError(rpl::producer text) { _controls.usernameInput->showError(); showUsernameError(std::move(text)); @@ -155,6 +159,8 @@ private: UsernameState _usernameState = UsernameState::Normal; rpl::event_stream> _usernameResultTexts; + rpl::event_stream _scrollToRequests; + rpl::lifetime _lifetime; }; @@ -446,8 +452,12 @@ object_ptr Controller::createUsernameEdit() { container, tr::lng_create_channel_link_about()); + const auto focusCallback = [=] { + _scrollToRequests.fire(container->y()); + _controls.usernameInput->setFocusFast(); + }; _controls.usernamesList = container->add( - object_ptr(container, channel, _show)); + object_ptr(container, channel, _show, focusCallback)); QObject::connect( _controls.usernameInput, @@ -715,6 +725,10 @@ void EditPeerTypeBox::prepare() { _peer, _useLocationPhrases, _dataSavedValue); + controller->scrollToRequests( + ) | rpl::start_with_next([=, raw = content.data()](int y) { + scrollToY(raw->y() + y); + }, lifetime()); _focusRequests.events( ) | rpl::start_with_next( [=] { diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.cpp index 96bd64211e..e775e7bc06 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.cpp @@ -93,7 +93,9 @@ UsernamesList::Row::Row( : Ui::SettingsButton(parent, rpl::never()) , _st(st::inviteLinkListItem) , _data(data) -, _status(data.active +, _status(data.editable + ? tr::lng_usernames_edit(tr::now) + : data.active ? tr::lng_usernames_active(tr::now) : tr::lng_usernames_non_active(tr::now)) , _rightAction(Ui::CreateChild(this)) @@ -152,14 +154,16 @@ void UsernamesList::Row::paintEvent(QPaintEvent *e) { Ui::SettingsButton::paintBg(p, e->rect(), paintOver); Ui::SettingsButton::paintRipple(p, 0, 0); - const auto &color = _data.active ? st::msgFile1Bg : st::windowSubTextFg; + const auto active = _data.active; + + const auto &color = active ? st::msgFile1Bg : st::windowSubTextFg; p.setPen(Qt::NoPen); p.setBrush(color); { auto hq = PainterHighQualityEnabler(p); p.drawEllipse(_iconRect); } - (!_data.active + (!active ? st::inviteLinkRevokedIcon : st::inviteLinkIcon).paintInCenter(p, _iconRect); @@ -171,7 +175,7 @@ void UsernamesList::Row::paintEvent(QPaintEvent *e) { width(), width() - _st.namePosition.x()); - p.setPen(_data.active + p.setPen(active ? _st.statusFgActive : paintOver ? _st.statusFgOver @@ -187,10 +191,12 @@ void UsernamesList::Row::paintEvent(QPaintEvent *e) { UsernamesList::UsernamesList( not_null parent, not_null peer, - std::shared_ptr show) + std::shared_ptr show, + Fn focusCallback) : RpWidget(parent) , _show(show) -, _peer(peer) { +, _peer(peer) +, _focusCallback(std::move(focusCallback)) { { auto &api = _peer->session().api(); const auto usernames = api.usernames().cacheFor(_peer->id); @@ -247,12 +253,8 @@ void UsernamesList::rebuild(const Data::Usernames &usernames) { return; } - if (username.username == _peer->userName()) { - _show->showBox( - Ui::MakeInformBox(_peer->isSelf() - ? tr::lng_usernames_deactivate_error() - : tr::lng_channel_usernames_deactivate_error()), - Ui::LayerOption::KeepOther); + if (username.editable) { + _focusCallback(); return; } diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.h b/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.h index 7ff074c4e2..c93bd232a5 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.h +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_usernames_list.h @@ -27,7 +27,8 @@ public: UsernamesList( not_null parent, not_null peer, - std::shared_ptr show); + std::shared_ptr show, + Fn focusCallback); [[nodiscard]] rpl::producer<> save(); [[nodiscard]] std::vector order() const; @@ -40,6 +41,7 @@ private: const std::shared_ptr _show; const not_null _peer; + Fn _focusCallback; base::unique_qptr _container; std::unique_ptr _reorder; diff --git a/Telegram/SourceFiles/boxes/username_box.cpp b/Telegram/SourceFiles/boxes/username_box.cpp index 332fb89b4c..38b60f3c0e 100644 --- a/Telegram/SourceFiles/boxes/username_box.cpp +++ b/Telegram/SourceFiles/boxes/username_box.cpp @@ -294,6 +294,7 @@ void UsernamesBox( const auto editor = box->addRow( object_ptr(box, session), {}); + box->setFocusCallback([=] { editor->setInnerFocus(); }); container->add(object_ptr( container, @@ -307,7 +308,11 @@ void UsernamesBox( object_ptr( box, session->user(), - std::make_shared(box)), + std::make_shared(box), + [=] { + box->scrollToY(0); + editor->setInnerFocus(); + }), {}); const auto finish = [=] {