From 622474e83b899a28fb8a0bf8a585e0e4da5d7fa2 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 5 Apr 2022 19:29:43 +0400 Subject: [PATCH] Leave only one list of items for custom sounds. --- Telegram/Resources/langs/lang.strings | 5 +- Telegram/SourceFiles/api/api_ringtones.cpp | 7 +- Telegram/SourceFiles/boxes/boxes.style | 1 - Telegram/SourceFiles/boxes/ringtones_box.cpp | 116 ++++++++++--------- 4 files changed, 66 insertions(+), 63 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index a75c8960f..ec880ff03 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3117,11 +3117,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_telegram_features_url" = "https://t.me/TelegramTips"; "lng_ringtones_box_title" = "Notification Sound"; -"lng_ringtones_box_cloud_subtitle" = "Telegram tones"; -"lng_ringtones_box_local_subtitle" = "System notes"; -"lng_ringtones_box_upload" = "Upload Sound"; +"lng_ringtones_box_cloud_subtitle" = "Choose your tone"; "lng_ringtones_box_upload_choose" = "Choose ringtone"; "lng_ringtones_box_upload_button" = "Upload Sound"; +"lng_ringtones_box_about" = "Click on any short voice note or mp3 file in chat and select \"Save for Notifications\". It will appear here."; "lng_ringtones_box_default" = "Default"; "lng_ringtones_box_no_sound" = "No sound"; "lng_ringtones_box_error" = "Sorry, but your file is too big."; diff --git a/Telegram/SourceFiles/api/api_ringtones.cpp b/Telegram/SourceFiles/api/api_ringtones.cpp index 01fda38b7..54c767831 100644 --- a/Telegram/SourceFiles/api/api_ringtones.cpp +++ b/Telegram/SourceFiles/api/api_ringtones.cpp @@ -125,8 +125,8 @@ void Ringtones::requestList() { _list.requestId = _api.request( MTPaccount_GetSavedRingtones(MTP_long(_list.hash)) ).done([=](const MTPaccount_SavedRingtones &result) { + _list.requestId = 0; result.match([&](const MTPDaccount_savedRingtones &data) { - _list.requestId = 0; _list.hash = data.vhash().v; _list.documents.reserve(_list.documents.size() + data.vringtones().v.size()); @@ -135,10 +135,11 @@ void Ringtones::requestList() { _list.documents.emplace(document->id); } requestList(); - }, [&](const MTPDaccount_savedRingtonesNotModified &) { - _list.requestId = 0; _list.updates.fire({}); + }, [&](const MTPDaccount_savedRingtonesNotModified &) { }); + }).fail([=] { + _list.requestId = 0; }).send(); } diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 6ef61c2d8..68eb0b492 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -1056,7 +1056,6 @@ requestsRejectButton: RoundButton(defaultLightButton) { requestAcceptPosition: point(71px, 58px); requestButtonsSkip: 9px; -ringtonesBoxListHeight: 192; ringtonesBoxButton: SettingsButton(defaultSettingsButton) { textFg: lightButtonFg; textFgOver: lightButtonFgOver; diff --git a/Telegram/SourceFiles/boxes/ringtones_box.cpp b/Telegram/SourceFiles/boxes/ringtones_box.cpp index 1e929eb08..369b3f296 100644 --- a/Telegram/SourceFiles/boxes/ringtones_box.cpp +++ b/Telegram/SourceFiles/boxes/ringtones_box.cpp @@ -55,18 +55,22 @@ void RingtonesBox( std::shared_ptr group; std::vector documentIds; base::unique_qptr menu; + QPointer defaultButton; + QPointer chosenButton; + std::vector> buttons; }; const auto state = container->lifetime().make_state(State{ - std::make_shared( - peer->owner().notifySettings().sound(peer).none - ? kNoSoundValue - : kDefaultValue), + std::make_shared(), }); const auto addToGroup = [=]( not_null verticalLayout, int value, - const QString &text) { + const QString &text, + bool chosen) { + if (chosen) { + state->group->setValue(value); + } const auto button = verticalLayout->add( object_ptr( verticalLayout, @@ -75,11 +79,20 @@ void RingtonesBox( text, st::defaultCheckbox), padding); + if (chosen) { + state->chosenButton = button; + } + if (value == kDefaultValue) { + state->defaultButton = button; + } if (value < 0) { return; } + while (state->buttons.size() <= value) { + state->buttons.push_back(nullptr); + } base::install_event_filter(button, [=](not_null e) { - if (state->menu || e->type() != QEvent::ContextMenu) { + if (e->type() != QEvent::ContextMenu || state->menu) { return base::EventFilterResult::Continue; } state->menu = base::make_unique_q( @@ -114,48 +127,48 @@ void RingtonesBox( container, tr::lng_ringtones_box_cloud_subtitle()); - const auto emptyContent = box->addRow( - object_ptr(container), - style::margins()); - const auto scroll = Ui::CreateChild( - emptyContent, - st::boxScroll); - emptyContent->widthValue( - ) | rpl::start_with_next([=](int width) { - scroll->resize(width, scroll->height()); - }, emptyContent->lifetime()); - scroll->heightValue( - ) | rpl::start_with_next([=](int height) { - emptyContent->resize(emptyContent->width(), height); - }, scroll->lifetime()); + const auto noSound = peer->owner().notifySettings().sound(peer).none; + addToGroup( + container, + kDefaultValue, + tr::lng_ringtones_box_default({}), + false); + addToGroup( + container, + kNoSoundValue, + tr::lng_ringtones_box_no_sound({}), + noSound); - { - peer->session().api().ringtones().listUpdates( - ) | rpl::start_with_next([=] { - state->documentIds.clear(); - const auto list = scroll->setOwnedWidget( - object_ptr(scroll)); - list->sizeValue( - ) | rpl::start_with_next([=](const QSize &s) { - scroll->resize( - scroll->width(), - std::min(s.height(), st::ringtonesBoxListHeight)); - }, list->lifetime()); - list->resize(scroll->size()); - auto value = 0; - const auto checkedId = peer->owner().notifySettings().sound(peer); - for (const auto &id : peer->session().api().ringtones().list()) { - const auto document = peer->session().data().document(id); - addToGroup(list, value++, document->filename()); - state->documentIds.push_back(id); - if (checkedId.id && checkedId.id == id) { - state->group->setValue(value - 1); - } - } - }, scroll->lifetime()); + const auto custom = container->add( + object_ptr(container)); - peer->session().api().ringtones().requestList(); - } + const auto rebuild = [=] { + state->documentIds.clear(); + auto value = 0; + while (custom->count()) { + delete custom->widgetAt(0); + } + + const auto checkedId = peer->owner().notifySettings().sound(peer); + for (const auto &id : peer->session().api().ringtones().list()) { + const auto chosen = (checkedId.id && checkedId.id == id); + const auto document = peer->session().data().document(id); + addToGroup(custom, value++, document->filename(), chosen); + state->documentIds.push_back(id); + } + + custom->resizeToWidth(container->width()); + if (!state->chosenButton) { + state->group->setValue(kDefaultValue); + state->defaultButton->finishAnimating(); + } + }; + + peer->session().api().ringtones().listUpdates( + ) | rpl::start_with_next(rebuild, container->lifetime()); + + peer->session().api().ringtones().requestList(); + rebuild(); const auto upload = box->addRow( Settings::CreateButton( @@ -201,16 +214,7 @@ void RingtonesBox( }); box->addSkip(st::ringtonesBoxSkip); - Settings::AddDivider(container); - - box->addSkip(st::ringtonesBoxSkip); - - Settings::AddSubsectionTitle( - container, - tr::lng_ringtones_box_local_subtitle()); - - addToGroup(container, kDefaultValue, tr::lng_ringtones_box_default({})); - addToGroup(container, kNoSoundValue, tr::lng_ringtones_box_no_sound({})); + Settings::AddDividerText(container, tr::lng_ringtones_box_about()); box->addSkip(st::ringtonesBoxSkip);