diff Applications/Qt/QCairoWidget.cpp @ 276:5de5699ad570 am-2

first display in QCairoWidget; no mouse interaction yet
author am@osimis.io
date Mon, 27 Aug 2018 12:21:52 +0200
parents
children a38465cc909f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Applications/Qt/QCairoWidget.cpp	Mon Aug 27 12:21:52 2018 +0200
@@ -0,0 +1,257 @@
+#include "QCairoWidget.h"
+
+#include <QPainter>
+#include <QPaintEvent>
+
+#include <stdexcept>
+
+QCairoWidget::QCairoWidget(QWidget *parent) :
+  QWidget(parent),
+  context_(NULL),
+  isMouseOver_(false),
+  mouseOverX_(0),
+  mouseOverY_(0)
+{
+  setMouseTracking(true);
+  updateNeeded_ = true;
+}
+
+
+
+QCairoWidget::~QCairoWidget()
+{
+}
+
+
+void QCairoWidget::paintEvent(QPaintEvent* event)
+{
+  QPainter painter(this);
+
+  if (image_.get() != NULL && context_ != NULL)
+  {
+    OrthancStone::BasicNativeApplicationContext::GlobalMutexLocker locker(*context_);
+    OrthancStone::IViewport& vp = context_->GetCentralViewport();
+    Orthanc::ImageAccessor a = surface_.GetAccessor();
+    vp.Render(a);
+    //image_->fill(0);
+    painter.drawImage(0, 0, *image_);
+  }
+  else
+  {
+    painter.fillRect(rect(), Qt::red);
+  }
+}
+
+
+//static void GetPixelCenter(double& x,
+//                           double& y,
+//                           const QMouseEvent* event)
+//{
+//  x = static_cast<double>(event->x()) + 0.5;
+//  y = static_cast<double>(event->y()) + 0.5;
+//}
+
+
+//void QCairoWidget::mousePressEvent(QMouseEvent* event)
+//{
+//  if (mouseTracker_.get() == NULL)
+//  {
+//    OrthancStone::MouseButton button;
+
+//    switch (event->button())
+//    {
+//      case Qt::LeftButton:
+//        button = OrthancStone::MouseButton_Left;
+//        break;
+
+//      case Qt::RightButton:
+//        button = OrthancStone::MouseButton_Right;
+//        break;
+
+//      case Qt::MiddleButton:
+//        button = OrthancStone::MouseButton_Middle;
+//        break;
+
+//      default:
+//        return;  // Unsupported button
+//    }
+
+//    double x, y;
+//    GetPixelCenter(x, y, event);
+////TODO    mouseTracker_.reset(viewport_.CreateMouseTracker(*scene_, button, x, y));
+//    repaint();
+//  }
+//}
+
+
+//void QCairoWidget::mouseReleaseEvent(QMouseEvent* event)
+//{
+//  if (mouseTracker_.get() != NULL)
+//  {
+//    mouseTracker_->MouseUp();
+//    mouseTracker_.reset(NULL);
+//    repaint();
+//  }
+//}
+
+
+//void QCairoWidget::mouseMoveEvent(QMouseEvent* event)
+//{
+//  if (mouseTracker_.get() == NULL)
+//  {
+//    if (rect().contains(event->pos()))
+//    {
+//      // Mouse over widget
+//      isMouseOver_ = true;
+//      mouseOverX_ = event->x();
+//      mouseOverY_ = event->y();
+//    }
+//    else
+//    {
+//      // Mouse out of widget
+//      isMouseOver_ = false;
+//    }
+//  }
+//  else
+//  {
+//    double x, y;
+//    GetPixelCenter(x, y, event);
+//    mouseTracker_->MouseMove(x, y);
+//    isMouseOver_ = false;
+//  }
+
+////  if (isMouseOver_)
+////  {
+////    UpdateMouseCoordinates(event->x(), event->y());
+////  }
+
+//  repaint();
+//}
+
+
+//void QCairoWidget::wheelEvent(QWheelEvent * event)
+//{
+//  if (mouseTracker_.get() == NULL)
+//  {
+//#if 0
+//    double x = static_cast<double>(event->x()) + 0.5;
+//    double y = static_cast<double>(event->y()) + 0.5;
+//    mouseTracker_.reset(viewport_.CreateMouseTracker(*scene_, MouseButton_Middle, x, y));
+
+//    switch (event->orientation())
+//    {
+//      case Qt::Horizontal:
+//        x += event->delta();
+//        break;
+
+//      case Qt::Vertical:
+//        y += event->delta();
+//        break;
+
+//      default:
+//        break;
+//    }
+
+//    mouseTracker_->MouseMove(x, y);
+//    mouseTracker_->MouseUp();
+//    mouseTracker_.reset(NULL);
+
+//    repaint();
+//#else
+//    if (event->orientation() == Qt::Vertical)
+//    {
+//      unsigned int slice = scene_->GetCurrentSlice();
+
+//      if (event->delta() < 0)
+//      {
+//        if (slice > 0)
+//        {
+//          scene_->SetCurrentSlice(slice - 1);
+//          emit SliceChanged(slice - 1);
+//        }
+//      }
+//      else
+//      {
+//        if (slice + 1 < scene_->GetSlicesCount())
+//        {
+//          scene_->SetCurrentSlice(slice + 1);
+//          emit SliceChanged(slice + 1);
+//        }
+//      }
+
+//      repaint();
+//    }
+//#endif
+//  }
+
+//  UpdateMouseCoordinates(event->x(), event->y());
+//}
+
+
+
+void QCairoWidget::resizeEvent(QResizeEvent* event)
+{
+  grabGesture(Qt::PanGesture);
+  QWidget::resizeEvent(event);
+
+  if (event)
+  {
+    surface_.SetSize(event->size().width(), event->size().height());
+
+    image_.reset(new QImage(reinterpret_cast<uchar*>(surface_.GetBuffer()),
+                            event->size().width(), 
+                            event->size().height(),
+                            surface_.GetPitch(),
+                            QImage::Format_RGB32));
+
+    context_->GetCentralViewport().SetSize(event->size().width(), event->size().height());
+
+  }
+}
+
+//void QCairoWidget::UpdateMouseCoordinates(int x,
+//                                         int y)
+//{
+//  if (scene_ != NULL)
+//  {
+//    double cx = static_cast<double>(x) + 0.5;
+//    double cy = static_cast<double>(y) + 0.5;
+
+//    std::string coordinates;
+//    viewport_.FormatCoordinates(coordinates, *scene_, cx, cy);
+        
+//    emit PositionChanged(QString(coordinates.c_str()));
+//  }
+//}
+
+
+//void QCairoWidget::SetDefaultView()
+//{
+//  viewport_.SetDefaultView();
+//  repaint();
+//}
+
+
+//void QCairoWidget::Refresh()
+//{
+//  if (scene_ != NULL &&
+//      updateNeeded_)
+//  {
+//    updateNeeded_ = false;
+//    emit ContentChanged();
+//    repaint();
+//  }
+//}
+
+
+//void QCairoWidget::SetSlice(int index)
+//{
+//  if (scene_ != NULL &&
+//      index >= 0 &&
+//      index < static_cast<int>(scene_->GetSlicesCount()))
+//  {
+//    scene_->SetCurrentSlice(index);
+//    emit SliceChanged(index);
+//    repaint();
+//  }
+//}