소스 검색

Add ctkThumbnailListWidget to CTK/Widgets

nherlambang 14 년 전
부모
커밋
63f10b1a88

+ 38 - 0
Libs/Widgets/Resources/UI/ctkThumbnailListWidget.ui

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ctkThumbnailListWidget</class>
+ <widget class="QWidget" name="ctkThumbnailListWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>224</width>
+    <height>237</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QScrollArea" name="ScrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="ScrollAreaContentWidget">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>198</width>
+        <height>211</height>
+       </rect>
+      </property>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 73 - 0
Libs/Widgets/Testing/Cpp/ctkThumbnailListWidgetTest1.cpp

@@ -0,0 +1,73 @@
+/*=========================================================================
+
+  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.commontk.org/LICENSE
+
+  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 <QApplication>
+#include <QList>
+#include <QPixmap>
+#include <QTimer>
+#include <QVariant>
+
+// ctkDICOMCore includes
+#include "ctkThumbnailListWidget.h"
+
+// STD includes
+#include <iostream>
+
+int ctkThumbnailListWidgetTest1( int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+
+  ctkThumbnailListWidget widget;
+
+  QPixmap pix1(QSize(128, 128));;
+  QPixmap pix2(QSize(64, 64));
+  QPixmap pix3(QSize(256, 256));
+
+  pix1.fill(Qt::green);
+  pix2.fill(Qt::yellow);
+  pix3.fill(Qt::blue);
+
+  QList<QPixmap> pixList;
+
+  widget.setThumbnailWidth(128);
+  if(widget.thumbnailWidth() != 128)
+    {
+      std::cerr << "ctkThumbnailListWidget::setThumbnailWidth failed."
+		<< " text: " << qPrintable(QVariant(widget.thumbnailWidth()).toString())
+		<< " expected: 128" << std::endl;
+      return EXIT_FAILURE;
+    }
+
+  pixList.append(pix1);
+  pixList.append(pix2);
+  pixList.append(pix3);
+
+  widget.addThumbnails(pixList);
+
+  widget.show();
+
+  if (argc <= 1 || QString(argv[1]) != "-I")
+    {
+    QTimer::singleShot(200, &app, SLOT(quit()));
+    }
+
+  return app.exec();
+}

+ 202 - 0
Libs/Widgets/ctkThumbnailListWidget.cpp

@@ -0,0 +1,202 @@
+/*=========================================================================
+
+  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.commontk.org/LICENSE
+
+  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 include
+#include <QDateTime>
+#include <QDir>
+#include <QFile>
+#include <QFileInfo>
+#include <QGridLayout>
+#include <QPixmap>
+#include <QPushButton>
+#include <QResizeEvent>
+
+// ctk includes
+#include "ctkLogger.h"
+
+// ctkWidgets includes
+#include "ctkFlowLayout.h"
+
+// ctkDICOMWidgets includes
+#include "ctkThumbnailListWidget.h"
+#include "ctkThumbnailWidget.h"
+#include "ui_ctkThumbnailListWidget.h"
+
+// STD includes
+#include <iostream>
+
+static ctkLogger logger("org.commontk.DICOM.Widgets.ctkThumbnailListWidget");
+
+//----------------------------------------------------------------------------
+class ctkThumbnailListWidgetPrivate: public Ui_ctkThumbnailListWidget
+{
+public:
+  ctkThumbnailListWidgetPrivate(ctkThumbnailListWidget* parent);
+
+  QString DatabaseDirectory;
+  QModelIndex CurrentSelectedModel;
+
+  int ThumbnailWidth;
+
+  void clearAllThumbnails();
+ 
+  ctkThumbnailListWidget* const q_ptr;
+  Q_DECLARE_PUBLIC(ctkThumbnailListWidget);
+};
+
+//----------------------------------------------------------------------------
+// ctkThumbnailListWidgetPrivate methods
+
+//----------------------------------------------------------------------------
+ctkThumbnailListWidgetPrivate::ctkThumbnailListWidgetPrivate(ctkThumbnailListWidget* parent): q_ptr(parent){
+  this->ThumbnailWidth = -1;
+}
+
+void ctkThumbnailListWidgetPrivate::clearAllThumbnails(){
+    Q_Q(ctkThumbnailListWidget);
+
+    // Remove previous displayed thumbnails
+    QLayoutItem* item;
+    while((item = this->ScrollAreaContentWidget->layout()->takeAt(0)))
+    {
+        ctkThumbnailWidget* thumbnailWidget = qobject_cast<ctkThumbnailWidget*>(item->widget());
+        if(thumbnailWidget)
+        {
+            q->disconnect(thumbnailWidget, SIGNAL(selected(ctkThumbnailWidget)), q, SLOT(onThumbnailSelected(ctkThumbnailWidget)));
+            q->disconnect(thumbnailWidget, SIGNAL(selected(ctkThumbnailWidget)), q, SIGNAL(selected(ctkThumbnailWidget)));
+            q->disconnect(thumbnailWidget, SIGNAL(doubleClicked(ctkThumbnailWidget)), q, SIGNAL(doubleClicked(ctkThumbnailWidget)));
+        }
+        item->widget()->deleteLater();
+    }
+}
+
+//----------------------------------------------------------------------------
+// ctkThumbnailListWidget methods
+
+//----------------------------------------------------------------------------
+ctkThumbnailListWidget::ctkThumbnailListWidget(QWidget* _parent):Superclass(_parent), 
+									   d_ptr(new ctkThumbnailListWidgetPrivate(this))
+{
+    Q_D(ctkThumbnailListWidget);
+
+    d->setupUi(this);
+
+    d->ScrollAreaContentWidget->setLayout(new ctkFlowLayout);
+    qobject_cast<ctkFlowLayout*>(d->ScrollAreaContentWidget->layout())->setHorizontalSpacing(4);
+}
+
+//----------------------------------------------------------------------------
+ctkThumbnailListWidget::~ctkThumbnailListWidget()
+{
+    Q_D(ctkThumbnailListWidget);
+
+    d->clearAllThumbnails();
+}
+
+//----------------------------------------------------------------------------
+void ctkThumbnailListWidget::addThumbnails(QList<QPixmap> thumbnails)
+{
+  Q_D(ctkThumbnailListWidget);
+
+  for(int i=0; i<thumbnails.count(); i++)
+    {
+      ctkThumbnailWidget* widget = new ctkThumbnailWidget(d->ScrollAreaContentWidget);
+      widget->setText("");
+      if(d->ThumbnailWidth > 0){
+	widget->setMaximumWidth(d->ThumbnailWidth);
+	widget->setMinimumWidth(d->ThumbnailWidth);
+      }
+      widget->setPixmap(thumbnails[i]);
+      d->ScrollAreaContentWidget->layout()->addWidget(widget);
+
+      this->connect(widget, SIGNAL(selected(ctkThumbnailWidget)), this, SLOT(onThumbnailSelected(ctkThumbnailWidget)));
+      this->connect(widget, SIGNAL(selected(ctkThumbnailWidget)), this, SIGNAL(selected(ctkThumbnailWidget)));
+      this->connect(widget, SIGNAL(doubleClicked(ctkThumbnailWidget)), this, SIGNAL(doubleClicked(ctkThumbnailWidget)));
+    }
+}
+
+//----------------------------------------------------------------------------
+void ctkThumbnailListWidget::selectThumbnail(int index){
+    Q_D(ctkThumbnailListWidget);
+
+    int count = d->ScrollAreaContentWidget->layout()->count();
+
+    logger.debug("Select thumbnail " + QVariant(index).toString() + " of " + QVariant(count).toString());
+
+    if(index >= count)return;
+
+    for(int i=0; i<count; i++)
+      {
+      ctkThumbnailWidget* thumbnailWidget = qobject_cast<ctkThumbnailWidget*>(d->ScrollAreaContentWidget->layout()->itemAt(i)->widget());
+      if(i == index)
+        {
+        thumbnailWidget->setSelected(true);
+        d->ScrollArea->ensureWidgetVisible(thumbnailWidget);
+        }
+      else
+        {
+        thumbnailWidget->setSelected(false);
+        }
+      }
+}
+
+//----------------------------------------------------------------------------
+void ctkThumbnailListWidget::onThumbnailSelected(const ctkThumbnailWidget &widget){
+    Q_D(ctkThumbnailListWidget);
+    for(int i=0; i<d->ScrollAreaContentWidget->layout()->count(); i++)
+    {
+        ctkThumbnailWidget* thumbnailWidget = qobject_cast<ctkThumbnailWidget*>(d->ScrollAreaContentWidget->layout()->itemAt(i)->widget());
+        if(thumbnailWidget && (&widget != thumbnailWidget))
+        {
+            thumbnailWidget->setSelected(false);
+        }
+    }
+}
+
+//----------------------------------------------------------------------------
+void ctkThumbnailListWidget::setThumbnailWidth(int width){
+  Q_D(ctkThumbnailListWidget);
+  for(int i=0; i<d->ScrollAreaContentWidget->layout()->count(); i++)
+    {
+    ctkThumbnailWidget* thumbnailWidget = qobject_cast<ctkThumbnailWidget*>(d->ScrollAreaContentWidget->layout()->itemAt(i)->widget());
+    if(thumbnailWidget)
+      {
+        if(width > 0){
+          thumbnailWidget->setMaximumWidth(width);
+          thumbnailWidget->setMinimumWidth(width);
+        }
+      }
+    }
+
+  d->ThumbnailWidth = width;
+}
+
+//----------------------------------------------------------------------------
+int ctkThumbnailListWidget::thumbnailWidth(){
+  Q_D(ctkThumbnailListWidget);
+  return d->ThumbnailWidth;
+}
+
+//----------------------------------------------------------------------------
+void ctkThumbnailListWidget::reset(){
+  Q_D(ctkThumbnailListWidget);
+
+  d->clearAllThumbnails();
+}

+ 71 - 0
Libs/Widgets/ctkThumbnailListWidget.h

@@ -0,0 +1,71 @@
+/*=========================================================================
+
+  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.commontk.org/LICENSE
+
+  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.
+
+=========================================================================*/
+
+#ifndef __ctkThumbnailListWidget_h
+#define __ctkThumbnailListWidget_h
+
+// Qt includes 
+#include <QWidget>
+
+#include "ctkWidgetsExport.h"
+
+class QModelIndex;
+class ctkThumbnailListWidgetPrivate;
+class ctkThumbnailWidget;
+
+class CTK_WIDGETS_EXPORT ctkThumbnailListWidget : public QWidget
+{
+  Q_OBJECT
+public:
+  typedef QWidget Superclass;
+  explicit ctkThumbnailListWidget(QWidget* parent=0);
+  virtual ~ctkThumbnailListWidget();
+  
+  /// Add multiple thumbnails to the widget
+  void addThumbnails(QList<QPixmap> thumbnails);
+
+  /// Select a thumbnail
+  void selectThumbnail(int index);
+
+  /// Clear all the thumbnails
+  void reset();
+
+  /// Get thumbnails width
+  int thumbnailWidth();
+
+protected:
+  QScopedPointer<ctkThumbnailListWidgetPrivate> d_ptr;
+
+private:
+  Q_DECLARE_PRIVATE(ctkThumbnailListWidget);
+  Q_DISABLE_COPY(ctkThumbnailListWidget);
+
+signals:
+  void selected(const ctkThumbnailWidget& widget);
+  void doubleClicked(const ctkThumbnailWidget& widget);
+
+public slots:
+  void onThumbnailSelected(const ctkThumbnailWidget& widget);
+
+  /// Set thumbnails width
+  void setThumbnailWidth(int width);
+};
+
+#endif