1 #ifndef __LIBRARYWINDOW_H
2 #define __LIBRARYWINDOW_H
3 
4 #include <QMainWindow>
5 #include <QMap>
6 #include <QModelIndex>
7 #include <QFileInfo>
8 
9 #include "yacreader_global_gui.h"
10 #include "yacreader_libraries.h"
11 
12 #include "yacreader_navigation_controller.h"
13 #include "comic_query_result_processor.h"
14 #include "folder_query_result_processor.h"
15 
16 #include "comic_model.h"
17 
18 #include <future>
19 #include <memory>
20 
21 #ifdef Q_OS_MAC
22 #include "yacreader_macosx_toolbar.h"
23 #endif
24 
25 class QTreeView;
26 class QDirModel;
27 class QAction;
28 class QToolBar;
29 class QComboBox;
30 class QThread;
31 class QStackedWidget;
32 class YACReaderSearchLineEdit;
33 class CreateLibraryDialog;
34 class ExportLibraryDialog;
35 class ImportLibraryDialog;
36 class ExportComicsInfoDialog;
37 class ImportComicsInfoDialog;
38 class AddLibraryDialog;
39 class LibraryCreator;
40 class HelpAboutDialog;
41 class RenameLibraryDialog;
42 class PropertiesDialog;
43 class PackageManager;
44 class QCheckBox;
45 class QPushButton;
46 class ComicModel;
47 class QSplitter;
48 class FolderModel;
49 class FolderModelProxy;
50 class QItemSelectionModel;
51 class QString;
52 class QLabel;
53 class NoLibrariesWidget;
54 class OptionsDialog;
55 class ServerConfigDialog;
56 class QCloseEvent;
57 class ImportWidget;
58 class QSettings;
59 class LibraryItem;
60 class YACReaderTableView;
61 class YACReaderSideBar;
62 class YACReaderLibraryListWidget;
63 class YACReaderFoldersView;
64 class YACReaderMainToolBar;
65 class ComicVineDialog;
66 class ComicsView;
67 class ClassicComicsView;
68 class GridComicsView;
69 class ComicsViewTransition;
70 class EmptyFolderWidget;
71 class NoSearchResultsWidget;
72 class EditShortcutsDialog;
73 class ComicFilesManager;
74 class QProgressDialog;
75 class ReadingListModel;
76 class ReadingListModelProxy;
77 class YACReaderReadingListsView;
78 class YACReaderHistoryController;
79 class EmptyLabelWidget;
80 class EmptySpecialListWidget;
81 class EmptyReadingListWidget;
82 
83 namespace YACReader {
84 class TrayIconController;
85 }
86 
87 #include "comic_db.h"
88 
89 using namespace YACReader;
90 
91 class LibraryWindow : public QMainWindow
92 {
93     friend class YACReaderNavigationController;
94 
95     Q_OBJECT
96 public:
97     YACReaderSideBar *sideBar;
98 
99     CreateLibraryDialog *createLibraryDialog;
100     ExportLibraryDialog *exportLibraryDialog;
101     ImportLibraryDialog *importLibraryDialog;
102     ExportComicsInfoDialog *exportComicsInfoDialog;
103     ImportComicsInfoDialog *importComicsInfoDialog;
104     AddLibraryDialog *addLibraryDialog;
105     LibraryCreator *libraryCreator;
106     HelpAboutDialog *had;
107     RenameLibraryDialog *renameLibraryDialog;
108     PropertiesDialog *propertiesDialog;
109     ComicVineDialog *comicVineDialog;
110     EditShortcutsDialog *editShortcutsDialog;
111     //YACReaderSocialDialog * socialDialog;
112     bool fullscreen;
113     bool importedCovers; //if true, the library is read only (not updates,open comic or properties)
114     bool fromMaximized;
115 
116     PackageManager *packageManager;
117 
118     QSize slideSizeW;
119     QSize slideSizeF;
120     //search filter
121 #ifdef Q_OS_MAC
122     YACReaderMacOSXSearchLineEdit *searchEdit;
123 #else
124     YACReaderSearchLineEdit *searchEdit;
125 #endif
126 
127     QString previousFilter;
128     QCheckBox *includeComicsCheckBox;
129     //-------------
130 
131     YACReaderNavigationController *navigationController;
132     YACReaderComicsViewsManager *comicsViewsManager;
133 
134     YACReaderFoldersView *foldersView;
135     YACReaderReadingListsView *listsView;
136     YACReaderLibraryListWidget *selectedLibrary;
137     FolderModel *foldersModel;
138     FolderModelProxy *foldersModelProxy;
139     ComicModel *comicsModel;
140     ReadingListModel *listsModel;
141     ReadingListModelProxy *listsModelProxy;
142     //QStringList paths;
143     YACReaderLibraries libraries;
144 
145     QStackedWidget *mainWidget;
146     NoLibrariesWidget *noLibrariesWidget;
147     ImportWidget *importWidget;
148 
149     bool fetching;
150 
151     int i;
152 
153     QAction *backAction;
154     QAction *forwardAction;
155 
156     QAction *openComicAction;
157     QAction *createLibraryAction;
158     QAction *openLibraryAction;
159 
160     QAction *exportComicsInfoAction;
161     QAction *importComicsInfoAction;
162 
163     QAction *exportLibraryAction;
164     QAction *importLibraryAction;
165 
166     QAction *updateLibraryAction;
167     QAction *removeLibraryAction;
168     QAction *helpAboutAction;
169     QAction *renameLibraryAction;
170 #ifndef Q_OS_MAC
171     QAction *toggleFullScreenAction;
172 #endif
173     QAction *optionsAction;
174     QAction *serverConfigAction;
175     QAction *toggleComicsViewAction;
176     //QAction * socialAction;
177 
178     //tree actions
179     QAction *addFolderAction;
180     QAction *deleteFolderAction;
181     //--
182     QAction *setRootIndexAction;
183     QAction *expandAllNodesAction;
184     QAction *colapseAllNodesAction;
185 
186     QAction *openContainingFolderAction;
187     QAction *saveCoversToAction;
188     //--
189     QAction *setFolderAsNotCompletedAction;
190     QAction *setFolderAsCompletedAction;
191     //--
192     QAction *setFolderAsReadAction;
193     QAction *setFolderAsUnreadAction;
194     QAction *setFolderAsMangaAction;
195     QAction *setFolderAsNormalAction;
196 
197     QAction *openContainingFolderComicAction;
198     QAction *setAsReadAction;
199     QAction *setAsNonReadAction;
200 
201     QAction *setMangaAction;
202     QAction *setNormalAction;
203 
204     //QAction * setAllAsReadAction;
205     //QAction * setAllAsNonReadAction;
206     QAction *showHideMarksAction;
207     QAction *getInfoAction; //comic vine
208     QAction *resetComicRatingAction;
209 
210     //edit info actions
211     QAction *selectAllComicsAction;
212     QAction *editSelectedComicsAction;
213     QAction *asignOrderAction;
214     QAction *forceCoverExtractedAction;
215     QAction *deleteComicsAction;
216 
217     QAction *focusSearchLineAction;
218     QAction *focusComicsViewAction;
219 
220     QAction *showEditShortcutsAction;
221 
222     QAction *quitAction;
223 
224     QAction *updateFolderAction;
225     QAction *updateCurrentFolderAction;
226 
227     //reading lists actions
228     QAction *addReadingListAction;
229     QAction *deleteReadingListAction;
230     QAction *addLabelAction;
231     QAction *renameListAction;
232     //--
233     QAction *addToMenuAction;
234     QAction *addToFavoritesAction;
235 
236 #ifdef Q_OS_MAC
237     YACReaderMacOSXToolbar *libraryToolBar;
238 #else
239     YACReaderMainToolBar *libraryToolBar;
240 #endif
241     QToolBar *treeActions;
242     QToolBar *comicsToolBar;
243     QToolBar *editInfoToolBar;
244 
245     OptionsDialog *optionsDialog;
246     ServerConfigDialog *serverConfigDialog;
247 
248     QString libraryPath;
249     QString comicsPath;
250 
251     QString _lastAdded;
252     QString _sourceLastAdded;
253 
254     //QModelIndex _rootIndex;
255     //QModelIndex _rootIndexCV;
256     //QModelIndex updateDestination;
257 
258     quint64 _comicIdEdited;
259 
260     enum NavigationStatus {
261         Normal, //
262         Searching
263     };
264 
265     NavigationStatus status;
266 
267     void createSettings();
268     void setupOpenglSetting();
269     void setupUI();
270     void createActions();
271     void createToolBars();
272     void createMenus();
273     void createConnections();
274     void doLayout();
275     void doDialogs();
276     void setUpShortcutsManagement();
277     void doModels();
278 
279     //ACTIONS MANAGEMENT
280     void disableComicsActions(bool disabled);
281     void disableLibrariesActions(bool disabled);
282     void disableNoUpdatedLibrariesActions(bool disabled);
283     void disableFoldersActions(bool disabled);
284 
285     void disableAllActions();
286     //void disableActions();
287     //void enableActions();
288     //void enableLibraryActions();
289 
290     QString currentPath();
291     QString currentFolderPath();
292 
293     //settings
294     QSettings *settings;
295 
296     //navigation backward and forward
297     YACReaderHistoryController *historyController;
298 
299     bool removeError;
300 
301     //QTBUG-41883
302     QSize _size;
303     QPoint _pos;
304 
305 protected:
306     virtual void closeEvent(QCloseEvent *event);
307 
308 public:
309     LibraryWindow();
310 
311 signals:
312     void libraryUpgraded(const QString &libraryName);
313     void errorUpgradingLibrary(const QString &path);
314 public slots:
315     void loadLibrary(const QString &path);
316     void selectSubfolder(const QModelIndex &mi, int child);
317     void checkEmptyFolder();
318     void openComic();
319     void openComic(const ComicDB &comic, const ComicModel::Mode mode);
320     void createLibrary();
321     void create(QString source, QString dest, QString name);
322     void showAddLibrary();
323     void openLibrary(QString path, QString name);
324     void loadLibraries();
325     void saveLibraries();
326     void reloadCurrentLibrary();
327     void openLastCreated();
328     void updateLibrary();
329     //void deleteLibrary();
330     void openContainingFolder();
331     void setFolderAsNotCompleted();
332     void setFolderAsCompleted();
333     void setFolderAsRead();
334     void setFolderAsUnread();
335     void setFolderAsManga();
336     void setFolderAsNormal();
337     void openContainingFolderComic();
338     void deleteCurrentLibrary();
339     void removeLibrary();
340     void renameLibrary();
341     void rename(QString newName);
342     void cancelCreating();
343     void stopLibraryCreator();
344     void setRootIndex();
345     void toggleFullScreen();
346     void toNormal();
347     void toFullScreen();
348     void setSearchFilter(const YACReader::SearchModifiers modifier, QString filter);
349     void setComicSearchFilterData(QList<ComicItem *> *, const QString &);
350     void setFolderSearchFilterData(QMap<unsigned long long int, FolderItem *> *filteredItems, FolderItem *root);
351     void clearSearchFilter();
352     void showProperties();
353     void exportLibrary(QString destPath);
354     void importLibrary(QString clc, QString destPath, QString name);
355     void reloadOptions();
356     void setCurrentComicsStatusReaded(YACReaderComicReadStatus readStatus);
357     void setCurrentComicReaded();
358     void setCurrentComicUnreaded();
359     void setSelectedComicsAsNormal();
360     void setSelectedComicsAsManga();
361     void showExportComicsInfo();
362     void showImportComicsInfo();
363     void asignNumbers();
364     void showNoLibrariesWidget();
365     void showRootWidget();
366     void showImportingWidget();
367     void manageCreatingError(const QString &error);
368     void manageUpdatingError(const QString &error);
369     void manageOpeningLibraryError(const QString &error);
370     QModelIndexList getSelectedComics();
371     void deleteComics();
372     void deleteComicsFromDisk();
373     void deleteComicsFromList();
374     //void showSocial();
375     void showFoldersContextMenu(const QPoint &point);
376     void libraryAlreadyExists(const QString &name);
377     void importLibraryPackage();
378     void updateComicsView(quint64 libraryId, const ComicDB &comic);
379     void showComicVineScraper();
380     void setRemoveError();
381     void checkRemoveError();
382     void resetComicRating();
383     void checkSearchNumResults(int numResults);
384     void loadCoversFromCurrentModel();
385     void copyAndImportComicsToCurrentFolder(const QList<QPair<QString, QString>> &comics);
386     void moveAndImportComicsToCurrentFolder(const QList<QPair<QString, QString>> &comics);
387     void copyAndImportComicsToFolder(const QList<QPair<QString, QString>> &comics, const QModelIndex &miFolder);
388     void moveAndImportComicsToFolder(const QList<QPair<QString, QString>> &comics, const QModelIndex &miFolder);
389     void processComicFiles(ComicFilesManager *comicFilesManager, QProgressDialog *progressDialog);
390     void updateCopyMoveFolderDestination(const QModelIndex &mi); //imports new comics from the current folder
391     void updateCurrentFolder();
392     void updateFolder(const QModelIndex &miFolder);
393     QProgressDialog *newProgressDialog(const QString &label, int maxValue);
394     void reloadAfterCopyMove(const QModelIndex &mi);
395     QModelIndex getCurrentFolderIndex();
396     void enableNeededActions();
397     void addFolderToCurrentIndex();
398     void deleteSelectedFolder();
399     void errorDeletingFolder();
400     void addNewReadingList();
401     void deleteSelectedReadingList();
402     void showAddNewLabelDialog();
403     void showRenameCurrentList();
404     void addSelectedComicsToFavorites();
405     void showComicsViewContextMenu(const QPoint &point);
406     void showComicsItemContextMenu(const QPoint &point);
407     void setupAddToSubmenu(QMenu &menu);
408     void onAddComicsToLabel();
409     void setToolbarTitle(const QModelIndex &modelIndex);
410     void saveSelectedCoversTo();
411     void checkMaxNumLibraries();
412     void showErrorUpgradingLibrary(const QString &path);
413 
414     void prepareToCloseApp();
415     void closeApp();
416 
417     void afterLaunchTasks();
418 
419 private:
420     //fullscreen mode in Windows for preventing this bug: QTBUG-41309 https://bugreports.qt.io/browse/QTBUG-41309
421     Qt::WindowFlags previousWindowFlags;
422     QPoint previousPos;
423     QSize previousSize;
424     std::future<void> upgradeLibraryFuture;
425 
426     TrayIconController *trayIconController;
427     ComicQueryResultProcessor comicQueryResultProcessor;
428     std::unique_ptr<FolderQueryResultProcessor> folderQueryResultProcessor;
429 };
430 
431 #endif
432