diff --git a/aegisub/src/command/video.cpp b/aegisub/src/command/video.cpp index ea5025cd9..20c83e400 100644 --- a/aegisub/src/command/video.cpp +++ b/aegisub/src/command/video.cpp @@ -225,6 +225,24 @@ struct video_close : public validator_video_loaded { } }; +/// Copy the current coordinates of the mouse over the video to the clipboard. +struct video_copy_coordinates : public validator_video_loaded { + CMD_NAME("video/copy_coordinates") + STR_MENU("Copy coordinates to Clipboard") + STR_DISP("Copy coordinates to Clipboard") + STR_HELP("Copy the current coordinates of the mouse over the video to the clipboard.") + + void operator()(agi::Context *c) { + if (wxTheClipboard->Open()) { + int x, y; + c->videoBox->videoDisplay->GetMousePosition(&x, &y); + c->videoBox->videoDisplay->ToScriptCoords(&x, &y); + wxTheClipboard->SetData(new wxTextDataObject(wxString::Format("%d,%d", x, y))); + wxTheClipboard->Close(); + } + } +}; + /// Detach video, displaying it in a separate Window. struct video_detach : public validator_video_loaded { CMD_NAME("video/detach") @@ -280,6 +298,36 @@ struct video_focus_seek : public validator_video_loaded { } }; +/// Copy the current video frame to the clipboard, with subtitles +struct video_frame_copy : public validator_video_loaded { + CMD_NAME("video/frame/copy") + STR_MENU("Copy image to Clipboard") + STR_DISP("Copy image to Clipboard") + STR_HELP("Copy the currently displayed frame to the clipboard.") + + void operator()(agi::Context *c) { + if (wxTheClipboard->Open()) { + wxTheClipboard->SetData(new wxBitmapDataObject(wxBitmap(c->videoController->GetFrame(c->videoController->GetFrameN())->GetImage(),24))); + wxTheClipboard->Close(); + } + } +}; + +/// Copy the current video frame to the clipboard, without subtitles +struct video_frame_copy_raw : public validator_video_loaded { + CMD_NAME("video/frame/copy/raw") + STR_MENU("Copy image to Clipboard (no subtitles)") + STR_DISP("Copy image to Clipboard (no subtitles)") + STR_HELP("Copy the currently displayed frame to the clipboard, without the subtitles.") + + void operator()(agi::Context *c) { + if (wxTheClipboard->Open()) { + wxTheClipboard->SetData(new wxBitmapDataObject(wxBitmap(c->videoController->GetFrame(c->videoController->GetFrameN(), true)->GetImage(),24))); + wxTheClipboard->Close(); + } + } +}; + /// Seek to the next frame. struct video_frame_next : public validator_video_loaded { CMD_NAME("video/frame/next") @@ -427,6 +475,30 @@ struct video_frame_prev_large : public validator_video_loaded { } }; +/// Save the current video frame, with subtitles (if any) +struct video_frame_save : public validator_video_loaded { + CMD_NAME("video/frame/save") + STR_MENU("Save PNG snapshot") + STR_DISP("Save PNG snapshot") + STR_HELP("Save the currently displayed frame to a PNG file in the video's directory.") + + void operator()(agi::Context *c) { + c->videoController->SaveSnapshot(false); + } +}; + +/// Save the current video frame, without subtitles +struct video_frame_save_raw : public validator_video_loaded { + CMD_NAME("video/frame/save/raw") + STR_MENU("Save PNG snapshot (no subtitles)") + STR_DISP("Save PNG snapshot (no subtitles)") + STR_HELP("Save the currently displayed frame without the subtitles to a PNG file in the video's directory.") + + void operator()(agi::Context *c) { + c->videoController->SaveSnapshot(true); + } +}; + /// Jump to frame or time. struct video_jump : public validator_video_loaded { CMD_NAME("video/jump") @@ -669,9 +741,12 @@ namespace cmd { reg(new video_aspect_full); reg(new video_aspect_wide); reg(new video_close); + reg(new video_copy_coordinates); reg(new video_detach); reg(new video_details); reg(new video_focus_seek); + reg(new video_frame_copy); + reg(new video_frame_copy_raw); reg(new video_frame_next); reg(new video_frame_next_boundary); reg(new video_frame_next_keyframe); @@ -680,6 +755,8 @@ namespace cmd { reg(new video_frame_prev_boundary); reg(new video_frame_prev_keyframe); reg(new video_frame_prev_large); + reg(new video_frame_save); + reg(new video_frame_save_raw); reg(new video_jump); reg(new video_jump_end); reg(new video_jump_start); diff --git a/aegisub/src/video_display.cpp b/aegisub/src/video_display.cpp index f2dacb615..1f808b5bb 100644 --- a/aegisub/src/video_display.cpp +++ b/aegisub/src/video_display.cpp @@ -565,4 +565,7 @@ void VideoDisplay::OnCopyCoords(wxCommandEvent &) { wxTheClipboard->SetData(new wxTextDataObject(wxString::Format(L"%i,%i",x,y))); wxTheClipboard->Close(); } +void VideoDisplay::GetMousePosition(int *x, int *y) const { + *x = video.x; + *y = video.y; } diff --git a/aegisub/src/video_display.h b/aegisub/src/video_display.h index 8db40da62..e74f58daf 100644 --- a/aegisub/src/video_display.h +++ b/aegisub/src/video_display.h @@ -209,5 +209,10 @@ public: /// @param y y coordinate; in/out void FromScriptCoords(int *x, int *y) const; + /// Get the last seen position of the mouse in screen coordinates + /// @param[out] x x coordinate + /// @param[out] y y coordinate + void GetMousePosition(int *x, int *y) const; + DECLARE_EVENT_TABLE() };