1 #include "main_window_viewer.h"
2 #include "configuration.h"
3 #include "viewer.h"
4 #include "goto_dialog.h"
5 #include "custom_widgets.h"
6 #include "options_dialog.h"
7 #include "check_new_version.h"
8 #include "comic.h"
9 #include "bookmarks_dialog.h"
10 #include "shortcuts_dialog.h"
11 #include "width_slider.h"
12 #include "qnaturalsorting.h"
13 #include "help_about_dialog.h"
14 #include "yacreader_tool_bar_stretch.h"
15
16 #include "comic_db.h"
17 #include "yacreader_local_client.h"
18
19 #include "yacreader_global.h"
20 #include "edit_shortcuts_dialog.h"
21 #include "shortcuts_manager.h"
22
23 #include "whats_new_controller.h"
24
25 #include <ctime>
26 #include <algorithm>
27 #include <QApplication>
28 #include <QCoreApplication>
29 #include <QDesktopWidget>
30 #include <QToolButton>
31 #include <QMenu>
32 #include <QFileDialog>
33 #include <QMessageBox>
34 #include <QImage>
35 #include <QDate>
36 #include <QMenuBar>
37
38 /* TODO remove, no longer used
39 #ifdef Q_OS_MAC
40 class MacToolBarSeparator : public QWidget
41 {
42 public:
43 MacToolBarSeparator(QWidget * parent =0)
44 :QWidget(parent)
45 {
46 setFixedWidth(2);
47 }
48
49 void paintEvent(QPaintEvent *event)
50 {
51 Q_UNUSED(event);
52 QPainter painter(this);
53
54 QLinearGradient lG(0,0,0,height());
55
56 lG.setColorAt(0,QColor(128,128,128,0));
57 lG.setColorAt(0.5,QColor(128,128,128,255));
58 lG.setColorAt(1,QColor(128,128,128,0));
59
60 painter.fillRect(0,0,1,height(),lG);
61
62 QLinearGradient lG2(1,0,1,height());
63
64 lG2.setColorAt(0,QColor(220,220,220,0));
65 lG2.setColorAt(0.5,QColor(220,220,220,255));
66 lG2.setColorAt(1,QColor(220,220,220,0));
67
68 painter.fillRect(1,0,1,height(),lG2);
69 }
70 };
71 #endif*/
72
MainWindowViewer()73 MainWindowViewer::MainWindowViewer()
74 : QMainWindow(), fullscreen(false), toolbars(true), alwaysOnTop(false), currentDirectory("."), currentDirectoryImgDest("."), isClient(false)
75 {
76 loadConfiguration();
77 setupUI();
78 afterLaunchTasks();
79 }
80
afterLaunchTasks()81 void MainWindowViewer::afterLaunchTasks()
82 {
83 WhatsNewController whatsNewController;
84
85 whatsNewController.showWhatsNewIfNeeded(this);
86 }
87
~MainWindowViewer()88 MainWindowViewer::~MainWindowViewer()
89 {
90 delete settings;
91 delete viewer;
92 delete had;
93
94 //delete sliderAction;
95 delete openAction;
96 delete openFolderAction;
97 delete openLatestComicAction;
98 delete saveImageAction;
99 delete openComicOnTheLeftAction;
100 delete openComicOnTheRightAction;
101 delete goToPageOnTheLeftAction;
102 delete goToPageOnTheRightAction;
103 delete adjustHeightAction;
104 delete adjustWidthAction;
105 delete leftRotationAction;
106 delete rightRotationAction;
107 delete doublePageAction;
108 delete doubleMangaPageAction;
109 delete increasePageZoomAction;
110 delete decreasePageZoomAction;
111 delete resetZoomAction;
112 delete goToPageAction;
113 delete optionsAction;
114 delete helpAboutAction;
115 delete showMagnifyingGlassAction;
116 delete setBookmarkAction;
117 delete showBookmarksAction;
118 delete showShorcutsAction;
119 delete showInfoAction;
120 delete closeAction;
121 delete showDictionaryAction;
122 delete alwaysOnTopAction;
123 delete adjustToFullSizeAction;
124 delete fitToPageAction;
125 delete showFlowAction;
126 }
loadConfiguration()127 void MainWindowViewer::loadConfiguration()
128 {
129 settings = new QSettings(YACReader::getSettingsPath() + "/YACReader.ini", QSettings::IniFormat);
130
131 Configuration &config = Configuration::getConfiguration();
132 config.load(settings);
133 currentDirectory = config.getDefaultPath();
134 fullscreen = config.getFullScreen();
135 }
136
setupUI()137 void MainWindowViewer::setupUI()
138 {
139 //setUnifiedTitleAndToolBarOnMac(true);
140
141 viewer = new Viewer(this);
142 connect(viewer, SIGNAL(reset()), this, SLOT(processReset()));
143 //detected end of comic
144 connect(viewer, SIGNAL(openNextComic()), this, SLOT(openNextComic()));
145 //detected start of comic
146 connect(viewer, SIGNAL(openPreviousComic()), this, SLOT(openPreviousComic()));
147
148 setCentralWidget(viewer);
149 int heightDesktopResolution = QApplication::desktop()->screenGeometry().height();
150 int widthDesktopResolution = QApplication::desktop()->screenGeometry().width();
151 int height, width;
152 height = static_cast<int>(heightDesktopResolution * 0.84);
153 width = static_cast<int>(height * 0.70);
154 Configuration &conf = Configuration::getConfiguration();
155 if (!restoreGeometry(conf.getGeometry())) {
156 move(QPoint((widthDesktopResolution - width) / 2, ((heightDesktopResolution - height) - 40) / 2));
157 resize(QSize(width, height));
158 }
159
160 had = new HelpAboutDialog(this); //TODO load data
161
162 had->loadAboutInformation(":/files/about.html");
163 had->loadHelp(":/files/helpYACReader.html");
164
165 optionsDialog = new OptionsDialog(this);
166 connect(optionsDialog, SIGNAL(accepted()), viewer, SLOT(updateOptions()));
167 connect(optionsDialog, SIGNAL(optionsChanged()), this, SLOT(reloadOptions()));
168 connect(optionsDialog, SIGNAL(changedFilters(int, int, int)), viewer, SLOT(updateFilters(int, int, int)));
169 connect(optionsDialog, &OptionsDialog::changedImageOptions, viewer, &Viewer::updatePage);
170
171 optionsDialog->restoreOptions(settings);
172 //shortcutsDialog = new ShortcutsDialog(this);
173 editShortcutsDialog = new EditShortcutsDialog(this);
174 connect(optionsDialog, SIGNAL(editShortcuts()), editShortcutsDialog, SLOT(show()));
175
176 createActions();
177 setUpShortcutsManagement();
178
179 createToolBars();
180
181 setWindowTitle("YACReader");
182
183 checkNewVersion();
184
185 viewer->setFocusPolicy(Qt::StrongFocus);
186
187 //if(Configuration::getConfiguration().getAlwaysOnTop())
188 //{
189 // setWindowFlags(this->windowFlags() | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);
190 //}
191
192 previousWindowFlags = windowFlags();
193 previousPos = pos();
194 previousSize = size();
195
196 if (fullscreen)
197 toFullScreen();
198 if (conf.getMaximized())
199 showMaximized();
200
201 setAcceptDrops(true);
202
203 if (Configuration::getConfiguration().getShowToolbars() && !Configuration::getConfiguration().getFullScreen())
204 showToolBars();
205 else
206 hideToolBars();
207 }
208
createActions()209 void MainWindowViewer::createActions()
210 {
211 openAction = new QAction(tr("&Open"), this);
212 openAction->setIcon(QIcon(":/images/viewer_toolbar/open.png"));
213 openAction->setToolTip(tr("Open a comic"));
214 openAction->setData(OPEN_ACTION_Y);
215 openAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_ACTION_Y));
216 connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
217
218 #ifdef Q_OS_MAC
219 newInstanceAction = new QAction(tr("New instance"), this);
220 newInstanceAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(NEW_INSTANCE_ACTION_Y));
221 connect(newInstanceAction, &QAction::triggered,
222 [=]() {
223 QStringList possiblePaths { QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../../../") };
224 possiblePaths += QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
225
226 for (auto &&ypath : possiblePaths) {
227 QString yacreaderPath = QDir::cleanPath(ypath + "/YACReader.app");
228 if (QFileInfo(yacreaderPath).exists()) {
229 QStringList parameters { "-n", "-a", yacreaderPath };
230 QProcess::startDetached("open", parameters);
231 break;
232 }
233 }
234 });
235 newInstanceAction->setData(NEW_INSTANCE_ACTION_Y);
236 #endif
237
238 openFolderAction = new QAction(tr("Open Folder"), this);
239 openFolderAction->setIcon(QIcon(":/images/viewer_toolbar/openFolder.png"));
240 openFolderAction->setToolTip(tr("Open image folder"));
241 openFolderAction->setData(OPEN_FOLDER_ACTION_Y);
242 openFolderAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_FOLDER_ACTION_Y));
243 connect(openFolderAction, SIGNAL(triggered()), this, SLOT(openFolder()));
244
245 openLatestComicAction = new QAction(tr("Open latest comic"), this);
246 openLatestComicAction->setToolTip(tr("Open the latest comic opened in the previous reading session"));
247 openLatestComicAction->setData(OPEN_LATEST_COMIC_Y);
248 openLatestComicAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_LATEST_COMIC_Y));
249 connect(openLatestComicAction, SIGNAL(triggered()), this, SLOT(openLatestComic()));
250
251 QAction *recentFileAction = nullptr;
252 //TODO: Replace limit with a configurable value
253 for (int i = 0; i < Configuration::getConfiguration().getOpenRecentSize(); i++) {
254 recentFileAction = new QAction(this);
255 recentFileAction->setVisible(false);
256 QObject::connect(recentFileAction, &QAction::triggered, this, &MainWindowViewer::openRecent);
257 recentFilesActionList.append(recentFileAction);
258 }
259
260 clearRecentFilesAction = new QAction(tr("Clear"), this);
261 clearRecentFilesAction->setToolTip(tr("Clear open recent list"));
262 connect(clearRecentFilesAction, &QAction::triggered, this, &MainWindowViewer::clearRecentFiles);
263
264 saveImageAction = new QAction(tr("Save"), this);
265 saveImageAction->setIcon(QIcon(":/images/viewer_toolbar/save.png"));
266 saveImageAction->setToolTip(tr("Save current page"));
267 saveImageAction->setDisabled(true);
268 saveImageAction->setData(SAVE_IMAGE_ACTION_Y);
269 saveImageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SAVE_IMAGE_ACTION_Y));
270 connect(saveImageAction, SIGNAL(triggered()), this, SLOT(saveImage()));
271
272 openComicOnTheLeftAction = new QAction(tr("Previous Comic"), this);
273 openComicOnTheLeftAction->setIcon(QIcon(":/images/viewer_toolbar/openPrevious.png"));
274 openComicOnTheLeftAction->setToolTip(tr("Open previous comic"));
275 openComicOnTheLeftAction->setDisabled(true);
276 openComicOnTheLeftAction->setData(OPEN_PREVIOUS_COMIC_ACTION_Y);
277 openComicOnTheLeftAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_PREVIOUS_COMIC_ACTION_Y));
278 connect(openComicOnTheLeftAction, &QAction::triggered, this, &MainWindowViewer::openLeftComic);
279
280 openComicOnTheRightAction = new QAction(tr("Next Comic"), this);
281 openComicOnTheRightAction->setIcon(QIcon(":/images/viewer_toolbar/openNext.png"));
282 openComicOnTheRightAction->setToolTip(tr("Open next comic"));
283 openComicOnTheRightAction->setDisabled(true);
284 openComicOnTheRightAction->setData(OPEN_NEXT_COMIC_ACTION_Y);
285 openComicOnTheRightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPEN_NEXT_COMIC_ACTION_Y));
286 connect(openComicOnTheRightAction, &QAction::triggered, this, &MainWindowViewer::openRightComic);
287
288 goToPageOnTheLeftAction = new QAction(tr("&Previous"), this);
289 goToPageOnTheLeftAction->setIcon(QIcon(":/images/viewer_toolbar/previous.png"));
290 goToPageOnTheLeftAction->setShortcutContext(Qt::WidgetShortcut);
291 goToPageOnTheLeftAction->setToolTip(tr("Go to previous page"));
292 goToPageOnTheLeftAction->setDisabled(true);
293 goToPageOnTheLeftAction->setData(PREV_ACTION_Y);
294 goToPageOnTheLeftAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(PREV_ACTION_Y));
295 connect(goToPageOnTheLeftAction, SIGNAL(triggered()), viewer, SLOT(left()));
296
297 goToPageOnTheRightAction = new QAction(tr("&Next"), this);
298 goToPageOnTheRightAction->setIcon(QIcon(":/images/viewer_toolbar/next.png"));
299 goToPageOnTheRightAction->setShortcutContext(Qt::WidgetShortcut);
300 goToPageOnTheRightAction->setToolTip(tr("Go to next page"));
301 goToPageOnTheRightAction->setDisabled(true);
302 goToPageOnTheRightAction->setData(NEXT_ACTION_Y);
303 goToPageOnTheRightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(NEXT_ACTION_Y));
304 connect(goToPageOnTheRightAction, SIGNAL(triggered()), viewer, SLOT(right()));
305
306 adjustHeightAction = new QAction(tr("Fit Height"), this);
307 adjustHeightAction->setIcon(QIcon(":/images/viewer_toolbar/toHeight.png"));
308 //adjustWidth->setCheckable(true);
309 adjustHeightAction->setDisabled(true);
310 adjustHeightAction->setToolTip(tr("Fit image to height"));
311 //adjustWidth->setIcon(QIcon(":/images/fitWidth.png"));
312 adjustHeightAction->setData(ADJUST_HEIGHT_ACTION_Y);
313 adjustHeightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADJUST_HEIGHT_ACTION_Y));
314 adjustHeightAction->setCheckable(true);
315 connect(adjustHeightAction, SIGNAL(triggered()), this, SLOT(fitToHeight()));
316
317 adjustWidthAction = new QAction(tr("Fit Width"), this);
318 adjustWidthAction->setIcon(QIcon(":/images/viewer_toolbar/toWidth.png"));
319 //adjustWidth->setCheckable(true);
320 adjustWidthAction->setDisabled(true);
321 adjustWidthAction->setToolTip(tr("Fit image to width"));
322 //adjustWidth->setIcon(QIcon(":/images/fitWidth.png"));
323 adjustWidthAction->setData(ADJUST_WIDTH_ACTION_Y);
324 adjustWidthAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADJUST_WIDTH_ACTION_Y));
325 adjustWidthAction->setCheckable(true);
326 connect(adjustWidthAction, SIGNAL(triggered()), this, SLOT(fitToWidth()));
327
328 adjustToFullSizeAction = new QAction(tr("Show full size"), this);
329 adjustToFullSizeAction->setIcon(QIcon(":/images/viewer_toolbar/full.png"));
330 adjustToFullSizeAction->setCheckable(false);
331 adjustToFullSizeAction->setDisabled(true);
332 adjustToFullSizeAction->setData(ADJUST_TO_FULL_SIZE_ACTION_Y);
333 adjustToFullSizeAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ADJUST_TO_FULL_SIZE_ACTION_Y));
334 adjustToFullSizeAction->setCheckable(true);
335 connect(adjustToFullSizeAction, SIGNAL(triggered()), this, SLOT(adjustToFullSizeSwitch()));
336
337 fitToPageAction = new QAction(tr("Fit to page"), this);
338 fitToPageAction->setIcon(QIcon(":/images/viewer_toolbar/fitToPage.png"));
339 fitToPageAction->setDisabled(true);
340 fitToPageAction->setData(FIT_TO_PAGE_ACTION_Y);
341 fitToPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(FIT_TO_PAGE_ACTION_Y));
342 fitToPageAction->setCheckable(true);
343 connect(fitToPageAction, SIGNAL(triggered()), this, SLOT(fitToPageSwitch()));
344
345 //fit modes have to be exclusive and checkable
346 auto fitModes = new QActionGroup(this);
347 fitModes->addAction(adjustHeightAction);
348 fitModes->addAction(adjustWidthAction);
349 fitModes->addAction(adjustToFullSizeAction);
350 fitModes->addAction(fitToPageAction);
351
352 switch (Configuration::getConfiguration().getFitMode()) {
353 case YACReader::FitMode::ToWidth:
354 adjustWidthAction->setChecked(true);
355 break;
356 case YACReader::FitMode::ToHeight:
357 adjustHeightAction->setChecked(true);
358 break;
359 case YACReader::FitMode::FullRes:
360 adjustToFullSizeAction->setChecked(true);
361 break;
362 case YACReader::FitMode::FullPage:
363 fitToPageAction->setChecked(true);
364 break;
365 default:
366 fitToPageAction->setChecked(true);
367 }
368
369 resetZoomAction = new QAction(tr("Reset zoom"), this);
370 resetZoomAction->setDisabled(true);
371 resetZoomAction->setData(RESET_ZOOM_ACTION_Y);
372 resetZoomAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(RESET_ZOOM_ACTION_Y));
373 connect(resetZoomAction, SIGNAL(triggered()), this, SLOT(resetZoomLevel()));
374
375 showZoomSliderlAction = new QAction(tr("Show zoom slider"), this);
376 showZoomSliderlAction->setIcon(QIcon(":/images/viewer_toolbar/zoom.png"));
377 showZoomSliderlAction->setDisabled(true);
378
379 increasePageZoomAction = new QAction(tr("Zoom+"), this);
380 increasePageZoomAction->setDisabled(true);
381 increasePageZoomAction->setData(ZOOM_PLUS_ACTION_Y);
382 increasePageZoomAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_PLUS_ACTION_Y));
383 connect(increasePageZoomAction, SIGNAL(triggered()), this, SLOT(increasePageZoomLevel()));
384
385 decreasePageZoomAction = new QAction(tr("Zoom-"), this);
386 decreasePageZoomAction->setDisabled(true);
387 decreasePageZoomAction->setData(ZOOM_MINUS_ACTION_Y);
388 decreasePageZoomAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_MINUS_ACTION_Y));
389 connect(decreasePageZoomAction, SIGNAL(triggered()), this, SLOT(decreasePageZoomLevel()));
390
391 leftRotationAction = new QAction(tr("Rotate image to the left"), this);
392 leftRotationAction->setIcon(QIcon(":/images/viewer_toolbar/rotateL.png"));
393 leftRotationAction->setDisabled(true);
394 leftRotationAction->setData(LEFT_ROTATION_ACTION_Y);
395 leftRotationAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(LEFT_ROTATION_ACTION_Y));
396 connect(leftRotationAction, SIGNAL(triggered()), viewer, SLOT(rotateLeft()));
397
398 rightRotationAction = new QAction(tr("Rotate image to the right"), this);
399 rightRotationAction->setIcon(QIcon(":/images/viewer_toolbar/rotateR.png"));
400 rightRotationAction->setDisabled(true);
401 rightRotationAction->setData(RIGHT_ROTATION_ACTION_Y);
402 rightRotationAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(RIGHT_ROTATION_ACTION_Y));
403 connect(rightRotationAction, SIGNAL(triggered()), viewer, SLOT(rotateRight()));
404
405 doublePageAction = new QAction(tr("Double page mode"), this);
406 doublePageAction->setToolTip(tr("Switch to double page mode"));
407 doublePageAction->setIcon(QIcon(":/images/viewer_toolbar/doublePage.png"));
408 doublePageAction->setDisabled(true);
409 doublePageAction->setCheckable(true);
410 doublePageAction->setChecked(Configuration::getConfiguration().getDoublePage());
411 doublePageAction->setData(DOUBLE_PAGE_ACTION_Y);
412 doublePageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(DOUBLE_PAGE_ACTION_Y));
413 connect(doublePageAction, SIGNAL(triggered()), viewer, SLOT(doublePageSwitch()));
414
415 //inversed pictures mode
416 doubleMangaPageAction = new QAction(tr("Double page manga mode"), this);
417 doubleMangaPageAction->setToolTip(tr("Reverse reading order in double page mode"));
418 doubleMangaPageAction->setIcon(QIcon(":/images/viewer_toolbar/doubleMangaPage.png"));
419 doubleMangaPageAction->setDisabled(true);
420 doubleMangaPageAction->setCheckable(true);
421 doubleMangaPageAction->setChecked(Configuration::getConfiguration().getDoubleMangaPage());
422 doubleMangaPageAction->setData(DOUBLE_MANGA_PAGE_ACTION_Y);
423 doubleMangaPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(DOUBLE_MANGA_PAGE_ACTION_Y));
424 connect(doubleMangaPageAction, SIGNAL(triggered()), viewer, SLOT(doubleMangaPageSwitch()));
425 connect(doubleMangaPageAction, &QAction::triggered, this, &MainWindowViewer::doubleMangaPageSwitch);
426
427 goToPageAction = new QAction(tr("Go To"), this);
428 goToPageAction->setIcon(QIcon(":/images/viewer_toolbar/goto.png"));
429 goToPageAction->setDisabled(true);
430 goToPageAction->setToolTip(tr("Go to page ..."));
431 goToPageAction->setData(GO_TO_PAGE_ACTION_Y);
432 goToPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_PAGE_ACTION_Y));
433 connect(goToPageAction, SIGNAL(triggered()), viewer, SLOT(showGoToDialog()));
434
435 optionsAction = new QAction(tr("Options"), this);
436 optionsAction->setToolTip(tr("YACReader options"));
437 optionsAction->setData(OPTIONS_ACTION_Y);
438 optionsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(OPTIONS_ACTION_Y));
439 optionsAction->setIcon(QIcon(":/images/viewer_toolbar/options.png"));
440
441 connect(optionsAction, SIGNAL(triggered()), optionsDialog, SLOT(show()));
442
443 helpAboutAction = new QAction(tr("Help"), this);
444 helpAboutAction->setToolTip(tr("Help, About YACReader"));
445 helpAboutAction->setIcon(QIcon(":/images/viewer_toolbar/help.png"));
446 helpAboutAction->setData(HELP_ABOUT_ACTION_Y);
447 helpAboutAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(HELP_ABOUT_ACTION_Y));
448 connect(helpAboutAction, SIGNAL(triggered()), had, SLOT(show()));
449
450 showMagnifyingGlassAction = new QAction(tr("Magnifying glass"), this);
451 showMagnifyingGlassAction->setToolTip(tr("Switch Magnifying glass"));
452 showMagnifyingGlassAction->setIcon(QIcon(":/images/viewer_toolbar/magnifyingGlass.png"));
453 showMagnifyingGlassAction->setDisabled(true);
454 showMagnifyingGlassAction->setCheckable(true);
455 showMagnifyingGlassAction->setData(SHOW_MAGNIFYING_GLASS_ACTION_Y);
456 showMagnifyingGlassAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_MAGNIFYING_GLASS_ACTION_Y));
457 connect(showMagnifyingGlassAction, SIGNAL(triggered()), viewer, SLOT(magnifyingGlassSwitch()));
458
459 setBookmarkAction = new QAction(tr("Set bookmark"), this);
460 setBookmarkAction->setToolTip(tr("Set a bookmark on the current page"));
461 setBookmarkAction->setIcon(QIcon(":/images/viewer_toolbar/bookmark.png"));
462 setBookmarkAction->setDisabled(true);
463 setBookmarkAction->setCheckable(true);
464 setBookmarkAction->setData(SET_BOOKMARK_ACTION_Y);
465 setBookmarkAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SET_BOOKMARK_ACTION_Y));
466 connect(setBookmarkAction, SIGNAL(triggered(bool)), viewer, SLOT(setBookmark(bool)));
467 connect(viewer, SIGNAL(pageAvailable(bool)), setBookmarkAction, SLOT(setEnabled(bool)));
468 connect(viewer, SIGNAL(pageIsBookmark(bool)), setBookmarkAction, SLOT(setChecked(bool)));
469
470 showBookmarksAction = new QAction(tr("Show bookmarks"), this);
471 showBookmarksAction->setToolTip(tr("Show the bookmarks of the current comic"));
472 showBookmarksAction->setIcon(QIcon(":/images/viewer_toolbar/showBookmarks.png"));
473 showBookmarksAction->setDisabled(true);
474 showBookmarksAction->setData(SHOW_BOOKMARKS_ACTION_Y);
475 showBookmarksAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_BOOKMARKS_ACTION_Y));
476 connect(showBookmarksAction, SIGNAL(triggered()), viewer->getBookmarksDialog(), SLOT(show()));
477
478 showShorcutsAction = new QAction(tr("Show keyboard shortcuts"), this);
479 showShorcutsAction->setIcon(QIcon(":/images/viewer_toolbar/shortcuts.png"));
480 showShorcutsAction->setData(SHOW_SHORCUTS_ACTION_Y);
481 showShorcutsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_SHORCUTS_ACTION_Y));
482 //connect(showShorcutsAction, SIGNAL(triggered()),shortcutsDialog,SLOT(show()));
483 connect(showShorcutsAction, SIGNAL(triggered()), editShortcutsDialog, SLOT(show()));
484
485 showInfoAction = new QAction(tr("Show Info"), this);
486 showInfoAction->setIcon(QIcon(":/images/viewer_toolbar/info.png"));
487 showInfoAction->setDisabled(true);
488 showInfoAction->setData(SHOW_INFO_ACTION_Y);
489 showInfoAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_INFO_ACTION_Y));
490 connect(showInfoAction, SIGNAL(triggered()), viewer, SLOT(informationSwitch()));
491
492 closeAction = new QAction(tr("Close"), this);
493 closeAction->setIcon(QIcon(":/images/viewer_toolbar/close.png"));
494 closeAction->setData(CLOSE_ACTION_Y);
495 closeAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(CLOSE_ACTION_Y));
496 connect(closeAction, SIGNAL(triggered()), this, SLOT(close()));
497
498 showDictionaryAction = new QAction(tr("Show Dictionary"), this);
499 showDictionaryAction->setIcon(QIcon(":/images/viewer_toolbar/translator.png"));
500 //showDictionaryAction->setCheckable(true);
501 showDictionaryAction->setDisabled(true);
502 showDictionaryAction->setData(SHOW_DICTIONARY_ACTION_Y);
503 showDictionaryAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_DICTIONARY_ACTION_Y));
504 connect(showDictionaryAction, SIGNAL(triggered()), viewer, SLOT(translatorSwitch()));
505
506 //deprecated
507 alwaysOnTopAction = new QAction(tr("Always on top"), this);
508 alwaysOnTopAction->setIcon(QIcon(":/images/alwaysOnTop.png"));
509 alwaysOnTopAction->setCheckable(true);
510 alwaysOnTopAction->setDisabled(true);
511 alwaysOnTopAction->setChecked(Configuration::getConfiguration().getAlwaysOnTop());
512 alwaysOnTopAction->setData(ALWAYS_ON_TOP_ACTION_Y);
513 alwaysOnTopAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ALWAYS_ON_TOP_ACTION_Y));
514 connect(alwaysOnTopAction, SIGNAL(triggered()), this, SLOT(alwaysOnTopSwitch()));
515
516 showFlowAction = new QAction(tr("Show go to flow"), this);
517 showFlowAction->setIcon(QIcon(":/images/viewer_toolbar/flow.png"));
518 showFlowAction->setDisabled(true);
519 showFlowAction->setData(SHOW_FLOW_ACTION_Y);
520 showFlowAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_FLOW_ACTION_Y));
521 connect(showFlowAction, SIGNAL(triggered()), viewer, SLOT(goToFlowSwitch()));
522
523 showEditShortcutsAction = new QAction(tr("Edit shortcuts"), this);
524 showEditShortcutsAction->setData(SHOW_EDIT_SHORTCUTS_ACTION_Y);
525 showEditShortcutsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SHOW_EDIT_SHORTCUTS_ACTION_Y));
526 connect(showEditShortcutsAction, SIGNAL(triggered()), editShortcutsDialog, SLOT(show()));
527 }
528
createToolBars()529 void MainWindowViewer::createToolBars()
530 {
531 #ifdef Q_OS_MAC
532 comicToolBar = new YACReaderMacOSXToolbar(this);
533 #else
534 comicToolBar = addToolBar(tr("&File"));
535 #endif
536
537 #ifdef Q_OS_MAC
538 //comicToolBar->setIconSize(QSize(16,16));
539 #else
540 comicToolBar->setIconSize(QSize(18, 18));
541 comicToolBar->setStyleSheet("QToolBar{border:none;}");
542 #endif
543
544 #ifdef Q_OS_MAC
545 comicToolBar->addAction(openAction);
546 comicToolBar->addAction(openFolderAction);
547 #else
548 auto recentmenu = new QMenu(tr("Open recent"));
549 recentmenu->addActions(recentFilesActionList);
550 recentmenu->addSeparator();
551 recentmenu->addAction(clearRecentFilesAction);
552 refreshRecentFilesActionList();
553
554 auto tb = new QToolButton();
555 tb->addAction(openAction);
556 tb->addAction(openLatestComicAction);
557 tb->addAction(openFolderAction);
558 tb->addAction(recentmenu->menuAction());
559 tb->setPopupMode(QToolButton::MenuButtonPopup);
560 tb->setDefaultAction(openAction);
561
562 comicToolBar->addWidget(tb);
563 #endif
564
565 comicToolBar->addAction(saveImageAction);
566 comicToolBar->addAction(openComicOnTheLeftAction);
567 comicToolBar->addAction(openComicOnTheRightAction);
568
569 comicToolBar->addSeparator();
570
571 comicToolBar->addAction(goToPageOnTheLeftAction);
572 comicToolBar->addAction(goToPageOnTheRightAction);
573 comicToolBar->addAction(goToPageAction);
574
575 comicToolBar->addSeparator();
576
577 comicToolBar->addAction(adjustWidthAction);
578 comicToolBar->addAction(adjustHeightAction);
579 comicToolBar->addAction(adjustToFullSizeAction);
580 comicToolBar->addAction(fitToPageAction);
581
582 zoomSliderAction = new YACReaderSlider(this);
583 zoomSliderAction->hide();
584
585 comicToolBar->addAction(showZoomSliderlAction);
586
587 connect(showZoomSliderlAction, SIGNAL(triggered()), this, SLOT(toggleFitToWidthSlider()));
588 connect(zoomSliderAction, SIGNAL(zoomRatioChanged(int)), viewer, SLOT(updateZoomRatio(int)));
589 connect(viewer, SIGNAL(zoomUpdated(int)), zoomSliderAction, SLOT(updateZoomRatio(int)));
590
591 comicToolBar->addAction(leftRotationAction);
592 comicToolBar->addAction(rightRotationAction);
593 comicToolBar->addAction(doublePageAction);
594 comicToolBar->addAction(doubleMangaPageAction);
595
596 comicToolBar->addSeparator();
597
598 comicToolBar->addAction(showMagnifyingGlassAction);
599
600 comicToolBar->addSeparator();
601
602 comicToolBar->addAction(setBookmarkAction);
603 comicToolBar->addAction(showBookmarksAction);
604
605 comicToolBar->addSeparator();
606
607 comicToolBar->addAction(showDictionaryAction);
608 comicToolBar->addAction(showFlowAction);
609 comicToolBar->addAction(showInfoAction);
610
611 #ifdef Q_OS_MAC
612 comicToolBar->addStretch();
613 #else
614 comicToolBar->addWidget(new YACReaderToolBarStretch());
615 #endif
616
617 comicToolBar->addAction(showShorcutsAction);
618 comicToolBar->addAction(optionsAction);
619 comicToolBar->addAction(helpAboutAction);
620 //comicToolBar->addAction(closeAction);
621
622 #ifndef Q_OS_MAC
623 comicToolBar->setMovable(false);
624 #endif
625
626 viewer->addAction(openAction);
627 viewer->addAction(openFolderAction);
628 viewer->addAction(saveImageAction);
629 viewer->addAction(openComicOnTheLeftAction);
630 viewer->addAction(openComicOnTheRightAction);
631 YACReader::addSperator(viewer);
632
633 viewer->addAction(goToPageOnTheLeftAction);
634 viewer->addAction(goToPageOnTheRightAction);
635 viewer->addAction(goToPageAction);
636 viewer->addAction(adjustHeightAction);
637 viewer->addAction(adjustWidthAction);
638 viewer->addAction(adjustToFullSizeAction);
639 viewer->addAction(fitToPageAction);
640 viewer->addAction(leftRotationAction);
641 viewer->addAction(rightRotationAction);
642 viewer->addAction(doublePageAction);
643 viewer->addAction(doubleMangaPageAction);
644 YACReader::addSperator(viewer);
645
646 viewer->addAction(showMagnifyingGlassAction);
647 viewer->addAction(increasePageZoomAction);
648 viewer->addAction(decreasePageZoomAction);
649 viewer->addAction(resetZoomAction);
650 YACReader::addSperator(viewer);
651
652 viewer->addAction(setBookmarkAction);
653 viewer->addAction(showBookmarksAction);
654 YACReader::addSperator(viewer);
655
656 viewer->addAction(showDictionaryAction);
657 viewer->addAction(showFlowAction);
658 viewer->addAction(showInfoAction);
659 YACReader::addSperator(viewer);
660
661 viewer->addAction(showShorcutsAction);
662 viewer->addAction(showEditShortcutsAction);
663 viewer->addAction(optionsAction);
664 viewer->addAction(helpAboutAction);
665 YACReader::addSperator(viewer);
666
667 viewer->addAction(closeAction);
668
669 viewer->setContextMenuPolicy(Qt::ActionsContextMenu);
670
671 //MacOSX app menus
672 #ifdef Q_OS_MAC
673 auto menuBar = this->menuBar();
674 //about / preferences
675 //TODO
676
677 //file
678 auto fileMenu = new QMenu(tr("File"));
679
680 fileMenu->addAction(newInstanceAction);
681 fileMenu->addSeparator();
682 fileMenu->addAction(openAction);
683 fileMenu->addAction(openLatestComicAction);
684 fileMenu->addAction(openFolderAction);
685 fileMenu->addSeparator();
686 fileMenu->addAction(saveImageAction);
687 fileMenu->addSeparator();
688
689 auto recentmenu = new QMenu(tr("Open recent"));
690 recentmenu->addActions(recentFilesActionList);
691 recentmenu->addSeparator();
692 recentmenu->addAction(clearRecentFilesAction);
693 refreshRecentFilesActionList();
694 fileMenu->addMenu(recentmenu);
695
696 fileMenu->addSeparator();
697 fileMenu->addAction(closeAction);
698
699 auto editMenu = new QMenu(tr("Edit"));
700 editMenu->addAction(leftRotationAction);
701 editMenu->addAction(rightRotationAction);
702
703 auto viewMenu = new QMenu(tr("View"));
704 viewMenu->addAction(adjustHeightAction);
705 viewMenu->addAction(adjustWidthAction);
706 viewMenu->addAction(fitToPageAction);
707 viewMenu->addAction(adjustToFullSizeAction);
708 viewMenu->addSeparator();
709 viewMenu->addAction(increasePageZoomAction);
710 viewMenu->addAction(decreasePageZoomAction);
711 viewMenu->addAction(resetZoomAction);
712 viewMenu->addAction(showZoomSliderlAction);
713 viewMenu->addSeparator();
714 viewMenu->addAction(doublePageAction);
715 viewMenu->addAction(doubleMangaPageAction);
716 viewMenu->addSeparator();
717 viewMenu->addAction(showMagnifyingGlassAction);
718
719 auto goMenu = new QMenu(tr("Go"));
720 goMenu->addAction(goToPageOnTheLeftAction);
721 goMenu->addAction(goToPageOnTheRightAction);
722 goMenu->addAction(goToPageAction);
723 goMenu->addSeparator();
724 goMenu->addAction(setBookmarkAction);
725 goMenu->addAction(showBookmarksAction);
726
727 auto windowMenu = new QMenu(tr("Window"));
728 windowMenu->addAction(optionsAction); // this action goes to MacOS's Preference menu by Qt
729 windowMenu->addAction(showShorcutsAction);
730 windowMenu->addAction(showFlowAction);
731 windowMenu->addAction(showInfoAction);
732 windowMenu->addAction(showDictionaryAction);
733
734 auto helpMenu = new QMenu(tr("Help"));
735 helpMenu->addAction(helpAboutAction);
736
737 menuBar->addMenu(fileMenu);
738 menuBar->addMenu(editMenu);
739 menuBar->addMenu(viewMenu);
740 menuBar->addMenu(goMenu);
741 menuBar->addMenu(windowMenu);
742 menuBar->addMenu(helpMenu);
743
744 //tool bar
745 //QMenu * toolbarMenu = new QMenu(tr("Toolbar"));
746 //toolbarMenu->addAction();
747 //TODO
748
749 //menu->addMenu(toolbarMenu);
750
751 //attach toolbar
752
753 comicToolBar->attachToWindow(this->windowHandle());
754
755 #endif
756 }
757
refreshRecentFilesActionList()758 void MainWindowViewer::refreshRecentFilesActionList()
759 {
760 QStringList recentFilePaths = Configuration::getConfiguration().openRecentList();
761
762 //TODO: Replace limit with something configurable
763 int iteration = (recentFilePaths.size() < Configuration::getConfiguration().getOpenRecentSize())
764 ? recentFilePaths.size()
765 : Configuration::getConfiguration().getOpenRecentSize();
766 for (int i = 0; i < iteration; i++) {
767 QString strippedName = QFileInfo(recentFilePaths.at(i)).fileName();
768 recentFilesActionList.at(i)->setText(strippedName);
769 recentFilesActionList.at(i)->setData(recentFilePaths.at(i));
770 recentFilesActionList.at(i)->setVisible(true);
771 }
772
773 for (int i = iteration; i < Configuration::getConfiguration().getOpenRecentSize(); i++) {
774 recentFilesActionList.at(i)->setVisible(false);
775 }
776 }
777
clearRecentFiles()778 void MainWindowViewer::clearRecentFiles()
779 {
780 Configuration::getConfiguration().clearOpenRecentList();
781 refreshRecentFilesActionList();
782 }
783
openRecent()784 void MainWindowViewer::openRecent()
785 {
786 auto action = qobject_cast<QAction *>(sender());
787
788 openComicFromRecentAction(action);
789 }
790
openLatestComic()791 void MainWindowViewer::openLatestComic()
792 {
793 if (recentFilesActionList.isEmpty()) {
794 return;
795 }
796
797 openComicFromRecentAction(recentFilesActionList[0]);
798 }
799
openComicFromRecentAction(QAction * action)800 void MainWindowViewer::openComicFromRecentAction(QAction *action)
801 {
802 if (action == nullptr) {
803 return;
804 }
805
806 QFileInfo info1(action->data().toString());
807 if (info1.exists()) {
808 if (info1.isFile()) {
809 openComicFromPath(action->data().toString());
810 } else if (info1.isDir()) {
811 openFolderFromPath(action->data().toString());
812 }
813 }
814 }
815
reloadOptions()816 void MainWindowViewer::reloadOptions()
817 {
818 viewer->updateConfig(settings);
819 }
820
open()821 void MainWindowViewer::open()
822 {
823 QFileDialog openDialog;
824 #ifndef use_unarr
825 QString pathFile = openDialog.getOpenFileName(this, tr("Open Comic"), currentDirectory, tr("Comic files") + "(*.cbr *.cbz *.rar *.zip *.tar *.pdf *.7z *.cb7 *.arj *.cbt)");
826 #else
827 QString pathFile = openDialog.getOpenFileName(this, tr("Open Comic"), currentDirectory, tr("Comic files") + "(*.cbr *.cbz *.rar *.zip *.tar *.pdf *.cbt)");
828 #endif
829 if (!pathFile.isEmpty()) {
830 openComicFromPath(pathFile);
831 }
832 }
833
open(QString path,ComicDB & comic,QList<ComicDB> & siblings)834 void MainWindowViewer::open(QString path, ComicDB &comic, QList<ComicDB> &siblings)
835 {
836 QFileInfo fi(path);
837
838 if (!comic.info.title.isNull() && !comic.info.title.toString().isEmpty())
839 setWindowTitle("YACReader - " + comic.info.title.toString());
840 else
841 setWindowTitle("YACReader - " + fi.fileName());
842
843 viewer->setMangaWithoutStoringSetting(comic.info.manga.toBool());
844 doubleMangaPageAction->setChecked(comic.info.manga.toBool());
845
846 viewer->open(path, comic);
847 enableActions();
848 int index = siblings.indexOf(comic);
849 updatePrevNextActions(index > 0, index + 1 < siblings.count());
850
851 optionsDialog->setFilters(currentComicDB.info.brightness, currentComicDB.info.contrast, currentComicDB.info.gamma);
852 }
853
open(QString path,qint64 comicId,qint64 libraryId,OpenComicSource source)854 void MainWindowViewer::open(QString path, qint64 comicId, qint64 libraryId, OpenComicSource source)
855 {
856 currentDirectory = path;
857
858 this->libraryId = libraryId;
859 this->source = source;
860
861 enableActions();
862
863 currentComicDB.id = comicId;
864 YACReaderLocalClient client;
865 int tries = 1;
866 bool success = false;
867 while (!(success = client.requestComicInfo(libraryId, currentComicDB, siblingComics, source)) && tries != 0)
868 tries--;
869
870 if (success) {
871 isClient = true;
872 open(path + currentComicDB.path, currentComicDB, siblingComics);
873 } else {
874 isClient = false;
875 QMessageBox::information(this, "Connection Error", "Unable to connect to YACReaderLibrary");
876 //error
877 }
878
879 optionsDialog->setFilters(currentComicDB.info.brightness, currentComicDB.info.contrast, currentComicDB.info.gamma);
880 }
881
openComicFromPath(QString pathFile)882 void MainWindowViewer::openComicFromPath(QString pathFile)
883 {
884 doubleMangaPageAction->setChecked(Configuration::getConfiguration().getDoubleMangaPage());
885 openComic(pathFile);
886 isClient = false; //this method is used for direct openings
887 updatePrevNextActions(!previousComicPath.isEmpty(), !nextComicPath.isEmpty());
888 }
889
890 //isClient shouldn't be modified when a siblinig comic is opened
openSiblingComic(QString pathFile)891 void MainWindowViewer::openSiblingComic(QString pathFile)
892 {
893 openComic(pathFile);
894 }
895
openComic(QString pathFile)896 void MainWindowViewer::openComic(QString pathFile)
897 {
898 QFileInfo fi(pathFile);
899 currentDirectory = fi.dir().absolutePath();
900 getSiblingComics(fi.absolutePath(), fi.fileName());
901
902 setWindowTitle("YACReader - " + fi.fileName());
903
904 enableActions();
905
906 viewer->open(pathFile);
907 Configuration::getConfiguration().updateOpenRecentList(fi.absoluteFilePath());
908 refreshRecentFilesActionList();
909 }
910
openFolder()911 void MainWindowViewer::openFolder()
912 {
913 QFileDialog openDialog;
914 QString pathDir = openDialog.getExistingDirectory(this, tr("Open folder"), currentDirectory);
915 if (!pathDir.isEmpty()) {
916 openFolderFromPath(pathDir);
917 isClient = false;
918 }
919 }
920
openFolderFromPath(QString pathDir)921 void MainWindowViewer::openFolderFromPath(QString pathDir)
922 {
923 currentDirectory = pathDir; //TODO ??
924 QFileInfo fi(pathDir);
925 getSiblingComics(fi.absolutePath(), fi.fileName());
926
927 setWindowTitle("YACReader - " + fi.fileName());
928
929 enableActions();
930
931 viewer->open(pathDir);
932 Configuration::getConfiguration().updateOpenRecentList(fi.absoluteFilePath());
933 refreshRecentFilesActionList();
934 }
935
openFolderFromPath(QString pathDir,QString atFileName)936 void MainWindowViewer::openFolderFromPath(QString pathDir, QString atFileName)
937 {
938 currentDirectory = pathDir; //TODO ??
939 QFileInfo fi(pathDir);
940 getSiblingComics(fi.absolutePath(), fi.fileName());
941
942 setWindowTitle("YACReader - " + fi.fileName());
943
944 enableActions();
945
946 QDir d(pathDir);
947 d.setFilter(QDir::Files | QDir::NoDotAndDotDot);
948 d.setNameFilters(Comic::getSupportedImageFormats());
949 d.setSorting(QDir::Name | QDir::IgnoreCase | QDir::LocaleAware);
950 QStringList list = d.entryList();
951
952 std::sort(list.begin(), list.end(), naturalSortLessThanCI);
953 int i = 0;
954 foreach (QString path, list) {
955 if (path.endsWith(atFileName))
956 break;
957 i++;
958 }
959
960 int index = 0;
961 if (i < list.count())
962 index = i;
963
964 viewer->open(pathDir, index);
965 }
966
saveImage()967 void MainWindowViewer::saveImage()
968 {
969 QFileDialog saveDialog;
970 QString pathFile = saveDialog.getSaveFileName(this, tr("Save current page"), currentDirectoryImgDest + "/" + tr("page_%1.jpg").arg(viewer->getIndex()), tr("Image files (*.jpg)"));
971 if (!pathFile.isEmpty()) {
972 QFileInfo fi(pathFile);
973 currentDirectoryImgDest = fi.absolutePath();
974 const QPixmap *p = viewer->pixmap();
975 if (p != nullptr)
976 p->save(pathFile);
977 }
978 }
979
enableActions()980 void MainWindowViewer::enableActions()
981 {
982 saveImageAction->setDisabled(false);
983 goToPageOnTheLeftAction->setDisabled(false);
984 goToPageOnTheRightAction->setDisabled(false);
985 adjustHeightAction->setDisabled(false);
986 adjustWidthAction->setDisabled(false);
987 goToPageAction->setDisabled(false);
988 //alwaysOnTopAction->setDisabled(false);
989 leftRotationAction->setDisabled(false);
990 rightRotationAction->setDisabled(false);
991 showMagnifyingGlassAction->setDisabled(false);
992 doublePageAction->setDisabled(false);
993 doubleMangaPageAction->setDisabled(false);
994 adjustToFullSizeAction->setDisabled(false);
995 adjustToFullSizeAction->setDisabled(false);
996 fitToPageAction->setDisabled(false);
997 showZoomSliderlAction->setDisabled(false);
998 increasePageZoomAction->setDisabled(false);
999 decreasePageZoomAction->setDisabled(false);
1000 resetZoomAction->setDisabled(false);
1001 //setBookmark->setDisabled(false);
1002 showBookmarksAction->setDisabled(false);
1003 showInfoAction->setDisabled(false); //TODO enable goTo and showInfo (or update) when numPages emited
1004 showDictionaryAction->setDisabled(false);
1005 showFlowAction->setDisabled(false);
1006
1007 #ifdef Q_OS_MAC
1008 activateWindow();
1009 raise();
1010 #endif
1011 }
disableActions()1012 void MainWindowViewer::disableActions()
1013 {
1014 saveImageAction->setDisabled(true);
1015 goToPageOnTheLeftAction->setDisabled(true);
1016 goToPageOnTheRightAction->setDisabled(true);
1017 adjustHeightAction->setDisabled(true);
1018 adjustWidthAction->setDisabled(true);
1019 goToPageAction->setDisabled(true);
1020 //alwaysOnTopAction->setDisabled(true);
1021 leftRotationAction->setDisabled(true);
1022 rightRotationAction->setDisabled(true);
1023 showMagnifyingGlassAction->setDisabled(true);
1024 doublePageAction->setDisabled(true);
1025 doubleMangaPageAction->setDisabled(true);
1026 adjustToFullSizeAction->setDisabled(true);
1027 fitToPageAction->setDisabled(true);
1028 showZoomSliderlAction->setDisabled(true);
1029 increasePageZoomAction->setDisabled(true);
1030 decreasePageZoomAction->setDisabled(true);
1031 resetZoomAction->setDisabled(true);
1032 setBookmarkAction->setDisabled(true);
1033 showBookmarksAction->setDisabled(true);
1034 showInfoAction->setDisabled(true); //TODO enable goTo and showInfo (or update) when numPages emited
1035 openComicOnTheLeftAction->setDisabled(true);
1036 openComicOnTheRightAction->setDisabled(true);
1037 showDictionaryAction->setDisabled(true);
1038 showFlowAction->setDisabled(true);
1039 }
1040
keyPressEvent(QKeyEvent * event)1041 void MainWindowViewer::keyPressEvent(QKeyEvent *event)
1042 {
1043 //TODO remove unused keys
1044 int _key = event->key();
1045 Qt::KeyboardModifiers modifiers = event->modifiers();
1046
1047 if (modifiers & Qt::ShiftModifier)
1048 _key |= Qt::SHIFT;
1049 if (modifiers & Qt::ControlModifier)
1050 _key |= Qt::CTRL;
1051 if (modifiers & Qt::MetaModifier)
1052 _key |= Qt::META;
1053 if (modifiers & Qt::AltModifier)
1054 _key |= Qt::ALT;
1055
1056 QKeySequence key(_key);
1057
1058 if (key == ShortcutsManager::getShortcutsManager().getShortcut(TOGGLE_FULL_SCREEN_ACTION_Y)) {
1059 toggleFullScreen();
1060 event->accept();
1061 } else if (key == ShortcutsManager::getShortcutsManager().getShortcut(TOGGLE_TOOL_BARS_ACTION_Y)) {
1062 toggleToolBars();
1063 event->accept();
1064 } else if (key == ShortcutsManager::getShortcutsManager().getShortcut(CHANGE_FIT_ACTION_Y)) {
1065 toggleWidthHeight();
1066 event->accept();
1067 } else
1068 QWidget::keyPressEvent(event);
1069 }
1070
mouseDoubleClickEvent(QMouseEvent * event)1071 void MainWindowViewer::mouseDoubleClickEvent(QMouseEvent *event)
1072 {
1073 toggleFullScreen();
1074 event->accept();
1075 }
1076
toggleFullScreen()1077 void MainWindowViewer::toggleFullScreen()
1078 {
1079 fullscreen ? toNormal() : toFullScreen();
1080 Configuration::getConfiguration().setFullScreen(fullscreen = !fullscreen);
1081 }
1082
1083 #ifdef Q_OS_WIN //fullscreen mode in Windows for preventing this bug: QTBUG-41309 https://bugreports.qt.io/browse/QTBUG-41309
1084
toFullScreen()1085 void MainWindowViewer::toFullScreen()
1086 {
1087 fromMaximized = this->isMaximized();
1088
1089 hideToolBars();
1090 viewer->hide();
1091 viewer->fullscreen = true; //TODO, change by the right use of windowState();
1092
1093 previousWindowFlags = windowFlags();
1094 previousPos = pos();
1095 previousSize = size();
1096
1097 showNormal();
1098 setWindowFlags(previousWindowFlags | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
1099
1100 QRect r = windowHandle()->screen()->geometry();
1101
1102 r.setHeight(r.height() + 1);
1103
1104 setGeometry(r);
1105 show();
1106
1107 viewer->show();
1108 if (viewer->magnifyingGlassIsVisible())
1109 viewer->showMagnifyingGlass();
1110 }
1111
toNormal()1112 void MainWindowViewer::toNormal()
1113 {
1114 //show all
1115 viewer->hide();
1116 viewer->fullscreen = false; //TODO, change by the right use of windowState();
1117 //viewer->hideMagnifyingGlass();
1118
1119 setWindowFlags(previousWindowFlags);
1120 move(previousPos);
1121 resize(previousSize);
1122 show();
1123
1124 if (fromMaximized)
1125 showMaximized();
1126
1127 if (Configuration::getConfiguration().getShowToolbars())
1128 showToolBars();
1129 viewer->show();
1130 if (viewer->magnifyingGlassIsVisible())
1131 viewer->showMagnifyingGlass();
1132 }
1133
1134 #else
toFullScreen()1135 void MainWindowViewer::toFullScreen()
1136 {
1137 fromMaximized = this->isMaximized();
1138
1139 hideToolBars();
1140 viewer->hide();
1141 viewer->fullscreen = true; //TODO, change by the right use of windowState();
1142 setWindowState(Qt::WindowFullScreen);
1143 viewer->show();
1144 if (viewer->magnifyingGlassIsVisible())
1145 viewer->showMagnifyingGlass();
1146 }
1147
toNormal()1148 void MainWindowViewer::toNormal()
1149 {
1150 //show all
1151 viewer->hide();
1152 viewer->fullscreen = false; //TODO, change by the right use of windowState();
1153 //viewer->hideMagnifyingGlass();
1154 if (fromMaximized)
1155 showMaximized();
1156 else
1157 showNormal();
1158
1159 if (Configuration::getConfiguration().getShowToolbars())
1160 showToolBars();
1161 viewer->show();
1162 if (viewer->magnifyingGlassIsVisible())
1163 viewer->showMagnifyingGlass();
1164 }
1165 #endif
1166
toggleToolBars()1167 void MainWindowViewer::toggleToolBars()
1168 {
1169 toolbars ? hideToolBars() : showToolBars();
1170
1171 Configuration::getConfiguration().setShowToolbars(toolbars);
1172 #ifndef Q_OS_MAC
1173 comicToolBar->setMovable(false);
1174 #endif
1175 }
hideToolBars()1176 void MainWindowViewer::hideToolBars()
1177 {
1178 //hide all
1179 this->comicToolBar->hide();
1180 toolbars = false;
1181 }
1182
showToolBars()1183 void MainWindowViewer::showToolBars()
1184 {
1185 this->comicToolBar->show();
1186 toolbars = true;
1187 }
fitToWidth()1188 void MainWindowViewer::fitToWidth()
1189 {
1190 Configuration::getConfiguration().setFitMode(YACReader::FitMode::ToWidth);
1191 viewer->setZoomFactor(100);
1192 viewer->updatePage();
1193 }
fitToHeight()1194 void MainWindowViewer::fitToHeight()
1195 {
1196 Configuration::getConfiguration().setFitMode(YACReader::FitMode::ToHeight);
1197 viewer->setZoomFactor(100);
1198 viewer->updatePage();
1199 }
1200
toggleWidthHeight()1201 void MainWindowViewer::toggleWidthHeight()
1202 {
1203 //Only switch to "Fit to height" when we're in "Fit to width"
1204 if (Configuration::getConfiguration().getFitMode() == YACReader::FitMode::ToWidth) {
1205 adjustHeightAction->trigger();
1206 }
1207 //Default to "Fit to width" in all other cases
1208 else {
1209 adjustWidthAction->trigger();
1210 }
1211 }
checkNewVersion()1212 void MainWindowViewer::checkNewVersion()
1213 {
1214 Configuration &conf = Configuration::getConfiguration();
1215 QDate lastCheck = conf.getLastVersionCheck();
1216 QDate current = QDate::currentDate();
1217 if (lastCheck.isNull() || lastCheck.daysTo(current) >= conf.getNumDaysBetweenVersionChecks()) {
1218 versionChecker = new HttpVersionChecker();
1219
1220 connect(versionChecker, SIGNAL(newVersionDetected()),
1221 this, SLOT(newVersion()));
1222
1223 QTimer::singleShot(100, versionChecker, &HttpVersionChecker::get);
1224
1225 conf.setLastVersionCheck(current);
1226 }
1227 }
1228
processReset()1229 void MainWindowViewer::processReset()
1230 {
1231 if (isClient) {
1232 if (siblingComics.count() > 1) {
1233 bool openNextB = openComicOnTheRightAction->isEnabled();
1234 bool openPrevB = openComicOnTheLeftAction->isEnabled();
1235 disableActions();
1236 openComicOnTheRightAction->setEnabled(openNextB);
1237 openComicOnTheLeftAction->setEnabled(openPrevB);
1238 } else
1239 disableActions();
1240 } else
1241 disableActions();
1242 }
1243
setUpShortcutsManagement()1244 void MainWindowViewer::setUpShortcutsManagement()
1245 {
1246 //actions holder
1247 auto orphanActions = new QObject;
1248
1249 QList<QAction *> allActions;
1250 QList<QAction *> tmpList;
1251
1252 editShortcutsDialog->addActionsGroup(tr("Comics"), QIcon(":/images/shortcuts_group_comics.png"),
1253 tmpList = { openAction,
1254 openLatestComicAction,
1255 openFolderAction,
1256 saveImageAction,
1257 openComicOnTheLeftAction,
1258 openComicOnTheRightAction });
1259
1260 allActions << tmpList;
1261
1262 //keys without actions (General)
1263 QAction *toggleFullScreenAction = new QAction(tr("Toggle fullscreen mode"), orphanActions);
1264 toggleFullScreenAction->setData(TOGGLE_FULL_SCREEN_ACTION_Y);
1265 toggleFullScreenAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(TOGGLE_FULL_SCREEN_ACTION_Y));
1266
1267 QAction *toggleToolbarsAction = new QAction(tr("Hide/show toolbar"), orphanActions);
1268 toggleToolbarsAction->setData(TOGGLE_TOOL_BARS_ACTION_Y);
1269 toggleToolbarsAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(TOGGLE_TOOL_BARS_ACTION_Y));
1270
1271 editShortcutsDialog->addActionsGroup(tr("General"), QIcon(":/images/shortcuts_group_general.png"),
1272 tmpList = QList<QAction *>()
1273 << optionsAction
1274 << helpAboutAction
1275 << showShorcutsAction
1276 << showInfoAction
1277 << closeAction
1278 << showDictionaryAction
1279 << showFlowAction
1280 << toggleFullScreenAction
1281 << toggleToolbarsAction
1282 << showEditShortcutsAction
1283 #ifdef Q_OS_MAC
1284 << newInstanceAction
1285 #endif
1286 );
1287
1288 allActions << tmpList;
1289
1290 //keys without actions (MGlass)
1291 auto sizeUpMglassAction = new QAction(tr("Size up magnifying glass"), orphanActions);
1292 sizeUpMglassAction->setData(SIZE_UP_MGLASS_ACTION_Y);
1293 sizeUpMglassAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SIZE_UP_MGLASS_ACTION_Y));
1294
1295 auto sizeDownMglassAction = new QAction(tr("Size down magnifying glass"), orphanActions);
1296 sizeDownMglassAction->setData(SIZE_DOWN_MGLASS_ACTION_Y);
1297 sizeDownMglassAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(SIZE_DOWN_MGLASS_ACTION_Y));
1298
1299 auto zoomInMglassAction = new QAction(tr("Zoom in magnifying glass"), orphanActions);
1300 zoomInMglassAction->setData(ZOOM_IN_MGLASS_ACTION_Y);
1301 zoomInMglassAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_IN_MGLASS_ACTION_Y));
1302
1303 auto zoomOutMglassAction = new QAction(tr("Zoom out magnifying glass"), orphanActions);
1304 zoomOutMglassAction->setData(ZOOM_OUT_MGLASS_ACTION_Y);
1305 zoomOutMglassAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(ZOOM_OUT_MGLASS_ACTION_Y));
1306
1307 editShortcutsDialog->addActionsGroup(tr("Magnifiying glass"), QIcon(":/images/shortcuts_group_mglass.png"),
1308 tmpList = QList<QAction *>()
1309 << showMagnifyingGlassAction
1310 << sizeUpMglassAction
1311 << sizeDownMglassAction
1312 << zoomInMglassAction
1313 << zoomOutMglassAction);
1314
1315 allActions << tmpList;
1316
1317 //keys without actions
1318 auto toggleFitToScreenAction = new QAction(tr("Toggle between fit to width and fit to height"), orphanActions);
1319 toggleFitToScreenAction->setData(CHANGE_FIT_ACTION_Y);
1320 toggleFitToScreenAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(CHANGE_FIT_ACTION_Y));
1321
1322 editShortcutsDialog->addActionsGroup(tr("Page adjustement"), QIcon(":/images/shortcuts_group_page.png"),
1323 tmpList = QList<QAction *>()
1324 << adjustHeightAction
1325 << adjustWidthAction
1326 << toggleFitToScreenAction
1327 << leftRotationAction
1328 << rightRotationAction
1329 << doublePageAction
1330 << doubleMangaPageAction
1331 << adjustToFullSizeAction
1332 << fitToPageAction
1333 << increasePageZoomAction
1334 << decreasePageZoomAction
1335 << resetZoomAction);
1336
1337 allActions << tmpList;
1338
1339 auto autoScrollForwardAction = new QAction(tr("Autoscroll down"), orphanActions);
1340 autoScrollForwardAction->setData(AUTO_SCROLL_FORWARD_ACTION_Y);
1341 autoScrollForwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_ACTION_Y));
1342
1343 auto autoScrollBackwardAction = new QAction(tr("Autoscroll up"), orphanActions);
1344 autoScrollBackwardAction->setData(AUTO_SCROLL_BACKWARD_ACTION_Y);
1345 autoScrollBackwardAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_ACTION_Y));
1346
1347 auto autoScrollForwardHorizontalFirstAction = new QAction(tr("Autoscroll forward, horizontal first"), orphanActions);
1348 autoScrollForwardHorizontalFirstAction->setData(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y);
1349 autoScrollForwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_HORIZONTAL_FIRST_ACTION_Y));
1350
1351 auto autoScrollBackwardHorizontalFirstAction = new QAction(tr("Autoscroll backward, horizontal first"), orphanActions);
1352 autoScrollBackwardHorizontalFirstAction->setData(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y);
1353 autoScrollBackwardHorizontalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_HORIZONTAL_FIRST_ACTION_Y));
1354
1355 auto autoScrollForwardVerticalFirstAction = new QAction(tr("Autoscroll forward, vertical first"), orphanActions);
1356 autoScrollForwardVerticalFirstAction->setData(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y);
1357 autoScrollForwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_FORWARD_VERTICAL_FIRST_ACTION_Y));
1358
1359 auto autoScrollBackwardVerticalFirstAction = new QAction(tr("Autoscroll backward, vertical first"), orphanActions);
1360 autoScrollBackwardVerticalFirstAction->setData(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y);
1361 autoScrollBackwardVerticalFirstAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(AUTO_SCROLL_BACKWARD_VERTICAL_FIRST_ACTION_Y));
1362
1363 auto moveDownAction = new QAction(tr("Move down"), orphanActions);
1364 moveDownAction->setData(MOVE_DOWN_ACTION_Y);
1365 moveDownAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_DOWN_ACTION_Y));
1366
1367 auto moveUpAction = new QAction(tr("Move up"), orphanActions);
1368 moveUpAction->setData(MOVE_UP_ACTION_Y);
1369 moveUpAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_UP_ACTION_Y));
1370
1371 auto moveLeftAction = new QAction(tr("Move left"), orphanActions);
1372 moveLeftAction->setData(MOVE_LEFT_ACTION_Y);
1373 moveLeftAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_LEFT_ACTION_Y));
1374
1375 auto moveRightAction = new QAction(tr("Move right"), orphanActions);
1376 moveRightAction->setData(MOVE_RIGHT_ACTION_Y);
1377 moveRightAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(MOVE_RIGHT_ACTION_Y));
1378
1379 auto goToFirstPageAction = new QAction(tr("Go to the first page"), orphanActions);
1380 goToFirstPageAction->setData(GO_TO_FIRST_PAGE_ACTION_Y);
1381 goToFirstPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_FIRST_PAGE_ACTION_Y));
1382
1383 auto goToLastPageAction = new QAction(tr("Go to the last page"), orphanActions);
1384 goToLastPageAction->setData(GO_TO_LAST_PAGE_ACTION_Y);
1385 goToLastPageAction->setShortcut(ShortcutsManager::getShortcutsManager().getShortcut(GO_TO_LAST_PAGE_ACTION_Y));
1386
1387 editShortcutsDialog->addActionsGroup(tr("Reading"), QIcon(":/images/shortcuts_group_reading.png"),
1388 tmpList = QList<QAction *>()
1389 << goToPageOnTheRightAction
1390 << goToPageOnTheLeftAction
1391 << setBookmarkAction
1392 << showBookmarksAction
1393 << autoScrollForwardAction
1394 << autoScrollBackwardAction
1395 << autoScrollForwardHorizontalFirstAction
1396 << autoScrollBackwardHorizontalFirstAction
1397 << autoScrollForwardVerticalFirstAction
1398 << autoScrollBackwardVerticalFirstAction
1399 << moveDownAction
1400 << moveUpAction
1401 << moveLeftAction
1402 << moveRightAction
1403 << goToFirstPageAction
1404 << goToLastPageAction
1405 << goToPageAction);
1406
1407 allActions << tmpList;
1408
1409 ShortcutsManager::getShortcutsManager().registerActions(allActions);
1410 }
1411
doubleMangaPageSwitch()1412 void MainWindowViewer::doubleMangaPageSwitch()
1413 {
1414 if (isClient) {
1415 int index = siblingComics.indexOf(currentComicDB);
1416 updatePrevNextActions(index > 0, index + 1 < siblingComics.size());
1417 } else {
1418 updatePrevNextActions(!previousComicPath.isEmpty(), !nextComicPath.isEmpty());
1419 }
1420 }
1421
toggleFitToWidthSlider()1422 void MainWindowViewer::toggleFitToWidthSlider()
1423 {
1424 int y;
1425
1426 #ifdef Q_OS_MAC
1427 y = 0;
1428 #else
1429 y = this->comicToolBar->frameSize().height();
1430 #endif
1431
1432 if (zoomSliderAction->isVisible()) {
1433 zoomSliderAction->hide();
1434 } else {
1435 zoomSliderAction->move(250, y);
1436 zoomSliderAction->show();
1437 }
1438 }
1439
newVersion()1440 void MainWindowViewer::newVersion()
1441 {
1442 QMessageBox msgBox;
1443 msgBox.setText(tr("There is a new version available"));
1444 msgBox.setInformativeText(tr("Do you want to download the new version?"));
1445 msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Ignore | QMessageBox::No);
1446 msgBox.setDefaultButton(QMessageBox::Yes);
1447 msgBox.button(QMessageBox::Ignore)->setText(tr("Remind me in 14 days"));
1448 msgBox.button(QMessageBox::No)->setText(tr("Not now"));
1449 msgBox.setWindowFlags(Qt::WindowStaysOnTopHint);
1450 msgBox.setModal(true);
1451 int ret = msgBox.exec();
1452
1453 switch (ret) {
1454 case QMessageBox::Yes:
1455 QDesktopServices::openUrl(QUrl("http://www.yacreader.com"));
1456 break;
1457 case QMessageBox::No:
1458 Configuration::getConfiguration().setNumDaysBetweenVersionChecks(1);
1459 break;
1460 case QMessageBox::Ignore:
1461 Configuration::getConfiguration().setNumDaysBetweenVersionChecks(14);
1462 break;
1463 }
1464 }
1465
closeEvent(QCloseEvent * event)1466 void MainWindowViewer::closeEvent(QCloseEvent *event)
1467 {
1468 if (isClient)
1469 sendComic();
1470
1471 viewer->save();
1472 Configuration &conf = Configuration::getConfiguration();
1473 if (!fullscreen && !isMaximized())
1474 conf.setGeometry(saveGeometry());
1475 conf.setMaximized(isMaximized());
1476
1477 event->accept();
1478 }
1479
openPreviousComic()1480 void MainWindowViewer::openPreviousComic()
1481 {
1482 if (!siblingComics.isEmpty() && isClient) {
1483 sendComic();
1484
1485 int currentIndex = siblingComics.indexOf(currentComicDB);
1486 if (currentIndex == -1)
1487 return;
1488 if (currentIndex - 1 >= 0 && currentIndex - 1 < siblingComics.count()) {
1489 siblingComics[currentIndex] = currentComicDB; //updated
1490 currentComicDB = siblingComics.at(currentIndex - 1);
1491 open(currentDirectory + currentComicDB.path, currentComicDB, siblingComics);
1492 }
1493 return;
1494 }
1495 if (!previousComicPath.isEmpty()) {
1496 openSiblingComic(previousComicPath);
1497 }
1498 }
1499
openNextComic()1500 void MainWindowViewer::openNextComic()
1501 {
1502 if (!siblingComics.isEmpty() && isClient) {
1503 sendComic();
1504
1505 int currentIndex = siblingComics.indexOf(currentComicDB);
1506 if (currentIndex == -1)
1507 return;
1508 if (currentIndex + 1 > 0 && currentIndex + 1 < siblingComics.count()) {
1509 siblingComics[currentIndex] = currentComicDB; //updated
1510 currentComicDB = siblingComics.at(currentIndex + 1);
1511 open(currentDirectory + currentComicDB.path, currentComicDB, siblingComics);
1512 }
1513
1514 return;
1515 }
1516 if (!nextComicPath.isEmpty()) {
1517 openSiblingComic(nextComicPath);
1518 }
1519 }
1520
openLeftComic()1521 void MainWindowViewer::openLeftComic()
1522 {
1523 if (viewer->getIsMangaMode()) {
1524 openNextComic();
1525 } else {
1526 openPreviousComic();
1527 }
1528 }
1529
openRightComic()1530 void MainWindowViewer::openRightComic()
1531 {
1532 if (viewer->getIsMangaMode()) {
1533 openPreviousComic();
1534 } else {
1535 openNextComic();
1536 }
1537 }
1538
getSiblingComics(QString path,QString currentComic)1539 void MainWindowViewer::getSiblingComics(QString path, QString currentComic)
1540 {
1541 QDir d(path);
1542 d.setFilter(QDir::Files | QDir::NoDotAndDotDot);
1543 #ifndef use_unarr
1544 d.setNameFilters(QStringList() << "*.cbr"
1545 << "*.cbz"
1546 << "*.rar"
1547 << "*.zip"
1548 << "*.tar"
1549 << "*.pdf"
1550 << "*.7z"
1551 << "*.cb7"
1552 << "*.arj"
1553 << "*.cbt");
1554 #else
1555 d.setNameFilters(QStringList() << "*.cbr"
1556 << "*.cbz"
1557 << "*.rar"
1558 << "*.zip"
1559 << "*.tar"
1560 << "*.pdf"
1561 << "*.cbt");
1562 #endif
1563 d.setSorting(QDir::Name | QDir::IgnoreCase | QDir::LocaleAware);
1564 QStringList list = d.entryList();
1565 std::sort(list.begin(), list.end(), naturalSortLessThanCI);
1566 int index = list.indexOf(currentComic);
1567 if (index == -1) //comic not found
1568 {
1569 /*QFile f(QCoreApplication::applicationDirPath()+"/errorLog.txt");
1570 if(!f.open(QIODevice::WriteOnly))
1571 {
1572 QMessageBox::critical(NULL,tr("Saving error log file...."),tr("There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder."));
1573 }
1574 else
1575 {
1576 QTextStream txtS(&f);
1577 txtS << "METHOD : MainWindowViewer::getSiblingComics" << '\n';
1578 txtS << "ERROR : current comic not found in its own path" << '\n';
1579 txtS << path << '\n';
1580 txtS << currentComic << '\n';
1581 txtS << "Comic list count : " + list.count() << '\n';
1582 foreach(QString s, list){
1583 txtS << s << '\n';
1584 }
1585 f.close();
1586 }*/
1587 }
1588
1589 previousComicPath = nextComicPath = "";
1590 if (index > 0) {
1591 previousComicPath = path + "/" + list.at(index - 1);
1592 }
1593
1594 if (index + 1 < list.count()) {
1595 nextComicPath = path + "/" + list.at(index + 1);
1596 }
1597
1598 updatePrevNextActions(index > 0, index + 1 < list.count());
1599 }
1600
dropEvent(QDropEvent * event)1601 void MainWindowViewer::dropEvent(QDropEvent *event)
1602 {
1603 QList<QUrl> urlList;
1604 QString fName;
1605 QFileInfo info;
1606
1607 if (event->mimeData()->hasUrls()) {
1608 urlList = event->mimeData()->urls();
1609
1610 if (urlList.size() > 0) {
1611 fName = urlList[0].toLocalFile(); // convert first QUrl to local path
1612 info.setFile(fName); // information about file
1613 if (info.isFile()) {
1614 QStringList imageSuffixs = Comic::getSupportedImageLiteralFormats();
1615 if (imageSuffixs.contains(info.suffix())) //image dropped
1616 openFolderFromPath(info.absoluteDir().absolutePath(), info.fileName());
1617 else
1618 openComicFromPath(fName); // if is file, setText
1619 } else if (info.isDir())
1620 openFolderFromPath(fName);
1621
1622 isClient = false;
1623 }
1624 }
1625
1626 event->acceptProposedAction();
1627 }
dragEnterEvent(QDragEnterEvent * event)1628 void MainWindowViewer::dragEnterEvent(QDragEnterEvent *event)
1629 {
1630 // accept just text/uri-list mime format
1631 if (event->mimeData()->hasFormat("text/uri-list")) {
1632 event->acceptProposedAction();
1633 isClient = false;
1634 }
1635 }
1636
alwaysOnTopSwitch()1637 void MainWindowViewer::alwaysOnTopSwitch()
1638 {
1639 if (!Configuration::getConfiguration().getAlwaysOnTop()) {
1640 setWindowFlags(this->windowFlags() | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint); //always on top
1641 show();
1642 } else {
1643 setWindowFlags(this->windowFlags() ^ (Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint));
1644 show();
1645 }
1646 Configuration::getConfiguration().setAlwaysOnTop(!Configuration::getConfiguration().getAlwaysOnTop());
1647 }
1648
adjustToFullSizeSwitch()1649 void MainWindowViewer::adjustToFullSizeSwitch()
1650 {
1651 Configuration::getConfiguration().setFitMode(YACReader::FitMode::FullRes);
1652 viewer->setZoomFactor(100);
1653 viewer->updatePage();
1654 }
1655
fitToPageSwitch()1656 void MainWindowViewer::fitToPageSwitch()
1657 {
1658 Configuration::getConfiguration().setFitMode(YACReader::FitMode::FullPage);
1659 viewer->setZoomFactor(100);
1660 viewer->updatePage();
1661 }
1662
resetZoomLevel()1663 void MainWindowViewer::resetZoomLevel()
1664 {
1665 viewer->setZoomFactor(100);
1666 viewer->updatePage();
1667 }
1668
increasePageZoomLevel()1669 void MainWindowViewer::increasePageZoomLevel()
1670 {
1671 viewer->increaseZoomFactor();
1672 }
1673
decreasePageZoomLevel()1674 void MainWindowViewer::decreasePageZoomLevel()
1675 {
1676 viewer->decreaseZoomFactor();
1677 }
1678
sendComic()1679 void MainWindowViewer::sendComic()
1680 {
1681 auto client = new YACReaderLocalClient;
1682
1683 connect(client, &YACReaderLocalClient::finished, client, &YACReaderLocalClient::deleteLater);
1684 currentComicDB.info.lastTimeOpened = QDateTime::currentMSecsSinceEpoch() / 1000;
1685
1686 viewer->updateComic(currentComicDB);
1687
1688 int currentIndex = siblingComics.indexOf(currentComicDB);
1689 bool sendNextComicInfo = (currentComicDB.info.currentPage == currentComicDB.info.numPages) && (currentIndex + 1 > 0 && currentIndex + 1 < siblingComics.count());
1690
1691 if (sendNextComicInfo) {
1692 ComicDB &nextComic = siblingComics[currentIndex + 1];
1693 nextComic.info.hasBeenOpened = true;
1694 int retries = 1;
1695 while (!client->sendComicInfo(libraryId, currentComicDB, nextComic.id) && retries != 0)
1696 retries--;
1697 } else {
1698 int retries = 1;
1699 while (!client->sendComicInfo(libraryId, currentComicDB) && retries != 0)
1700 retries--;
1701 }
1702 }
1703
updatePrevNextActions(bool thereIsPrevious,bool thereIsNext)1704 void MainWindowViewer::updatePrevNextActions(bool thereIsPrevious, bool thereIsNext)
1705 {
1706 if (thereIsPrevious) {
1707 if (viewer->getIsMangaMode()) {
1708 openComicOnTheRightAction->setDisabled(false);
1709 } else {
1710 openComicOnTheLeftAction->setDisabled(false);
1711 }
1712 } else {
1713 if (viewer->getIsMangaMode()) {
1714 openComicOnTheRightAction->setDisabled(true);
1715 } else {
1716 openComicOnTheLeftAction->setDisabled(true);
1717 }
1718 }
1719
1720 if (thereIsNext) {
1721 if (viewer->getIsMangaMode()) {
1722 openComicOnTheLeftAction->setDisabled(false);
1723 } else {
1724 openComicOnTheRightAction->setDisabled(false);
1725 }
1726 } else {
1727 if (viewer->getIsMangaMode()) {
1728 openComicOnTheLeftAction->setDisabled(true);
1729 } else {
1730 openComicOnTheRightAction->setDisabled(true);
1731 }
1732 }
1733
1734 if (viewer->getIsMangaMode()) {
1735 openComicOnTheLeftAction->setToolTip(tr("Open next comic"));
1736 openComicOnTheRightAction->setToolTip(tr("Open previous comic"));
1737 goToPageOnTheLeftAction->setToolTip(tr("Go to next page"));
1738 goToPageOnTheRightAction->setToolTip(tr("Go to previous page"));
1739 } else {
1740 openComicOnTheLeftAction->setToolTip(tr("Open previous comic"));
1741 openComicOnTheRightAction->setToolTip(tr("Open next comic"));
1742 goToPageOnTheLeftAction->setToolTip(tr("Go to previous page"));
1743 goToPageOnTheRightAction->setToolTip(tr("Go to next page"));
1744 }
1745 }
1746