#include "mwindowgui.h"
#include "theme.h"
#include "track.h"
+#include "tracks.h"
#include "trackcanvas.h"
#include "transportque.h"
}
}
+void CWindowTool::raise_tool()
+{
+ if(tool_gui && mwindow->edl->session->tool_window)
+ {
+ tool_gui->lock_window("CWindowTool::show_tool");
+ tool_gui->raise_window();
+ tool_gui->unlock_window();
+ }
+}
+
void CWindowTool::run()
{
flush();
mwindow->edl->session->tool_window = 0;
unlock_window();
-
-
-
thread->gui->lock_window("CWindowToolGUI::close_event");
thread->gui->composite_panel->set_operation(mwindow->edl->session->cwindow_operation);
thread->gui->flush();
thread->gui->unlock_window();
-
lock_window("CWindowToolGUI::close_event");
return 1;
-;}
+}
int CWindowToolGUI::keypress_event()
{
}
+void CWindowToolGUI::update_preview(int changed_edl)
+{
+ unlock_window();
+ draw_preview(changed_edl);
+ lock_window("CWindowToolGUI::update_preview");
+}
-
+void CWindowToolGUI::draw_preview(int changed_edl)
+{
+ CWindowGUI *cgui = mwindow->cwindow->gui;
+ cgui->lock_window("CWindowToolGUI::draw_preview");
+ int change_type = !changed_edl ? CHANGE_PARAMS : CHANGE_EDL;
+ cgui->sync_parameters(change_type, 0, 1);
+ cgui->unlock_window();
+}
CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int log_increment = 0)
unlock_window();
}
-void CWindowCameraGUI::update_preview()
-{
- CWindowGUI *cgui = mwindow->cwindow->gui;
- cgui->lock_window("CWindowCameraGUI::update_preview");
- cgui->sync_parameters(CHANGE_PARAMS, 0, 1);
- cgui->unlock_window();
-}
-
-
void CWindowCameraGUI::handle_event()
{
FloatAuto *x_auto = 0;
unlock_window();
}
-void CWindowProjectorGUI::update_preview()
-{
- CWindowGUI *cgui = mwindow->cwindow->gui;
- cgui->lock_window("CWindowProjectorGUI::update_preview");
- cgui->sync_parameters(CHANGE_PARAMS, 0, 1);
- cgui->unlock_window();
-}
-
void CWindowProjectorGUI::handle_event()
{
FloatAuto *x_auto = 0;
}
-CWindowMaskTrack::CWindowMaskTrack(MWindow *mwindow, CWindowMaskGUI *gui,
- int x, int y, const char *text)
- : BC_Title(x, y, text, MEDIUMFONT, get_resources()->button_highlighted)
+CWindowMaskOnTrack::CWindowMaskOnTrack(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y, int w, const char *text)
+ : BC_PopupTextBox(gui, 0, text, x, y, w, 120)
{
this->mwindow = mwindow;
this->gui = gui;
}
-CWindowMaskTrack::~CWindowMaskTrack()
+CWindowMaskOnTrack::~CWindowMaskOnTrack()
+{
+}
+
+int CWindowMaskOnTrack::handle_event()
{
+ int k = get_number();
+//printf("selected %d = %s\n", k, k<0 ? "()" : track_items[k]->get_text());
+ CWindowMaskItem *track_item = k >= 0 ? (CWindowMaskItem *)track_items[k] : 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;
+ set_back_color(track_id >= 0 ?
+ gui->get_resources()->text_background :
+ gui->get_resources()->text_background_disarmed);
+ gui->mask_on_track->update(track_item ? track_item->get_text() : "");
+ mwindow->cwindow->mask_track_id = track_id;
+ mwindow->edl->local_session->solo_track_id = -1;
+ gui->mask_solo_track->update(0);
+ gui->update_preview(1);
+ return 1;
}
+void CWindowMaskOnTrack::update_items()
+{
+ track_items.remove_all_objects();
+ for( Track *track=mwindow->edl->tracks->first; track; track=track->next ) {
+ if( track->data_type != TRACK_VIDEO ) continue;
+ int color = track->record ? -1 : RED;
+ track_items.append(new CWindowMaskItem(track->title, track->get_id(), color));
+ }
+ update_list(&track_items);
+}
+
+CWindowMaskTrackTumbler::CWindowMaskTrackTumbler(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y)
+ : BC_Tumbler(x, y)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+}
+CWindowMaskTrackTumbler::~CWindowMaskTrackTumbler()
+{
+}
+
+int CWindowMaskTrackTumbler::handle_up_event()
+{
+ return do_event(1);
+}
+
+int CWindowMaskTrackTumbler::handle_down_event()
+{
+ return do_event(-1);
+}
+
+int CWindowMaskTrackTumbler::do_event(int dir)
+{
+ CWindowMaskItem *track_item = 0;
+ CWindowMaskItem **items = (CWindowMaskItem**)&gui->mask_on_track->track_items[0];
+ int n = gui->mask_on_track->track_items.size();
+ int id = mwindow->cwindow->mask_track_id;
+ if( n > 0 ) {
+ int k = n;
+ while( --k >= 0 && items[k]->id != id );
+ if( k >= 0 ) {
+ k += dir;
+ bclamp(k, 0, n-1);
+ track_item = items[k];
+ }
+ else
+ 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;
+ gui->mask_on_track->set_back_color(track_id >= 0 ?
+ gui->get_resources()->text_background :
+ gui->get_resources()->text_background_disarmed);
+ gui->mask_on_track->update(track_item ? track_item->get_text() : "");
+ mwindow->cwindow->mask_track_id = track_item ? track_item->id : -1;
+ mwindow->edl->local_session->solo_track_id = -1;
+ gui->mask_solo_track->update(0);
+ gui->update_preview(1);
+ return 1;
+}
+
+
CWindowMaskName::CWindowMaskName(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y, const char *text)
: BC_PopupTextBox(gui, 0, text, x, y, 100, 160)
}
else
sprintf(text, "%d", i);
- mask_items.append(new BC_ListBoxItem(text));
+ mask_items.append(new CWindowMaskItem(text));
}
update_list(&mask_items);
}
int CWindowMaskButton::handle_event()
{
mwindow->edl->session->cwindow_mask = no;
- gui->name->update(gui->name->mask_items[no]->get_text());
+ gui->mask_name->update(gui->mask_name->mask_items[no]->get_text());
gui->update();
gui->update_preview();
return 1;
if( (k+=dir) >= SUBMASKS ) k = 0;
else if( k < 0 ) k = SUBMASKS-1;
mwindow->edl->session->cwindow_mask = k;
- gui->name->update(gui->name->mask_items[k]->get_text());
+ gui->mask_name->update(gui->mask_name->mask_items[k]->get_text());
gui->update();
gui->update_preview();
return 1;
}
+CWindowMaskEnable::CWindowMaskEnable(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y, int no, int v)
+ : BC_CheckBox(x, y, v)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ this->no = no;
+}
+
+CWindowMaskEnable::~CWindowMaskEnable()
+{
+}
+
+int CWindowMaskEnable::handle_event()
+{
+ Track *track = mwindow->cwindow->calculate_mask_track();
+ if( track ) {
+ mwindow->undo->update_undo_before(_("mask enable"), this);
+ int bit = 1 << no;
+ if( get_value() )
+ track->masks |= bit;
+ else
+ track->masks &= ~bit;
+ gui->update();
+ gui->update_preview(1);
+ mwindow->undo->update_undo_after(_("mask enable"), LOAD_PATCHES);
+ }
+ return 1;
+}
+
+CWindowMaskUnclear::CWindowMaskUnclear(MWindow *mwindow,
+ CWindowMaskGUI *gui, int x, int y, int w)
+ : BC_GenericButton(x, y, w, _("Enable"))
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Show mask"));
+}
+
+int CWindowMaskUnclear::handle_event()
+{
+ Track *track = mwindow->cwindow->calculate_mask_track();
+ if( track ) {
+ mwindow->undo->update_undo_before(_("mask enables"), this);
+ int m = (1<<SUBMASKS)-1;
+ if( track->masks == m )
+ track->masks = 0;
+ else
+ track->masks = m;
+ for( int i=0; i<SUBMASKS; ++i )
+ gui->mask_enables[i]->update((track->masks>>i) & 1);
+ gui->update_preview(1);
+ mwindow->undo->update_undo_after(_("mask enables"), LOAD_PATCHES);
+ }
+ return 1;
+}
+
+CWindowMaskSoloTrack::CWindowMaskSoloTrack(MWindow *mwindow,
+ CWindowMaskGUI *gui, int x, int y, int v)
+ : BC_CheckBox(x, y, v, _("Solo"))
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ set_tooltip(_("Solo video track"));
+}
+
+int CWindowMaskSoloTrack::handle_event()
+{
+ mwindow->edl->local_session->solo_track_id =
+ get_value() ? mwindow->cwindow->mask_track_id : -1;
+ gui->update_preview(1);
+ return 1;
+}
+
+int CWindowMaskSoloTrack::calculate_w(BC_WindowBase *gui)
+{
+ int w = 0, h = 0;
+ calculate_extents(gui, &w, &h, _("Solo"));
+ return w;
+}
CWindowMaskDelMask::CWindowMaskDelMask(MWindow *mwindow,
- CWindowToolGUI *gui, int x, int y)
+ CWindowMaskGUI *gui, int x, int y)
: BC_GenericButton(x, y, _("Delete"))
{
this->mwindow = mwindow;
int total_points;
// Get existing keyframe
- ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
+ gui->get_keyframe(track, autos, keyframe, mask, point, 0);
if( track ) {
mwindow->undo->update_undo_before(_("mask delete"), 0);
}
CWindowMaskDelPoint::CWindowMaskDelPoint(MWindow *mwindow,
- CWindowToolGUI *gui, int x, int y)
+ CWindowMaskGUI *gui, int x, int y)
: BC_GenericButton(x, y, _("Delete"))
{
this->mwindow = mwindow;
int total_points;
// Get existing keyframe
- ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
+ gui->get_keyframe(track, autos, keyframe, mask, point, 0);
if( track ) {
mwindow->undo->update_undo_before(_("point delete"), 0);
CWindowMaskAffectedPoint::CWindowMaskAffectedPoint(MWindow *mwindow,
- CWindowToolGUI *gui, int x, int y)
+ CWindowMaskGUI *gui, int x, int y)
: BC_TumbleTextBox(gui,
(int64_t)mwindow->cwindow->gui->affected_point,
(int64_t)0, INT64_MAX, x, y, 100)
{
int total_points = 0;
int affected_point = atol(get_text());
- Track *track = mwindow->cwindow->calculate_affected_track();
+ Track *track = mwindow->cwindow->calculate_mask_track();
if(track) {
MaskAutos *autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
MaskAuto *keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(autos, 0);
}
-CWindowMaskFocus::CWindowMaskFocus(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
- : BC_CheckBox(x, y, ((CWindowMaskGUI*)gui)->focused, _("Focus"))
+CWindowMaskFocus::CWindowMaskFocus(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
+ : BC_CheckBox(x, y, gui->focused, _("Focus"))
{
this->mwindow = mwindow;
this->gui = gui;
int CWindowMaskFocus::handle_event()
{
- ((CWindowMaskGUI*)gui)->focused = get_value();
- gui->update();
- gui->update_preview();
- return 1;
-}
-
-CWindowMaskDrawCenter::CWindowMaskDrawCenter(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
- : BC_CheckBox(x, y, ((CWindowMaskGUI*)gui)->center_mark, _("Center Mark"))
-{
- this->mwindow = mwindow;
- this->gui = gui;
- set_tooltip(_("show center of mask points"));
-}
-
-CWindowMaskDrawCenter::~CWindowMaskDrawCenter()
-{
-}
-
-int CWindowMaskDrawCenter::handle_event()
-{
- ((CWindowMaskGUI*)gui)->center_mark = get_value();
+ gui->focused = get_value();
gui->update();
gui->update_preview();
return 1;
}
-CWindowMaskDrawMarkers::CWindowMaskDrawMarkers(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
- : BC_CheckBox(x, y, ((CWindowMaskGUI*)gui)->markers, _("Markers"))
+CWindowMaskDrawMarkers::CWindowMaskDrawMarkers(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
+ : BC_CheckBox(x, y, gui->markers, _("Markers"))
{
this->mwindow = mwindow;
this->gui = gui;
int CWindowMaskDrawMarkers::handle_event()
{
- ((CWindowMaskGUI*)gui)->markers = get_value();
+ gui->markers = get_value();
gui->update();
gui->update_preview();
return 1;
}
-CWindowMaskDrawBoundary::CWindowMaskDrawBoundary(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
- : BC_CheckBox(x, y, ((CWindowMaskGUI*)gui)->boundary, _("Boundary"))
+CWindowMaskDrawBoundary::CWindowMaskDrawBoundary(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
+ : BC_CheckBox(x, y, gui->boundary, _("Boundary"))
{
this->mwindow = mwindow;
this->gui = gui;
int CWindowMaskDrawBoundary::handle_event()
{
- ((CWindowMaskGUI*)gui)->boundary = get_value();
+ gui->boundary = get_value();
gui->update();
gui->update_preview();
return 1;
}
-CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
+CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
: BC_TumbleTextBox(gui, 0, -FEATHER_MAX, FEATHER_MAX, x, y, 64, 2)
{
this->mwindow = mwindow;
int CWindowMaskFeather::update(float v)
{
- CWindowMaskGUI *mask_gui = (CWindowMaskGUI*)gui;
- mask_gui->feather_slider->update(v);
+ gui->feather_slider->update(v);
return BC_TumbleTextBox::update(v);
}
mwindow->undo->update_undo_before(_("mask feather"), this);
// Get existing keyframe
- ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe,
+ gui->get_keyframe(track, autos, keyframe,
mask, point, create_it);
if( track ) {
- int gang = ((CWindowMaskGUI*)gui)->gang_feather->get_value();
+ int gang = gui->gang_feather->get_value();
#ifdef USE_KEYFRAME_SPANNING
MaskAuto temp_keyframe(mwindow->edl, autos);
temp_keyframe.copy_data(keyframe);
int CWindowMaskFeather::handle_event()
{
float v = atof(get_text());
- CWindowMaskGUI * mask_gui = (CWindowMaskGUI*)gui;
- mask_gui->feather_slider->update(v);
- return mask_gui->feather->update_value(v);
+ gui->feather_slider->update(v);
+ return gui->feather->update_value(v);
}
CWindowMaskFeatherSlider::CWindowMaskFeatherSlider(MWindow *mwindow,
- CWindowToolGUI *gui, int x, int y, int w, float v)
+ CWindowMaskGUI *gui, int x, int y, int w, float v)
: BC_FSlider(x, y, 0, w, w, -FEATHER_MAX, FEATHER_MAX, v)
{
this->mwindow = mwindow;
else
last_v = v;
timer->update();
- CWindowMaskGUI * mask_gui = (CWindowMaskGUI*)gui;
- mask_gui->feather->BC_TumbleTextBox::update(v);
- return mask_gui->feather->update_value(v);
+ gui->feather->BC_TumbleTextBox::update(v);
+ return gui->feather->update_value(v);
}
int CWindowMaskFeatherSlider::update(float v)
return BC_FSlider::update(v);
}
-CWindowMaskFade::CWindowMaskFade(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
+CWindowMaskFade::CWindowMaskFade(MWindow *mwindow, CWindowMaskGUI *gui, int x, int y)
: BC_TumbleTextBox(gui, 0, -100.f, 100.f, x, y, 64, 2)
{
this->mwindow = mwindow;
int CWindowMaskFade::update(float v)
{
- CWindowMaskGUI *mask_gui = (CWindowMaskGUI*)gui;
- mask_gui->fade_slider->update(v);
+ gui->fade_slider->update(v);
return BC_TumbleTextBox::update(v);
}
mwindow->undo->update_undo_before(_("mask fade"), this);
// Get existing keyframe
- ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe,
+ gui->get_keyframe(track, autos, keyframe,
mask, point, create_it);
if( track ) {
- int gang = ((CWindowMaskGUI*)gui)->gang_fader->get_value();
+ int gang = gui->gang_fader->get_value();
#ifdef USE_KEYFRAME_SPANNING
MaskAuto temp_keyframe(mwindow->edl, autos);
temp_keyframe.copy_data(keyframe);
int CWindowMaskFade::handle_event()
{
float v = atof(get_text());
- CWindowMaskGUI * mask_gui = (CWindowMaskGUI*)gui;
- mask_gui->fade_slider->update(v);
- return mask_gui->fade->update_value(v);
+ gui->fade_slider->update(v);
+ return gui->fade->update_value(v);
}
-CWindowMaskFadeSlider::CWindowMaskFadeSlider(MWindow *mwindow, CWindowToolGUI *gui,
+CWindowMaskFadeSlider::CWindowMaskFadeSlider(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y, int w)
: BC_ISlider(x, y, 0, w, w, -200, 200, 0)
{
else
last_v = v;
timer->update();
- CWindowMaskGUI *mask_gui = (CWindowMaskGUI*)gui;
- mask_gui->fade->BC_TumbleTextBox::update(v);
- return mask_gui->fade->update_value(v);
+ gui->fade->BC_TumbleTextBox::update(v);
+ return gui->fade->update_value(v);
}
int CWindowMaskFadeSlider::update(int64_t v)
}
CWindowMaskGangFader::CWindowMaskGangFader(MWindow *mwindow,
- CWindowToolGUI *gui, int x, int y)
+ CWindowMaskGUI *gui, int x, int y)
: BC_Toggle(x, y, mwindow->theme->get_image_set("gangpatch_data"), 0)
{
this->mwindow = mwindow;
return 1;
}
-CWindowMaskBeforePlugins::CWindowMaskBeforePlugins(CWindowToolGUI *gui, int x, int y)
+CWindowMaskBeforePlugins::CWindowMaskBeforePlugins(CWindowMaskGUI *gui, int x, int y)
: BC_CheckBox(x,
y,
1,
MaskAuto *keyframe;
SubMask *mask;
MaskPoint *point;
- ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 1);
+ gui->get_keyframe(track, autos, keyframe, mask, point, 1);
if (keyframe) {
int v = get_value();
}
-CWindowDisableOpenGLMasking::CWindowDisableOpenGLMasking(CWindowToolGUI *gui, int x, int y)
+CWindowDisableOpenGLMasking::CWindowDisableOpenGLMasking(CWindowMaskGUI *gui, int x, int y)
: BC_CheckBox(x, y, 1, _("Disable OpenGL masking"))
{
this->gui = gui;
MaskAuto *keyframe;
SubMask *mask;
MaskPoint *point;
- ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 1);
+ gui->get_keyframe(track, autos, keyframe, mask, point, 1);
if( keyframe ) {
int v = get_value();
SubMask *mask;
// Get existing keyframe
- ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
+ gui->get_keyframe(track, autos, keyframe, mask, point, 0);
if( track ) {
mwindow->undo->update_undo_before(_("del masks"), 0);
}
CWindowMaskGangFeather::CWindowMaskGangFeather(MWindow *mwindow,
- CWindowToolGUI *gui, int x, int y)
+ CWindowMaskGUI *gui, int x, int y)
: BC_Toggle(x, y, mwindow->theme->get_image_set("gangpatch_data"), 0)
{
this->mwindow = mwindow;
CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
: CWindowToolGUI(mwindow, thread,
- _(PROGRAM_NAME ": Mask"), 360, 620)
+ _(PROGRAM_NAME ": Mask"), 400, 660)
{
this->mwindow = mwindow;
this->thread = thread;
fade = 0;
feather = 0;
focused = 0;
- center_mark = 0;
markers = 1;
boundary = 1;
}
CWindowMaskGUI::~CWindowMaskGUI()
{
lock_window("CWindowMaskGUI::~CWindowMaskGUI");
+ done_event();
delete active_point;
delete fade;
delete feather;
void CWindowMaskGUI::create_objects()
{
int x = 10, y = 10, margin = mwindow->theme->widget_border;
- int clr_x = get_w()-x - CWindowMaskClrMask::calculate_w(mwindow);
- int del_x = clr_x-margin - CWindowMaskDelMask::calculate_w(this,_("Delete"));
- //MaskAuto *keyframe = 0;
- //Track *track = mwindow->cwindow->calculate_affected_track();
- //if(track)
- // keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], 0);
+ int clr_w = CWindowMaskClrMask::calculate_w(mwindow);
+ int clr_x = get_w()-x - clr_w;
+ int del_w = CWindowMaskDelMask::calculate_w(this,_("Delete"));
+ int del_x = clr_x-2*margin - del_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")));
y += title_bar->get_h() + margin;
- int x1 = x + 70;
- add_subwindow(mask_track = new CWindowMaskTrack(mwindow, this, x1, y, ""));
- y += mask_track->get_h() + margin;
+ BC_Title *title;
+ add_subwindow(title = new BC_Title(x,y, _("Track:")));
+ int x1 = x + 90;
+ 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->create_objects();
+ mask_on_track->set_tooltip(_("Video track"));
+ int x2 = x1 + mask_on_track->get_w();
+ add_subwindow(mask_track_tumbler = new CWindowMaskTrackTumbler(mwindow, this, x2, y));
+ mwindow->edl->local_session->solo_track_id = -1;
+ x2 = del_x + (del_w - CWindowMaskSoloTrack::calculate_w(this)) / 2;
+ add_subwindow(mask_solo_track = new CWindowMaskSoloTrack(mwindow, this, x2, 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")));
y += title_bar->get_h() + margin;
- BC_Title *title;
add_subwindow(title = new BC_Title(x, y, _("Mask:")));
- name = new CWindowMaskName(mwindow, this, x1, y, "");
- name->create_objects();
+ mask_name = new CWindowMaskName(mwindow, this, x1, y, "");
+ mask_name->create_objects();
+ mask_name->set_tooltip(_("Mask name"));
add_subwindow(clr_mask = new CWindowMaskClrMask(mwindow, this, clr_x, y));
add_subwindow(del_mask = new CWindowMaskDelMask(mwindow, this, del_x, y));
- y += name->get_h() + margin;
+ y += mask_name->get_h() + 2*margin;
+ add_subwindow(title = new BC_Title(x, y, _("Select:")));
int bw = 0, bh = 0;
BC_CheckBox::calculate_extents(this, &bw, &bh);
int bdx = bw + margin;
- int x2 = x;
+ x2 = x1;
for( int i=0; i<SUBMASKS; x2+=bdx, ++i ) {
int v = i == mwindow->edl->session->cwindow_mask ? 1 : 0;
mask_buttons[i] = new CWindowMaskButton(mwindow, this, x2, y, i, v);
x2 += margin;
add_subwindow(mask_thumbler = new CWindowMaskThumbler(mwindow, this, x2, y));
y += bh + margin;
- x2 = x;
+ x2 = x1;
for( int i=0; i<SUBMASKS; x2+=bdx, ++i ) {
char text[BCSTRLEN]; sprintf(text, "%d", i);
int tx = (bw - get_text_width(MEDIUMFONT, text)) / 2;
mask_blabels[i] = new BC_Title(x2+tx, y, text);
add_subwindow(mask_blabels[i]);
}
- y += mask_blabels[0]->get_h() + 2*margin;
+ y += mask_blabels[0]->get_h() + margin;
+ add_subwindow(unclr_mask = new CWindowMaskUnclear(mwindow, this, x, y, x1-x-2*margin));
+ x2 = x1;
+ for( int i=0; i<SUBMASKS; x2+=bdx, ++i ) {
+ mask_enables[i] = new CWindowMaskEnable(mwindow, this, x2, y, i, 1);
+ add_subwindow(mask_enables[i]);
+ }
+ y += mask_enables[0]->get_h() + 2*margin;
add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Fade & Feather")));
y += title_bar->get_h() + margin;
add_subwindow(title = new BC_Title(x, y, "Y:"));
focus_y = new CWindowCoord(this, x1, y, (float)0.0);
focus_y->create_objects();
- add_subwindow(draw_center = new CWindowMaskDrawCenter(mwindow, this, del_x, y));
y += focus_x->get_h() + 2*margin;
BC_Bar *bar;
add_subwindow(bar = new BC_Bar(x, y, get_w()-2*x));
"Shift+LMB: move an end point\n"
"Ctrl+LMB: move a control point\n"
"Alt+LMB: to drag translate the mask\n"
- "Shift+Key Delete to delete the mask\n"
+ "Shift+Key Delete to delete the point\n"
"Wheel Up/Dn: rotate around pointer\n"
"Shift+Wheel Up/Dn: scale around pointer\n"
"Shift+MMB: Toggle focus center at pointer")));
unlock_window();
}
+int CWindowMaskGUI::close_event()
+{
+ done_event();
+ return CWindowToolGUI::close_event();
+}
+
+void CWindowMaskGUI::done_event()
+{
+ int &solo_track_id = mwindow->edl->local_session->solo_track_id;
+ if( solo_track_id >= 0 ) {
+ solo_track_id = -1;
+ update_preview();
+ }
+}
+
void CWindowMaskGUI::get_keyframe(Track* &track,
- MaskAutos* &autos,
- MaskAuto* &keyframe,
- SubMask* &mask,
- MaskPoint* &point,
- int create_it)
+ MaskAutos* &autos, MaskAuto* &keyframe,
+ SubMask* &mask, MaskPoint* &point, int create_it)
{
autos = 0;
keyframe = 0;
- track = mwindow->cwindow->calculate_affected_track();
- if(track)
- {
+ track = mwindow->cwindow->calculate_mask_track();
+ if( !track )
+ track = mwindow->cwindow->calculate_affected_track();
+
+ if(track) {
autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(
autos,
create_it);
}
- if(keyframe)
- mask = keyframe->get_submask(mwindow->edl->session->cwindow_mask);
- else
- mask = 0;
+ mask = !keyframe ? 0 :
+ keyframe->get_submask(mwindow->edl->session->cwindow_mask);
point = 0;
- if(keyframe)
- {
- if(mwindow->cwindow->gui->affected_point < mask->points.total &&
- mwindow->cwindow->gui->affected_point >= 0)
- {
+ if( keyframe ) {
+ if( mwindow->cwindow->gui->affected_point < mask->points.total &&
+ mwindow->cwindow->gui->affected_point >= 0 ) {
point = mask->points.values[mwindow->cwindow->gui->affected_point];
}
}
MaskPoint *point;
//printf("CWindowMaskGUI::update 1\n");
get_keyframe(track, autos, keyframe, mask, point, 0);
-
- mask_track->update(!track ? "" : track->title);
- name->update_items(keyframe);
+ mask_on_track->set_back_color(!track || track->record ?
+ get_resources()->text_background :
+ get_resources()->text_background_disarmed);
+ mask_on_track->update_items();
+ mask_on_track->update(!track ? "" : track->title);
+ mask_name->update_items(keyframe);
const char *text = "";
int sz = !keyframe ? 0 : keyframe->masks.size();
int k = mwindow->edl->session->cwindow_mask;
if( k >= 0 && k < sz )
text = keyframe->masks[k]->name;
- name->update(text);
+ else
+ k = mwindow->edl->session->cwindow_mask = 0;
+ mask_name->update(text);
update_buttons(keyframe, k);
if( point ) {
x->update(point->x);
int64_t position_i = track->to_units(position, 0);
feather->update(autos->get_feather(position_i, k, PLAY_FORWARD));
fade->update(autos->get_fader(position_i, k, PLAY_FORWARD));
+ int show_mask = track->masks;
+ for( int i=0; i<SUBMASKS; ++i )
+ mask_enables[i]->update((show_mask>>i) & 1);
}
if( keyframe ) {
apply_before_plugins->update(keyframe->apply_before_plugins);
mwindow->undo->update_undo_after(_("mask point"), LOAD_AUTOMATION);
}
-void CWindowMaskGUI::update_preview()
-{
- unlock_window();
- CWindowGUI *cgui = mwindow->cwindow->gui;
- cgui->lock_window("CWindowMaskGUI::update_preview");
- cgui->sync_parameters(CHANGE_PARAMS, 0, 1);
- cgui->unlock_window();
- lock_window("CWindowMaskGUI::update_preview");
-}
-
void CWindowMaskGUI::set_focused(int v, float cx, float cy)
{
focus_x->update(cx);
// Called when window is visible
void show_tool();
void hide_tool();
+ void raise_tool();
void run();
void update_show_window();
// Update text boxes from keyframe here
virtual void update() {};
// Update EDL and preview only
- virtual void update_preview() {};
+ void update_preview(int changed_edl=0);
+ void draw_preview(int changed_edl);
int current_operation;
- int close_event();
+ virtual int close_event();
int keypress_event();
int translation_event();
CWindowCoord *x1, *y1, *width, *height;
};
-class CWindowMaskTrack : public BC_Title
+class CWindowMaskItem : public BC_ListBoxItem
{
public:
- CWindowMaskTrack(MWindow *mwindow, CWindowMaskGUI *gui,
- int x, int y, const char *text);
- ~CWindowMaskTrack();
- MWindow *mwindow;
- CWindowMaskGUI *gui;
+ CWindowMaskItem(const char *text, int id=-1, int color=-1)
+ : BC_ListBoxItem(text, color), id(id) {}
+ ~CWindowMaskItem() {}
+ int id;
};
class CWindowMaskItems : public ArrayList<BC_ListBoxItem*>
~CWindowMaskItems() { remove_all_objects(); }
};
+class CWindowMaskOnTrack : public BC_PopupTextBox
+{
+public:
+ CWindowMaskOnTrack(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y, int w, const char *text);
+ ~CWindowMaskOnTrack();
+ MWindow *mwindow;
+ CWindowMaskGUI *gui;
+ CWindowMaskItems track_items;
+
+ int handle_event();
+ void update_items();
+};
+
+class CWindowMaskTrackTumbler : public BC_Tumbler
+{
+public:
+ CWindowMaskTrackTumbler(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y);
+ ~CWindowMaskTrackTumbler();
+ int handle_up_event();
+ int handle_down_event();
+ int do_event(int dir);
+
+ MWindow *mwindow;
+ CWindowMaskGUI *gui;
+};
+
+
class CWindowMaskName : public BC_PopupTextBox
{
public:
void update_items(MaskAuto *keyframe);
};
+class CWindowMaskUnclear : public BC_GenericButton
+{
+public:
+ CWindowMaskUnclear(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y, int w);
+ int handle_event();
+ MWindow *mwindow;
+ CWindowMaskGUI *gui;
+};
+
+class CWindowMaskSoloTrack : public BC_CheckBox
+{
+public:
+ CWindowMaskSoloTrack(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y, int v);
+ static int calculate_w(BC_WindowBase *gui);
+ int handle_event();
+ MWindow *mwindow;
+ CWindowMaskGUI *gui;
+};
+
class CWindowMaskDelMask : public BC_GenericButton
{
public:
- CWindowMaskDelMask(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskDelMask(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskClrMask : public BC_Button
CWindowMaskGUI *gui;
};
+class CWindowMaskEnable : public BC_CheckBox
+{
+public:
+ CWindowMaskEnable(MWindow *mwindow, CWindowMaskGUI *gui,
+ int x, int y, int no, int v);
+ ~CWindowMaskEnable();
+
+ int handle_event();
+ MWindow *mwindow;
+ CWindowMaskGUI *gui;
+ int no;
+};
+
class CWindowMaskFade : public BC_TumbleTextBox
{
public:
- CWindowMaskFade(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskFade(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskFade();
int update(float v);
int update_value(float v);
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskFadeSlider : public BC_ISlider
{
public:
- CWindowMaskFadeSlider(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskFadeSlider(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y, int w);
~CWindowMaskFadeSlider();
int handle_event();
int update(int64_t v);
char *get_caption() { return 0; }
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
int stick;
float last_v;
Timer *timer;
class CWindowMaskGangFader : public BC_Toggle
{
public:
- CWindowMaskGangFader(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskGangFader(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskGangFader();
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskAffectedPoint : public BC_TumbleTextBox
{
public:
- CWindowMaskAffectedPoint(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskAffectedPoint(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskAffectedPoint();
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskFocus : public BC_CheckBox
{
public:
- CWindowMaskFocus(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskFocus(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskFocus();
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
-};
-
-class CWindowMaskDrawCenter : public BC_CheckBox
-{
-public:
- CWindowMaskDrawCenter(MWindow *mwindow, CWindowToolGUI *gui,
- int x, int y);
- ~CWindowMaskDrawCenter();
- int handle_event();
- MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskDrawMarkers : public BC_CheckBox
{
public:
- CWindowMaskDrawMarkers(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskDrawMarkers(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskDrawMarkers();
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskDrawBoundary : public BC_CheckBox
{
public:
- CWindowMaskDrawBoundary(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskDrawBoundary(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskDrawBoundary();
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskDelPoint : public BC_GenericButton
{
public:
- CWindowMaskDelPoint(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskDelPoint(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
int handle_event();
int keypress_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskFeather : public BC_TumbleTextBox
{
public:
- CWindowMaskFeather(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskFeather(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskFeather();
int update(float v);
int update_value(float v);
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskFeatherSlider : public BC_FSlider
{
public:
- CWindowMaskFeatherSlider(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskFeatherSlider(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y, int w, float v);
~CWindowMaskFeatherSlider();
int handle_event();
int update(float v);
char *get_caption() { return 0; }
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
int stick;
float last_v;
Timer *timer;
class CWindowMaskGangFeather : public BC_Toggle
{
public:
- CWindowMaskGangFeather(MWindow *mwindow, CWindowToolGUI *gui,
+ CWindowMaskGangFeather(MWindow *mwindow, CWindowMaskGUI *gui,
int x, int y);
~CWindowMaskGangFeather();
int handle_event();
MWindow *mwindow;
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskBeforePlugins : public BC_CheckBox
{
public:
- CWindowMaskBeforePlugins(CWindowToolGUI *gui,
+ CWindowMaskBeforePlugins(CWindowMaskGUI *gui,
int x, int y);
int handle_event();
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowDisableOpenGLMasking : public BC_CheckBox
{
public:
- CWindowDisableOpenGLMasking(CWindowToolGUI *gui,
+ CWindowDisableOpenGLMasking(CWindowMaskGUI *gui,
int x, int y);
int handle_event();
- CWindowToolGUI *gui;
+ CWindowMaskGUI *gui;
};
class CWindowMaskGUI : public CWindowToolGUI
~CWindowMaskGUI();
void create_objects();
void update();
+ int close_event();
+ void done_event();
void set_focused(int v, float cx, float cy);
void update_buttons(MaskAuto *keyframe, int k);
void handle_event();
void get_keyframe(Track* &track, MaskAutos* &autos, MaskAuto* &keyframe,
SubMask* &mask, MaskPoint* &point, int create_it);
- void update_preview();
- CWindowMaskTrack *mask_track;
- CWindowMaskName *name;
+ CWindowMaskOnTrack *mask_on_track;
+ CWindowMaskTrackTumbler *mask_track_tumbler;
+ CWindowMaskName *mask_name;
CWindowMaskButton *mask_buttons[SUBMASKS];
CWindowMaskThumbler *mask_thumbler;
BC_Title *mask_blabels[SUBMASKS];
+ CWindowMaskEnable *mask_enables[SUBMASKS];
+ CWindowMaskSoloTrack *mask_solo_track;
CWindowMaskDelMask *del_mask;
+ CWindowMaskUnclear *unclr_mask;
CWindowMaskClrMask *clr_mask;
CWindowMaskFade *fade;
CWindowMaskFadeSlider *fade_slider;
CWindowCoord *x, *y;
CWindowMaskFocus *focus;
int focused;
- CWindowMaskDrawCenter *draw_center;
- int center_mark;
CWindowMaskDrawMarkers *draw_markers;
int markers;
CWindowMaskDrawBoundary *draw_boundary;
~CWindowCameraGUI();
void create_objects();
void update();
- void update_preview();
// Update the keyframe from text boxes
void handle_event();
~CWindowProjectorGUI();
void create_objects();
void update();
- void update_preview();
void handle_event();
// BezierAuto* get_keyframe();
CWindowCoord *x, *y, *z;