From dbaa7b5e674fe500600369076349929638dc8262 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 15 Aug 2025 19:26:23 +0400 Subject: [PATCH] Allow forward / delete saved music. --- Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/apiwrap.cpp | 18 ++++- .../SourceFiles/boxes/delete_messages_box.cpp | 65 ++++++++++++------- .../SourceFiles/boxes/delete_messages_box.h | 1 + Telegram/SourceFiles/data/data_histories.cpp | 23 +++++-- .../controls/history_view_draft_options.cpp | 2 +- .../controls/history_view_forward_panel.cpp | 11 +++- .../controls/history_view_forward_panel.h | 1 + .../info/media/info_media_list_widget.cpp | 4 ++ .../info/saved/info_saved_music_provider.cpp | 29 +++------ 10 files changed, 102 insertions(+), 53 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index ade5b22f81..e46c793933 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4814,6 +4814,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_selected_delete_sure_this" = "Do you want to delete this message?"; "lng_selected_delete_sure#one" = "Do you want to delete {count} message?"; "lng_selected_delete_sure#other" = "Do you want to delete {count} messages?"; +"lng_selected_remove_saved_music" = "Do you want to remove this file from your profile?"; "lng_delete_photo_sure" = "Do you want to delete this photo?"; "lng_delete_for_everyone_hint#one" = "This will delete it for everyone in this chat."; "lng_delete_for_everyone_hint#other" = "This will delete them for everyone in this chat."; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index fdf8e04512..bc13e0774a 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -3350,8 +3350,8 @@ void ApiWrap::finishForwarding(const SendAction &action) { return; } - forwardMessages(std::move(toForward), action); history->setForwardDraft(topicRootId, monoforumPeerId, {}); + forwardMessages(std::move(toForward), action); } _session->data().sendHistoryChangeNotifications(); @@ -3372,6 +3372,22 @@ void ApiWrap::forwardMessages( auto &histories = _session->data().histories(); + for (auto i = begin(draft.items); i != end(draft.items);) { + const auto item = *i; + if (item->isSavedMusicItem()) { + SendExistingDocument(MessageToSend(action), item->media()->document()); + i = draft.items.erase(i); + } else { + ++i; + } + } + if (draft.items.empty()) { + if (successCallback) { + successCallback(); + } + return; + } + struct SharedCallback { int requestsLeft = 0; FnMut callback; diff --git a/Telegram/SourceFiles/boxes/delete_messages_box.cpp b/Telegram/SourceFiles/boxes/delete_messages_box.cpp index c4edf1b3fa..20f5136512 100644 --- a/Telegram/SourceFiles/boxes/delete_messages_box.cpp +++ b/Telegram/SourceFiles/boxes/delete_messages_box.cpp @@ -224,12 +224,14 @@ void DeleteMessagesBox::prepare() { search->searchMessages({ .from = _moderateFrom }); } } else { - details.text = (_ids.size() == 1) + details.text = hasSavedMusicMessages() + ? tr::lng_selected_remove_saved_music(tr::now) + : (_ids.size() == 1) ? tr::lng_selected_delete_sure_this(tr::now) : tr::lng_selected_delete_sure(tr::now, lt_count, _ids.size()); if (const auto peer = checkFromSinglePeer()) { auto count = int(_ids.size()); - if (hasScheduledMessages()) { + if (hasScheduledMessages() || hasSavedMusicMessages()) { } else if (auto revoke = revokeText(peer)) { const auto &settings = Core::App().settings(); const auto revokeByDefault @@ -313,28 +315,36 @@ void DeleteMessagesBox::prepare() { addButton(tr::lng_about_done(), [=] { closeBox(); }); } - auto fullHeight = st::boxPadding.top() - + _text->height() - + st::boxPadding.bottom(); - if (_moderateFrom) { - fullHeight += st::boxMediumSkip; - if (_banUser) { - fullHeight += _banUser->heightNoMargins() + st::boxLittleSkip; + const auto &padding = st::boxPadding; + rpl::combine( + widthValue(), + _text->naturalWidthValue() + ) | rpl::start_with_next([=](int full, int) { + _text->resizeToNaturalWidth(full - padding.left() - padding.right()); + + auto fullHeight = st::boxPadding.top() + + _text->height() + + st::boxPadding.bottom(); + if (_moderateFrom) { + fullHeight += st::boxMediumSkip; + if (_banUser) { + fullHeight += _banUser->heightNoMargins() + st::boxLittleSkip; + } + fullHeight += _reportSpam->heightNoMargins(); + if (_deleteAll) { + fullHeight += st::boxLittleSkip + _deleteAll->heightNoMargins(); + } + } else if (_revoke) { + fullHeight += st::boxMediumSkip + _revoke->heightNoMargins(); } - fullHeight += _reportSpam->heightNoMargins(); - if (_deleteAll) { - fullHeight += st::boxLittleSkip + _deleteAll->heightNoMargins(); + if (_autoDeleteSettings) { + fullHeight += st::boxMediumSkip + + _autoDeleteSettings->height() + + st::boxLittleSkip; } - } else if (_revoke) { - fullHeight += st::boxMediumSkip + _revoke->heightNoMargins(); - } - if (_autoDeleteSettings) { - fullHeight += st::boxMediumSkip - + _autoDeleteSettings->height() - + st::boxLittleSkip; - } - setDimensions(st::boxWidth, fullHeight); - _fullHeight = fullHeight; + setDimensions(st::boxWidth, fullHeight); + _fullHeight = fullHeight; + }, lifetime()); } bool DeleteMessagesBox::hasScheduledMessages() const { @@ -348,6 +358,17 @@ bool DeleteMessagesBox::hasScheduledMessages() const { return false; } +bool DeleteMessagesBox::hasSavedMusicMessages() const { + for (const auto &fullId : _ids) { + if (const auto item = _session->data().message(fullId)) { + if (item->isSavedMusicItem()) { + return true; + } + } + } + return false; +} + PeerData *DeleteMessagesBox::checkFromSinglePeer() const { auto result = (PeerData*)nullptr; for (const auto &fullId : _ids) { diff --git a/Telegram/SourceFiles/boxes/delete_messages_box.h b/Telegram/SourceFiles/boxes/delete_messages_box.h index 29cd403561..635a1fd362 100644 --- a/Telegram/SourceFiles/boxes/delete_messages_box.h +++ b/Telegram/SourceFiles/boxes/delete_messages_box.h @@ -58,6 +58,7 @@ private: void deleteAndClear(); [[nodiscard]] PeerData *checkFromSinglePeer() const; [[nodiscard]] bool hasScheduledMessages() const; + [[nodiscard]] bool hasSavedMusicMessages() const; [[nodiscard]] std::optional revokeText( not_null peer) const; [[nodiscard]] PaidPostType paidPostType() const; diff --git a/Telegram/SourceFiles/data/data_histories.cpp b/Telegram/SourceFiles/data/data_histories.cpp index 30983b9347..047f1ba9bd 100644 --- a/Telegram/SourceFiles/data/data_histories.cpp +++ b/Telegram/SourceFiles/data/data_histories.cpp @@ -10,13 +10,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_text_entities.h" #include "data/business/data_shortcut_messages.h" #include "data/components/scheduled_messages.h" -#include "data/data_saved_sublist.h" -#include "data/data_session.h" #include "data/data_channel.h" #include "data/data_chat.h" +#include "data/data_document.h" #include "data/data_folder.h" #include "data/data_forum.h" #include "data/data_forum_topic.h" +#include "data/data_saved_music.h" +#include "data/data_saved_sublist.h" +#include "data/data_session.h" #include "data/data_user.h" #include "base/unixtime.h" #include "base/random.h" @@ -885,10 +887,10 @@ void Histories::deleteMessagesByDates( } void Histories::deleteMessagesByDates( - not_null history, - TimeId minDate, - TimeId maxDate, - bool revoke) { + not_null history, + TimeId minDate, + TimeId maxDate, + bool revoke) { sendRequest(history, RequestType::Delete, [=](Fn finish) { const auto peer = history->peer; using Flag = MTPmessages_DeleteHistory::Flag; @@ -921,10 +923,14 @@ void Histories::deleteMessages(const MessageIdsList &ids, bool revoke) { base::flat_map, QVector> idsByPeer; base::flat_map, QVector> scheduledIdsByPeer; base::flat_map> quickIdsByShortcut; + base::flat_set> savedMusic; for (const auto &itemId : ids) { if (const auto item = _owner->message(itemId)) { const auto history = item->history(); - if (item->isScheduled()) { + if (item->isSavedMusicItem()) { + savedMusic.emplace(item->media()->document()); + continue; + } else if (item->isScheduled()) { const auto wasOnServer = !item->isSending() && !item->hasFailed(); auto &scheduled = _owner->session().scheduledMessages(); @@ -973,6 +979,9 @@ void Histories::deleteMessages(const MessageIdsList &ids, bool revoke) { api->applyUpdates(result); }).send(); } + for (const auto &document : savedMusic) { + document->owner().savedMusic().remove(document); + } for (const auto item : remove) { const auto history = item->history(); diff --git a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp index a1f3d9ae3e..417548f20d 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_draft_options.cpp @@ -949,7 +949,7 @@ void DraftOptionsBox( AddFilledSkip(bottom); if (!hasOnlyForcedForwardedInfo - && !HasOnlyDroppedForwardedInfo(items)) { + && HasDropForwardedInfoSetting(items)) { Settings::AddButtonWithIcon( bottom, (dropNames diff --git a/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp b/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp index 8a8b30fff8..5d01148138 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.cpp @@ -463,11 +463,20 @@ bool HasOnlyForcedForwardedInfo(const HistoryItemsList &list) { bool HasOnlyDroppedForwardedInfo(const HistoryItemsList &list) { for (const auto &item : list) { - if (!item->computeDropForwardedInfo()) { + if (item->isSavedMusicItem() || !item->computeDropForwardedInfo()) { return false; } } return true; } +bool HasDropForwardedInfoSetting(const HistoryItemsList &list) { + for (const auto &item : list) { + if (!item->computeDropForwardedInfo()) { + return true; + } + } + return false; +} + } // namespace HistoryView::Controls diff --git a/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.h b/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.h index 2e8dcc36d5..b29204047d 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.h +++ b/Telegram/SourceFiles/history/view/controls/history_view_forward_panel.h @@ -87,5 +87,6 @@ void EditWebPageOptions( [[nodiscard]] bool HasOnlyForcedForwardedInfo(const HistoryItemsList &list); [[nodiscard]] bool HasOnlyDroppedForwardedInfo(const HistoryItemsList &list); +[[nodiscard]] bool HasDropForwardedInfoSetting(const HistoryItemsList &list); } // namespace HistoryView::Controls diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index 95c93ba3e4..1df9f6e459 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -1308,6 +1308,10 @@ void ListWidget::showContextMenu( } } + if (_contextMenu->empty()) { + _contextMenu = nullptr; + return; + } _contextMenu->setDestroyedCallback(crl::guard( this, [=] { diff --git a/Telegram/SourceFiles/info/saved/info_saved_music_provider.cpp b/Telegram/SourceFiles/info/saved/info_saved_music_provider.cpp index 04510fc78c..ef8378b139 100644 --- a/Telegram/SourceFiles/info/saved/info_saved_music_provider.cpp +++ b/Telegram/SourceFiles/info/saved/info_saved_music_provider.cpp @@ -67,10 +67,10 @@ Type MusicProvider::type() { } bool MusicProvider::hasSelectRestriction() { - if (_peer->session().frozen()) { - return true; - } - return !_peer->isSelf(); + //if (_peer->session().frozen()) { + // return true; + //} + return true; } rpl::producer MusicProvider::hasSelectRestrictionChanges() { @@ -295,21 +295,8 @@ ListItemSelectionData MusicProvider::computeSelectionData( not_null item, TextSelection selection) { auto result = ListItemSelectionData(selection); - AssertIsDebug(); - //const auto id = item->id; - //const auto peer = item->history()->peer; - //const auto channel = peer->asChannel(); - //const auto maybeStory = peer->owner().stories().lookup( - // { peer->id, StoryIdFromMsgId(id) }); - //if (maybeStory) { - // const auto story = *maybeStory; - // result.canForward = peer->isSelf() && story->canShare(); - // result.canDelete = story->canDelete(); - // result.canUnpinStory = story->pinnedToTop(); - // result.storyInProfile = story->inProfile(); - //} - //result.canToggleStoryPin = peer->isSelf() - // || (channel && channel->canEditStories()); + result.canDelete = item->history()->peer->isSelf(); + result.canForward = true;// item->allowsForward(); return result; } @@ -343,13 +330,13 @@ void MusicProvider::applyDragSelection( bool MusicProvider::allowSaveFileAs( not_null item, not_null document) { - return false; + return true; } QString MusicProvider::showInFolderPath( not_null item, not_null document) { - return QString(); + return document->filepath(true); } int64 MusicProvider::scrollTopStatePosition(not_null item) {