]> Creatis software - clitk.git/commitdiff
Add a watcher to file
authortbaudier <thomas.baudier@creatis.insa-lyon.fr>
Mon, 14 Jan 2019 12:21:02 +0000 (13:21 +0100)
committertbaudier <thomas.baudier@creatis.insa-lyon.fr>
Mon, 14 Jan 2019 12:21:02 +0000 (13:21 +0100)
vv reload automatically a file if it changed on the disk.
The watcher is on the mhd file, and when it send a signal:
we find the item in the data tree corresponding to that file (in the data tree the items are written with an extra 0 at the end of the pathname)
We reload all these items stored in a vector

vv/vvMainWindow.cxx
vv/vvMainWindow.h

index 989027b962c6ffdd472aa7b59a3bebd660754fb8..2b414926abb673fd0bfa10f8eae36f1f5b750646 100644 (file)
@@ -25,6 +25,7 @@ It is distributed under dual licence
 #include <QUrl>
 #include <QSettings>
 #include <QShortcut>
+#include <QFileSystemWatcher>
 
 // VV include
 #include "vvMainWindow.h"
@@ -982,6 +983,12 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
 
         linkPanel->addImage(imageManager->GetFileName(), id.toStdString());
 
+        //Create a watcher to see if the image file is modified. In such a case, reload it automatically
+        QFileSystemWatcher* watcher = new QFileSystemWatcher;
+        watcher->addPath(files[i].c_str());
+        connect(watcher, SIGNAL(fileChanged(const QString&)), this, SLOT(SlotFileChanged(const QString&)));
+
+
         connect(mSlicerManagers.back(), SIGNAL(currentImageChanged(std::string)),
           this,SLOT(CurrentImageChanged(std::string)));
         connect(mSlicerManagers.back(), SIGNAL(currentPickedImageChanged(std::string)),
@@ -1441,6 +1448,29 @@ QString vvMainWindow::GetVectorIntAsString(std::vector<int> vectorInt)
 }
 //------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
+void vvMainWindow::SlotFileChanged(const QString& pathname)
+{
+  std::vector<QTreeWidgetItem*> items = GetItemFromPathname(pathname);
+  for (unsigned int i=0; i< items.size(); ++i)
+    ReloadImage(items[i], 0);
+}
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+std::vector<QTreeWidgetItem*> vvMainWindow::GetItemFromPathname(const QString& pathname)
+{
+  std::vector<QTreeWidgetItem*> items;
+  for (int i = 0; i < DataTree->topLevelItemCount(); ++i) {
+    QString tempItemPathname(DataTree->topLevelItem(i)->data(COLUMN_IMAGE_NAME,Qt::UserRole).toString());
+    tempItemPathname = tempItemPathname.left(tempItemPathname.length() - 1);
+    if (tempItemPathname == pathname)
+      items.push_back(DataTree->topLevelItem(i));
+  }
+  return items;
+}
+//------------------------------------------------------------------------------
+
 //------------------------------------------------------------------------------
 //this actually returns the SlicerManager index!
 int vvMainWindow::GetSlicerIndexFromItem(QTreeWidgetItem* item)
index 07f38e5f9f415613c68410f8eb35445a504203b8..769865e4cef6c44f500dcc1f459c3ad012a4316f 100644 (file)
@@ -192,6 +192,7 @@ public slots:
   void UpdateRenderWindows();
   void UpdateMemoryUsage();
   void show();
+  void SlotFileChanged(const QString& pathname);
   
 protected:
   
@@ -230,6 +231,7 @@ private:
   QString GetSizeInBytes(unsigned long size);
   QString GetVectorDoubleAsString(std::vector<double> vectorDouble);
   QString GetVectorIntAsString(std::vector<int> vectorInt);
+  std::vector<QTreeWidgetItem*> GetItemFromPathname(const QString& pathname);
   int GetSlicerIndexFromItem(QTreeWidgetItem* item); //this actually returns the SlicerManager index TODO: rename it to GetSlicerManagerIndexFromItem
   QTreeWidgetItem* GetItemFromSlicerManager(vvSlicerManager* sm);
 #if (VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION >= 1) || VTK_MAJOR_VERSION >= 9