Mercurial > hg > orthanc-stone
diff Applications/Qt/QCairoWidget.cpp @ 385:6cc3ce74dc05
using message broker in widgets
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 07 Nov 2018 20:49:41 +0100 |
parents | 557c8ff1db5c |
children | b70e9be013e4 |
line wrap: on
line diff
--- a/Applications/Qt/QCairoWidget.cpp Wed Nov 07 16:17:02 2018 +0100 +++ b/Applications/Qt/QCairoWidget.cpp Wed Nov 07 20:49:41 2018 +0100 @@ -25,6 +25,20 @@ #include <stdexcept> + +QCairoWidget::StoneObserver::StoneObserver(QCairoWidget& that, + OrthancStone::IViewport& viewport, + OrthancStone::MessageBroker& broker) : + OrthancStone::IObserver(broker), + that_(that) +{ + // get notified each time the content of the central viewport changes + viewport.RegisterObserverCallback( + new OrthancStone::Callable<StoneObserver, OrthancStone::IViewport::ViewportChangedMessage> + (*this, &StoneObserver::OnViewportChanged)); +} + + QCairoWidget::QCairoWidget(QWidget *parent) : QWidget(parent), context_(NULL) @@ -32,24 +46,29 @@ setFocusPolicy(Qt::StrongFocus); // catch keyPressEvents } -QCairoWidget::~QCairoWidget() -{ -} void QCairoWidget::SetContext(OrthancStone::NativeStoneApplicationContext& context) { context_ = &context; - context_->GetCentralViewport().Register(*this); // get notified each time the content of the central viewport changes + + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + observer_.reset(new StoneObserver(*this, + locker.GetCentralViewport(), + locker.GetMessageBroker())); + } } + void QCairoWidget::paintEvent(QPaintEvent* /*event*/) { QPainter painter(this); - if (image_.get() != NULL && context_ != NULL) + if (image_.get() != NULL && + context_ != NULL) { OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); - OrthancStone::IViewport& viewport = context_->GetCentralViewport(); + OrthancStone::IViewport& viewport = locker.GetCentralViewport(); Orthanc::ImageAccessor a; surface_.GetWriteableAccessor(a); viewport.Render(a); @@ -103,35 +122,43 @@ default: return; // Unsupported button } - context_->GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers); + + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers); + } } void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/) { - context_->GetCentralViewport().MouseLeave(); + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().MouseLeave(); } void QCairoWidget::mouseMoveEvent(QMouseEvent* event) { - context_->GetCentralViewport().MouseMove(event->pos().x(), event->pos().y()); + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().MouseMove(event->pos().x(), event->pos().y()); } void QCairoWidget::wheelEvent(QWheelEvent * event) { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); if (event->orientation() == Qt::Vertical) { if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions { - context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); + locker.GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); } else { - context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); + locker.GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); } } } @@ -158,7 +185,11 @@ break; } } - context_->GetCentralViewport().KeyPressed(keyType, keyChar, stoneModifiers); + + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().KeyPressed(keyType, keyChar, stoneModifiers); + } } @@ -177,7 +208,9 @@ surface_.GetPitch(), QImage::Format_RGB32)); - context_->GetCentralViewport().SetSize(event->size().width(), event->size().height()); - + { + OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); + locker.GetCentralViewport().SetSize(event->size().width(), event->size().height()); + } } }