comparison src/gui/window.cc @ 170:c8375765f0fc

window: make threading somewhat sane
author Paper <mrpapersonic@gmail.com>
date Tue, 21 Nov 2023 11:04:13 -0500
parents 79a2a24453fa
children f88eda79c60a
comparison
equal deleted inserted replaced
169:e44b7c428d7c 170:c8375765f0fc
40 # include "sys/osx/dark_theme.h" 40 # include "sys/osx/dark_theme.h"
41 #elif defined(WIN32) 41 #elif defined(WIN32)
42 # include "sys/win32/dark_theme.h" 42 # include "sys/win32/dark_theme.h"
43 #endif 43 #endif
44 44
45 Q_DECLARE_METATYPE(std::vector<std::string>);
46
47 class Thread : public QThread {
48 Q_OBJECT
49
50 public:
51 Thread(QObject* object = nullptr) : QThread(object) {}
52
53 private:
54 void run() override {
55 std::vector<std::string> files;
56 Track::Media::GetCurrentlyPlaying(files);
57 emit Done(files);
58 }
59
60 signals:
61 void Done(const std::vector<std::string>& files);
62 };
63
64 enum class Pages { 45 enum class Pages {
65 NOW_PLAYING, 46 NOW_PLAYING,
66 47
67 ANIME_LIST, 48 ANIME_LIST,
68 HISTORY, 49 HISTORY,
71 SEARCH, 52 SEARCH,
72 SEASONS, 53 SEASONS,
73 TORRENTS 54 TORRENTS
74 }; 55 };
75 56
57 void PlayingThread::run() {
58 std::vector<std::string> files;
59 Track::Media::GetCurrentlyPlaying(files);
60 emit Done(files);
61 }
62
76 MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { 63 MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) {
77 setWindowIcon(QIcon(":/favicon.png")); 64 setWindowIcon(QIcon(":/favicon.png"));
78 65
79 main_widget.reset(new QWidget(this)); 66 main_widget.reset(new QWidget(this));
80 /*QHBoxLayout* layout = */new QHBoxLayout(main_widget.get()); 67 /*QHBoxLayout* layout = */new QHBoxLayout(main_widget.get());
87 74
88 NowPlayingPage* page = reinterpret_cast<NowPlayingPage*>(stack->widget(static_cast<int>(Pages::NOW_PLAYING))); 75 NowPlayingPage* page = reinterpret_cast<NowPlayingPage*>(stack->widget(static_cast<int>(Pages::NOW_PLAYING)));
89 76
90 qRegisterMetaType<std::vector<std::string>>(); 77 qRegisterMetaType<std::vector<std::string>>();
91 78
79 thread.reset(new PlayingThread(this));
80
92 QTimer* timer = new QTimer; 81 QTimer* timer = new QTimer;
93 timer->start(5000);
94 82
95 connect(timer, &QTimer::timeout, this, [this, page] { 83 connect(timer, &QTimer::timeout, this, [this, page] {
96 Thread* thread = new Thread(this); 84 if (!thread.get() || thread->isRunning())
97 connect(thread, &QThread::finished, thread, &QThread::deleteLater); 85 return;
98 connect(thread, &Thread::Done, this, [page](const std::vector<std::string>& files) { 86 connect(thread.get(), &QThread::finished, thread.get(), &QThread::deleteLater);
87 connect(thread.get(), &PlayingThread::Done, this, [page](const std::vector<std::string>& files) {
99 for (const auto& file : files) { 88 for (const auto& file : files) {
100 anitomy::Anitomy anitomy; 89 anitomy::Anitomy anitomy;
101 anitomy.Parse(Strings::ToWstring(file)); 90 anitomy.Parse(Strings::ToWstring(file));
102 91
103 const auto& elements = anitomy.elements(); 92 const auto& elements = anitomy.elements();
110 break; 99 break;
111 } 100 }
112 }); 101 });
113 thread->start(); 102 thread->start();
114 }); 103 });
104
105 timer->start(5000);
106 timer->moveToThread(thread.get());
115 } 107 }
116 108
117 void MainWindow::AddMainWidgets() { 109 void MainWindow::AddMainWidgets() {
118 int page = static_cast<int>(Pages::ANIME_LIST); 110 int page = static_cast<int>(Pages::ANIME_LIST);
119 if (sidebar.get()) { 111 if (sidebar.get()) {
330 page_to_index_map[action] = 6; 322 page_to_index_map[action] = 6;
331 } 323 }
332 324
333 /* pain in my ass */ 325 /* pain in my ass */
334 connect(sidebar.get(), &SideBar::CurrentItemChanged, this, 326 connect(sidebar.get(), &SideBar::CurrentItemChanged, this,
335 [pages_group](int index) { pages_group->actions()[index]->setChecked(true); }); 327 [pages_group](int index) { pages_group->actions()[index]->setChecked(true); });
336 328
337 connect(pages_group, &QActionGroup::triggered, this, 329 connect(pages_group, &QActionGroup::triggered, this,
338 [this, page_to_index_map](QAction* action) { sidebar->SetCurrentItem(page_to_index_map.at(action)); }); 330 [this, page_to_index_map](QAction* action) { sidebar->SetCurrentItem(page_to_index_map.at(action)); });
339 } 331 }
340 332
341 menu->addSeparator(); 333 menu->addSeparator();
342 334
343 // { 335 // {
378 370
379 { 371 {
380 /* Toolbar */ 372 /* Toolbar */
381 QToolBar* toolbar = new QToolBar(this); 373 QToolBar* toolbar = new QToolBar(this);
382 toolbar->addAction(QIcon(":/icons/24x24/arrow-circle-double-135.png"), tr("&Synchronize"), 374 toolbar->addAction(QIcon(":/icons/24x24/arrow-circle-double-135.png"), tr("&Synchronize"),
383 [this] { AsyncSynchronize(stack.get()); }); 375 [this] { AsyncSynchronize(stack.get()); });
384 376
385 toolbar->addSeparator(); 377 toolbar->addSeparator();
386 378
387 { 379 {
388 QToolButton* button = new QToolButton(toolbar); 380 QToolButton* button = new QToolButton(toolbar);
484 session.config.Save(); 476 session.config.Save();
485 event->accept(); 477 event->accept();
486 } 478 }
487 479
488 #include "gui/moc_window.cpp" 480 #include "gui/moc_window.cpp"
489 #include "gui/window.moc"