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;
54 // *** CONTEXT_HELP ***
55 context_help_set_keyword("Show Overlays");
58 GWindowGUI::~GWindowGUI()
62 const char *GWindowGUI::non_auto_text[NON_AUTOMATION_TOTAL] =
67 N_("Plugin Keyframes"),
71 const char *GWindowGUI::auto_text[AUTOMATION_TOTAL] =
87 const char *GWindowGUI::non_auto_help[NON_AUTOMATION_TOTAL] =
89 "Video and Audio Tracks and Navigation",
90 "Video and Audio Tracks and Navigation",
93 "Cut and Paste Editing"
96 const char *GWindowGUI::auto_help[AUTOMATION_TOTAL] =
99 "Camera and Projector",
100 "Camera and Projector",
101 "Camera and Projector",
102 "Camera and Projector",
103 "Camera and Projector",
104 "Camera and Projector",
109 "Fade Automation Usage and Auto Gang"
112 int GWindowGUI::auto_colors[AUTOMATION_TOTAL] =
128 void GWindowGUI::load_defaults()
130 BC_Hash *defaults = mwindow->defaults;
131 auto_colors[AUTOMATION_MUTE] = defaults->get("AUTO_COLOR_MUTE", auto_colors[AUTOMATION_MUTE]);
132 auto_colors[AUTOMATION_CAMERA_X] = defaults->get("AUTO_COLOR_CAMERA_X", auto_colors[AUTOMATION_CAMERA_X]);
133 auto_colors[AUTOMATION_CAMERA_Y] = defaults->get("AUTO_COLOR_CAMERA_Y", auto_colors[AUTOMATION_CAMERA_Y]);
134 auto_colors[AUTOMATION_CAMERA_Z] = defaults->get("AUTO_COLOR_CAMERA_Z", auto_colors[AUTOMATION_CAMERA_Z]);
135 auto_colors[AUTOMATION_PROJECTOR_X] = defaults->get("AUTO_COLOR_PROJECTOR_X", auto_colors[AUTOMATION_PROJECTOR_X]);
136 auto_colors[AUTOMATION_PROJECTOR_Y] = defaults->get("AUTO_COLOR_PROJECTOR_Y", auto_colors[AUTOMATION_PROJECTOR_Y]);
137 auto_colors[AUTOMATION_PROJECTOR_Z] = defaults->get("AUTO_COLOR_PROJECTOR_Z", auto_colors[AUTOMATION_PROJECTOR_Z]);
138 auto_colors[AUTOMATION_FADE] = defaults->get("AUTO_COLOR_FADE", auto_colors[AUTOMATION_FADE]);
139 auto_colors[AUTOMATION_SPEED] = defaults->get("AUTO_COLOR_SPEED", auto_colors[AUTOMATION_SPEED]);
142 void GWindowGUI::save_defaults()
144 BC_Hash *defaults = mwindow->defaults;
145 defaults->update("AUTO_COLOR_MUTE", auto_colors[AUTOMATION_MUTE]);
146 defaults->update("AUTO_COLOR_CAMERA_X", auto_colors[AUTOMATION_CAMERA_X]);
147 defaults->update("AUTO_COLOR_CAMERA_Y", auto_colors[AUTOMATION_CAMERA_Y]);
148 defaults->update("AUTO_COLOR_CAMERA_Z", auto_colors[AUTOMATION_CAMERA_Z]);
149 defaults->update("AUTO_COLOR_PROJECTOR_X", auto_colors[AUTOMATION_PROJECTOR_X]);
150 defaults->update("AUTO_COLOR_PROJECTOR_Y", auto_colors[AUTOMATION_PROJECTOR_Y]);
151 defaults->update("AUTO_COLOR_PROJECTOR_Z", auto_colors[AUTOMATION_PROJECTOR_Z]);
152 defaults->update("AUTO_COLOR_FADE", auto_colors[AUTOMATION_FADE]);
153 defaults->update("AUTO_COLOR_SPEED", auto_colors[AUTOMATION_SPEED]);
156 static toggleinfo toggle_order[] =
158 {0, NON_AUTOMATION_ASSETS},
159 {0, NON_AUTOMATION_TITLES},
160 {0, NON_AUTOMATION_TRANSITIONS},
161 {0, NON_AUTOMATION_PLUGIN_AUTOS},
163 {1, AUTOMATION_FADE},
164 {1, AUTOMATION_MUTE},
165 {1, AUTOMATION_SPEED},
166 {1, AUTOMATION_MODE},
168 {1, AUTOMATION_MASK},
169 {-1, NON_AUTOMATION_HARD_EDGES},
171 {1, AUTOMATION_CAMERA_X},
172 {1, AUTOMATION_CAMERA_Y},
173 {1, AUTOMATION_CAMERA_Z},
174 {-1, NONAUTOTOGGLES_CAMERA_XYZ},
176 {1, AUTOMATION_PROJECTOR_X},
177 {1, AUTOMATION_PROJECTOR_Y},
178 {1, AUTOMATION_PROJECTOR_Z},
179 {-1, NONAUTOTOGGLES_PROJECTOR_XYZ},
182 const char *GWindowGUI::toggle_text(toggleinfo *tp)
184 if( tp->isauto > 0 ) return _(auto_text[tp->ref]);
185 if( !tp->isauto ) return _(non_auto_text[tp->ref]);
187 case NONAUTOTOGGLES_CAMERA_XYZ:
188 case NONAUTOTOGGLES_PROJECTOR_XYZ:
190 case NON_AUTOMATION_HARD_EDGES:
191 return _("Hard Edges");
196 const char *GWindowGUI::toggle_help(toggleinfo *tp)
198 if( tp->isauto > 0 ) return auto_help[tp->ref];
199 if( !tp->isauto ) return non_auto_help[tp->ref];
201 case NONAUTOTOGGLES_CAMERA_XYZ:
202 case NONAUTOTOGGLES_PROJECTOR_XYZ:
203 return "Camera and Projector";
204 case NON_AUTOMATION_HARD_EDGES:
205 return "Cut and Paste Editing";
207 return "Show Overlays";
210 void GWindowGUI::calculate_extents(BC_WindowBase *gui, int *w, int *h)
212 int temp1, temp2, temp3, temp4, temp5, temp6, temp7;
213 int current_w, current_h;
214 int ys5 = yS(5), ys10 = yS(10);
218 for( int i=0; i<(int)(sizeof(toggle_order)/sizeof(toggle_order[0])); ++i ) {
219 toggleinfo *tp = &toggle_order[i];
222 *h += get_resources()->bar_data->get_h() + ys5;
225 BC_Toggle::calculate_extents(gui,
226 BC_WindowBase::get_resources()->checkbox_images,
227 0, &temp1, ¤t_w, ¤t_h,
228 &temp2, &temp3, &temp4, &temp5, &temp6, &temp7,
229 toggle_text(tp), MEDIUMFONT);
230 current_w += current_h;
231 *w = MAX(current_w, *w);
232 *h += current_h + ys5;
239 GWindowColorButton::GWindowColorButton(GWindowToggle *auto_toggle,
240 int x, int y, int w, int color)
241 : ColorCircleButton(auto_toggle->caption, x, y, w, w, color, -1, 1)
243 this->auto_toggle = auto_toggle;
247 GWindowColorButton::~GWindowColorButton()
251 int GWindowColorButton::handle_new_color(int color, int alpha)
257 void GWindowColorButton::handle_done_event(int result)
259 ColorCircleButton::handle_done_event(result);
260 int ref = auto_toggle->info->ref;
261 GWindowGUI *gui = auto_toggle->gui;
262 gui->lock_window("GWindowColorThread::handle_done_event");
264 GWindowGUI::auto_colors[ref] = color;
265 auto_toggle->update_gui(color);
266 gui->save_defaults();
269 color = GWindowGUI::auto_colors[ref];
272 gui->unlock_window();
273 MWindowGUI *mwindow_gui = gui->mwindow->gui;
274 mwindow_gui->lock_window("GWindowColorUpdate::run");
275 mwindow_gui->draw_overlays(1);
276 mwindow_gui->unlock_window();
280 void GWindowGUI::create_objects()
283 int ys5 = yS(5), ys10 = yS(10);
284 int x = xs10, y = ys10;
285 lock_window("GWindowGUI::create_objects");
287 for( int i=0; i<(int)(sizeof(toggle_order)/sizeof(toggle_order[0])); ++i ) {
288 toggleinfo *tp = &toggle_order[i];
291 BC_Bar *bar = new BC_Bar(x,y,get_w()-x-xs10);
294 y += bar->get_h() + ys5;
297 const char *label = toggle_text(tp);
298 int color = tp->isauto > 0 ?
299 auto_colors[tp->ref] :
300 get_resources()->text_default ;
301 GWindowToggle *toggle = new GWindowToggle(this, x, y, label, color, tp);
302 add_tool(toggles[i] = toggle);
303 if( tp->isauto > 0 ) {
306 case AUTOMATION_MODE: vframe = mwindow->theme->modekeyframe_data; break;
307 case AUTOMATION_PAN: vframe = mwindow->theme->pankeyframe_data; break;
308 case AUTOMATION_MASK: vframe = mwindow->theme->maskkeyframe_data; break;
311 int wh = toggle->get_h() - yS(4);
313 GWindowColorButton *color_button =
314 new GWindowColorButton(toggle, get_w()-wh-ys10, y+yS(2), wh, color);
315 add_tool(color_button);
316 color_button->create_objects();
317 color_button->context_help_set_keyword(toggle_help(tp));
320 draw_vframe(vframe, get_w()-vframe->get_w()-xs10, y);
323 const char *accel = 0;
325 case NONAUTOTOGGLES_CAMERA_XYZ:
327 accel = _("Shift-F1");
329 case NONAUTOTOGGLES_PROJECTOR_XYZ:
330 projector_xyz = toggle;
331 accel = _("Shift-F2");
333 case NON_AUTOMATION_HARD_EDGES:
334 VFrame *vframe = mwindow->theme->hardedge_data;
335 draw_vframe(vframe, get_w()-vframe->get_w()-xs10, y);
340 int x1 = get_w() - BC_Title::calculate_w(this, accel) - xs10;
341 add_subwindow(new BC_Title(x1, y, accel));
344 toggle->context_help_set_keyword(toggle_help(tp));
345 y += toggles[i]->get_h() + ys5;
351 void GWindowGUI::update_mwindow(int toggles, int overlays)
354 mwindow->gui->lock_window("GWindowGUI::update_mwindow");
356 mwindow->gui->mainmenu->update_toggles(0);
358 mwindow->gui->draw_overlays(1);
359 mwindow->gui->unlock_window();
360 lock_window("GWindowGUI::update_mwindow");
363 void GWindowGUI::update_toggles(int use_lock)
366 lock_window("GWindowGUI::update_toggles");
370 for( int i=0; i<(int)(sizeof(toggle_order)/sizeof(toggle_order[0])); ++i ) {
371 if( toggles[i] ) toggles[i]->update();
374 camera_xyz->set_value(check_xyz(AUTOMATION_CAMERA_X) > 0 ? 1 : 0);
375 projector_xyz->set_value(check_xyz(AUTOMATION_PROJECTOR_X) > 0 ? 1 : 0);
377 if(use_lock) unlock_window();
380 void GWindowGUI::toggle_camera_xyz()
382 int v = camera_xyz->get_value() ? 0 : 1;
383 camera_xyz->set_value(v);
384 xyz_check(AUTOMATION_CAMERA_X, v);
386 update_mwindow(1, 1);
389 void GWindowGUI::toggle_projector_xyz()
391 int v = projector_xyz->get_value() ? 0 : 1;
392 projector_xyz->set_value(v);
393 xyz_check(AUTOMATION_PROJECTOR_X, v);
395 update_mwindow(1, 1);
398 int GWindowGUI::translation_event()
400 mwindow->session->gwindow_x = get_x();
401 mwindow->session->gwindow_y = get_y();
405 int GWindowGUI::close_event()
408 mwindow->session->show_gwindow = 0;
411 mwindow->gui->lock_window("GWindowGUI::close_event");
412 mwindow->gui->mainmenu->show_gwindow->set_checked(0);
413 mwindow->gui->unlock_window();
415 lock_window("GWindowGUI::close_event");
416 mwindow->save_defaults();
420 int GWindowGUI::keypress_event()
422 if( ctrl_down() && shift_down() ) {
423 switch(get_keypress()) {
428 if( ctrl_down() && shift_down() ) {
429 resend_event(mwindow->gui);
434 else if( !ctrl_down() && shift_down() ) {
435 switch(get_keypress()) {
440 toggle_projector_xyz();
444 switch(get_keypress()) {
454 return context_help_check_and_show();
457 int GWindowGUI::check_xyz(int group)
459 // returns 1=all set, -1=all clear, 0=mixed
460 int *autos = mwindow->edl->session->auto_conf->autos;
461 int v = autos[group], ret = v ? 1 : -1;
462 if( autos[group+1] != v || autos[group+2] != v ) ret = 0;
465 void GWindowGUI::xyz_check(int group, int v)
467 int *autos = mwindow->edl->session->auto_conf->autos;
473 int* GWindowGUI::get_main_value(toggleinfo *info)
475 if( info->isauto > 0 )
476 return &mwindow->edl->session->auto_conf->autos[info->ref];
477 switch( info->ref ) {
478 case NON_AUTOMATION_ASSETS: return &mwindow->edl->session->show_assets;
479 case NON_AUTOMATION_TITLES: return &mwindow->edl->session->show_titles;
480 case NON_AUTOMATION_TRANSITIONS: return &mwindow->edl->session->auto_conf->transitions;
481 case NON_AUTOMATION_PLUGIN_AUTOS: return &mwindow->edl->session->auto_conf->plugins;
482 case NON_AUTOMATION_HARD_EDGES: return &mwindow->edl->session->auto_conf->hard_edges;
488 GWindowToggle::GWindowToggle(GWindowGUI *gui, int x, int y,
489 const char *text, int color, toggleinfo *info)
490 : BC_CheckBox(x, y, 0, text, MEDIUMFONT, color)
495 this->color_button = 0;
499 GWindowToggle::~GWindowToggle()
504 int GWindowToggle::handle_event()
506 int value = get_value();
519 if( info->isauto >= 0 ) {
520 *gui->get_main_value(info) = value;
521 switch( info->ref ) {
522 case AUTOMATION_CAMERA_X:
523 case AUTOMATION_CAMERA_Y:
524 case AUTOMATION_CAMERA_Z: {
525 int v = gui->check_xyz(AUTOMATION_CAMERA_X);
526 gui->camera_xyz->set_value(v > 0 ? 1 : 0);
528 case AUTOMATION_PROJECTOR_X:
529 case AUTOMATION_PROJECTOR_Y:
530 case AUTOMATION_PROJECTOR_Z: {
531 int v = gui->check_xyz(AUTOMATION_PROJECTOR_X);
532 gui->projector_xyz->set_value(v > 0 ? 1 : 0);
538 switch( info->ref ) {
539 case NONAUTOTOGGLES_CAMERA_XYZ: group = AUTOMATION_CAMERA_X; break;
540 case NONAUTOTOGGLES_PROJECTOR_XYZ: group = AUTOMATION_PROJECTOR_X; break;
541 case NON_AUTOMATION_HARD_EDGES: *gui->get_main_value(info) = value; break;
544 gui->xyz_check(group, value);
545 gui->update_toggles(0);
548 gui->update_mwindow(1, 0);
550 // Update stuff in MWindow
552 MWindow *mwindow = gui->mwindow;
553 mwindow->gui->lock_window("GWindowToggle::handle_event");
555 mwindow->gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
556 mwindow->gui->draw_overlays(1);
558 if( value && info->isauto > 0 ) {
559 int autogroup_type = -1;
560 switch( info->ref ) {
561 case AUTOMATION_FADE:
562 autogroup_type = mwindow->edl->tracks->recordable_video_tracks() ?
563 AUTOGROUPTYPE_VIDEO_FADE : AUTOGROUPTYPE_AUDIO_FADE ;
565 case AUTOMATION_SPEED:
566 autogroup_type = AUTOGROUPTYPE_SPEED;
568 case AUTOMATION_CAMERA_X:
569 case AUTOMATION_PROJECTOR_X:
570 autogroup_type = AUTOGROUPTYPE_X;
572 case AUTOMATION_CAMERA_Y:
573 case AUTOMATION_PROJECTOR_Y:
574 autogroup_type = AUTOGROUPTYPE_Y;
576 case AUTOMATION_CAMERA_Z:
577 case AUTOMATION_PROJECTOR_Z:
578 autogroup_type = AUTOGROUPTYPE_ZOOM;
581 if( autogroup_type >= 0 ) {
582 mwindow->edl->local_session->zoombar_showautotype = autogroup_type;
583 mwindow->gui->zoombar->update_autozoom();
587 mwindow->gui->unlock_window();
588 lock_window("GWindowToggle::handle_event");
593 void GWindowToggle::update()
595 int *vp = gui->get_main_value(info);
596 if( vp ) set_value(*vp);
599 void GWindowToggle::update_gui(int color)
601 BC_Toggle::color = color;
605 int GWindowToggle::draw_face(int flash, int flush)
607 int ret = BC_Toggle::draw_face(flash, flush);
611 draw_rectangle(text_x-1, text_y-1, text_w+1, text_h+1);
612 if( flash ) this->flash(0);
613 if( flush ) this->flush();
618 void GWindowGUI::set_cool(int reset, int all)
620 for( int i=0; i<(int)(sizeof(toggles)/sizeof(toggles[0])); ++i ) {
621 GWindowToggle* toggle = toggles[i];
622 if( !toggle ) continue;
623 int *vp = get_main_value(toggle->info);
627 toggle->draw_face(1, 0);
630 *vp = toggle->hot_value;
632 toggle->hot_value = *vp;
634 if ( all || toggle->info->isauto > 0 )
643 void GWindowGUI::set_hot(GWindowToggle *toggle)
645 int *vp = get_main_value(toggle->info);
647 set_cool(-1, !toggle->info->isauto ? 1 : 0);
649 toggle->set_value(*vp = 1);