1 /////////////////////////////////////////////////////////////////////////////
2 // Name: MenuPropDlg.cpp
3 // Purpose: DVD menu properties dialog
4 // Author: Alex Thuering
5 // Created: 25.04.2004
6 // RCS-ID: $Id: MenuPropDlg.cpp,v 1.52 2017/01/02 10:46:47 ntalex Exp $
7 // Copyright: (c) Alex Thuering
8 // Licence: GPL
9 /////////////////////////////////////////////////////////////////////////////
10
11 #include "MenuPropDlg.h"
12 #include "TitlesetManager.h"
13 #include "Config.h"
14 #include "MenuCellsDlg.h"
15 #include "MenuActionsDlg.h"
16 #include <wxVillaLib/utils.h>
17 #include <wx/file.h>
18 #include "rc/preferences.png.h"
19
20 enum {
21 ASPECT_CHOICE_ID = 7850,
22 AUDIO_CTRL_ID,
23 LOOP_CB_ID,
24 CELLS_BT_ID,
25 ACTIONS_BT_ID
26 };
27
BEGIN_EVENT_TABLE(MenuPropDlg,wxPropDlg)28 BEGIN_EVENT_TABLE(MenuPropDlg, wxPropDlg)
29 EVT_CHOICE(ASPECT_CHOICE_ID, MenuPropDlg::OnChangeAspect)
30 EVT_TEXT(AUDIO_CTRL_ID, MenuPropDlg::OnChangeAudio)
31 EVT_CHECKBOX(LOOP_CB_ID, MenuPropDlg::OnLoopCheck)
32 EVT_BUTTON(CELLS_BT_ID, MenuPropDlg::OnCellsBt)
33 EVT_BUTTON(ACTIONS_BT_ID, MenuPropDlg::OnActionsBt)
34 END_EVENT_TABLE()
35
36 MenuPropDlg::MenuPropDlg(wxWindow *parent, DVD* dvd, int tsi, int pgci):
37 wxPropDlg(parent), m_dvd(dvd), m_tsi(tsi), m_pgci(pgci), m_aspect(NULL), m_wsFormat(NULL), m_audioFormat(NULL),
38 m_pauseCtrl(NULL), m_postCommandsCtrl(NULL), m_subStartCtrlIdx(0), m_audioCtrlIdx(0), m_preCommandsCtrlIdx(0) {
39 PgcArray& pgcs = m_dvd->GetPgcArray(tsi, true);
40 m_video = &pgcs.GetVideo();
41 m_langCodes = &pgcs.GetAudioLangCodes();
42 m_pgc = pgcs[pgci];
43 m_vob = m_dvd->GetMenuVob(tsi, pgci);
44 m_menu = m_vob->GetMenu();
45 VECTOR_COPY(m_vob->GetCells(), m_cells, Cell)
46 VECTOR_COPY(m_menu->GetActions(), m_actions, DVDAction)
47 m_audioFormat = NULL;
48 // set title
49 wxString title = _("Properties") + wxString(wxT(" - "));
50 if (tsi >= 0) {
51 if (dvd->GetTitlesets().Count() > 1)
52 title += _("Titleset") + wxString::Format(wxT(" %d "), tsi+1);
53 title += _("Menu") + wxString::Format(wxT(" %d"), pgci+1);
54 } else
55 title += _("VMGM menu") + wxString::Format(wxT(" %d"), pgci+1);
56 SetTitle(title);
57 // create
58 Create();
59 SetSize(400,-1);
60 }
61
62
~MenuPropDlg()63 MenuPropDlg::~MenuPropDlg() {
64 VECTOR_CLEAR(m_cells, Cell)
65 VECTOR_CLEAR(m_actions, DVDAction)
66 }
67
68 /**
69 * Creates properties panel.
70 */
CreatePropPanel(wxSizer * sizer)71 void MenuPropDlg::CreatePropPanel(wxSizer* sizer) {
72 bool loop = m_vob->GetPause() == 0 && m_pgc->GetPostCommands() == wxT("jump cell 1;");
73 CreateVobGroup(sizer, loop);
74 CreateButtonsGroup(sizer);
75 CreateMenuGroup(sizer, loop);
76 }
77
CreateAspectCtrls(wxSizer * sizer,wxSVG_PRESERVEASPECTRATIO align,wxSVG_MEETORSLICE meetOrSlice)78 void MenuPropDlg::CreateAspectCtrls(wxSizer* sizer, wxSVG_PRESERVEASPECTRATIO align,
79 wxSVG_MEETORSLICE meetOrSlice) {
80 bool keepAspectRatio = align > wxSVG_PRESERVEASPECTRATIO_NONE;
81 BeginCheckGroup(sizer, _("Keep Aspect Ratio"), keepAspectRatio);
82 sizer->AddSpacer(4);
83 wxArrayString alignXStrings;
84 alignXStrings.Add(_("X Min"));
85 alignXStrings.Add(_("X Mid"));
86 alignXStrings.Add(_("X Max"));
87 int alignX = keepAspectRatio ? (align - wxSVG_PRESERVEASPECTRATIO_XMINYMIN) % 3 : 1;
88 sizer->Add(AddChoiceProp(alignXStrings[alignX], alignXStrings));
89 wxArrayString alignYStrings;
90 alignYStrings.Add(_("Y Min"));
91 alignYStrings.Add(_("Y Mid"));
92 alignYStrings.Add(_("Y Max"));
93 int alignY = keepAspectRatio ? (align - wxSVG_PRESERVEASPECTRATIO_XMINYMIN) / 3 : 1;
94 sizer->Add(AddChoiceProp(alignYStrings[alignY], alignYStrings), 0, wxLEFT, 4);
95 wxArrayString meetStrings;
96 meetStrings.Add(_("Meet"));
97 meetStrings.Add(_("Slice"));
98 int meet = meetOrSlice == wxSVG_MEETORSLICE_SLICE ? 1 : 0;
99 sizer->Add(AddChoiceProp(meetStrings[meet], meetStrings), 0, wxLEFT, 4);
100 sizer->AddStretchSpacer(1);
101 EndGroup();
102 }
103
CreateVobGroup(wxSizer * sizer,bool loop)104 void MenuPropDlg::CreateVobGroup(wxSizer* sizer, bool loop) {
105 wxSizer* grpSizer = BeginGroup(sizer, _("Video object"));
106 wxFlexGridSizer* grid = new wxFlexGridSizer(2, 4, 6);
107 grid->AddGrowableCol(1);
108
109 // format
110 AddText(grid, _("Format:"));
111 wxSizer* formatSizer = new wxBoxSizer(wxHORIZONTAL);
112 wxArrayString formats = DVD::GetVideoFormatLabels(false, false, true, s_config.GetAllowHdMenues() && m_dvd->IsHD());
113 int vf = m_menu->GetVideoFormat();
114 if (s_config.GetAllowHdMenues() && m_dvd->IsHD()) {
115 vf = vf >= vfPAL_HALF_HD ? vf - vfPAL_HALF_HD : (vf >= vfPAL && vf < vfPAL_HALF_HD ? vf + 4 : 0);
116 } else {
117 vf = vf >= vfPAL && vf < vfPAL_HALF_HD ? vf - 2 : 0;
118 }
119 formatSizer->Add(AddChoiceProp(formats[vf], formats), 0, wxEXPAND);
120 formatSizer->AddSpacer(4);
121 formats = DVD::GetAspectRatioLabels();
122 int ar = m_menu->GetAspectRatio() >= 1 ? m_menu->GetAspectRatio() - 1 : 0;
123 formatSizer->Add(AddChoiceProp(formats[ar], formats, ASPECT_CHOICE_ID), 0, wxEXPAND);
124 m_aspect = (wxChoice*) GetLastControl();
125 formatSizer->AddSpacer(4);
126 wxArrayString wsFormats = m_video->GetWidescreenStrings(_("auto"));
127 formatSizer->Add(AddChoiceProp(wsFormats[m_video->GetWidescreen()], wsFormats), 0, wxEXPAND);
128 m_wsFormat = (wxChoice*) GetLastControl();
129 formatSizer->AddStretchSpacer(1);
130 grid->Add(formatSizer, 0, wxEXPAND);
131 wxCommandEvent evt;
132 OnChangeAspect(evt);
133
134 // Background
135 wxString video = wxThumbnails::GetVideoExtWildcard();
136 wxString imageExt = wxImage::GetImageExtWildcard();
137 AddFileProp(grid, _("Background:"), m_menu->GetBackground(), wxFD_OPEN, wxT("..."),
138 _("Image and Video Files") + wxString::Format(wxT("|%s%s|"), video.c_str(), imageExt.AfterLast(wxT('|')).c_str())
139 + _("Video Files") + wxString::Format(wxT(" (%s)|%s|"), video.c_str(), video.c_str())
140 + _("Image Files ") + imageExt
141 + wxT("|") + wxString(_("All Files")) + wxT(" (*.*)|*.*"));
142 // Keep aspect ratio
143 grid->AddSpacer(8);
144 wxSizer* cbSizer = new wxBoxSizer(wxHORIZONTAL);
145 CreateAspectCtrls(cbSizer, m_menu->GetBackgroundAlign(), m_menu->GetBackgroundMeetOrSlice());
146 grid->Add(cbSizer, 0, wxEXPAND|wxALL, 4);
147 // Colour
148 AddColourProp(grid, wxT(" "), m_menu->GetBackgroundColour());
149
150 // audio file
151 wxString audioFile = m_vob->GetAudioFilenames().size() ? m_vob->GetAudioFilenames()[0] : wxT("");
152 wxString audio = wxThumbnails::GetAudioExtWildcard();
153 AddFileProp(grid, _("Audio:"), audioFile, wxFD_OPEN, wxT("..."),
154 _("Audio Files") + wxString::Format(wxT(" (%s)|%s|"), audio.c_str(), audio.c_str())
155 + _("All Files") + wxString(wxT(" (*.*)|*.*")), AUDIO_CTRL_ID);
156 m_audioCtrlIdx = GetLastControlIndex();
157 // audio format
158 grid->AddSpacer(8);
159 Stream* stream = audioFile.length() > 0 ? m_vob->GetStreams()[m_vob->GetStreams().size() - 1] : NULL;
160 int af = stream != NULL ? stream->GetAudioFormat() - 1 : afCOPY - 1;
161 formats = DVD::GetAudioFormatLabels(true);
162 wxSizer* audioFormatSizer = AddChoiceProp(grid, wxT(""), formats[af], formats, 0, false);
163 m_audioFormat = (wxChoice*) GetLastControl();
164 m_audioFormat->Enable(audioFile.length() > 0);
165 wxArrayString labels = DVD::GetAudioLanguageCodes();
166 if (m_langCodes->GetCount() < 1)
167 m_langCodes->Add(s_config.GetDefAudioLanguage());
168 audioFormatSizer->AddSpacer(4);
169 AddChoiceProp(audioFormatSizer, wxT(""), (*m_langCodes)[0], labels, 0, false);
170 // pause and loop
171 wxSizer* pSizer = AddSpinProp(grid, _("Pause:"), m_vob->GetPause(), -1, 254, 100, _("sec"),false);
172 m_pauseCtrl = (wxSpinCtrl*) GetLastControl();
173 m_pauseCtrl->Enable(!loop);
174 pSizer->AddSpacer(8);
175 AddCheckProp(pSizer, _("Loop"), loop, false, LOOP_CB_ID);
176
177 grpSizer->Add(grid, 0, wxEXPAND|wxALL, 4);
178 sizer->AddSpacer(6);
179 }
180
CreateButtonsGroup(wxSizer * sizer)181 void MenuPropDlg::CreateButtonsGroup(wxSizer* sizer) {
182 wxSizer* grpSizer = BeginGroup(sizer, _("Buttons"));
183 wxFlexGridSizer* grid = new wxFlexGridSizer(2, 4, 6);
184 grid->AddGrowableCol(1);
185 // Start/End
186 wxSizer* timeSizer = AddTextProp(grid, _("Subpicture start/end:"), m_menu->GetStartTime(), false, 100, false);
187 m_subStartCtrlIdx = GetLastControlIndex();
188 AddTextProp(timeSizer, wxT(" - "), m_menu->GetEndTime(), false, 100);
189 grpSizer->Add(grid, 0, wxEXPAND|wxALL, 4);
190 // Remember last selected button
191 wxSizer* cbSizer = new wxBoxSizer(wxHORIZONTAL);
192 BeginCheckGroup(cbSizer, _("Remember last selected button"), m_menu->GetRememberLastButton());
193 cbSizer->AddSpacer(4);
194 wxArrayString registers;
195 registers.Add(_("Auto"));
196 for (int i=0; i<13; i++)
197 registers.Add(wxString::Format(wxT("g%d"), i));
198 cbSizer->Add(AddChoiceProp(registers[m_menu->GetRememberLastButtonRegister() + 1], registers));
199 cbSizer->AddStretchSpacer(1);
200 grpSizer->Add(cbSizer, 0, wxEXPAND|wxALL, 4);
201 sizer->AddSpacer(6);
202 EndGroup();
203 }
204
CreateMenuGroup(wxSizer * sizer,bool loop)205 void MenuPropDlg::CreateMenuGroup(wxSizer* sizer, bool loop) {
206 wxSizer* grpSizer = BeginGroup(sizer, _("Menu"));
207 wxFlexGridSizer* grid = new wxFlexGridSizer(2, 4, 6);
208 grid->AddGrowableCol(1);
209
210 const StringSet& entries = m_pgc->GetEntries();
211 AddText(grid, _("Entry"), m_tsi >= 0 ? wxALIGN_TOP : wxALIGN_CENTER_VERTICAL);
212 if (m_tsi >= 0) {
213 wxFlexGridSizer* entryGrid = new wxFlexGridSizer(3, 4, 16);
214 AddCheckProp(entryGrid, _("Root"), entries.find(wxT("root")) != entries.end());
215 AddCheckProp(entryGrid, _("Subtitle"), entries.find(wxT("subtitle")) != entries.end());
216 AddCheckProp(entryGrid, _("Chapter"), entries.find(wxT("ptt")) != entries.end());
217 AddCheckProp(entryGrid, _("Audio"), entries.find(wxT("audio")) != entries.end());
218 AddCheckProp(entryGrid, _("Angle"), entries.find(wxT("angle")) != entries.end());
219 grid->Add(entryGrid);
220 } else
221 AddCheckProp(grid, _("Title"), entries.find(wxT("title")) != entries.end());
222
223 // Pre and post commans
224 wxArrayString commands = GetCommandList();
225 AddComboProp(grid, _("Pre commands:"), m_pgc->GetPreCommands(), commands);
226 m_preCommandsCtrlIdx = GetLastControlIndex();
227 AddComboProp(grid, _("Post commands:"), m_pgc->GetPostCommands(), commands);
228 m_postCommandsCtrl = (wxComboBox*) GetLastControl();
229 m_postCommandsCtrl->Enable(!loop);
230
231 grpSizer->Add(grid, 0, wxEXPAND|wxALL, 4);
232 }
233
234 /**
235 * Creates panel with buttons
236 */
CreateButtonPane(wxSizer * sizer,bool resetButton,bool dontShowCheckbox)237 void MenuPropDlg::CreateButtonPane(wxSizer* sizer, bool resetButton, bool dontShowCheckbox) {
238 wxStdDialogButtonSizer* buttonPane = new wxStdDialogButtonSizer();
239
240 // cells & actions buttons
241 buttonPane->Add(new wxButton(this, CELLS_BT_ID, _("Cells...")));
242 buttonPane->Add(new wxButton(this, ACTIONS_BT_ID, _("Actions...")));
243 buttonPane->Add(10, 10, 1, wxEXPAND);
244
245 // ok & cancel buttons
246 buttonPane->AddButton(new wxButton(this, wxID_OK, wxEmptyString));
247 buttonPane->AddButton(new wxButton(this, wxID_CANCEL, wxEmptyString));
248
249 buttonPane->Realize();
250 buttonPane->GetAffirmativeButton()->SetDefault();
251 sizer->Add(buttonPane, 0, wxEXPAND|wxLEFT|wxRIGHT|wxBOTTOM, 10);
252 }
253
GetCommandList()254 wxArrayString MenuPropDlg::GetCommandList() {
255 wxArrayString commands;
256 #ifdef __WXMAC__
257 commands.Add(wxT(""));
258 #endif
259 commands.Add(wxT("jump cell 1;"));
260 for (int pgci=0; pgci<(int)m_dvd->GetVmgm().Count(); pgci++)
261 commands.Add(wxString::Format(_T("jump vmgm menu %d;"),pgci+1));
262 for (int tsi=0; tsi<(int)m_dvd->GetTitlesets().Count(); tsi++) {
263 Titleset* ts = m_dvd->GetTitlesets()[tsi];
264 for (int pgci=0; pgci<(int)ts->GetMenus().Count(); pgci++)
265 commands.Add(wxString::Format(_T("jump menu %d;"),pgci+1));
266 for (int pgci=0; pgci<(int)ts->GetTitles().Count(); pgci++)
267 commands.Add(wxString::Format(_T("jump title %d;"),pgci+1));
268 }
269 return commands;
270 }
271
SetValues()272 bool MenuPropDlg::SetValues() {
273 // validate sub end
274 if (GetString(m_subStartCtrlIdx).size() > 0 && GetString(m_subStartCtrlIdx+1).size() > 0
275 && String2Time(GetString(m_subStartCtrlIdx)) >= String2Time(GetString(m_subStartCtrlIdx + 1))) {
276 wxLogError(_("Subpicture end must be greater than start or empty"));
277 return false;
278 }
279 // validate audio file
280 wxString audioFile = GetString(m_audioCtrlIdx);
281 if (audioFile.length() > 0) {
282 if (!wxFile::Exists(audioFile)) {
283 wxLogError(_("File %s doesn't exist."), audioFile.c_str());
284 return false;
285 }
286 wxFfmpegMediaDecoder ffmpeg;
287 if (!ffmpeg.Load(audioFile))
288 return false;
289 if (ffmpeg.GetStreamCount() == 0 || ffmpeg.GetStreamType(0) != stAUDIO) {
290 wxLogError(_("File %s isn't audio file."), audioFile.c_str());
291 return false;
292 }
293 }
294
295 // validate commands
296 wxString preCommands = GetString(m_preCommandsCtrlIdx);
297 wxString postCommands = GetString(m_preCommandsCtrlIdx + 1);
298 DVDAction action;
299 action.SetCustom(preCommands);
300 if (preCommands.length() && !action.IsValid(m_dvd, m_tsi, m_pgci, true, wxT(""), true, false)) {
301 return false;
302 }
303 action.SetCustom(postCommands);
304 if (postCommands.length() && !action.IsValid(m_dvd, m_tsi, m_pgci, true, wxT(""), true, false)) {
305 return false;
306 }
307
308 if (postCommands.length() && GetInt(m_audioCtrlIdx + 3) == -1) {
309 wxLogError(_("Post commands will not be executed if pause is set to -1"));
310 return false;
311 }
312
313 int n = 0;
314
315 // set video format
316 int vf = GetInt(n++);
317 if (s_config.GetAllowHdMenues() && m_dvd->IsHD()) {
318 vf = vf <= 5 ? vf + vfPAL_HALF_HD : vf - 4;
319 } else {
320 vf += 2;
321 }
322 VideoFormat videoFormat = (VideoFormat) vf;
323 if (videoFormat != m_menu->GetVideoFormat()) {
324 m_dvd->GetPgcArray(m_tsi, true).SetVideoFormat(videoFormat);
325 }
326 // set aspect ratio
327 AspectRatio aspectRatio = (AspectRatio) (GetInt(n++) + 1);
328 if (aspectRatio != m_menu->GetAspectRatio()) {
329 m_dvd->GetPgcArray(m_tsi, true).SetAspectRatio(aspectRatio);
330 }
331 // set WS format
332 m_video->SetWidescreen((WidescreenType) GetInt(n++));
333
334 m_menu->SetBackground(GetString(n++));
335 if (m_menu->GetBackground().length()) {
336 if (GetBool(n++)) {
337 int alignX = GetInt(n++);
338 int alignY = GetInt(n++);
339 m_menu->SetBackgroundAlign((wxSVG_PRESERVEASPECTRATIO) (wxSVG_PRESERVEASPECTRATIO_XMINYMIN + alignY * 3 + alignX));
340 int meet = GetInt(n++);
341 m_menu->SetBackgroundMeetOrSlice(meet == 0 ? wxSVG_MEETORSLICE_MEET : wxSVG_MEETORSLICE_SLICE);
342 } else {
343 n += 3;
344 m_menu->SetBackgroundAlign(wxSVG_PRESERVEASPECTRATIO_NONE);
345 }
346 } else
347 n += 4;
348 m_menu->SetBackgroundColour(GetColour(n++));
349
350 // VOB properties
351 audioFile = GetString(n++).Strip(wxString::both);
352 while (m_vob->GetAudioFilenames().GetCount() > 0)
353 m_vob->RemoveAudioFile(0);
354 if (audioFile.length() > 0) {
355 m_vob->AddAudioFile(audioFile);
356 if (m_vob->GetStreams().size() > 0) {
357 Stream* stream = m_vob->GetStreams()[m_vob->GetStreams().size() - 1];
358 if (stream->GetType() == stAUDIO)
359 stream->SetAudioFormat((AudioFormat) (GetInt(n) + 1));
360 }
361 }
362 n++;
363 m_langCodes->RemoveAt(0);
364 m_langCodes->Insert(GetString(n++), 0);
365 m_vob->GetCells().swap(m_cells);
366 m_menu->GetActions().swap(m_actions);
367 m_vob->SetPause(GetInt(n++));
368 n++; // loop
369
370 // subpictures/buttons
371 m_menu->SetStartTime(GetString(n++));
372 m_menu->SetEndTime(GetString(n++));
373 m_menu->SetRememberLastButton(GetBool(n++));
374 m_menu->SetRememberLastButtonRegister(m_menu->GetRememberLastButton() ? GetInt(n) - 1 : -1);
375 n++; // Last button register
376
377 // set entries
378 StringSet& entries = m_pgc->GetEntries();
379 entries.clear();
380 if (m_tsi >= 0) {
381 if (GetBool(n++))
382 entries.insert(wxT("root"));
383 if (GetBool(n++))
384 entries.insert(wxT("subtitle"));
385 if (GetBool(n++))
386 entries.insert(wxT("ptt"));
387 if (GetBool(n++))
388 entries.insert(wxT("audio"));
389 if (GetBool(n++))
390 entries.insert(wxT("angle"));
391 } else if (GetBool(n++))
392 entries.insert(wxT("title"));
393 // remove same entries from other menus in the same titleset
394 PgcArray& pgcs = m_dvd->GetPgcArray(m_tsi, true);
395 for (int pgci = 0; pgci<(int)pgcs.size(); pgci++) {
396 if (pgci != m_pgci) {
397 pgcs[pgci]->RemoveEntries(entries);
398 }
399 }
400
401 m_pgc->SetPreCommands(GetString(n++));
402 m_pgc->SetPostCommands(GetString(n++));
403 // fix coordinates of buttons if they are out of range
404 m_menu->FixButtonCoordinates();
405 return true;
406 }
407
OnChangeAspect(wxCommandEvent & event)408 void MenuPropDlg::OnChangeAspect(wxCommandEvent& event) {
409 AspectRatio aspect = (AspectRatio) (m_aspect->GetSelection() + 1);
410 m_wsFormat->Enable(aspect == ar16_9);
411 }
412
OnChangeAudio(wxCommandEvent & event)413 void MenuPropDlg::OnChangeAudio(wxCommandEvent& event) {
414 if (!m_audioFormat)
415 return;
416 wxString audioFile = event.GetString();
417 m_audioFormat->Enable(audioFile.length() > 0);
418 // set audio format
419 wxFfmpegMediaDecoder ffmpeg;
420 if (wxFile::Exists(audioFile) && ffmpeg.Load(audioFile) && ffmpeg.GetStreamCount() > 0
421 && ffmpeg.GetStreamType(0) == stAUDIO) {
422 AudioFormat af = afCOPY;
423 wxString codecName = ffmpeg.GetCodecName(0);
424 int sampleRate = ffmpeg.GetSampleRate(0);
425 if (codecName != wxT("mp2") && codecName != wxT("ac3") && codecName != wxT("liba52"))
426 af = m_dvd->GetAudioFormat();
427 else if (sampleRate != 48000)
428 af = codecName == wxT("mp2") ? afMP2 : afAC3;
429 m_audioFormat->SetSelection(af - 1);
430 }
431 }
432
OnLoopCheck(wxCommandEvent & event)433 void MenuPropDlg::OnLoopCheck(wxCommandEvent& event) {
434 m_pauseCtrl->SetValue(event.IsChecked() ? 0 : -1);
435 m_pauseCtrl->Enable(!event.IsChecked());
436 m_postCommandsCtrl->SetValue(event.IsChecked() ? wxT("jump cell 1;"): wxT(""));
437 m_postCommandsCtrl->Enable(!event.IsChecked());
438 }
439
OnCellsBt(wxCommandEvent & event)440 void MenuPropDlg::OnCellsBt(wxCommandEvent& event) {
441 MenuCellsDlg dlg(this, m_dvd, m_tsi, m_pgci, m_cells);
442 if (dlg.ShowModal() == wxID_OK)
443 m_cells.swap(dlg.GetCells());
444 }
445
OnActionsBt(wxCommandEvent & event)446 void MenuPropDlg::OnActionsBt(wxCommandEvent& event) {
447 MenuActionsDlg dlg(this, m_dvd, m_tsi, m_pgci, m_actions);
448 if (dlg.ShowModal() == wxID_OK)
449 m_actions.swap(dlg.GetActions());
450 }
451