CVB++ 15.0
decl_image_view.hpp
1#pragma once
2
3#include <atomic>
4#include <condition_variable>
5#include <mutex>
6
7#ifdef _MSC_VER
8# pragma warning(push, 1)
9# pragma warning(disable : 4127)
10#endif
11
12#include <QEvent>
13#include <QGraphicsView>
14#include <QThread>
15#include <QWheelEvent>
16
17#ifdef _MSC_VER
18# pragma warning(pop)
19#endif
20
21#include "../../global.hpp"
22
23#include "../../driver/driver.hpp"
24
25#include "../ui.hpp"
26
27#include "decl_opengl_image_renderer.hpp"
28
29namespace Cvb
30{
31
32 CVB_BEGIN_INLINE_NS
33
34 namespace UI
35 {
36
38
65 : public QGraphicsView
67 , public Private::IImageView
69 {
70
71 public:
73
77 explicit ImageView(QWidget *parent = nullptr);
78
80
87 explicit ImageView(class ImageScene *scene, QWidget *parent = nullptr);
88
89 ImageView(const ImageView &other) = delete;
90 ImageView &operator=(const ImageView &other) = delete;
91 ImageView(ImageView &&other) = delete;
92 ImageView &operator=(ImageView &&other) = delete;
93 virtual ~ImageView();
94
96
105 void Refresh(Cvb::UI::RefreshMode refreshMode);
106
108
113 void Refresh()
114 {
115 Refresh(refreshMode_);
116 }
117
119
128 void Refresh(const ImagePtr &image, Cvb::UI::RefreshMode refreshMode, AutoRefresh autoRefresh = AutoRefresh::Off);
129
131
139 void Refresh(const ImagePtr &image, AutoRefresh autoRefresh = AutoRefresh::Off)
140 {
141 Refresh(image, refreshMode_, autoRefresh);
142 }
143
145
179 void Refresh(const class Image &image, Cvb::UI::RefreshMode refreshMode);
180
182
189 void Refresh(const class Image &image)
190 {
191 Refresh(image, refreshMode_);
192 }
193
195
201 void ReleaseRefreshShare() noexcept;
202
204
220 void SetEventRefreshEnabled(bool enabled) noexcept
221 {
222 eventRefreshEnabled_ = enabled;
223 }
224
226
230 bool IsEventRefreshEnabled() const noexcept
231 {
232 return eventRefreshEnabled_;
233 }
234
236
254 void SetWaitForRepaintEnabled(bool enabled);
255
257
261 bool IsWaitForRepaintEnabled() const noexcept
262 {
263 return waitForRepaintEnabled_;
264 }
265
267
273 void CustomWaitForRepaint(std::function<void()> customWaitForRepaint) noexcept;
274
276
279 void ResetCustomWaitForRepaint() noexcept;
280
282
288 void CustomScheduleRepaint(std::function<void()> scheduleRepaint) noexcept;
289
291
294 void ResetCustomScheduleRepaint() noexcept;
295
297
301 Cvb::UI::RefreshMode RefreshMode() const noexcept
302 {
303 return refreshMode_;
304 }
305
307
311 void SetRefreshMode(Cvb::UI::RefreshMode refreshMode) noexcept
312 {
313 refreshMode_ = refreshMode;
314 }
315
317
322 {
323 return uploadMode_;
324 }
325
327
332 {
334 refreshMutex_); // prevent mixing upload modes (Render mutex would be sufficient but not accessible here)
335 uploadMode_ = uploadMode;
336 }
337
339
343 ImagePtr Image() const noexcept
344 {
345 return image_;
346 }
347
349
355 class ImageScene *ImageScene() const noexcept;
356
358
362 bool TryZoomIn() noexcept;
363
365
369 bool TryZoomOut() noexcept;
370
372
376 ZoomDescriptor Zoom() const noexcept
377 {
378 return zoomHandler_.ZoomDescriptor();
379 }
380
382
386 void SetZoom(ZoomDescriptor zoomDescriptor) noexcept
387 {
388 try
389 {
390 auto waitForRepaint = IsWaitForRepaintEnabled();
392 zoomHandler_.SetZoomDescriptor(zoomDescriptor);
393 SetWaitForRepaintEnabled(waitForRepaint);
394 }
395 catch (...)
396 {
397 // ensure noexcept
398 }
399 }
400
402
407 {
408 return ImageScene()->RenderEngine();
409 }
410
412
418 void SetRenderEngine(Cvb::UI::RenderEngine renderEngine);
419
421
428
430
434 void UnregisterEventMouseMoved(Cvb::EventCookie eventCookie) noexcept;
435
436 protected:
438
446 void closeEvent(QCloseEvent *event) override;
447
449
458 void scrollContentsBy(int dx, int dy) override;
459
461
469 void resizeEvent(QResizeEvent *event) override;
470
472
480 void showEvent(QShowEvent *event) override;
481
483
491 void wheelEvent(QWheelEvent *event) override;
492
494
506 void mouseMoveEvent(QMouseEvent *event) override;
507
508 private:
509 class RefreshEventFilter : public QObject
510 {
511 public:
512 explicit RefreshEventFilter(ImageView *imageView)
513 : QObject(imageView)
514 {
515 }
516
517 protected:
518 bool eventFilter(QObject *obj, QEvent *event) override;
519 };
520
521 void WaitForRepaint();
522
523 void ScheduleRepaint();
524
525 static QEvent::Type RefreshEventType() noexcept;
526
527 void PrivateRefresh();
528
529 void UnregisterEventImageDataUpdated() noexcept;
530
531 Size2D<double> ViewSize() const noexcept override
532 {
533 return QtToCvb(viewport()->rect().size());
534 }
535
536 Size2D<double> ImageSize() const noexcept override
537 {
538 return QtToCvb(sceneRect().size());
539 }
540
541 void ApplyZoom(double factor) override
542 {
543 auto eventRefreshEnabled = IsEventRefreshEnabled();
544 auto interactive = isInteractive();
545 setInteractive(false);
547
548 QTransform transform;
549 transform.scale(factor, factor);
550 setTransform(transform);
551
552 setInteractive(interactive);
553 SetEventRefreshEnabled(eventRefreshEnabled);
554 }
555
556 Private::ZoomHandler zoomHandler_;
557
558 bool eventRefreshEnabled_ = true;
559
562
563 EventCookie eventCookieDataUpdated_;
564
565 std::atomic<bool> waitForRepaintEnabled_;
566
567 ImagePtr image_;
568 mutable std::mutex imageMutex_;
569
570 std::condition_variable waitCondition_;
571 std::mutex waitMutex_;
572
573 std::mutex refreshMutex_;
574
575 std::function<void()> waitForRepaint_ = [&]() { viewport()->repaint(); };
576
577 std::function<void()> scheduleRepaint_ = [&]() { viewport()->update(); };
578
579 Internal::CarrierContainer mouseMovedCarrierContainer_;
580 };
581
582 } // namespace UI
583
584 CVB_END_INLINE_NS
585
586} // namespace Cvb
Multi-purpose 2D vector class.
Definition point_2d.hpp:20
Scene to provide a convenient display for an image.
Definition decl_image_scene.hpp:49
View to display an image.
Definition decl_image_view.hpp:69
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 Refresh(const class Image &image)
Refresh the view using the specified image.
Definition decl_image_view.hpp:189
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 SetEventRefreshEnabled(bool enabled) noexcept
Enables and disables automatic refreshing caused by events.
Definition decl_image_view.hpp:220
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 Refresh(const ImagePtr &image, AutoRefresh autoRefresh=AutoRefresh::Off)
Share the image and refresh the view.
Definition decl_image_view.hpp:139
void closeEvent(QCloseEvent *event) override
Handles close events.
Definition detail_image_view.hpp:233
void SetZoom(ZoomDescriptor zoomDescriptor) noexcept
Set the current zoom descriptor.
Definition decl_image_view.hpp:386
Cvb::UI::RenderEngine RenderEngine() const noexcept
Get the current render engine.
Definition decl_image_view.hpp:406
bool IsEventRefreshEnabled() const noexcept
Check if automatic refreshing by events is set.
Definition decl_image_view.hpp:230
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 SetUploadMode(Cvb::UI::UploadMode uploadMode)
Set the current upload mode.
Definition decl_image_view.hpp:331
void UnregisterEventMouseMoved(Cvb::EventCookie eventCookie) noexcept
Unregister a callback to get pixel values under the moving mouse.
Definition detail_image_view.hpp:228
ZoomDescriptor Zoom() const noexcept
Get the current zoom descriptor.
Definition decl_image_view.hpp:376
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
void SetRefreshMode(Cvb::UI::RefreshMode refreshMode) noexcept
Set the current refresh mode.
Definition decl_image_view.hpp:311
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
Cvb::String QtToCvb(const QString text) noexcept
Convenience converter for strings.
Definition ui.hpp:242
RefreshMode
Defines the refresh behavior.
Definition ui.hpp:80
@ UploadAndWaitForRepaint
Definition ui.hpp:100
AutoRefresh
Allows to automatically refresh, if image content changes.
Definition detail_ui.hpp:114
@ Off
Definition detail_ui.hpp:125
UploadMode
Defines the upload behavior.
Definition detail_ui.hpp:37
@ Image
Definition detail_ui.hpp:45
RenderEngine
Defines the render engine used for drawing.
Definition ui.hpp:108
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
Describes an zoom setting for the display.
Definition detail_ui.hpp:148
T transform(T... args)