Skip to content

Commit 8dc65c4

Browse files
committed
BoxDraw with click and drop.
1 parent 6a32603 commit 8dc65c4

File tree

12 files changed

+202
-50
lines changed

12 files changed

+202
-50
lines changed

SerialPrograms/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ file(GLOB MAIN_SOURCES
485485
Source/CommonFramework/VideoPipeline/UI/VideoOverlayWidget.h
486486
Source/CommonFramework/VideoPipeline/UI/VideoWidget.h
487487
Source/CommonFramework/VideoPipeline/VideoFeed.h
488+
Source/CommonFramework/VideoPipeline/VideoOverlay.cpp
488489
Source/CommonFramework/VideoPipeline/VideoOverlay.h
489490
Source/CommonFramework/VideoPipeline/VideoOverlayOption.cpp
490491
Source/CommonFramework/VideoPipeline/VideoOverlayOption.h

SerialPrograms/Source/CommonFramework/VideoPipeline/Backends/CameraWidgetQt6.5.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,18 @@ class StaticQGraphicsView : public QGraphicsView{
195195
QFrame::resizeEvent(e);
196196
}
197197

198+
// QGraphicsView doesn't like to propagate mouse events.
199+
// https://forum.qt.io/topic/152138/struggling-with-mouse-events/2
200+
virtual void mousePressEvent(QMouseEvent* event) override{
201+
QWidget::mousePressEvent(event);
202+
}
203+
virtual void mouseReleaseEvent(QMouseEvent* event) override{
204+
QWidget::mouseReleaseEvent(event);
205+
}
206+
virtual void mouseMoveEvent(QMouseEvent* event) override{
207+
QWidget::mouseMoveEvent(event);
208+
}
209+
198210
};
199211

200212

SerialPrograms/Source/CommonFramework/VideoPipeline/UI/VideoDisplayWidget.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <QVBoxLayout>
88
#include <QLabel>
99
#include <QLineEdit>
10+
#include <QMouseEvent>
1011
#include "Common/Cpp/PrettyPrint.h"
1112
#include "VideoDisplayWidget.h"
1213
#include "VideoDisplayWindow.h"
@@ -171,6 +172,24 @@ void VideoDisplayWidget::resizeEvent(QResizeEvent* event){
171172
m_height_box->setText(QString::number(m_last_height));
172173
}
173174

175+
void VideoDisplayWidget::mousePressEvent(QMouseEvent* event){
176+
WidgetStackFixedAspectRatio::mousePressEvent(event);
177+
double x = (double)event->pos().x() / this->width();
178+
double y = (double)event->pos().y() / this->height();
179+
m_overlay_session.issue_mouse_press(x, y);
180+
}
181+
void VideoDisplayWidget::mouseReleaseEvent(QMouseEvent* event){
182+
WidgetStackFixedAspectRatio::mouseReleaseEvent(event);
183+
double x = (double)event->pos().x() / this->width();
184+
double y = (double)event->pos().y() / this->height();
185+
m_overlay_session.issue_mouse_release(x, y);
186+
}
187+
void VideoDisplayWidget::mouseMoveEvent(QMouseEvent* event){
188+
WidgetStackFixedAspectRatio::mouseMoveEvent(event);
189+
double x = (double)event->pos().x() / this->width();
190+
double y = (double)event->pos().y() / this->height();
191+
m_overlay_session.issue_mouse_move(x, y);
192+
}
174193

175194
OverlayStatSnapshot VideoSourceFPS::get_current(){
176195
double fps = m_parent.m_video->camera().fps_source();

SerialPrograms/Source/CommonFramework/VideoPipeline/UI/VideoDisplayWidget.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ class VideoDisplayWidget : public WidgetStackFixedAspectRatio{
8989
// Override QWidget::mouseDoubleClickEvent().
9090
// When double click, call move_to_new_window() to move to a new window to be ready for full screen.
9191
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
92+
93+
virtual void mousePressEvent(QMouseEvent* event) override;
94+
virtual void mouseReleaseEvent(QMouseEvent* event) override;
95+
virtual void mouseMoveEvent(QMouseEvent* event) override;
96+
9297
virtual void paintEvent(QPaintEvent*) override;
9398
virtual void resizeEvent(QResizeEvent* event) override;
9499

SerialPrograms/Source/CommonFramework/VideoPipeline/UI/VideoOverlayWidget.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ void VideoOverlayWidget::on_watchdog_timeout(){
9292
// cout << "VideoOverlayWidget::on_watchdog_timeout(): " << c++ << endl;
9393
}
9494

95+
9596
void VideoOverlayWidget::resizeEvent(QResizeEvent* event){}
9697
void VideoOverlayWidget::paintEvent(QPaintEvent*){
9798
QPainter painter(this);

SerialPrograms/Source/CommonFramework/VideoPipeline/UI/VideoOverlayWidget.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#ifndef PokemonAutomation_VideoPipeline_VideoOverlayWidget_H
88
#define PokemonAutomation_VideoPipeline_VideoOverlayWidget_H
99

10-
#include <map>
1110
#include <QWidget>
1211
#include "Common/Cpp/Concurrency/SpinLock.h"
1312
#include "Common/Cpp/Concurrency/Watchdog.h"
@@ -17,7 +16,7 @@ namespace PokemonAutomation{
1716

1817
struct OverlayText;
1918

20-
class VideoOverlayWidget : public QWidget, private VideoOverlaySession::Listener, private WatchdogCallback{
19+
class VideoOverlayWidget : public QWidget, private VideoOverlaySession::ContentListener, private WatchdogCallback{
2120
public:
2221
static constexpr bool DEFAULT_ENABLE_BOXES = true;
2322
static constexpr bool DEFAULT_ENABLE_TEXT = true;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* Video Overlay
2+
*
3+
* From: https://github.com/PokemonAutomation/
4+
*
5+
*/
6+
7+
#include "Common/Cpp/ListenerSet.h"
8+
#include "Common/Cpp/Containers/Pimpl.tpp"
9+
#include "VideoOverlay.h"
10+
11+
namespace PokemonAutomation{
12+
13+
14+
15+
struct VideoOverlay::Data{
16+
ListenerSet<MouseListener> m_listeners;
17+
};
18+
19+
20+
VideoOverlay::VideoOverlay()
21+
: m_data(CONSTRUCT_TOKEN)
22+
{}
23+
VideoOverlay::~VideoOverlay() = default;
24+
25+
26+
27+
void VideoOverlay::add_listener(MouseListener& listener){
28+
m_data->m_listeners.add(listener);
29+
}
30+
void VideoOverlay::remove_listener(MouseListener& listener){
31+
m_data->m_listeners.remove(listener);
32+
}
33+
void VideoOverlay::issue_mouse_press(double x, double y){
34+
m_data->m_listeners.run_method_unique(&MouseListener::on_mouse_press, x, y);
35+
}
36+
void VideoOverlay::issue_mouse_release(double x, double y){
37+
m_data->m_listeners.run_method_unique(&MouseListener::on_mouse_release, x, y);
38+
}
39+
void VideoOverlay::issue_mouse_move(double x, double y){
40+
m_data->m_listeners.run_method_unique(&MouseListener::on_mouse_move, x, y);
41+
}
42+
43+
44+
45+
46+
47+
}

SerialPrograms/Source/CommonFramework/VideoPipeline/VideoOverlay.h

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Video Overlay Set
1+
/* Video Overlay
22
*
33
* From: https://github.com/PokemonAutomation/
44
*
@@ -8,15 +8,20 @@
88
#define PokemonAutomation_VideoOverlaySet_H
99

1010
#include <string>
11+
#include "Common/Compiler.h"
1112
#include "Common/Cpp/Color.h"
13+
#include "Common/Cpp/Containers/Pimpl.h"
1214
#include "VideoOverlayTypes.h"
1315

1416
namespace PokemonAutomation{
1517

1618

1719
class VideoOverlay{
1820
public:
19-
21+
VideoOverlay();
22+
virtual ~VideoOverlay();
23+
24+
public:
2025
// Asychronously, add an inference box as part of the video overlay.
2126
// Once added, `box` cannot be destroyed until after `VideoOverlay::remove_box()` is called to remove it.
2227
// If a `box` with the same address is added, it will override the old box's position, shape and color. You only need to
@@ -25,7 +30,7 @@ class VideoOverlay{
2530
// Can use `InferenceBoxScope: public ImageFloatBox` to handle box removal automatically when it's destroyed.
2631
// Can also use `VideoOverlay.h:VideoOverlaySet` to manage multiple boxes.
2732
virtual void add_box(const OverlayBox& box) = 0;
28-
33+
2934
// Asychronously, remove an added inference box.
3035
// The box must be already added.
3136
// See `add_box()` for more info on managing boxes.
@@ -55,6 +60,22 @@ class VideoOverlay{
5560
virtual void add_stat(OverlayStat& stat) = 0;
5661
virtual void remove_stat(OverlayStat& stat) = 0;
5762

63+
64+
public:
65+
struct MouseListener{
66+
virtual void on_mouse_press(double x, double y){}
67+
virtual void on_mouse_release(double x, double y){};
68+
virtual void on_mouse_move(double x, double y){};
69+
};
70+
void add_listener(MouseListener& listener);
71+
void remove_listener(MouseListener& listener);
72+
void issue_mouse_press(double x, double y);
73+
void issue_mouse_release(double x, double y);
74+
void issue_mouse_move(double x, double y);
75+
76+
private:
77+
struct Data;
78+
Pimpl<Data> m_data;
5879
};
5980

6081

0 commit comments

Comments
 (0)