Selaa lähdekoodia

ENH: use writable table model for directory list, which is now stored in the database, too

Marco Nolden 15 vuotta sitten
vanhempi
commit
cf93273499

+ 55 - 10
Libs/DICOM/Widgets/ctkDICOMDirectoryListWidget.cpp

@@ -1,7 +1,15 @@
 
 #include <QFileDialog>
 #include <QSqlQueryModel>
+#include <QSqlTableModel>
 #include <QSqlQuery>
+#include <QSqlRecord>
+#include <QSqlError>
+#include <QSqlField>
+
+
+
+#include <QDebug>
 
 // ctkDICOMWidgets includes
 #include "ctkDICOMDirectoryListWidget.h"
@@ -16,14 +24,14 @@ class ctkDICOMDirectoryListWidgetPrivate: public ctkPrivate<ctkDICOMDirectoryLis
 public:
   ctkDICOMDirectoryListWidgetPrivate(){}
   ctkDICOM* dicom;
-  QSqlQueryModel* directoryListModel;
+  QSqlTableModel* directoryListModel;
 };
 
 //----------------------------------------------------------------------------
 // ctkDICOMDirectoryListWidgetPrivate methods
 
 
-//----------------------------------------------------------------------------
+//---------------------------
 // ctkDICOMDirectoryListWidget methods
 
 //----------------------------------------------------------------------------
@@ -37,7 +45,8 @@ ctkDICOMDirectoryListWidget::ctkDICOMDirectoryListWidget(QWidget* _parent):Super
   connect(d->addButton, SIGNAL(clicked()), this, SLOT(addDirectoryClicked()));
   connect(d->removeButton, SIGNAL(clicked()), this, SLOT(removeDirectoryClicked()));
 
-  d->directoryListModel = new QSqlQueryModel(this);
+  d->removeButton->setDisabled(true);
+
 
 
 }
@@ -51,7 +60,25 @@ ctkDICOMDirectoryListWidget::~ctkDICOMDirectoryListWidget()
 void ctkDICOMDirectoryListWidget::addDirectoryClicked()
 {
   CTK_D(ctkDICOMDirectoryListWidget);
-  QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"));
+  QString newDir = QFileDialog::getExistingDirectory(this, tr("Open Directory"));
+
+  if ( !newDir.isEmpty() )
+  {
+    QSqlRecord newDirRecord;
+    newDirRecord.append(QSqlField("Dirname",QVariant::String));
+    newDirRecord.setValue("Dirname",newDir);
+    bool success = d->directoryListModel->insertRecord(-1,newDirRecord);
+    bool success2 = d->directoryListModel->submitAll();
+    if ( !success2 )
+    {
+      qDebug() << d->directoryListModel->lastError();
+    }
+    //addDirectoryQuery.prepare("insert into Directories VALUES ( :dirname )");
+    //addDirectoryQuery.bindValue(":dirname",newDir);
+    //addDirectoryQuery.exec();
+
+//    d->directoryListModel;
+  }
 
 //d->directoryListView->setModel(NULL);
 // d->tableView->setModel(NULL);
@@ -60,18 +87,36 @@ void ctkDICOMDirectoryListWidget::addDirectoryClicked()
 //----------------------------------------------------------------------------
 void ctkDICOMDirectoryListWidget::removeDirectoryClicked()
 {
-
+  CTK_D(ctkDICOMDirectoryListWidget);
+  while ( ! d->directoryListView->selectionModel()->selectedIndexes().empty() )
+  {
+    d->directoryListModel->removeRow(
+        d->directoryListView->selectionModel()->selectedIndexes().first().row()
+    );
+  }
 }
 
 void ctkDICOMDirectoryListWidget::setDICOM(ctkDICOM* dicom)
 {
   CTK_D(ctkDICOMDirectoryListWidget);
   d->dicom = dicom;
-  QSqlQuery getDirectoriesQuery(dicom->database());
-  getDirectoriesQuery.exec("SELECT Dirname from Directories");
-  std::cout << getDirectoriesQuery.size();
-  d->directoryListModel->setQuery(getDirectoriesQuery);
-  //d->directoryListView->setModel(d->directoryListModel);
+  d->directoryListModel =  new QSqlTableModel(this,d->dicom->database());
+  d->directoryListModel->setTable("Directories");
+  d->directoryListModel->setEditStrategy(QSqlTableModel::OnFieldChange);
+  d->directoryListModel->select();
   d->directoryListView->setModel(d->directoryListModel);
 
+  connect ( d->directoryListView->selectionModel(),
+            SIGNAL(selectionChanged(const QItemSelection&,const QItemSelection&)),
+            this,
+            SLOT(directorySelectionChanged(const QItemSelection & , const QItemSelection &  )));
+
+
+}
+//----------------------------------------------------------------------------
+
+void ctkDICOMDirectoryListWidget::directorySelectionChanged( const QItemSelection  & selected, const QItemSelection  & deselected )
+{
+  CTK_D(ctkDICOMDirectoryListWidget);
+  d->removeButton->setEnabled( ! selected.empty() );
 }

+ 3 - 1
Libs/DICOM/Widgets/ctkDICOMDirectoryListWidget.h

@@ -23,6 +23,8 @@
 
 // Qt includes 
 #include <QWidget>
+#include <QItemSelection>
+
 
 // CTK includes
 #include <ctkPimpl.h>
@@ -44,7 +46,7 @@ public:
 public slots:
   void addDirectoryClicked();
   void removeDirectoryClicked();
-
+  void directorySelectionChanged( const QItemSelection  & selected, const QItemSelection  & deselected );
 
 private:
   CTK_DECLARE_PRIVATE(ctkDICOMDirectoryListWidget);