Add video panning
This commit is contained in:
parent
f21d8a3607
commit
e3949cdaa1
3 changed files with 33 additions and 4 deletions
|
@ -113,6 +113,8 @@ VideoDisplay::VideoDisplay(wxToolBar *toolbar, bool freeSize, wxComboBox *zoomBo
|
||||||
Bind(wxEVT_LEFT_DCLICK, &VideoDisplay::OnMouseEvent, this);
|
Bind(wxEVT_LEFT_DCLICK, &VideoDisplay::OnMouseEvent, this);
|
||||||
Bind(wxEVT_LEFT_DOWN, &VideoDisplay::OnMouseEvent, this);
|
Bind(wxEVT_LEFT_DOWN, &VideoDisplay::OnMouseEvent, this);
|
||||||
Bind(wxEVT_LEFT_UP, &VideoDisplay::OnMouseEvent, this);
|
Bind(wxEVT_LEFT_UP, &VideoDisplay::OnMouseEvent, this);
|
||||||
|
Bind(wxEVT_MIDDLE_DOWN, &VideoDisplay::OnMouseEvent, this);
|
||||||
|
Bind(wxEVT_MIDDLE_UP, &VideoDisplay::OnMouseEvent, this);
|
||||||
Bind(wxEVT_MOTION, &VideoDisplay::OnMouseEvent, this);
|
Bind(wxEVT_MOTION, &VideoDisplay::OnMouseEvent, this);
|
||||||
Bind(wxEVT_MOUSEWHEEL, &VideoDisplay::OnMouseWheel, this);
|
Bind(wxEVT_MOUSEWHEEL, &VideoDisplay::OnMouseWheel, this);
|
||||||
|
|
||||||
|
@ -191,7 +193,7 @@ void VideoDisplay::Render() try {
|
||||||
PositionVideo();
|
PositionVideo();
|
||||||
|
|
||||||
videoOut->Render(viewport_left, viewport_bottom, viewport_width, viewport_height);
|
videoOut->Render(viewport_left, viewport_bottom, viewport_width, viewport_height);
|
||||||
E(glViewport(0, std::min(viewport_bottom, 0), videoSize.GetWidth(), videoSize.GetHeight()));
|
E(glViewport(0, viewport_bottom, videoSize.GetWidth(), videoSize.GetHeight()));
|
||||||
|
|
||||||
E(glMatrixMode(GL_PROJECTION));
|
E(glMatrixMode(GL_PROJECTION));
|
||||||
E(glLoadIdentity());
|
E(glLoadIdentity());
|
||||||
|
@ -296,6 +298,9 @@ void VideoDisplay::PositionVideo() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
viewport_left += pan_x;
|
||||||
|
viewport_bottom -= pan_y;
|
||||||
|
|
||||||
if (tool)
|
if (tool)
|
||||||
tool->SetDisplayArea(viewport_left / scale_factor, viewport_top / scale_factor,
|
tool->SetDisplayArea(viewport_left / scale_factor, viewport_top / scale_factor,
|
||||||
viewport_width / scale_factor, viewport_height / scale_factor);
|
viewport_width / scale_factor, viewport_height / scale_factor);
|
||||||
|
@ -351,9 +356,24 @@ void VideoDisplay::OnMouseEvent(wxMouseEvent& event) {
|
||||||
|
|
||||||
last_mouse_pos = mouse_pos = event.GetPosition();
|
last_mouse_pos = mouse_pos = event.GetPosition();
|
||||||
|
|
||||||
if (tool)
|
if (event.GetButton() == wxMOUSE_BTN_MIDDLE) {
|
||||||
|
if ((panning = event.ButtonDown()))
|
||||||
|
pan_last_pos = event.GetPosition();
|
||||||
|
}
|
||||||
|
if (panning && event.Dragging()) {
|
||||||
|
pan_x += event.GetX() - pan_last_pos.X();
|
||||||
|
pan_y += event.GetY() - pan_last_pos.Y();
|
||||||
|
pan_last_pos = event.GetPosition();
|
||||||
|
|
||||||
|
PositionVideo();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tool) {
|
||||||
|
if (pan_y)
|
||||||
|
event.SetPosition(wxPoint(event.GetX(), event.GetY() - pan_y));
|
||||||
tool->OnMouseEvent(event);
|
tool->OnMouseEvent(event);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VideoDisplay::OnMouseLeave(wxMouseEvent& event) {
|
void VideoDisplay::OnMouseLeave(wxMouseEvent& event) {
|
||||||
mouse_pos = Vector2D();
|
mouse_pos = Vector2D();
|
||||||
|
|
|
@ -87,6 +87,15 @@ class VideoDisplay final : public wxGLCanvas {
|
||||||
/// The current zoom level, where 1.0 = 100%
|
/// The current zoom level, where 1.0 = 100%
|
||||||
double zoomValue;
|
double zoomValue;
|
||||||
|
|
||||||
|
/// The last position of the mouse, when dragging
|
||||||
|
Vector2D pan_last_pos;
|
||||||
|
/// True if middle mouse button is down, and we should update pan_{x,y}
|
||||||
|
bool panning = false;
|
||||||
|
/// The current video pan offset width
|
||||||
|
int pan_x = 0;
|
||||||
|
/// The current video pan offset height
|
||||||
|
int pan_y = 0;
|
||||||
|
|
||||||
/// The video renderer
|
/// The video renderer
|
||||||
std::unique_ptr<VideoOutGL> videoOut;
|
std::unique_ptr<VideoOutGL> videoOut;
|
||||||
|
|
||||||
|
|
|
@ -69,8 +69,8 @@ void VisualToolCross::Draw() {
|
||||||
gl.SetInvert();
|
gl.SetInvert();
|
||||||
gl.SetLineColour(*wxWHITE, 1.0, 1);
|
gl.SetLineColour(*wxWHITE, 1.0, 1);
|
||||||
float lines[] = {
|
float lines[] = {
|
||||||
0.f, mouse_pos.Y(),
|
video_pos.X(), mouse_pos.Y(),
|
||||||
video_res.X() + video_pos.X() * 2, mouse_pos.Y(),
|
video_res.X() + video_pos.X(), mouse_pos.Y(),
|
||||||
mouse_pos.X(), 0.f,
|
mouse_pos.X(), 0.f,
|
||||||
mouse_pos.X(), video_res.Y() + video_pos.Y() * 2
|
mouse_pos.X(), video_res.Y() + video_pos.Y() * 2
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue