Move the code for updating the time/frame display boxes from VideoDisplay to VideoBox

Originally committed to SVN as r5266.
This commit is contained in:
Thomas Goyne 2011-01-23 07:48:07 +00:00
parent 091c8170f2
commit 8d968e4dd5
7 changed files with 61 additions and 84 deletions

View File

@ -60,7 +60,6 @@
#include "main.h" #include "main.h"
#include "subs_edit_box.h" #include "subs_edit_box.h"
#include "utils.h" #include "utils.h"
#include "video_box.h"
#include "video_context.h" #include "video_context.h"
#include "video_slider.h" #include "video_slider.h"

View File

@ -52,7 +52,6 @@
#include "subs_grid.h" #include "subs_grid.h"
#include "utils.h" #include "utils.h"
#include "validators.h" #include "validators.h"
#include "video_box.h"
#include "video_context.h" #include "video_context.h"
#include "video_display.h" #include "video_display.h"

View File

@ -45,7 +45,10 @@
#include "include/aegisub/context.h" #include "include/aegisub/context.h"
#include "ass_dialogue.h"
#include "ass_file.h"
#include "command/command.h" #include "command/command.h"
#include "compat.h"
#include "help_button.h" #include "help_button.h"
#include "libresrc/libresrc.h" #include "libresrc/libresrc.h"
#include "main.h" #include "main.h"
@ -118,7 +121,7 @@ VideoBox::VideoBox(wxWindow *parent, bool isDetached, wxComboBox *zoomBox, agi::
visualToolBar->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); visualToolBar->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
// Display // Display
videoDisplay = new VideoDisplay(this,isDetached,VideoPosition,VideoSubsPos,zoomBox,this,context); videoDisplay = new VideoDisplay(this,isDetached,zoomBox,this,context);
// Top sizer // Top sizer
// Detached and attached video needs different flags, see bugs #742 and #853 // Detached and attached video needs different flags, see bugs #742 and #853
@ -133,14 +136,14 @@ VideoBox::VideoBox(wxWindow *parent, bool isDetached, wxComboBox *zoomBox, agi::
topSizer->Add(new wxStaticLine(this),0,wxEXPAND,0); topSizer->Add(new wxStaticLine(this),0,wxEXPAND,0);
// Sizers // Sizers
videoSliderSizer = new wxBoxSizer(wxHORIZONTAL); wxSizer *videoSliderSizer = new wxBoxSizer(wxHORIZONTAL);
videoSliderSizer->Add(videoSlider,1,wxEXPAND|wxLEFT,0); videoSliderSizer->Add(videoSlider,1,wxEXPAND|wxLEFT,0);
videoBottomSizer->Add(VideoPosition,1,wxLEFT|wxALIGN_CENTER,5); videoBottomSizer->Add(VideoPosition,1,wxLEFT|wxALIGN_CENTER,5);
videoBottomSizer->Add(VideoSubsPos,1,wxALIGN_CENTER,0); videoBottomSizer->Add(VideoSubsPos,1,wxALIGN_CENTER,0);
// If we're detached we do want to fill out as much space we can. // If we're detached we do want to fill out as much space we can.
// But if we're in the main window, the subs grid needs space more than us. // But if we're in the main window, the subs grid needs space more than us.
VideoSizer = new wxBoxSizer(wxVERTICAL); wxSizer *VideoSizer = new wxBoxSizer(wxVERTICAL);
VideoSizer->Add(topSizer,isDetached?1:0,wxEXPAND,0); VideoSizer->Add(topSizer,isDetached?1:0,wxEXPAND,0);
VideoSizer->Add(videoSliderSizer,0,wxEXPAND,0); VideoSizer->Add(videoSliderSizer,0,wxEXPAND,0);
VideoSizer->Add(videoBottomSizer,0,wxEXPAND,0); VideoSizer->Add(videoBottomSizer,0,wxEXPAND,0);
@ -150,6 +153,12 @@ VideoBox::VideoBox(wxWindow *parent, bool isDetached, wxComboBox *zoomBox, agi::
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &VideoBox::OnButton, this); Bind(wxEVT_COMMAND_BUTTON_CLICKED, &VideoBox::OnButton, this);
Bind(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, &VideoBox::OnButton, this); Bind(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, &VideoBox::OnButton, this);
slots.push_back(context->videoController->AddSeekListener(&VideoBox::UpdateTimeBoxes, this));
slots.push_back(context->videoController->AddKeyframesListener(&VideoBox::UpdateTimeBoxes, this));
slots.push_back(context->videoController->AddTimecodesListener(&VideoBox::UpdateTimeBoxes, this));
slots.push_back(context->videoController->AddVideoOpenListener(&VideoBox::UpdateTimeBoxes, this));
slots.push_back(context->ass->AddCommitListener(&VideoBox::UpdateTimeBoxes, this));
} }
void VideoBox::OnButton(wxCommandEvent &evt) { void VideoBox::OnButton(wxCommandEvent &evt) {
@ -164,3 +173,39 @@ void VideoBox::OnButton(wxCommandEvent &evt) {
#endif #endif
cmd::call(context, evt.GetId()); cmd::call(context, evt.GetId());
} }
void VideoBox::UpdateTimeBoxes() {
if (!context->videoController->IsLoaded()) return;
int frame = context->videoController->GetFrameN();
int time = context->videoController->TimeAtFrame(frame, agi::vfr::EXACT);
int h = time / 3600000;
int m = time % 3600000 / 60000;
int s = time % 60000 / 1000;
int ms = time % 1000;
// Set the text box for frame number and time
VideoPosition->SetValue(wxString::Format("%01i:%02i:%02i.%03i - %i", h, m, s, ms, frame));
if (binary_search(context->videoController->GetKeyFrames().begin(), context->videoController->GetKeyFrames().end(), frame)) {
// Set the background color to indicate this is a keyframe
VideoPosition->SetBackgroundColour(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Selection")->GetColour()));
VideoPosition->SetForegroundColour(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Selection")->GetColour()));
}
else {
VideoPosition->SetBackgroundColour(wxNullColour);
VideoPosition->SetForegroundColour(wxNullColour);
}
AssDialogue *active_line = context->selectionController->GetActiveLine();
if (!active_line) {
VideoSubsPos->SetValue("");
}
else {
VideoSubsPos->SetValue(wxString::Format(
"%+dms; %+dms",
time - active_line->Start.GetMS(),
time - active_line->End.GetMS()));
}
}

View File

@ -37,6 +37,8 @@
#pragma once #pragma once
#ifndef AGI_PRE #ifndef AGI_PRE
#include <list>
#include <wx/panel.h> #include <wx/panel.h>
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/textctrl.h> #include <wx/textctrl.h>
@ -44,6 +46,8 @@
#include <wx/toolbar.h> #include <wx/toolbar.h>
#endif #endif
#include <libaegisub/signal.h>
namespace agi { struct Context; } namespace agi { struct Context; }
class ToggleBitmap; class ToggleBitmap;
class VideoDisplay; class VideoDisplay;
@ -56,9 +60,16 @@ class wxComboBox;
/// ///
/// DOCME /// DOCME
class VideoBox : public wxPanel { class VideoBox : public wxPanel {
agi::Context *context; std::list<agi::signal::Connection> slots;
agi::Context *context; ///< Project context
wxTextCtrl *VideoPosition; ///< Current frame/time
wxTextCtrl *VideoSubsPos; ///< Time relative to the active subtitle line
/// Handle a click on the play/pause buttons
void OnButton(wxCommandEvent &evt); void OnButton(wxCommandEvent &evt);
/// Update VideoPosition and VideoSubsPos
void UpdateTimeBoxes();
public: public:
/// DOCME /// DOCME
@ -67,18 +78,6 @@ public:
/// DOCME /// DOCME
wxToolBar *visualSubToolBar; wxToolBar *visualSubToolBar;
/// DOCME
wxBoxSizer *VideoSizer;
/// DOCME
wxBoxSizer *videoSliderSizer;
/// DOCME
wxTextCtrl *VideoPosition;
/// DOCME
wxTextCtrl *VideoSubsPos;
/// DOCME /// DOCME
VideoDisplay *videoDisplay; VideoDisplay *videoDisplay;

View File

@ -74,7 +74,6 @@
#include "subs_edit_box.h" #include "subs_edit_box.h"
#include "threaded_frame_source.h" #include "threaded_frame_source.h"
#include "utils.h" #include "utils.h"
#include "video_box.h"
#include "video_context.h" #include "video_context.h"
#include "video_frame.h" #include "video_frame.h"

View File

@ -62,7 +62,6 @@
#include "video_display.h" #include "video_display.h"
#include "selection_controller.h" #include "selection_controller.h"
#include "ass_dialogue.h"
#include "ass_file.h" #include "ass_file.h"
#include "main.h" #include "main.h"
#include "subs_grid.h" #include "subs_grid.h"
@ -125,8 +124,6 @@ public:
VideoDisplay::VideoDisplay( VideoDisplay::VideoDisplay(
VideoBox *box, VideoBox *box,
bool freeSize, bool freeSize,
wxTextCtrl *PositionDisplay,
wxTextCtrl *SubsPosition,
wxComboBox *zoomBox, wxComboBox *zoomBox,
wxWindow* parent, wxWindow* parent,
agi::Context *c) agi::Context *c)
@ -136,8 +133,6 @@ VideoDisplay::VideoDisplay(
, currentFrame(-1) , currentFrame(-1)
, w(8), h(8), viewport_x(0), viewport_width(0), viewport_bottom(0), viewport_top(0), viewport_height(0) , w(8), h(8), viewport_x(0), viewport_width(0), viewport_bottom(0), viewport_top(0), viewport_height(0)
, zoomValue(OPT_GET("Video/Default Zoom")->GetInt() * .125 + .125) , zoomValue(OPT_GET("Video/Default Zoom")->GetInt() * .125 + .125)
, SubsPosition(SubsPosition)
, PositionDisplay(PositionDisplay)
, videoOut(new VideoOutGL()) , videoOut(new VideoOutGL())
, activeMode(Video_Mode_Standard) , activeMode(Video_Mode_Standard)
, toolBar(box->visualSubToolBar) , toolBar(box->visualSubToolBar)
@ -189,52 +184,9 @@ void VideoDisplay::ShowCursor(bool show) {
} }
} }
void VideoDisplay::UpdateRelativeTimes(int time) {
wxString startSign;
wxString endSign;
int startOff = 0;
int endOff = 0;
if (AssDialogue *curLine = con->selectionController->GetActiveLine()) {
startOff = time - curLine->Start.GetMS();
endOff = time - curLine->End.GetMS();
}
// Positive signs
if (startOff > 0) startSign = L"+";
if (endOff > 0) endSign = L"+";
// Set the text box for time relative to active subtitle line
SubsPosition->SetValue(wxString::Format(L"%s%ims; %s%ims", startSign.c_str(), startOff, endSign.c_str(), endOff));
}
void VideoDisplay::SetFrame(int frameNumber) { void VideoDisplay::SetFrame(int frameNumber) {
currentFrame = frameNumber; currentFrame = frameNumber;
// Get time for frame
{
int time = con->videoController->TimeAtFrame(frameNumber, agi::vfr::EXACT);
int h = time / 3600000;
int m = time % 3600000 / 60000;
int s = time % 60000 / 1000;
int ms = time % 1000;
// Set the text box for frame number and time
PositionDisplay->SetValue(wxString::Format(L"%01i:%02i:%02i.%03i - %i", h, m, s, ms, frameNumber));
if (std::binary_search(con->videoController->GetKeyFrames().begin(), con->videoController->GetKeyFrames().end(), frameNumber)) {
// Set the background color to indicate this is a keyframe
PositionDisplay->SetBackgroundColour(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Background/Selection")->GetColour()));
PositionDisplay->SetForegroundColour(lagi_wxColour(OPT_GET("Colour/Subtitle Grid/Selection")->GetColour()));
}
else {
PositionDisplay->SetBackgroundColour(wxNullColour);
PositionDisplay->SetForegroundColour(wxNullColour);
}
UpdateRelativeTimes(time);
}
// Render the new frame // Render the new frame
if (con->videoController->IsLoaded()) { if (con->videoController->IsLoaded()) {
tool->SetFrame(frameNumber); tool->SetFrame(frameNumber);
@ -277,7 +229,6 @@ void VideoDisplay::OnCommit(int type) {
if (type == AssFile::COMMIT_FULL || type == AssFile::COMMIT_UNDO) if (type == AssFile::COMMIT_FULL || type == AssFile::COMMIT_UNDO)
con->videoController->GetScriptSize(scriptW, scriptH); con->videoController->GetScriptSize(scriptW, scriptH);
if (tool.get()) tool->Refresh(); if (tool.get()) tool->Refresh();
UpdateRelativeTimes(con->videoController->TimeAtFrame(currentFrame, agi::vfr::EXACT));
} }
void VideoDisplay::Render() try { void VideoDisplay::Render() try {
@ -536,9 +487,6 @@ void VideoDisplay::SetZoomFromBox() {
UpdateSize(); UpdateSize();
} }
} }
double VideoDisplay::GetZoom() const {
return zoomValue;
}
template<class T> template<class T>
void VideoDisplay::SetTool() { void VideoDisplay::SetTool() {

View File

@ -131,12 +131,6 @@ class VideoDisplay : public wxGLCanvas {
/// The current zoom level, where 1.0 = 100% /// The current zoom level, where 1.0 = 100%
double zoomValue; double zoomValue;
/// The display for the the video position relative to the current subtitle line
wxTextCtrl *SubsPosition;
/// The display for the absolute time of the video position
wxTextCtrl *PositionDisplay;
/// The video renderer /// The video renderer
std::auto_ptr<VideoOutGL> videoOut; std::auto_ptr<VideoOutGL> videoOut;
@ -154,10 +148,6 @@ class VideoDisplay : public wxGLCanvas {
/// @return Could the context be set? /// @return Could the context be set?
bool InitContext(); bool InitContext();
/// @brief Update the time relative to current subtitle line box
/// @param time Currently displayed frame's time
void UpdateRelativeTimes(int time);
/// @brief Set this video display to the given frame /// @brief Set this video display to the given frame
/// @frameNumber The desired frame number /// @frameNumber The desired frame number
void SetFrame(int frameNumber); void SetFrame(int frameNumber);
@ -197,8 +187,6 @@ public:
VideoDisplay( VideoDisplay(
VideoBox *box, VideoBox *box,
bool isDetached, bool isDetached,
wxTextCtrl *PositionDisplay,
wxTextCtrl *SubsPosition,
wxComboBox *zoomBox, wxComboBox *zoomBox,
wxWindow* parent, wxWindow* parent,
agi::Context *context); agi::Context *context);
@ -213,7 +201,7 @@ public:
/// @brief Set the zoom level to that indicated by the dropdown /// @brief Set the zoom level to that indicated by the dropdown
void SetZoomFromBox(); void SetZoomFromBox();
/// @brief Get the current zoom level /// @brief Get the current zoom level
double GetZoom() const; double GetZoom() const { return zoomValue; }
/// @brief Convert a point from screen to script coordinate frame /// @brief Convert a point from screen to script coordinate frame
/// @param x x coordinate; in/out /// @param x x coordinate; in/out