1 /** 2 * UGENE - Integrated Bioinformatics Tools. 3 * Copyright (C) 2008-2021 UniPro <ugene@unipro.ru> 4 * http://ugene.net 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, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 19 * MA 02110-1301, USA. 20 */ 21 22 #ifndef _U2_PROJECT_SUPPORT_H_ 23 #define _U2_PROJECT_SUPPORT_H_ 24 25 #include <assert.h> 26 27 #include <U2Core/ProjectModel.h> 28 #include <U2Core/ProjectService.h> 29 30 #include <U2Gui/WelcomePageAction.h> 31 32 #include "ui_CreateNewProjectWidget.h" 33 #include "ui_SaveProjectDialog.h" 34 35 namespace U2 { 36 37 #define SETTINGS_DIR QString("project_loader/") 38 #define RECENT_ITEMS_SETTINGS_NAME "recentItems" 39 #define RECENT_PROJECTS_SETTINGS_NAME "recentProjects" 40 41 class DocumentProviderTask; 42 class FormatDetectionResult; 43 44 class ProjectLoaderImpl : public ProjectLoader { 45 Q_OBJECT 46 public: 47 ProjectLoaderImpl(); 48 49 void runOpenRecentFileOrProjectTask(const GUrl &url) override; 50 51 Task *openWithProjectTask(const QList<GUrl> &urls, const QVariantMap &hints = QVariantMap()) override; 52 53 Task *createNewProjectTask(const GUrl &url = GUrl()) override; 54 55 Task *createProjectLoadingTask(const GUrl &url, const QVariantMap &hints = QVariantMap()) override; 56 57 Project *createProject(const QString &name, const QString &url, QList<Document *> &documents, QList<GObjectViewState *> &states) override; 58 59 QAction *getAddExistingDocumentAction() override; 60 61 static QString getLastProjectURL(); 62 static int getMaxObjectsInSingleDocument(); 63 static bool detectFormat(const GUrl &url, QList<FormatDetectionResult> &formats, const QVariantMap &hints, FormatDetectionResult &selectedResult); 64 static bool shouldFormatBeSelected(const QList<FormatDetectionResult> &formats, bool forceSelectFormat); 65 static bool processHints(FormatDetectionResult &dr); 66 67 signals: 68 void si_recentListChanged(); 69 70 public slots: 71 void sl_newDocumentFromText(); 72 void sl_openProject(); 73 74 private: 75 void updateState(); 76 void updateRecentProjectsMenu(); 77 void prependToRecentProjects(const QString &pFile); 78 79 /** Remove URL from both recent projects & documents list. */ 80 void removeUrlFromRecentItems(const GUrl &url); 81 82 void updateRecentItemsMenu(); 83 void prependToRecentItems(const QString &url); 84 void rememberProjectURL(); 85 86 /** Returns true if the url looks like a UGENE project file url. */ 87 static bool isProjectFileUrl(const GUrl &url); 88 89 private slots: 90 void sl_newProject(); 91 void sl_openRecentFile(); 92 void sl_openRecentProject(); 93 void sl_serviceStateChanged(Service *s, ServiceState prevState); 94 void sl_documentAdded(Document *doc); 95 void sl_paste(); 96 void sl_documentStateChanged(); 97 void sl_projectURLChanged(const QString &oldURL); 98 void sl_onAddExistingDocument(); 99 100 void sl_downloadRemoteFile(); 101 void sl_accessSharedDatabase(); 102 void sl_searchGenbankEntry(); 103 104 private: 105 QAction *addExistingDocumentAction; 106 QAction *newProjectAction; 107 QAction *openProjectAction; 108 QAction *pasteAction; 109 QAction *downloadRemoteFileAction; 110 QAction *accessSharedDatabaseAction; 111 QAction *searchGenbankEntryAction; 112 QAction *newDocumentFromTextAction; 113 114 QMenu *recentProjectsMenu; 115 QMenu *recentItemsMenu; 116 }; 117 118 ////////////////////////////////////////////////////////////////////////// 119 /// WelcomePageActions 120 121 class LoadDataWelcomePageAction : public WelcomePageAction { 122 public: 123 LoadDataWelcomePageAction(ProjectLoaderImpl *loader); 124 void perform(); 125 126 private: 127 QPointer<ProjectLoaderImpl> loader; 128 }; 129 130 class CreateSequenceWelcomePageAction : public WelcomePageAction { 131 public: 132 CreateSequenceWelcomePageAction(ProjectLoaderImpl *loader); 133 void perform() override; 134 135 private: 136 QPointer<ProjectLoaderImpl> loader; 137 }; 138 139 ////////////////////////////////////////////////////////////////////////// 140 /// Dialogs 141 142 // TODO: merge project dir & project name fields 143 144 class SaveProjectDialogController : public QDialog, public Ui_SaveProjectDialog { 145 Q_OBJECT 146 public: 147 SaveProjectDialogController(QWidget *p); 148 public slots: 149 void sl_clicked(QAbstractButton *button); 150 }; 151 152 class ProjectDialogController : public QDialog, public Ui_CreateNewProjectDialog { 153 Q_OBJECT 154 public: 155 enum Mode { 156 New_Project, 157 Save_Project, 158 }; 159 ProjectDialogController(Mode m, QWidget *p); 160 161 void accept() override; 162 void updateState(); 163 164 protected: 165 void keyPressEvent(QKeyEvent *event) override; 166 167 private slots: 168 void sl_fileSelectClicked(); 169 void sl_fileNameEdited(const QString &); 170 void sl_projectNameEdited(const QString &); 171 172 private: 173 void setupDefaults(); 174 bool fileEditIsEmpty; 175 QPushButton *createButton; 176 }; 177 178 class AD2P_DocumentInfo { 179 public: AD2P_DocumentInfo()180 AD2P_DocumentInfo() 181 : iof(nullptr), openView(false), loadDocuments(false), markLoadedAsModified(false) { 182 } 183 GUrl url; 184 DocumentFormatId formatId; 185 IOAdapterFactory *iof; 186 QVariantMap hints; 187 bool openView; 188 bool loadDocuments; 189 bool markLoadedAsModified; 190 }; 191 192 class AD2P_ProviderInfo { 193 public: AD2P_ProviderInfo()194 AD2P_ProviderInfo() 195 : dp(nullptr), openView(false) { 196 } 197 DocumentProviderTask *dp; 198 bool openView; 199 }; 200 201 class AddDocumentsToProjectTask : public Task { 202 Q_OBJECT 203 public: 204 AddDocumentsToProjectTask(const QList<AD2P_DocumentInfo> &docsInfo, const QList<AD2P_ProviderInfo> &providersInfo); 205 ~AddDocumentsToProjectTask(); 206 207 QList<Task *> onSubTaskFinished(Task *subTask) override; 208 QString generateReport() const override; 209 210 private: 211 QList<Task *> prepareLoadTasks(); 212 QList<Document *> docsToMarkAsModified; 213 214 QList<AD2P_DocumentInfo> docsInfo; 215 QList<AD2P_ProviderInfo> providersInfo; 216 bool loadTasksAdded; 217 }; 218 219 class OpenWithProjectTask : public Task { 220 Q_OBJECT 221 public: 222 OpenWithProjectTask(const QStringList &urls); 223 void prepare() override; 224 225 private: 226 QList<GUrl> urls; 227 }; 228 229 } // namespace U2 230 #endif 231