From 07de5304d8bb84c2802e01febaf010bd8f5eb1ff Mon Sep 17 00:00:00 2001
From: Olivier Langella <olivier.langella@u-psud.fr>
Date: Sat, 16 Sep 2017 12:37:59 +0200
Subject: [PATCH] WIP: stop button

---
 src/core/tandem_run/tandembatchprocess.cpp    |  6 ++-
 src/core/tandem_run/tandembatchprocess.h      |  6 ++-
 src/core/tandem_run/tandemcondorprocess.cpp   |  2 +-
 src/core/tandem_run/tandemcondorprocess.h     |  2 +-
 src/gui/mainwindow.cpp                        |  4 ++
 src/gui/mainwindow.h                          |  5 ++
 .../waiting_message_dialog.ui                 | 49 ++++++++++++++++++-
 .../waitingmessagedialog.cpp                  | 29 +++++++++--
 .../waitingmessagedialog.h                    | 11 +++++
 src/gui/workerthread.cpp                      |  4 +-
 10 files changed, 104 insertions(+), 14 deletions(-)

diff --git a/src/core/tandem_run/tandembatchprocess.cpp b/src/core/tandem_run/tandembatchprocess.cpp
index 6a07083ec..33440c51a 100644
--- a/src/core/tandem_run/tandembatchprocess.cpp
+++ b/src/core/tandem_run/tandembatchprocess.cpp
@@ -33,7 +33,8 @@
 #include <QFileInfo>
 #include <QDebug>
 
-TandemBatchProcess::TandemBatchProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) {
+TandemBatchProcess::TandemBatchProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) {
+    _p_main_window = p_main_window;
     _tandem_run_batch = tandem_run_batch;
     _p_monitor = p_monitor;
     _tmp_database_file.setAutoRemove(true);
@@ -43,6 +44,9 @@ TandemBatchProcess::~TandemBatchProcess() {
 }
 
 bool TandemBatchProcess::shouldIstop() {
+    if (_p_main_window->stopWorkerThread()) {
+        return true;
+    }
     return false;
 }
 void TandemBatchProcess::writeXmlDatabaseFile (QXmlStreamWriter * p_out) {
diff --git a/src/core/tandem_run/tandembatchprocess.h b/src/core/tandem_run/tandembatchprocess.h
index 0aed96910..7502c4b64 100644
--- a/src/core/tandem_run/tandembatchprocess.h
+++ b/src/core/tandem_run/tandembatchprocess.h
@@ -33,11 +33,12 @@
 #include "../../utils/workmonitor.h"
 #include <QTemporaryFile>
 #include <QXmlStreamWriter>
+#include "../../gui/mainwindow.h"
 
 class TandemBatchProcess
 {
 public:
-    TandemBatchProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch);
+    TandemBatchProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch);
      virtual ~TandemBatchProcess();
 
     virtual void run();
@@ -45,9 +46,9 @@ protected:
     void writeXmlDatabaseFile (QXmlStreamWriter * p_out);
     void writeXmlInputFile (QXmlStreamWriter * p_out, const QString & mz_file);
     virtual void prepareXmlDatabaseFile();
+    bool shouldIstop();
 private:
     void runOne(const QString & mz_file);
-    bool shouldIstop();
 
 protected:
     QString _preset_file;
@@ -60,6 +61,7 @@ private:
     
     
     QTemporaryFile _tmp_database_file;
+    MainWindow * _p_main_window=nullptr;
 };
 
 #endif // TANDEMBATCHPROCESS_H
diff --git a/src/core/tandem_run/tandemcondorprocess.cpp b/src/core/tandem_run/tandemcondorprocess.cpp
index 3bdaba629..dbb094a40 100644
--- a/src/core/tandem_run/tandemcondorprocess.cpp
+++ b/src/core/tandem_run/tandemcondorprocess.cpp
@@ -36,7 +36,7 @@
 #include <QThread>
 #include "../../input/condorqxmlsaxhandler.h"
 
-TandemCondorProcess::TandemCondorProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) : TandemBatchProcess(p_monitor, tandem_run_batch) {
+TandemCondorProcess::TandemCondorProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) : TandemBatchProcess(p_main_window,p_monitor, tandem_run_batch) {
     /*
     Universe   = vanilla
     notification   = Error
diff --git a/src/core/tandem_run/tandemcondorprocess.h b/src/core/tandem_run/tandemcondorprocess.h
index 38176c5d0..0792e44dc 100644
--- a/src/core/tandem_run/tandemcondorprocess.h
+++ b/src/core/tandem_run/tandemcondorprocess.h
@@ -36,7 +36,7 @@
 class TandemCondorProcess: public TandemBatchProcess
 {
 public:
-    TandemCondorProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch);
+    TandemCondorProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch);
     virtual ~TandemCondorProcess();
 
     virtual void prepareXmlDatabaseFile();
diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp
index df2ad7d40..4ca131035 100644
--- a/src/gui/mainwindow.cpp
+++ b/src/gui/mainwindow.cpp
@@ -108,6 +108,10 @@ MainWindow::~MainWindow()
 
 }
 
+bool MainWindow::stopWorkerThread() {
+    return _p_waiting_message_dialog->stopWorkerThread();
+}
+
 void MainWindow::closeEvent(QCloseEvent * event) {
     if (true) {
         event->accept();
diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h
index f55e70742..345901cea 100644
--- a/src/gui/mainwindow.h
+++ b/src/gui/mainwindow.h
@@ -55,6 +55,11 @@ public:
 
     explicit MainWindow(QWidget * parent = 0);
     ~MainWindow();
+    
+    /** @brief tells if the worker should stop running his job
+     * @param bool true asks to stop
+     */
+    bool stopWorkerThread();
 
 public slots:
     void loadResults();
diff --git a/src/gui/waiting_message_dialog/waiting_message_dialog.ui b/src/gui/waiting_message_dialog/waiting_message_dialog.ui
index 5553964b8..d0ac9f083 100644
--- a/src/gui/waiting_message_dialog/waiting_message_dialog.ui
+++ b/src/gui/waiting_message_dialog/waiting_message_dialog.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>746</width>
-    <height>86</height>
+    <height>150</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -46,14 +46,59 @@
    <item>
     <widget class="QPlainTextEdit" name="console_plaintextedit"/>
    </item>
+   <item>
+    <layout class="QHBoxLayout" name="stop_horizontal_layout">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="stop_push_button">
+       <property name="text">
+        <string>Stop</string>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
   </layout>
  </widget>
  <resources/>
- <connections/>
+ <connections>
+  <connection>
+   <sender>stop_push_button</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>WaitingMessageDialog</receiver>
+   <slot>toggledStopButton(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>704</x>
+     <y>130</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>806</x>
+     <y>197</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
  <slots>
   <slot>chooseFiles()</slot>
   <slot>reject()</slot>
   <slot>accept()</slot>
   <slot>clearFileList()</slot>
+  <slot>toggledStopButton(bool)</slot>
  </slots>
 </ui>
diff --git a/src/gui/waiting_message_dialog/waitingmessagedialog.cpp b/src/gui/waiting_message_dialog/waitingmessagedialog.cpp
index aea9e475f..89a310727 100644
--- a/src/gui/waiting_message_dialog/waitingmessagedialog.cpp
+++ b/src/gui/waiting_message_dialog/waitingmessagedialog.cpp
@@ -25,6 +25,7 @@
 #include "waitingmessagedialog.h"
 #include <QDebug>
 #include <QLabel>
+#include <QMutexLocker>
 
 WaitingMessageDialog::WaitingMessageDialog(QWidget * parent):
     QDialog(parent),
@@ -44,10 +45,11 @@ WaitingMessageDialog::WaitingMessageDialog(QWidget * parent):
     }
     ui->movie_label->setMovie(_p_movie);
     ui->progress_bar->setVisible(false);
-    
+
     ui->progress_bar->setMaximum(100);
     ui->progress_bar->setMinimum(0);
     ui->console_plaintextedit->setHidden(true);
+    ui->stop_push_button->setVisible(false);
     //movie->start();
     qDebug() << "WaitingMessageDialog::WaitingMessageDialog end";
 }
@@ -59,8 +61,25 @@ WaitingMessageDialog::~WaitingMessageDialog()
     qDebug() << "WaitingMessageDialog::~WaitingMessageDialog end";
 }
 
+void WaitingMessageDialog::toggledStopButton(bool pushed) {
+    QMutexLocker mutex_locker(&_mutex);
+    _asked_to_stop = true;
+}
+
+bool WaitingMessageDialog::stopWorkerThread() {
+    QMutexLocker mutex_locker(&_mutex);
+    if (!ui->stop_push_button->isVisible()) {
+        ui->stop_push_button->setChecked(false);
+        ui->stop_push_button->setVisible(true);
+        _asked_to_stop = false;
+        return false;
+    }
+    return _asked_to_stop;
+
+}
+
 void WaitingMessageDialog::message(const QString & message) {
-    
+
     ui->progress_bar->setVisible(false);
     ui->message_label->setText(message);
 }
@@ -75,7 +94,7 @@ void WaitingMessageDialog::message(const QString & message, int progress_value)
 void WaitingMessageDialog::appendText(char * text) {
     ui->console_plaintextedit->setHidden(false);
     //ui->console_plaintextedit->appendText(text);
-    
+
     ui->console_plaintextedit->moveCursor (QTextCursor::End);
     ui->console_plaintextedit->insertPlainText (text);
 }
@@ -85,8 +104,8 @@ void WaitingMessageDialog::hideEvent( QHideEvent* event ) {
     qDebug() << "WaitingMessageDialog::hideEvent";
     _p_movie->stop();
     ui->console_plaintextedit->setHidden(true);
-} 
+}
 void WaitingMessageDialog::showEvent( QShowEvent* event ) {
     QWidget::showEvent( event );
     _p_movie->start();
-} 
+}
diff --git a/src/gui/waiting_message_dialog/waitingmessagedialog.h b/src/gui/waiting_message_dialog/waitingmessagedialog.h
index 64f66309f..4713f0601 100644
--- a/src/gui/waiting_message_dialog/waitingmessagedialog.h
+++ b/src/gui/waiting_message_dialog/waitingmessagedialog.h
@@ -27,6 +27,7 @@
 #include <QDialog>
 #include <QStringListModel>
 #include <QMovie>
+#include <QMutex>
 #include "../project_view/automatic_filter_widget/automaticfilterwidget.h"
 
 
@@ -48,10 +49,20 @@ public:
     void appendText(char * text);
     void showEvent( QShowEvent* event );
     void hideEvent( QHideEvent* event );
+    
+    bool stopWorkerThread();
+    
+private slots:
+    void toggledStopButton(bool pushed);
 
 private:
     Ui::WaitingMessageDialog *ui;
     QMovie * _p_movie;
+    
+    bool _asked_to_stop = false;
+    
+    
+    QMutex _mutex;
 
 };
 
diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp
index 4919ad087..f1a5e8229 100644
--- a/src/gui/workerthread.cpp
+++ b/src/gui/workerthread.cpp
@@ -340,11 +340,11 @@ void WorkerThread::doRunningXtandem(TandemRunBatch tandem_run_batch) {
         QString default_location = settings.value("condor/tmp_dir", "").toString();
 
         if (default_location.isEmpty()) {
-            TandemBatchProcess xt_process (_p_work_monitor, tandem_run_batch);
+            TandemBatchProcess xt_process (_p_main_window ,_p_work_monitor, tandem_run_batch);
             xt_process.run();
         }
         else {
-            TandemCondorProcess xt_process (_p_work_monitor, tandem_run_batch);
+            TandemCondorProcess xt_process (_p_main_window ,_p_work_monitor, tandem_run_batch);
             xt_process.run();
         }
 
-- 
GitLab