1 /*
2  main_window_presenter.h     MindForger thinking notebook
3 
4  Copyright (C) 2016-2020 Martin Dvorak <martin.dvorak@mindforger.com>
5 
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public License
8  as published by the Free Software Foundation; either version 2
9  of the License, or (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #ifndef M8RUI_MAIN_WINDOW_PRESENTER_H
20 #define M8RUI_MAIN_WINDOW_PRESENTER_H
21 
22 #include "../../lib/src/mind/mind.h"
23 #include "../../lib/src/mind/ai/autolinking_preprocessor.h"
24 #include "../../lib/src/representations/html/html_outline_representation.h"
25 #include "../../lib/src/representations/markdown/markdown_configuration_representation.h"
26 
27 #include "main_window_view.h"
28 #include "main_menu_presenter.h"
29 
30 #include "gear/async_task_notifications_distributor.h"
31 #ifdef MF_NER
32     #include "ner_main_window_worker_thread.h"
33 #endif
34 #include "cli_n_breadcrumbs_presenter.h"
35 #include "orloj_presenter.h"
36 #include "status_bar_presenter.h"
37 
38 #include "dialogs/outline_new_dialog.h"
39 #include "dialogs/note_new_dialog.h"
40 #include "dialogs/fts_dialog_presenter.h"
41 #include "dialogs/find_outline_by_name_dialog.h"
42 #include "dialogs/find_outline_by_tag_dialog.h"
43 #include "dialogs/find_note_by_name_dialog.h"
44 #include "dialogs/find_note_by_tag_dialog.h"
45 #include "dialogs/refactor_note_to_outline_dialog.h"
46 #include "dialogs/scope_dialog.h"
47 #include "dialogs/configuration_dialog.h"
48 #include "dialogs/insert_image_dialog.h"
49 #include "dialogs/insert_link_dialog.h"
50 #include "dialogs/rows_and_depth_dialog.h"
51 #include "dialogs/new_repository_dialog.h"
52 #include "dialogs/new_file_dialog.h"
53 #include "dialogs/export_file_dialog.h"
54 #include "dialogs/ner_choose_tag_types_dialog.h"
55 #include "dialogs/ner_result_dialog.h"
56 
57 #include <QtWidgets>
58 #include <QtConcurrent/QtConcurrent>
59 
60 namespace m8r {
61 
62 class MainWindowView;
63 class MainMenuPresenter;
64 class CliAndBreadcrumbsPresenter;
65 class OrlojPresenter;
66 class StatusBarPresenter;
67 class AsyncTaskNotificationsDistributor;
68 class NerMainWindowWorkerThread;
69 class FtsDialog;
70 class FtsDialogPresenter;
71 
72 /**
73  * @brief MindForger main window Presenter.
74  *
75  * This class is used to demonstrate MindForger's MVP frontend architecture
76  * and code conventions.
77  *
78  * Main window presenter:
79  *   * Implements core UI application logic for other presenters and views.
80  *   * Provides index of all UI presenters.
81  */
82 class MainWindowPresenter : public QObject
83 {
84     Q_OBJECT
85 
86     static QString NEW_MD_FILE_TITLE;
87     static QString NEW_MD_FILE_EXTENSION;
88     static QString EXPORT_O_TO_HTML_TITLE;
89     static QString EXPORT_O_TO_HTML_EXTENSION;
90 
91 private:
92     MainWindowView& view;
93 
94     Configuration& config;
95     Mind* mind;
96 
97     AsyncTaskNotificationsDistributor* distributor;
98 #ifdef MF_NER
99     NerMainWindowWorkerThread* nerWorker;
100 #endif
101 
102     MarkdownOutlineRepresentation* mdRepresentation;
103     HtmlOutlineRepresentation* htmlRepresentation;
104     MarkdownConfigurationRepresentation* mdConfigRepresentation;
105 
106     MainMenuPresenter* mainMenu;
107     CliAndBreadcrumbsPresenter* cli;
108     OrlojPresenter* orloj;
109     StatusBarPresenter* statusBar;
110 
111     ScopeDialog* scopeDialog;
112     OutlineNewDialog* newOutlineDialog;
113     NoteNewDialog* newNoteDialog;
114     FtsDialog* ftsDialog;
115     FtsDialogPresenter* ftsDialogPresenter;
116     FindOutlineByNameDialog* findOutlineByNameDialog;
117     FindOutlineByNameDialog* findThingByNameDialog;
118     FindNoteByNameDialog* findNoteByNameDialog;
119     FindOutlineByTagDialog* findOutlineByTagDialog;
120     FindNoteByTagDialog* findNoteByTagDialog;
121     RefactorNoteToOutlineDialog* refactorNoteToOutlineDialog;
122     ConfigurationDialog* configDialog;
123     InsertImageDialog* insertImageDialog;
124     InsertLinkDialog* insertLinkDialog;
125     RowsAndDepthDialog* rowsAndDepthDialog;
126     NewRepositoryDialog* newRepositoryDialog;
127     NewFileDialog* newFileDialog;
128     ExportFileDialog* exportOutlineToHtmlDialog;
129     ExportFileDialog* exportMindToCsvDialog;
130     NerChooseTagTypesDialog *nerChooseTagsDialog;
131     NerResultDialog* nerResultDialog;
132 
133 public:
134     explicit MainWindowPresenter(MainWindowView& view);
135     MainWindowPresenter(const MainWindowPresenter&) = delete;
136     MainWindowPresenter(const MainWindowPresenter&&) = delete;
137     MainWindowPresenter &operator=(const MainWindowPresenter&) = delete;
138     MainWindowPresenter &operator=(const MainWindowPresenter&&) = delete;
139     ~MainWindowPresenter();
140 
141     // this presenter view
getView()142     MainWindowView& getView() const { return view; }
getConfiguration()143     const Configuration& getConfiguration() const { return config; }
getMarkdownRepresentation()144     MarkdownOutlineRepresentation* getMarkdownRepresentation() const { return mdRepresentation; }
getConfigRepresentation()145     MarkdownConfigurationRepresentation* getConfigRepresentation() const { return mdConfigRepresentation; }
getHtmlRepresentation()146     HtmlOutlineRepresentation* getHtmlRepresentation() const { return htmlRepresentation; }
getDistributor()147     AsyncTaskNotificationsDistributor* getDistributor() const { return distributor; }
148 
149     // presenters
getCli()150     CliAndBreadcrumbsPresenter* getCli() { return cli; }
getOrloj()151     OrlojPresenter* getOrloj() const { return orloj; }
getMainMenu()152     MainMenuPresenter* getMainMenu() const { return mainMenu; }
getStatusBar()153     StatusBarPresenter* getStatusBar() const { return statusBar; }
154 
155     // function
getMind()156     Mind* getMind() const { return mind; }
157 
158     // dashboard(s)
159     void showInitialView();
160 
161     // N view
162     void handleNoteViewLinkClicked(const QUrl& url);
163 
164     // NER
165     NerMainWindowWorkerThread* startNerWorkerThread(Mind* m, OrlojPresenter* o, int f, std::vector<NerNamedEntity>* r, QDialog* d);
166 
167 public slots:
168     // mind
169 #ifdef DO_MF_DEBUG
170     void doActionMindHack();
171 #endif
172     void doActionMindNewRepository();
173     void handleMindNewRepository();
174     void doActionMindNewFile();
175     void handleMindNewFile();
176     void doActionMindThink();
177     void doActionMindSleep();
178     void doActionMindToggleThink();
179     void doActionMindToggleAutolink();
180     void doActionMindLearnRepository();
181     void doActionMindLearnFile();
182     void doActionMindRelearn(QString path);
183     void doActionMindTimeTagScope();
184     void handleMindScope();
185     void doActionMindPreferences();
186     void handleMindPreferences();
187     void doActionMindRemember();
188     void doActionMindSnapshot();
189     void doActionMindCsvExport();
190     void handleMindCsvExport();
191     void doActionExit();
192     // recall
193     void doActionFts();
194     void doFts(const QString& pattern, bool doSearch=false);
195     void doActionFindOutlineByName();
196     void handleFindOutlineByName();
197     void handleFindThingByName();
198     void doActionFindNoteByName();
199     void handleFindNoteByName();
200     void doActionFindOutlineByTag();
201     void handleFindOutlineByTag();
202     void doActionFindNoteByTag();
203     void doTriggerFindNoteByTag(const Tag* tag);
204     void doSwitchFindByTagDialog(bool toFindNotesByTag);
205     void handleFindNoteByTag();
206 #ifdef MF_NER
207     void doActionFindNerPersons();
208     void doActionFindNerLocations();
209     void doActionFindNerOrganizations();
210     void doActionFindNerMisc();
211     void handleFindNerEntities();
212     void chooseNerEntityResult(vector<NerNamedEntity>*);
213     void handleChooseNerEntityResult();
214     void handleFtsNerEntity();
215 #endif
216     // view
217     void doActionViewDashboard();
218     void doActionViewOrganizer();
219     void doActionViewTagCloud();
220     bool doActionViewHome();
221     void doActionViewOutlines();
222     void doActionViewRecentNotes();
223     void doActionViewKnowledgeGraphNavigator();
224     void doActionCli();
225     void doActionViewDistractionFree();
226     void doActionViewFullscreen();
227     // navigator
228     void doActionNavigatorShuffle();
229     // format
230     void doActionFormatBold();
231     void doActionFormatItalic();
232     void doActionFormatCode();
233     void doActionFormatMath();
234     void doActionFormatMathFrac();
235     void doActionFormatMathSum();
236     void doActionFormatMathInt();
237     void doActionFormatMathIiint();
238     void doActionFormatMathAlpha();
239     void doActionFormatMathBeta();
240     void doActionFormatMathDelta();
241     void doActionFormatMathGama();
242     void doActionFormatMathText();
243     void doActionFormatMathBar();
244     void doActionFormatMathHat();
245     void doActionFormatMathDot();
246     void doActionFormatMathOverrightarrow();
247     void doActionFormatMathCup();
248     void doActionFormatMathCap();
249     void doActionFormatMathEmptyset();
250     void doActionFormatMathIn();
251     void doActionFormatMathNotin();
252     void doActionFormatMathSqrt();
253     void doActionFormatStrikethrough();
254     void doActionFormatKeyboard();
255     void handleRowsAndDepth();
256     void doActionFormatListBullet();
257     void doActionFormatListNumber();
258     void doActionFormatListTask();
259     void doActionFormatListTaskItem();
260     void doActionFormatToc();
261     void doActionFormatTimestamp();
262     void doActionFormatCodeBlock();
263     void doActionFormatMathBlock();
264     void doActionFormatDiagramBlock();
265     void doActionFormatDiagramPie();
266     void doActionFormatDiagramFlow();
267     void doActionFormatDiagramClass();
268     void doActionFormatDiagramState();
269     void doActionFormatDiagramGantt();
270     void doActionFormatDiagramSequence();
271     void doActionFormatBlockquote();
272     void doActionFormatLinkOrImage(QString link);
273     void doActionFormatLink();
274     void handleFormatLink();
275     void doActionFormatImage();
276     void injectImageLinkToEditor(const QString& path, const QString& alternateText);
277     void handleFormatImage();
278     void doActionFormatTable();
279     void doActionFormatHr();
280     // Outline
281     void doActionOutlineNew();
282     void doActionOutlineOrNoteNew();
283     void doActionOutlineEdit();
284     void handleOutlineNew();
285     void doActionOutlineClone();
286     void doActionOutlineHome();
287     void doActionOutlineForget();
288     void doActionOutlineHtmlExport();
289     void handleOutlineHtmlExport();
290     void doActionOutlineTWikiImport();
291     // Note
292     void doActionNoteNew();
293     void handleNoteNew();
294     void doActionNoteHoist();
295     void doActionOutlineOrNoteEdit();
296     void doActionOutlineShow();
297     void doActionNoteEdit();
298     void doActionNoteFirst();
299     void doActionNoteUp();
300     void doActionNotePromote();
301     void doActionNoteDemote();
302     void doActionNoteDown();
303     void doActionNoteLast();
304     void doActionNoteClone();
305     void doActionNoteExtract();
306     void doActionRefactorNoteToOutline();
307     void handleRefactorNoteToOutline();
308     void doActionNoteLeave();
309     void doActionNoteForget();
310     // edit
311     void doActionEditFind();
312     void doActionEditFindAgain();
313     void doActionEditWordWrapToggle();
314     void doActionEditPasteImageData(QImage image);
315     void doActionToggleLiveNotePreview();
316     void doActionNameDescFocusSwap();
317     // help
318     void doActionHelpDocumentation();
319     void doActionHelpWeb();
320     void doActionHelpMarkdown();
321     void doActionHelpMathLivePreview();
322     void doActionHelpMathQuickReference();
323     void doActionHelpDiagrams();
324     void doActionHelpReportBug();
325     void doActionHelpCheckForUpdates();
326     void doActionHelpAboutMindForger();
327 
328     void slotHandleFts();
329 
330 private:
331     void injectMarkdownText(const QString& text, bool newline=false, int offset=0);
332     void injectDiagramBlock(const QString& diagramText);
333     void copyLinkOrImageToRepository(const std::string& srcPath, QString& path);
334 
335     void statusInfoPreviewFlickering();
336 };
337 
338 }
339 
340 #endif // M8RUI_MAIN_WINDOW_PRESENTER_H
341