comparison src/gui/window.cc @ 114:ab191e28e69d

*: add initial torrent stuff WOAH! these checkboxes are a pain in my fucking ass
author Paper <mrpapersonic@gmail.com>
date Tue, 07 Nov 2023 08:03:42 -0500
parents 32afe0e940bf
children c72b907b9bef
comparison
equal deleted inserted replaced
113:32afe0e940bf 114:ab191e28e69d
51 }; 51 };
52 52
53 MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { 53 MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) {
54 setWindowIcon(QIcon(":/favicon.png")); 54 setWindowIcon(QIcon(":/favicon.png"));
55 55
56 main_widget = new QWidget(this); 56 main_widget.reset(new QWidget(this));
57 /*QHBoxLayout* layout = */new QHBoxLayout(main_widget); 57 /*QHBoxLayout* layout = */new QHBoxLayout(main_widget.get());
58 58
59 AddMainWidgets(); 59 AddMainWidgets();
60 60
61 setCentralWidget(main_widget); 61 setCentralWidget(main_widget.get());
62 62
63 CreateBars(); 63 CreateBars();
64 64
65 QTimer* timer = new QTimer(this); 65 QTimer* timer = new QTimer(this);
66 connect(timer, &QTimer::timeout, this, [this] { 66 connect(timer, &QTimer::timeout, this, [this] {
79 timer->start(5000); 79 timer->start(5000);
80 } 80 }
81 81
82 void MainWindow::AddMainWidgets() { 82 void MainWindow::AddMainWidgets() {
83 int page = static_cast<int>(Pages::ANIME_LIST); 83 int page = static_cast<int>(Pages::ANIME_LIST);
84 if (sidebar) { 84 if (sidebar.get()) {
85 main_widget->layout()->removeWidget(sidebar); 85 main_widget->layout()->removeWidget(sidebar.get());
86 delete sidebar; 86 sidebar.reset();
87 } 87 }
88 88
89 if (stack) { 89 if (stack.get()) {
90 page = stack->currentIndex(); 90 page = stack->currentIndex();
91 main_widget->layout()->removeWidget(stack); 91 main_widget->layout()->removeWidget(stack.get());
92 delete stack; 92 }
93 } 93
94 94 sidebar.reset(new SideBar(main_widget.get()));
95 sidebar = new SideBar(main_widget);
96 sidebar->setFixedWidth(128); 95 sidebar->setFixedWidth(128);
97 sidebar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); 96 sidebar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
98 97
99 sidebar->AddItem(tr("Now Playing"), SideBar::CreateIcon(":/icons/16x16/film.png")); 98 sidebar->AddItem(tr("Now Playing"), SideBar::CreateIcon(":/icons/16x16/film.png"));
100 sidebar->AddSeparator(); 99 sidebar->AddSeparator();
104 sidebar->AddSeparator(); 103 sidebar->AddSeparator();
105 sidebar->AddItem(tr("Search"), SideBar::CreateIcon(":/icons/16x16/magnifier.png")); 104 sidebar->AddItem(tr("Search"), SideBar::CreateIcon(":/icons/16x16/magnifier.png"));
106 sidebar->AddItem(tr("Seasons"), SideBar::CreateIcon(":/icons/16x16/calendar.png")); 105 sidebar->AddItem(tr("Seasons"), SideBar::CreateIcon(":/icons/16x16/calendar.png"));
107 sidebar->AddItem(tr("Torrents"), SideBar::CreateIcon(":/icons/16x16/feed.png")); 106 sidebar->AddItem(tr("Torrents"), SideBar::CreateIcon(":/icons/16x16/feed.png"));
108 107
109 stack = new QStackedWidget(main_widget); 108 stack.reset(new QStackedWidget(main_widget.get()));
110 stack->addWidget(new NowPlayingPage(main_widget)); 109 stack->addWidget(new NowPlayingPage(main_widget.get()));
111 stack->addWidget(new AnimeListPage(main_widget)); 110 stack->addWidget(new AnimeListPage(main_widget.get()));
112 stack->addWidget(new HistoryPage(main_widget)); 111 stack->addWidget(new HistoryPage(main_widget.get()));
113 stack->addWidget(new StatisticsPage(main_widget)); 112 stack->addWidget(new StatisticsPage(main_widget.get()));
114 stack->addWidget(new SearchPage(main_widget)); 113 stack->addWidget(new SearchPage(main_widget.get()));
115 stack->addWidget(new SeasonsPage(main_widget)); 114 stack->addWidget(new SeasonsPage(main_widget.get()));
116 stack->addWidget(new TorrentsPage(main_widget)); 115 stack->addWidget(new TorrentsPage(main_widget.get()));
117 116
118 connect(sidebar, &SideBar::CurrentItemChanged, stack, &QStackedWidget::setCurrentIndex); 117 connect(sidebar.get(), &SideBar::CurrentItemChanged, stack.get(), &QStackedWidget::setCurrentIndex);
119 sidebar->SetCurrentItem(page); 118 sidebar->SetCurrentItem(page);
120 119
121 main_widget->layout()->addWidget(sidebar); 120 main_widget->layout()->addWidget(sidebar.get());
122 main_widget->layout()->addWidget(stack); 121 main_widget->layout()->addWidget(stack.get());
123 } 122 }
124 123
125 void MainWindow::CreateBars() { 124 void MainWindow::CreateBars() {
126 /* Menu Bar */ 125 /* Menu Bar
127 QAction* action; 126 The notation of these might seem ugly at first, but it's actually very nice
127 (just trust me). It makes it much easier to edit the lists and makes it clear
128 if you're in submenu or not. */
128 QMenuBar* menubar = new QMenuBar(this); 129 QMenuBar* menubar = new QMenuBar(this);
129 QMenu* menu = menubar->addMenu(tr("&File")); 130
130 131 {
131 QMenu* submenu = menu->addMenu(tr("&Library folders")); 132 /* File */
132 action = submenu->addAction(tr("&Add new folder...")); 133 QMenu* menu = menubar->addMenu(tr("&File"));
133 134
134 action = menu->addAction(tr("&Scan available episodes")); 135 {
135 136 QMenu* submenu = menu->addMenu(tr("&Library folders"));
136 menu->addSeparator(); 137 {
137 138 QAction* action = submenu->addAction(tr("&Add new folder..."));
138 action = menu->addAction(tr("Play &next episode")); 139 }
139 action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N)); 140 }
140 action = menu->addAction(tr("Play &random episode")); 141
141 action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R)); 142 {
142 143 QAction* action = menu->addAction(tr("&Scan available episodes"));
143 menu->addSeparator(); 144 }
144 145
145 action = menu->addAction(tr("E&xit"), qApp, &QApplication::quit); 146 menu->addSeparator();
146 147
147 menu = menubar->addMenu(tr("&Services")); 148 // {
148 action = menu->addAction(tr("Synchronize &list"), [this] { AsyncSynchronize(stack); }); 149 // QAction* action = menu->addAction(tr("Play &next episode"));
149 action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_S)); 150 // action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N));
150 151 // }
151 menu->addSeparator(); 152 //
152 153 // {
153 submenu = menu->addMenu(tr("&AniList")); 154 // QAction* action = menu->addAction(tr("Play &random episode"));
154 action = submenu->addAction(tr("Go to my &profile")); 155 // action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
155 action = submenu->addAction(tr("Go to my &stats")); 156 // }
156 157
157 submenu = menu->addMenu(tr("&Kitsu")); 158 menu->addSeparator();
158 action = submenu->addAction(tr("Go to my &feed")); 159
159 action = submenu->addAction(tr("Go to my &library")); 160 {
160 action = submenu->addAction(tr("Go to my &profile")); 161 QAction* action = menu->addAction(tr("E&xit"), qApp, &QApplication::quit);
161 162 }
162 submenu = menu->addMenu(tr("&MyAnimeList")); 163 }
163 action = submenu->addAction(tr("Go to my p&anel")); 164
164 action = submenu->addAction(tr("Go to my &profile")); 165 {
165 action = submenu->addAction(tr("Go to my &history")); 166 /* Services */
166 167 QMenu* menu = menubar->addMenu(tr("&Services"));
167 menu = menubar->addMenu(tr("&Tools")); 168 {
168 submenu = menu->addMenu(tr("&Export anime list")); 169 {
169 action = submenu->addAction(tr("Export as &Markdown...")); 170 QAction* action = menu->addAction(tr("Synchronize &list"), [this] { AsyncSynchronize(stack.get()); });
170 action = submenu->addAction(tr("Export as MyAnimeList &XML...")); 171 action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_S));
171 172 }
172 menu->addSeparator(); 173
173 174 // menu->addSeparator();
174 action = menu->addAction(tr("Enable anime &recognition")); 175 //
175 action->setCheckable(true); 176 // {
176 action = menu->addAction(tr("Enable auto &sharing")); 177 // /* AniList */
177 action->setCheckable(true); 178 // QMenu* submenu = menu->addMenu(tr("&AniList"));
178 action = menu->addAction(tr("Enable &auto synchronization")); 179 // QAction* action = submenu->addAction(tr("Go to my &profile"));
179 action->setCheckable(true); 180 // action = submenu->addAction(tr("Go to my &stats"));
180 181 // }
181 menu->addSeparator(); 182 //
182 183 // {
183 action = menu->addAction(tr("&Settings"), [this] { 184 // /* Kitsu */
184 SettingsDialog dialog(this); 185 // QMenu* submenu = menu->addMenu(tr("&Kitsu"));
185 dialog.exec(); 186 // QAction* action = submenu->addAction(tr("Go to my &feed"));
186 }); 187 // action = submenu->addAction(tr("Go to my &library"));
187 action->setMenuRole(QAction::PreferencesRole); 188 // action = submenu->addAction(tr("Go to my &profile"));
188 189 // }
189 menu = menubar->addMenu(tr("&View")); 190 // {
190 191 // QMenu* submenu = menu->addMenu(tr("&MyAnimeList"));
191 std::map<QAction*, int> page_to_index_map = {}; 192 // QAction* action = submenu->addAction(tr("Go to my p&anel"));
192 193 // action = submenu->addAction(tr("Go to my &profile"));
193 QActionGroup* pages_group = new QActionGroup(this); 194 // action = submenu->addAction(tr("Go to my &history"));
194 pages_group->setExclusive(true); 195 // }
195 196 }
196 action = pages_group->addAction(menu->addAction(tr("&Now Playing"))); 197 }
197 action->setCheckable(true); 198
198 page_to_index_map[action] = 0; 199 {
199 200 /* Tools */
200 action = pages_group->addAction(menu->addAction(tr("&Anime List"))); 201 QMenu* menu = menubar->addMenu(tr("&Tools"));
201 page_to_index_map[action] = 1; 202 // {
202 action->setCheckable(true); 203 // /* Export anime list */
203 action->setChecked(true); 204 // QMenu* submenu = menu->addMenu(tr("&Export anime list"));
204 205 //
205 action = pages_group->addAction(menu->addAction(tr("&History"))); 206 // {
206 action->setCheckable(true); 207 // /* Markdown export */
207 page_to_index_map[action] = 2; 208 // QAction* action = submenu->addAction(tr("Export as &Markdown..."));
208 209 // }
209 action = pages_group->addAction(menu->addAction(tr("&Statistics"))); 210 //
210 action->setCheckable(true); 211 // {
211 page_to_index_map[action] = 3; 212 // /* XML export */
212 213 // QAction* action = submenu->addAction(tr("Export as MyAnimeList &XML..."));
213 action = pages_group->addAction(menu->addAction(tr("S&earch"))); 214 // }
214 action->setCheckable(true); 215 // }
215 page_to_index_map[action] = 4; 216 // menu->addSeparator();
216 217 //
217 action = pages_group->addAction(menu->addAction(tr("Se&asons"))); 218 // {
218 action->setCheckable(true); 219 // QAction* action = menu->addAction(tr("Enable anime &recognition"));
219 page_to_index_map[action] = 5; 220 // action->setCheckable(true);
220 221 // }
221 action = pages_group->addAction(menu->addAction(tr("&Torrents"))); 222 //
222 action->setCheckable(true); 223 // {
223 page_to_index_map[action] = 6; 224 // QAction* action = menu->addAction(tr("Enable auto &sharing"));
224 225 // action->setCheckable(true);
225 connect(sidebar, &SideBar::CurrentItemChanged, this, 226 // }
226 [pages_group](int index) { pages_group->actions()[index]->setChecked(true); }); 227 //
227 228 // {
228 connect(pages_group, &QActionGroup::triggered, this, 229 // QAction* action = menu->addAction(tr("Enable &auto synchronization"));
229 [this, page_to_index_map](QAction* action) { sidebar->SetCurrentItem(page_to_index_map.at(action)); }); 230 // action->setCheckable(true);
230 231 // }
231 menu->addSeparator(); 232 //
232 menu->addAction(tr("Show sidebar")); 233 // menu->addSeparator();
233 234
234 menu = menubar->addMenu(tr("&Help")); 235 {
235 action = menu->addAction(tr("&About Minori"), this, [this] { 236 QAction* action = menu->addAction(tr("&Settings"), [this] {
236 AboutWindow dialog(this); 237 SettingsDialog dialog(this);
237 dialog.exec(); 238 dialog.exec();
238 }); 239 });
239 action = menu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); 240 action->setMenuRole(QAction::PreferencesRole);
240 action->setMenuRole(QAction::AboutQtRole); 241 }
241 242 }
243
244 {
245 /* View */
246 QMenu* menu = menubar->addMenu(tr("&View"));
247
248 {
249 /* Pages... */
250 std::map<QAction*, int> page_to_index_map = {};
251
252 QActionGroup* pages_group = new QActionGroup(this);
253 pages_group->setExclusive(true);
254
255 {
256 QAction* action = pages_group->addAction(menu->addAction(tr("&Now Playing")));
257 action->setCheckable(true);
258 page_to_index_map[action] = 0;
259 }
260
261 {
262 QAction* action = pages_group->addAction(menu->addAction(tr("&Anime List")));
263 action->setCheckable(true);
264 action->setChecked(true);
265 page_to_index_map[action] = 1;
266 }
267
268 {
269 QAction* action = pages_group->addAction(menu->addAction(tr("&History")));
270 action->setCheckable(true);
271 page_to_index_map[action] = 2;
272 }
273
274 {
275 QAction* action = pages_group->addAction(menu->addAction(tr("&Statistics")));
276 action->setCheckable(true);
277 page_to_index_map[action] = 3;
278 }
279
280 {
281 QAction* action = pages_group->addAction(menu->addAction(tr("S&earch")));
282 action->setCheckable(true);
283 page_to_index_map[action] = 4;
284 }
285
286 {
287 QAction* action = pages_group->addAction(menu->addAction(tr("Se&asons")));
288 action->setCheckable(true);
289 page_to_index_map[action] = 5;
290 }
291
292 {
293 QAction* action = pages_group->addAction(menu->addAction(tr("&Torrents")));
294 action->setCheckable(true);
295 page_to_index_map[action] = 6;
296 }
297
298 /* pain in my ass */
299 connect(sidebar.get(), &SideBar::CurrentItemChanged, this,
300 [pages_group](int index) { pages_group->actions()[index]->setChecked(true); });
301
302 connect(pages_group, &QActionGroup::triggered, this,
303 [this, page_to_index_map](QAction* action) { sidebar->SetCurrentItem(page_to_index_map.at(action)); });
304 }
305
306 menu->addSeparator();
307
308 // {
309 // QAction* action = menu->addAction(tr("Show sidebar"));
310 // }
311 }
312
313 {
314 /* Help */
315 QMenu* menu = menubar->addMenu(tr("&Help"));
316
317 {
318 /* About Minori */
319 menu->addAction(tr("&About Minori"), this, [this] {
320 AboutWindow dialog(this);
321 dialog.exec();
322 });
323 }
324
325 {
326 /* About Qt */
327 QAction* action = menu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt);
328 action->setMenuRole(QAction::AboutQtRole);
329 }
330 }
242 /* QMainWindow will delete the old one for us, 331 /* QMainWindow will delete the old one for us,
243 according to the docs */ 332 according to the docs */
244 setMenuBar(menubar); 333 setMenuBar(menubar);
245 334
246 /* Toolbar */ 335 /* Toolbar */
336
247 /* remove old toolbar(s) */ 337 /* remove old toolbar(s) */
248 QList<QToolBar*> toolbars = findChildren<QToolBar*>(); 338 for (QToolBar*& t : findChildren<QToolBar*>(Qt::FindDirectChildrenOnly)) {
249 for (auto& t : toolbars) {
250 removeToolBar(t); 339 removeToolBar(t);
251 delete t; 340 delete t;
252 } 341 }
253 342
254 QToolBar* toolbar = new QToolBar(this); 343 {
255 toolbar->addAction(QIcon(":/icons/24x24/arrow-circle-double-135.png"), tr("&Synchronize"), 344 /* Toolbar */
256 [this] { AsyncSynchronize(stack); }); 345 QToolBar* toolbar = new QToolBar(this);
257 toolbar->addSeparator(); 346 toolbar->addAction(QIcon(":/icons/24x24/arrow-circle-double-135.png"), tr("&Synchronize"),
258 347 [this] { AsyncSynchronize(stack.get()); });
259 QToolButton* button = new QToolButton(toolbar); 348
260 349 toolbar->addSeparator();
261 menu = new QMenu(button); 350
262 action = menu->addAction(tr("Add new folder...")); 351 {
263 352 QToolButton* button = new QToolButton(toolbar);
264 button->setMenu(menu); 353 {
265 button->setIcon(QIcon(":/icons/24x24/folder-open.png")); 354 QMenu* menu = new QMenu(button);
266 button->setPopupMode(QToolButton::InstantPopup); 355 QAction* action = menu->addAction(tr("..."));
267 toolbar->addWidget(button); 356
268 357 button->setMenu(menu);
269 button = new QToolButton(toolbar); 358 }
270 359 button->setIcon(QIcon(":/icons/24x24/folder-open.png"));
271 menu = new QMenu(button); 360 button->setPopupMode(QToolButton::InstantPopup);
272 action = menu->addAction(tr("Placeholder")); 361 toolbar->addWidget(button);
273 362 }
274 button->setMenu(menu); 363
275 button->setIcon(QIcon(":/icons/24x24/application-export.png")); 364 {
276 button->setPopupMode(QToolButton::InstantPopup); 365 QToolButton* button = new QToolButton(toolbar);
277 toolbar->addWidget(button); 366
278 367 {
279 toolbar->addSeparator(); 368 QMenu* menu = new QMenu(button);
280 toolbar->addAction(QIcon(":/icons/24x24/gear.png"), tr("S&ettings"), [this] { 369 QAction* action = menu->addAction(tr("..."));
281 SettingsDialog dialog(this); 370
282 dialog.exec(); 371 button->setMenu(menu);
283 }); 372 }
284 addToolBar(toolbar); 373
374 button->setIcon(QIcon(":/icons/24x24/application-export.png"));
375 button->setPopupMode(QToolButton::InstantPopup);
376 toolbar->addWidget(button);
377 }
378
379 toolbar->addSeparator();
380 toolbar->addAction(QIcon(":/icons/24x24/gear.png"), tr("S&ettings"), [this] {
381 SettingsDialog dialog(this);
382 dialog.exec();
383 });
384 addToolBar(toolbar);
385 }
285 } 386 }
286 387
287 void MainWindow::SetActivePage(QWidget* page) { 388 void MainWindow::SetActivePage(QWidget* page) {
288 this->setCentralWidget(page); 389 this->setCentralWidget(page);
289 } 390 }