comparison src/gui/pages/now_playing.cc @ 83:d02fdf1d6708

*: huuuge update 1. make the now playing page function correctly 2. de-constructorfy many of our custom widgets, allowing them to be changed on-the-fly from the Now Playing page 3. ... :)
author Paper <mrpapersonic@gmail.com>
date Tue, 24 Oct 2023 22:01:02 -0400
parents 8b65c417c225
children 2c27582a177c
comparison
equal deleted inserted replaced
82:8b65c417c225 83:d02fdf1d6708
1 #include "gui/pages/now_playing.h" 1 #include "gui/pages/now_playing.h"
2 #include "core/anime_db.h" 2 #include "core/anime_db.h"
3 #include "core/strings.h" 3 #include "core/strings.h"
4 #include "gui/widgets/anime_info.h" 4 #include "gui/widgets/anime_info.h"
5 #include "gui/widgets/text.h" 5 #include "gui/widgets/text.h"
6 #include "gui/widgets/poster.h"
6 #include <QLabel> 7 #include <QLabel>
7 #include <QStackedWidget> 8 #include <QStackedWidget>
9 #include <QHBoxLayout>
8 #include <QVBoxLayout> 10 #include <QVBoxLayout>
9 #include <QWidget> 11 #include <QWidget>
10 12
11 /* WARNING: HACKY STUFF HERE 13 /* WARNING: HACKY STUFF HERE
12 14
25 class Playing : public QWidget { 27 class Playing : public QWidget {
26 Q_OBJECT 28 Q_OBJECT
27 29
28 public: 30 public:
29 Playing(QWidget* parent = nullptr); 31 Playing(QWidget* parent = nullptr);
30 void SetPlayingAnime(int id, const std::unordered_map<std::string, std::string>& info); 32 void SetPlayingAnime(const Anime::Anime& anime, const std::unordered_map<std::string, std::string>& info);
31 int GetPlayingAnime(); 33 int GetPlayingAnime();
32 34
33 private: 35 private:
34 int _id = 0; 36 int _id = 0;
35 int _episode = 0; 37 int _episode = 0;
38 std::unique_ptr<QWidget> _main = nullptr;
36 std::unique_ptr<TextWidgets::Title> _title = nullptr; 39 std::unique_ptr<TextWidgets::Title> _title = nullptr;
37 std::unique_ptr<AnimeInfoWidget> _info = nullptr; 40 std::unique_ptr<AnimeInfoWidget> _info = nullptr;
41 std::unique_ptr<QWidget> _sidebar = nullptr;
42 std::unique_ptr<Poster> _poster = nullptr;
38 }; 43 };
39 44
40 Default::Default(QWidget* parent) : QWidget(parent) { 45 Default::Default(QWidget* parent) : QWidget(parent) {
41 QVBoxLayout* layout = new QVBoxLayout(this); 46 QVBoxLayout* layout = new QVBoxLayout(this);
42 layout->setContentsMargins(0, 0, 0, 0); 47 layout->setContentsMargins(0, 0, 0, 0);
48 } 53 }
49 54
50 Playing::Playing(QWidget* parent) : QWidget(parent) { 55 Playing::Playing(QWidget* parent) : QWidget(parent) {
51 QHBoxLayout* layout = new QHBoxLayout(this); 56 QHBoxLayout* layout = new QHBoxLayout(this);
52 57
53 _title.reset(new TextWidgets::Title("\n", this)); 58 _main.reset(new QWidget(this));
54 layout->addWidget(_title.get()); 59 _main->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
55 60
56 _info.reset(new AnimeInfoWidget(this)); 61 QVBoxLayout* main_layout = new QVBoxLayout(_main.get());
57 layout->addWidget(_info.get()); 62 main_layout->setContentsMargins(0, 0, 0, 0);
58 63
64 _title.reset(new TextWidgets::Title("", _main.get()));
65 main_layout->addWidget(_title.get());
66
67 _info.reset(new AnimeInfoWidget(_main.get()));
68 _info->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
69 main_layout->addWidget(_info.get());
70
71 /* "sidebar", includes... just the anime image :) */
72 _sidebar.reset(new QWidget(this));
73 QVBoxLayout* sidebar_layout = new QVBoxLayout(_sidebar.get());
74 sidebar_layout->setContentsMargins(0, 0, 0, 0);
75
76 _poster.reset(new Poster(_sidebar.get()));
77 sidebar_layout->addWidget(_poster.get());
78
79 sidebar_layout->addStretch();
80
81 layout->addWidget(_sidebar.get());
82 layout->addWidget(_main.get());
83 layout->setSpacing(10);
59 layout->setContentsMargins(0, 0, 0, 0); 84 layout->setContentsMargins(0, 0, 0, 0);
60 } 85 }
61 86
62 int Playing::GetPlayingAnime() { 87 int Playing::GetPlayingAnime() {
63 return _id; 88 return _id;
64 } 89 }
65 90
66 void Playing::SetPlayingAnime(int id, const std::unordered_map<std::string, std::string>& info) { 91 void Playing::SetPlayingAnime(const Anime::Anime& anime, const std::unordered_map<std::string, std::string>& info) {
67 if (id == _id || id <= 0) 92 if (_id == anime.GetId() && std::to_string(_episode) == info.at("episode"))
68 return; 93 return;
69 if (Anime::db.items.find(id) != Anime::db.items.end()) { 94 _id = anime.GetId();
70 const Anime::Anime& anime = Anime::db.items[_id = id]; 95 try {
71 _title->setText(Strings::ToQString(anime.GetUserPreferredTitle())); 96 _episode = std::stoi(info.at("episode"));
72 _info->SetAnime(anime); 97 } catch (std::invalid_argument) {
98 _episode = 0;
73 } 99 }
100 _title->SetText(Strings::ToQString(anime.GetUserPreferredTitle()));
101 _info->SetAnime(anime);
102 _poster->SetAnime(anime);
103
104 updateGeometry();
74 } 105 }
75 106
76 } // namespace NowPlayingPages 107 } // namespace NowPlayingPages
77 108
78 NowPlayingPage::NowPlayingPage(QWidget* parent) : QFrame(parent) { 109 NowPlayingPage::NowPlayingPage(QWidget* parent) : QFrame(parent) {
100 131
101 int NowPlayingPage::GetPlayingId() { 132 int NowPlayingPage::GetPlayingId() {
102 return reinterpret_cast<NowPlayingPages::Playing*>(stack->widget(1))->GetPlayingAnime(); 133 return reinterpret_cast<NowPlayingPages::Playing*>(stack->widget(1))->GetPlayingAnime();
103 } 134 }
104 135
105 void NowPlayingPage::SetPlaying(int id, const std::unordered_map<std::string, std::string>& info) { 136 void NowPlayingPage::SetPlaying(const Anime::Anime& anime, const std::unordered_map<std::string, std::string>& info) {
106 reinterpret_cast<NowPlayingPages::Playing*>(stack->widget(1))->SetPlayingAnime(id, info); 137 reinterpret_cast<NowPlayingPages::Playing*>(stack->widget(1))->SetPlayingAnime(anime, info);
107 stack->setCurrentIndex(1); 138 stack->setCurrentIndex(1);
139 updateGeometry();
108 } 140 }
109 141
110 #include "gui/pages/moc_now_playing.cpp" 142 #include "gui/pages/moc_now_playing.cpp"
111 #include "now_playing.moc" 143 #include "now_playing.moc"