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