#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)
mwindow->edl->session->tool_window = 1;
gui->composite_panel->operation[CWINDOW_TOOL_WINDOW]->update(1);
}
+ mwindow->edl->session->tool_window = new_gui ? 1 : 0;
update_show_window();
// Signal thread to run next tool GUI
CWindowToolGUI::CWindowToolGUI(MWindow *mwindow,
- CWindowTool *thread,
- const char *title,
- int w,
- int h)
+ CWindowTool *thread, const char *title, int w, int h)
: BC_Window(title,
- mwindow->session->ctool_x,
- mwindow->session->ctool_y,
- w,
- h,
- w,
- h,
- 0,
- 0,
- 1)
+ mwindow->session->ctool_x, mwindow->session->ctool_y,
+ w, h, w, h, 0, 0, 1)
{
this->mwindow = mwindow;
this->thread = thread;
}
-CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int log_increment = 0)
- : BC_TumbleTextBox(gui, (float)value, (float)-65536, (float)65536, x, y, 70, 3)
+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)
- : BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, 70, 3)
+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 ) {
+ int x1 = get_x() + BC_TumbleTextBox::get_w() + xS(10), y1 = get_y();
+ 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];
+ float v = atof(get_text());
+ gui->add_subwindow(slider = new CWindowCoordSlider(this,
+ x1, y1, xS(150), min, max, v));
+ x1 += slider->get_w() + xS(5);
+ gui->add_subwindow(range = new CWindowCoordRange(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(2), 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;
+}
+
+CWindowCoordRange::CWindowCoordRange(CWindowCoord *coord, int x, int y)
+ : BC_Tumbler(x, y)
+{
+ this->coord = coord;
+}
+CWindowCoordRange::~CWindowCoordRange()
+{
+}
+
+int CWindowCoordRange::update(float scale)
+{
+ 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 = -100; max = 100; break;
+ case AUTOGROUPTYPE_Y: min = -100; max = 100; break;
+ }
+ }
+ float range = max - min;
+ min -= range * scale;
+ max += range * scale;
+ switch( group ) {
+ case AUTOGROUPTYPE_ZOOM:
+ if( min < 0.001 ) min = 0.001;
+ if( max > 1000. ) max = 1000.;
+ break;
+ case AUTOGROUPTYPE_X:
+ case AUTOGROUPTYPE_Y:
+ if( min < -32767 ) min = -32767;
+ if( max > 32767 ) max = 32767;
+ break;
+ }
+ CWindowCoordSlider *slider = coord->slider;
+ coord->slider->update(slider->get_pointer_motion_range(),
+ slider->get_value(), min, max);
+ unlock_window();
+ MWindowGUI *mgui = mwindow->gui;
+ mgui->lock_window("CWindowCoordRange::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("CWindowCoordRange::update");
+ return 1;
+}
+
+int CWindowCoordRange::handle_up_event()
+{
+ return update(0.5);
+}
+int CWindowCoordRange::handle_down_event()
+{
+ return update(-0.25);
+}
-CWindowCropOK::CWindowCropOK(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
- : BC_GenericButton(x, y, _("Do it"))
+CWindowCropApply::CWindowCropApply(MWindow *mwindow, CWindowCropGUI *crop_gui, int x, int y)
+ : BC_GenericButton(x, y, _("Apply"))
{
this->mwindow = mwindow;
- this->gui = gui;
+ this->crop_gui = crop_gui;
}
-int CWindowCropOK::handle_event()
+int CWindowCropApply::handle_event()
{
- mwindow->crop_video();
+ mwindow->crop_video(crop_gui->crop_mode->mode);
return 1;
}
-int CWindowCropOK::keypress_event()
+int CWindowCropApply::keypress_event()
{
if(get_keypress() == 0xd)
{
return 0;
}
+const char *CWindowCropOpMode::crop_ops[] = {
+ N_("Reformat"),
+ N_("Resize"),
+ N_("Shrink"),
+};
+
+CWindowCropOpMode::CWindowCropOpMode(MWindow *mwindow, CWindowCropGUI *crop_gui,
+ int mode, int x, int y)
+ : BC_PopupMenu(x, y, xS(140), _(crop_ops[mode]), 1)
+{
+ this->mwindow = mwindow;
+ this->crop_gui = crop_gui;
+ this->mode = mode;
+}
+CWindowCropOpMode::~CWindowCropOpMode()
+{
+}
+
+void CWindowCropOpMode::create_objects()
+{
+ for( int id=0,nid=sizeof(crop_ops)/sizeof(crop_ops[0]); id<nid; ++id )
+ add_item(new CWindowCropOpItem(this, _(crop_ops[id]), id));
+ handle_event();
+}
+
+int CWindowCropOpMode::handle_event()
+{
+ set_text(_(crop_ops[mode]));
+ return 1;
+}
+CWindowCropOpItem::CWindowCropOpItem(CWindowCropOpMode *popup, const char *text, int id)
+ : BC_MenuItem(text)
+{
+ this->popup = popup;
+ this->id = id;
+}
+
+int CWindowCropOpItem::handle_event()
+{
+ popup->set_text(get_text());
+ popup->mode = id;
+ return popup->handle_event();
+}
CWindowCropGUI::CWindowCropGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
- thread,
- _(PROGRAM_NAME ": Crop"),
- 330,
- 100)
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Crop"), xS(330), yS(100))
{
}
void CWindowCropGUI::create_objects()
{
- int x = 10, y = 10;
+ int xs5 = xS(5), xs10 = xS(10);
+ int ys5 = yS(5), ys10 = yS(10);
+ int x = xs10, y = ys10;
BC_Title *title;
lock_window("CWindowCropGUI::create_objects");
int column1 = 0;
int pad = MAX(BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1),
- BC_Title::calculate_h(this, "X")) + 5;
+ BC_Title::calculate_h(this, "X")) + ys5;
add_subwindow(title = new BC_Title(x, y, "X1:"));
column1 = MAX(column1, title->get_w());
y += pad;
add_subwindow(title = new BC_Title(x, y, _("W:")));
column1 = MAX(column1, title->get_w());
y += pad;
- add_subwindow(new CWindowCropOK(mwindow, thread->tool_gui, x, y));
+ add_subwindow(new CWindowCropApply(mwindow, this, x, y));
- x += column1 + 5;
- y = 10;
+ x += column1 + xs5;
+ y = ys10;
x1 = new CWindowCoord(thread->tool_gui, x, y,
mwindow->edl->session->crop_x1);
x1->create_objects();
+ x1->set_boundaries((int64_t)0, (int64_t)65536);
y += pad;
width = new CWindowCoord(thread->tool_gui, x, y,
mwindow->edl->session->crop_x2 - mwindow->edl->session->crop_x1);
width->create_objects();
+ width->set_boundaries((int64_t)1, (int64_t)65536);
- x += x1->get_w() + 10;
- y = 10;
+ x += x1->get_w() + xs10;
+ y = ys10;
int column2 = 0;
add_subwindow(title = new BC_Title(x, y, "Y1:"));
column2 = MAX(column2, title->get_w());
column2 = MAX(column2, title->get_w());
y += pad;
- y = 10;
- x += column2 + 5;
+ y = ys10;
+ x += column2 + xs5;
y1 = new CWindowCoord(thread->tool_gui, x, y,
mwindow->edl->session->crop_y1);
y1->create_objects();
+ y1->set_boundaries((int64_t)0, (int64_t)65536);
y += pad;
+
height = new CWindowCoord(thread->tool_gui, x, y,
mwindow->edl->session->crop_y2 - mwindow->edl->session->crop_y1);
height->create_objects();
+ height->set_boundaries((int64_t)1, (int64_t)65536);
+ y += pad;
+
+ add_subwindow(crop_mode = new CWindowCropOpMode(mwindow, this,
+ CROP_REFORMAT, x, y));
+ crop_mode->create_objects();
+
unlock_window();
}
mwindow->edl->session->crop_y1;
mwindow->edl->session->crop_y1 = atol(y1->get_text());
}
- mwindow->edl->session->crop_x2 = atol(width->get_text()) +
- mwindow->edl->session->crop_x1;
- mwindow->edl->session->crop_y2 = atol(height->get_text()) +
- mwindow->edl->session->crop_y1;
+ mwindow->edl->session->crop_x2 = atol(width->get_text()) +
+ mwindow->edl->session->crop_x1;
+ mwindow->edl->session->crop_y2 = atol(height->get_text()) +
+ mwindow->edl->session->crop_y1;
update();
mwindow->cwindow->gui->canvas->redraw(1);
}
CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Color"), 220, 290)
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Color"), xS(220), yS(290))
{
}
void CWindowEyedropGUI::create_objects()
{
+ int xs10 = xS(10), ys10 = yS(10);
int margin = mwindow->theme->widget_border;
- int x = 10 + margin;
- int y = 10 + margin;
- int x2 = 70, x3 = x2 + 60;
+ int x = xs10 + margin;
+ int y = ys10 + margin;
+ int x2 = xS(70), x3 = x2 + xS(60);
lock_window("CWindowEyedropGUI::create_objects");
BC_Title *title0, *title1, *title2, *title3, *title4, *title5, *title6, *title7;
add_subwindow(title0 = new BC_Title(x, y,_("X,Y:")));
add_subwindow(yuv_hex = new BC_Title(x3, this->y->get_y(), "#000000"));
y = title6->get_y() + this->v->get_h() + 2*margin;
- add_subwindow(sample = new BC_SubWindow(x, y, 50, 50));
+ add_subwindow(sample = new BC_SubWindow(x, y, xS(50), yS(50)));
y += sample->get_h() + margin;
add_subwindow(use_max = new CWindowEyedropCheckBox(mwindow, this, x, y));
update();
float y, u, v;
YUV::yuv.rgb_to_yuv_f(r, g, b, y, u, v);
this->y->update(y);
- this->u->update(u); u += 0.5;
- this->v->update(v); v += 0.5;
+ this->u->update(u += 0.5);
+ this->v->update(v += 0.5);
int yx = 255*y + 0.5; bclamp(yx,0,255);
int ux = 255*u + 0.5; bclamp(ux,0,255);
}
-CWindowEyedropCheckBox::CWindowEyedropCheckBox(MWindow *mwindow,
+CWindowEyedropCheckBox::CWindowEyedropCheckBox(MWindow *mwindow,
CWindowEyedropGUI *gui, int x, int y)
: BC_CheckBox(x, y, mwindow->edl->local_session->use_max, _("Use maximum"))
{
CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
- thread,
- _(PROGRAM_NAME ": Camera"),
- 170,
- 170)
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Camera"), xS(340), yS(170))
{
}
CWindowCameraGUI::~CWindowCameraGUI()
void CWindowCameraGUI::create_objects()
{
- int x = 10, y = 10, x1;
+ int xs10 = xS(10), xs15 = xS(15);
+ int ys10 = yS(10), ys30 = yS(30);
+ 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;
}
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 + 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();
-
-
- y += 30;
- x = 10;
- 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);
+ this->x->range->set_tooltip(_("expand X range"));
+ y += ys30;
+ 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();
- y += 30;
- x = 10;
- add_subwindow(title = new BC_Title(x, y, "Z:"));
+ this->y->range->set_tooltip(_("expand Y range"));
+ y += ys30;
+ add_subwindow(title = new BC_Title(x = xs10, y, "Z:"));
x += title->get_w();
- this->z = new CWindowCoord(this, x, y,
- z_auto ? z_auto->get_value() : (float)1);
+ 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);
+ this->z->range->set_tooltip(_("expand Zoom range"));
- y += 30;
- x1 = 10;
+ y += ys30;
+ x1 = xs10;
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 = 10;
+ x1 = xs10;
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));
-// additional Buttons to control the curve mode of the "current" keyframe
- x1 += button->get_w() + 15;
- add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y));
- x1 += button->get_w();
- add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, 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));
// fill in current auto keyframe values, set toggle states.
this->update();
if(event_caller == x)
{
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_CAMERA_X],
- 1);
+ track->automation->autos[AUTOMATION_CAMERA_X], 1);
if(x_auto)
{
x_auto->set_value(atof(x->get_text()));
if(event_caller == y)
{
y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_CAMERA_Y],
- 1);
+ track->automation->autos[AUTOMATION_CAMERA_Y], 1);
if(y_auto)
{
y_auto->set_value(atof(y->get_text()));
if(event_caller == z)
{
z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_CAMERA_Z],
- 1);
+ track->automation->autos[AUTOMATION_CAMERA_Z], 1);
if(z_auto)
{
float zoom = atof(z->get_text());
&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 ) {
+ float xvalue = x_auto->get_value();
+ x->update_gui(xvalue);
+ }
+ if( y_auto ) {
+ float yvalue = y_auto->get_value();
+ y->update_gui(yvalue);
+ }
+ if( z_auto ) {
+ float zvalue = z_auto->get_value();
+ 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);
}
int w = 0, h = 0;
track->get_source_dimensions(
mwindow->edl->local_session->get_selectionstart(1),
- w,
- h);
+ w, h);
if(w && h)
{
Track *track = mwindow->cwindow->calculate_affected_track();
if(track)
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_CAMERA_X],
- 1);
+ track->automation->autos[AUTOMATION_CAMERA_X], 1);
if(x_auto)
{
int w = 0, h = 0;
track->get_source_dimensions(
mwindow->edl->local_session->get_selectionstart(1),
- w,
- h);
+ w, h);
if(w && h)
{
int w = 0, h = 0;
track->get_source_dimensions(
mwindow->edl->local_session->get_selectionstart(1),
- w,
- h);
+ w, h);
if(w && h)
{
int w = 0, h = 0;
track->get_source_dimensions(
mwindow->edl->local_session->get_selectionstart(1),
- w,
- h);
+ w, h);
if(w && h)
{
return 1;
}
+CWindowCameraAddKeyframe::CWindowCameraAddKeyframe(MWindow *mwindow,
+ CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("keyframe_button"))
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Add Keyframe: Shift-F11"));
+}
+
+int CWindowCameraAddKeyframe::handle_event()
+{
+ return gui->press(&CWindowCanvas::camera_keyframe);
+}
+
+CWindowCameraReset::CWindowCameraReset(MWindow *mwindow,
+ CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("reset_button"))
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Reset Camera: F11"));
+}
+
+int CWindowCameraReset::handle_event()
+{
+ return gui->press(&CWindowCanvas::reset_camera);
+}
+
CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
- thread,
- _(PROGRAM_NAME ": Projector"),
- 170,
- 170)
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Projector"), xS(340), yS(170))
{
}
CWindowProjectorGUI::~CWindowProjectorGUI()
}
void CWindowProjectorGUI::create_objects()
{
- int x = 10, y = 10, x1;
+ int xs10 = xS(10), xs15 = xS(15);
+ int ys30 = yS(30);
+ int x = xs10, y = yS(10);
Track *track = mwindow->cwindow->calculate_affected_track();
FloatAuto *x_auto = 0;
FloatAuto *y_auto = 0;
&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);
+ add_subwindow(title = new BC_Title(x = xs10, y, "X:"));
+ int 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();
- y += 30;
- x = 10;
- 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);
+ this->x->range->set_tooltip(_("expand X range"));
+ y += ys30;
+ 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();
- y += 30;
- x = 10;
- 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);
+ this->y->range->set_tooltip(_("expand Y range"));
+ y += ys30;
+ 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 += 30;
- x1 = 10;
+ y += ys30;
+ x1 = xs10;
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 = 10;
+ x1 = xs10;
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));
-
-// additional Buttons to control the curve mode of the "current" keyframe
- x1 += button->get_w() + 15;
- add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y));
- x1 += button->get_w();
- add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, 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));
// fill in current auto keyframe values, set toggle states.
this->update();
if(event_caller == x)
{
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_PROJECTOR_X],
- 1);
+ track->automation->autos[AUTOMATION_PROJECTOR_X], 1);
if(x_auto)
{
x_auto->set_value(atof(x->get_text()));
if(event_caller == y)
{
y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_PROJECTOR_Y],
- 1);
+ track->automation->autos[AUTOMATION_PROJECTOR_Y], 1);
if(y_auto)
{
y_auto->set_value(atof(y->get_text()));
if(event_caller == z)
{
z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_PROJECTOR_Z],
- 1);
+ track->automation->autos[AUTOMATION_PROJECTOR_Z], 1);
if(z_auto)
{
float zoom = atof(z->get_text());
&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 ) {
+ float xvalue = x_auto->get_value();
+ x->update_gui(xvalue);
+ }
+ if( y_auto ) {
+ float yvalue = y_auto->get_value();
+ y->update_gui(yvalue);
+ }
+ if( z_auto ) {
+ float zvalue = z_auto->get_value();
+ 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);
}
Track *track = mwindow->cwindow->calculate_affected_track();
if(track)
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
- track->automation->autos[AUTOMATION_PROJECTOR_X],
- 1);
+ track->automation->autos[AUTOMATION_PROJECTOR_X], 1);
if(x_auto)
{
return 1;
}
+CWindowProjectorAddKeyframe::CWindowProjectorAddKeyframe(MWindow *mwindow,
+ CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("keyframe_button"))
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Add Keyframe: Shift-F12"));
+}
+
+int CWindowProjectorAddKeyframe::handle_event()
+{
+ return gui->press(&CWindowCanvas::projector_keyframe);
+}
+
+CWindowProjectorReset::CWindowProjectorReset(MWindow *mwindow,
+ CWindowToolGUI *gui, int x, int y)
+ : BC_Button(x, y, mwindow->theme->get_image_set("reset_button"))
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Reset Projector: F12"));
+}
+
+int CWindowProjectorReset::handle_event()
+{
+ return gui->press(&CWindowCanvas::reset_projector);
+}
+
+int CWindowToolGUI::press(void (CWindowCanvas::*fn)())
+{
+ unlock_window();
+ CWindowGUI *cw_gui = thread->gui;
+ cw_gui->lock_window("CWindowGUI::press");
+ (cw_gui->canvas->*fn)();
+ cw_gui->unlock_window();
+ lock_window("CWindowToolGUI::press");
+ return 1;
+}
CWindowMaskOnTrack::CWindowMaskOnTrack(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y, int w, const char *text)
- : BC_PopupTextBox(gui, 0, text, x, y, w, 120)
+ : BC_PopupTextBox(gui, 0, text, x, y, w, yS(120))
{
this->mwindow = mwindow;
this->gui = gui;
CWindowMaskName::CWindowMaskName(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y, const char *text)
- : BC_PopupTextBox(gui, 0, text, x, y, 100, 160)
+ : BC_PopupTextBox(gui, 0, text, x, y, xS(100), yS(160))
{
this->mwindow = mwindow;
this->gui = gui;
CWindowMaskGUI *gui, int x, int y)
: BC_TumbleTextBox(gui,
(int64_t)mwindow->cwindow->gui->affected_point,
- (int64_t)0, INT64_MAX, x, y, 70)
+ (int64_t)0, INT64_MAX, x, y, xS(70))
{
this->mwindow = mwindow;
this->gui = gui;
CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
- : BC_TumbleTextBox(gui, 0, INT_MIN, INT_MAX, x, y, 64, 2)
+ : BC_TumbleTextBox(gui, 0, INT_MIN, INT_MAX, x, y, xS(64), 2)
{
this->mwindow = mwindow;
this->gui = gui;
int CWindowMaskFeather::handle_event()
{
float v = atof(get_text());
+ if( fabsf(v) > MAX_FEATHER )
+ BC_TumbleTextBox::update((float)(v>=0 ? MAX_FEATHER : -MAX_FEATHER));
gui->feather_slider->update(v);
return gui->feather->update_value(v);
}
{
int sticky = 0;
float v = get_value();
+ if( fabsf(v) > MAX_FEATHER )
+ v = v>=0 ? MAX_FEATHER : -MAX_FEATHER;
if( stick && timer->get_difference() >= 250 )
stick = 0; // no events for .25 sec
if( stick && (last_v * (v-last_v)) < 0 )
}
if( last_v ) {
max *= 1.25;
+ if( max > MAX_FEATHER ) max = MAX_FEATHER;
update(get_w(), v=last_v, -max-5, max+5);
button_release_event();
}
int CWindowMaskFeatherSlider::update(float v)
{
- while( max < v ) max *= 1.25;
+ float vv = fabsf(v);
+ if( vv > MAX_FEATHER ) vv = MAX_FEATHER;
+ while( max < vv ) max *= 1.25;
return update(get_w(), v, -max-5, max+5);
}
int CWindowMaskFeatherSlider::update(int r, float v, float mn, float mx)
}
CWindowMaskFade::CWindowMaskFade(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
- : BC_TumbleTextBox(gui, 0, -100.f, 100.f, x, y, 64, 2)
+ : BC_TumbleTextBox(gui, 0, -100.f, 100.f, x, y, xS(64), 2)
{
this->mwindow = mwindow;
this->gui = gui;
CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
: CWindowToolGUI(mwindow, thread,
- _(PROGRAM_NAME ": Mask"), 440, 700)
+ _(PROGRAM_NAME ": Mask"), xS(440), yS(700))
{
this->mwindow = mwindow;
this->thread = thread;
void CWindowMaskGUI::create_objects()
{
+ int t[SUBMASKS];
Theme *theme = mwindow->theme;
- int x = 10, y = 10, margin = theme->widget_border, t[SUBMASKS];
+ int xs10 = xS(10), ys10 = yS(10);
+ int x = xs10, y = ys10;
+ int margin = theme->widget_border;
int clr_w = CWindowMaskClrMask::calculate_w(mwindow);
int clr_x = get_w()-x - clr_w;
lock_window("CWindowMaskGUI::create_objects");
BC_TitleBar *title_bar;
- add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Masks on Track")));
+ add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, xS(20), xS(10),
+ _("Masks on Track")));
y += title_bar->get_h() + margin;
BC_Title *title;
add_subwindow(title = new BC_Title(x,y, _("Track:")));
- int x1 = x + 90, ww = clr_x-2*margin - x1;
+ int x1 = x + xS(90), ww = clr_x-2*margin - x1;
for( int i=0,n=sizeof(t)/sizeof(t[0]); i<n; ++i ) t[i] = x1+(i*ww)/n;
int del_x = t[5];
Track *track = mwindow->cwindow->calculate_affected_track();
const char *text = track ? track->title : "";
mwindow->cwindow->mask_track_id = track ? track->get_id() : -1;
- mask_on_track = new CWindowMaskOnTrack(mwindow, this, x1, y, 100, text);
+ mask_on_track = new CWindowMaskOnTrack(mwindow, this, x1, y, xS(100), text);
mask_on_track->create_objects();
mask_on_track->set_tooltip(_("Video track"));
int x2 = x1 + mask_on_track->get_w();
mwindow->edl->local_session->solo_track_id = -1;
add_subwindow(mask_solo_track = new CWindowMaskSoloTrack(mwindow, this, del_x, y, 0));
y += mask_on_track->get_h() + margin;
- add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Masks")));
+ add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, xS(20), xS(10),
+ _("Masks")));
y += title_bar->get_h() + margin;
add_subwindow(title = new BC_Title(x, y, _("Mask:")));
mask_name = new CWindowMaskName(mwindow, this, x1, y, "");
}
add_subwindow(mask_unclr = new CWindowMaskUnclear(mwindow, this, clr_x, y));
y += mask_enables[0]->get_h() + 2*margin;
- add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Preset Shapes")));
+ add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, xS(20), xS(10),
+ _("Preset Shapes")));
y += title_bar->get_h() + margin;
add_subwindow(mask_shape_sqr = new CWindowMaskShape(mwindow, this,
"mask_prst_sqr_images", MASK_SHAPE_SQUARE, t[0], y, _("Square")));
add_subwindow(mask_shape_ovl = new CWindowMaskShape(mwindow, this,
"mask_prst_ovl_images", MASK_SHAPE_OVAL, t[3], y, _("Oval")));
add_subwindow(mask_load_list = new CWindowMaskLoadList(mwindow, this));
- add_subwindow(mask_load = new CWindowMaskLoad(mwindow, this, t[5], y, 80));
- add_subwindow(mask_save = new CWindowMaskSave(mwindow, this, t[6], y, 80));
- add_subwindow(mask_delete = new CWindowMaskDelete(mwindow, this, t[7], y, 80));
+ add_subwindow(mask_load = new CWindowMaskLoad(mwindow, this, t[5], y, xS(80)));
+ add_subwindow(mask_save = new CWindowMaskSave(mwindow, this, t[6], y, xS(80)));
+ add_subwindow(mask_delete = new CWindowMaskDelete(mwindow, this, t[7], y, xS(80)));
y += mask_load->get_h() + 2*margin;
- add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Position & Scale")));
+ add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, xS(20), xS(10),
+ _("Position & Scale")));
y += title_bar->get_h() + 2*margin;
- add_subwindow(mask_center = new CWindowMaskCenter(mwindow, this, t[0], y, 80));
- add_subwindow(mask_normal = new CWindowMaskNormal(mwindow, this, t[1], y, 80));
+ add_subwindow(mask_center = new CWindowMaskCenter(mwindow, this, t[0], y, xS(80)));
+ add_subwindow(mask_normal = new CWindowMaskNormal(mwindow, this, t[1], y, xS(80)));
add_subwindow(mask_scale_x = new CWindowMaskScaleXY(mwindow, this,
t[5], y, theme->get_image_set("mask_scale_x"), 0, MASK_SCALE_X, _("xlate/scale x")));
add_subwindow(mask_scale_xy = new CWindowMaskScaleXY(mwindow, this,
t[7], y, theme->get_image_set("mask_scale_xy"), 1, MASK_SCALE_XY, _("xlate/scale xy")));
y += mask_center->get_h() + 2*margin;
- add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Fade & Feather")));
+ add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, xS(20), xS(10),
+ _("Fade & Feather")));
y += title_bar->get_h() + 2*margin;
add_subwindow(title = new BC_Title(x, y, _("Fade:")));
add_subwindow(feather_slider);
add_subwindow(gang_feather = new CWindowMaskGangFeather(mwindow, this, clr_x, y));
y += feather->get_h() + 2*margin;
- add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Mask Points")));
+ add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, xS(20), xS(10),
+ _("Mask Points")));
y += title_bar->get_h() + margin;
add_subwindow(title = new BC_Title(x, y, _("Point:")));
_("smooth all"), -1, 1, t[4], y, "mask_all_smooth_images"));
add_subwindow(draw_boundary = new CWindowMaskDrawBoundary(mwindow, this, del_x, y));
y += this->y->get_h() + 2*margin;
- add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Pivot Point")));
+ add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, xS(20), xS(10),
+ _("Pivot Point")));
y += title_bar->get_h() + margin;
add_subwindow(title = new BC_Title(x, y, "X:"));
y += focus_y->get_h() + 2*margin;
add_subwindow(bar = new BC_Bar(x, y, get_w()-2*x));
y += bar->get_h() + margin;
- add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, 10, y));
+ add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, x, y));
y += this->apply_before_plugins->get_h();
- add_subwindow(this->disable_opengl_masking = new CWindowDisableOpenGLMasking(this, 10, y));
+ add_subwindow(this->disable_opengl_masking = new CWindowDisableOpenGLMasking(this, x, y));
add_subwindow(help = new CWindowMaskHelp(mwindow, this, del_x, y));
y += this->disable_opengl_masking->get_h() + 2*margin;
help_y = y;
int i = masks.size();
while( --i >= 0 ) {
if( strcmp(masks[i]->name, nm) ) continue;
- masks.remove_object_number(i);
+ masks.remove_object_number(i++);
}
mask = new SubMask(0, -1);
strncpy(mask->name, nm, sizeof(mask->name)-1);
int i = masks.size();
while( --i >= 0 ) {
if( strcmp(masks[i]->name, nm) ) continue;
- masks.remove_object_number(i);
+ masks.remove_object_number(i++);
}
save_masks(masks);
masks.remove_all_objects();
gui->mask_load_list->create_objects();
int px, py;
get_abs_cursor(px, py);
- return gui->mask_load_list->activate(px, py, 120,160);
+ return gui->mask_load_list->activate(px, py, xS(120),yS(160));
}
CWindowMaskPresetGUI::CWindowMaskPresetGUI(CWindowMaskPresetDialog *preset_dialog,
int x, int y, const char *title)
- : BC_Window(title, x, y, 320, 100, 320, 100, 0, 0, 1)
+ : BC_Window(title, x, y, xS(320), yS(100), xS(320), yS(100), 0, 0, 1)
{
this->preset_dialog = preset_dialog;
}
void CWindowMaskPresetGUI::create_objects()
{
- int x = 10, y = 10, pad = 8;
+ int xs8 = xS(8), xs10 = xS(10);
+ int ys10 = yS(10);
+ int x = xs10, y = ys10;
lock_window("CWindowMaskPresetGUI::create_objects");
BC_Title *title;
add_subwindow(title = new BC_Title(x, y,
preset_dialog->keyframe ? _("Save mask:") : _("Delete mask:")));
- int x1 = x + title->get_w() + pad;
- int x2 = get_w() - x - pad - x1 -
+ int x1 = x + title->get_w() + xs8;
+ int x2 = get_w() - x - xs8 - x1 -
BC_WindowBase::get_resources()->listbox_button[0]->get_w();
CWindowMaskGUI *gui = preset_dialog->gui;
preset_text = new CWindowMaskPresetText(this,
- x1, y, x2, 120, gui->mask_name->get_text());
+ x1, y, x2, yS(120), gui->mask_name->get_text());
preset_text->create_objects();
preset_text->set_tooltip(_("Mask name"));
preset_text->update_items();
CWindowRulerGUI::CWindowRulerGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Ruler"), 320, 240)
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Ruler"), xS(320), yS(240))
{
}
void CWindowRulerGUI::create_objects()
{
- int x = 10, y = 10, x1 = 100;
+ int xs10 = xS(10), xs200 = xS(200);
+ int ys5 = yS(5), ys10 = yS(10);
+ int x = xs10, y = ys10, x1 = xS(100);
BC_Title *title;
lock_window("CWindowRulerGUI::create_objects");
add_subwindow(title = new BC_Title(x, y, _("Current:")));
- add_subwindow(current = new BC_TextBox(x1, y, 200, 1, ""));
- y += title->get_h() + 5;
+ add_subwindow(current = new BC_TextBox(x1, y, xs200, 1, ""));
+ y += title->get_h() + ys5;
add_subwindow(title = new BC_Title(x, y, _("Point 1:")));
- add_subwindow(point1 = new BC_TextBox(x1, y, 200, 1, ""));
- y += title->get_h() + 5;
+ add_subwindow(point1 = new BC_TextBox(x1, y, xs200, 1, ""));
+ y += title->get_h() + ys5;
add_subwindow(title = new BC_Title(x, y, _("Point 2:")));
- add_subwindow(point2 = new BC_TextBox(x1, y, 200, 1, ""));
- y += title->get_h() + 5;
+ add_subwindow(point2 = new BC_TextBox(x1, y, xs200, 1, ""));
+ y += title->get_h() + ys5;
add_subwindow(title = new BC_Title(x, y, _("Deltas:")));
- add_subwindow(deltas = new BC_TextBox(x1, y, 200, 1, ""));
- y += title->get_h() + 5;
+ add_subwindow(deltas = new BC_TextBox(x1, y, xs200, 1, ""));
+ y += title->get_h() + ys5;
add_subwindow(title = new BC_Title(x, y, _("Distance:")));
- add_subwindow(distance = new BC_TextBox(x1, y, 200, 1, ""));
- y += title->get_h() + 5;
+ add_subwindow(distance = new BC_TextBox(x1, y, xs200, 1, ""));
+ y += title->get_h() + ys5;
add_subwindow(title = new BC_Title(x, y, _("Angle:")));
- add_subwindow(angle = new BC_TextBox(x1, y, 200, 1, ""));
- y += title->get_h() + 10;
+ add_subwindow(angle = new BC_TextBox(x1, y, xs200, 1, ""));
+ y += title->get_h() + ys10;
char string[BCTEXTLEN];
sprintf(string,
_("Press Ctrl to lock ruler to the\nnearest 45%c%c angle."),
add_subwindow(title = new BC_Title(x,
y,
string));
- y += title->get_h() + 10;
+ y += title->get_h() + ys10;
sprintf(string, _("Press Alt to translate the ruler."));
add_subwindow(title = new BC_Title(x,
y,
{
}
-
-
-