Explorar o código

First version of ctkDICOMHost that sends selected series to app

Ivo Wolf %!s(int64=13) %!d(string=hai) anos
pai
achega
8f5a663548

+ 3 - 1
Applications/ctkDICOMHost/ctkDICOMHostMain.cpp

@@ -159,8 +159,10 @@ int main(int argc, char** argv)
 
   widget->show();
 
-  ctkDICOMHostMainLogic *logic = new ctkDICOMHostMainLogic(ui.placeHolderForHostedApp);
+  ctkDICOMHostMainLogic *logic = new ctkDICOMHostMainLogic(ui.placeHolderForHostedApp, ui.placeHolderForDICOMAppWidget);
   logic->connect(ui.configureHostedApp,SIGNAL(clicked()), logic, SLOT(configureHostedApp()));
+  logic->connect(ui.sendDataToHostedApp,SIGNAL(clicked()), logic, SLOT(sendDataToHostedApp()));
+  logic->connect(logic, SIGNAL(TreeSelectionChanged(const QString &)), ui.selection, SLOT(setText(const QString &)));
 
   //ctkDICOMAppWidget DICOMApp(widget);
 

+ 78 - 5
Applications/ctkDICOMHost/ctkDICOMHostMainLogic.cpp

@@ -2,21 +2,37 @@
 #include <QDebug>
 #include <QFileDialog>
 #include <QApplication>
+#include <QModelIndex>
+#include <QTreeView>
+#include <QItemSelectionModel>
 
 // ctk includes
 #include "ctkDICOMHostMainLogic.h"
 #include "ctkHostedAppPlaceholderWidget.h"
 #include "ctkExampleHostControlWidget.h"
 #include "ctkExampleDicomHost.h"
+#include "ctkDICOMAppWidget.h"
+#include "ctkDICOMModel.h"
+#include "ctkDICOMDatabase.h"
+#include "ctkDicomAvailableDataHelper.h"
 
-ctkDICOMHostMainLogic::ctkDICOMHostMainLogic(ctkHostedAppPlaceholderWidget* placeHolder) : 
+ctkDICOMHostMainLogic::ctkDICOMHostMainLogic(ctkHostedAppPlaceholderWidget* placeHolder, ctkDICOMAppWidget* dicomAppWidget) : 
   QObject(placeHolder), 
-  placeHolderForHostedApp(placeHolder)
+  PlaceHolderForHostedApp(placeHolder),
+  DicomAppWidget(dicomAppWidget),
+  ValidSelection(false)
 {
-  this->Host = new ctkExampleDicomHost(placeHolderForHostedApp);
+  this->Host = new ctkExampleDicomHost(PlaceHolderForHostedApp);
   this->HostControls = new ctkExampleHostControlWidget(Host, placeHolder);
   this->HostControls->show();
-  //connect(placeHolder,SIGNAL(resized()),SLOT(placeholderResized()));
+
+  disconnect(this->Host,SIGNAL(startProgress()),this->Host,SLOT(onStartProgress()));
+  connect(this->Host,SIGNAL(startProgress()),this,SLOT(onStartProgress()));
+
+  QTreeView * treeview = dicomAppWidget->findChild<QTreeView*>("TreeView");
+  QItemSelectionModel* selectionmodel = treeview->selectionModel();
+  connect(selectionmodel, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )),
+    this, SLOT(onTreeSelectionChanged(const QItemSelection &, const QItemSelection &)));
 }
 
 ctkDICOMHostMainLogic::~ctkDICOMHostMainLogic()
@@ -26,7 +42,7 @@ ctkDICOMHostMainLogic::~ctkDICOMHostMainLogic()
 void ctkDICOMHostMainLogic::configureHostedApp()
 {
   //qDebug() << "load button clicked";
-  AppFileName = QFileDialog::getOpenFileName(placeHolderForHostedApp,"Choose hosted application",QApplication::applicationDirPath());
+  AppFileName = QFileDialog::getOpenFileName(PlaceHolderForHostedApp,"Choose hosted application",QApplication::applicationDirPath());
   //HostControls->setAppFileName(name);
   //if (this->Host)
   //  {
@@ -36,3 +52,60 @@ void ctkDICOMHostMainLogic::configureHostedApp()
   //  }
   HostControls->setAppFileName(AppFileName);
 }
+
+void ctkDICOMHostMainLogic::sendDataToHostedApp()
+{
+  //if(Host->
+}
+
+void ctkDICOMHostMainLogic::onTreeSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected)
+{
+    ValidSelection=false;
+
+    if(selected.indexes().count() > 0)
+    {
+      foreach (const QModelIndex &index, selected.indexes()) {
+
+        ctkDICOMModel* model = const_cast<ctkDICOMModel*>(qobject_cast<const ctkDICOMModel*>(index.model()));
+        QModelIndex index0 = index.sibling(index.row(), 0);
+
+        if(model && (model->data(index0,ctkDICOMModel::TypeRole) == static_cast<int>(ctkDICOMModel::SeriesType)))
+        {
+          QString s = "Series selected: ";
+          QString seriesUID = model->data(index0,ctkDICOMModel::UIDRole).toString();
+          s.append(seriesUID);
+          SelectedFiles = DicomAppWidget->database()->filesForSeries(seriesUID);
+          emit TreeSelectionChanged(s);
+          ValidSelection=true;
+        }
+      }
+    }
+    if (ValidSelection==false)
+      emit TreeSelectionChanged("no series selected");
+}
+
+//----------------------------------------------------------------------------
+void ctkDICOMHostMainLogic::onStartProgress()
+{
+  if(ValidSelection)
+  {
+    ctkDicomAppHosting::AvailableData data;
+    foreach (const QString &str, SelectedFiles) {
+      if (str.isEmpty())
+        continue;
+      qDebug() << str;
+
+      ctkDicomAvailableDataHelper::addToAvailableData(data, 
+        Host->objectLocatorCache(), 
+        str);
+    }
+
+    qDebug()<<"send dataDescriptors";
+    bool success = Host->publishData(data, true);
+    if(!success)
+    {
+      qCritical() << "Failed to publish data";
+    }
+    qDebug() << "  notifyDataAvailable returned: " << success;
+  }
+}

+ 15 - 2
Applications/ctkDICOMHost/ctkDICOMHostMainLogic.h

@@ -2,25 +2,38 @@
 #define CTKDICOMHOSTMAINLOGIC_H
 
 #include <QObject.h>
+#include <QStringList.h>
 
 class ctkHostedAppPlaceholderWidget;
 class ctkExampleDicomHost;
 class ctkExampleHostControlWidget;
+class ctkDICOMAppWidget;
+class QModelIndex;
+class QItemSelection;
 
 class ctkDICOMHostMainLogic :
   public QObject
 {
   Q_OBJECT
 public:
-  ctkDICOMHostMainLogic(ctkHostedAppPlaceholderWidget*);
+  ctkDICOMHostMainLogic(ctkHostedAppPlaceholderWidget*, ctkDICOMAppWidget*);
   virtual ~ctkDICOMHostMainLogic();
 public slots:
   void configureHostedApp();
+  void sendDataToHostedApp();
+protected slots:
+  void onTreeSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
+  void onStartProgress();
+signals:
+  void TreeSelectionChanged(const QString &);
 protected:
   ctkExampleDicomHost* Host;
   ctkExampleHostControlWidget* HostControls;
-  ctkHostedAppPlaceholderWidget* placeHolderForHostedApp;
+  ctkHostedAppPlaceholderWidget* PlaceHolderForHostedApp;
+  ctkDICOMAppWidget* DicomAppWidget;
   QString AppFileName;
+  bool ValidSelection;
+  QStringList SelectedFiles;
 };
 
 #endif

+ 36 - 5
Applications/ctkDICOMHost/ctkDICOMHostMainWidget.ui

@@ -30,7 +30,7 @@
        <property name="minimumSize">
         <size>
          <width>300</width>
-         <height>0</height>
+         <height>300</height>
         </size>
        </property>
        <property name="frameShape">
@@ -44,11 +44,42 @@
     </layout>
    </item>
    <item>
-    <widget class="QPushButton" name="configureHostedApp">
-     <property name="text">
-      <string>Configure Hosted App</string>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QPushButton" name="configureHostedApp">
+       <property name="text">
+        <string>Configure Hosted App</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="sendDataToHostedApp">
+       <property name="text">
+        <string>Send Data to Hosted App</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="selection">
+       <property name="text">
+        <string>nothing selected</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>299</height>
+      </size>
      </property>
-    </widget>
+    </spacer>
    </item>
   </layout>
  </widget>

+ 6 - 0
Libs/DICOM/Widgets/ctkDICOMAppWidget.cpp

@@ -246,6 +246,12 @@ bool ctkDICOMAppWidget::searchWidgetPopUpMode(){
 }
 
 //----------------------------------------------------------------------------
+ctkDICOMDatabase* ctkDICOMAppWidget::database(){
+  Q_D(ctkDICOMAppWidget);
+  return d->DICOMDatabase.data();
+}
+
+//----------------------------------------------------------------------------
 void ctkDICOMAppWidget::setSearchWidgetPopUpMode(bool flag){
   Q_D(ctkDICOMAppWidget);
 

+ 4 - 0
Libs/DICOM/Widgets/ctkDICOMAppWidget.h

@@ -29,10 +29,12 @@
 class ctkDICOMAppWidgetPrivate;
 class ctkThumbnailLabel;
 class QModelIndex;
+class ctkDICOMDatabase;
 
 class CTK_DICOM_WIDGETS_EXPORT ctkDICOMAppWidget : public QWidget
 {
   Q_OBJECT
+  Q_PROPERTY(ctkDICOMDatabase* database READ database)
   Q_PROPERTY(QString databaseDirectory READ databaseDirectory WRITE setDatabaseDirectory)
   Q_PROPERTY(bool searchWidgetPopUpMode READ searchWidgetPopUpMode WRITE setSearchWidgetPopUpMode)
 
@@ -49,6 +51,8 @@ public:
   void setSearchWidgetPopUpMode(bool flag);
   bool searchWidgetPopUpMode();
 
+  ctkDICOMDatabase* database();
+
 public slots:
   void setDatabaseDirectory(const QString& directory);
   void onAddToDatabase();