Mercurial > minori
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 } |