2006-01-16 22:02:54 +01:00
// Copyright (c) 2005, Rodrigo Braz Monteiro
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of the Aegisub Group nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------------
//
// AEGISUB
//
// Website: http://aegisub.cellosoft.com
// Contact: mailto:zeratul@cellosoft.com
//
////////////
// Includes
2009-01-04 07:31:48 +01:00
# include "config.h"
2007-01-11 06:33:36 +01:00
# include <wx/wxprec.h>
# include <wx/mimetype.h>
# include <wx/filename.h>
# include <wx/tglbtn.h>
2007-09-12 01:22:26 +02:00
# include <wx/statline.h>
2007-01-11 06:33:36 +01:00
# include <wx/rawbmp.h>
2006-01-16 22:02:54 +01:00
# include "video_box.h"
# include "video_display.h"
# include "video_slider.h"
# include "frame_main.h"
# include "toggle_bitmap.h"
# include "options.h"
2007-01-11 06:33:36 +01:00
# include "subs_grid.h"
2008-03-07 22:00:20 +01:00
# include "video_provider_manager.h"
2007-01-11 06:33:36 +01:00
# include "ass_file.h"
# include "ass_dialogue.h"
# include "vfr.h"
# include "subs_edit_box.h"
# include "utils.h"
# include "main.h"
2007-01-11 22:03:12 +01:00
# include "toggle_bitmap.h"
2007-07-07 07:51:18 +02:00
# include "visual_tool.h"
2008-01-14 20:46:46 +01:00
# include "help_button.h"
2009-07-24 02:08:25 +02:00
# include "libresrc/libresrc.h"
2006-01-16 22:02:54 +01:00
///////////////
// Constructor
2009-06-04 01:01:03 +02:00
VideoBox : : VideoBox ( wxWindow * parent , bool isDetached )
2008-01-11 06:44:00 +01:00
: wxPanel ( parent , - 1 )
2007-01-11 04:53:20 +01:00
{
2007-01-11 06:33:36 +01:00
// Parent
2007-01-11 04:53:20 +01:00
videoPage = this ;
2007-01-11 06:33:36 +01:00
2007-07-04 06:24:47 +02:00
// Visual controls sub-toolbar
2007-07-07 05:21:52 +02:00
visualSubToolBar = new wxToolBar ( videoPage , - 1 , wxDefaultPosition , wxDefaultSize , wxTB_HORIZONTAL | wxTB_BOTTOM | wxTB_FLAT ) ;
2007-07-04 06:24:47 +02:00
2007-01-11 06:33:36 +01:00
// Buttons
2009-07-24 01:38:04 +02:00
wxBitmapButton * VideoPlayButton = new wxBitmapButton ( videoPage , Video_Play , wxBitmap ( button_play_xpm ) , wxDefaultPosition , wxSize ( 25 , - 1 ) ) ;
2006-01-16 22:02:54 +01:00
VideoPlayButton - > SetToolTip ( _ ( " Play video starting on this position " ) ) ;
2009-07-24 01:38:04 +02:00
wxBitmapButton * VideoPlayLineButton = new wxBitmapButton ( videoPage , Video_Play_Line , wxBitmap ( button_playline_xpm ) , wxDefaultPosition , wxSize ( 25 , - 1 ) ) ;
2006-01-16 22:02:54 +01:00
VideoPlayLineButton - > SetToolTip ( _ ( " Play current line " ) ) ;
2009-07-24 01:38:04 +02:00
wxBitmapButton * VideoStopButton = new wxBitmapButton ( videoPage , Video_Stop , wxBitmap ( button_pause_xpm ) , wxDefaultPosition , wxSize ( 25 , - 1 ) ) ;
2006-01-16 22:02:54 +01:00
VideoStopButton - > SetToolTip ( _ ( " Stop video playback " ) ) ;
2009-07-24 01:38:04 +02:00
AutoScroll = new ToggleBitmap ( videoPage , Video_Auto_Scroll , wxBitmap ( toggle_video_autoscroll_xpm ) , wxSize ( 30 , - 1 ) ) ;
2006-01-16 22:02:54 +01:00
AutoScroll - > SetToolTip ( _ ( " Toggle autoscroll of video " ) ) ;
AutoScroll - > SetValue ( Options . AsBool ( _T ( " Sync video with subs " ) ) ) ;
2006-01-29 16:08:51 +01:00
2006-01-16 22:02:54 +01:00
// Seek
videoSlider = new VideoSlider ( videoPage , - 1 ) ;
videoSlider - > SetToolTip ( _ ( " Seek video. " ) ) ;
// Position
2006-02-21 01:55:16 +01:00
VideoPosition = new wxTextCtrl ( videoPage , - 1 , _T ( " " ) , wxDefaultPosition , wxSize ( 110 , 20 ) , wxTE_READONLY ) ;
2006-01-16 22:02:54 +01:00
VideoPosition - > SetToolTip ( _ ( " Current frame time and number. " ) ) ;
// Times of sub relative to video
2006-02-21 01:55:16 +01:00
VideoSubsPos = new wxTextCtrl ( videoPage , - 1 , _T ( " " ) , wxDefaultPosition , wxSize ( 110 , 20 ) , wxTE_READONLY ) ;
2006-01-16 22:02:54 +01:00
VideoSubsPos - > SetToolTip ( _ ( " Time of this frame relative to start and end of current subs. " ) ) ;
// Display
2008-01-11 06:44:00 +01:00
videoDisplay = new VideoDisplay ( videoPage , - 1 , wxDefaultPosition , wxDefaultSize , wxSUNKEN_BORDER ) ;
2006-01-16 22:02:54 +01:00
videoDisplay - > ControlSlider = videoSlider ;
videoDisplay - > PositionDisplay = VideoPosition ;
videoDisplay - > SubsPosition = VideoSubsPos ;
2007-01-11 04:53:20 +01:00
videoDisplay - > box = this ;
2007-01-21 07:30:19 +01:00
VideoContext : : Get ( ) - > AddDisplay ( videoDisplay ) ;
2006-01-16 22:02:54 +01:00
videoDisplay - > Reset ( ) ;
// Set display
videoSlider - > Display = videoDisplay ;
2007-01-11 04:53:20 +01:00
// Typesetting buttons
2009-06-04 01:18:40 +02:00
visualToolBar = new wxToolBar ( videoPage , - 1 , wxDefaultPosition , wxDefaultSize , wxTB_VERTICAL | wxTB_FLAT | wxTB_NODIVIDER ) ;
2009-07-24 01:38:04 +02:00
visualToolBar - > AddTool ( Video_Mode_Standard , _ ( " Standard " ) , wxBitmap ( visual_standard_xpm ) , _ ( " Standard mode, double click sets position. " ) , wxITEM_RADIO ) ;
visualToolBar - > AddTool ( Video_Mode_Drag , _ ( " Drag " ) , wxBitmap ( visual_move_xpm ) , _ ( " Drag subtitles. " ) , wxITEM_RADIO ) ;
visualToolBar - > AddTool ( Video_Mode_Rotate_Z , _ ( " Rotate Z " ) , wxBitmap ( visual_rotatez_xpm ) , _ ( " Rotate subtitles on their Z axis. " ) , wxITEM_RADIO ) ;
visualToolBar - > AddTool ( Video_Mode_Rotate_XY , _ ( " Rotate XY " ) , wxBitmap ( visual_rotatexy_xpm ) , _ ( " Rotate subtitles on their X and Y axes. " ) , wxITEM_RADIO ) ;
visualToolBar - > AddTool ( Video_Mode_Scale , _ ( " Scale " ) , wxBitmap ( visual_scale_xpm ) , _ ( " Scale subtitles on X and Y axes. " ) , wxITEM_RADIO ) ;
visualToolBar - > AddTool ( Video_Mode_Clip , _ ( " Clip " ) , wxBitmap ( visual_clip_xpm ) , _ ( " Clip subtitles to a rectangle. " ) , wxITEM_RADIO ) ;
visualToolBar - > AddTool ( Video_Mode_Vector_Clip , _ ( " Vector Clip " ) , wxBitmap ( visual_vector_clip_xpm ) , _ ( " Clip subtitles to a vectorial area. " ) , wxITEM_RADIO ) ;
2007-07-06 07:47:03 +02:00
visualToolBar - > AddSeparator ( ) ;
2009-07-24 01:38:04 +02:00
visualToolBar - > AddTool ( Video_Mode_Realtime , _ ( " Realtime " ) , wxBitmap ( visual_realtime_xpm ) , _ ( " Toggle realtime display of changes. " ) , wxITEM_CHECK ) ;
2007-07-06 07:47:03 +02:00
visualToolBar - > ToggleTool ( Video_Mode_Realtime , Options . AsBool ( _T ( " Video Visual Realtime " ) ) ) ;
2009-07-24 01:38:04 +02:00
visualToolBar - > AddTool ( Video_Mode_Help , _ ( " Help " ) , wxBitmap ( visual_help_xpm ) , _ ( " Open the manual page for Visual Typesetting. " ) ) ;
2007-07-06 07:47:03 +02:00
visualToolBar - > Realize ( ) ;
2009-06-04 01:18:40 +02:00
// Avoid ugly themed background on Vista and possibly also Win7
visualToolBar - > SetBackgroundStyle ( wxBG_STYLE_COLOUR ) ;
visualToolBar - > SetBackgroundColour ( wxSystemSettings : : GetColour ( wxSYS_COLOUR_BTNFACE ) ) ;
2007-01-11 04:53:20 +01:00
// Top sizer
2009-06-04 01:01:03 +02:00
// Detached and attached video needs different flags, see bugs #742 and #853
int highSizerFlags = isDetached ? wxEXPAND : 0 ;
2007-07-07 05:21:52 +02:00
wxSizer * topTopSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
wxSizer * topSizer = new wxBoxSizer ( wxVERTICAL ) ;
visualSubToolBar - > Show ( false ) ;
2009-06-04 01:01:03 +02:00
topTopSizer - > Add ( visualToolBar , 0 , highSizerFlags , 0 ) ;
topTopSizer - > Add ( videoDisplay , 1 , highSizerFlags , 0 ) ;
2007-07-07 05:21:52 +02:00
topSizer - > Add ( topTopSizer , 1 , wxEXPAND , 0 ) ;
topSizer - > Add ( visualSubToolBar , 0 , wxEXPAND | wxBOTTOM , 4 ) ;
topSizer - > Add ( new wxStaticLine ( videoPage ) , 0 , wxEXPAND , 0 ) ;
2006-01-16 22:02:54 +01:00
// Sizers
videoSliderSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
videoSliderSizer - > Add ( videoSlider , 1 , wxEXPAND | wxLEFT , 0 ) ;
wxSizer * videoBottomSizer = new wxBoxSizer ( wxHORIZONTAL ) ;
//videoBottomSizer->Add(zoomSlider,1,wxEXPAND,0);
videoBottomSizer - > Add ( VideoPlayButton , 0 , wxTOP | wxLEFT | wxBOTTOM | wxALIGN_CENTER , 2 ) ;
videoBottomSizer - > Add ( VideoPlayLineButton , 0 , wxTOP | wxBOTTOM | wxALIGN_CENTER , 2 ) ;
videoBottomSizer - > Add ( VideoStopButton , 0 , wxTOP | wxBOTTOM | wxALIGN_CENTER , 2 ) ;
videoBottomSizer - > Add ( AutoScroll , 0 , wxTOP | wxBOTTOM | wxALIGN_CENTER | wxEXPAND , 2 ) ;
videoBottomSizer - > Add ( VideoPosition , 1 , wxLEFT | wxALIGN_CENTER , 5 ) ;
videoBottomSizer - > Add ( VideoSubsPos , 1 , wxALIGN_CENTER , 0 ) ;
2009-06-04 01:08:40 +02:00
// 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.
2006-01-16 22:02:54 +01:00
VideoSizer = new wxBoxSizer ( wxVERTICAL ) ;
2009-06-04 01:08:40 +02:00
VideoSizer - > Add ( topSizer , isDetached ? 1 : 0 , wxEXPAND , 0 ) ;
2006-01-16 22:02:54 +01:00
VideoSizer - > Add ( videoSliderSizer , 0 , wxEXPAND , 0 ) ;
VideoSizer - > Add ( videoBottomSizer , 0 , wxEXPAND , 0 ) ;
2009-06-04 01:08:40 +02:00
if ( ! isDetached )
VideoSizer - > AddStretchSpacer ( 1 ) ;
2007-01-11 04:53:20 +01:00
SetSizer ( VideoSizer ) ;
2006-01-16 22:02:54 +01:00
}
2007-01-11 06:33:36 +01:00
///////////////
// Event table
BEGIN_EVENT_TABLE ( VideoBox , wxPanel )
EVT_BUTTON ( Video_Play , VideoBox : : OnVideoPlay )
EVT_BUTTON ( Video_Play_Line , VideoBox : : OnVideoPlayLine )
EVT_BUTTON ( Video_Stop , VideoBox : : OnVideoStop )
EVT_TOGGLEBUTTON ( Video_Auto_Scroll , VideoBox : : OnVideoToggleScroll )
2007-07-06 07:47:03 +02:00
EVT_TOOL_RANGE ( Video_Mode_Standard , Video_Mode_Vector_Clip , VideoBox : : OnModeChange )
2007-07-07 07:51:18 +02:00
EVT_TOOL_RANGE ( VISUAL_SUB_TOOL_START , VISUAL_SUB_TOOL_END , VideoBox : : OnSubTool )
2007-07-06 07:47:03 +02:00
EVT_TOOL ( Video_Mode_Realtime , VideoBox : : OnToggleRealtime )
2008-01-14 20:46:46 +01:00
EVT_TOOL ( Video_Mode_Help , VideoBox : : OnHelp )
2007-01-11 06:33:36 +01:00
END_EVENT_TABLE ( )
//////////////
// Play video
void VideoBox : : OnVideoPlay ( wxCommandEvent & event ) {
2007-06-02 15:48:36 +02:00
VideoContext * ctx = VideoContext : : Get ( ) ;
2007-09-22 00:56:44 +02:00
# ifdef __APPLE__
ctx - > EnableAudioSync ( wxGetMouseState ( ) . CmdDown ( ) = = false ) ;
# else
2007-06-02 15:48:36 +02:00
ctx - > EnableAudioSync ( wxGetMouseState ( ) . ControlDown ( ) = = false ) ;
2007-09-22 00:56:44 +02:00
# endif
2007-06-02 15:48:36 +02:00
ctx - > Play ( ) ;
2007-01-11 06:33:36 +01:00
}
///////////////////
// Play video line
void VideoBox : : OnVideoPlayLine ( wxCommandEvent & event ) {
2007-06-02 15:48:36 +02:00
VideoContext * ctx = VideoContext : : Get ( ) ;
2007-09-22 00:56:44 +02:00
# ifdef __APPLE__
ctx - > EnableAudioSync ( wxGetMouseState ( ) . CmdDown ( ) = = false ) ;
# else
2007-06-02 15:48:36 +02:00
ctx - > EnableAudioSync ( wxGetMouseState ( ) . ControlDown ( ) = = false ) ;
2007-09-22 00:56:44 +02:00
# endif
2007-06-02 15:48:36 +02:00
ctx - > PlayLine ( ) ;
2007-01-11 06:33:36 +01:00
}
//////////////
// Stop video
void VideoBox : : OnVideoStop ( wxCommandEvent & event ) {
2007-01-21 07:30:19 +01:00
VideoContext : : Get ( ) - > Stop ( ) ;
2007-01-11 06:33:36 +01:00
}
/////////////////////
// Toggle autoscroll
void VideoBox : : OnVideoToggleScroll ( wxCommandEvent & event ) {
Options . SetBool ( _T ( " Sync video with subs " ) , AutoScroll - > GetValue ( ) ) ;
Options . Save ( ) ;
}
2007-07-06 07:47:03 +02:00
////////////////
// Mode changed
void VideoBox : : OnModeChange ( wxCommandEvent & event ) {
videoDisplay - > SetVisualMode ( event . GetId ( ) - Video_Mode_Standard ) ;
2007-07-05 06:32:46 +02:00
}
2007-07-07 07:51:18 +02:00
///////////////////////////
// Sub-tool button pressed
void VideoBox : : OnSubTool ( wxCommandEvent & event ) {
videoDisplay - > visual - > OnSubTool ( event ) ;
}
2007-01-11 07:15:56 +01:00
///////////////////
// Realtime toggle
void VideoBox : : OnToggleRealtime ( wxCommandEvent & event ) {
2007-07-06 07:47:03 +02:00
Options . SetBool ( _T ( " Video Visual Realtime " ) , event . IsChecked ( ) ) ;
2007-01-11 07:15:56 +01:00
Options . Save ( ) ;
}
2007-09-12 01:22:26 +02:00
2008-01-14 20:46:46 +01:00
////////
// Help
void VideoBox : : OnHelp ( wxCommandEvent & event ) {
HelpButton : : OpenPage ( _T ( " Visual Typesetting " ) ) ;
}