| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 | 
							- /*=========================================================================
 
-   Library:   CTK
 
-   Copyright (c) Kitware Inc.
 
-   Licensed under the Apache License, Version 2.0 (the "License");
 
-   you may not use this file except in compliance with the License.
 
-   You may obtain a copy of the License at
 
-       http://www.apache.org/licenses/LICENSE-2.0.txt
 
-   Unless required by applicable law or agreed to in writing, software
 
-   distributed under the License is distributed on an "AS IS" BASIS,
 
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-   See the License for the specific language governing permissions and
 
-   limitations under the License.
 
- =========================================================================*/
 
- // Qt includes
 
- #include <QDebug>
 
- #include <QList>
 
- #include <QMap>
 
- #include <QSettings>
 
- #include <QTableWidgetItem>
 
- #include <QVariant>
 
- /// CTK includes
 
- #include <ctkCheckableHeaderView.h>
 
- #include <ctkCheckableModelHelper.h>
 
- // ctkDICOMWidgets includes
 
- #include "ctkDICOMServerNodeWidget.h"
 
- #include "ui_ctkDICOMServerNodeWidget.h"
 
- // STD includes
 
- #include <iostream>
 
- //----------------------------------------------------------------------------
 
- class ctkDICOMServerNodeWidgetPrivate: public Ui_ctkDICOMServerNodeWidget
 
- {
 
- public:
 
-   ctkDICOMServerNodeWidgetPrivate(){}
 
- };
 
- //----------------------------------------------------------------------------
 
- // ctkDICOMServerNodeWidgetPrivate methods
 
- //----------------------------------------------------------------------------
 
- // ctkDICOMServerNodeWidget methods
 
- //----------------------------------------------------------------------------
 
- ctkDICOMServerNodeWidget::ctkDICOMServerNodeWidget(QWidget* parentWidget)
 
-   : Superclass(parentWidget)
 
-   , d_ptr(new ctkDICOMServerNodeWidgetPrivate)
 
- {
 
-   Q_D(ctkDICOMServerNodeWidget);
 
-  
 
-   d->setupUi(this);
 
-   // checkable headers.
 
-   d->NodeTable->model()->setHeaderData(0, Qt::Horizontal, Qt::Unchecked, Qt::CheckStateRole);
 
-   QHeaderView* previousHeaderView = d->NodeTable->horizontalHeader();
 
-   ctkCheckableHeaderView* headerView = new ctkCheckableHeaderView(Qt::Horizontal, d->NodeTable);
 
-   headerView->setClickable(previousHeaderView->isClickable());
 
-   headerView->setMovable(previousHeaderView->isMovable());
 
-   headerView->setHighlightSections(previousHeaderView->highlightSections());
 
-   headerView->checkableModelHelper()->setPropagateDepth(-1);
 
-   d->NodeTable->setHorizontalHeader(headerView);
 
-   d->RemoveButton->setEnabled(false);
 
-   this->readSettings();
 
-   connect(d->CallingAETitle, SIGNAL(textChanged(QString)),
 
-     this, SLOT(saveSettings()));
 
-   connect(d->StorageAETitle, SIGNAL(textChanged(QString)),
 
-     this, SLOT(saveSettings()));
 
-   connect(d->StoragePort, SIGNAL(textChanged(QString)),
 
-     this, SLOT(saveSettings()));
 
-   connect(d->AddButton, SIGNAL(clicked()),
 
-     this, SLOT(addServerNode()));
 
-   connect(d->RemoveButton, SIGNAL(clicked()),
 
-     this, SLOT(removeCurrentServerNode()));
 
-   connect(d->NodeTable, SIGNAL(cellChanged(int,int)),
 
-     this, SLOT(saveSettings()));
 
-   connect(d->NodeTable, SIGNAL(currentItemChanged(QTableWidgetItem*,QTableWidgetItem*)),
 
-     this, SLOT(updateRemoveButtonEnableState()));
 
- }
 
- //----------------------------------------------------------------------------
 
- ctkDICOMServerNodeWidget::~ctkDICOMServerNodeWidget()
 
- {
 
- }
 
- //----------------------------------------------------------------------------
 
- int ctkDICOMServerNodeWidget::addServerNode()
 
- {
 
-   Q_D(ctkDICOMServerNodeWidget);
 
-   const int rowCount = d->NodeTable->rowCount();
 
-   d->NodeTable->setRowCount( rowCount + 1 );
 
-   QTableWidgetItem* newItem = new QTableWidgetItem;
 
-   newItem->setCheckState( Qt::Unchecked );
 
-   d->NodeTable->setItem(rowCount, NameColumn, newItem);
 
-   d->NodeTable->setCurrentCell(rowCount, NameColumn);
 
-   // The old rowCount becomes the added row index
 
-   return rowCount;
 
- }
 
- //----------------------------------------------------------------------------
 
- int ctkDICOMServerNodeWidget::addServerNode(const QMap<QString, QVariant>& node)
 
- {
 
-   Q_D(ctkDICOMServerNodeWidget);
 
-   const int row = this->addServerNode();
 
-   
 
-   QTableWidgetItem *newItem;
 
-   newItem = new QTableWidgetItem( node["Name"].toString() );
 
-   newItem->setCheckState( Qt::CheckState(node["CheckState"].toInt()) );
 
-   d->NodeTable->setItem(row, NameColumn, newItem);
 
-   newItem = new QTableWidgetItem( node["AETitle"].toString() );
 
-   d->NodeTable->setItem(row, AETitleColumn, newItem);
 
-   newItem = new QTableWidgetItem( node["Address"].toString() );
 
-   d->NodeTable->setItem(row, AddressColumn, newItem);
 
-   newItem = new QTableWidgetItem( node["Port"].toString() );
 
-   d->NodeTable->setItem(row, PortColumn, newItem);
 
-   return row;
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMServerNodeWidget::removeCurrentServerNode()
 
- {
 
-   Q_D(ctkDICOMServerNodeWidget);
 
-   d->NodeTable->removeRow( d->NodeTable->currentRow() );
 
-   this->saveSettings();
 
-   this->updateRemoveButtonEnableState();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMServerNodeWidget::updateRemoveButtonEnableState()
 
- {
 
-   Q_D(ctkDICOMServerNodeWidget);
 
-   d->RemoveButton->setEnabled(d->NodeTable->rowCount() > 0);
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMServerNodeWidget::saveSettings()
 
- {
 
-   Q_D(ctkDICOMServerNodeWidget);
 
-   QSettings settings;
 
-   const int rowCount = d->NodeTable->rowCount();
 
-   
 
-   settings.setValue("ServerNodeCount", rowCount);
 
-   for (int row = 0; row < rowCount; ++row)
 
-     {
 
-     QMap<QString, QVariant> node = this->serverNodeParameters(row);
 
-     settings.setValue(QString("ServerNodes/%1").arg(row), QVariant(node));
 
-     }
 
-   settings.setValue("CallingAETitle", this->callingAETitle());
 
-   settings.setValue("StorageAETitle", this->storageAETitle());
 
-   settings.setValue("StoragePort", this->storagePort());
 
-   settings.sync();
 
- }
 
- //----------------------------------------------------------------------------
 
- void ctkDICOMServerNodeWidget::readSettings()
 
- {
 
-   Q_D(ctkDICOMServerNodeWidget);
 
-   d->NodeTable->setRowCount(0);
 
-   QSettings settings;
 
-   QMap<QString, QVariant> node;
 
-   if (settings.status() == QSettings::AccessError ||
 
-       settings.value("ServerNodeCount").toInt() == 0)
 
-     {
 
-     d->StorageAETitle->setText("CTKSTORE");
 
-     d->StoragePort->setText("11112");
 
-     d->CallingAETitle->setText("CTKSTORE");
 
-     // a dummy example
 
-     QMap<QString, QVariant> defaultServerNode;
 
-     defaultServerNode["Name"] = QString("ExampleHost");
 
-     defaultServerNode["CheckState"] = Qt::Unchecked;
 
-     defaultServerNode["AETitle"] = QString("AETITLE");
 
-     defaultServerNode["Address"] = QString("dicom.example.com");
 
-     defaultServerNode["Port"] = QString("11112");
 
-     this->addServerNode(defaultServerNode);
 
-     // the uk example - see http://www.dicomserver.co.uk/ 
 
-     // and http://www.medicalconnections.co.uk/
 
-     defaultServerNode["Name"] = QString("MedicalConnections");
 
-     defaultServerNode["CheckState"] = Qt::Unchecked;
 
-     defaultServerNode["AETitle"] = QString("ANYAE");
 
-     defaultServerNode["Address"] = QString("dicomserver.co.uk");
 
-     defaultServerNode["Port"] = QString("11112");
 
-     this->addServerNode(defaultServerNode);
 
-     return;
 
-     }
 
-   d->StorageAETitle->setText(settings.value("StorageAETitle").toString());
 
-   d->StoragePort->setText(settings.value("StoragePort").toString());
 
-   d->CallingAETitle->setText(settings.value("CallingAETitle").toString());
 
-   const int count = settings.value("ServerNodeCount").toInt();
 
-   for (int row = 0; row < count; ++row)
 
-     {
 
-     node = settings.value(QString("ServerNodes/%1").arg(row)).toMap();
 
-     this->addServerNode(node);
 
-     }
 
- }
 
- //----------------------------------------------------------------------------
 
- QString ctkDICOMServerNodeWidget::callingAETitle()const
 
- {
 
-   Q_D(const ctkDICOMServerNodeWidget);
 
-   return d->CallingAETitle->text();
 
- }
 
- //----------------------------------------------------------------------------
 
- QString ctkDICOMServerNodeWidget::storageAETitle()const
 
- {
 
-   Q_D(const ctkDICOMServerNodeWidget);
 
-   return d->StorageAETitle->text();
 
- }
 
- //----------------------------------------------------------------------------
 
- int ctkDICOMServerNodeWidget::storagePort()const
 
- {
 
-   Q_D(const ctkDICOMServerNodeWidget);
 
-   bool ok = false;
 
-   int port = d->StoragePort->text().toInt(&ok);
 
-   Q_ASSERT(ok);
 
-   return port;
 
- }
 
- //----------------------------------------------------------------------------
 
- QMap<QString,QVariant> ctkDICOMServerNodeWidget::parameters()const
 
- {
 
-   QMap<QString, QVariant> parameters;
 
-   parameters["CallingAETitle"] = this->callingAETitle();
 
-   parameters["StorageAETitle"] = this->storageAETitle();
 
-   parameters["StoragePort"] = this->storagePort();
 
-   return parameters;
 
- }
 
- //----------------------------------------------------------------------------
 
- QStringList ctkDICOMServerNodeWidget::serverNodes()const
 
- {
 
-   Q_D(const ctkDICOMServerNodeWidget);
 
-   QStringList nodes;
 
-   const int count = d->NodeTable->rowCount();
 
-   for (int row = 0; row < count; ++row)
 
-     {
 
-     QTableWidgetItem* item = d->NodeTable->item(row,NameColumn);
 
-     nodes << (item ? item->text() : QString(""));
 
-     }
 
-   // If there are duplicates, serverNodeParameters(QString) will behave
 
-   // strangely
 
-   Q_ASSERT(nodes.removeDuplicates() == 0);
 
-   return nodes;
 
- }
 
- //----------------------------------------------------------------------------
 
- QStringList ctkDICOMServerNodeWidget::selectedServerNodes()const
 
- {
 
-   Q_D(const ctkDICOMServerNodeWidget);
 
-   QStringList nodes;
 
-   const int count = d->NodeTable->rowCount();
 
-   for (int row = 0; row < count; ++row)
 
-     {
 
-     QTableWidgetItem* item = d->NodeTable->item(row, NameColumn);
 
-     if (item && item->checkState() == Qt::Checked)
 
-       {
 
-       nodes << item->text();
 
-       }
 
-     }
 
-   // If there are duplicates, serverNodeParameters(QString) will behave
 
-   // strangely
 
-   Q_ASSERT(nodes.removeDuplicates() == 0);
 
-   return nodes;
 
- }
 
- //----------------------------------------------------------------------------
 
- QMap<QString, QVariant> ctkDICOMServerNodeWidget::serverNodeParameters(const QString &node)const
 
- {
 
-   Q_D(const ctkDICOMServerNodeWidget);
 
-   QMap<QString, QVariant> parameters;
 
-   const int count = d->NodeTable->rowCount();
 
-   for (int row = 0; row < count; row++)
 
-     {
 
-     if ( d->NodeTable->item(row,0)->text() == node )
 
-       {
 
-       // TBD: not sure what it means to merge parameters
 
-       parameters.unite(this->serverNodeParameters(row));
 
-       }
 
-     }
 
-   return parameters;
 
- }
 
- //----------------------------------------------------------------------------
 
- QMap<QString, QVariant> ctkDICOMServerNodeWidget::serverNodeParameters(int row)const
 
- {
 
-   Q_D(const ctkDICOMServerNodeWidget);
 
-   QMap<QString, QVariant> node;
 
-   if (row < 0 || row >= d->NodeTable->rowCount())
 
-     {
 
-     return node;
 
-     }
 
-   const int columnCount = d->NodeTable->columnCount();
 
-   for (int column = 0; column < columnCount; ++column)
 
-     {
 
-     if (!d->NodeTable->item(row, column))
 
-       {
 
-       continue;
 
-       }
 
-     QString label = d->NodeTable->horizontalHeaderItem(column)->text();
 
-     node[label] = d->NodeTable->item(row, column)->data(Qt::DisplayRole);
 
-     }
 
-   node["CheckState"] = d->NodeTable->item(row, NameColumn) ?
 
-     d->NodeTable->item(row,0)->checkState() : Qt::Unchecked;
 
-   return node;
 
- }
 
 
  |