From 571ab422bf2f390304ea6741e35ed584201fcc1b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 14 Oct 2025 18:02:57 +0300 Subject: [PATCH] Moved out music button from cover to inner widget for profile. --- .../info/profile/info_profile_actions.cpp | 2 +- .../profile/info_profile_inner_widget.cpp | 70 +++++++++++++++++++ .../info/profile/info_profile_inner_widget.h | 3 + .../info/profile/info_profile_top_bar.cpp | 4 ++ .../info/profile/info_profile_top_bar.h | 2 + 5 files changed, 80 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index ce5d7f6720..24e0437776 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -2102,7 +2102,7 @@ void DetailsFiller::setupAboutVerification() { delete inner->widgetAt(0); } if (!info) { - Ui::AddDivider(inner); + // Ui::AddDivider(inner); } else if (!info->description.empty()) { Ui::AddDividerText(inner, rpl::single(info->description)); } diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index d1cd6cae7e..c28378f00a 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -8,15 +8,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/profile/info_profile_inner_widget.h" #include "info/info_controller.h" +#include "info/info_memento.h" #include "info/profile/info_profile_widget.h" #include "info/profile/info_profile_cover.h" #include "info/profile/info_profile_icon.h" #include "info/profile/info_profile_members.h" +#include "info/profile/info_profile_music_button.h" #include "info/profile/info_profile_top_bar.h" #include "info/profile/info_profile_actions.h" #include "info/media/info_media_buttons.h" +#include "info/saved/info_saved_music_widget.h" #include "data/data_changes.h" #include "data/data_channel.h" +#include "data/data_document.h" #include "data/data_forum_topic.h" #include "data/data_peer.h" #include "data/data_photo.h" @@ -36,12 +40,29 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/fade_wrap.h" #include "ui/wrap/vertical_layout.h" #include "ui/wrap/slide_wrap.h" +#include "ui/vertical_list.h" #include "ui/ui_utility.h" #include "styles/style_info.h" namespace Info { namespace Profile { +[[nodiscard]] MusicButtonData DocumentMusicButtonData( + not_null document) { + if (const auto song = document->song()) { + if (!song->performer.isEmpty() || !song->title.isEmpty()) { + return { + .performer = song->performer, + .title = song->title, + }; + } + } + const auto name = document->filename(); + return { + .title = !name.isEmpty() ? name : tr::lng_all_music(tr::now), + }; +} + InnerWidget::InnerWidget( QWidget *parent, not_null controller, @@ -82,6 +103,7 @@ object_ptr InnerWidget::setupContent( auto result = object_ptr(parent); _cover = AddCover(result, _controller, _peer, _topic, _sublist); + setupSavedMusicOrDivider(result); if (_topic && _topic->creating()) { return result; } @@ -143,6 +165,53 @@ void InnerWidget::setupMembers(not_null container) { anim::type::instant); } +void InnerWidget::setupSavedMusicOrDivider( + not_null container) { + auto musicValue = Data::SavedMusic::Supported(_peer->id) + ? Data::SavedMusicList( + _peer, + nullptr, + 1 + ) | rpl::map([=](const Data::SavedMusicSlice &data) { + return data.size() ? data[0].get() : nullptr; + }) + : rpl::single((HistoryItem*)(nullptr)); + + const auto divider = container->add( + object_ptr>( + container, + object_ptr(container))); + + rpl::combine( + std::move(musicValue), + _topBarColor.value() + ) | rpl::start_with_next([=]( + HistoryItem *item, + std::optional color) { + while (divider->entity()->count()) { + delete divider->entity()->widgetAt(0); + } + if (item) { + if (const auto document = item->media() + ? item->media()->document() + : nullptr) { + divider->entity()->add(object_ptr( + divider->entity(), + DocumentMusicButtonData(document), + [window = _controller, peer = _peer] { + window->showSection(Info::Saved::MakeMusic(peer)); + })); + } + divider->toggle(true, anim::type::normal); + } else if (!color) { + Ui::AddDivider(divider->entity()); + Ui::AddSkip(divider->entity()); + divider->toggle(true, anim::type::normal); + } + }, lifetime()); + divider->finishAnimating(); +} + object_ptr InnerWidget::setupSharedMedia( not_null parent) { using namespace rpl::mappers; @@ -352,6 +421,7 @@ base::weak_qptr InnerWidget::createPinnedToTop( .showFinished = _showFinished.events(), }); content->setOnlineCount(_onlineCount.events()); + _topBarColor = content->edgeColor(); return base::make_weak(not_null{ content }); } diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h index 4b713a1e55..0e010cd34a 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.h @@ -74,6 +74,7 @@ private: Origin origin); object_ptr setupSharedMedia(not_null parent); void setupMembers(not_null container); + void setupSavedMusicOrDivider(not_null container); int countDesiredHeight() const; void updateDesiredHeight() { @@ -90,6 +91,8 @@ private: std::shared_ptr _nonPersonalView; + rpl::variable> _topBarColor; + Members *_members = nullptr; Cover *_cover = nullptr; Ui::SlideWrap *_sharedMediaWrap = nullptr; diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp index 6219b2f341..eb14f7c97e 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.cpp @@ -1647,4 +1647,8 @@ void TopBar::paintStoryOutline(QPainter &p) { Ui::PaintOutlineSegments(p, outlineRect, _storySegments); } +rpl::producer> TopBar::edgeColor() const { + return _edgeColor.value(); +} + } // namespace Info::Profile diff --git a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h index 3076e65952..98262ade9a 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_top_bar.h +++ b/Telegram/SourceFiles/info/profile/info_profile_top_bar.h @@ -103,6 +103,8 @@ public: Wrap wrap, bool shouldUseColored); + rpl::producer> edgeColor() const; + protected: void resizeEvent(QResizeEvent *e) override; void paintEvent(QPaintEvent *e) override;