Kaynağa Gözat

Merge pull request #422 from AndreasFetzer/allow-dynamic-table-layout-for-dicombrowser-final

Allow dynamic table layout for dicombrowser final
Julien Finet 11 yıl önce
ebeveyn
işleme
2899bd8502

+ 16 - 9
Libs/DICOM/Widgets/Resources/UI/ctkDICOMBrowser.ui

@@ -106,13 +106,20 @@
       <number>0</number>
      </property>
      <property name="leftMargin">
-      <number>12</number>
+      <number>0</number>
      </property>
      <property name="rightMargin">
-      <number>12</number>
+      <number>0</number>
      </property>
      <item>
-      <widget class="ctkDICOMTableManager" name="dicomTableManager" native="true"/>
+      <widget class="ctkDICOMTableManager" name="dicomTableManager">
+       <property name="dynamicTableLayout">
+        <bool>true</bool>
+       </property>
+       <property name="m_DynamicLayout" stdset="0">
+        <bool>true</bool>
+       </property>
+      </widget>
      </item>
     </layout>
    </item>
@@ -169,6 +176,12 @@
  </widget>
  <customwidgets>
   <customwidget>
+   <class>ctkDICOMTableManager</class>
+   <extends>QWidget</extends>
+   <header>ctkDICOMTableManager.h</header>
+   <container>1</container>
+  </customwidget>
+  <customwidget>
    <class>ctkDirectoryButton</class>
    <extends>QWidget</extends>
    <header>ctkDirectoryButton.h</header>
@@ -177,12 +190,6 @@
     <signal>directoryChanged(QString)</signal>
    </slots>
   </customwidget>
-  <customwidget>
-   <class>ctkDICOMTableManager</class>
-   <extends>QWidget</extends>
-   <header>ctkDICOMTableManager.h</header>
-   <container>1</container>
-  </customwidget>
  </customwidgets>
  <resources/>
  <connections>

+ 9 - 0
Libs/DICOM/Widgets/Resources/UI/ctkDICOMTableManager.ui

@@ -16,6 +16,12 @@
     <verstretch>0</verstretch>
    </sizepolicy>
   </property>
+  <property name="minimumSize">
+   <size>
+    <width>800</width>
+    <height>400</height>
+   </size>
+  </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
@@ -36,6 +42,9 @@ QSplitter::handle:vertical {height: 2px;}</string>
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
+     <property name="childrenCollapsible">
+      <bool>false</bool>
+     </property>
      <widget class="ctkDICOMTableView" name="patientsTable"/>
      <widget class="ctkDICOMTableView" name="studiesTable"/>
      <widget class="ctkDICOMTableView" name="seriesTable"/>

+ 2 - 1
Libs/DICOM/Widgets/ctkDICOMBrowser.cpp

@@ -227,6 +227,8 @@ ctkDICOMBrowser::ctkDICOMBrowser(QWidget* _parent):Superclass(_parent),
   this->setDatabaseDirectory(databaseDirectory);
   d->DirectoryButton->setDirectory(databaseDirectory);
 
+  d->dicomTableManager->setDICOMDatabase(d->DICOMDatabase.data());
+
   // TableView signals
   connect(d->dicomTableManager, SIGNAL(patientsSelectionChanged(const QItemSelection&, const QItemSelection&)),
           this, SLOT(onModelSelected(const QItemSelection&,const QItemSelection&)));
@@ -234,7 +236,6 @@ ctkDICOMBrowser::ctkDICOMBrowser(QWidget* _parent):Superclass(_parent),
           this, SLOT(onModelSelected(const QItemSelection&,const QItemSelection&)));
   connect(d->dicomTableManager, SIGNAL(seriesSelectionChanged(const QItemSelection&, const QItemSelection&)),
           this, SLOT(onModelSelected(const QItemSelection&,const QItemSelection&)));
-  d->dicomTableManager->setCTKDICOMDatabase(d->DICOMDatabase.data());
 
   connect(d->DirectoryButton, SIGNAL(directoryChanged(QString)), this, SLOT(setDatabaseDirectory(QString)));
 

+ 32 - 5
Libs/DICOM/Widgets/ctkDICOMTableManager.cpp

@@ -26,6 +26,7 @@
 // Qt includes
 #include <QHBoxLayout>
 #include <QVBoxLayout>
+#include <QResizeEvent>
 #include <QSplitter>
 
 class ctkDICOMTableManagerPrivate : public Ui_ctkDICOMTableManager
@@ -40,15 +41,18 @@ public:
   ~ctkDICOMTableManagerPrivate();
 
   void init();
-  void setCTKDICOMDatabase(ctkDICOMDatabase *db);
+  void setDICOMDatabase(ctkDICOMDatabase *db);
 
   ctkDICOMDatabase* dicomDatabase;
+
+  bool m_DynamicTableLayout;
 };
 
 //------------------------------------------------------------------------------
 
 ctkDICOMTableManagerPrivate::ctkDICOMTableManagerPrivate(ctkDICOMTableManager &obj)
   : q_ptr(&obj)
+  , m_DynamicTableLayout(false)
 {
 
 }
@@ -98,7 +102,7 @@ void ctkDICOMTableManagerPrivate::init()
 
 //------------------------------------------------------------------------------
 
-void ctkDICOMTableManagerPrivate::setCTKDICOMDatabase(ctkDICOMDatabase* db)
+void ctkDICOMTableManagerPrivate::setDICOMDatabase(ctkDICOMDatabase* db)
 {
   this->patientsTable->setDicomDataBase(db);
   this->studiesTable->setDicomDataBase(db);
@@ -127,7 +131,7 @@ ctkDICOMTableManager::ctkDICOMTableManager(ctkDICOMDatabase *db, QWidget *parent
 {
   Q_D(ctkDICOMTableManager);
   d->init();
-  d->setCTKDICOMDatabase(db);
+  d->setDICOMDatabase(db);
 }
 
 //------------------------------------------------------------------------------
@@ -139,10 +143,10 @@ ctkDICOMTableManager::~ctkDICOMTableManager()
 
 //------------------------------------------------------------------------------
 
-void ctkDICOMTableManager::setCTKDICOMDatabase(ctkDICOMDatabase* db)
+void ctkDICOMTableManager::setDICOMDatabase(ctkDICOMDatabase* db)
 {
   Q_D(ctkDICOMTableManager);
-  d->setCTKDICOMDatabase(db);
+  d->setDICOMDatabase(db);
 }
 
 //------------------------------------------------------------------------------
@@ -228,3 +232,26 @@ void ctkDICOMTableManager::onStudiesSelectionChanged(const QStringList &uids)
     }
   d->seriesTable->addSqlWhereCondition(studiesCondition);
 }
+
+void ctkDICOMTableManager::setDynamicTableLayout(bool dynamic)
+{
+  Q_D(ctkDICOMTableManager);
+  d->m_DynamicTableLayout = dynamic;
+}
+
+bool ctkDICOMTableManager::dynamicTableLayout() const
+{
+  Q_D(const ctkDICOMTableManager);
+  return d->m_DynamicTableLayout;
+}
+
+void ctkDICOMTableManager::resizeEvent(QResizeEvent *e)
+{
+  this->Superclass::resizeEvent(e);
+  Q_D(ctkDICOMTableManager);
+  if (!d->m_DynamicTableLayout)
+    return;
+
+  //Minimum size = 800 * 1.28 = 1024 => use horizontal layout (otherwise table size would be too small)
+  this->setTableOrientation(e->size().width() > 1.28*this->minimumWidth() ? Qt::Horizontal : Qt::Vertical);
+}

+ 13 - 1
Libs/DICOM/Widgets/ctkDICOMTableManager.h

@@ -44,6 +44,11 @@ class CTK_DICOM_WIDGETS_EXPORT ctkDICOMTableManager : public QWidget
     * Property for setting the table layout either to vertical or horizontal alignment
     */
   Q_PROPERTY(Qt::Orientation tableOrientation READ tableOrientation WRITE setTableOrientation)
+  /**
+    * Property for setting a dynamic table layout which switches according to the current
+    * window size between vertical and horizontal layout
+    */
+  Q_PROPERTY(bool dynamicTableLayout READ dynamicTableLayout WRITE setDynamicTableLayout)
 
 public:
   typedef QWidget Superclass;
@@ -56,7 +61,7 @@ public:
    * @brief Set the ctkDICOMDatabase
    * @param db the dicom database which should be used
    */
-  void setCTKDICOMDatabase(ctkDICOMDatabase* db);
+  void setDICOMDatabase(ctkDICOMDatabase* db);
 
   void setTableOrientation(const Qt::Orientation&) const;
   Qt::Orientation tableOrientation();
@@ -69,6 +74,9 @@ public:
   QStringList currentStudiesSelection();
   QStringList currentSeriesSelection();
 
+  void setDynamicTableLayout(bool);
+  bool dynamicTableLayout() const;
+
 public Q_SLOTS:
 
   void onPatientsQueryChanged(const QStringList&);
@@ -89,9 +97,13 @@ Q_SIGNALS:
   void seriesDoubleClicked(const QModelIndex&);
 
 protected:
+
+  virtual void resizeEvent(QResizeEvent *);
+
   QScopedPointer<ctkDICOMTableManagerPrivate> d_ptr;
 
 private:
+
   Q_DECLARE_PRIVATE(ctkDICOMTableManager)
   Q_DISABLE_COPY(ctkDICOMTableManager)
 };

+ 15 - 4
Libs/DICOM/Widgets/ctkDICOMTableView.cpp

@@ -127,9 +127,9 @@ void ctkDICOMTableViewPrivate::setUpTableView()
 
       QObject::connect(this->leSearchBox, SIGNAL(textChanged(QString)), q, SLOT(onFilterChanged()));
 
-      QObject::connect(this->dicomDatabase, SIGNAL(schemaUpdated()), q, SLOT(onDatabaseChanged()));
-
       QObject::connect(this->dicomDatabase, SIGNAL(databaseChanged()), q, SLOT(onDatabaseChanged()));
+      QObject::connect(this->dicomDatabase, SIGNAL(instanceAdded(QString)),
+                       q, SLOT(onInstanceAdded()));
     }
 }
 
@@ -215,7 +215,8 @@ void ctkDICOMTableView::setDicomDataBase(ctkDICOMDatabase *dicomDatabase)
   Q_D(ctkDICOMTableView);
   d->dicomDatabase = dicomDatabase;
   //Create connections for new database
-  QObject::connect(d->dicomDatabase, SIGNAL(schemaUpdated()), this, SLOT(onDatabaseChanged()));
+  QObject::connect(d->dicomDatabase, SIGNAL(instanceAdded(const QString&)),
+                   this, SLOT(onInstanceAdded()));
   QObject::connect(d->dicomDatabase, SIGNAL(databaseChanged()), this, SLOT(onDatabaseChanged()));
   this->setQuery();
   d->hideUIDColumns();
@@ -269,13 +270,23 @@ void ctkDICOMTableView::onFilterChanged()
 
   const QStringList uids = this->uidsForAllRows();
 
-  d->showFilterActiveWarning( d->dicomSQLFilterModel->rowCount() == 0 );
+  d->showFilterActiveWarning( d->dicomSQLFilterModel->rowCount() == 0 &&
+                              d->dicomSQLModel.rowCount() != 0);
 
   d->tblDicomDatabaseView->clearSelection();
   emit queryChanged(uids);
 }
 
 //------------------------------------------------------------------------------
+void ctkDICOMTableView::onInstanceAdded()
+{
+  Q_D(ctkDICOMTableView);
+  d->sqlWhereConditions.clear();
+  d->tblDicomDatabaseView->clearSelection();
+  d->leSearchBox->clear();
+}
+
+//------------------------------------------------------------------------------
 void ctkDICOMTableView::setQuery(const QStringList &uids)
 {
   Q_D(ctkDICOMTableView);

+ 5 - 0
Libs/DICOM/Widgets/ctkDICOMTableView.h

@@ -140,6 +140,11 @@ protected Q_SLOTS:
    */
   void onFilterChanged();
 
+  /**
+   * @brief Called if a new instance was added to the database
+   */
+  void onInstanceAdded();
+
 Q_SIGNALS:
   /**
    * @brief Is emitted when the selection in the tableview has changed