/*
* CINELERRA
* Copyright (C) 2008-2017 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 2003-2016 Cinelerra CV contributors
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "filexml.h"
#include "floatauto.h"
#include "floatautos.h"
+#include "gwindowgui.h"
#include "keys.h"
#include "language.h"
#include "localsession.h"
#include "tracks.h"
#include "trackcanvas.h"
#include "transportque.h"
+#include "zoombar.h"
CWindowTool::CWindowTool(MWindow *mwindow, CWindowGUI *gui)
this->mwindow = mwindow;
this->thread = thread;
current_operation = 0;
+ span = 1; edge = 0;
}
CWindowToolGUI::~CWindowToolGUI()
result = 1;
}
- return result;
+ if( result ) return result;
+ return context_help_check_and_show();
}
int CWindowToolGUI::translation_event()
return 0;
}
+void CWindowToolGUI::update_auto(Track *track, int idx, CWindowCoord *vp)
+{
+ FloatAuto *float_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
+ track->automation->autos[idx], 1);
+ if( !float_auto ) return;
+ float v = float_auto->get_value(edge);
+ float t = atof(vp->get_text());
+ if( v == t ) return;
+ float_auto->bump_value(t, edge, span);
+ if( idx == AUTOMATION_PROJECTOR_Z || idx == AUTOMATION_CAMERA_Z ) {
+ mwindow->gui->lock_window("CWindowToolGUI::update_auto");
+ mwindow->gui->draw_overlays(1);
+ mwindow->gui->unlock_window();
+ }
+ update();
+ update_preview();
+}
void CWindowToolGUI::update_preview(int changed_edl)
{
}
-CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int log_increment = 0)
+CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int type)
: BC_TumbleTextBox(gui, (float)value, (float)-65536, (float)65536, x, y, xS(70), 3)
{
this->gui = gui;
- set_log_floatincrement(log_increment);
+ this->type = type;
+ slider = 0;
+ range = 0;
}
-CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value)
+CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value, int type)
: BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, xS(70))
{
this->gui = gui;
+ this->type = type;
+ slider = 0;
+ range = 0;
+}
+
+void CWindowCoord::create_objects()
+{
+ BC_TumbleTextBox::create_objects();
+ if( type >= 0 ) {
+ float v = atof(get_text());
+ int xs10 = xS(10);
+ int x1 = get_x() + BC_TumbleTextBox::get_w() + xs10, y1 = get_y();
+ gui->add_subwindow(min_tumbler = new CWindowToolAutoRangeTumbler(this, x1, y1,
+ 0, _("Range min")));
+ x1 += min_tumbler->get_w() + xs10;
+ int group = Automation::autogrouptype(type, 0);
+ float min = gui->mwindow->edl->local_session->automation_mins[group];
+ float max = gui->mwindow->edl->local_session->automation_maxs[group];
+ gui->add_subwindow(slider = new CWindowCoordSlider(this,
+ x1, y1, xS(150), min, max, v));
+ x1 += slider->get_w() + xS(10);
+ gui->add_subwindow(max_tumbler = new CWindowToolAutoRangeTumbler(this, x1, y1,
+ 1, _("Range max")));
+ x1 += max_tumbler->get_w() + xS(10);
+ gui->add_subwindow(range_reset = new CWindowToolAutoRangeReset(this, x1, y1));
+ x1 += range_reset->get_w() + xS(10);
+ gui->add_subwindow(range_text = new CWindowToolAutoRangeTextBox(this, x1, y1));
+ range_text->update_range();
+ x1 += range_text->get_w() + xS(10);
+ gui->add_subwindow(range = new CWindowCoordRangeTumbler(this, x1, y1));
+ }
}
+
+void CWindowCoord::update_gui(float value)
+{
+ BC_TumbleTextBox::update(value);
+ if( slider ) {
+ int group = Automation::autogrouptype(type, 0);
+ LocalSession *local_session = gui->mwindow->edl->local_session;
+ slider->update(slider->get_pointer_motion_range(), value,
+ local_session->automation_mins[group],
+ local_session->automation_maxs[group]);
+ int x1 = range->get_x() + range->get_w() + xS(5);
+ int y1 = range->get_y() + yS(5), d = xS(16);
+ gui->set_color(GWindowGUI::auto_colors[type]);
+ gui->draw_disc(x1, y1, d, d);
+ }
+}
+
int CWindowCoord::handle_event()
{
+ if( slider )
+ slider->update(atof(get_text()));
gui->event_caller = this;
gui->handle_event();
return 1;
}
+CWindowCoordSlider::CWindowCoordSlider(CWindowCoord *coord,
+ int x, int y, int w, float mn, float mx, float value)
+ : BC_FSlider(x, y, 0, w, w, mn, mx, value)
+{
+ this->coord = coord;
+ set_precision(0.01);
+}
+
+CWindowCoordSlider::~CWindowCoordSlider()
+{
+}
+
+int CWindowCoordSlider::handle_event()
+{
+ float value = get_value();
+ coord->update(value);
+ coord->gui->event_caller = coord;
+ coord->gui->handle_event();
+ return 1;
+}
+
+CWindowCoordRangeTumbler::CWindowCoordRangeTumbler(CWindowCoord *coord, int x, int y)
+ : BC_Tumbler(x, y)
+{
+ this->coord = coord;
+}
+CWindowCoordRangeTumbler::~CWindowCoordRangeTumbler()
+{
+}
+
+int CWindowCoordRangeTumbler::update(float scale)
+{
+ CWindowCoordSlider *slider = coord->slider;
+ MWindow *mwindow = coord->gui->mwindow;
+ LocalSession *local_session = mwindow->edl->local_session;
+ int group = Automation::autogrouptype(coord->type, 0);
+ float min = local_session->automation_mins[group];
+ float max = local_session->automation_maxs[group];
+ if( min >= max ) {
+ switch( group ) {
+ case AUTOGROUPTYPE_ZOOM: min = 0.005; max = 5.0; break;
+ case AUTOGROUPTYPE_X: min = -1000; max = 1000; break;
+ case AUTOGROUPTYPE_Y: min = -1000; max = 1000; break;
+ }
+ }
+ switch( group ) {
+ case AUTOGROUPTYPE_ZOOM: { // exp
+ float lmin = log(min), lmax = log(max);
+ float lr = (lmax - lmin) * scale;
+ if( (min = exp(lmin - lr)) < ZOOM_MIN ) min = ZOOM_MIN;
+ if( (max = exp(lmax + lr)) > ZOOM_MAX ) max = ZOOM_MAX;
+ break; }
+ case AUTOGROUPTYPE_X:
+ case AUTOGROUPTYPE_Y: { // linear
+ float dr = (max - min) * scale;
+ if( (min -= dr) < XY_MIN ) min = XY_MIN;
+ if( (max += dr) > XY_MAX ) max = XY_MAX;
+ break; }
+ }
+ slider->update(slider->get_pointer_motion_range(),
+ slider->get_value(), min, max);
+ unlock_window();
+ MWindowGUI *mgui = mwindow->gui;
+ mgui->lock_window("CWindowCoordRangeTumbler::update");
+ local_session->zoombar_showautotype = group;
+ local_session->automation_mins[group] = min;
+ local_session->automation_maxs[group] = max;
+ mgui->zoombar->update_autozoom();
+ mgui->draw_overlays(0);
+ mgui->update_patchbay();
+ mgui->flash_canvas(1);
+ mgui->unlock_window();
+ lock_window("CWindowCoordRangeTumbler::update");
+ return coord->range_text->update_range();
+}
+
+int CWindowCoordRangeTumbler::handle_up_event()
+{
+ return update(0.125);
+}
+int CWindowCoordRangeTumbler::handle_down_event()
+{
+ return update(-0.1);
+}
CWindowCropApply::CWindowCropApply(MWindow *mwindow, CWindowCropGUI *crop_gui, int x, int y)
: BC_GenericButton(x, y, _("Apply"))
handle_event();
return 1;
}
- return 0;
+ return context_help_check_and_show();
}
const char *CWindowCropOpMode::crop_ops[] = {
CWindowCropGUI::CWindowCropGUI(MWindow *mwindow, CWindowTool *thread)
: CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Crop"), xS(330), yS(100))
{
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Cropping");
}
CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
: CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Color"), xS(220), yS(290))
{
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Compositor Toolbar");
}
CWindowEyedropGUI::~CWindowEyedropGUI()
const char* tooltip;
};
-const _CVD Camera_Crv_Smooth =
- { FloatAuto::SMOOTH,
- true,
- "tan_smooth",
- N_("\"smooth\" Curve on current Camera Keyframes")
- };
-const _CVD Camera_Crv_Linear =
- { FloatAuto::LINEAR,
- true,
- "tan_linear",
- N_("\"linear\" Curve on current Camera Keyframes")
- };
-const _CVD Projector_Crv_Smooth =
- { FloatAuto::SMOOTH,
- false,
- "tan_smooth",
- N_("\"smooth\" Curve on current Projector Keyframes")
- };
-const _CVD Projector_Crv_Linear =
- { FloatAuto::LINEAR,
- false,
- "tan_linear",
- N_("\"linear\" Curve on current Projector Keyframes")
- };
+const _CVD Camera_Crv_Smooth = { FloatAuto::SMOOTH, true, "tan_smooth",
+ N_("\"smooth\" Curve on current Camera Keyframes") };
+const _CVD Camera_Crv_Linear = { FloatAuto::LINEAR, true, "tan_linear",
+ N_("\"linear\" Curve on current Camera Keyframes") };
+const _CVD Camera_Crv_Tangent = { FloatAuto::TFREE, true, "tan_tangent",
+ N_("\"tangent\" Curve on current Camera Keyframes") };
+const _CVD Camera_Crv_Free = { FloatAuto::FREE, true, "tan_free",
+ N_("\"free\" Curve on current Camera Keyframes") };
+const _CVD Camera_Crv_Bump = { FloatAuto::BUMP, true, "tan_bump",
+ N_("\"bump\" Curve on current Camera Keyframes") };
+
+const _CVD Projector_Crv_Smooth = { FloatAuto::SMOOTH, false, "tan_smooth",
+ N_("\"smooth\" Curve on current Projector Keyframes") };
+const _CVD Projector_Crv_Linear = { FloatAuto::LINEAR, false, "tan_linear",
+ N_("\"linear\" Curve on current Projector Keyframes") };
+const _CVD Projector_Crv_Tangent = { FloatAuto::TFREE, false, "tan_tangent",
+ N_("\"tangent\" Curve on current Projector Keyframes") };
+const _CVD Projector_Crv_Free = { FloatAuto::FREE, false, "tan_free",
+ N_("\"free\" Curve on current Projector Keyframes") };
+const _CVD Projector_Crv_Bump = { FloatAuto::BUMP, false, "tan_bump",
+ N_("\"bump\" Curve on current Projector Keyframes") };
// Implementation Class für Keyframe Curve Mode buttons
//
class CWindowCurveToggle : public BC_Toggle
{
public:
- CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolGUI *gui, int x, int y);
+ CWindowCurveToggle(const _CVD &mode,
+ MWindow *mwindow, CWindowToolGUI *gui, int x, int y);
void check_toggle_state(FloatAuto *x, FloatAuto *y, FloatAuto *z);
int handle_event();
private:
- _CVD cfg;
+ const _CVD &cfg;
MWindow *mwindow;
CWindowToolGUI *gui;
};
-CWindowCurveToggle::CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
+CWindowCurveToggle::CWindowCurveToggle(const _CVD &mode,
+ MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
: BC_Toggle(x, y, mwindow->theme->get_image_set(mode.icon_id), false),
cfg(mode)
{
CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Camera"), xS(170), yS(170))
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Camera"), xS(580), yS(200))
{
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Camera and Projector");
}
CWindowCameraGUI::~CWindowCameraGUI()
{
void CWindowCameraGUI::create_objects()
{
- int xs10 = xS(10), xs15 = xS(15);
+ int xs5 = xS(5), xs10 = xS(10), xs15 = xS(15), xs25 = xS(25);
int ys10 = yS(10), ys30 = yS(30);
- int x = xs10, y = ys10, x1;
+ int x = xs10, y = ys10;
Track *track = mwindow->cwindow->calculate_affected_track();
FloatAuto *x_auto = 0, *y_auto = 0, *z_auto = 0;
BC_Title *title;
BC_Button *button;
+ span = 1; edge = 0;
lock_window("CWindowCameraGUI::create_objects");
if( track ) {
mwindow->cwindow->calculate_affected_autos(track,
&x_auto, &y_auto, &z_auto, 1, 0, 0, 0);
}
+ int x1 = x;
+ add_subwindow(bar1 = new BC_TitleBar(x1, y, xS(340), xs10, xs10, _("Position")));
+ x1 += bar1->get_w() + xS(35);
+ add_subwindow(bar2 = new BC_TitleBar(x1, y, get_w()-x1-xs10, xs10, xs10, _("Range")));
+ y += bar1->get_h() + ys10;
add_subwindow(title = new BC_Title(x, y, "X:"));
- x += title->get_w();
- this->x = new CWindowCoord(this, x, y,
- x_auto ? x_auto->get_value() : (float)0);
+ x1 = x + title->get_w() + xS(3);
+ float xvalue = x_auto ? x_auto->get_value() : 0;
+ this->x = new CWindowCoord(this, x1, y, xvalue, AUTOMATION_CAMERA_X);
this->x->create_objects();
-
-
+ this->x->range->set_tooltip(_("expand X range"));
y += ys30;
- x = xs10;
- add_subwindow(title = new BC_Title(x, y, "Y:"));
- x += title->get_w();
- this->y = new CWindowCoord(this, x, y,
- y_auto ? y_auto->get_value() : (float)0);
+ add_subwindow(title = new BC_Title(x = xs10, y, "Y:"));
+ float yvalue = y_auto ? y_auto->get_value() : 0;
+ this->y = new CWindowCoord(this, x1, y, yvalue, AUTOMATION_CAMERA_Y);
this->y->create_objects();
+ this->y->range->set_tooltip(_("expand Y range"));
y += ys30;
- x = xs10;
- add_subwindow(title = new BC_Title(x, y, "Z:"));
- x += title->get_w();
- this->z = new CWindowCoord(this, x, y,
- z_auto ? z_auto->get_value() : (float)1);
+ add_subwindow(title = new BC_Title(x = xs10, y, "Z:"));
+ float zvalue = z_auto ? z_auto->get_value() : 1;
+ this->z = new CWindowCoord(this, x1, y, zvalue, AUTOMATION_CAMERA_Z);
this->z->create_objects();
this->z->set_increment(0.01);
-
- y += ys30;
- x1 = xs10;
+ this->z->range->set_tooltip(_("expand Zoom range"));
+ y += ys30 + ys10;
+
+ x1 = x;
+ add_subwindow(bar3 = new BC_TitleBar(x1, y, xS(180)-x1, xs5, xs5, _("Justify")));
+ x1 += bar3->get_w() + xS(35);
+ add_subwindow(bar4 = new BC_TitleBar(x1, y, xS(375)-x1, xs5, xs5, _("Curve type")));
+ bar4->context_help_set_keyword("Using Autos");
+ x1 += bar4->get_w() + xS(25);
+ add_subwindow(bar5 = new BC_TitleBar(x1, y, get_w()-xS(60)-x1, xs5, xs5, _("Keyframe")));
+ bar5->context_help_set_keyword("Using Autos");
+ y += bar3->get_h() + ys10;
+
+ x1 = x;
add_subwindow(button = new CWindowCameraLeft(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowCameraCenter(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowCameraRight(mwindow, this, x1, y));
-// additional Buttons to control the curve mode of the "current" keyframe
- x1 += button->get_w() + xs15;
- add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y));
- x1 += button->get_w() + xs10;
- add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y));
-
- y += button->get_h();
- x1 = xs10;
+ x1 += button->get_w() + xs25;
add_subwindow(button = new CWindowCameraTop(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y));
- x1 += button->get_w() + xs15;
- add_subwindow(this->add_keyframe = new CWindowCameraAddKeyframe(mwindow, this, x1, y));
- x1 += button->get_w() + xs10;
- add_subwindow(this->reset = new CWindowCameraReset(mwindow, this, x1, y));
+ x1 += button->get_w() + xS(35);
+ add_subwindow(t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y));
+ t_smooth->context_help_set_keyword("Using Autos");
+ x1 += t_smooth->get_w() + xs10;
+ add_subwindow(t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y));
+ t_linear->context_help_set_keyword("Using Autos");
+ x1 += t_linear->get_w() + xs10;
+ add_subwindow(t_tangent = new CWindowCurveToggle(Camera_Crv_Tangent, mwindow, this, x1, y));
+ t_tangent->context_help_set_keyword("Using Autos");
+ x1 += t_tangent->get_w() + xs10;
+ add_subwindow(t_free = new CWindowCurveToggle(Camera_Crv_Free, mwindow, this, x1, y));
+ t_free->context_help_set_keyword("Using Autos");
+ x1 += t_free->get_w() + xs10;
+ add_subwindow(t_bump = new CWindowCurveToggle(Camera_Crv_Bump, mwindow, this, x1, y));
+ t_bump->context_help_set_keyword("Bump autos");
+ x1 += button->get_w() + xs25;
+ y += yS(5);
+ add_subwindow(add_keyframe = new CWindowCameraAddKeyframe(mwindow, this, x1, y));
+ add_keyframe->context_help_set_keyword("Using Autos");
+ x1 += add_keyframe->get_w() + xs15;
+ add_subwindow(auto_edge = new CWindowCurveAutoEdge(mwindow, this, x1, y));
+ auto_edge->context_help_set_keyword("Bump autos");
+ x1 += auto_edge->get_w() + xs10;
+ add_subwindow(auto_span = new CWindowCurveAutoSpan(mwindow, this, x1, y));
+ auto_span->context_help_set_keyword("Bump autos");
+ x1 += auto_span->get_w() + xS(50);
+ add_subwindow(reset = new CWindowCameraReset(mwindow, this, x1, y));
// fill in current auto keyframe values, set toggle states.
this->update();
void CWindowCameraGUI::handle_event()
{
- FloatAuto *x_auto = 0;
- FloatAuto *y_auto = 0;
- FloatAuto *z_auto = 0;
Track *track = mwindow->cwindow->calculate_affected_track();
- if(track)
- {
- mwindow->undo->update_undo_before(_("camera"), this);
- if(event_caller == x)
- {
- x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_CAMERA_X], 1);
- if(x_auto)
- {
- x_auto->set_value(atof(x->get_text()));
- update();
- update_preview();
- }
- }
- else
- if(event_caller == y)
- {
- y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_CAMERA_Y], 1);
- if(y_auto)
- {
- y_auto->set_value(atof(y->get_text()));
- update();
- update_preview();
- }
- }
- else
- if(event_caller == z)
- {
- z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_CAMERA_Z], 1);
- if(z_auto)
- {
- float zoom = atof(z->get_text());
- if(zoom > 100.) zoom = 100.;
- else
- if(zoom < 0.01) zoom = 0.01;
- // Doesn't allow user to enter from scratch
- // if(zoom != atof(z->get_text()))
- // z->update(zoom);
-
- z_auto->set_value(zoom);
- mwindow->gui->lock_window("CWindowCameraGUI::handle_event");
- mwindow->gui->draw_overlays(1);
- mwindow->gui->unlock_window();
- update();
- update_preview();
- }
- }
-
- mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
- }
+ if( !track ) return;
+ mwindow->undo->update_undo_before(_("camera"), this);
+ if( event_caller == x )
+ update_auto(track, AUTOMATION_CAMERA_X, x);
+ else if( event_caller == y )
+ update_auto(track, AUTOMATION_CAMERA_Y, y);
+ else if( event_caller == z )
+ update_auto(track, AUTOMATION_CAMERA_Z, z);
+ mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
}
void CWindowCameraGUI::update()
FloatAuto *y_auto = 0;
FloatAuto *z_auto = 0;
Track *track = mwindow->cwindow->calculate_affected_track();
+ int bg_color = get_resources()->text_background;
+ int hi_color = bg_color ^ 0x444444;
if( track ) {
mwindow->cwindow->calculate_affected_autos(track,
&x_auto, &y_auto, &z_auto, 1, 0, 0, 0);
}
- if(x_auto)
- x->update(x_auto->get_value());
- if(y_auto)
- y->update(y_auto->get_value());
- if(z_auto) {
- float value = z_auto->get_value();
- z->update(value);
+ if( x_auto ) {
+ int color = (edge || span) && x_auto->curve_mode == FloatAuto::BUMP ?
+ hi_color : bg_color;
+ x->get_textbox()->set_back_color(color);
+ float xvalue = x_auto->get_value(edge);
+ x->update_gui(xvalue);
+ }
+ if( y_auto ) {
+ int color = (edge || span) && y_auto->curve_mode == FloatAuto::BUMP ?
+ hi_color : bg_color;
+ y->get_textbox()->set_back_color(color);
+ float yvalue = y_auto->get_value(edge);
+ y->update_gui(yvalue);
+ }
+ if( z_auto ) {
+ int color = (edge || span) && z_auto->curve_mode == FloatAuto::BUMP ?
+ hi_color : bg_color;
+ z->get_textbox()->set_back_color(color);
+ float zvalue = z_auto->get_value(edge);
+ z->update_gui(zvalue);
thread->gui->lock_window("CWindowCameraGUI::update");
- thread->gui->composite_panel->cpanel_zoom->update(value);
+ thread->gui->composite_panel->cpanel_zoom->update(zvalue);
thread->gui->unlock_window();
}
- if( x_auto && y_auto && z_auto )
- {
+ if( x_auto && y_auto && z_auto ) {
t_smooth->check_toggle_state(x_auto, y_auto, z_auto);
t_linear->check_toggle_state(x_auto, y_auto, z_auto);
+ t_tangent->check_toggle_state(x_auto, y_auto, z_auto);
+ t_free->check_toggle_state(x_auto, y_auto, z_auto);
+ t_bump->check_toggle_state(x_auto, y_auto, z_auto);
}
+ x->range_text->update_range();
+ y->range_text->update_range();
+ z->range_text->update_range();
}
+CWindowToolAutoRangeTumbler::CWindowToolAutoRangeTumbler(CWindowCoord *coord, int x, int y,
+ int use_max, const char *tip)
+ : BC_Tumbler(x, y, coord->gui->mwindow->theme->get_image_set("auto_range"),
+ TUMBLER_HORZ)
+{
+ this->coord = coord;
+ this->use_max = use_max;
+ set_tooltip(tip);
+}
+int CWindowToolAutoRangeTumbler::handle_up_event()
+{
+ coord->gui->mwindow->update_autorange(coord->type, 1, use_max);
+ coord->range_text->update_range();
+ return 1;
+}
+
+int CWindowToolAutoRangeTumbler::handle_down_event()
+{
+ coord->gui->mwindow->update_autorange(coord->type, 0, use_max);
+ coord->range_text->update_range();
+ return 1;
+}
+
+CWindowToolAutoRangeReset::CWindowToolAutoRangeReset(CWindowCoord *coord, int x, int y)
+ : BC_Button(x, y, coord->gui->mwindow->theme->get_image_set("reset_button"))
+{
+ this->coord = coord;
+ set_tooltip(_("Reset"));
+}
+
+int CWindowToolAutoRangeReset::handle_event()
+{
+ float v = 0;
+ int group = Automation::autogrouptype(coord->type, 0);
+ MWindow *mwindow = coord->gui->mwindow;
+ LocalSession *local_session = mwindow->edl->local_session;
+ float min = local_session->automation_mins[group];
+ float max = local_session->automation_maxs[group];
+ switch( group ) {
+ case AUTOGROUPTYPE_ZOOM: // exp
+ min = 0.005; max= 5.000; v = 1;
+ break;
+ case AUTOGROUPTYPE_X:
+ max = mwindow->edl->session->output_w;
+ min = -max;
+ break;
+ case AUTOGROUPTYPE_Y:
+ max = mwindow->edl->session->output_h;
+ min = -max;
+ break;
+ }
+ local_session->automation_mins[group] = min;
+ local_session->automation_maxs[group] = max;
+ coord->range_text->update_range();
+ unlock_window();
+ MWindowGUI *mgui = mwindow->gui;
+ mgui->lock_window("CWindowToolAutoRangeReset::update");
+ int color = GWindowGUI::auto_colors[coord->type];
+ mgui->zoombar->update_autozoom(group, color);
+ mgui->draw_overlays(0);
+ mgui->update_patchbay();
+ mgui->flash_canvas(1);
+ mgui->unlock_window();
+ mwindow->save_backup();
+ lock_window("CWindowToolAutoRangeReset::update");
+ CWindowCoordSlider *slider = coord->slider;
+ slider->update(slider->get_pointer_motion_range(), v, min, max);
+ return slider->handle_event();
+}
+
+CWindowToolAutoRangeTextBox::CWindowToolAutoRangeTextBox(CWindowCoord *coord, int x, int y)
+ : BC_TextBox(x, y, xS(130), 1, "0.000 to 0.000")
+{
+ this->coord = coord;
+ set_tooltip(_("Automation range"));
+}
+
+int CWindowToolAutoRangeTextBox::button_press_event()
+{
+ if (!is_event_win()) return 0;
+ int use_max = get_cursor_x() < get_w()/2 ? 0 : 1;
+ switch( get_buttonpress() ) {
+ case WHEEL_UP:
+ coord->gui->mwindow->update_autorange(coord->type, 1, use_max);
+ break;
+ case WHEEL_DOWN:
+ coord->gui->mwindow->update_autorange(coord->type, 0, use_max);
+ break;
+ default:
+ return BC_TextBox::button_press_event();
+ }
+ return coord->range_text->update_range();
+}
+
+int CWindowToolAutoRangeTextBox::handle_event()
+{
+ float imin, imax;
+ if( sscanf(this->get_text(),"%f to%f",&imin, &imax) == 2 ) {
+ MWindow *mwindow = coord->gui->mwindow;
+ int group = Automation::autogrouptype(coord->type, 0);
+ LocalSession *local_session = mwindow->edl->local_session;
+ float min = imin, max = imax;
+ switch( group ) {
+ case AUTOGROUPTYPE_ZOOM:
+ if( min < ZOOM_MIN ) min = ZOOM_MIN;
+ if( max > ZOOM_MAX ) max = ZOOM_MAX;
+ break;
+ case AUTOGROUPTYPE_X:
+ case AUTOGROUPTYPE_Y:
+ if( min < XY_MIN ) min = XY_MIN;
+ if( max > XY_MAX ) max = XY_MAX;
+ break;
+ }
+ if( max > min ) {
+ local_session->automation_mins[group] = min;
+ local_session->automation_maxs[group] = max;
+ if( min != imin || max != imax ) update_range();
+ mwindow->gui->lock_window("CWindowToolAutoRangeTextBox::handle_event");
+ int color = GWindowGUI::auto_colors[coord->type];
+ mwindow->gui->zoombar->update_autozoom(group, color);
+ mwindow->gui->draw_overlays(0);
+ mwindow->gui->update_patchbay();
+ mwindow->gui->flash_canvas(1);
+ mwindow->gui->unlock_window();
+ }
+ }
+ return 1;
+}
+
+int CWindowToolAutoRangeTextBox::update_range()
+{
+ char string[BCSTRLEN];
+ LocalSession *local_session = coord->gui->mwindow->edl->local_session;
+ int group = Automation::autogrouptype(coord->type, 0);
+ float min = local_session->automation_mins[group];
+ float max = local_session->automation_maxs[group];
+ switch( group ) {
+ case AUTOGROUPTYPE_ZOOM:
+ sprintf(string, "%0.03f to %0.03f\n", min, max);
+ break;
+ case AUTOGROUPTYPE_X:
+ case AUTOGROUPTYPE_Y:
+ sprintf(string, "%0.0f to %.0f\n", min, max);
+ break;
+ }
+ update(string);
+ return 1;
+}
CWindowCameraLeft::CWindowCameraLeft(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
int CWindowCameraReset::handle_event()
{
+ mwindow->edl->local_session->reset_view_limits();
+ CWindowCameraGUI *gui = (CWindowCameraGUI *)this->gui;
return gui->press(&CWindowCanvas::reset_camera);
}
+CWindowCurveAutoEdge::CWindowCurveAutoEdge(MWindow *mwindow,
+ CWindowToolGUI *gui, int x, int y)
+ : BC_Toggle(x, y, mwindow->theme->get_image_set("bump_edge"), gui->edge)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Bump edit edge left/right"));
+}
+
+int CWindowCurveAutoEdge::handle_event()
+{
+ gui->edge = get_value();
+ gui->update();
+ return 1;
+}
+
+CWindowCurveAutoSpan::CWindowCurveAutoSpan(MWindow *mwindow,
+ CWindowToolGUI *gui, int x, int y)
+ : BC_Toggle(x, y, mwindow->theme->get_image_set("bump_span"), gui->span)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Bump spans to next/prev"));
+}
+
+int CWindowCurveAutoSpan::handle_event()
+{
+ gui->span = get_value();
+ gui->update();
+ return 1;
+}
+
CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Projector"), xS(170), yS(170))
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Projector"), xS(580), yS(200))
{
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Camera and Projector");
}
CWindowProjectorGUI::~CWindowProjectorGUI()
{
}
void CWindowProjectorGUI::create_objects()
{
- int xs10 = xS(10), xs15 = xS(15);
- int ys30 = yS(30);
- int x = xs10, y = yS(10);
+ int xs5 = xS(5), xs10 = xS(10), xs15 = xS(15), xs25 = xS(25);
+ int ys10 = yS(10), ys30 = yS(30);
+ int x = xs10, y = ys10;
Track *track = mwindow->cwindow->calculate_affected_track();
FloatAuto *x_auto = 0;
FloatAuto *y_auto = 0;
FloatAuto *z_auto = 0;
BC_Title *title;
BC_Button *button;
+ span = 1; edge = 0;
lock_window("CWindowProjectorGUI::create_objects");
if( track ) {
mwindow->cwindow->calculate_affected_autos(track,
&x_auto, &y_auto, &z_auto, 0, 0, 0, 0);
}
-
- add_subwindow(title = new BC_Title(x, y, "X:"));
- x += title->get_w();
- this->x = new CWindowCoord(this, x, y,
- x_auto ? x_auto->get_value() : (float)0);
+ int x1 = x;
+ add_subwindow(bar1 = new BC_TitleBar(x1, y, xS(340), xs10, xs10, _("Position")));
+ x1 += bar1->get_w() + xS(35);
+ add_subwindow(bar2 = new BC_TitleBar(x1, y, get_w()-x1-xs10, xs10, xs10, _("Range")));
+ y += bar1->get_h() + ys10;
+ add_subwindow(title = new BC_Title(x = xs10, y, "X:"));
+ x1 = x + title->get_w() + xS(3);
+ float xvalue = x_auto ? x_auto->get_value() : 0;
+ this->x = new CWindowCoord(this, x1, y, xvalue, AUTOMATION_PROJECTOR_X);
this->x->create_objects();
+ this->x->range->set_tooltip(_("expand X range"));
y += ys30;
- x = xs10;
- add_subwindow(title = new BC_Title(x, y, "Y:"));
- x += title->get_w();
- this->y = new CWindowCoord(this, x, y,
- y_auto ? y_auto->get_value() : (float)0);
+ add_subwindow(title = new BC_Title(x = xs10, y, "Y:"));
+ float yvalue = y_auto ? y_auto->get_value() : 0;
+ this->y = new CWindowCoord(this, x1, y, yvalue, AUTOMATION_PROJECTOR_Y);
this->y->create_objects();
+ this->y->range->set_tooltip(_("expand Y range"));
y += ys30;
- x = xs10;
- add_subwindow(title = new BC_Title(x, y, "Z:"));
- x += title->get_w();
- this->z = new CWindowCoord(this, x, y,
- z_auto ? z_auto->get_value() : (float)1);
+ add_subwindow(title = new BC_Title(x = xs10, y, "Z:"));
+ float zvalue = z_auto ? z_auto->get_value() : 1;
+ this->z = new CWindowCoord(this, x1, y, zvalue, AUTOMATION_PROJECTOR_Z);
this->z->create_objects();
+ this->z->range->set_tooltip(_("expand Zoom range"));
this->z->set_increment(0.01);
-
- y += ys30;
- int x1 = xs10;
+ y += ys30 + ys10;
+
+ x1 = x;
+ add_subwindow(bar3 = new BC_TitleBar(x1, y, xS(180)-x1, xs5, xs5, _("Justify")));
+ x1 += bar3->get_w() + xS(35);
+ add_subwindow(bar4 = new BC_TitleBar(x1, y, xS(375)-x1, xs5, xs5, _("Curve type")));
+ bar4->context_help_set_keyword("Using Autos");
+ x1 += bar4->get_w() + xS(25);
+ add_subwindow(bar5 = new BC_TitleBar(x1, y, get_w()-xS(60)-x1, xs5, xs5, _("Keyframe")));
+ bar5->context_help_set_keyword("Using Autos");
+ y += bar3->get_h() + ys10;
+
+ x1 = x;
add_subwindow(button = new CWindowProjectorLeft(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowProjectorCenter(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowProjectorRight(mwindow, this, x1, y));
-// additional Buttons to control the curve mode of the "current" keyframe
- x1 += button->get_w() + xs15;
- add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y));
- x1 += button->get_w() + xs10;
- add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y));
-
- y += button->get_h();
- x1 = xs10;
+ x1 += button->get_w() + xs25;
add_subwindow(button = new CWindowProjectorTop(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y));
x1 += button->get_w();
add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y));
- x1 += button->get_w() + xs15;
- add_subwindow(this->add_keyframe = new CWindowProjectorAddKeyframe(mwindow, this, x1, y));
- x1 += button->get_w() + xs10;
- add_subwindow(this->reset = new CWindowProjectorReset(mwindow, this, x1, y));
+ x1 += button->get_w() + xS(35);
+ add_subwindow(t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y));
+ t_smooth->context_help_set_keyword("Using Autos");
+ x1 += t_smooth->get_w() + xs10;
+ add_subwindow(t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y));
+ t_linear->context_help_set_keyword("Using Autos");
+ x1 += t_linear->get_w() + xs10;
+ add_subwindow(t_tangent = new CWindowCurveToggle(Projector_Crv_Tangent, mwindow, this, x1, y));
+ t_tangent->context_help_set_keyword("Using Autos");
+ x1 += t_tangent->get_w() + xs10;
+ add_subwindow(t_free = new CWindowCurveToggle(Projector_Crv_Free, mwindow, this, x1, y));
+ t_free->context_help_set_keyword("Using Autos");
+ x1 += t_free->get_w() + xs10;
+ add_subwindow(t_bump = new CWindowCurveToggle(Projector_Crv_Bump, mwindow, this, x1, y));
+ t_bump->context_help_set_keyword("Bump autos");
+ x1 += button->get_w() + xs25;
+ y += yS(5);
+ add_subwindow(add_keyframe = new CWindowProjectorAddKeyframe(mwindow, this, x1, y));
+ add_keyframe->context_help_set_keyword("Using Autos");
+ x1 += add_keyframe->get_w() + xs15;
+ add_subwindow(auto_edge = new CWindowCurveAutoEdge(mwindow, this, x1, y));
+ auto_edge->context_help_set_keyword("Bump autos");
+ x1 += auto_edge->get_w() + xs10;
+ add_subwindow(auto_span = new CWindowCurveAutoSpan(mwindow, this, x1, y));
+ auto_span->context_help_set_keyword("Bump autos");
+ x1 += auto_span->get_w() + xS(50);
+ add_subwindow(reset = new CWindowProjectorReset(mwindow, this, x1, y));
// fill in current auto keyframe values, set toggle states.
this->update();
void CWindowProjectorGUI::handle_event()
{
- FloatAuto *x_auto = 0;
- FloatAuto *y_auto = 0;
- FloatAuto *z_auto = 0;
Track *track = mwindow->cwindow->calculate_affected_track();
-
- if(track)
- {
- mwindow->undo->update_undo_before(_("projector"), this);
- if(event_caller == x)
- {
- x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_PROJECTOR_X], 1);
- if(x_auto)
- {
- x_auto->set_value(atof(x->get_text()));
- update();
- update_preview();
- }
- }
- else
- if(event_caller == y)
- {
- y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_PROJECTOR_Y], 1);
- if(y_auto)
- {
- y_auto->set_value(atof(y->get_text()));
- update();
- update_preview();
- }
- }
- else
- if(event_caller == z)
- {
- z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_PROJECTOR_Z], 1);
- if(z_auto)
- {
- float zoom = atof(z->get_text());
- if(zoom > 100.) zoom = 100.;
- else if(zoom < 0.01) zoom = 0.01;
-// if (zoom != atof(z->get_text()))
-// z->update(zoom);
- z_auto->set_value(zoom);
-
- mwindow->gui->lock_window("CWindowProjectorGUI::handle_event");
- mwindow->gui->draw_overlays(1);
- mwindow->gui->unlock_window();
-
- update();
- update_preview();
- }
- }
- mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
- }
+ if( !track ) return;
+ mwindow->undo->update_undo_before(_("projector"), this);
+ if( event_caller == x )
+ update_auto(track, AUTOMATION_PROJECTOR_X, x);
+ else if( event_caller == y )
+ update_auto(track, AUTOMATION_PROJECTOR_Y, y);
+ else if( event_caller == z )
+ update_auto(track, AUTOMATION_PROJECTOR_Z, z);
+ mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
}
void CWindowProjectorGUI::update()
FloatAuto *y_auto = 0;
FloatAuto *z_auto = 0;
Track *track = mwindow->cwindow->calculate_affected_track();
+ int bg_color = get_resources()->text_background;
+ int hi_color = bg_color ^ 0x444444;
if( track ) {
mwindow->cwindow->calculate_affected_autos(track,
&x_auto, &y_auto, &z_auto, 0, 0, 0, 0);
}
- if(x_auto)
- x->update(x_auto->get_value());
- if(y_auto)
- y->update(y_auto->get_value());
- if(z_auto) {
- float value = z_auto->get_value();
- z->update(value);
+ if( x_auto ) {
+ int color = (edge || span) && x_auto->curve_mode == FloatAuto::BUMP ?
+ hi_color : bg_color;
+ x->get_textbox()->set_back_color(color);
+ float xvalue = x_auto->get_value(edge);
+ x->update_gui(xvalue);
+ }
+ if( y_auto ) {
+ int color = (edge || span) && y_auto->curve_mode == FloatAuto::BUMP ?
+ hi_color : bg_color;
+ y->get_textbox()->set_back_color(color);
+ float yvalue = y_auto->get_value(edge);
+ y->update_gui(yvalue);
+ }
+ if( z_auto ) {
+ int color = (edge || span) && z_auto->curve_mode == FloatAuto::BUMP ?
+ hi_color : bg_color;
+ z->get_textbox()->set_back_color(color);
+ float zvalue = z_auto->get_value(edge);
+ z->update_gui(zvalue);
thread->gui->lock_window("CWindowProjectorGUI::update");
- thread->gui->composite_panel->cpanel_zoom->update(value);
+ thread->gui->composite_panel->cpanel_zoom->update(zvalue);
thread->gui->unlock_window();
}
- if( x_auto && y_auto && z_auto )
- {
+ if( x_auto && y_auto && z_auto ) {
t_smooth->check_toggle_state(x_auto, y_auto, z_auto);
t_linear->check_toggle_state(x_auto, y_auto, z_auto);
+ t_tangent->check_toggle_state(x_auto, y_auto, z_auto);
+ t_free->check_toggle_state(x_auto, y_auto, z_auto);
+ t_bump->check_toggle_state(x_auto, y_auto, z_auto);
}
+ x->range_text->update_range();
+ y->range_text->update_range();
+ z->range_text->update_range();
}
CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
int CWindowProjectorReset::handle_event()
{
+ mwindow->edl->local_session->reset_view_limits();
+ CWindowProjectorGUI *gui = (CWindowProjectorGUI *)this->gui;
return gui->press(&CWindowCanvas::reset_projector);
}
if( k >= 0 ) {
track_item = (CWindowMaskItem *)track_items[k];
Track *track = track_item ? mwindow->edl->tracks->get_track_by_id(track_item->id) : 0;
- if( track && track->record ) track_id = track->get_id();
+ if( track && track->is_armed() ) track_id = track->get_id();
}
else
track_id = mwindow->cwindow->mask_track_id;
for( Track *track=mwindow->edl->tracks->first; track; track=track->next ) {
if( track->data_type != TRACK_VIDEO ) continue;
MaskAutos *mask_autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
- int color = !track->record ? RED : mask_autos->first ? high_color : -1;
+ int color = !track->is_armed() ? RED : mask_autos->first ? high_color : -1;
MaskAuto *mask_auto = (MaskAuto*)mask_autos->default_auto;
for( int i=0; color<0 && i<mask_auto->masks.size(); ++i )
if( mask_auto->masks[i]->points.size() > 0 ) color = high_color;
track_item = items[0];
}
Track *track = track_item ? mwindow->edl->tracks->get_track_by_id(track_item->id) : 0;
- int track_id = track_item && track && track->record ? track_item->id : -1;
+ int track_id = track_item && track && track->is_armed() ? track_item->id : -1;
gui->mask_on_track->set_back_color(track_id >= 0 ?
gui->get_resources()->text_background :
gui->get_resources()->text_background_disarmed);
markers = 1;
boundary = 1;
preset_dialog = 0;
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Masks");
}
CWindowMaskGUI::~CWindowMaskGUI()
{
//printf("CWindowMaskGUI::update 1\n");
get_keyframe(track, autos, keyframe, mask, point, 0);
mwindow->cwindow->mask_track_id = track ? track->get_id() : -1;
- mask_on_track->set_back_color(!track || track->record ?
+ mask_on_track->set_back_color(!track || track->is_armed() ?
get_resources()->text_background :
get_resources()->text_background_disarmed);
mask_on_track->update_items();
: BC_Window(title, x, y, xS(320), yS(100), xS(320), yS(100), 0, 0, 1)
{
this->preset_dialog = preset_dialog;
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Masks");
}
void CWindowMaskPresetGUI::create_objects()
CWindowRulerGUI::CWindowRulerGUI(MWindow *mwindow, CWindowTool *thread)
: CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Ruler"), xS(320), yS(240))
{
+// *** CONTEXT_HELP ***
+ context_help_set_keyword("Compositor Toolbar");
}
CWindowRulerGUI::~CWindowRulerGUI()