comparison src/gui/pages/seasons.cc @ 370:ea3a74ed2ef9

*: hm, last commit wasn't quite finished?
author Paper <paper@tflc.us>
date Fri, 25 Jul 2025 10:22:04 -0400
parents f81bed4e04ac
children
comparison
equal deleted inserted replaced
369:47c9f8502269 370:ea3a74ed2ef9
1 #include "gui/pages/seasons.h" 1 #include "gui/pages/seasons.h"
2 2
3 #include "core/anime_db.h" 3 #include "core/anime_db.h"
4 #include "core/strings.h" 4 #include "core/strings.h"
5 #include "gui/translate/anime.h"
5 #include "gui/widgets/anime_button.h" 6 #include "gui/widgets/anime_button.h"
6 #include "gui/translate/anime.h"
7 #include "services/services.h" 7 #include "services/services.h"
8 8
9 #include <QDate> 9 #include <QDate>
10 #include <QFrame> 10 #include <QFrame>
11 #include <QListWidget> 11 #include <QListWidget>
15 #include <QToolButton> 15 #include <QToolButton>
16 #include <QVBoxLayout> 16 #include <QVBoxLayout>
17 17
18 #include <iostream> 18 #include <iostream>
19 19
20 SeasonsPageSearchThread::SeasonsPageSearchThread(QObject* parent) : QThread(parent) { 20 SeasonsPageSearchThread::SeasonsPageSearchThread(QObject *parent) : QThread(parent)
21 } 21 {
22 22 }
23 void SeasonsPageSearchThread::AddToQueue(Anime::Season season) { 23
24 void SeasonsPageSearchThread::AddToQueue(Anime::Season season)
25 {
24 queue_mutex_.lock(); 26 queue_mutex_.lock();
25 queue_.push(season); 27 queue_.push(season);
26 queue_mutex_.unlock(); 28 queue_mutex_.unlock();
27 } 29 }
28 30
29 void SeasonsPageSearchThread::run() { 31 void SeasonsPageSearchThread::run()
32 {
30 queue_mutex_.lock(); 33 queue_mutex_.lock();
31 34
32 while (!queue_.empty() && !isInterruptionRequested()) { 35 while (!queue_.empty() && !isInterruptionRequested()) {
33 Anime::Season season = queue_.front(); 36 Anime::Season season = queue_.front();
34 37
49 52
50 static SeasonsPageSearchThread search_thread_; 53 static SeasonsPageSearchThread search_thread_;
51 54
52 /* ------------------------------------------------------------------------------------- */ 55 /* ------------------------------------------------------------------------------------- */
53 56
54 static constexpr Date::Year GetClosestDecade(Date::Year year) { 57 static constexpr Date::Year GetClosestDecade(Date::Year year)
58 {
55 return year - (year % 10); 59 return year - (year % 10);
56 } 60 }
57 61
58 void SeasonsPage::Refresh() { 62 void SeasonsPage::Refresh()
63 {
59 setUpdatesEnabled(false); 64 setUpdatesEnabled(false);
60 65
61 if (!buttons) 66 if (!buttons)
62 return; 67 return;
63 68
64 buttons->clear(); 69 buttons->clear();
65 70
66 for (const auto& id : Anime::db.GetAllAnimeForSeason(season_)) { 71 for (const auto &id : Anime::db.GetAllAnimeForSeason(season_)) {
67 QListWidgetItem* item = new QListWidgetItem; 72 QListWidgetItem *item = new QListWidgetItem;
68 AnimeButton* button = new AnimeButton(this); 73 AnimeButton *button = new AnimeButton(this);
69 button->SetAnime(Anime::db.items[id]); 74 button->SetAnime(Anime::db.items[id]);
70 item->setSizeHint(QSize(500, 200)); 75 item->setSizeHint(QSize(500, 200));
71 buttons->addItem(item); 76 buttons->addItem(item);
72 buttons->setItemWidget(item, button); 77 buttons->setItemWidget(item, button);
73 } 78 }
75 season_button.setText(Strings::ToQString(Translate::ToLocalString(season_))); 80 season_button.setText(Strings::ToQString(Translate::ToLocalString(season_)));
76 81
77 setUpdatesEnabled(true); 82 setUpdatesEnabled(true);
78 } 83 }
79 84
80 void SeasonsPage::SetSeason(Anime::Season season) { 85 void SeasonsPage::SetSeason(Anime::Season season)
86 {
81 season_ = season; 87 season_ = season;
82 88
83 Refresh(); 89 Refresh();
84 } 90 }
85 91
86 SeasonsPage::SeasonsPage(QWidget* parent) : QFrame(parent) { 92 SeasonsPage::SeasonsPage(QWidget *parent) : QFrame(parent)
93 {
87 setBackgroundRole(QPalette::Base); 94 setBackgroundRole(QPalette::Base);
88 setFrameShape(QFrame::Box); 95 setFrameShape(QFrame::Box);
89 setFrameShadow(QFrame::Sunken); 96 setFrameShadow(QFrame::Sunken);
90 97
91 QVBoxLayout* full_layout = new QVBoxLayout(this); 98 QVBoxLayout *full_layout = new QVBoxLayout(this);
92 99
93 { 100 {
94 /* Toolbar */ 101 /* Toolbar */
95 QToolBar* toolbar = new QToolBar(this); 102 QToolBar *toolbar = new QToolBar(this);
96 toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); 103 toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
97 toolbar->setIconSize(QSize(16, 16)); 104 toolbar->setIconSize(QSize(16, 16));
98 toolbar->setMovable(false); 105 toolbar->setMovable(false);
99 106
100 { 107 {
102 static const Anime::Season last_season(Anime::Season::Name::Winter, 1960); 109 static const Anime::Season last_season(Anime::Season::Name::Winter, 1960);
103 Anime::Season current_season((Date(QDate::currentDate()))); 110 Anime::Season current_season((Date(QDate::currentDate())));
104 const Date::Year year_before_collapse = GetClosestDecade(current_season.year) - 10; 111 const Date::Year year_before_collapse = GetClosestDecade(current_season.year) - 10;
105 112
106 /* year -> menu for that year */ 113 /* year -> menu for that year */
107 std::map<Date::Year, QMenu*> menu_map; 114 std::map<Date::Year, QMenu *> menu_map;
108 115
109 auto create_season_menu = [&](QWidget* parent, Anime::Season season){ 116 auto create_season_menu = [&](QWidget *parent, Anime::Season season) {
110 QMenu*& menu = menu_map[season.year]; 117 QMenu *&menu = menu_map[season.year];
111 if (!menu) 118 if (!menu)
112 menu = new QMenu(QString::number(season.year), parent); 119 menu = new QMenu(QString::number(season.year), parent);
113 120
114 QAction* action = menu->addAction(Strings::ToQString(Translate::ToLocalString(season))); 121 QAction *action = menu->addAction(Strings::ToQString(Translate::ToLocalString(season)));
115 connect(action, &QAction::triggered, this, [this, season] { 122 connect(action, &QAction::triggered, this, [this, season] { SetSeason(season); });
116 SetSeason(season);
117 });
118 }; 123 };
119 124
120 for (Anime::Season s = current_season; s >= last_season; --s) 125 for (Anime::Season s = current_season; s >= last_season; --s)
121 create_season_menu(&season_button, s); 126 create_season_menu(&season_button, s);
122 127
123 /* ------------------------------------------------------- */ 128 /* ------------------------------------------------------- */
124 /* now actually generate the full menu */ 129 /* now actually generate the full menu */
125 130
126 QMenu* full_menu = new QMenu(&season_button); 131 QMenu *full_menu = new QMenu(&season_button);
127 132
128 for (Date::Year c = current_season.year; c >= year_before_collapse; c--) 133 for (Date::Year c = current_season.year; c >= year_before_collapse; c--)
129 full_menu->addMenu(menu_map[c]); 134 full_menu->addMenu(menu_map[c]);
130 135
131 full_menu->addSeparator(); 136 full_menu->addSeparator();
132 137
133 /* collapse each menu into a decade */ 138 /* collapse each menu into a decade */
134 for (Date::Year c = year_before_collapse - 10; c >= last_season.year; c -= 10) { 139 for (Date::Year c = year_before_collapse - 10; c >= last_season.year; c -= 10) {
135 QMenu* decade_menu = new QMenu(tr("%1s").arg(QString::number(c)), parent); 140 QMenu *decade_menu = new QMenu(tr("%1s").arg(QString::number(c)), parent);
136 for (Date::Year i = c + 9; i >= c; i--) 141 for (Date::Year i = c + 9; i >= c; i--)
137 decade_menu->addMenu(menu_map[i]); 142 decade_menu->addMenu(menu_map[i]);
138 full_menu->addMenu(decade_menu); 143 full_menu->addMenu(decade_menu);
139 } 144 }
140 145
145 } 150 }
146 151
147 toolbar->addSeparator(); 152 toolbar->addSeparator();
148 153
149 { 154 {
150 toolbar->addAction(QIcon(":/icons/16x16/arrow-circle-315.png"), tr("Refresh data"), [this]{ 155 toolbar->addAction(QIcon(":/icons/16x16/arrow-circle-315.png"), tr("Refresh data"), [this] {
151 search_thread_.AddToQueue(season_); 156 search_thread_.AddToQueue(season_);
152 if (!search_thread_.isRunning()) 157 if (!search_thread_.isRunning())
153 search_thread_.start(); 158 search_thread_.start();
154 }); 159 });
155 } 160 }
156 161
157 toolbar->addSeparator(); 162 toolbar->addSeparator();
158 163
159 { 164 {
160 QToolButton* button = new QToolButton(toolbar); 165 QToolButton *button = new QToolButton(toolbar);
161 166
162 { 167 {
163 /* links */ 168 /* links */
164 QMenu* menu = new QMenu(button); 169 QMenu *menu = new QMenu(button);
165 menu->addAction(tr("Airing status")); 170 menu->addAction(tr("Airing status"));
166 menu->addAction(tr("List status")); 171 menu->addAction(tr("List status"));
167 menu->addAction(tr("Type")); 172 menu->addAction(tr("Type"));
168 button->setMenu(menu); 173 button->setMenu(menu);
169 } 174 }
174 button->setPopupMode(QToolButton::InstantPopup); 179 button->setPopupMode(QToolButton::InstantPopup);
175 toolbar->addWidget(button); 180 toolbar->addWidget(button);
176 } 181 }
177 182
178 { 183 {
179 QToolButton* button = new QToolButton(toolbar); 184 QToolButton *button = new QToolButton(toolbar);
180 185
181 { 186 {
182 /* links */ 187 /* links */
183 QMenu* menu = new QMenu(button); 188 QMenu *menu = new QMenu(button);
184 menu->addAction(tr("Airing date")); 189 menu->addAction(tr("Airing date"));
185 menu->addAction(tr("Episodes")); 190 menu->addAction(tr("Episodes"));
186 menu->addAction(tr("Popularity")); 191 menu->addAction(tr("Popularity"));
187 menu->addAction(tr("Score")); 192 menu->addAction(tr("Score"));
188 menu->addAction(tr("Title")); 193 menu->addAction(tr("Title"));
195 button->setPopupMode(QToolButton::InstantPopup); 200 button->setPopupMode(QToolButton::InstantPopup);
196 toolbar->addWidget(button); 201 toolbar->addWidget(button);
197 } 202 }
198 203
199 { 204 {
200 QToolButton* button = new QToolButton(toolbar); 205 QToolButton *button = new QToolButton(toolbar);
201 206
202 { 207 {
203 /* links */ 208 /* links */
204 QMenu* menu = new QMenu(button); 209 QMenu *menu = new QMenu(button);
205 menu->addAction(tr("Images")); 210 menu->addAction(tr("Images"));
206 menu->addAction(tr("Details")); 211 menu->addAction(tr("Details"));
207 button->setMenu(menu); 212 button->setMenu(menu);
208 } 213 }
209 214
216 221
217 full_layout->addWidget(toolbar); 222 full_layout->addWidget(toolbar);
218 } 223 }
219 224
220 { 225 {
221 QFrame* line = new QFrame(this); 226 QFrame *line = new QFrame(this);
222 line->setFrameShape(QFrame::HLine); 227 line->setFrameShape(QFrame::HLine);
223 line->setFrameShadow(QFrame::Sunken); 228 line->setFrameShadow(QFrame::Sunken);
224 line->setLineWidth(1); 229 line->setLineWidth(1);
225 full_layout->addWidget(line); 230 full_layout->addWidget(line);
226 } 231 }