1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        VideoPropDlg.cpp
3 // Purpose:     The video properties dialog
4 // Author:      Alex Thuering
5 // Created:     09.09.2010
6 // RCS-ID:      $Id: VideoPropDlg.cpp,v 1.27 2016/12/17 17:27:38 ntalex Exp $
7 // Copyright:   (c) Alex Thuering
8 // Licence:     GPL
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #include "VideoPropDlg.h"
12 #include "DVD.h"
13 #include "Utils.h"
14 #include "Config.h"
15 #include <wx/artprov.h>
16 #include <wx/regex.h>
17 
18 //(*InternalHeaders(VideoPropDlg)
19 #include <wx/artprov.h>
20 #include <wx/bitmap.h>
21 #include <wx/intl.h>
22 #include <wx/button.h>
23 #include <wx/image.h>
24 #include <wx/string.h>
25 //*)
26 
27 //(*IdInit(VideoPropDlg)
28 const long VideoPropDlg::ID_STATICTEXT2 = wxNewId();
29 const long VideoPropDlg::ID_STATICTEXT4 = wxNewId();
30 const long VideoPropDlg::ID_STATICTEXT3 = wxNewId();
31 const long VideoPropDlg::DST_CHOICE_ID = wxNewId();
32 const long VideoPropDlg::ASPECT_CHOICE_ID = wxNewId();
33 const long VideoPropDlg::INTERLACED_CHOICE_ID = wxNewId();
34 const long VideoPropDlg::FF_CHOICE_ID = wxNewId();
35 const long VideoPropDlg::KEEP_ASPECT_CB_ID = wxNewId();
36 const long VideoPropDlg::KEEP_ASPECT_CHOICE_ID = wxNewId();
37 const long VideoPropDlg::ID_SPINCTRL1 = wxNewId();
38 const long VideoPropDlg::ID_SPINCTRL4 = wxNewId();
39 const long VideoPropDlg::ID_SPINCTRL3 = wxNewId();
40 const long VideoPropDlg::ID_SPINCTRL2 = wxNewId();
41 const long VideoPropDlg::ID_SPINCTRL5 = wxNewId();
42 const long VideoPropDlg::ID_SPINCTRL6 = wxNewId();
43 const long VideoPropDlg::ID_SPINCTRL7 = wxNewId();
44 const long VideoPropDlg::ID_SPINCTRL8 = wxNewId();
45 const long VideoPropDlg::ID_SPINCTRL9 = wxNewId();
46 const long VideoPropDlg::ID_SPINCTRL10 = wxNewId();
47 const long VideoPropDlg::ID_TEXTCTRL1 = wxNewId();
48 const long VideoPropDlg::ID_CUSTOM1 = wxNewId();
49 const long VideoPropDlg::ID_SLIDER = wxNewId();
50 const long VideoPropDlg::ID_TIME_CTRL = wxNewId();
51 const long VideoPropDlg::ID_TIME_SPINB = wxNewId();
52 const long VideoPropDlg::ID_FRAME_SPINBT = wxNewId();
53 const long VideoPropDlg::ID_TEXTCTRL2 = wxNewId();
54 const long VideoPropDlg::ID_SPINBUTTON1 = wxNewId();
55 const long VideoPropDlg::ID_SPINBUTTON2 = wxNewId();
56 const long VideoPropDlg::START_BT_ID = wxNewId();
57 const long VideoPropDlg::ID_TEXTCTRL3 = wxNewId();
58 const long VideoPropDlg::ID_SPINBUTTON3 = wxNewId();
59 const long VideoPropDlg::ID_SPINBUTTON4 = wxNewId();
60 const long VideoPropDlg::ID_RESET_TIME_BT = wxNewId();
61 //*)
62 
BEGIN_EVENT_TABLE(VideoPropDlg,wxDialog)63 BEGIN_EVENT_TABLE(VideoPropDlg,wxDialog)
64 	//(*EventTable(VideoPropDlg)
65 	//*)
66 	EVT_BUTTON(wxID_OK, VideoPropDlg::OnOkBt)
67 	EVT_COMMAND_SCROLL(ID_SLIDER, VideoPropDlg::OnSliderScroll)
68 END_EVENT_TABLE()
69 
70 VideoPropDlg::VideoPropDlg(wxWindow* parent, DVD* dvd, Vob* vob, AspectRatio aspectRatio) {
71 	m_dvd = dvd;
72 	m_vob = vob;
73 	m_stream = vob->GetVideoStream();
74 	m_aspectRatio = aspectRatio;
75 	m_videoPos = 0;
76 
77 	//(*Initialize(VideoPropDlg)
78 	wxGridBagSizer* gridBagSizer;
79 	wxStaticText* srcLabel;
80 	wxGridBagSizer* cropBagSizer;
81 	wxBoxSizer* aspectSizer;
82 	wxBoxSizer* fadeSizer;
83 	wxStaticText* StaticText6;
84 	wxStaticText* filterLabel;
85 	wxStaticText* StaticText8;
86 	wxBoxSizer* padCropSizer;
87 	wxStaticText* durLabel;
88 	wxBoxSizer* mediaSizer;
89 	wxStdDialogButtonSizer* stdDialogButtonSizer;
90 	wxStaticText* staticText1;
91 	wxStaticText* dstLabel;
92 	wxGridBagSizer* borderSizer;
93 	wxStaticText* startLabel;
94 	wxBoxSizer* dstSizer;
95 	wxStaticText* fadeLabel;
96 	wxStaticText* endLabel;
97 	wxBoxSizer* timeSizer;
98 	wxStaticText* fileNameLabel;
99 	wxBoxSizer* mainSizer;
100 	wxBoxSizer* hSizer;
101 
102 	Create(parent, wxID_ANY, _("Video properties"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER, _T("wxID_ANY"));
103 	SetClientSize(wxSize(1024,500));
104 	mainSizer = new wxBoxSizer(wxVERTICAL);
105 	hSizer = new wxBoxSizer(wxHORIZONTAL);
106 	gridBagSizer = new wxGridBagSizer(2, 2);
107 	fileNameLabel = new wxStaticText(this, wxID_ANY, _("File Name:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
108 	gridBagSizer->Add(fileNameLabel, wxGBPosition(0, 0), wxDefaultSpan, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
109 	m_fileNameText = new wxStaticText(this, ID_STATICTEXT2, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2"));
110 	m_fileNameText->SetMinSize(wxSize(8,8));
111 	gridBagSizer->Add(m_fileNameText, wxGBPosition(0, 1), wxDefaultSpan, wxEXPAND, 5);
112 	durLabel = new wxStaticText(this, wxID_ANY, _("Duration:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
113 	gridBagSizer->Add(durLabel, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
114 	m_durText = new wxStaticText(this, ID_STATICTEXT4, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT4"));
115 	gridBagSizer->Add(m_durText, wxGBPosition(1, 1), wxDefaultSpan, wxEXPAND, 5);
116 	srcLabel = new wxStaticText(this, wxID_ANY, _("Source Format:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
117 	gridBagSizer->Add(srcLabel, wxGBPosition(2, 0), wxDefaultSpan, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
118 	m_srcText = new wxStaticText(this, ID_STATICTEXT3, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT3"));
119 	gridBagSizer->Add(m_srcText, wxGBPosition(2, 1), wxDefaultSpan, wxEXPAND, 5);
120 	dstLabel = new wxStaticText(this, wxID_ANY, _("Destination Format:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
121 	gridBagSizer->Add(dstLabel, wxGBPosition(3, 0), wxDefaultSpan, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
122 	dstSizer = new wxBoxSizer(wxHORIZONTAL);
123 	m_dstChoice = new wxChoice(this, DST_CHOICE_ID, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("DST_CHOICE_ID"));
124 	dstSizer->Add(m_dstChoice, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
125 	m_aspectChoice = new wxChoice(this, ASPECT_CHOICE_ID, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ASPECT_CHOICE_ID"));
126 	dstSizer->Add(m_aspectChoice, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
127 	m_interlacedChoice = new wxChoice(this, INTERLACED_CHOICE_ID, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("INTERLACED_CHOICE_ID"));
128 	m_interlacedChoice->SetSelection( m_interlacedChoice->Append(_("progressive")) );
129 	m_interlacedChoice->Append(_("interlace"));
130 	dstSizer->Add(m_interlacedChoice, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
131 	m_ffChoice = new wxChoice(this, FF_CHOICE_ID, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("FF_CHOICE_ID"));
132 	m_ffChoice->SetSelection( m_ffChoice->Append(_("auto")) );
133 	m_ffChoice->Append(_("BFF"));
134 	m_ffChoice->Append(_("TFF"));
135 	dstSizer->Add(m_ffChoice, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
136 	gridBagSizer->Add(dstSizer, wxGBPosition(3, 1), wxDefaultSpan, wxEXPAND, 5);
137 	aspectSizer = new wxBoxSizer(wxHORIZONTAL);
138 	m_keepAspectCtrl = new wxCheckBox(this, KEEP_ASPECT_CB_ID, _("Keep Aspect Ratio"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("KEEP_ASPECT_CB_ID"));
139 	m_keepAspectCtrl->SetValue(false);
140 	aspectSizer->Add(m_keepAspectCtrl, 0, wxALIGN_CENTER_VERTICAL, 5);
141 	m_keepAspectChoice = new wxChoice(this, KEEP_ASPECT_CHOICE_ID, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("KEEP_ASPECT_CHOICE_ID"));
142 	m_keepAspectChoice->SetSelection( m_keepAspectChoice->Append(_("border")) );
143 	m_keepAspectChoice->Append(_("crop"));
144 	aspectSizer->Add(m_keepAspectChoice, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
145 	gridBagSizer->Add(aspectSizer, wxGBPosition(4, 0), wxGBSpan(1, 2), wxEXPAND, 5);
146 	padCropSizer = new wxBoxSizer(wxHORIZONTAL);
147 	m_padBox = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Border"));
148 	borderSizer = new wxGridBagSizer(2, 2);
149 	m_padTop = new wxSpinCtrl(this, ID_SPINCTRL1, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL1"));
150 	m_padTop->SetValue(_T("0"));
151 	borderSizer->Add(m_padTop, wxGBPosition(0, 1), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
152 	m_padBottom = new wxSpinCtrl(this, ID_SPINCTRL4, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL4"));
153 	m_padBottom->SetValue(_T("0"));
154 	borderSizer->Add(m_padBottom, wxGBPosition(2, 1), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
155 	m_padRight = new wxSpinCtrl(this, ID_SPINCTRL3, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL3"));
156 	m_padRight->SetValue(_T("0"));
157 	borderSizer->Add(m_padRight, wxGBPosition(1, 2), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
158 	m_padLeft = new wxSpinCtrl(this, ID_SPINCTRL2, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL2"));
159 	m_padLeft->SetValue(_T("0"));
160 	borderSizer->Add(m_padLeft, wxGBPosition(1, 0), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
161 	m_padBox->Add(borderSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
162 	padCropSizer->Add(m_padBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
163 	m_cropBox = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Crop"));
164 	cropBagSizer = new wxGridBagSizer(2, 2);
165 	m_cropTop = new wxSpinCtrl(this, ID_SPINCTRL5, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL5"));
166 	m_cropTop->SetValue(_T("0"));
167 	cropBagSizer->Add(m_cropTop, wxGBPosition(0, 1), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
168 	m_cropBottom = new wxSpinCtrl(this, ID_SPINCTRL6, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL6"));
169 	m_cropBottom->SetValue(_T("0"));
170 	cropBagSizer->Add(m_cropBottom, wxGBPosition(2, 1), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
171 	m_cropRight = new wxSpinCtrl(this, ID_SPINCTRL7, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL7"));
172 	m_cropRight->SetValue(_T("0"));
173 	cropBagSizer->Add(m_cropRight, wxGBPosition(1, 2), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
174 	m_cropLeft = new wxSpinCtrl(this, ID_SPINCTRL8, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL8"));
175 	m_cropLeft->SetValue(_T("0"));
176 	cropBagSizer->Add(m_cropLeft, wxGBPosition(1, 0), wxDefaultSpan, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
177 	m_cropBox->Add(cropBagSizer, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
178 	padCropSizer->Add(m_cropBox, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
179 	gridBagSizer->Add(padCropSizer, wxGBPosition(5, 0), wxGBSpan(1, 2), wxEXPAND, 5);
180 	fadeLabel = new wxStaticText(this, wxID_ANY, _("Fade-In/Out:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
181 	gridBagSizer->Add(fadeLabel, wxGBPosition(6, 0), wxDefaultSpan, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
182 	filterLabel = new wxStaticText(this, wxID_ANY, _("Filters:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
183 	gridBagSizer->Add(filterLabel, wxGBPosition(7, 0), wxDefaultSpan, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
184 	fadeSizer = new wxBoxSizer(wxHORIZONTAL);
185 	m_fadeInCtrl = new wxSpinCtrl(this, ID_SPINCTRL9, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL9"));
186 	m_fadeInCtrl->SetValue(_T("0"));
187 	fadeSizer->Add(m_fadeInCtrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
188 	StaticText6 = new wxStaticText(this, wxID_ANY, _("sec"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
189 	fadeSizer->Add(StaticText6, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2);
190 	m_fadeOutCtrl = new wxSpinCtrl(this, ID_SPINCTRL10, _T("0"), wxDefaultPosition, wxSize(58,-1), 0, 0, 999, 0, _T("ID_SPINCTRL10"));
191 	m_fadeOutCtrl->SetValue(_T("0"));
192 	fadeSizer->Add(m_fadeOutCtrl, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
193 	StaticText8 = new wxStaticText(this, wxID_ANY, _("sec"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
194 	fadeSizer->Add(StaticText8, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2);
195 	gridBagSizer->Add(fadeSizer, wxGBPosition(6, 1), wxDefaultSpan, wxEXPAND, 5);
196 	m_filtersCtrl = new wxTextCtrl(this, ID_TEXTCTRL1, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL1"));
197 	gridBagSizer->Add(m_filtersCtrl, wxGBPosition(7, 1), wxDefaultSpan, wxEXPAND, 5);
198 	hSizer->Add(gridBagSizer, 0, wxALL|wxEXPAND, 5);
199 	mediaSizer = new wxBoxSizer(wxVERTICAL);
200 	m_mediaCtrl = new MediaCtrlFF(this, ID_CUSTOM1, wxT(""), wxDefaultPosition,wxDefaultSize, 0, wxDefaultValidator, _T("ID_CUSTOM1"));
201 	m_mediaCtrl->SetMinSize(wxSize(300, 200));
202 	m_mediaCtrl->SetWindowStyle(wxBORDER_NONE);
203 	mediaSizer->Add(m_mediaCtrl, 1, wxALL|wxEXPAND, 4);
204 	m_slider = new wxSlider(this, ID_SLIDER, 0, 0, 100, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER"));
205 	mediaSizer->Add(m_slider, 0, wxEXPAND, 2);
206 	timeSizer = new wxBoxSizer(wxHORIZONTAL);
207 	staticText1 = new wxStaticText(this, wxID_ANY, _("Time:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
208 	timeSizer->Add(staticText1, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 4);
209 	m_timeCtrl = new wxTextCtrl(this, ID_TIME_CTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TIME_CTRL"));
210 	timeSizer->Add(m_timeCtrl, 0, wxLEFT|wxEXPAND, 2);
211 	m_timeSpinBt = new wxSpinButton(this, ID_TIME_SPINB, wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL|wxSP_ARROW_KEYS, _T("ID_TIME_SPINB"));
212 	m_timeSpinBt->SetRange(0, 100);
213 	m_timeSpinBt->SetMinSize(wxSize(16,12));
214 	timeSizer->Add(m_timeSpinBt, 0, wxEXPAND, 5);
215 	m_frameSpinBt = new wxSpinButton(this, ID_FRAME_SPINBT, wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL|wxSP_ARROW_KEYS|wxSP_WRAP, _T("ID_FRAME_SPINBT"));
216 	m_frameSpinBt->SetRange(-9999, 9999);
217 	m_frameSpinBt->SetMinSize(wxSize(16,12));
218 	timeSizer->Add(m_frameSpinBt, 0, wxEXPAND, 5);
219 	startLabel = new wxStaticText(this, wxID_ANY, _("Start:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
220 	timeSizer->Add(startLabel, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 8);
221 	m_startCtrl = new wxTextCtrl(this, ID_TEXTCTRL2, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL2"));
222 	timeSizer->Add(m_startCtrl, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2);
223 	m_startSpin = new wxSpinButton(this, ID_SPINBUTTON1, wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL|wxSP_ARROW_KEYS|wxSP_WRAP, _T("ID_SPINBUTTON1"));
224 	m_startSpin->SetRange(-9999, 9999);
225 	m_startSpin->SetMinSize(wxSize(16,12));
226 	timeSizer->Add(m_startSpin, 0, wxEXPAND, 5);
227 	m_startFrameSpin = new wxSpinButton(this, ID_SPINBUTTON2, wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL|wxSP_ARROW_KEYS|wxSP_WRAP, _T("ID_SPINBUTTON2"));
228 	m_startFrameSpin->SetRange(-9999, 9999);
229 	m_startFrameSpin->SetMinSize(wxSize(16,12));
230 	timeSizer->Add(m_startFrameSpin, 0, wxEXPAND, 5);
231 	m_startBt = new wxBitmapButton(this, START_BT_ID, wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_CUT")),wxART_MENU), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW, wxDefaultValidator, _T("START_BT_ID"));
232 	m_startBt->SetDefault();
233 	m_startBt->SetToolTip(_("Cut beginning"));
234 	timeSizer->Add(m_startBt, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2);
235 	endLabel = new wxStaticText(this, wxID_ANY, _("End:"), wxDefaultPosition, wxDefaultSize, 0, _T("wxID_ANY"));
236 	timeSizer->Add(endLabel, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
237 	m_endCtrl = new wxTextCtrl(this, ID_TEXTCTRL3, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL3"));
238 	timeSizer->Add(m_endCtrl, 0, wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 2);
239 	m_endSpin = new wxSpinButton(this, ID_SPINBUTTON3, wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL|wxSP_ARROW_KEYS|wxSP_WRAP, _T("ID_SPINBUTTON3"));
240 	m_endSpin->SetRange(-9999, 9999);
241 	m_endSpin->SetMinSize(wxSize(16,12));
242 	timeSizer->Add(m_endSpin, 0, wxEXPAND, 0);
243 	m_endFrameSpin = new wxSpinButton(this, ID_SPINBUTTON4, wxDefaultPosition, wxDefaultSize, wxSP_VERTICAL|wxSP_ARROW_KEYS|wxSP_WRAP, _T("ID_SPINBUTTON4"));
244 	m_endFrameSpin->SetRange(-9999, 9999);
245 	m_endFrameSpin->SetMinSize(wxSize(16,12));
246 	timeSizer->Add(m_endFrameSpin, 0, wxEXPAND, 0);
247 	m_endBt = new wxBitmapButton(this, ID_RESET_TIME_BT, wxArtProvider::GetBitmap(wxART_MAKE_ART_ID_FROM_STR(_T("wxART_CUT")),wxART_MENU), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW, wxDefaultValidator, _T("ID_RESET_TIME_BT"));
248 	m_endBt->SetDefault();
249 	m_endBt->SetToolTip(_("Cut ending"));
250 	timeSizer->Add(m_endBt, 0, wxEXPAND, 2);
251 	mediaSizer->Add(timeSizer, 0, wxALL|wxEXPAND, 5);
252 	hSizer->Add(mediaSizer, 1, wxEXPAND, 5);
253 	mainSizer->Add(hSizer, 1, wxALL|wxEXPAND, 5);
254 	stdDialogButtonSizer = new wxStdDialogButtonSizer();
255 	stdDialogButtonSizer->AddButton(new wxButton(this, wxID_OK, wxEmptyString));
256 	stdDialogButtonSizer->AddButton(new wxButton(this, wxID_CANCEL, wxEmptyString));
257 	stdDialogButtonSizer->Realize();
258 	mainSizer->Add(stdDialogButtonSizer, 0, wxALL|wxEXPAND, 4);
259 	SetSizer(mainSizer);
260 	SetSizer(mainSizer);
261 	Layout();
262 	Center();
263 
264 	Connect(DST_CHOICE_ID,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&VideoPropDlg::OnChangeFormat);
265 	Connect(ASPECT_CHOICE_ID,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&VideoPropDlg::OnChangeAspect);
266 	Connect(INTERLACED_CHOICE_ID,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&VideoPropDlg::OnInterlaced);
267 	Connect(KEEP_ASPECT_CB_ID,wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)&VideoPropDlg::OnChangeKeepAspect);
268 	Connect(KEEP_ASPECT_CHOICE_ID,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&VideoPropDlg::OnChangeKeepAspect);
269 	Connect(ID_SPINCTRL1,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeBorder);
270 	Connect(ID_SPINCTRL4,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeBorder);
271 	Connect(ID_SPINCTRL3,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeBorder);
272 	Connect(ID_SPINCTRL2,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeBorder);
273 	Connect(ID_SPINCTRL5,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeCrop);
274 	Connect(ID_SPINCTRL6,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeCrop);
275 	Connect(ID_SPINCTRL7,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeCrop);
276 	Connect(ID_SPINCTRL8,wxEVT_COMMAND_SPINCTRL_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeCrop);
277 	Connect(ID_TIME_CTRL,wxEVT_COMMAND_TEXT_UPDATED,(wxObjectEventFunction)&VideoPropDlg::OnChangeTime);
278 	Connect(ID_TIME_SPINB,wxEVT_SCROLL_THUMBTRACK,(wxObjectEventFunction)&VideoPropDlg::OnTimeSpin);
279 	Connect(ID_FRAME_SPINBT,wxEVT_SCROLL_LINEUP,(wxObjectEventFunction)&VideoPropDlg::OnFrameSpin);
280 	Connect(ID_FRAME_SPINBT,wxEVT_SCROLL_LINEDOWN,(wxObjectEventFunction)&VideoPropDlg::OnFrameSpinDown);
281 	Connect(ID_SPINBUTTON1,wxEVT_SCROLL_LINEUP,(wxObjectEventFunction)&VideoPropDlg::OnStartSpin);
282 	Connect(ID_SPINBUTTON1,wxEVT_SCROLL_LINEDOWN,(wxObjectEventFunction)&VideoPropDlg::OnStartSpinDown);
283 	Connect(ID_SPINBUTTON2,wxEVT_SCROLL_LINEUP,(wxObjectEventFunction)&VideoPropDlg::OnStartFrameSpin);
284 	Connect(ID_SPINBUTTON2,wxEVT_SCROLL_LINEDOWN,(wxObjectEventFunction)&VideoPropDlg::OnStartFrameSpinDown);
285 	Connect(START_BT_ID,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&VideoPropDlg::OnStartBt);
286 	Connect(ID_SPINBUTTON3,wxEVT_SCROLL_LINEUP,(wxObjectEventFunction)&VideoPropDlg::OnEndSpin);
287 	Connect(ID_SPINBUTTON3,wxEVT_SCROLL_LINEDOWN,(wxObjectEventFunction)&VideoPropDlg::OnEndSpinDown);
288 	Connect(ID_SPINBUTTON4,wxEVT_SCROLL_LINEUP,(wxObjectEventFunction)&VideoPropDlg::OnEndFrameSpin);
289 	Connect(ID_SPINBUTTON4,wxEVT_SCROLL_LINEDOWN,(wxObjectEventFunction)&VideoPropDlg::OnEndFrameSpinDown);
290 	Connect(ID_RESET_TIME_BT,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&VideoPropDlg::OnEndBt);
291 	//*)
292 
293     int x = 0;
294 	m_timeCtrl->GetTextExtent(wxT("00:00:00.000"), &x, NULL);
295 	m_timeCtrl->SetMinSize(wxSize(x + 10, -1));
296 	m_startCtrl->SetMinSize(wxSize(x + 10, -1));
297 	m_endCtrl->SetMinSize(wxSize(x + 10, -1));
298 
299     m_fileNameText->SetLabel(m_vob->GetFilenameDisplay());
300     m_fileNameText->SetToolTip(m_vob->GetFilenameDisplay());
301     // duration
302 	wxString s = wxT("N/A");
303 	if (m_vob->GetDuration()>0) {
304 		int secs = (int) m_vob->GetDuration();
305 		int mins = secs / 60;
306 		secs %= 60;
307 		int hours = mins / 60;
308 		mins %= 60;
309 		s = wxString::Format(wxT("%02d:%02d:%02d"), hours, mins, secs);
310 	}
311     m_durText->SetLabel(s);
312     m_srcText->SetLabel(m_stream->GetSourceFormat());
313 
314     // format
315     bool copyEnabled = m_stream->IsCopyPossible();
316     m_dstChoice->Append(DVD::GetVideoFormatLabels(copyEnabled, false, false, m_dvd->IsHD()));
317 	int vf = m_stream->GetVideoFormat();
318 	if (m_dvd->IsHD()) {
319 		if (vf >= vfPAL_HALF_HD) {
320 			vf = vf - vfPAL_HALF_HD + (copyEnabled ? 1 : 0);
321 		} else
322 			vf =  vf >= vfPAL && vf < vfPAL_HALF_HD ? vf + (copyEnabled ? 5 : 4) : 0;
323 	} else {
324 		vf -= (copyEnabled ? 1 : 2);
325 	}
326     m_dstChoice->SetSelection(vf);
327     m_aspectChoice->Append(DVD::GetAspectRatioLabels());
328     m_aspectChoice->SetSelection(m_aspectRatio - 1);
329     m_interlacedChoice->SetSelection(m_vob->GetInterlaced() ? 1 : 0);
330     m_ffChoice->SetSelection(((int)m_vob->GetFirstField()) + 1);
331     m_keepAspectCtrl->SetValue(m_vob->GetKeepAspectRatio());
332     m_keepAspectChoice->SetSelection(m_vob->GetKeepAspectCrop() ? 1 : 0);
333     m_lastFormat = GetVideoFormat();
334 
335     // border
336     m_padLeft->SetValue(m_vob->GetPad()[0]);
337     m_padRight->SetValue(m_vob->GetPad()[1]);
338     m_padTop->SetValue(m_vob->GetPad()[2]);
339     m_padBottom->SetValue(m_vob->GetPad()[3]);
340 
341     // crop
342     m_cropLeft->SetValue(m_vob->GetCrop()[0]);
343     m_cropRight->SetValue(m_vob->GetCrop()[1]);
344     m_cropTop->SetValue(m_vob->GetCrop()[2]);
345     m_cropBottom->SetValue(m_vob->GetCrop()[3]);
346 
347     // fade-in / fade-out
348     m_fadeInCtrl->SetValue(m_vob->GetFadeIn());
349     m_fadeOutCtrl->SetValue(m_vob->GetFadeOut());
350     m_filtersCtrl->SetValue(m_vob->GetVideoFilters());
351 
352     // start time
353     int ms = lround(m_vob->GetStartTime() * 1000);
354     ms = ms % 1000;
355 	long t = (long) m_vob->GetStartTime();
356 	m_startCtrl->SetValue(wxString::Format(wxT("%d:%02d:%02d.%03d"), t/3600, (t/60)%60, t%60, ms));
357 
358 	// end time
359 	if (m_vob->GetRecordingTime() > 0) {
360 		ms = lround((m_vob->GetStartTime() + m_vob->GetRecordingTime()) * 1000);
361 		ms = ms % 1000;
362 		t = (long) (m_vob->GetStartTime() + m_vob->GetRecordingTime());
363 		m_endCtrl->SetValue(wxString::Format(wxT("%d:%02d:%02d.%03d"), t/3600, (t/60) % 60, t%60, ms));
364 	}
365 
366     wxCommandEvent evt;
367     OnChangeFormat(evt);
368     m_dstChoice->SetFocus();
369 }
370 
~VideoPropDlg()371 VideoPropDlg::~VideoPropDlg() {
372 	//(*Destroy(VideoPropDlg)
373 	//*)
374 }
375 
TimeToDouble(wxString timeStr)376 double TimeToDouble(wxString timeStr) {
377 	wxRegEx re(wxT("^(([[:digit:]]+:)?([[:digit:]]?[[:digit:]]):)?([[:digit:]]?[[:digit:]])(\\.[[:digit:]]+)?$"));
378 	if (!re.Matches(timeStr))
379 		return -1;
380 	double result = 0;
381 	long lval;
382 	wxString val = re.GetMatch(timeStr, 2).BeforeFirst(wxT(':'));
383 	if (val.ToLong(&lval))
384 		result += lval*3600;
385 	val = re.GetMatch(timeStr, 3).BeforeFirst(wxT(':'));
386 	if (val.ToLong(&lval))
387 		result += lval*60;
388 	val = re.GetMatch(timeStr, 4);
389 	if (val.ToLong(&lval))
390 		result += lval;
391 	val = re.GetMatch(timeStr, 5);
392 	double dval;
393 	if (val.ToDouble(&dval))
394 		result += dval;
395 	return result;
396 }
397 
GetVideoFormat()398 VideoFormat VideoPropDlg::GetVideoFormat() {
399 	int vf = m_dstChoice->GetSelection();
400 	if (m_dvd->IsHD()) {
401 		if (m_stream->IsCopyPossible()) {
402 			if (vf == 0) {
403 				vf = vfCOPY;
404 			} else if (vf <= 6) {
405 				vf += vfPAL_HALF_HD - 1;
406 			} else
407 				vf -= 5;
408 		} else {
409 			if (vf <= 5) {
410 				vf += vfPAL_HALF_HD;
411 			} else
412 				vf -= 4;
413 		}
414 	} else {
415 		vf += (m_stream->IsCopyPossible() ? 1 : 2);
416 	}
417 	return (VideoFormat) vf;
418 }
419 
GetAspectRatio()420 AspectRatio VideoPropDlg::GetAspectRatio() {
421 	return (AspectRatio) (m_aspectChoice->GetSelection() + 1);
422 }
423 
GetPad()424 vector<int> VideoPropDlg::GetPad() {
425 	int a[4] = { m_padLeft->GetValue(), m_padRight->GetValue(), m_padTop->GetValue(), m_padBottom->GetValue() };
426 	return vector<int>(a, a + sizeof(a)/sizeof(*a));
427 }
428 
GetCrop()429 vector<int> VideoPropDlg::GetCrop() {
430 	int a[4] = { m_cropLeft->GetValue(), m_cropRight->GetValue(), m_cropTop->GetValue(), m_cropBottom->GetValue() };
431 	return vector<int>(a, a + sizeof(a)/sizeof(*a));
432 }
433 
434 /**
435  * Displays dialog
436  */
ShowModal()437 int VideoPropDlg::ShowModal() {
438 	if (!m_mediaCtrl->Load(m_vob->GetFilename()))
439 		return wxID_CANCEL;
440 	m_slider->SetMax(m_mediaCtrl->Length()/1000);
441 	m_timeSpinBt->SetMax(m_mediaCtrl->Length()/1000);
442 	wxScrollEvent scrlEvt;
443 	OnSliderScroll(scrlEvt);
444 	int res = wxDialog::ShowModal();
445 	if (res == wxID_OK) {
446 		m_stream->SetDestinationFormat(GetVideoFormat());
447 		m_vob->GetPad() = GetPad();
448 		m_vob->GetCrop() = GetCrop();
449 		m_vob->SetInterlaced(m_interlacedChoice->GetSelection() == 1);
450 		m_vob->SetFirstField((FirstField) (m_ffChoice->GetSelection() - 1));
451 		m_vob->SetKeepAspectRatio(m_keepAspectCtrl->GetValue());
452 		m_vob->SetKeepAspectCrop(m_keepAspectChoice->GetSelection() == 1);
453 		m_vob->SetFadeIn(m_fadeInCtrl->GetValue());
454 		m_vob->SetFadeOut(m_fadeOutCtrl->GetValue());
455 		m_vob->SetVideoFilters(m_filtersCtrl->GetValue());
456 
457 		double durationOld = m_vob->GetResultDuration();
458 		double time = TimeToDouble(m_startCtrl->GetValue());
459 		m_vob->SetStartTime(time >= 0 ? time : 0);
460 		time = TimeToDouble(m_endCtrl->GetValue());
461 		m_vob->SetRecordingTime(time > m_vob->GetStartTime() ? time - m_vob->GetStartTime() : -1);
462 		if (durationOld != m_vob->GetResultDuration()) {
463 			// remove chapter at the end
464 			long duration = (long) durationOld;
465 			if (s_config.GetAddChapterAtTitleEnd() && m_vob->GetCells().size() > 0 &&
466 					m_vob->GetCells()[m_vob->GetCells().size() - 1]->GetStart() == (duration - 1)*1000) {
467 				m_vob->GetCells().erase(m_vob->GetCells().end() - 1);
468 			}
469 			// remove chapters > duration
470 			duration = (long) m_vob->GetResultDuration()*1000;
471 			unsigned int i = 0;
472 			while (i < m_vob->GetCells().size()) {
473 				if (m_vob->GetCells()[i]->GetStart() > duration) {
474 					m_vob->GetCells().erase(m_vob->GetCells().begin() + i);
475 				} else
476 					i++;
477 			}
478 			// add chapter at the end
479 			duration = (long) m_vob->GetResultDuration();
480 			if (s_config.GetAddChapterAtTitleEnd() && (m_vob->GetCells().size() == 0 ||
481 					m_vob->GetCells()[m_vob->GetCells().size() - 1]->GetStart() < (duration - 1)*1000)) {
482 				m_vob->GetCells().push_back(new Cell((duration - 1)* 1000));
483 			}
484 		}
485 	}
486 	return res;
487 }
488 
UpdatePadCrop()489 void VideoPropDlg::UpdatePadCrop() {
490 	if (m_keepAspectCtrl->GetValue()) {
491 		if (m_keepAspectChoice->GetSelection() == 0) {
492 			// set border
493 			int padx = 0;
494 			int pady = 0;
495 			if (m_vob->CalcPad(padx, pady, GetVideoFormat(), GetAspectRatio(), GetCrop())) {
496 				m_padLeft->SetValue(padx);
497 				m_padRight->SetValue(padx);
498 				m_padTop->SetValue(pady);
499 				m_padBottom->SetValue(pady);
500 			}
501 		} else  {
502 			// set crop
503 			int cropx = 0;
504 			int cropy = 0;
505 			if (m_vob->CalcCrop(cropx, cropy, GetVideoFormat(), GetAspectRatio(), GetPad())) {
506 				m_cropLeft->SetValue(cropx);
507 				m_cropRight->SetValue(cropx);
508 				m_cropTop->SetValue(cropy);
509 				m_cropBottom->SetValue(cropy);
510 			}
511 		}
512 	}
513 	// update preview
514 	m_mediaCtrl->SetVideoFormat(GetVideoFormat(), GetAspectRatio(), GetPad(), GetCrop());
515 }
516 
SeekVideo(long pos,bool updateTimeCtrl)517 void VideoPropDlg::SeekVideo(long pos, bool updateTimeCtrl) {
518 	m_videoPos = pos;
519 	m_slider->SetValue(lround(pos / 1000));
520 	m_timeSpinBt->SetValue(lround(pos / 1000));
521 	m_mediaCtrl->Seek((wxFileOffset) pos);
522 	if (updateTimeCtrl)
523 		m_timeCtrl->ChangeValue(Time2String(pos, true));
524 }
525 
OnSliderScroll(wxScrollEvent & event)526 void VideoPropDlg::OnSliderScroll(wxScrollEvent& event) {
527 	SeekVideo(((long)m_slider->GetValue())*1000);
528 }
529 
OnTimeSpin(wxSpinEvent & event)530 void VideoPropDlg::OnTimeSpin(wxSpinEvent& event) {
531 	SeekVideo(((long)m_timeSpinBt->GetValue())*1000);
532 }
533 
OnChangeTime(wxCommandEvent & event)534 void VideoPropDlg::OnChangeTime(wxCommandEvent& event) {
535 	if (s_timeRE.Matches(m_timeCtrl->GetValue()))
536 		SeekVideo(String2Time(m_timeCtrl->GetValue(), m_mediaCtrl->GetFps()), false);
537 }
538 
OnFrameSpin(wxSpinEvent & event)539 void VideoPropDlg::OnFrameSpin(wxSpinEvent& event) {
540     SeekVideo(String2Time(m_timeCtrl->GetValue(), m_mediaCtrl->GetFps()) + 1000 / m_mediaCtrl->GetFps());
541 }
542 
OnFrameSpinDown(wxSpinEvent & event)543 void VideoPropDlg::OnFrameSpinDown(wxSpinEvent& event) {
544     long pos = String2Time(m_timeCtrl->GetValue(), m_mediaCtrl->GetFps()) - 1000 / m_mediaCtrl->GetFps();
545     SeekVideo(pos >= 0 ? pos : 0);
546 }
547 
OnStartSpin(wxSpinEvent & event)548 void VideoPropDlg::OnStartSpin(wxSpinEvent& event) {
549    	long pos = String2Time(m_startCtrl->GetValue(), m_mediaCtrl->GetFps());
550    	pos = pos - pos % 1000 + 1000;
551 	m_startCtrl->ChangeValue(Time2String(pos, true));
552 }
553 
OnStartSpinDown(wxSpinEvent & event)554 void VideoPropDlg::OnStartSpinDown(wxSpinEvent& event) {
555     long pos = String2Time(m_startCtrl->GetValue(), m_mediaCtrl->GetFps());
556     pos = pos - pos % 1000 - (pos % 1000 > 0 ? 0 : 1000);
557     m_startCtrl->ChangeValue(Time2String(pos >= 0 ? pos : 0, true));
558 }
559 
OnStartFrameSpin(wxSpinEvent & event)560 void VideoPropDlg::OnStartFrameSpin(wxSpinEvent& event) {
561 	long pos = String2Time(m_startCtrl->GetValue(), m_mediaCtrl->GetFps()) + 1000 / m_mediaCtrl->GetFps();
562 	m_startCtrl->ChangeValue(Time2String(pos, true));
563 }
564 
OnStartFrameSpinDown(wxSpinEvent & event)565 void VideoPropDlg::OnStartFrameSpinDown(wxSpinEvent& event) {
566 	long pos = String2Time(m_startCtrl->GetValue(), m_mediaCtrl->GetFps()) - 1000 / m_mediaCtrl->GetFps();
567 	m_startCtrl->ChangeValue(Time2String(pos >= 0 ? pos : 0, true));
568 }
569 
OnEndSpin(wxSpinEvent & event)570 void VideoPropDlg::OnEndSpin(wxSpinEvent& event) {
571    	long pos = String2Time(m_endCtrl->GetValue(), m_mediaCtrl->GetFps());
572    	pos = pos - pos % 1000 + 1000;
573 	m_endCtrl->ChangeValue(Time2String(pos, true));
574 }
575 
OnEndSpinDown(wxSpinEvent & event)576 void VideoPropDlg::OnEndSpinDown(wxSpinEvent& event) {
577 	long pos = String2Time(m_endCtrl->GetValue(), m_mediaCtrl->GetFps());
578 	pos = pos - pos % 1000 - (pos % 1000 > 0 ? 0 : 1000);
579 	m_endCtrl->ChangeValue(Time2String(pos >= 0 ? pos : 0, true));
580 }
581 
OnEndFrameSpin(wxSpinEvent & event)582 void VideoPropDlg::OnEndFrameSpin(wxSpinEvent& event) {
583 	long pos = String2Time(m_endCtrl->GetValue(), m_mediaCtrl->GetFps());
584 	m_endCtrl->ChangeValue(Time2String(pos + 1000 / m_mediaCtrl->GetFps(), true));
585 }
586 
OnEndFrameSpinDown(wxSpinEvent & event)587 void VideoPropDlg::OnEndFrameSpinDown(wxSpinEvent& event) {
588 	long pos = String2Time(m_endCtrl->GetValue(), m_mediaCtrl->GetFps()) - 1000 / m_mediaCtrl->GetFps();
589 	m_endCtrl->ChangeValue(Time2String(pos >= 0 ? pos : 0, true));
590 }
591 
OnChangeFormat(wxCommandEvent & event)592 void VideoPropDlg::OnChangeFormat(wxCommandEvent& event) {
593 	// update keepAspect, border and crop controls
594 	if (GetVideoFormat() == vfCOPY) {
595 		m_interlacedChoice->SetSelection(0);
596 		m_keepAspectCtrl->SetValue(false);
597 		m_padLeft->SetValue(0);
598 		m_padRight->SetValue(0);
599 		m_padTop->SetValue(0);
600 		m_padBottom->SetValue(0);
601 		m_cropLeft->SetValue(0);
602 		m_cropRight->SetValue(0);
603 		m_cropTop->SetValue(0);
604 		m_cropBottom->SetValue(0);
605 	} else if (m_lastFormat == vfCOPY)
606 		m_keepAspectCtrl->SetValue(true);
607 	m_lastFormat = GetVideoFormat();
608 
609 	// enable/disable controls
610 	bool enable = GetVideoFormat() != vfCOPY;
611 	bool enablePad = enable && !m_keepAspectCtrl->GetValue();
612 	m_interlacedChoice->Enable(enable);
613 	m_keepAspectCtrl->Enable(enable);
614 	m_keepAspectChoice->Enable(enable && m_keepAspectCtrl->GetValue());
615 	m_padLeft->Enable(enablePad);
616 	m_padRight->Enable(enablePad);
617 	m_padTop->Enable(enablePad);
618 	m_padBottom->Enable(enablePad);
619 	m_cropLeft->Enable(enable);
620 	m_cropRight->Enable(enable);
621 	m_cropTop->Enable(enable);
622 	m_cropBottom->Enable(enable);
623 	m_fadeInCtrl->Enable(enable);
624 	m_fadeOutCtrl->Enable(enable);
625 	m_filtersCtrl->Enable(enable);
626 	wxCommandEvent evt;
627 	OnInterlaced(evt);
628 	UpdatePadCrop();
629 }
630 
OnInterlaced(wxCommandEvent & event)631 void VideoPropDlg::OnInterlaced(wxCommandEvent& event) {
632 	m_ffChoice->Enable(m_interlacedChoice->GetSelection() == 1);
633 	if (m_interlacedChoice->GetSelection() == 0)
634 		m_ffChoice->SetSelection(0);
635 }
636 
OnChangeAspect(wxCommandEvent & event)637 void VideoPropDlg::OnChangeAspect(wxCommandEvent& event) {
638 	UpdatePadCrop();
639 }
640 
OnChangeKeepAspect(wxCommandEvent & event)641 void VideoPropDlg::OnChangeKeepAspect(wxCommandEvent& event) {
642 	m_keepAspectChoice->Enable(m_keepAspectCtrl->GetValue());
643 	bool keepAspect = m_keepAspectCtrl->GetValue();
644 	bool border = m_keepAspectChoice->GetSelection() == 0;
645 	m_padLeft->Enable(!keepAspect || !border);
646 	m_padRight->Enable(!keepAspect || !border);
647 	m_padTop->Enable(!keepAspect || !border);
648 	m_padBottom->Enable(!keepAspect || !border);
649 	m_cropLeft->Enable(!keepAspect || border);
650 	m_cropRight->Enable(!keepAspect || border);
651 	m_cropTop->Enable(!keepAspect || border);
652 	m_cropBottom->Enable(!keepAspect || border);
653 	if (keepAspect) {
654 		if (border) {
655 			m_cropLeft->SetValue(0);
656 			m_cropRight->SetValue(0);
657 			m_cropTop->SetValue(0);
658 			m_cropBottom->SetValue(0);
659 		} else {
660 			m_padLeft->SetValue(0);
661 			m_padRight->SetValue(0);
662 			m_padTop->SetValue(0);
663 			m_padBottom->SetValue(0);
664 		}
665 	} else {
666 		if (border) {
667 			m_padLeft->SetValue(0);
668 			m_padRight->SetValue(0);
669 			m_padTop->SetValue(0);
670 			m_padBottom->SetValue(0);
671 		} else {
672 			m_cropLeft->SetValue(0);
673 			m_cropRight->SetValue(0);
674 			m_cropTop->SetValue(0);
675 			m_cropBottom->SetValue(0);
676 		}
677 	}
678 	UpdatePadCrop();
679 }
680 
OnChangeBorder(wxSpinEvent & event)681 void VideoPropDlg::OnChangeBorder(wxSpinEvent& event) {
682 	UpdatePadCrop();
683 }
684 
OnChangeCrop(wxSpinEvent & event)685 void VideoPropDlg::OnChangeCrop(wxSpinEvent& event) {
686 	UpdatePadCrop();
687 }
688 
OnStartBt(wxCommandEvent & event)689 void VideoPropDlg::OnStartBt(wxCommandEvent& event) {
690 	m_startCtrl->SetValue(Time2String(m_videoPos, true));
691 }
692 
OnEndBt(wxCommandEvent & event)693 void VideoPropDlg::OnEndBt(wxCommandEvent& event) {
694 	if (m_slider->GetValue() < m_slider->GetMax()) {
695 		m_endCtrl->SetValue(Time2String(m_videoPos, true));
696 	} else
697 		m_endCtrl->SetValue(wxT(""));
698 }
699 
OnOkBt(wxCommandEvent & event)700 void VideoPropDlg::OnOkBt(wxCommandEvent& event) {
701 	if (m_startCtrl->GetValue().length() > 0 && TimeToDouble(m_startCtrl->GetValue()) == -1) {
702 		wxLogError(_("Invalid time") + wxString(wxT(": ")) + m_startCtrl->GetValue());
703 		event.Skip();
704 		return;
705 	}
706 	if (m_endCtrl->GetValue().length() > 0 && TimeToDouble(m_endCtrl->GetValue()) == -1) {
707 		wxLogError(_("Invalid time") + wxString(wxT(": ")) + m_startCtrl->GetValue());
708 		event.Skip();
709 		return;
710 	}
711 	this->EndModal(wxID_OK);
712 }
713