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