4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "deleteallindexes.h"
24 #include "edlsession.h"
27 #include "preferences.h"
28 #include "preferencesthread.h"
29 #include "interfaceprefs.h"
30 #include "shbtnprefs.h"
34 N_("Drag all following edits")
35 N_("Drag only one edit")
36 N_("Drag source only")
40 #define MOVE_ALL_EDITS_TITLE "Drag all following edits"
41 #define MOVE_ONE_EDIT_TITLE "Drag only one edit"
42 #define MOVE_NO_EDITS_TITLE "Drag source only"
43 #define MOVE_EDITS_DISABLED_TITLE "No effect"
45 InterfacePrefs::InterfacePrefs(MWindow *mwindow, PreferencesWindow *pwindow)
46 : PreferencesDialog(mwindow, pwindow)
62 InterfacePrefs::~InterfacePrefs()
79 void InterfacePrefs::create_objects()
82 BC_Resources *resources = BC_WindowBase::get_resources();
83 int margin = mwindow->theme->widget_border;
84 char string[BCTEXTLEN];
85 x = mwindow->theme->preferencesoptions_x;
86 y = mwindow->theme->preferencesoptions_y;
88 add_subwindow(new BC_Title(x, y,
91 resources->text_default));
93 y += get_text_height(LARGEFONT) + 5;
96 add_subwindow(hms = new TimeFormatHMS(pwindow, this,
97 pwindow->thread->edl->session->time_format == TIME_HMS,
100 add_subwindow(hmsf = new TimeFormatHMSF(pwindow, this,
101 pwindow->thread->edl->session->time_format == TIME_HMSF,
104 add_subwindow(samples = new TimeFormatSamples(pwindow, this,
105 pwindow->thread->edl->session->time_format == TIME_SAMPLES,
108 add_subwindow(hex = new TimeFormatHex(pwindow, this,
109 pwindow->thread->edl->session->time_format == TIME_SAMPLES_HEX,
112 add_subwindow(frames = new TimeFormatFrames(pwindow, this,
113 pwindow->thread->edl->session->time_format == TIME_FRAMES,
117 add_subwindow(feet = new TimeFormatFeet(pwindow, this,
118 pwindow->thread->edl->session->time_format == TIME_FEET_FRAMES,
120 x1 += feet->get_w() + margin;
122 add_subwindow(title = new BC_Title(x1, y, _("Frames per foot:")));
123 x1 += title->get_w() + margin;
124 sprintf(string, "%0.2f", pwindow->thread->edl->session->frames_per_foot);
125 add_subwindow(new TimeFormatFeetSetting(pwindow,
128 add_subwindow(seconds = new TimeFormatSeconds(pwindow, this,
129 pwindow->thread->edl->session->time_format == TIME_SECONDS,
133 add_subwindow(new UseTipWindow(pwindow, x, y));
134 add_subwindow(new UseWarnIndecies(pwindow, x+200, y));
137 add_subwindow(new BC_Bar(5, y, get_w() - 10));
140 add_subwindow(new BC_Title(x, y, _("Index files"), LARGEFONT, resources->text_default));
144 add_subwindow(new BC_Title(x, y + 5,
145 _("Index files go here:"), MEDIUMFONT, resources->text_default));
146 add_subwindow(ipathtext = new IndexPathText(x + 230, y,
148 pwindow->thread->preferences->index_directory));
149 add_subwindow(ipath = new BrowseButton(mwindow, this,
151 x + 230 + ipathtext->get_w(), y,
152 pwindow->thread->preferences->index_directory,
154 _("Select the directory for index files"),
158 add_subwindow(new BC_Title(x, y + 5,
159 _("Size of index file:"),
161 resources->text_default));
162 sprintf(string, "%jd", pwindow->thread->preferences->index_size);
163 add_subwindow(isize = new IndexSize(x + 230, y, pwindow, string));
164 add_subwindow(new ScanCommercials(pwindow, 350,y));
166 add_subwindow(new BC_Title(x, y + 5, _("Number of index files to keep:"), MEDIUMFONT, resources->text_default));
167 sprintf(string, "%ld", (long)pwindow->thread->preferences->index_count);
168 add_subwindow(icount = new IndexCount(x + 230, y, pwindow, string));
169 add_subwindow(deleteall = new DeleteAllIndexes(mwindow, pwindow, 350, y));
176 add_subwindow(new BC_Bar(5, y, get_w() - 10));
179 add_subwindow(new BC_Title(x, y, _("Editing"), LARGEFONT, resources->text_default));
183 add_subwindow(title = new BC_Title(x, y, _("Keyframe reticle:")));
184 x1 = x + title->get_w() + 10;
185 keyframe_reticle = new KeyframeReticle(x1, y, &pwindow->thread->preferences->keyframe_reticle);
186 add_subwindow(keyframe_reticle);
187 keyframe_reticle->create_objects();
189 int x2 = x + 400, y2 = y;
190 add_subwindow(thumbnails = new ViewThumbnails(x2, y1, pwindow));
191 AndroidRemote *android_remote = new AndroidRemote(pwindow, x2, y2);
192 add_subwindow(android_remote);
193 y2 += android_remote->get_h() + 10;
194 add_subwindow(title = new BC_Title(x2, y2, _("Port:")));
195 int x3 = x2 + title->get_w() + margin;
196 AndroidPort *android_port = new AndroidPort(pwindow, x3, y2);
197 add_subwindow(android_port);
198 y2 += title->get_h() + 10;
199 add_subwindow(title = new BC_Title(x2, y2, _("PIN:")));
200 AndroidPIN *android_pin = new AndroidPIN(pwindow, x3, y2);
201 add_subwindow(android_pin);
203 y2 += title->get_h() + 30;
204 ShBtnPrefs *shbtn_prefs = new ShBtnPrefs(pwindow, this, x2, y2);
205 add_subwindow(shbtn_prefs);
207 y2 += shbtn_prefs->get_h() + 30;
208 StillImageUseDuration *use_stduration = new StillImageUseDuration(pwindow,
209 pwindow->thread->edl->session->si_useduration, x2, y2);
210 add_subwindow(use_stduration);
212 BC_CheckBox::calculate_extents(this, &tw, &th, 0, 0);
214 y2 += use_stduration->get_h() + 3;
215 StillImageDuration *stduration = new StillImageDuration(pwindow, x2, y2);
216 add_subwindow(stduration);
217 x2 += stduration->get_w() + 10;
219 add_subwindow(new BC_Title(x2, y2, _("Seconds")));
222 add_subwindow(new BC_Title(x, y, _("Clicking on edit boundaries does what:")));
224 add_subwindow(new BC_Title(x, y, _("Button 1:")));
226 ViewBehaviourText *text;
227 add_subwindow(text = new ViewBehaviourText(80, y - 5,
228 behavior_to_text(pwindow->thread->edl->session->edit_handle_mode[0]),
230 &(pwindow->thread->edl->session->edit_handle_mode[0])));
231 text->create_objects();
233 add_subwindow(new BC_Title(x, y, _("Button 2:")));
234 add_subwindow(text = new ViewBehaviourText(80,
236 behavior_to_text(pwindow->thread->edl->session->edit_handle_mode[1]),
238 &(pwindow->thread->edl->session->edit_handle_mode[1])));
239 text->create_objects();
241 add_subwindow(new BC_Title(x, y, _("Button 3:")));
242 add_subwindow(text = new ViewBehaviourText(80,
244 behavior_to_text(pwindow->thread->edl->session->edit_handle_mode[2]),
246 &(pwindow->thread->edl->session->edit_handle_mode[2])));
247 text->create_objects();
251 add_subwindow(title = new BC_Title(x, y + 5, _("Min DB for meter:")));
252 x += title->get_w() + 10;
253 sprintf(string, "%d", pwindow->thread->edl->session->min_meter_db);
254 add_subwindow(min_db = new MeterMinDB(pwindow, string, x, y));
256 x += min_db->get_w() + 10;
257 add_subwindow(title = new BC_Title(x, y + 5, _("Max DB:")));
258 x += title->get_w() + 10;
259 sprintf(string, "%d", pwindow->thread->edl->session->max_meter_db);
260 add_subwindow(max_db = new MeterMaxDB(pwindow, string, x, y));
265 add_subwindow(new BC_Title(x, y, _("Theme:")));
267 add_subwindow(theme = new ViewTheme(x, y, pwindow));
268 theme->create_objects();
272 const char* InterfacePrefs::behavior_to_text(int mode)
277 return _(MOVE_ALL_EDITS_TITLE);
280 return _(MOVE_ONE_EDIT_TITLE);
283 return _(MOVE_NO_EDITS_TITLE);
285 case MOVE_EDITS_DISABLED:
286 return _(MOVE_EDITS_DISABLED_TITLE);
294 int InterfacePrefs::update(int new_value)
296 pwindow->thread->redraw_times = 1;
297 pwindow->thread->edl->session->time_format = new_value;
298 hms->update(new_value == TIME_HMS);
299 hmsf->update(new_value == TIME_HMSF);
300 samples->update(new_value == TIME_SAMPLES);
301 hex->update(new_value == TIME_SAMPLES_HEX);
302 frames->update(new_value == TIME_FRAMES);
303 feet->update(new_value == TIME_FEET_FRAMES);
304 seconds->update(new_value == TIME_SECONDS);
322 IndexPathText::IndexPathText(int x,
324 PreferencesWindow *pwindow,
326 : BC_TextBox(x, y, 240, 1, text)
328 this->pwindow = pwindow;
331 IndexPathText::~IndexPathText() {}
333 int IndexPathText::handle_event()
335 strcpy(pwindow->thread->preferences->index_directory, get_text());
342 IndexSize::IndexSize(int x,
344 PreferencesWindow *pwindow,
346 : BC_TextBox(x, y, 100, 1, text)
348 this->pwindow = pwindow;
351 int IndexSize::handle_event()
355 result = atol(get_text());
356 if(result < 64000) result = 64000;
357 //if(result < 500000) result = 500000;
358 pwindow->thread->preferences->index_size = result;
364 IndexCount::IndexCount(int x,
366 PreferencesWindow *pwindow,
368 : BC_TextBox(x, y, 100, 1, text)
370 this->pwindow = pwindow;
373 int IndexCount::handle_event()
377 result = atol(get_text());
378 if(result < 1) result = 1;
379 pwindow->thread->preferences->index_count = result;
397 TimeFormatHMS::TimeFormatHMS(PreferencesWindow *pwindow, InterfacePrefs *tfwindow, int value, int x, int y)
398 : BC_Radial(x, y, value, TIME_HMS_TEXT)
399 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
401 int TimeFormatHMS::handle_event()
403 tfwindow->update(TIME_HMS);
407 TimeFormatHMSF::TimeFormatHMSF(PreferencesWindow *pwindow, InterfacePrefs *tfwindow, int value, int x, int y)
408 : BC_Radial(x, y, value, TIME_HMSF_TEXT)
409 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
411 int TimeFormatHMSF::handle_event()
413 tfwindow->update(TIME_HMSF);
417 TimeFormatSamples::TimeFormatSamples(PreferencesWindow *pwindow, InterfacePrefs *tfwindow, int value, int x, int y)
418 : BC_Radial(x, y, value, TIME_SAMPLES_TEXT)
419 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
421 int TimeFormatSamples::handle_event()
423 tfwindow->update(TIME_SAMPLES);
427 TimeFormatFrames::TimeFormatFrames(PreferencesWindow *pwindow, InterfacePrefs *tfwindow, int value, int x, int y)
428 : BC_Radial(x, y, value, TIME_FRAMES_TEXT)
429 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
431 int TimeFormatFrames::handle_event()
433 tfwindow->update(TIME_FRAMES);
437 TimeFormatHex::TimeFormatHex(PreferencesWindow *pwindow, InterfacePrefs *tfwindow, int value, int x, int y)
438 : BC_Radial(x, y, value, TIME_SAMPLES_HEX_TEXT)
439 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
441 int TimeFormatHex::handle_event()
443 tfwindow->update(TIME_SAMPLES_HEX);
447 TimeFormatSeconds::TimeFormatSeconds(PreferencesWindow *pwindow, InterfacePrefs *tfwindow, int value, int x, int y)
448 : BC_Radial(x, y, value, TIME_SECONDS_TEXT)
450 this->pwindow = pwindow;
451 this->tfwindow = tfwindow;
454 int TimeFormatSeconds::handle_event()
456 tfwindow->update(TIME_SECONDS);
460 TimeFormatFeet::TimeFormatFeet(PreferencesWindow *pwindow, InterfacePrefs *tfwindow, int value, int x, int y)
461 : BC_Radial(x, y, value, TIME_FEET_FRAMES_TEXT)
462 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
464 int TimeFormatFeet::handle_event()
466 tfwindow->update(TIME_FEET_FRAMES);
470 TimeFormatFeetSetting::TimeFormatFeetSetting(PreferencesWindow *pwindow, int x, int y, char *string)
471 : BC_TextBox(x, y, 90, 1, string)
472 { this->pwindow = pwindow; }
474 int TimeFormatFeetSetting::handle_event()
476 pwindow->thread->edl->session->frames_per_foot = atof(get_text());
477 if(pwindow->thread->edl->session->frames_per_foot < 1) pwindow->thread->edl->session->frames_per_foot = 1;
484 ViewBehaviourText::ViewBehaviourText(int x,
487 PreferencesWindow *pwindow,
489 : BC_PopupMenu(x, y, 200, text)
491 this->output = output;
494 ViewBehaviourText::~ViewBehaviourText()
498 int ViewBehaviourText::handle_event()
503 void ViewBehaviourText::create_objects()
505 // Video4linux versions are automatically detected
506 add_item(new ViewBehaviourItem(this, _(MOVE_ALL_EDITS_TITLE), MOVE_ALL_EDITS));
507 add_item(new ViewBehaviourItem(this, _(MOVE_ONE_EDIT_TITLE), MOVE_ONE_EDIT));
508 add_item(new ViewBehaviourItem(this, _(MOVE_NO_EDITS_TITLE), MOVE_NO_EDITS));
509 add_item(new ViewBehaviourItem(this, _(MOVE_EDITS_DISABLED_TITLE), MOVE_EDITS_DISABLED));
513 ViewBehaviourItem::ViewBehaviourItem(ViewBehaviourText *popup, char *text, int behaviour)
517 this->behaviour = behaviour;
520 ViewBehaviourItem::~ViewBehaviourItem()
524 int ViewBehaviourItem::handle_event()
526 popup->set_text(get_text());
527 *(popup->output) = behaviour;
534 MeterMinDB::MeterMinDB(PreferencesWindow *pwindow, char *text, int x, int y)
535 : BC_TextBox(x, y, 50, 1, text)
537 this->pwindow = pwindow;
540 int MeterMinDB::handle_event()
542 pwindow->thread->redraw_meters = 1;
543 pwindow->thread->edl->session->min_meter_db = atol(get_text());
550 MeterMaxDB::MeterMaxDB(PreferencesWindow *pwindow, char *text, int x, int y)
551 : BC_TextBox(x, y, 50, 1, text)
553 this->pwindow = pwindow;
556 int MeterMaxDB::handle_event()
558 pwindow->thread->redraw_meters = 1;
559 pwindow->thread->edl->session->max_meter_db = atol(get_text());
567 MeterVUDB::MeterVUDB(PreferencesWindow *pwindow, char *text, int y)
568 : BC_Radial(145, y, pwindow->thread->edl->session->meter_format == METER_DB, text)
570 this->pwindow = pwindow;
573 int MeterVUDB::handle_event()
575 pwindow->thread->redraw_meters = 1;
576 // vu_int->update(0);
577 pwindow->thread->edl->session->meter_format = METER_DB;
581 MeterVUInt::MeterVUInt(PreferencesWindow *pwindow, char *text, int y)
582 : BC_Radial(205, y, pwindow->thread->edl->session->meter_format == METER_INT, text)
584 this->pwindow = pwindow;
587 int MeterVUInt::handle_event()
589 pwindow->thread->redraw_meters = 1;
591 pwindow->thread->edl->session->meter_format = METER_INT;
598 ViewTheme::ViewTheme(int x, int y, PreferencesWindow *pwindow)
599 : BC_PopupMenu(x, y, 200, pwindow->thread->preferences->theme, 1)
601 this->pwindow = pwindow;
603 ViewTheme::~ViewTheme()
607 void ViewTheme::create_objects()
609 ArrayList<PluginServer*> themes;
610 MWindow::search_plugindb(0,
617 for(int i = 0; i < themes.total; i++)
619 add_item(new ViewThemeItem(this, themes.values[i]->title));
623 int ViewTheme::handle_event()
632 ViewThemeItem::ViewThemeItem(ViewTheme *popup, char *text)
638 int ViewThemeItem::handle_event()
640 popup->set_text(get_text());
641 strcpy(popup->pwindow->thread->preferences->theme, get_text());
642 popup->handle_event();
646 ViewThumbnails::ViewThumbnails(int x,
648 PreferencesWindow *pwindow)
651 pwindow->thread->preferences->use_thumbnails, _("Use thumbnails in resource window"))
653 this->pwindow = pwindow;
656 int ViewThumbnails::handle_event()
658 pwindow->thread->preferences->use_thumbnails = get_value();
664 UseTipWindow::UseTipWindow(PreferencesWindow *pwindow, int x, int y)
667 pwindow->thread->preferences->use_tipwindow,
668 _("Show tip of the day"))
670 this->pwindow = pwindow;
672 int UseTipWindow::handle_event()
674 pwindow->thread->preferences->use_tipwindow = get_value();
679 UseWarnIndecies::UseWarnIndecies(PreferencesWindow *pwindow, int x, int y)
682 pwindow->thread->preferences->warn_indexes,
683 _("ffmpeg probe warns rebuild indexes"))
685 this->pwindow = pwindow;
688 int UseWarnIndecies::handle_event()
690 pwindow->thread->preferences->warn_indexes = get_value();
697 ScanCommercials::ScanCommercials(PreferencesWindow *pwindow, int x, int y)
700 pwindow->thread->preferences->scan_commercials,
701 _("Scan for commercials during toc build"))
703 this->pwindow = pwindow;
705 int ScanCommercials::handle_event()
707 pwindow->thread->preferences->scan_commercials = get_value();
712 AndroidRemote::AndroidRemote(PreferencesWindow *pwindow, int x, int y)
714 pwindow->thread->preferences->android_remote,
715 _("Android Remote Control"))
717 this->pwindow = pwindow;
719 int AndroidRemote::handle_event()
721 pwindow->thread->preferences->android_remote = get_value();
725 AndroidPIN::AndroidPIN(PreferencesWindow *pwindow, int x, int y)
726 : BC_TextBox(x, y, 240, 1, pwindow->thread->preferences->android_pin)
728 this->pwindow = pwindow;
731 int AndroidPIN::handle_event()
733 char *txt = pwindow->thread->preferences->android_pin;
734 int len = sizeof(pwindow->thread->preferences->android_pin);
735 strncpy(txt, get_text(), len);
740 AndroidPort::AndroidPort(PreferencesWindow *pwindow, int x, int y)
741 : BC_TextBox(x, y, 72, 1, pwindow->thread->preferences->android_port)
743 this->pwindow = pwindow;
746 int AndroidPort::handle_event()
748 unsigned short port = atoi(get_text());
749 if( port < 1024 ) port = 1024;
750 pwindow->thread->preferences->android_port = port;
752 sprintf(str,"%u",port);
757 int InterfacePrefs::start_shbtn_dialog()
760 shbtn_dialog = new ShBtnEditDialog(pwindow);
761 shbtn_dialog->start();
765 ShBtnPrefs::ShBtnPrefs(PreferencesWindow *pwindow, InterfacePrefs *iface_prefs, int x, int y)
766 : BC_GenericButton(x, y, _("Shell Commands"))
768 this->pwindow = pwindow;
769 this->iface_prefs = iface_prefs;
770 set_tooltip(_("Main Menu Shell Commands"));
773 int ShBtnPrefs::handle_event()
775 return iface_prefs->start_shbtn_dialog();
779 StillImageUseDuration::StillImageUseDuration(PreferencesWindow *pwindow, int value, int x, int y)
780 : BC_CheckBox(x, y, value, _("Import images with a duration of"))
782 this->pwindow = pwindow;
785 int StillImageUseDuration::handle_event()
787 pwindow->thread->edl->session->si_useduration = get_value();
791 StillImageDuration::StillImageDuration(PreferencesWindow *pwindow, int x, int y)
792 : BC_TextBox(x, y, 70, 1, pwindow->thread->edl->session->si_duration)
794 this->pwindow = pwindow;
796 int StillImageDuration::handle_event()
798 pwindow->thread->edl->session->si_duration = atof(get_text());
803 HairlineItem::HairlineItem(KeyframeReticle *popup, int hairline)
804 : BC_MenuItem(popup->hairline_to_string(hairline))
807 this->hairline = hairline;
810 HairlineItem::~HairlineItem()
814 int HairlineItem::handle_event()
816 popup->set_text(get_text());
817 *(popup->output) = hairline;
822 KeyframeReticle::KeyframeReticle(int x, int y, int *output)
823 : BC_PopupMenu(x, y, 175, hairline_to_string(*output))
825 this->output = output;
828 KeyframeReticle::~KeyframeReticle()
832 const char *KeyframeReticle::hairline_to_string(int type)
835 case HAIRLINE_NEVER: return _("Never");
836 case HAIRLINE_DRAGGING: return _("Dragging");
837 case HAIRLINE_ALWAYS: return _("Always");
842 void KeyframeReticle::create_objects()
844 add_item(new HairlineItem(this, HAIRLINE_NEVER));
845 add_item(new HairlineItem(this, HAIRLINE_DRAGGING));
846 add_item(new HairlineItem(this, HAIRLINE_ALWAYS));