From 65368c5f3554f11ac731b31b025e712ee3d52a35 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Fri, 29 Jul 2011 23:16:36 +0000 Subject: [PATCH] Detangle FrameMain and DialogDetachedVideo Originally committed to SVN as r5530. --- aegisub/src/command/video.cpp | 8 +++- aegisub/src/dialog_detached_video.cpp | 64 +++++++++++++-------------- aegisub/src/dialog_detached_video.h | 27 ++++++----- aegisub/src/frame_main.cpp | 24 ++++------ aegisub/src/frame_main.h | 4 +- 5 files changed, 60 insertions(+), 67 deletions(-) diff --git a/aegisub/src/command/video.cpp b/aegisub/src/command/video.cpp index 14cd02ff3..ea5025cd9 100644 --- a/aegisub/src/command/video.cpp +++ b/aegisub/src/command/video.cpp @@ -238,7 +238,13 @@ struct video_detach : public validator_video_loaded { } void operator()(agi::Context *c) { - wxGetApp().frame->DetachVideo(!c->detachedVideo); + if (!c->detachedVideo) { + c->detachedVideo = new DialogDetachedVideo(c, c->videoBox->videoDisplay->GetClientSize()); + } + else { + c->detachedVideo->Destroy(); + c->detachedVideo = 0; + } } }; diff --git a/aegisub/src/dialog_detached_video.cpp b/aegisub/src/dialog_detached_video.cpp index 0d65af090..64563a9c3 100644 --- a/aegisub/src/dialog_detached_video.cpp +++ b/aegisub/src/dialog_detached_video.cpp @@ -38,39 +38,35 @@ #ifndef AGI_PRE #include -#include #include /// Must be included last. #endif -#include "include/aegisub/context.h" #include "dialog_detached_video.h" -#include "frame_main.h" + +#include "include/aegisub/context.h" +#include "include/aegisub/hotkey.h" + #include "main.h" #include "persist_location.h" #include "video_box.h" #include "video_context.h" #include "video_display.h" -#include "video_slider.h" -/// @brief Constructor -/// @param par FrameMain this was spawned from -/// @param initialDisplaySize Initial size of the window -DialogDetachedVideo::DialogDetachedVideo(FrameMain *parent, agi::Context *context, const wxSize &initialDisplaySize) -: wxDialog(parent,-1,_T("Detached Video"),wxDefaultPosition,wxSize(400,300),wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxWANTS_CHARS) -, parent(parent) +DialogDetachedVideo::DialogDetachedVideo(agi::Context *context, const wxSize &initialDisplaySize) +: wxDialog(context->parent, -1, "Detached Video", wxDefaultPosition, wxSize(400,300), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxWANTS_CHARS) +, context(context) +, video_open(context->videoController->AddVideoOpenListener(&DialogDetachedVideo::OnVideoOpen, this)) { // Set obscure stuff SetExtraStyle((GetExtraStyle() & ~wxWS_EX_BLOCK_EVENTS) | wxWS_EX_PROCESS_UI_UPDATES); - // Set title - wxFileName fn(context->videoController->videoName); - SetTitle(wxString::Format(_("Video: %s"),fn.GetFullName().c_str())); + SetTitle(wxString::Format(_("Video: %s"), wxFileName(context->videoController->videoName).GetFullName())); // Set a background panel wxPanel *panel = new wxPanel(this,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL | wxCLIP_CHILDREN); // Video area; - videoBox = new VideoBox(panel, true, context); + VideoBox *videoBox = new VideoBox(panel, true, context); videoBox->videoDisplay->SetClientSize(initialDisplaySize); // Set sizer @@ -95,35 +91,23 @@ DialogDetachedVideo::DialogDetachedVideo(FrameMain *parent, agi::Context *contex } // Update - parent->SetDisplayMode(0, -1); OPT_SET("Video/Detached/Enabled")->SetBool(true); - // Copy the main accelerator table to this dialog - wxAcceleratorTable *table = parent->GetAcceleratorTable(); - SetAcceleratorTable(*table); + Bind(wxEVT_CLOSE_WINDOW, &DialogDetachedVideo::OnClose, this); + Bind(wxEVT_ICONIZE, &DialogDetachedVideo::OnMinimize, this); + Bind(wxEVT_KEY_DOWN, &DialogDetachedVideo::OnKeyDown, this); + + Show(); } -/// @brief Destructor -DialogDetachedVideo::~DialogDetachedVideo() { -} +DialogDetachedVideo::~DialogDetachedVideo() { } -// Event table -BEGIN_EVENT_TABLE(DialogDetachedVideo,wxDialog) - EVT_CLOSE(DialogDetachedVideo::OnClose) - EVT_ICONIZE(DialogDetachedVideo::OnMinimize) -END_EVENT_TABLE() - -/// @brief Close window -/// @param event UNUSED -void DialogDetachedVideo::OnClose(wxCloseEvent &WXUNUSED(event)) { +void DialogDetachedVideo::OnClose(wxCloseEvent&) { + context->detachedVideo = 0; OPT_SET("Video/Detached/Enabled")->SetBool(false); Destroy(); - parent->context->detachedVideo = 0; - parent->SetDisplayMode(1,-1); } -/// @brief Minimize event handler -/// @param event void DialogDetachedVideo::OnMinimize(wxIconizeEvent &event) { if (event.IsIconized()) { // Force the video display to repaint as otherwise the last displayed @@ -132,3 +116,15 @@ void DialogDetachedVideo::OnMinimize(wxIconizeEvent &event) { Show(); } } + +void DialogDetachedVideo::OnKeyDown(wxKeyEvent &evt) { + evt.StopPropagation(); + hotkey::check("Video Display", evt.GetKeyCode(), evt.GetUnicodeKey(), evt.GetModifiers()); +} + +void DialogDetachedVideo::OnVideoOpen() { + if (!context->videoController->IsLoaded()) { + context->detachedVideo = 0; + Destroy(); + } +} diff --git a/aegisub/src/dialog_detached_video.h b/aegisub/src/dialog_detached_video.h index c64748742..20915d61b 100644 --- a/aegisub/src/dialog_detached_video.h +++ b/aegisub/src/dialog_detached_video.h @@ -34,16 +34,14 @@ /// @ingroup main_ui /// -#pragma once - #ifndef AGI_PRE #include #endif #include +#include namespace agi { struct Context; } -class FrameMain; class PersistLocation; class VideoBox; @@ -53,20 +51,21 @@ class VideoBox; /// /// DOCME class DialogDetachedVideo : public wxDialog { + agi::Context *context; + agi::signal::Connection video_open; agi::scoped_ptr persist; - /// DOCME - VideoBox *videoBox; - - /// DOCME - FrameMain *parent; - - void OnClose(wxCloseEvent &event); - void OnMinimize(wxIconizeEvent &event); + void OnClose(wxCloseEvent &); + /// Minimize event handler to hack around a wx bug + void OnMinimize(wxIconizeEvent &evt); + void OnKeyDown(wxKeyEvent &evt); + void OnVideoOpen(); public: - DialogDetachedVideo(FrameMain *parent, agi::Context *context, const wxSize &initialDisplaySize); + /// @brief Constructor + /// @param context Project context + /// @param initialDisplaySize Initial size of the window + DialogDetachedVideo(agi::Context *context, const wxSize &initialDisplaySize); + /// Destructor ~DialogDetachedVideo(); - - DECLARE_EVENT_TABLE() }; diff --git a/aegisub/src/frame_main.cpp b/aegisub/src/frame_main.cpp index 35ec41cb4..878bd0b75 100644 --- a/aegisub/src/frame_main.cpp +++ b/aegisub/src/frame_main.cpp @@ -63,7 +63,6 @@ #endif #include "compat.h" #include "command/command.h" -#include "dialog_detached_video.h" #include "dialog_search_replace.h" #include "dialog_styling_assistant.h" #include "dialog_version_check.h" @@ -183,6 +182,7 @@ FrameMain::FrameMain (wxArrayString args) context->detachedVideo = 0; context->stylingAssistant = 0; InitContents(); + OPT_SUB("Video/Detached/Enabled", &FrameMain::OnVideoDetach, this, agi::signal::_1); StartupLog("Complete context initialization"); context->videoController->SetContext(context.get()); @@ -224,7 +224,6 @@ FrameMain::FrameMain (wxArrayString args) FrameMain::~FrameMain () { context->videoController->SetVideo(""); context->audioController->CloseAudio(); - if (context->detachedVideo) context->detachedVideo->Destroy(); if (context->stylingAssistant) context->stylingAssistant->Destroy(); SubsGrid->ClearMaps(); delete audioBox; @@ -440,7 +439,6 @@ void FrameMain::UpdateTitle() { void FrameMain::OnVideoOpen() { if (!context->videoController->IsLoaded()) { SetDisplayMode(0, -1); - DetachVideo(false); return; } @@ -481,22 +479,16 @@ void FrameMain::OnVideoOpen() { SetDisplayMode(1,-1); - DetachVideo(OPT_GET("Video/Detached/Enabled")->GetBool()); + if (OPT_GET("Video/Detached/Enabled")->GetBool()) + cmd::call("video/detach", context.get()); Thaw(); } -void FrameMain::DetachVideo(bool detach) { - if (detach) { - if (!context->detachedVideo) { - context->detachedVideo = new DialogDetachedVideo(this, context.get(), videoBox->videoDisplay->GetClientSize()); - context->detachedVideo->Show(); - } - } - else if (context->detachedVideo) { - context->detachedVideo->Destroy(); - context->detachedVideo = 0; - SetDisplayMode(1,-1); - } +void FrameMain::OnVideoDetach(agi::OptionValue const& opt) { + if (opt.GetBool()) + SetDisplayMode(0, -1); + else if (context->videoController->IsLoaded()) + SetDisplayMode(1, -1); } void FrameMain::StatusTimeout(wxString text,int ms) { diff --git a/aegisub/src/frame_main.h b/aegisub/src/frame_main.h index 5d6e3955a..8f5f6a345 100644 --- a/aegisub/src/frame_main.h +++ b/aegisub/src/frame_main.h @@ -63,7 +63,7 @@ class VideoDisplay; class VideoSlider; class VideoZoomSlider; -namespace agi { struct Context; } +namespace agi { struct Context; class OptionValue; } namespace Automation4 { class FeatureMacro; class ScriptManager; } /// DOCME @@ -84,7 +84,6 @@ public: /// @param audio -1: leave unchanged; 0: hide; 1: show void SetDisplayMode(int showVid, int showAudio); void LoadSubtitles(wxString filename,wxString charset=""); - void DetachVideo(bool detach=true); agi::scoped_ptr context; @@ -139,6 +138,7 @@ private: void OnAudioClose(); void OnVideoOpen(); + void OnVideoDetach(agi::OptionValue const& opt); void OnSubtitlesOpen(); void OnSubtitlesSave();