X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcwindowtool.C;h=d3d0b4945e6ef936b5a405de96794f68a0eee5e8;hp=ad8aa8d7402baf210192c547b302a7cb5005f26d;hb=da1e39d85e138b0d552e932d875c05e8dc743244;hpb=7ead9f7382846e81c2f8efb25780014e5f8834c3 diff --git a/cinelerra-5.1/cinelerra/cwindowtool.C b/cinelerra-5.1/cinelerra/cwindowtool.C index ad8aa8d7..d3d0b494 100644 --- a/cinelerra-5.1/cinelerra/cwindowtool.C +++ b/cinelerra-5.1/cinelerra/cwindowtool.C @@ -1482,8 +1482,20 @@ int CWindowProjectorBottom::handle_event() } -CWindowMaskName::CWindowMaskName(MWindow *mwindow, - CWindowToolGUI *gui, int x, int y, const char *text) +CWindowMaskTrack::CWindowMaskTrack(MWindow *mwindow, CWindowMaskGUI *gui, + int x, int y, const char *text) + : BC_Title(x, y, text, MEDIUMFONT, get_resources()->button_highlighted) +{ + this->mwindow = mwindow; + this->gui = gui; +} + +CWindowMaskTrack::~CWindowMaskTrack() +{ +} + +CWindowMaskName::CWindowMaskName(MWindow *mwindow, CWindowMaskGUI *gui, + int x, int y, const char *text) : BC_PopupTextBox(gui, 0, text, x, y, 100, 160) { this->mwindow = mwindow; @@ -1502,7 +1514,7 @@ int CWindowMaskName::handle_event() SubMask *mask; MaskPoint *point; //printf("CWindowMaskGUI::update 1\n"); - ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0); + gui->get_keyframe(track, autos, keyframe, mask, point, 0); if( track ) { int k = get_number(); if( k < 0 ) k = mwindow->edl->session->cwindow_mask; @@ -1536,16 +1548,78 @@ int CWindowMaskName::handle_event() void CWindowMaskName::update_items(MaskAuto *keyframe) { mask_items.remove_all_objects(); - int sz = keyframe->masks.size(); - for( int i=0; imasks.get(i); - char *text = sub_mask->name; + int sz = !keyframe ? 0 : keyframe->masks.size(); + for( int i=0; imasks.get(i); + strncpy(text, sub_mask->name, sizeof(text)); + } + else + sprintf(text, "%d", i); mask_items.append(new BC_ListBoxItem(text)); } update_list(&mask_items); } +CWindowMaskButton::CWindowMaskButton(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; +} + +CWindowMaskButton::~CWindowMaskButton() +{ +} + +int CWindowMaskButton::handle_event() +{ + mwindow->edl->session->cwindow_mask = no; + gui->name->update(gui->name->mask_items[no]->get_text()); + gui->update(); + gui->update_preview(); + return 1; +} + +CWindowMaskThumbler::CWindowMaskThumbler(MWindow *mwindow, CWindowMaskGUI *gui, + int x, int y) + : BC_Tumbler(x, y) +{ + this->mwindow = mwindow; + this->gui = gui; +} + +CWindowMaskThumbler::~CWindowMaskThumbler() +{ +} + +int CWindowMaskThumbler::handle_up_event() +{ + return do_event(1); +} + +int CWindowMaskThumbler::handle_down_event() +{ + return do_event(-1); +} + +int CWindowMaskThumbler::do_event(int dir) +{ + int k = mwindow->edl->session->cwindow_mask; + 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->update(); + gui->update_preview(); + return 1; +} + + CWindowMaskDelMask::CWindowMaskDelMask(MWindow *mwindow, CWindowToolGUI *gui, int x, int y) : BC_GenericButton(x, y, _("Delete")) @@ -1709,7 +1783,7 @@ int CWindowMaskAffectedPoint::handle_event() int active_point = affected_point; if( affected_point >= total_points ) affected_point = total_points - 1; - else if( affected_point < 0 ) + if( affected_point < 0 ) affected_point = 0; if( active_point != affected_point ) update((int64_t)affected_point); @@ -1725,6 +1799,7 @@ CWindowMaskFocus::CWindowMaskFocus(MWindow *mwindow, CWindowToolGUI *gui, int x, { this->mwindow = mwindow; this->gui = gui; + set_tooltip(_("Center for rotate/scale")); } CWindowMaskFocus::~CWindowMaskFocus() @@ -1739,11 +1814,32 @@ int CWindowMaskFocus::handle_event() 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->update(); + gui->update_preview(); + return 1; +} + CWindowMaskDrawMarkers::CWindowMaskDrawMarkers(MWindow *mwindow, CWindowToolGUI *gui, int x, int y) : BC_CheckBox(x, y, ((CWindowMaskGUI*)gui)->markers, _("Markers")) { this->mwindow = mwindow; this->gui = gui; + set_tooltip("Display points"); } CWindowMaskDrawMarkers::~CWindowMaskDrawMarkers() @@ -1763,6 +1859,7 @@ CWindowMaskDrawBoundary::CWindowMaskDrawBoundary(MWindow *mwindow, CWindowToolGU { this->mwindow = mwindow; this->gui = gui; + set_tooltip("Display mask outline"); } CWindowMaskDrawBoundary::~CWindowMaskDrawBoundary() @@ -2155,7 +2252,7 @@ int CWindowMaskGangFeather::handle_event() CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread) : CWindowToolGUI(mwindow, thread, - _(PROGRAM_NAME ": Mask"), 360, 440) + _(PROGRAM_NAME ": Mask"), 360, 620) { this->mwindow = mwindow; this->thread = thread; @@ -2163,6 +2260,7 @@ CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread) fade = 0; feather = 0; focused = 0; + center_mark = 0; markers = 1; boundary = 1; } @@ -2186,18 +2284,49 @@ void CWindowMaskGUI::create_objects() // keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], 0); 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; + 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:"))); - int x1 = x + 70; name = new CWindowMaskName(mwindow, this, x1, y, ""); name->create_objects(); 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; + + int bw = 0, bh = 0; + BC_CheckBox::calculate_extents(this, &bw, &bh); + int bdx = bw + margin; + int x2 = x; + for( int i=0; iedl->session->cwindow_mask ? 1 : 0; + mask_buttons[i] = new CWindowMaskButton(mwindow, this, x2, y, i, v); + add_subwindow(mask_buttons[i]); + } + x2 += margin; + add_subwindow(mask_thumbler = new CWindowMaskThumbler(mwindow, this, x2, y)); + y += bh + margin; + x2 = x; + for( int i=0; iget_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, _("Fade:"))); fade = new CWindowMaskFade(mwindow, this, x1, y); fade->create_objects(); - int x2 = x1 + fade->get_w() + 2*margin; + x2 = x1 + fade->get_w() + 2*margin; int w2 = clr_x-2*margin - x2; add_subwindow(fade_slider = new CWindowMaskFadeSlider(mwindow, this, x2, y, w2)); add_subwindow(gang_fader = new CWindowMaskGangFader(mwindow, this, clr_x, y)); @@ -2209,7 +2338,9 @@ void CWindowMaskGUI::create_objects() feather_slider = new CWindowMaskFeatherSlider(mwindow, this, x2, y, w2, 0); add_subwindow(feather_slider); add_subwindow(gang_feather = new CWindowMaskGangFeather(mwindow, this, clr_x, y)); - y += feather->get_h() + 3*margin; + y += feather->get_h() + 2*margin; + add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Mask Points"))); + y += title_bar->get_h() + margin; add_subwindow(title = new BC_Title(x, y, _("Point:"))); active_point = new CWindowMaskAffectedPoint(mwindow, this, x1, y); @@ -2225,10 +2356,9 @@ void CWindowMaskGUI::create_objects() this->y = new CWindowCoord(this, x1, y, (float)0.0); this->y->create_objects(); add_subwindow(draw_boundary = new CWindowMaskDrawBoundary(mwindow, this, del_x, y)); - y += this->y->get_h() + margin; - BC_Bar *bar; - add_subwindow(bar = new BC_Bar(x, y, get_w()-2*x)); - y += bar->get_h() + margin; + y += this->y->get_h() + 2*margin; + add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 10, _("Pivot Point"))); + y += title_bar->get_h() + margin; add_subwindow(title = new BC_Title(x, y, "X:")); focus_x = new CWindowCoord(this, x1, y, (float)0.0); @@ -2238,7 +2368,11 @@ void CWindowMaskGUI::create_objects() add_subwindow(title = new BC_Title(x, y, "Y:")); focus_y = new CWindowCoord(this, x1, y, (float)0.0); focus_y->create_objects(); - y += focus_x->get_h() + margin; + 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)); + y += bar->get_h() + margin; add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, 10, y)); y += this->apply_before_plugins->get_h(); add_subwindow(this->disable_opengl_masking = new CWindowDisableOpenGLMasking(this, 10, y)); @@ -2304,35 +2438,30 @@ void CWindowMaskGUI::update() //printf("CWindowMaskGUI::update 1\n"); get_keyframe(track, autos, keyframe, mask, point, 0); - double position = mwindow->edl->local_session->get_selectionstart(1); - position = mwindow->edl->align_to_frame(position, 0); - if(track) - { + mask_track->update(!track ? "" : track->title); + 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); + update_buttons(keyframe, k); + if( point ) { + x->update(point->x); + y->update(point->y); + } + if( track ) { + double position = mwindow->edl->local_session->get_selectionstart(1); int64_t position_i = track->to_units(position, 0); - - if(point) { - x->update(point->x); - y->update(point->y); - } - - if(mask) { - int k = mwindow->edl->session->cwindow_mask; - feather->update(autos->get_feather(position_i, k, PLAY_FORWARD)); - fade->update(autos->get_fader(position_i, k, PLAY_FORWARD)); - apply_before_plugins->update(keyframe->apply_before_plugins); - disable_opengl_masking->update(keyframe->disable_opengl_masking); - } + feather->update(autos->get_feather(position_i, k, PLAY_FORWARD)); + fade->update(autos->get_fader(position_i, k, PLAY_FORWARD)); } - - active_point->update((int64_t)mwindow->cwindow->gui->affected_point); - const char *text = ""; if( keyframe ) { - name->update_items(keyframe); - int k = mwindow->edl->session->cwindow_mask; - if( k >= 0 && k < keyframe->masks.size() ) - text = keyframe->masks[k]->name; + apply_before_plugins->update(keyframe->apply_before_plugins); + disable_opengl_masking->update(keyframe->disable_opengl_masking); } - name->update(text); + active_point->update((int64_t)mwindow->cwindow->gui->affected_point); } void CWindowMaskGUI::handle_event() @@ -2394,12 +2523,24 @@ void CWindowMaskGUI::set_focused(int v, float cx, float cy) focus->update(focused = v); } +void CWindowMaskGUI::update_buttons(MaskAuto *keyframe, int k) +{ + int text_color = get_resources()->default_text_color; + int high_color = get_resources()->button_highlighted; + for( int i=0; iget_submask(i); + if( submask && submask->points.size() ) + color = high_color; + } + mask_blabels[i]->set_color(color); + mask_buttons[i]->update(i==k ? 1 : 0); + } +} + CWindowRulerGUI::CWindowRulerGUI(MWindow *mwindow, CWindowTool *thread) - : CWindowToolGUI(mwindow, - thread, - _(PROGRAM_NAME ": Ruler"), - 320, - 240) + : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Ruler"), 320, 240) { }