Mercurial > minori
comparison src/gui/pages/seasons.cc @ 325:78929794e7d8
pages/seasons: run seasons search in a separate thread
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Thu, 13 Jun 2024 00:36:41 -0400 |
parents | 2115488eb302 |
children | 10096c5489e3 |
comparison
equal
deleted
inserted
replaced
324:5d3c9b31aa6e | 325:78929794e7d8 |
---|---|
14 #include <QMenu> | 14 #include <QMenu> |
15 #include <QToolBar> | 15 #include <QToolBar> |
16 #include <QToolButton> | 16 #include <QToolButton> |
17 #include <QVBoxLayout> | 17 #include <QVBoxLayout> |
18 | 18 |
19 SeasonsPageSearchThread::SeasonsPageSearchThread(QObject* parent) : QThread(parent) { | |
20 } | |
21 | |
22 void SeasonsPageSearchThread::AddToQueue(Anime::SeriesSeason season, Date::Year year) { | |
23 queue_mutex_.lock(); | |
24 queue_.push({season, year}); | |
25 queue_mutex_.unlock(); | |
26 } | |
27 | |
28 void SeasonsPageSearchThread::run() { | |
29 queue_mutex_.lock(); | |
30 | |
31 while (!queue_.empty() && !isInterruptionRequested()) { | |
32 Season season = queue_.front(); | |
33 | |
34 /* unlock the mutex for a long blocking operation, so items | |
35 * can be added without worry */ | |
36 queue_mutex_.unlock(); | |
37 | |
38 if (Services::GetSeason(season.season, season.year)) | |
39 emit ReceivedSeason(season.season, season.year); | |
40 | |
41 queue_mutex_.lock(); | |
42 | |
43 queue_.pop(); | |
44 } | |
45 | |
46 queue_mutex_.unlock(); | |
47 } | |
48 | |
49 static SeasonsPageSearchThread search_thread_; | |
50 | |
51 /* ------------------------------------------------------------------------------------- */ | |
52 | |
19 static constexpr Date::Year GetClosestDecade(Date::Year year) { | 53 static constexpr Date::Year GetClosestDecade(Date::Year year) { |
20 return year - (year % 10); | 54 return year - (year % 10); |
21 } | 55 } |
22 | 56 |
23 void SeasonsPage::SetSeason(Anime::SeriesSeason season, Date::Year year) { | 57 void SeasonsPage::Refresh() { |
58 setUpdatesEnabled(false); | |
59 | |
24 if (!buttons || !season_button) | 60 if (!buttons || !season_button) |
25 return; | 61 return; |
26 | 62 |
27 buttons->clear(); | 63 buttons->clear(); |
28 | 64 |
29 for (const auto& id : Anime::Season::GetAllAnimeForSeason(season, year)) { | 65 for (const auto& id : Anime::Season::GetAllAnimeForSeason(season_, year_)) { |
30 QListWidgetItem* item = new QListWidgetItem; | 66 QListWidgetItem* item = new QListWidgetItem; |
31 AnimeButton* button = new AnimeButton(this); | 67 AnimeButton* button = new AnimeButton(this); |
32 button->SetAnime(Anime::db.items[id]); | 68 button->SetAnime(Anime::db.items[id]); |
33 item->setSizeHint(button->sizeHint()); | 69 item->setSizeHint(button->sizeHint()); |
34 buttons->addItem(item); | 70 buttons->addItem(item); |
35 buttons->setItemWidget(item, button); | 71 buttons->setItemWidget(item, button); |
36 } | 72 } |
37 | 73 |
38 season_button->setText(Strings::ToQString(Translate::ToLocalString(season)) + " " + QString::number(year)); | 74 season_button->setText(Strings::ToQString(Translate::ToLocalString(season_)) + " " + QString::number(year_)); |
75 | |
76 setUpdatesEnabled(true); | |
77 } | |
78 | |
79 void SeasonsPage::SetSeason(Anime::SeriesSeason season, Date::Year year) { | |
80 season_ = season; | |
81 year_ = year; | |
82 | |
83 Refresh(); | |
39 } | 84 } |
40 | 85 |
41 SeasonsPage::SeasonsPage(QWidget* parent) : QFrame(parent) { | 86 SeasonsPage::SeasonsPage(QWidget* parent) : QFrame(parent) { |
42 setBackgroundRole(QPalette::Base); | 87 setBackgroundRole(QPalette::Base); |
43 setFrameShape(QFrame::Box); | 88 setFrameShape(QFrame::Box); |
51 toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); | 96 toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); |
52 toolbar->setIconSize(QSize(16, 16)); | 97 toolbar->setIconSize(QSize(16, 16)); |
53 toolbar->setMovable(false); | 98 toolbar->setMovable(false); |
54 | 99 |
55 { | 100 { |
56 /* todo: clean this up... this sucks... */ | |
57 static constexpr Date::Year last_year = 1960; | 101 static constexpr Date::Year last_year = 1960; |
58 | 102 |
59 auto create_year_menu = [this](QWidget* parent, QMenu* parent_menu, Date::Year year){ | 103 auto create_year_menu = [this](QWidget* parent, QMenu* parent_menu, Date::Year year){ |
60 const QString year_s = QString::number(year); | 104 const QString year_s = QString::number(year); |
61 | 105 |
62 QMenu* menu = new QMenu(year_s, parent); | 106 QMenu* menu = new QMenu(year_s, parent); |
63 for (const auto& season : Anime::SeriesSeasons) { | 107 for (const auto& season : Anime::SeriesSeasons) { |
64 QAction* action = menu->addAction(Strings::ToQString(Translate::ToLocalString(season)) + " " + year_s); | 108 QAction* action = menu->addAction(Strings::ToQString(Translate::ToLocalString(season)) + " " + year_s); |
65 connect(action, &QAction::triggered, this, [this, season, year]{ | 109 connect(action, &QAction::triggered, this, [this, season, year] { |
66 SetSeason(season, year); | 110 SetSeason(season, year); |
67 }); | 111 }); |
68 } | 112 } |
69 parent_menu->addMenu(menu); | 113 parent_menu->addMenu(menu); |
70 }; | 114 }; |
98 | 142 |
99 toolbar->addSeparator(); | 143 toolbar->addSeparator(); |
100 | 144 |
101 { | 145 { |
102 toolbar->addAction(QIcon(":/icons/16x16/arrow-circle-315.png"), tr("Refresh data"), [this]{ | 146 toolbar->addAction(QIcon(":/icons/16x16/arrow-circle-315.png"), tr("Refresh data"), [this]{ |
103 Services::GetSeason(Anime::SeriesSeason::Summer, 2011U); | 147 search_thread_.AddToQueue(season_, year_); |
104 SetSeason(Anime::SeriesSeason::Summer, 2011U); | 148 if (!search_thread_.isRunning()) |
149 search_thread_.start(); | |
105 }); | 150 }); |
106 } | 151 } |
107 | 152 |
108 toolbar->addSeparator(); | 153 toolbar->addSeparator(); |
109 | 154 |
188 } | 233 } |
189 | 234 |
190 full_layout->setContentsMargins(0, 0, 0, 0); | 235 full_layout->setContentsMargins(0, 0, 0, 0); |
191 full_layout->setSpacing(0); | 236 full_layout->setSpacing(0); |
192 | 237 |
238 connect(&search_thread_, &SeasonsPageSearchThread::ReceivedSeason, this, [this](Anime::SeriesSeason season, Date::Year year) { | |
239 if (season == season_ && year == year_) | |
240 Refresh(); | |
241 }); | |
242 | |
193 /* Do NOT move this up in this function, buttons HAS to be initialized */ | 243 /* Do NOT move this up in this function, buttons HAS to be initialized */ |
194 SetSeason(Anime::SeriesSeason::Summer, 2011U); | 244 SetSeason(Anime::SeriesSeason::Summer, 2011U); |
195 } | 245 } |