Store the video display and slider in the context directly rather than going through the video box. Fxes a crash when detaching video.

Originally committed to SVN as r5845.
This commit is contained in:
Thomas Goyne 2011-11-12 01:23:18 +00:00
parent 0b742ef3c1
commit feb752c24c
8 changed files with 39 additions and 25 deletions

View file

@ -143,7 +143,7 @@ struct video_aspect_custom : public validator_video_loaded {
wxString denum = value.Mid(pos+1);
if (num.ToDouble(&a) && denum.ToDouble(&b) && b!=0) {
numval = a/b;
if (scale) c->videoBox->videoDisplay->SetZoom(b / c->videoController->GetHeight());
if (scale) c->videoDisplay->SetZoom(b / c->videoController->GetHeight());
}
}
else numval = 0.0;
@ -238,7 +238,7 @@ struct video_copy_coordinates : public validator_video_loaded {
void operator()(agi::Context *c) {
if (wxTheClipboard->Open()) {
wxTheClipboard->SetData(new wxTextDataObject(c->videoBox->videoDisplay->GetMousePosition().Str()));
wxTheClipboard->SetData(new wxTextDataObject(c->videoDisplay->GetMousePosition().Str()));
wxTheClipboard->Close();
}
}
@ -258,7 +258,7 @@ struct video_detach : public validator_video_loaded {
void operator()(agi::Context *c) {
if (!c->detachedVideo) {
c->detachedVideo = new DialogDetachedVideo(c, c->videoBox->videoDisplay->GetClientSize());
c->detachedVideo = new DialogDetachedVideo(c, c->videoDisplay->GetClientSize());
}
else {
c->detachedVideo->Close();
@ -288,12 +288,12 @@ struct video_focus_seek : public validator_video_loaded {
void operator()(agi::Context *c) {
wxWindow *curFocus = wxWindow::FindFocus();
if (curFocus == c->videoBox->videoSlider) {
if (curFocus == c->videoSlider) {
if (c->previousFocus) c->previousFocus->SetFocus();
}
else {
c->previousFocus = curFocus;
c->videoBox->videoSlider->SetFocus();
c->videoSlider->SetFocus();
}
}
};
@ -510,7 +510,7 @@ struct video_jump : public validator_video_loaded {
c->videoController->Stop();
if (c->videoController->IsLoaded()) {
DialogJumpTo(c).ShowModal();
c->videoBox->videoSlider->SetFocus();
c->videoSlider->SetFocus();
}
}
};
@ -632,7 +632,7 @@ struct video_show_overscan : public validator_video_loaded {
void operator()(agi::Context *c) {
OPT_SET("Video/Overscan Mask")->SetBool(!OPT_GET("Video/Overscan Mask")->GetBool());
c->videoBox->videoDisplay->Render();
c->videoDisplay->Render();
}
};
@ -646,12 +646,12 @@ public:
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) {
return c->videoBox->videoDisplay->GetZoom() == 1.;
return c->videoDisplay->GetZoom() == 1.;
}
void operator()(agi::Context *c) {
c->videoController->Stop();
c->videoBox->videoDisplay->SetZoom(1.);
c->videoDisplay->SetZoom(1.);
}
};
@ -678,12 +678,12 @@ public:
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) {
return c->videoBox->videoDisplay->GetZoom() == 2.;
return c->videoDisplay->GetZoom() == 2.;
}
void operator()(agi::Context *c) {
c->videoController->Stop();
c->videoBox->videoDisplay->SetZoom(2.);
c->videoDisplay->SetZoom(2.);
}
};
@ -697,12 +697,12 @@ public:
CMD_TYPE(COMMAND_VALIDATE | COMMAND_RADIO)
bool IsActive(const agi::Context *c) {
return c->videoBox->videoDisplay->GetZoom() == .5;
return c->videoDisplay->GetZoom() == .5;
}
void operator()(agi::Context *c) {
c->videoController->Stop();
c->videoBox->videoDisplay->SetZoom(.5);
c->videoDisplay->SetZoom(.5);
}
};
@ -714,7 +714,7 @@ struct video_zoom_in : public validator_video_attached {
STR_HELP("Zoom video in.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetZoom(c->videoBox->videoDisplay->GetZoom() + .125);
c->videoDisplay->SetZoom(c->videoDisplay->GetZoom() + .125);
}
};
@ -726,7 +726,7 @@ struct video_zoom_out : public validator_video_attached {
STR_HELP("Zoom video out.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetZoom(c->videoBox->videoDisplay->GetZoom() - .125);
c->videoDisplay->SetZoom(c->videoDisplay->GetZoom() - .125);
}
};
}

View file

@ -56,7 +56,7 @@ namespace {
STR_HELP("Standard mode, double click sets position.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetTool(new VisualToolCross(c->videoBox->videoDisplay, c));
c->videoDisplay->SetTool(new VisualToolCross(c->videoDisplay, c));
}
};
@ -67,7 +67,7 @@ namespace {
STR_HELP("Drag subtitles.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetTool(new VisualToolDrag(c->videoBox->videoDisplay, c));
c->videoDisplay->SetTool(new VisualToolDrag(c->videoDisplay, c));
}
};
@ -78,7 +78,7 @@ namespace {
STR_HELP("Rotate subtitles on their Z axis.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetTool(new VisualToolRotateZ(c->videoBox->videoDisplay, c));
c->videoDisplay->SetTool(new VisualToolRotateZ(c->videoDisplay, c));
}
};
@ -89,7 +89,7 @@ namespace {
STR_HELP("Rotate subtitles on their X and Y axes.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetTool(new VisualToolRotateXY(c->videoBox->videoDisplay, c));
c->videoDisplay->SetTool(new VisualToolRotateXY(c->videoDisplay, c));
}
};
@ -100,7 +100,7 @@ namespace {
STR_HELP("Scale subtitles on X and Y axes.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetTool(new VisualToolScale(c->videoBox->videoDisplay, c));
c->videoDisplay->SetTool(new VisualToolScale(c->videoDisplay, c));
}
};
@ -111,7 +111,7 @@ namespace {
STR_HELP("Clip subtitles to a rectangle.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetTool(new VisualToolClip(c->videoBox->videoDisplay, c));
c->videoDisplay->SetTool(new VisualToolClip(c->videoDisplay, c));
}
};
@ -122,7 +122,7 @@ namespace {
STR_HELP("Clip subtitles to a vectorial arean.")
void operator()(agi::Context *c) {
c->videoBox->videoDisplay->SetTool(new VisualToolVectorClip(c->videoBox->videoDisplay, c));
c->videoDisplay->SetTool(new VisualToolVectorClip(c->videoDisplay, c));
}
};
}

View file

@ -55,6 +55,8 @@
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)
, old_display(context->videoDisplay)
, old_slider(context->videoSlider)
, video_open(context->videoController->AddVideoOpenListener(&DialogDetachedVideo::OnVideoOpen, this))
{
// Set obscure stuff
@ -104,6 +106,8 @@ DialogDetachedVideo::~DialogDetachedVideo() { }
void DialogDetachedVideo::OnClose(wxCloseEvent&) {
context->detachedVideo = 0;
context->videoDisplay = old_display;
context->videoSlider = old_slider;
OPT_SET("Video/Detached/Enabled")->SetBool(false);
Destroy();
}
@ -125,6 +129,8 @@ void DialogDetachedVideo::OnKeyDown(wxKeyEvent &evt) {
void DialogDetachedVideo::OnVideoOpen() {
if (!context->videoController->IsLoaded()) {
context->detachedVideo = 0;
context->videoDisplay = old_display;
context->videoSlider = old_slider;
Destroy();
}
}

View file

@ -44,6 +44,7 @@
namespace agi { struct Context; }
class PersistLocation;
class VideoBox;
class VideoDisplay;
/// DOCME
/// @class DialogDetachedVideo
@ -52,6 +53,8 @@ class VideoBox;
/// DOCME
class DialogDetachedVideo : public wxDialog {
agi::Context *context;
VideoDisplay *old_display;
wxWindow *old_slider;
agi::signal::Connection video_open;
agi::scoped_ptr<PersistLocation> persist;

View file

@ -249,7 +249,7 @@ void FrameMain::InitContents() {
Search.context = context.get();
StartupLog("Create video box");
context->videoBox = videoBox = new VideoBox(Panel, false, context.get());
videoBox = new VideoBox(Panel, false, context.get());
StartupLog("Create audio box");
context->audioBox = audioBox = new AudioBox(Panel, context.get());

View file

@ -9,8 +9,8 @@ class DialogTranslation;
template<class T> class SelectionController;
class SubsTextEditCtrl;
class SubtitlesGrid;
class VideoBox;
class VideoContext;
class VideoDisplay;
class wxWindow;
namespace Automation4 { class ScriptManager; }
@ -29,6 +29,7 @@ struct Context {
// Things that should probably be in some sort of UI-context-model
wxWindow *parent;
wxWindow *previousFocus;
wxWindow *videoSlider;
// Views (i.e. things that should eventually not be here at all)
AudioBox *audioBox;
@ -38,7 +39,7 @@ struct Context {
DialogTranslation *translationAssistant;
SubsTextEditCtrl *editBox;
SubtitlesGrid *subsGrid;
VideoBox *videoBox;
VideoDisplay *videoDisplay;
};
}

View file

@ -137,6 +137,8 @@ VideoDisplay::VideoDisplay(
SetCursor(wxNullCursor);
c->videoDisplay = this;
if (con->videoController->IsLoaded())
OnVideoOpen();
}

View file

@ -61,6 +61,8 @@ VideoSlider::VideoSlider (wxWindow* parent, agi::Context *c)
slots.push_back(c->videoController->AddVideoOpenListener(&VideoSlider::VideoOpened, this));
slots.push_back(c->videoController->AddKeyframesListener(&VideoSlider::KeyframesChanged, this));
c->videoSlider = this;
if (c->videoController->IsLoaded()) {
VideoOpened();
}