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
24 #include "bcsignals.h"
26 #include "condition.h"
28 #include "edlsession.h"
29 #include "gwindowgui.h"
32 #include "localsession.h"
34 #include "mainsession.h"
36 #include "mwindowgui.h"
39 #include "trackcanvas.h"
46 GWindowGUI::GWindowGUI(MWindow *mwindow, int w, int h)
47 : BC_Window(_(PROGRAM_NAME ": Overlays"),
48 mwindow->session->gwindow_x, mwindow->session->gwindow_y,
51 this->mwindow = mwindow;
56 GWindowGUI::~GWindowGUI()
60 const char *GWindowGUI::non_auto_text[NON_AUTOMATION_TOTAL] =
65 N_("Plugin Keyframes"),
69 const char *GWindowGUI::auto_text[AUTOMATION_TOTAL] =
85 int GWindowGUI::auto_colors[AUTOMATION_TOTAL] =
101 void GWindowGUI::load_defaults()
103 BC_Hash *defaults = mwindow->defaults;
104 auto_colors[AUTOMATION_MUTE] = defaults->get("AUTO_COLOR_MUTE", auto_colors[AUTOMATION_MUTE]);
105 auto_colors[AUTOMATION_CAMERA_X] = defaults->get("AUTO_COLOR_CAMERA_X", auto_colors[AUTOMATION_CAMERA_X]);
106 auto_colors[AUTOMATION_CAMERA_Y] = defaults->get("AUTO_COLOR_CAMERA_Y", auto_colors[AUTOMATION_CAMERA_Y]);
107 auto_colors[AUTOMATION_CAMERA_Z] = defaults->get("AUTO_COLOR_CAMERA_Z", auto_colors[AUTOMATION_CAMERA_Z]);
108 auto_colors[AUTOMATION_PROJECTOR_X] = defaults->get("AUTO_COLOR_PROJECTOR_X", auto_colors[AUTOMATION_PROJECTOR_X]);
109 auto_colors[AUTOMATION_PROJECTOR_Y] = defaults->get("AUTO_COLOR_PROJECTOR_Y", auto_colors[AUTOMATION_PROJECTOR_Y]);
110 auto_colors[AUTOMATION_PROJECTOR_Z] = defaults->get("AUTO_COLOR_PROJECTOR_Z", auto_colors[AUTOMATION_PROJECTOR_Z]);
111 auto_colors[AUTOMATION_FADE] = defaults->get("AUTO_COLOR_FADE", auto_colors[AUTOMATION_FADE]);
112 auto_colors[AUTOMATION_SPEED] = defaults->get("AUTO_COLOR_SPEED", auto_colors[AUTOMATION_SPEED]);
115 void GWindowGUI::save_defaults()
117 BC_Hash *defaults = mwindow->defaults;
118 defaults->update("AUTO_COLOR_MUTE", auto_colors[AUTOMATION_MUTE]);
119 defaults->update("AUTO_COLOR_CAMERA_X", auto_colors[AUTOMATION_CAMERA_X]);
120 defaults->update("AUTO_COLOR_CAMERA_Y", auto_colors[AUTOMATION_CAMERA_Y]);
121 defaults->update("AUTO_COLOR_CAMERA_Z", auto_colors[AUTOMATION_CAMERA_Z]);
122 defaults->update("AUTO_COLOR_PROJECTOR_X", auto_colors[AUTOMATION_PROJECTOR_X]);
123 defaults->update("AUTO_COLOR_PROJECTOR_Y", auto_colors[AUTOMATION_PROJECTOR_Y]);
124 defaults->update("AUTO_COLOR_PROJECTOR_Z", auto_colors[AUTOMATION_PROJECTOR_Z]);
125 defaults->update("AUTO_COLOR_FADE", auto_colors[AUTOMATION_FADE]);
126 defaults->update("AUTO_COLOR_SPEED", auto_colors[AUTOMATION_SPEED]);
129 static toggleinfo toggle_order[] =
131 {0, NON_AUTOMATION_ASSETS},
132 {0, NON_AUTOMATION_TITLES},
133 {0, NON_AUTOMATION_TRANSITIONS},
134 {0, NON_AUTOMATION_PLUGIN_AUTOS},
136 {1, AUTOMATION_FADE},
137 {1, AUTOMATION_MUTE},
138 {1, AUTOMATION_SPEED},
139 {1, AUTOMATION_MODE},
141 {1, AUTOMATION_MASK},
142 {-1, NON_AUTOMATION_HARD_EDGES},
144 {1, AUTOMATION_CAMERA_X},
145 {1, AUTOMATION_CAMERA_Y},
146 {1, AUTOMATION_CAMERA_Z},
147 {-1, NONAUTOTOGGLES_CAMERA_XYZ},
149 {1, AUTOMATION_PROJECTOR_X},
150 {1, AUTOMATION_PROJECTOR_Y},
151 {1, AUTOMATION_PROJECTOR_Z},
152 {-1, NONAUTOTOGGLES_PROJECTOR_XYZ},
155 const char *GWindowGUI::toggle_text(toggleinfo *tp)
157 if( tp->isauto > 0 ) return _(auto_text[tp->ref]);
158 if( !tp->isauto ) return _(non_auto_text[tp->ref]);
160 case NONAUTOTOGGLES_CAMERA_XYZ:
161 case NONAUTOTOGGLES_PROJECTOR_XYZ:
163 case NON_AUTOMATION_HARD_EDGES:
164 return _("Hard Edges");
169 void GWindowGUI::calculate_extents(BC_WindowBase *gui, int *w, int *h)
171 int temp1, temp2, temp3, temp4, temp5, temp6, temp7;
172 int current_w, current_h;
173 int ys5 = yS(5), ys10 = yS(10);
177 for( int i=0; i<(int)(sizeof(toggle_order)/sizeof(toggle_order[0])); ++i ) {
178 toggleinfo *tp = &toggle_order[i];
181 *h += get_resources()->bar_data->get_h() + ys5;
184 BC_Toggle::calculate_extents(gui,
185 BC_WindowBase::get_resources()->checkbox_images,
186 0, &temp1, ¤t_w, ¤t_h,
187 &temp2, &temp3, &temp4, &temp5, &temp6, &temp7,
188 toggle_text(tp), MEDIUMFONT);
189 current_w += current_h;
190 *w = MAX(current_w, *w);
191 *h += current_h + ys5;
198 GWindowColorButton::GWindowColorButton(GWindowToggle *auto_toggle,
199 int x, int y, int w, int color)
200 : ColorCircleButton(auto_toggle->caption, x, y, w, w, color, -1, 1)
202 this->auto_toggle = auto_toggle;
206 GWindowColorButton::~GWindowColorButton()
210 int GWindowColorButton::handle_new_color(int color, int alpha)
216 void GWindowColorButton::handle_done_event(int result)
218 ColorCircleButton::handle_done_event(result);
219 int ref = auto_toggle->info->ref;
220 GWindowGUI *gui = auto_toggle->gui;
221 gui->lock_window("GWindowColorThread::handle_done_event");
223 GWindowGUI::auto_colors[ref] = color;
224 auto_toggle->update_gui(color);
225 gui->save_defaults();
228 color = GWindowGUI::auto_colors[ref];
231 gui->unlock_window();
232 MWindowGUI *mwindow_gui = gui->mwindow->gui;
233 mwindow_gui->lock_window("GWindowColorUpdate::run");
234 mwindow_gui->draw_overlays(1);
235 mwindow_gui->unlock_window();
239 void GWindowGUI::create_objects()
242 int ys5 = yS(5), ys10 = yS(10);
243 int x = xs10, y = ys10;
244 lock_window("GWindowGUI::create_objects");
246 for( int i=0; i<(int)(sizeof(toggle_order)/sizeof(toggle_order[0])); ++i ) {
247 toggleinfo *tp = &toggle_order[i];
250 BC_Bar *bar = new BC_Bar(x,y,get_w()-x-xs10);
253 y += bar->get_h() + ys5;
256 const char *label = toggle_text(tp);
257 int color = tp->isauto > 0 ?
258 auto_colors[tp->ref] :
259 get_resources()->text_default ;
260 GWindowToggle *toggle = new GWindowToggle(this, x, y, label, color, tp);
261 add_tool(toggles[i] = toggle);
262 if( tp->isauto > 0 ) {
265 case AUTOMATION_MODE: vframe = mwindow->theme->modekeyframe_data; break;
266 case AUTOMATION_PAN: vframe = mwindow->theme->pankeyframe_data; break;
267 case AUTOMATION_MASK: vframe = mwindow->theme->maskkeyframe_data; break;
270 int wh = toggle->get_h() - yS(4);
271 GWindowColorButton *color_button =
272 new GWindowColorButton(toggle, get_w()-wh-ys10, y+yS(2), wh, color);
273 add_tool(color_button);
274 color_button->create_objects();
277 draw_vframe(vframe, get_w()-vframe->get_w()-xs10, y);
280 const char *accel = 0;
282 case NONAUTOTOGGLES_CAMERA_XYZ:
284 accel = _("Shift-F1");
286 case NONAUTOTOGGLES_PROJECTOR_XYZ:
287 projector_xyz = toggle;
288 accel = _("Shift-F2");
290 case NON_AUTOMATION_HARD_EDGES:
291 VFrame *vframe = mwindow->theme->hardedge_data;
292 draw_vframe(vframe, get_w()-vframe->get_w()-xs10, y);
297 int x1 = get_w() - BC_Title::calculate_w(this, accel) - xs10;
298 add_subwindow(new BC_Title(x1, y, accel));
301 y += toggles[i]->get_h() + ys5;
307 void GWindowGUI::update_mwindow(int toggles, int overlays)
310 mwindow->gui->lock_window("GWindowGUI::update_mwindow");
312 mwindow->gui->mainmenu->update_toggles(0);
314 mwindow->gui->draw_overlays(1);
315 mwindow->gui->unlock_window();
316 lock_window("GWindowGUI::update_mwindow");
319 void GWindowGUI::update_toggles(int use_lock)
322 lock_window("GWindowGUI::update_toggles");
326 for( int i=0; i<(int)(sizeof(toggle_order)/sizeof(toggle_order[0])); ++i ) {
327 if( toggles[i] ) toggles[i]->update();
330 camera_xyz->set_value(check_xyz(AUTOMATION_CAMERA_X) > 0 ? 1 : 0);
331 projector_xyz->set_value(check_xyz(AUTOMATION_PROJECTOR_X) > 0 ? 1 : 0);
333 if(use_lock) unlock_window();
336 void GWindowGUI::toggle_camera_xyz()
338 int v = camera_xyz->get_value() ? 0 : 1;
339 camera_xyz->set_value(v);
340 xyz_check(AUTOMATION_CAMERA_X, v);
342 update_mwindow(1, 1);
345 void GWindowGUI::toggle_projector_xyz()
347 int v = projector_xyz->get_value() ? 0 : 1;
348 projector_xyz->set_value(v);
349 xyz_check(AUTOMATION_PROJECTOR_X, v);
351 update_mwindow(1, 1);
354 int GWindowGUI::translation_event()
356 mwindow->session->gwindow_x = get_x();
357 mwindow->session->gwindow_y = get_y();
361 int GWindowGUI::close_event()
364 mwindow->session->show_gwindow = 0;
367 mwindow->gui->lock_window("GWindowGUI::close_event");
368 mwindow->gui->mainmenu->show_gwindow->set_checked(0);
369 mwindow->gui->unlock_window();
371 lock_window("GWindowGUI::close_event");
372 mwindow->save_defaults();
376 int GWindowGUI::keypress_event()
378 if( ctrl_down() && shift_down() ) {
379 switch(get_keypress()) {
384 if( ctrl_down() && shift_down() ) {
385 resend_event(mwindow->gui);
390 else if( !ctrl_down() && shift_down() ) {
391 switch(get_keypress()) {
396 toggle_projector_xyz();
400 switch(get_keypress()) {
413 int GWindowGUI::check_xyz(int group)
415 // returns 1=all set, -1=all clear, 0=mixed
416 int *autos = mwindow->edl->session->auto_conf->autos;
417 int v = autos[group], ret = v ? 1 : -1;
418 if( autos[group+1] != v || autos[group+2] != v ) ret = 0;
421 void GWindowGUI::xyz_check(int group, int v)
423 int *autos = mwindow->edl->session->auto_conf->autos;
429 int* GWindowGUI::get_main_value(toggleinfo *info)
431 if( info->isauto > 0 )
432 return &mwindow->edl->session->auto_conf->autos[info->ref];
433 switch( info->ref ) {
434 case NON_AUTOMATION_ASSETS: return &mwindow->edl->session->show_assets;
435 case NON_AUTOMATION_TITLES: return &mwindow->edl->session->show_titles;
436 case NON_AUTOMATION_TRANSITIONS: return &mwindow->edl->session->auto_conf->transitions;
437 case NON_AUTOMATION_PLUGIN_AUTOS: return &mwindow->edl->session->auto_conf->plugins;
438 case NON_AUTOMATION_HARD_EDGES: return &mwindow->edl->session->auto_conf->hard_edges;
444 GWindowToggle::GWindowToggle(GWindowGUI *gui, int x, int y,
445 const char *text, int color, toggleinfo *info)
446 : BC_CheckBox(x, y, 0, text, MEDIUMFONT, color)
451 this->color_button = 0;
455 GWindowToggle::~GWindowToggle()
460 int GWindowToggle::handle_event()
462 int value = get_value();
475 if( info->isauto >= 0 ) {
476 *gui->get_main_value(info) = value;
477 switch( info->ref ) {
478 case AUTOMATION_CAMERA_X:
479 case AUTOMATION_CAMERA_Y:
480 case AUTOMATION_CAMERA_Z: {
481 int v = gui->check_xyz(AUTOMATION_CAMERA_X);
482 gui->camera_xyz->set_value(v > 0 ? 1 : 0);
484 case AUTOMATION_PROJECTOR_X:
485 case AUTOMATION_PROJECTOR_Y:
486 case AUTOMATION_PROJECTOR_Z: {
487 int v = gui->check_xyz(AUTOMATION_PROJECTOR_X);
488 gui->projector_xyz->set_value(v > 0 ? 1 : 0);
494 switch( info->ref ) {
495 case NONAUTOTOGGLES_CAMERA_XYZ: group = AUTOMATION_CAMERA_X; break;
496 case NONAUTOTOGGLES_PROJECTOR_XYZ: group = AUTOMATION_PROJECTOR_X; break;
497 case NON_AUTOMATION_HARD_EDGES: *gui->get_main_value(info) = value; break;
500 gui->xyz_check(group, value);
501 gui->update_toggles(0);
504 gui->update_mwindow(1, 0);
506 // Update stuff in MWindow
508 MWindow *mwindow = gui->mwindow;
509 mwindow->gui->lock_window("GWindowToggle::handle_event");
511 mwindow->gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
512 mwindow->gui->draw_overlays(1);
514 if( value && info->isauto > 0 ) {
515 int autogroup_type = -1;
516 switch( info->ref ) {
517 case AUTOMATION_FADE:
518 autogroup_type = mwindow->edl->tracks->recordable_video_tracks() ?
519 AUTOGROUPTYPE_VIDEO_FADE : AUTOGROUPTYPE_AUDIO_FADE ;
521 case AUTOMATION_SPEED:
522 autogroup_type = AUTOGROUPTYPE_SPEED;
524 case AUTOMATION_CAMERA_X:
525 case AUTOMATION_PROJECTOR_X:
526 autogroup_type = AUTOGROUPTYPE_X;
528 case AUTOMATION_CAMERA_Y:
529 case AUTOMATION_PROJECTOR_Y:
530 autogroup_type = AUTOGROUPTYPE_Y;
532 case AUTOMATION_CAMERA_Z:
533 case AUTOMATION_PROJECTOR_Z:
534 autogroup_type = AUTOGROUPTYPE_ZOOM;
537 if( autogroup_type >= 0 ) {
538 mwindow->edl->local_session->zoombar_showautotype = autogroup_type;
539 mwindow->gui->zoombar->update_autozoom();
543 mwindow->gui->unlock_window();
544 lock_window("GWindowToggle::handle_event");
549 void GWindowToggle::update()
551 int *vp = gui->get_main_value(info);
552 if( vp ) set_value(*vp);
555 void GWindowToggle::update_gui(int color)
557 BC_Toggle::color = color;
561 int GWindowToggle::draw_face(int flash, int flush)
563 int ret = BC_Toggle::draw_face(flash, flush);
567 draw_rectangle(text_x-1, text_y-1, text_w+1, text_h+1);
568 if( flash ) this->flash(0);
569 if( flush ) this->flush();
574 void GWindowGUI::set_cool(int reset, int all)
576 for( int i=0; i<(int)(sizeof(toggles)/sizeof(toggles[0])); ++i ) {
577 GWindowToggle* toggle = toggles[i];
578 if( !toggle ) continue;
579 int *vp = get_main_value(toggle->info);
583 toggle->draw_face(1, 0);
586 *vp = toggle->hot_value;
588 toggle->hot_value = *vp;
590 if ( all || toggle->info->isauto > 0 )
599 void GWindowGUI::set_hot(GWindowToggle *toggle)
601 int *vp = get_main_value(toggle->info);
603 set_cool(-1, !toggle->info->isauto ? 1 : 0);
605 toggle->set_value(*vp = 1);