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 "appearanceprefs.h"
23 #include "deleteallindexes.h"
25 #include "edlsession.h"
27 #include "filesystem.h"
30 #include "preferences.h"
31 #include "preferencesthread.h"
32 #include "shbtnprefs.h"
36 AppearancePrefs::AppearancePrefs(MWindow *mwindow, PreferencesWindow *pwindow)
37 : PreferencesDialog(mwindow, pwindow)
48 AppearancePrefs::~AppearancePrefs()
60 void AppearancePrefs::create_objects()
62 BC_Resources *resources = BC_WindowBase::get_resources();
63 int margin = mwindow->theme->widget_border;
64 char string[BCTEXTLEN];
65 int x0 = mwindow->theme->preferencesoptions_x;
66 int y0 = mwindow->theme->preferencesoptions_y;
67 int x = x0, y = y0, x1 = x + 100;
69 add_subwindow(new BC_Title(x, y, _("Layout:"), LARGEFONT,
70 resources->text_default));
74 add_subwindow(new BC_Title(x, y, _("Theme:")));
75 add_subwindow(theme = new ViewTheme(x1, y, pwindow));
76 theme->create_objects();
77 y += theme->get_h() + 5;
80 ViewPluginIcons *plugin_icons;
81 add_subwindow(new BC_Title(x, y, _("Plugin Icons:")));
82 add_subwindow(plugin_icons = new ViewPluginIcons(x1, y, pwindow));
83 plugin_icons->create_objects();
84 y += plugin_icons->get_h() + 5;
87 add_subwindow(new BC_Bar(5, y, get_w() - 10));
90 add_subwindow(new BC_Title(x, y, _("Time Format:"), LARGEFONT,
91 resources->text_default));
94 add_subwindow(new BC_Title(x1, y, _("Flags:"), LARGEFONT,
95 resources->text_default));
97 y += get_text_height(LARGEFONT) + 5;
101 add_subwindow(hms = new TimeFormatHMS(pwindow, this,
102 pwindow->thread->edl->session->time_format == TIME_HMS,
105 add_subwindow(hmsf = new TimeFormatHMSF(pwindow, this,
106 pwindow->thread->edl->session->time_format == TIME_HMSF,
109 add_subwindow(samples = new TimeFormatSamples(pwindow, this,
110 pwindow->thread->edl->session->time_format == TIME_SAMPLES,
113 add_subwindow(hex = new TimeFormatHex(pwindow, this,
114 pwindow->thread->edl->session->time_format == TIME_SAMPLES_HEX,
117 add_subwindow(frames = new TimeFormatFrames(pwindow, this,
118 pwindow->thread->edl->session->time_format == TIME_FRAMES,
121 add_subwindow(feet = new TimeFormatFeet(pwindow, this,
122 pwindow->thread->edl->session->time_format == TIME_FEET_FRAMES,
124 x += feet->get_w() + 15;
126 add_subwindow(title = new BC_Title(x, y, _("Frames per foot:")));
127 x += title->get_w() + margin;
128 sprintf(string, "%0.2f", pwindow->thread->edl->session->frames_per_foot);
129 add_subwindow(new TimeFormatFeetSetting(pwindow,
133 add_subwindow(seconds = new TimeFormatSeconds(pwindow, this,
134 pwindow->thread->edl->session->time_format == TIME_SECONDS,
138 add_subwindow(new BC_Bar(5, y, get_w()/2 - 30));
141 add_subwindow(new BC_Title(x, y, _("Color:"), LARGEFONT,
142 resources->text_default));
144 add_subwindow(title = new BC_Title(x, y, _("Highlighting Inversion color:")));
145 x += title->get_w() + margin;
146 char hex_color[BCSTRLEN];
147 sprintf(hex_color, "%06x", preferences->highlight_inverse);
148 add_subwindow(new HighlightInverseColor(pwindow, x, y, hex_color));
152 add_subwindow(title = new BC_Title(x, y, _("YUV color space:")));
153 x += title->get_w() + margin;
154 add_subwindow(yuv_color_space = new YuvColorSpace(x, y, pwindow));
155 yuv_color_space->create_objects();
156 y += yuv_color_space->get_h() + 5;
159 add_subwindow(title = new BC_Title(x, y, _("YUV color range:")));
160 x += title->get_w() + margin;
161 add_subwindow(yuv_color_range = new YuvColorRange(x, y, pwindow));
162 yuv_color_range->create_objects();
163 y += yuv_color_range->get_h() + 5;
165 UseTipWindow *tip_win = new UseTipWindow(pwindow, x1, y1);
166 add_subwindow(tip_win);
167 y1 += tip_win->get_h() + 5;
168 UseWarnIndecies *idx_win = new UseWarnIndecies(pwindow, x1, y1);
169 add_subwindow(idx_win);
170 y1 += idx_win->get_h() + 5;
171 UseWarnVersion *ver_win = new UseWarnVersion(pwindow, x1, y1);
172 add_subwindow(ver_win);
173 y1 += ver_win->get_h() + 5;
174 BD_WarnRoot *bdwr_win = new BD_WarnRoot(pwindow, x1, y1);
175 add_subwindow(bdwr_win);
176 y1 += bdwr_win->get_h() + 5;
177 PopupMenuBtnup *pop_win = new PopupMenuBtnup(pwindow, x1, y1);
178 add_subwindow(pop_win);
179 y1 += pop_win->get_h() + 5;
180 GrabFocusPolicy *grab_input_focus = new GrabFocusPolicy(pwindow, x1, y1);
181 add_subwindow(grab_input_focus);
182 y1 += grab_input_focus->get_h() + 5;
183 ActivateFocusPolicy *focus_activate = new ActivateFocusPolicy(pwindow, x1, y1);
184 add_subwindow(focus_activate);
185 y1 += focus_activate->get_h() + 5;
186 DeactivateFocusPolicy *focus_deactivate = new DeactivateFocusPolicy(pwindow, x1, y1);
187 add_subwindow(focus_deactivate);
188 y1 += focus_deactivate->get_h() + 5;
189 ForwardRenderDisplacement *displacement = new ForwardRenderDisplacement(pwindow, x1, y1);
190 add_subwindow(displacement);
191 y1 += displacement->get_h() + 5;
192 add_subwindow(thumbnails = new ViewThumbnails(x1, y1, pwindow));
193 y1 += thumbnails->get_h() + 5;
194 PrefsAutostartLV2UI *autostart_lv2ui = new PrefsAutostartLV2UI(x1, y1,pwindow);
195 add_subwindow(autostart_lv2ui);
196 y1 += autostart_lv2ui->get_h() + 5;
197 PerpetualSession *perpetual = new PerpetualSession(x1, y1, pwindow);
198 add_subwindow(perpetual);
199 y1 += perpetual->get_h() + 5;
203 int AppearancePrefs::update(int new_value)
205 pwindow->thread->redraw_times = 1;
206 pwindow->thread->edl->session->time_format = new_value;
207 hms->update(new_value == TIME_HMS);
208 hmsf->update(new_value == TIME_HMSF);
209 samples->update(new_value == TIME_SAMPLES);
210 hex->update(new_value == TIME_SAMPLES_HEX);
211 frames->update(new_value == TIME_FRAMES);
212 feet->update(new_value == TIME_FEET_FRAMES);
213 seconds->update(new_value == TIME_SECONDS);
218 TimeFormatHMS::TimeFormatHMS(PreferencesWindow *pwindow, AppearancePrefs *tfwindow, int value, int x, int y)
219 : BC_Radial(x, y, value, TIME_HMS_TEXT)
220 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
222 int TimeFormatHMS::handle_event()
224 tfwindow->update(TIME_HMS);
228 TimeFormatHMSF::TimeFormatHMSF(PreferencesWindow *pwindow, AppearancePrefs *tfwindow, int value, int x, int y)
229 : BC_Radial(x, y, value, TIME_HMSF_TEXT)
230 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
232 int TimeFormatHMSF::handle_event()
234 tfwindow->update(TIME_HMSF);
238 TimeFormatSamples::TimeFormatSamples(PreferencesWindow *pwindow, AppearancePrefs *tfwindow, int value, int x, int y)
239 : BC_Radial(x, y, value, TIME_SAMPLES_TEXT)
240 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
242 int TimeFormatSamples::handle_event()
244 tfwindow->update(TIME_SAMPLES);
248 TimeFormatFrames::TimeFormatFrames(PreferencesWindow *pwindow, AppearancePrefs *tfwindow, int value, int x, int y)
249 : BC_Radial(x, y, value, TIME_FRAMES_TEXT)
250 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
252 int TimeFormatFrames::handle_event()
254 tfwindow->update(TIME_FRAMES);
258 TimeFormatHex::TimeFormatHex(PreferencesWindow *pwindow, AppearancePrefs *tfwindow, int value, int x, int y)
259 : BC_Radial(x, y, value, TIME_SAMPLES_HEX_TEXT)
260 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
262 int TimeFormatHex::handle_event()
264 tfwindow->update(TIME_SAMPLES_HEX);
268 TimeFormatSeconds::TimeFormatSeconds(PreferencesWindow *pwindow, AppearancePrefs *tfwindow, int value, int x, int y)
269 : BC_Radial(x, y, value, TIME_SECONDS_TEXT)
271 this->pwindow = pwindow;
272 this->tfwindow = tfwindow;
275 int TimeFormatSeconds::handle_event()
277 tfwindow->update(TIME_SECONDS);
281 TimeFormatFeet::TimeFormatFeet(PreferencesWindow *pwindow, AppearancePrefs *tfwindow, int value, int x, int y)
282 : BC_Radial(x, y, value, TIME_FEET_FRAMES_TEXT)
283 { this->pwindow = pwindow; this->tfwindow = tfwindow; }
285 int TimeFormatFeet::handle_event()
287 tfwindow->update(TIME_FEET_FRAMES);
291 TimeFormatFeetSetting::TimeFormatFeetSetting(PreferencesWindow *pwindow, int x, int y, char *string)
292 : BC_TextBox(x, y, 90, 1, string)
293 { this->pwindow = pwindow; }
295 int TimeFormatFeetSetting::handle_event()
297 pwindow->thread->edl->session->frames_per_foot = atof(get_text());
298 if(pwindow->thread->edl->session->frames_per_foot < 1) pwindow->thread->edl->session->frames_per_foot = 1;
303 ViewTheme::ViewTheme(int x, int y, PreferencesWindow *pwindow)
304 : BC_PopupMenu(x, y, 200, pwindow->thread->preferences->theme, 1)
306 this->pwindow = pwindow;
308 ViewTheme::~ViewTheme()
312 void ViewTheme::create_objects()
314 ArrayList<PluginServer*> themes;
315 MWindow::search_plugindb(0, 0, 0, 0, 1, themes);
317 for(int i = 0; i < themes.total; i++) {
318 add_item(new ViewThemeItem(this, themes.values[i]->title));
322 int ViewTheme::handle_event()
327 ViewThemeItem::ViewThemeItem(ViewTheme *popup, const char *text)
333 int ViewThemeItem::handle_event()
335 popup->set_text(get_text());
336 strcpy(popup->pwindow->thread->preferences->theme, get_text());
337 popup->handle_event();
342 ViewPluginIcons::ViewPluginIcons(int x, int y, PreferencesWindow *pwindow)
343 : BC_PopupMenu(x, y, 200, pwindow->thread->preferences->plugin_icons, 1)
345 this->pwindow = pwindow;
347 ViewPluginIcons::~ViewPluginIcons()
351 void ViewPluginIcons::create_objects()
353 add_item(new ViewPluginIconItem(this, DEFAULT_PICON));
355 const char *plugin_path = File::get_plugin_path();
356 char picon_path[BCTEXTLEN];
357 snprintf(picon_path,sizeof(picon_path)-1,"%s/picon", plugin_path);
358 if( fs.update(picon_path) ) return;
359 for( int i=0; i<fs.dir_list.total; ++i ) {
360 char *fs_path = fs.dir_list[i]->path;
361 if( !fs.is_dir(fs_path) ) continue;
362 char *cp = strrchr(fs_path,'/');
363 cp = !cp ? fs_path : cp+1;
364 if( !strcmp(cp,DEFAULT_PICON) ) continue;
365 add_item(new ViewPluginIconItem(this, cp));
369 int ViewPluginIcons::handle_event()
374 ViewPluginIconItem::ViewPluginIconItem(ViewPluginIcons *popup, const char *text)
380 int ViewPluginIconItem::handle_event()
382 popup->set_text(get_text());
383 strcpy(popup->pwindow->thread->preferences->plugin_icons, get_text());
384 popup->handle_event();
389 ViewThumbnails::ViewThumbnails(int x,
391 PreferencesWindow *pwindow)
394 pwindow->thread->preferences->use_thumbnails, _("Use thumbnails in resource window"))
396 this->pwindow = pwindow;
399 int ViewThumbnails::handle_event()
401 pwindow->thread->preferences->use_thumbnails = get_value();
407 UseTipWindow::UseTipWindow(PreferencesWindow *pwindow, int x, int y)
410 pwindow->thread->preferences->use_tipwindow,
411 _("Show tip of the day"))
413 this->pwindow = pwindow;
415 int UseTipWindow::handle_event()
417 pwindow->thread->preferences->use_tipwindow = get_value();
422 UseWarnIndecies::UseWarnIndecies(PreferencesWindow *pwindow, int x, int y)
423 : BC_CheckBox(x, y, pwindow->thread->preferences->warn_indexes,
424 _("ffmpeg probe warns rebuild indexes"))
426 this->pwindow = pwindow;
429 int UseWarnIndecies::handle_event()
431 pwindow->thread->preferences->warn_indexes = get_value();
435 UseWarnVersion::UseWarnVersion(PreferencesWindow *pwindow, int x, int y)
436 : BC_CheckBox(x, y, pwindow->thread->preferences->warn_version,
437 _("EDL version warns if mismatched"))
439 this->pwindow = pwindow;
442 int UseWarnVersion::handle_event()
444 pwindow->thread->preferences->warn_version = get_value();
448 BD_WarnRoot::BD_WarnRoot(PreferencesWindow *pwindow, int x, int y)
449 : BC_CheckBox(x, y, pwindow->thread->preferences->bd_warn_root,
450 _("Create Bluray warns if not root"))
452 this->pwindow = pwindow;
455 int BD_WarnRoot::handle_event()
457 pwindow->thread->preferences->bd_warn_root = get_value();
461 PopupMenuBtnup::PopupMenuBtnup(PreferencesWindow *pwindow, int x, int y)
462 : BC_CheckBox(x, y, pwindow->thread->preferences->popupmenu_btnup,
463 _("Popups activate on button up"))
465 this->pwindow = pwindow;
468 int PopupMenuBtnup::handle_event()
470 pwindow->thread->preferences->popupmenu_btnup = get_value();
474 GrabFocusPolicy::GrabFocusPolicy(PreferencesWindow *pwindow, int x, int y)
475 : BC_CheckBox(x, y, (pwindow->thread->preferences->grab_input_focus) != 0,
476 _("Set Input Focus when window entered"))
478 this->pwindow = pwindow;
481 int GrabFocusPolicy::handle_event()
483 pwindow->thread->preferences->grab_input_focus = get_value();
487 ActivateFocusPolicy::ActivateFocusPolicy(PreferencesWindow *pwindow, int x, int y)
488 : BC_CheckBox(x, y, (pwindow->thread->preferences->textbox_focus_policy & CLICK_ACTIVATE) != 0,
489 _("Click to activate text focus"))
491 this->pwindow = pwindow;
494 int ActivateFocusPolicy::handle_event()
497 pwindow->thread->preferences->textbox_focus_policy |= CLICK_ACTIVATE;
499 pwindow->thread->preferences->textbox_focus_policy &= ~CLICK_ACTIVATE;
503 DeactivateFocusPolicy::DeactivateFocusPolicy(PreferencesWindow *pwindow, int x, int y)
504 : BC_CheckBox(x, y, (pwindow->thread->preferences->textbox_focus_policy & CLICK_DEACTIVATE) != 0,
505 _("Click to deactivate text focus"))
507 this->pwindow = pwindow;
510 int DeactivateFocusPolicy::handle_event()
513 pwindow->thread->preferences->textbox_focus_policy |= CLICK_DEACTIVATE;
515 pwindow->thread->preferences->textbox_focus_policy &= ~CLICK_DEACTIVATE;
519 ForwardRenderDisplacement::ForwardRenderDisplacement(PreferencesWindow *pwindow, int x, int y)
520 : BC_CheckBox(x, y, pwindow->thread->preferences->forward_render_displacement,
521 _("Always show next frame"))
523 this->pwindow = pwindow;
526 int ForwardRenderDisplacement::handle_event()
528 pwindow->thread->preferences->forward_render_displacement = get_value();
532 HighlightInverseColor::HighlightInverseColor(PreferencesWindow *pwindow, int x, int y, const char *hex)
533 : BC_TextBox(x, y, 80, 1, hex)
535 this->pwindow = pwindow;
538 int HighlightInverseColor::handle_event()
540 int inverse_color = strtoul(get_text(),0,16);
541 if( (inverse_color &= 0xffffff) == 0 ) {
542 inverse_color = 0xffffff;
543 char string[BCSTRLEN];
544 sprintf(string,"%06x", inverse_color);
547 pwindow->thread->preferences->highlight_inverse = inverse_color;
552 const char *YuvColorSpace::color_space[] = {
558 YuvColorSpace::YuvColorSpace(int x, int y, PreferencesWindow *pwindow)
559 : BC_PopupMenu(x, y, 100,
560 _(color_space[pwindow->thread->preferences->yuv_color_space]), 1)
562 this->pwindow = pwindow;
564 YuvColorSpace::~YuvColorSpace()
568 void YuvColorSpace::create_objects()
570 for( int id=0,nid=sizeof(color_space)/sizeof(color_space[0]); id<nid; ++id )
571 add_item(new YuvColorSpaceItem(this, _(color_space[id]), id));
575 int YuvColorSpace::handle_event()
577 set_text(color_space[pwindow->thread->preferences->yuv_color_space]);
581 YuvColorSpaceItem::YuvColorSpaceItem(YuvColorSpace *popup, const char *text, int id)
588 int YuvColorSpaceItem::handle_event()
590 popup->set_text(get_text());
591 popup->pwindow->thread->preferences->yuv_color_space = id;
592 return popup->handle_event();
596 const char *YuvColorRange::color_range[] = {
601 YuvColorRange::YuvColorRange(int x, int y, PreferencesWindow *pwindow)
602 : BC_PopupMenu(x, y, 100,
603 _(color_range[pwindow->thread->preferences->yuv_color_range]), 1)
605 this->pwindow = pwindow;
607 YuvColorRange::~YuvColorRange()
611 void YuvColorRange::create_objects()
613 for( int id=0,nid=sizeof(color_range)/sizeof(color_range[0]); id<nid; ++id )
614 add_item(new YuvColorRangeItem(this, _(color_range[id]), id));
618 int YuvColorRange::handle_event()
620 set_text(color_range[pwindow->thread->preferences->yuv_color_range]);
624 YuvColorRangeItem::YuvColorRangeItem(YuvColorRange *popup, const char *text, int id)
631 int YuvColorRangeItem::handle_event()
633 popup->set_text(get_text());
634 popup->pwindow->thread->preferences->yuv_color_range = id;
635 return popup->handle_event();
639 PrefsAutostartLV2UI::PrefsAutostartLV2UI(int x, int y, PreferencesWindow *pwindow)
641 pwindow->thread->preferences->autostart_lv2ui, _("Auto start lv2 gui"))
643 this->pwindow = pwindow;
645 int PrefsAutostartLV2UI::handle_event()
647 pwindow->thread->preferences->autostart_lv2ui = get_value();
651 PerpetualSession::PerpetualSession(int x, int y, PreferencesWindow *pwindow)
653 pwindow->thread->preferences->perpetual_session, _("Perpetual session"))
655 this->pwindow = pwindow;
658 int PerpetualSession::handle_event()
660 pwindow->thread->preferences->perpetual_session = get_value();