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