3#include "../../global.hpp"
4#include "../../rect.hpp"
6#include "../../driver/_decl/decl_device_image.hpp"
8#include "../_decl/decl_image_scene.hpp"
9#include "../_decl/decl_image_view.hpp"
10#include "../_decl/decl_opengl_image_renderer_factory.hpp"
21 : QGraphicsView(parent)
23 , waitForRepaintEnabled_(true)
27 setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
28 setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
29 setDragMode(QGraphicsView::ScrollHandDrag);
30 setFrameShadow(QFrame::Plain);
32 auto refreshEventFilter =
new RefreshEventFilter(
this);
33 installEventFilter(refreshEventFilter);
37 : QGraphicsView(parent)
41 , waitForRepaintEnabled_(true)
43 if (scene && scene->views().size())
48 setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
49 setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
50 setDragMode(QGraphicsView::ScrollHandDrag);
51 setFrameShadow(QFrame::Plain);
53 auto refreshEventFilter =
new RefreshEventFilter(
this);
54 installEventFilter(refreshEventFilter);
57 inline ImageView::~ImageView()
76 UnregisterEventImageDataUpdated();
80 eventCookieDataUpdated_ =
90 throw std::runtime_error(
"an image must be shared with the display to upload the viewport only");
93 imageScene->UploadImage(image);
94 zoomHandler_.UpdatePanoramaFactor();
114 if (qApp->thread() != QThread::currentThread())
115 throw std::runtime_error(
"repaint can only be enabled or disabled form the UI thread");
118 waitForRepaintEnabled_ =
true;
123 waitForRepaintEnabled_ =
false;
125 QApplication::removePostedEvents(
this, RefreshEventType());
126 waitCondition_.notify_all();
133 waitForRepaint_ = customWaitForRepaint;
139 waitForRepaint_ = [&]() { viewport()->repaint(); };
145 scheduleRepaint_ = customScheduleRepaint;
151 scheduleRepaint_ = [&]() { update(); };
157 UnregisterEventImageDataUpdated();
163 return dynamic_cast<class
ImageScene *
>(scene());
172 auto result = zoomHandler_.TryZoomIn();
176 else if (result && eventRefreshEnabled_)
178 zoomHandler_.UpdatePanoramaFactor();
179 viewport()->update();
197 auto result = zoomHandler_.TryZoomOut();
201 else if (result && eventRefreshEnabled_)
203 zoomHandler_.UpdatePanoramaFactor();
204 viewport()->update();
225 return mouseMovedCarrierContainer_.Register(carrier);
230 mouseMovedCarrierContainer_.Unregister(eventCookie);
238 QGraphicsView::closeEvent(event);
246 QGraphicsView::scrollContentsBy(dx, dy);
249 else if (eventRefreshEnabled_)
251 zoomHandler_.UpdatePanoramaFactor();
252 viewport()->update();
261 QGraphicsView::resizeEvent(event);
262 zoomHandler_.UpdatePanoramaFactor();
265 else if (eventRefreshEnabled_)
267 zoomHandler_.UpdatePanoramaFactor();
268 viewport()->update();
277 QGraphicsView::showEvent(event);
281 else if (eventRefreshEnabled_)
282 viewport()->update();
288 auto numDegrees =
event->angleDelta().y();
290 if (numDegrees <= -15)
292 else if (numDegrees >= 15)
300 QGraphicsView::mouseMoveEvent(event);
310 auto scenePos = mapToScene(mapFromGlobal(event->globalPos()));
311 pixelPos =
Point2D<int>(qMin(qMax(qFloor(scenePos.x()), 0), image_->Width() - 1),
312 qMin(qMax(qFloor(scenePos.y()), 0), image_->Height() - 1));
314 pixel = image_->GetPixel(pixelPos);
323 inline void ImageView::WaitForRepaint()
325 if (qApp->thread() == QThread::currentThread())
330 qApp->postEvent(
this,
new QEvent(RefreshEventType()), Qt::LowEventPriority);
331 if (waitForRepaintEnabled_)
332 waitCondition_.wait(guard);
336 inline void ImageView::ScheduleRepaint()
341 inline bool ImageView::RefreshEventFilter::eventFilter(QObject *obj, QEvent *event)
343 if (event->type() == RefreshEventType())
345 auto imageView =
dynamic_cast<ImageView *
>(obj);
346 imageView->PrivateRefresh();
350 return QObject::eventFilter(obj, event);
353 inline QEvent::Type ImageView::RefreshEventType() noexcept
355 static auto refreshEventType =
static_cast<QEvent::Type
>(QEvent::registerEventType(QEvent::User));
356 return refreshEventType;
359 inline void ImageView::PrivateRefresh()
362 std::unique_lock<std::mutex> guard(waitMutex_);
366 waitCondition_.notify_all();
369 inline void ImageView::UnregisterEventImageDataUpdated() noexcept
372 image_->UnregisterEventPixelContentChanged(eventCookieDataUpdated_);
Cookie used to unregister event handlers.
Definition global.hpp:591
Multi-purpose 2D vector class.
Definition point_2d.hpp:20
Rectangle object.
Definition rect.hpp:24
Scene to provide a convenient display for an image.
Definition decl_image_scene.hpp:49
ImageView(QWidget *parent=nullptr)
Create an image view.
Definition detail_image_view.hpp:20
bool TryZoomIn() noexcept
Tries to zoom in.
Definition detail_image_view.hpp:166
Cvb::EventCookie RegisterEventMouseMoved(std::function< void(Cvb::Point2D< int >, const std::vector< double > &)> handler)
Register a callback to get pixel values under the moving mouse.
Definition detail_image_view.hpp:222
void ResetCustomScheduleRepaint() noexcept
Reset to the default value.
Definition detail_image_view.hpp:148
void showEvent(QShowEvent *event) override
Handle show events.
Definition detail_image_view.hpp:273
void CustomWaitForRepaint(std::function< void()> customWaitForRepaint) noexcept
Set a custom callback associated with a refresh mode.
Definition detail_image_view.hpp:130
void SetWaitForRepaintEnabled(bool enabled)
Enable and disables waiting for repaints.
Definition detail_image_view.hpp:112
void mouseMoveEvent(QMouseEvent *event) override
Handle mouse move events.
Definition detail_image_view.hpp:298
void closeEvent(QCloseEvent *event) override
Handles close events.
Definition detail_image_view.hpp:233
Cvb::UI::RenderEngine RenderEngine() const noexcept
Get the current render engine.
Definition decl_image_view.hpp:406
Cvb::UI::RefreshMode RefreshMode() const noexcept
Get the current refresh mode.
Definition decl_image_view.hpp:301
void resizeEvent(QResizeEvent *event) override
Handle resize events.
Definition detail_image_view.hpp:257
void ResetCustomWaitForRepaint() noexcept
Reset to the default value.
Definition detail_image_view.hpp:136
bool IsWaitForRepaintEnabled() const noexcept
Checks if waiting for repaint is set.
Definition decl_image_view.hpp:261
void UnregisterEventMouseMoved(Cvb::EventCookie eventCookie) noexcept
Unregister a callback to get pixel values under the moving mouse.
Definition detail_image_view.hpp:228
void wheelEvent(QWheelEvent *event) override
Handle mouse wheel events to zoom.
Definition detail_image_view.hpp:286
void Refresh()
Refresh the view.
Definition decl_image_view.hpp:113
void SetRenderEngine(Cvb::UI::RenderEngine renderEngine)
Set the current render engine.
Definition detail_image_view.hpp:216
class ImageScene * ImageScene() const noexcept
Get the image scene.
Definition detail_image_view.hpp:161
void scrollContentsBy(int dx, int dy) override
Handles scrolling the view.
Definition detail_image_view.hpp:242
bool TryZoomOut() noexcept
Tries to zoom out.
Definition detail_image_view.hpp:191
Cvb::UI::UploadMode UploadMode() const noexcept
Get the current upload mode.
Definition decl_image_view.hpp:321
ImagePtr Image() const noexcept
Get the currently shared image.
Definition decl_image_view.hpp:343
void ReleaseRefreshShare() noexcept
Releases the shared image.
Definition detail_image_view.hpp:154
void CustomScheduleRepaint(std::function< void()> scheduleRepaint) noexcept
Set a custom callback associated with a refresh mode.
Definition detail_image_view.hpp:142
Namespace for user interface components.
Definition decl_image_scene.hpp:39
RefreshMode
Defines the refresh behavior.
Definition ui.hpp:80
@ UploadAndWaitForRepaint
Definition ui.hpp:100
@ UploadAndScheduleRepaint
Definition ui.hpp:94
@ UploadOnly
Definition ui.hpp:85
AutoRefresh
Allows to automatically refresh, if image content changes.
Definition detail_ui.hpp:114
@ On
Definition detail_ui.hpp:121
@ Viewport
Definition detail_ui.hpp:53
RenderEngine
Defines the render engine used for drawing.
Definition ui.hpp:108
@ Raster
Definition ui.hpp:114
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::shared_ptr< Image > ImagePtr
Convenience shared pointer for Image.
Definition global.hpp:86