diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 9b206119250681af301009be7fe5b7e20930471f..966ef3179a43fe8785ff3bda7d1501ffd1428076 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -42,7 +42,7 @@ MainWindow::MainWindow(QWidget *parent): ui->setupUi(this); setWindowTitle(QString("%1 %2").arg(SOFTWARE_NAME).arg(XTPCPP_VERSION)); - WorkerThread *worker = new WorkerThread; + WorkerThread *worker = new WorkerThread(this); worker->moveToThread(&workerThread); /* */ @@ -75,23 +75,9 @@ MainWindow::MainWindow(QWidget *parent): #else // Qt4 code - connect(this, SIGNAL(operateXpipFile(QString)), worker,SLOT(doXpipFileLoad(QString))); - connect(worker, SIGNAL(projectReady(ProjectSp)), this,SLOT(doProjectReady(ProjectSp))); - connect(this, SIGNAL(operateLoadingResults(bool,AutomaticFilterParameters,QStringList)), worker,SLOT(doLoadingResults(bool,AutomaticFilterParameters,QStringList))); connect(_p_load_results_dialog, SIGNAL(accepted()), this,SLOT(doAcceptedLoadResultDialog())); connect(_p_export_spreadsheet_dialog, SIGNAL(accepted()), this,SLOT(doAcceptedExportSpreadsheetDialog())); - connect(worker, SIGNAL(loadingMessage(QString)), this,SLOT(doDisplayLoadingMessage(QString))); - connect(worker, SIGNAL(projectNotReady(QString)), this,SLOT(doProjectNotReady(QString))); - - //grouping - connect(this, SIGNAL(operateGrouping(ProjectSp)), worker,SLOT(doGrouping(ProjectSp))); - connect(worker, SIGNAL(groupingFinished()), this,SLOT(doGroupingFinished())); - //masschroq write - connect(this, SIGNAL(operateWritingMassChroqFile(QString, ProjectSp)), worker,SLOT(doWritingMassChroqFile(QString, ProjectSp))); - //writing ODS file : - connect(this, SIGNAL(operateWritingOdsFile(QString, ProjectSp)), worker,SLOT(doWritingOdsFile(QString, ProjectSp))); - connect(worker, SIGNAL(operationFailed(QString)), this,SLOT(doOperationFailed(QString))); - connect(worker, SIGNAL(operationFinished()), this,SLOT(doOperationFinished())); + /* connect(&workerThread, SIGNAL(finished()), worker, SLOT(deleteLater())); connect(this, SIGNAL(operateMsDataFile(QString)), worker,SLOT(doMsDataFileLoad(QString))); diff --git a/src/gui/project_view/projectwindow.cpp b/src/gui/project_view/projectwindow.cpp index a00a2710ad63d7ab156f7f43842c1b04d945e4ef..363adb74c152e5e19b099ce6dc8ea9c5a4c8d578 100644 --- a/src/gui/project_view/projectwindow.cpp +++ b/src/gui/project_view/projectwindow.cpp @@ -33,6 +33,7 @@ #include <QMessageBox> #include <pappsomspp/pappsoexception.h> #include <numeric> +#include "../workerthread.h" @@ -41,6 +42,7 @@ ProjectWindow::ProjectWindow(MainWindow *parent): ui(new Ui::ProjectView) { main_window = parent; + ui->setupUi(this); _p_fasta_str_li = new QStandardItemModel(); @@ -53,6 +55,7 @@ ProjectWindow::ProjectWindow(MainWindow *parent): _p_edit_modifications = new EditModifications(this); _p_edit_label_methods = new EditLabelMethods(this); + _p_waiting_message_dialog = new WaitingMessageDialog(this); #if QT_VERSION >= 0x050000 // Qt5 code @@ -71,6 +74,10 @@ ProjectWindow::ProjectWindow(MainWindow *parent): */ this->setDisabled(true); + + + WorkerThread * p_worker = new WorkerThread(this); + p_worker->moveToThread(&worker_thread); } @@ -218,51 +225,50 @@ void ProjectWindow::refresh() { } void ProjectWindow::doAutomaticFilterParametersChanged(AutomaticFilterParameters parameters) { qDebug() << "ProjectWindow::doAutomaticFilterParametersChanged begin "; + showWaitingMessage(tr("Updating filters")); + _project_sp.get()->getProteinStore().setRegexpContaminantPattern(ui->contaminant_protein_regexp_line_edit->text()); _project_sp.get()->updateAutomaticFilters(parameters); - //re group - for (IdentificationGroup * identification_group : _project_sp.get()->getIdentificationGroupList()) { - doIdentificationGroupEdited(identification_group); - } - - refresh(); + qDebug() << "ProjectWindow::doAutomaticFilterParametersChanged emit operateGrouping(_project_sp) "; + emit operateGrouping(_project_sp); qDebug() << "ProjectWindow::doAutomaticFilterParametersChanged end "; } +void ProjectWindow::doOperationFailed(QString error) { + hideWaitingMessage(); + viewError(error); +} +void ProjectWindow::doOperationFinished() { + hideWaitingMessage(); +} -void ProjectWindow::doMassPrecisionUnitChanged(QString combo_value) { - qDebug() << "ProjectWindow::doMassPrecisionUnitChanged begin "<< combo_value; - - refresh(); - qDebug() << "ProjectWindow::doMassPrecisionUnitChanged end "; +void ProjectWindow::doDisplayLoadingMessage(QString message) { + qDebug() << "ProjectWindow::doDisplayLoadingMessage " << message; + _p_waiting_message_dialog->message(message); } -void ProjectWindow::doIdentificationGroupEdited(IdentificationGroup * p_ident_group) { - qDebug() << "ProjectWindow::doIdentificationGroupEdited begin " << p_ident_group; - if (p_ident_group == nullptr) { - qDebug() << "ProjectWindow::doIdentificationGroupEdited p_ident_group == nullptr"; - } - else { - try { - p_ident_group->startGrouping(_project_sp.get()->getGroupingType()); - } - catch (pappso::PappsoException exception_pappso) { - QMessageBox::warning(this, - tr("Error grouping project :"), exception_pappso.qwhat()); - } - catch (std::exception exception_std) { - QMessageBox::warning(this, - tr("Error grouping project :"), exception_std.what()); - } +void ProjectWindow::doGroupingFinished() { + qDebug() << "ProjectWindow::doGroupingFinished begin " ; + hideWaitingMessage(); + //re group + for (IdentificationGroup * p_ident_group : _project_sp.get()->getIdentificationGroupList()) { refreshGroup(p_ident_group); } refresh(); - qDebug() << "ProjectWindow::doIdentificationGroupEdited end"; + + qDebug() << "ProjectWindow::doGroupingFinished end"; } + +void ProjectWindow::doMassPrecisionUnitChanged(QString combo_value) { + qDebug() << "ProjectWindow::doMassPrecisionUnitChanged begin "<< combo_value; + + refresh(); + qDebug() << "ProjectWindow::doMassPrecisionUnitChanged end "; +} void ProjectWindow::doViewPeptideList(IdentificationGroup * p_ident_group, ProteinMatch * protein_match) { @@ -350,12 +356,12 @@ void ProjectWindow::doViewProteinList(IdentificationGroup* p_identification_grou void ProjectWindow::setProjectSp(ProjectSp project_sp) { qDebug() << "ProjectWindow::setProjectSp begin" ; - + _project_sp = project_sp; qDebug() << "ProjectWindow::setProjectSp begin " << _project_sp.get()->getFastaFileStore().getFastaFileList().size() ; _fastafile_list = _project_sp.get()->getFastaFileStore().getFastaFileList(); - + _p_fasta_str_li->removeRows(0, _p_fasta_str_li->rowCount()); for (FastaFileSp fasta_file : _fastafile_list ) { @@ -365,8 +371,8 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) { _p_fasta_str_li->appendRow(item); item->setData(QVariant(QString("%1").arg(fasta_file.get()->getFilename())),Qt::UserRole); } - - + + for (auto && p_window :_peptide_list_window_collection) { delete p_window; } @@ -425,7 +431,7 @@ void ProjectWindow::setProjectSp(ProjectSp project_sp) { ui->decoy_protein_regexp_line_edit->setText(_project_sp.get()->getProteinStore().getRegexpDecoy().pattern()); ui->contaminant_protein_regexp_line_edit->setText(_project_sp.get()->getProteinStore().getRegexpContaminant().pattern()); - + refresh(); this->setEnabled(true); } @@ -446,3 +452,24 @@ void ProjectWindow::editLabelingMethods() { _p_edit_label_methods->activateWindow(); } + +void ProjectWindow::hideWaitingMessage() { + + _p_waiting_message_dialog->hide(); +} + +void ProjectWindow::showWaitingMessage(const QString title) { + _p_waiting_message_dialog->setWindowTitle(title); + _p_waiting_message_dialog->show(); + _p_waiting_message_dialog->raise(); + _p_waiting_message_dialog->activateWindow(); + +} + +void ProjectWindow::doIdentificationGroupEdited(IdentificationGroup* p_identification_group) { +} + +void ProjectWindow::viewError(QString error) { + QMessageBox::warning(this, + tr("Oops! an error occurred in XTPCPP. Dont Panic :"), error); +} diff --git a/src/gui/project_view/projectwindow.h b/src/gui/project_view/projectwindow.h index daae90f48023610da4ebe699b5285649e8d96d8f..b406fb3e4237239d4273d19461e45d50082e64aa 100644 --- a/src/gui/project_view/projectwindow.h +++ b/src/gui/project_view/projectwindow.h @@ -25,6 +25,7 @@ #define PROJECTWINDOW_H #include <QMainWindow> +#include <QThread> #include <set> #include "../../core/project.h" #include "../edit_label_methods/editlabelmethods.h" @@ -34,6 +35,7 @@ #include "../protein_view/proteinwindow.h" #include "../peptide_detail_view/peptidewindow.h" #include "gui/project_view/automatic_filter_widget/automaticfilterwidget.h" +#include "../waiting_message_dialog/waitingmessagedialog.h" class MainWindow; @@ -44,6 +46,7 @@ class ProjectView; class ProjectWindow: public QMainWindow { Q_OBJECT + QThread worker_thread; friend class ProteinListWindow; friend class PeptideListWindow; @@ -62,18 +65,23 @@ public slots: void doAutomaticFilterParametersChanged(AutomaticFilterParameters parameters); void doFdrChanged(); void doMassPrecisionUnitChanged(QString combo_value); + void doOperationFailed(QString); + void doOperationFinished(); + void doGroupingFinished(); + void doDisplayLoadingMessage(QString message); // void setColor(const QColor &color); // void setShape(Shape shape); signals: void identificationGroupGrouped(IdentificationGroup * p_identification_group); void peptideMatchSelected(PeptideMatch * peptide_match); + void operateGrouping(ProjectSp project_sp); //void peptideChanged(pappso::PeptideSp peptide); protected : void doViewPeptideList(IdentificationGroup * p_ident_group, ProteinMatch * protein_match); void doViewPeptideDetail(PeptideMatch * peptide_match); void doViewProteinDetail(ProteinMatch * protein_match); - void doIdentificationGroupEdited(IdentificationGroup * p_identification_group); + void doIdentificationGroupEdited(IdentificationGroup* p_identification_group); void computeFdr(); void computeMassPrecision(); @@ -84,6 +92,10 @@ private : void connectNewPeptideDetailWindow(); void refreshGroup(IdentificationGroup * p_ident_group); void refresh(); + void showWaitingMessage(const QString title); + void hideWaitingMessage(); + void viewError(QString error); + private: Ui::ProjectView *ui; @@ -106,6 +118,7 @@ private: QStandardItemModel * _p_fasta_str_li; std::vector<FastaFileSp> _fastafile_list; + WaitingMessageDialog * _p_waiting_message_dialog; }; diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp index ec64fb940957a6709d2a465e4423c3654b97c634..6610a2813110df2ad4bbdd34f1ee1df786435fe5 100644 --- a/src/gui/workerthread.cpp +++ b/src/gui/workerthread.cpp @@ -30,10 +30,73 @@ #include "workerthread.h" #include <odsstream/odsdocwriter.h> #include <pappsomspp/pappsoexception.h> +#include <QDebug> #include "../output/masschroqml.h" #include "../output/ods/odsexport.h" #include "files/xpipfile.h" +WorkerThread::WorkerThread(MainWindow * p_main_window) +{ + qDebug() << "WorkerThread::WorkerThread begin MainWindow"; +#if QT_VERSION >= 0x050000 + // Qt5 code + /* + connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater); + connect(this, &PtSpectrumViewer::operateMsDataFile, worker, &PwizLoaderThread::doMsDataFileLoad); + connect(worker, &PwizLoaderThread::msDataReady, this, &PtSpectrumViewer::handleMsDataFile); + */ +#else +// Qt4 code + + connect(p_main_window, SIGNAL(operateXpipFile(QString)), this,SLOT(doXpipFileLoad(QString))); + connect(this, SIGNAL(projectReady(ProjectSp)), p_main_window,SLOT(doProjectReady(ProjectSp))); + connect(p_main_window, SIGNAL(operateLoadingResults(bool,AutomaticFilterParameters,QStringList)), this,SLOT(doLoadingResults(bool,AutomaticFilterParameters,QStringList))); + connect(this, SIGNAL(loadingMessage(QString)), p_main_window,SLOT(doDisplayLoadingMessage(QString))); + connect(this, SIGNAL(projectNotReady(QString)), p_main_window,SLOT(doProjectNotReady(QString))); + + //grouping + connect(p_main_window, SIGNAL(operateGrouping(ProjectSp)), this,SLOT(doGrouping(ProjectSp))); + connect(this, SIGNAL(groupingFinished()), p_main_window,SLOT(doGroupingFinished())); + //masschroq write + connect(p_main_window, SIGNAL(operateWritingMassChroqFile(QString, ProjectSp)), this,SLOT(doWritingMassChroqFile(QString, ProjectSp))); + //writing ODS file : + connect(p_main_window, SIGNAL(operateWritingOdsFile(QString, ProjectSp)), this,SLOT(doWritingOdsFile(QString, ProjectSp))); + connect(this, SIGNAL(operationFailed(QString)), p_main_window,SLOT(doOperationFailed(QString))); + connect(this, SIGNAL(operationFinished()), p_main_window,SLOT(doOperationFinished())); + /* + connect(&workerThread, SIGNAL(finished()), worker, SLOT(deleteLater())); + connect(this, SIGNAL(operateMsDataFile(QString)), worker,SLOT(doMsDataFileLoad(QString))); + connect(worker, SIGNAL(msDataReady(pwiz::msdata::MSDataFile *)), this, SLOT(handleMsDataFile(pwiz::msdata::MSDataFile *))); + */ +#endif + + qDebug() << "WorkerThread::WorkerThread end MainWindow"; +} + +WorkerThread::WorkerThread(ProjectWindow * p_project_window) +{ + qDebug() << "WorkerThread::WorkerThread begin ProjectWindow"; +#if QT_VERSION >= 0x050000 + // Qt5 code +#else +// Qt4 code + qDebug() << "WorkerThread::WorkerThread Qt4 code"; + connect(this, SIGNAL(loadingMessage(QString)), p_project_window,SLOT(doDisplayLoadingMessage(QString))); + //grouping + connect(p_project_window, SIGNAL(operateGrouping(ProjectSp)), this,SLOT(doGrouping(ProjectSp))); + connect(this, SIGNAL(groupingFinished()), p_project_window,SLOT(doGroupingFinished())); + connect(this, SIGNAL(operationFailed(QString)), p_project_window,SLOT(doOperationFailed(QString))); + connect(this, SIGNAL(operationFinished()), p_project_window,SLOT(doOperationFinished())); + +#endif +qDebug() << "WorkerThread::WorkerThread end ProjectWindow"; +} + +WorkerThread::~WorkerThread() +{ + qDebug() << "WorkerThread::WorkerThread destructor"; +} + void WorkerThread::doXpipFileLoad(QString filename) { qDebug() << "WorkerThread::doXpipFileLoad begin "<< filename; try { @@ -58,7 +121,16 @@ void WorkerThread::doXpipFileLoad(QString filename) { void WorkerThread::doGrouping(ProjectSp project_sp) { try { emit loadingMessage(tr("grouping proteins")); - project_sp.get()->startGrouping(); + try { + project_sp.get()->startGrouping(); + + } + catch (pappso::PappsoException exception_pappso) { + emit operationFailed(tr("Error grouping project : %1").arg(exception_pappso.qwhat())); + } + catch (std::exception exception_std) { + emit operationFailed(tr("Error grouping project : %1").arg(exception_std.what())); + } emit loadingMessage(tr("grouping proteins finished")); emit groupingFinished(); } @@ -95,7 +167,7 @@ void WorkerThread::doWritingMassChroqFile(QString filename, ProjectSp project_sp emit operationFailed(tr("Error while writing MassChroqML file :\n%1").arg(error.qwhat())); } } - + void WorkerThread::doLoadingResults(bool is_individual, AutomaticFilterParameters param, QStringList file_list) { qDebug() << "WorkerThread::doLoadingResults begin "; diff --git a/src/gui/workerthread.h b/src/gui/workerthread.h index 87617697de98d05664e634e03e3dbd1ad031d2a3..946d7a99e1df9dec79b933c7935492d07c4da6cb 100644 --- a/src/gui/workerthread.h +++ b/src/gui/workerthread.h @@ -34,12 +34,18 @@ #include <QCloseEvent> #include "../core/automaticfilterparameters.h" #include "../core/project.h" +#include "mainwindow.h" class WorkerThread : public QObject { Q_OBJECT + public: + WorkerThread(MainWindow * parent); + WorkerThread(ProjectWindow * parent); + ~WorkerThread(); + protected: