view 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 source

#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();
//  }
//}