From bcdc77209b18b6ecb84aba19f534c01485654835 Mon Sep 17 00:00:00 2001
From: Andreas Schenk <andreas_schenk@hms.harvard.edu>
Date: Wed, 1 Dec 2010 17:57:43 -0500
Subject: [PATCH] worked on centering of images and display of additional
 panels in data viewer

---
 modules/gui/src/data_viewer/argand.cc         | 37 +++++++++++++------
 modules/gui/src/data_viewer/argand.hh         | 16 +++++---
 modules/gui/src/data_viewer/data_viewer.cc    |  1 +
 .../src/data_viewer/graphics_image_item.cc    |  2 +-
 .../data_viewer/graphics_image_values_item.cc |  8 ++--
 modules/gui/src/data_viewer/viewer_panel.cc   | 15 +++++++-
 modules/gui/src/data_viewer/viewer_panel.hh   |  1 +
 .../gui/src/data_viewer/widget_layer_item.cc  | 35 ++++++++++++------
 8 files changed, 81 insertions(+), 34 deletions(-)

diff --git a/modules/gui/src/data_viewer/argand.cc b/modules/gui/src/data_viewer/argand.cc
index fcff758e8..c9706cc6b 100644
--- a/modules/gui/src/data_viewer/argand.cc
+++ b/modules/gui/src/data_viewer/argand.cc
@@ -34,11 +34,15 @@
 
 namespace ost { namespace img { namespace gui {
 
-Argand::Argand(QGraphicsItem* p):
-  QGraphicsWidget(p),
-  buffer_(100,100)
+Argand::Argand(QWidget* p):
+  QWidget(p),
+  scalefactor_(1.0),
+  extent_(),
+  current_pos_(),
+  current_val_(),
+  buffer_(200,200)
 {
-  setMinimumSize(100,100);
+  setFixedSize(200,200);
   buffer_.fill(QColor(0,0,0,0));
 }
 
@@ -46,18 +50,20 @@ Argand::~Argand()
 {
 }
 
-void Argand::SetCurrentPixel(const Point& p)
+void Argand::SetCurrentPixel(const QPointF& p, Complex val)
 {
- //current_=p;
- //update();
+ current_pos_=Point(static_cast<int>(floor(p.x())),static_cast<int>(floor(p.y())));
+ current_val_=val;
+ update();
 }
 
 void Argand::SetExtent(const Extent& extent, const Data& data)
 {
+  extent_=extent;
   buffer_.fill(QColor(0,0,0,0));
   QPainter painter(&buffer_);
 
-  QPointF p0(size().width()/2,size().height()/2);
+  QPointF p0(100,100);
   painter.drawLine(p0.x(),0,p0.x(),size().height());
   painter.drawLine(0,p0.y(),size().width(),p0.y());
 
@@ -73,10 +79,10 @@ void Argand::SetExtent(const Extent& extent, const Data& data)
   }
 
   int dim=std::min(size().width(),size().height());
-  Real sf=0.5*(Real)(dim-10)/maxlen;
+  scalefactor_=0.5*(Real)(dim-10)/maxlen;
 
   for (std::vector<Complex>::iterator it=data_list.begin(); it!=data_list.end();++it) {
-    QPointF p((int)floor(it->real()*sf),(int)floor(it->imag()*sf));
+    QPointF p((int)floor(it->real()*scalefactor_),(int)floor(it->imag()*scalefactor_));
     painter.setPen(QPen(QColor::fromHsvF(fmod(std::arg(*it)/(2*M_PI)+0.5,1.0),1,0.8)));
     painter.drawLine(p0,p0+p);
   }
@@ -89,9 +95,16 @@ void Argand::ClearExtent()
   update();
 }
 
-void Argand::paint(QPainter* painter,const QStyleOptionGraphicsItem * option,QWidget * widget)
+void Argand::paintEvent(QPaintEvent* event)
 {
-  painter->drawPixmap(0,0,buffer_);
+  QPainter painter(this);
+  painter.drawPixmap(0,0,buffer_);
+  if(extent_.Contains(current_pos_)){
+    QPointF p0(100,100);
+    QPointF p(static_cast<int>(floor(current_val_.real()*scalefactor_)),static_cast<int>(floor(current_val_.imag()*scalefactor_)));
+    painter.setPen(QPen(QColor::fromHsvF(fmod(std::arg(current_val_)/(2*M_PI)+0.5,1.0),1,1.0),2));
+    painter.drawLine(p0,p0+p);
+  }
 }  
 
  
diff --git a/modules/gui/src/data_viewer/argand.hh b/modules/gui/src/data_viewer/argand.hh
index 1c36c6e01..a17211c5c 100644
--- a/modules/gui/src/data_viewer/argand.hh
+++ b/modules/gui/src/data_viewer/argand.hh
@@ -32,24 +32,30 @@
 
 #include <ost/gui/module_config.hh>
 
-#include <QGraphicsWidget>
+#include <QWidget>
 #include <QPixmap>
 
 namespace ost { namespace img { namespace gui {
 
-class DLLEXPORT_OST_GUI Argand: public QGraphicsWidget
+class DLLEXPORT_OST_GUI Argand: public QWidget
 {
   Q_OBJECT;
 public:
-  Argand(QGraphicsItem* p=0);
+  Argand(QWidget* p=0);
   ~Argand();
 
-  virtual void paint(QPainter* painter,const QStyleOptionGraphicsItem * option,QWidget * widget = 0);
 
  public slots:
-  void SetCurrentPixel(const Point& p);
+  void SetCurrentPixel(const QPointF& p,Complex val );
   void SetExtent(const Extent& e, const Data& d);
   void ClearExtent();
+protected:
+  virtual void paintEvent(QPaintEvent* event);
+  Real scalefactor_;
+  Extent extent_;
+  Point current_pos_;
+  Complex current_val_;
+
 private:
   QPixmap buffer_;
 
diff --git a/modules/gui/src/data_viewer/data_viewer.cc b/modules/gui/src/data_viewer/data_viewer.cc
index eebc398b7..45f61422d 100644
--- a/modules/gui/src/data_viewer/data_viewer.cc
+++ b/modules/gui/src/data_viewer/data_viewer.cc
@@ -86,6 +86,7 @@ DataViewer::DataViewer(QWidget* p, const Data& data, const QString& name):
   //scene_->setSceneRect(image->boundingRect());
   connect(image,SIGNAL(MousePositionReal(const QPointF&,Real)),info_,SLOT(SetMousePoint(const QPointF&,Real)));
   connect(image,SIGNAL(MousePositionComplex(const QPointF&,Complex)),info_,SLOT(SetMousePoint(const QPointF&,Complex)));
+  connect(image,SIGNAL(MousePositionComplex(const QPointF&,Complex)),argand_,SLOT(SetCurrentPixel(const QPointF&,Complex)));
   //connect(image,SIGNAL(MousePositionReal(const QPointF&,Real)),fft_,SLOT(SetPosition(const QPointF&)));
  // connect(image,SIGNAL(MousePositionComplex(const QPointF&,Complex)),fft_,SLOT(SetPosition(const QPointF&)));
   OnSlabChange(image->GetSlab());
diff --git a/modules/gui/src/data_viewer/graphics_image_item.cc b/modules/gui/src/data_viewer/graphics_image_item.cc
index 66b5a53d0..2a38c39b8 100644
--- a/modules/gui/src/data_viewer/graphics_image_item.cc
+++ b/modules/gui/src/data_viewer/graphics_image_item.cc
@@ -453,7 +453,7 @@ int GraphicsImageItem::GetSlab() const
 
 void GraphicsImageItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event)
 {
-  QPointF pos=event->scenePos();
+  QPointF pos=mapFromScene(event->scenePos());
   if(GetObservedData().GetType()==REAL){
     emit MousePositionReal(pos,GetObservedData().GetReal(Point(floor(pos.x()),floor(pos.y()))));
   }else{
diff --git a/modules/gui/src/data_viewer/graphics_image_values_item.cc b/modules/gui/src/data_viewer/graphics_image_values_item.cc
index d5540c973..cf99e4d4b 100644
--- a/modules/gui/src/data_viewer/graphics_image_values_item.cc
+++ b/modules/gui/src/data_viewer/graphics_image_values_item.cc
@@ -59,8 +59,8 @@ void GraphicsImageValuesItem::paint( QPainter * painter, const QStyleOptionGraph
         QString value_string = QString("%1").arg(pixel_value,0,'g',5);
         Real rv = normalizer->Convert(pixel_value);
         painter->setPen((rv>130.0) ? Qt::black : Qt::white);
-        QPoint p1=deviceTransform(painter->transform()).map(QPoint(x,y));
-        QPoint p2=deviceTransform(painter->transform()).map(QPoint(x+1,y+1));
+        QPoint p1=mapToScene(QPoint(x,y)).toPoint();
+        QPoint p2=mapToScene(QPoint(x+1,y+1)).toPoint();
         painter->drawText(QRect(p1,p2),Qt::AlignCenter,value_string);
       }
     }
@@ -71,8 +71,8 @@ void GraphicsImageValuesItem::paint( QPainter * painter, const QStyleOptionGraph
         QString value_string = QString("%1+i%2").arg(pixel_value.real(),0,'g',5).arg(pixel_value.imag(),0,'g',5);
         Real rv = normalizer->Convert(abs(pixel_value));
         painter->setPen((rv>130.0) ? Qt::black : Qt::white);
-        QPoint p1=deviceTransform(painter->transform()).map(QPoint(x,y));
-        QPoint p2=deviceTransform(painter->transform()).map(QPoint(x+1,y+1));
+        QPoint p1=mapToScene(QPoint(x,y)).toPoint();
+        QPoint p2=mapToScene(QPoint(x+1,y+1)).toPoint();
         painter->drawText(QRect(p1,p2),Qt::AlignCenter,value_string);
       }
     }
diff --git a/modules/gui/src/data_viewer/viewer_panel.cc b/modules/gui/src/data_viewer/viewer_panel.cc
index 341f8029f..1d892f32b 100644
--- a/modules/gui/src/data_viewer/viewer_panel.cc
+++ b/modules/gui/src/data_viewer/viewer_panel.cc
@@ -89,11 +89,15 @@ void ViewerPanel::wheelEvent(QWheelEvent* event)
     static const qreal scalemax=4096.0;
     if(event->delta()>0) {
       if(image_layer_->scale()>1.0/scalemax){
+        QPointF p=image_layer_->pos()-geometry().center();
         image_layer_->setScale(0.5*image_layer_->scale());
+        image_layer_->setPos(geometry().center()+p*0.5);
       }
     } else {
       if(image_layer_->scale()<scalemax){
+        QPointF p=image_layer_->pos()-geometry().center();
         image_layer_->setScale(2.0*image_layer_->scale());
+        image_layer_->setPos(geometry().center()+p*2.0);
       }
     }
     emit zoomed(image_layer_->scale());
@@ -118,7 +122,9 @@ void ViewerPanel::mouseDoubleClickEvent(QMouseEvent* event)
 
 GraphicsImageItem* ViewerPanel::AddImage(const Data& data)
 {
-  return image_layer_->AddImage(data);
+  GraphicsImageItem* item = image_layer_->AddImage(data);
+  CenterOn(image_layer_->GetCenteringPosition());
+  return item;
 }
 
 void ViewerPanel::AddWidget(QWidget* widget)
@@ -140,6 +146,13 @@ void 	ViewerPanel::scrollContentsBy ( int dx, int dy )
 {
 }
 
+void ViewerPanel::resizeEvent(QResizeEvent* event)
+{
+  QGraphicsView::resizeEvent(event);
+  QPointF p=image_layer_->pos()-QPointF(event->oldSize().width()/2.0,event->oldSize().height()/2.0);
+  image_layer_->setPos(QPointF(event->size().width()/2.0,event->size().height()/2.0)+p);
+}
+
 void ViewerPanel::mousePressEvent(QMouseEvent* event)
 {
   QGraphicsView::mousePressEvent(event);
diff --git a/modules/gui/src/data_viewer/viewer_panel.hh b/modules/gui/src/data_viewer/viewer_panel.hh
index be9ea07bf..9dce3fba9 100644
--- a/modules/gui/src/data_viewer/viewer_panel.hh
+++ b/modules/gui/src/data_viewer/viewer_panel.hh
@@ -56,6 +56,7 @@ protected:
   virtual void 	mouseReleaseEvent(QMouseEvent* event);
   virtual void 	mouseMoveEvent(QMouseEvent* event);
   virtual void 	scrollContentsBy ( int dx, int dy );
+  virtual void   resizeEvent(QResizeEvent* event);
   ImageLayer* image_layer_;
   WidgetLayerItem* widget_layer_;
   QPoint last_mouse_;
diff --git a/modules/gui/src/data_viewer/widget_layer_item.cc b/modules/gui/src/data_viewer/widget_layer_item.cc
index f6bcaab9c..e1d30da17 100644
--- a/modules/gui/src/data_viewer/widget_layer_item.cc
+++ b/modules/gui/src/data_viewer/widget_layer_item.cc
@@ -22,7 +22,7 @@
   Author: Andreas Schenk
 */
 
-#include <QDebug>
+#include <QWidget>
 #include <QPainter>
 #include "widget_layer_item.hh"
 #include <QGraphicsProxyWidget>
@@ -48,18 +48,17 @@ QRectF WidgetLayerItem::boundingRect() const
 
 void WidgetLayerItem::AddWidget(QWidget* widget)
 {
-  QGraphicsProxyWidget* proxy=new QGraphicsProxyWidget(this,Qt::Tool);
+  QGraphicsProxyWidget* proxy=new QGraphicsProxyWidget(this,Qt::Window);
   proxy->setWidget(widget);
   proxy->setFlag(QGraphicsItem::ItemIsMovable);
   proxy->setOpacity(0.9);
-//  proxy->setPos(30,30);
   add_widget_to_layout(proxy);
 }
 void WidgetLayerItem::AddWidget(QGraphicsWidget* widget)
 {
   widget->setFlag(QGraphicsItem::ItemIsMovable);
+  widget->setParentItem(this);
   widget->setOpacity(0.9);
-  //widget->setPos(30,30);
   add_widget_to_layout(widget);
 }
 
@@ -67,13 +66,27 @@ void WidgetLayerItem::AddWidget(QGraphicsWidget* widget)
 
 void WidgetLayerItem::add_widget_to_layout(QGraphicsWidget* widget)
 {
-  if(layout()->count()>=1){
-  QGraphicsLayoutItem* last=layout()->itemAt(layout()->count()-1);
-  dynamic_cast<QGraphicsAnchorLayout*>(layout())->addCornerAnchors(last, Qt::BottomLeftCorner, widget, Qt::TopLeftCorner);
-  dynamic_cast<QGraphicsAnchorLayout*>(layout())->addCornerAnchors(last, Qt::BottomRightCorner, widget, Qt::TopRightCorner);
-  }else{
-    dynamic_cast<QGraphicsAnchorLayout*>(layout())->addCornerAnchors(layout(), Qt::TopLeftCorner, widget, Qt::TopLeftCorner);
-  }
+    const static int margin=30;
+  /* if(layout()->count()>=1){
+   QGraphicsLayoutItem* last=layout()->itemAt(layout()->count()-1);
+   dynamic_cast<QGraphicsAnchorLayout*>(layout())->addCornerAnchors(last, Qt::BottomLeftCorner, widget, Qt::TopLeftCorner);
+   dynamic_cast<QGraphicsAnchorLayout*>(layout())->addCornerAnchors(last, Qt::BottomRightCorner, widget, Qt::TopRightCorner);
+   }else{
+     dynamic_cast<QGraphicsAnchorLayout*>(layout())->addCornerAnchors(layout(), Qt::TopLeftCorner, widget, Qt::TopLeftCorner);
+   }*/
+    // current widget is already child of this, therefore count is at least 2 if other widget present
+   if( childItems().size()>=2){
+     QGraphicsProxyWidget* last_proxy=dynamic_cast<QGraphicsProxyWidget*>(childItems().at(childItems().count()-2));
+     if(last_proxy){
+       QWidget* last=last_proxy->widget();
+       widget->setPos(last->pos().x(),last->pos().y()+last->frameGeometry().height()+margin );
+     }else{
+       QGraphicsWidget* last=dynamic_cast<QGraphicsWidget*>(childItems().at(childItems().count()-2));
+       widget->setPos(last->pos().x(),last->pos().y()+last->geometry().height()+margin );
+     }
+   }else{
+     widget->setPos(margin,margin);
+   }
 }
 
 }}} //ns
-- 
GitLab