Skip to content
Snippets Groups Projects
mainwindow.cpp 7.62 KiB

/*******************************************************************************
* Copyright (c) 2015 Olivier Langella <Olivier.Langella@moulon.inra.fr>.
*
* This file is part of XTPcpp.
*
*     XTPcpp is free software: you can redistribute it and/or modify
*     it under the terms of the GNU General Public License as published by
*     the Free Software Foundation, either version 3 of the License, or
*     (at your option) any later version.
*
*     XTPcpp is distributed in the hope that it will be useful,
*     but WITHOUT ANY WARRANTY; without even the implied warranty of
*     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*     GNU General Public License for more details.
*
*     You should have received a copy of the GNU General Public License
*     along with XTPcpp.  If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
*     Olivier Langella <Olivier.Langella@moulon.inra.fr> - initial API and implementation
******************************************************************************/

#include <QDockWidget>
#include <QSettings>
#include <QFileDialog>
#include <QMessageBox>
#include <QDebug>
#include "mainwindow.h"

#include "ui_main.h"
#include <pappsomspp/pappsoexception.h>


void XtpLoaderThread::doXpipFileLoad(QString filename) {
    qDebug() << "XtpLoaderThread::doXpipFileLoad begin "<< filename;
    try {
        QFileInfo new_xpip_file;
        new_xpip_file.setFile(filename);


        XpipFile xpip_file(new_xpip_file);
        ProjectSp project_sp = xpip_file.getProjectSp();

        emit projectReady(project_sp);

    }
    catch (pappso::PappsoException & error) {
        emit projectNotReady(tr("Error while reading XPIP file :\n%1").arg(error.qwhat()));
    }

    qDebug() << "XtpLoaderThread::doXpipFileLoad end";
}


void XtpLoaderThread::doLoadingResults(bool is_individual, AutomaticFilterParameters param, QStringList file_list) {

    qDebug() << "XtpLoaderThread::doLoadingResults begin ";
    try {
        ProjectSp project_sp = Project().makeProjectSp();
        project_sp.get()->setCombineMode(!is_individual);

        for (QString filename : file_list) {
            emit loadingMessage(tr("loading result file %1").arg(filename));
            project_sp.get()->readResultFile(filename);
        }

        emit loadingMessage(tr("filtering proteins"));
        project_sp.get()->updateAutomaticFilters(param);
        emit projectReady(project_sp);

    }
    catch (pappso::PappsoException & error) {
        emit projectNotReady(tr("Error while reading XPIP file :\n%1").arg(error.qwhat()));
    }
    qDebug() << "XtpLoaderThread::doLoadingResults end ";
}

MainWindow::MainWindow(QWidget *parent):
    QMainWindow(parent),
    ui(new Ui::Main)
{
    ui->setupUi(this);

    XtpLoaderThread *worker = new XtpLoaderThread;
    worker->moveToThread(&workerThread);
    /*
    */
    workerThread.start();

    _p_load_results_dialog = new LoadResultsDialog(this);


    _project_window = new ProjectWindow(this);

    ui->centralwidget->layout()->addWidget(_project_window);
    _project_window->show();
    //_protein_list_window = new ProteinListWindow(this);
    //QDockWidget *dock = new QDockWidget(tr("Protein List"), this);
    //dock->setWidget(_protein_list_window);
    //addDockWidget(Qt::RightDockWidgetArea, dock);

    qRegisterMetaType<ProjectSp>("ProjectSp");
    qRegisterMetaType<AutomaticFilterParameters>("AutomaticFilterParameters");
#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(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(worker, SIGNAL(loadingMessage(QString)), this,SLOT(doDisplayLoadingMessage(QString)));
    connect(worker, SIGNAL(projectNotReady(QString)), this,SLOT(doProjectNotReady(QString)));
    /*
        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
}

MainWindow::~MainWindow()
{
    workerThread.quit();
    workerThread.wait();
    //if (_p_ms_data_file != nullptr) delete _p_ms_data_file;
    delete ui;
    delete _project_window;

}


void MainWindow::closeEvent(QCloseEvent * event) {
    if (true) {
        event->accept();
    } else {
        event->ignore();
    }
}

void MainWindow::viewError(QString error) {
    QMessageBox::warning(this,
                         tr("Oops! an error occurred in XTPCPP. Dont Panic :"), error);
}

void MainWindow::doDisplayLoadingMessage(QString message) {
    qDebug() << "MainWindow::doDisplayLoadingMessage " <<  message;
    ui->statusbar->showMessage(message);
}

void MainWindow::doAcceptedLoadResultDialog() {
    qDebug() << "MainWindow::doAcceptedLoadResultDialog begin";
    AutomaticFilterParameters param = _p_load_results_dialog->getAutomaticFilterParameters();
    QSettings settings;
    settings.setValue("automatic_filter/cross_sample", QString("%1").arg(param.getFilterCrossSamplePeptideNumber()));
    settings.setValue("automatic_filter/peptide_number", QString("%1").arg(param.getFilterMinimumPeptidePerMatch()));
    settings.setValue("automatic_filter/peptide_evalue", QString("%1").arg(param.getFilterPeptideEvalue()));
    settings.setValue("automatic_filter/protein_evalue", QString("%1").arg(param.getFilterProteinEvalue()));

    QStringList file_list = _p_load_results_dialog->getFileList();
    bool is_individual = _p_load_results_dialog->isIndividual();

    emit operateLoadingResults(is_individual, param, file_list);
    qDebug() << "MainWindow::doAcceptedLoadResultDialog end";
}

void MainWindow::doProjectReady(ProjectSp project_sp) {

    qDebug() << "MainWindow::doProjectReady begin";
    try {
        doDisplayLoadingMessage(tr("grouping proteins"));
        project_sp.get()->startGrouping();
    }
    catch (pappso::PappsoException & error) {
        viewError(tr("Error while grouping :\n%1").arg(error.qwhat()));
    }
    _project_window->setProjectSp(project_sp);

    qDebug() << "MainWindow::doProjectReady end";
}


void MainWindow::doProjectNotReady(QString error) {
    viewError(tr("Error while grouping :\n%1").arg(error));
}
void MainWindow::loadResults() {

    _p_load_results_dialog->show();
    _p_load_results_dialog->raise();
    _p_load_results_dialog->activateWindow();

}
void MainWindow::selectXpipFile() {
    try {
        QSettings settings;
        QString default_location = settings.value("path/xpipfile", "").toString();

        QString filename = QFileDialog::getOpenFileName(this,
                           tr("Open XPIP File"), default_location,
                           tr("xpip files (*.xpip);;all files (*)"));

        if (filename.isEmpty()) {
            return;
        }

        settings.setValue("path/xpipfile", QFileInfo(filename).absolutePath());
        emit operateXpipFile(filename);
    }
    catch (pappso::PappsoException & error) {
        viewError(tr("Error while reading XPIP file :\n%1").arg(error.qwhat()));
    }

}