diff --git a/wiliwili/include/view/grid_dropdown.hpp b/wiliwili/include/view/grid_dropdown.hpp index 69bd5c9f3..e91771af8 100644 --- a/wiliwili/include/view/grid_dropdown.hpp +++ b/wiliwili/include/view/grid_dropdown.hpp @@ -86,6 +86,31 @@ class TextDataSourceDropdown : public DataSourceDropdown { std::vector data; }; + +template +class CommonDataSourceDropdown : public DataSourceDropdown { +public: + typedef std::function CommonCellForRowCallback; + + CommonDataSourceDropdown(std::vector result, BaseDropdown* view, + CommonCellForRowCallback cb) + : DataSourceDropdown(view), data(std::move(result)), cellForRowFunc(cb) {} + + RecyclingGridItem* cellForRow(RecyclingGrid* recycler, size_t index) override { + if (cellForRowFunc) return cellForRowFunc(recycler, data[index]); + return nullptr; + } + + size_t getItemCount() override { return data.size(); } + + void clearData() override { data.clear(); } + +private: + std::vector data; + CommonCellForRowCallback cellForRowFunc = nullptr; +}; + + /** * 带有进入退出动画的菜单,自带列表,默认提供了文本列表,也可以自定义列表内容 */ diff --git a/wiliwili/source/activity/player_season_activity.cpp b/wiliwili/source/activity/player_season_activity.cpp index 3d8f30568..e6cecd39c 100644 --- a/wiliwili/source/activity/player_season_activity.cpp +++ b/wiliwili/source/activity/player_season_activity.cpp @@ -20,6 +20,7 @@ #include "view/video_card.hpp" #include "view/svg_image.hpp" #include "view/mpv_core.hpp" +#include "view/grid_dropdown.hpp" /// PlayerSeasonActivity @@ -277,15 +278,26 @@ void PlayerSeasonActivity::onSeasonVideoInfo(const bilibili::SeasonResultWrapper return container; }); - video->setSeasonAction([this](brls::View *view){ - std::vector values; - for (const auto& item : this->episodeList) { - values.push_back(fmt::format("{} {}", item.title, item.long_title)); - } - brls::Dropdown* dropdown = new brls::Dropdown( - "wiliwili/player/p"_i18n, values, [this](int selected) { - this->onIndexChange(selected); - }, episodeResult.index); + video->setSeasonAction([this](brls::View* view) { + auto* dropdown = new BaseDropdown( + "wiliwili/player/p"_i18n, [this](int selected) { this->onIndexChange(selected); }, episodeResult.index); + dropdown->getRecyclingList()->registerCell("Cell", []() { return PlayerTabCell::create(); }); + dropdown->getRecyclingList()->registerCell("Header", []() { return PlayerTabHeader::create(); }); + dropdown->setDataSource(new CommonDataSourceDropdown( + this->episodeList, dropdown, [dropdown](auto recycler, auto d) { + if (!d.id) { + // 显示项为标题 + auto* item = (PlayerTabHeader*)recycler->dequeueReusableCell("Header"); + item->title->setText(d.title); + return (RecyclingGridItem*)item; + } + // 显示分集项 + auto* item = (PlayerTabCell*)recycler->dequeueReusableCell("Cell"); + item->title->setText(d.title); + item->setSelected(dropdown->getSelected() == d.index); + item->setBadge(d.badge_info.text, d.badge_info.bg_color); + return (RecyclingGridItem*)item; + })); brls::Application::pushActivity(new brls::Activity(dropdown)); return true; });