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