Mercurial > minori
comparison src/gui/window.cc @ 168:79a2a24453fa
window: improve performance when getting running files
now we don't block the whole app! :)
this is especially noticeable on X11, where window walking takes ABSURDLY long
author | paper@DavesDouble.local |
---|---|
date | Sun, 19 Nov 2023 05:36:41 -0500 |
parents | d43d68408d3c |
children | c8375765f0fc |
comparison
equal
deleted
inserted
replaced
167:31735c8592bc | 168:79a2a24453fa |
---|---|
28 #include <QMenuBar> | 28 #include <QMenuBar> |
29 #include <QMessageBox> | 29 #include <QMessageBox> |
30 #include <QPlainTextEdit> | 30 #include <QPlainTextEdit> |
31 #include <QStackedWidget> | 31 #include <QStackedWidget> |
32 #include <QTextStream> | 32 #include <QTextStream> |
33 #include <QThread> | |
33 #include <QThreadPool> | 34 #include <QThreadPool> |
34 #include <QTimer> | 35 #include <QTimer> |
35 #include <QToolBar> | 36 #include <QToolBar> |
36 #include <QToolButton> | 37 #include <QToolButton> |
37 | 38 |
39 # include "sys/osx/dark_theme.h" | 40 # include "sys/osx/dark_theme.h" |
40 #elif defined(WIN32) | 41 #elif defined(WIN32) |
41 # include "sys/win32/dark_theme.h" | 42 # include "sys/win32/dark_theme.h" |
42 #endif | 43 #endif |
43 | 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 | |
44 enum class Pages { | 64 enum class Pages { |
45 NOW_PLAYING, | 65 NOW_PLAYING, |
46 | 66 |
47 ANIME_LIST, | 67 ANIME_LIST, |
48 HISTORY, | 68 HISTORY, |
63 | 83 |
64 setCentralWidget(main_widget.get()); | 84 setCentralWidget(main_widget.get()); |
65 | 85 |
66 CreateBars(); | 86 CreateBars(); |
67 | 87 |
68 QTimer* timer = new QTimer(this); | 88 NowPlayingPage* page = reinterpret_cast<NowPlayingPage*>(stack->widget(static_cast<int>(Pages::NOW_PLAYING))); |
69 | 89 |
70 /* this is very very stinky */ | 90 qRegisterMetaType<std::vector<std::string>>(); |
71 connect(timer, &QTimer::timeout, this, [this] { | 91 |
72 bool success = false; | 92 QTimer* timer = new QTimer; |
73 | 93 timer->start(5000); |
74 NowPlayingPage* page = reinterpret_cast<NowPlayingPage*>(stack->widget(static_cast<int>(Pages::NOW_PLAYING))); | 94 |
75 | 95 connect(timer, &QTimer::timeout, this, [this, page] { |
76 std::vector<std::string> files; | 96 Thread* thread = new Thread(this); |
77 Track::Media::GetCurrentlyPlaying(files); | 97 connect(thread, &QThread::finished, thread, &QThread::deleteLater); |
78 | 98 connect(thread, &Thread::Done, this, [page](const std::vector<std::string>& files) { |
79 /* this should really be more intertwined with anitomy */ | 99 for (const auto& file : files) { |
80 for (const auto& file : files) { | 100 anitomy::Anitomy anitomy; |
81 anitomy::Anitomy anitomy; | 101 anitomy.Parse(Strings::ToWstring(file)); |
82 anitomy.Parse(Strings::ToWstring(file)); | 102 |
83 | 103 const auto& elements = anitomy.elements(); |
84 const auto& elements = anitomy.elements(); | 104 |
85 | 105 int id = Anime::db.GetAnimeFromTitle(Strings::ToUtf8String(elements.get(anitomy::kElementAnimeTitle))); |
86 int id = Anime::db.GetAnimeFromTitle(Strings::ToUtf8String(elements.get(anitomy::kElementAnimeTitle))); | 106 if (id <= 0) |
87 if (id <= 0) | 107 continue; |
88 continue; | 108 |
89 | 109 page->SetPlaying(Anime::db.items[id], elements); |
90 qDebug() << id; | 110 break; |
91 | 111 } |
92 page->SetPlaying(Anime::db.items[id], elements); | 112 }); |
93 | 113 thread->start(); |
94 success = true; | |
95 } | |
96 | |
97 if (!success) | |
98 page->SetDefault(); | |
99 }); | 114 }); |
100 timer->start(5000); | |
101 } | 115 } |
102 | 116 |
103 void MainWindow::AddMainWidgets() { | 117 void MainWindow::AddMainWidgets() { |
104 int page = static_cast<int>(Pages::ANIME_LIST); | 118 int page = static_cast<int>(Pages::ANIME_LIST); |
105 if (sidebar.get()) { | 119 if (sidebar.get()) { |
470 session.config.Save(); | 484 session.config.Save(); |
471 event->accept(); | 485 event->accept(); |
472 } | 486 } |
473 | 487 |
474 #include "gui/moc_window.cpp" | 488 #include "gui/moc_window.cpp" |
489 #include "gui/window.moc" |