Mercurial > minori
comparison src/gui/window.cc @ 112:80f49f623d30
locale: allow switching locales without restarting
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Mon, 06 Nov 2023 13:41:30 -0500 |
| parents | 2004b41d4a59 |
| children | 32afe0e940bf |
comparison
equal
deleted
inserted
replaced
| 111:fcae8bece0ec | 112:80f49f623d30 |
|---|---|
| 29 #include <QTextStream> | 29 #include <QTextStream> |
| 30 #include <QThreadPool> | 30 #include <QThreadPool> |
| 31 #include <QTimer> | 31 #include <QTimer> |
| 32 #include <QToolBar> | 32 #include <QToolBar> |
| 33 #include <QToolButton> | 33 #include <QToolButton> |
| 34 #include <iostream> | |
| 34 #ifdef MACOSX | 35 #ifdef MACOSX |
| 35 # include "sys/osx/dark_theme.h" | 36 # include "sys/osx/dark_theme.h" |
| 36 #elif defined(WIN32) | 37 #elif defined(WIN32) |
| 37 # include "sys/win32/dark_theme.h" | 38 # include "sys/win32/dark_theme.h" |
| 38 #endif | 39 #endif |
| 47 SEARCH, | 48 SEARCH, |
| 48 SEASONS, | 49 SEASONS, |
| 49 TORRENTS | 50 TORRENTS |
| 50 }; | 51 }; |
| 51 | 52 |
| 52 static void AsyncSynchronize(QStackedWidget* stack) { | |
| 53 QThreadPool::globalInstance()->start([stack] { | |
| 54 Services::Synchronize(); | |
| 55 reinterpret_cast<AnimeListPage*>(stack->widget(static_cast<int>(Pages::ANIME_LIST)))->Refresh(); | |
| 56 }); | |
| 57 } | |
| 58 | |
| 59 MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { | 53 MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { |
| 60 setWindowIcon(QIcon(":/favicon.png")); | 54 setWindowIcon(QIcon(":/favicon.png")); |
| 61 | 55 |
| 62 main_widget = new QWidget(parent); | 56 main_widget = new QWidget(this); |
| 57 /*QHBoxLayout* layout = */new QHBoxLayout(main_widget); | |
| 58 | |
| 59 AddMainWidgets(); | |
| 60 | |
| 61 setCentralWidget(main_widget); | |
| 62 | |
| 63 CreateBars(); | |
| 64 | |
| 65 QTimer* timer = new QTimer(this); | |
| 66 connect(timer, &QTimer::timeout, this, [this] { | |
| 67 NowPlayingPage* page = reinterpret_cast<NowPlayingPage*>(stack->widget(static_cast<int>(Pages::NOW_PLAYING))); | |
| 68 | |
| 69 Filesystem::Path p = Track::Media::GetCurrentPlaying(); | |
| 70 std::unordered_map<std::string, std::string> elements = Track::Media::GetFileElements(p); | |
| 71 int id = Anime::db.GetAnimeFromTitle(elements["title"]); | |
| 72 if (id <= 0) { | |
| 73 page->SetDefault(); | |
| 74 return; | |
| 75 } | |
| 76 | |
| 77 page->SetPlaying(Anime::db.items[id], elements); | |
| 78 }); | |
| 79 timer->start(5000); | |
| 80 } | |
| 81 | |
| 82 void MainWindow::AddMainWidgets() { | |
| 83 int page = static_cast<int>(Pages::ANIME_LIST); | |
| 84 if (sidebar) { | |
| 85 main_widget->layout()->removeWidget(sidebar); | |
| 86 delete sidebar; | |
| 87 } | |
| 88 | |
| 89 if (stack) { | |
| 90 page = stack->currentIndex(); | |
| 91 main_widget->layout()->removeWidget(stack); | |
| 92 delete stack; | |
| 93 } | |
| 63 | 94 |
| 64 sidebar = new SideBar(main_widget); | 95 sidebar = new SideBar(main_widget); |
| 96 sidebar->setFixedWidth(128); | |
| 97 sidebar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); | |
| 98 | |
| 65 sidebar->AddItem(tr("Now Playing"), SideBar::CreateIcon(":/icons/16x16/film.png")); | 99 sidebar->AddItem(tr("Now Playing"), SideBar::CreateIcon(":/icons/16x16/film.png")); |
| 66 sidebar->AddSeparator(); | 100 sidebar->AddSeparator(); |
| 67 sidebar->AddItem(tr("Anime List"), SideBar::CreateIcon(":/icons/16x16/document-list.png")); | 101 sidebar->AddItem(tr("Anime List"), SideBar::CreateIcon(":/icons/16x16/document-list.png")); |
| 68 sidebar->AddItem(tr("History"), SideBar::CreateIcon(":/icons/16x16/clock-history-frame.png")); | 102 sidebar->AddItem(tr("History"), SideBar::CreateIcon(":/icons/16x16/clock-history-frame.png")); |
| 69 sidebar->AddItem(tr("Statistics"), SideBar::CreateIcon(":/icons/16x16/chart.png")); | 103 sidebar->AddItem(tr("Statistics"), SideBar::CreateIcon(":/icons/16x16/chart.png")); |
| 70 sidebar->AddSeparator(); | 104 sidebar->AddSeparator(); |
| 71 sidebar->AddItem(tr("Search"), SideBar::CreateIcon(":/icons/16x16/magnifier.png")); | 105 sidebar->AddItem(tr("Search"), SideBar::CreateIcon(":/icons/16x16/magnifier.png")); |
| 72 sidebar->AddItem(tr("Seasons"), SideBar::CreateIcon(":/icons/16x16/calendar.png")); | 106 sidebar->AddItem(tr("Seasons"), SideBar::CreateIcon(":/icons/16x16/calendar.png")); |
| 73 sidebar->AddItem(tr("Torrents"), SideBar::CreateIcon(":/icons/16x16/feed.png")); | 107 sidebar->AddItem(tr("Torrents"), SideBar::CreateIcon(":/icons/16x16/feed.png")); |
| 74 sidebar->setFixedWidth(128); | |
| 75 sidebar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); | |
| 76 | 108 |
| 77 stack = new QStackedWidget(main_widget); | 109 stack = new QStackedWidget(main_widget); |
| 78 stack->addWidget(new NowPlayingPage(main_widget)); | 110 stack->addWidget(new NowPlayingPage(main_widget)); |
| 79 stack->addWidget(new AnimeListPage(main_widget)); | 111 stack->addWidget(new AnimeListPage(main_widget)); |
| 80 stack->addWidget(new HistoryPage(main_widget)); | 112 stack->addWidget(new HistoryPage(main_widget)); |
| 81 stack->addWidget(new StatisticsPage(main_widget)); | 113 stack->addWidget(new StatisticsPage(main_widget)); |
| 82 stack->addWidget(new SearchPage(main_widget)); | 114 stack->addWidget(new SearchPage(main_widget)); |
| 83 stack->addWidget(new SeasonsPage(main_widget)); | 115 stack->addWidget(new SeasonsPage(main_widget)); |
| 84 stack->addWidget(new TorrentsPage(main_widget)); | 116 stack->addWidget(new TorrentsPage(main_widget)); |
| 85 | 117 |
| 118 connect(sidebar, &SideBar::CurrentItemChanged, this, [](int index){ | |
| 119 std::cout << index << std::endl; | |
| 120 }); | |
| 121 | |
| 86 connect(sidebar, &SideBar::CurrentItemChanged, stack, &QStackedWidget::setCurrentIndex); | 122 connect(sidebar, &SideBar::CurrentItemChanged, stack, &QStackedWidget::setCurrentIndex); |
| 87 sidebar->SetCurrentItem(static_cast<int>(Pages::ANIME_LIST)); | 123 sidebar->SetCurrentItem(page); |
| 88 | 124 |
| 89 QHBoxLayout* layout = new QHBoxLayout(main_widget); | 125 main_widget->layout()->addWidget(sidebar); |
| 90 layout->addWidget(sidebar); | 126 main_widget->layout()->addWidget(stack); |
| 91 layout->addWidget(stack); | |
| 92 setCentralWidget(main_widget); | |
| 93 | |
| 94 CreateBars(); | |
| 95 | |
| 96 QTimer* timer = new QTimer(this); | |
| 97 connect(timer, &QTimer::timeout, this, [this] { | |
| 98 NowPlayingPage* page = reinterpret_cast<NowPlayingPage*>(stack->widget(static_cast<int>(Pages::NOW_PLAYING))); | |
| 99 | |
| 100 Filesystem::Path p = Track::Media::GetCurrentPlaying(); | |
| 101 std::unordered_map<std::string, std::string> elements = Track::Media::GetFileElements(p); | |
| 102 int id = Anime::db.GetAnimeFromTitle(elements["title"]); | |
| 103 if (id <= 0) { | |
| 104 page->SetDefault(); | |
| 105 return; | |
| 106 } | |
| 107 | |
| 108 page->SetPlaying(Anime::db.items[id], elements); | |
| 109 }); | |
| 110 timer->start(5000); | |
| 111 } | 127 } |
| 112 | 128 |
| 113 void MainWindow::CreateBars() { | 129 void MainWindow::CreateBars() { |
| 114 /* Menu Bar */ | 130 /* Menu Bar */ |
| 115 QAction* action; | 131 QAction* action; |
| 225 dialog.exec(); | 241 dialog.exec(); |
| 226 }); | 242 }); |
| 227 action = menu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); | 243 action = menu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); |
| 228 action->setMenuRole(QAction::AboutQtRole); | 244 action->setMenuRole(QAction::AboutQtRole); |
| 229 | 245 |
| 246 /* QMainWindow will delete the old one for us, | |
| 247 according to the docs */ | |
| 230 setMenuBar(menubar); | 248 setMenuBar(menubar); |
| 231 | 249 |
| 232 /* Toolbar */ | 250 /* Toolbar */ |
| 233 /* remove old toolbar(s) */ | 251 /* remove old toolbar(s) */ |
| 234 QList<QToolBar*> toolbars = findChildren<QToolBar*>(); | 252 QList<QToolBar*> toolbars = findChildren<QToolBar*>(); |
| 235 for (auto& t : toolbars) | 253 for (auto& t : toolbars) { |
| 236 removeToolBar(t); | 254 removeToolBar(t); |
| 255 delete t; | |
| 256 } | |
| 237 | 257 |
| 238 QToolBar* toolbar = new QToolBar(this); | 258 QToolBar* toolbar = new QToolBar(this); |
| 239 toolbar->addAction(QIcon(":/icons/24x24/arrow-circle-double-135.png"), tr("&Synchronize"), | 259 toolbar->addAction(QIcon(":/icons/24x24/arrow-circle-double-135.png"), tr("&Synchronize"), |
| 240 [this] { AsyncSynchronize(stack); }); | 260 [this] { AsyncSynchronize(stack); }); |
| 241 toolbar->addSeparator(); | 261 toolbar->addSeparator(); |
| 270 | 290 |
| 271 void MainWindow::SetActivePage(QWidget* page) { | 291 void MainWindow::SetActivePage(QWidget* page) { |
| 272 this->setCentralWidget(page); | 292 this->setCentralWidget(page); |
| 273 } | 293 } |
| 274 | 294 |
| 295 void MainWindow::AsyncSynchronize(QStackedWidget* stack) { | |
| 296 if (session.config.service == Anime::Services::NONE) { | |
| 297 QMessageBox msg; | |
| 298 msg.setWindowTitle(tr("Error synchronizing with service!")); | |
| 299 msg.setText(tr("It seems you haven't yet selected a service to use.")); | |
| 300 msg.setInformativeText(tr("Would you like to select one now?")); | |
| 301 msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No); | |
| 302 msg.setDefaultButton(QMessageBox::Yes); | |
| 303 int ret = msg.exec(); | |
| 304 if (ret == QMessageBox::Yes) { | |
| 305 SettingsDialog dialog; | |
| 306 dialog.exec(); | |
| 307 } | |
| 308 } | |
| 309 QThreadPool::globalInstance()->start([stack] { | |
| 310 Services::Synchronize(); | |
| 311 reinterpret_cast<AnimeListPage*>(stack->widget(static_cast<int>(Pages::ANIME_LIST)))->Refresh(); | |
| 312 }); | |
| 313 } | |
| 314 | |
| 315 void MainWindow::RetranslateUI() { | |
| 316 /* Temporarily disable UI updates so we don't flash the screen */ | |
| 317 setUpdatesEnabled(false); | |
| 318 AddMainWidgets(); | |
| 319 CreateBars(); | |
| 320 setUpdatesEnabled(true); | |
| 321 } | |
| 322 | |
| 323 void MainWindow::changeEvent(QEvent* event) { | |
| 324 if (event) { /* is this really necessary */ | |
| 325 switch (event->type()) { | |
| 326 // this event is send if a translator is loaded | |
| 327 case QEvent::LanguageChange: | |
| 328 RetranslateUI(); | |
| 329 break; | |
| 330 | |
| 331 default: | |
| 332 break; | |
| 333 } | |
| 334 } | |
| 335 QMainWindow::changeEvent(event); | |
| 336 } | |
| 337 | |
| 275 void MainWindow::showEvent(QShowEvent* event) { | 338 void MainWindow::showEvent(QShowEvent* event) { |
| 276 QMainWindow::showEvent(event); | 339 QMainWindow::showEvent(event); |
| 277 #ifdef WIN32 | 340 #ifdef WIN32 |
| 341 /* Technically this *should* be | |
| 342 session.config.theme.IsInDarkTheme() && win32::IsInDarkTheme() | |
| 343 but I prefer the title bar being black even when light mode | |
| 344 is enabled :/ */ | |
| 278 win32::SetTitleBarsToBlack(session.config.theme.IsInDarkTheme()); | 345 win32::SetTitleBarsToBlack(session.config.theme.IsInDarkTheme()); |
| 279 #endif | 346 #endif |
| 280 } | 347 } |
| 281 | 348 |
| 282 void MainWindow::closeEvent(QCloseEvent* event) { | 349 void MainWindow::closeEvent(QCloseEvent* event) { |
