X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvpatchgui.C;h=dca01ad3a6806633a1344d8a073598f3a72fa4c8;hb=d077044be445c058142c2b92b981c53898a2c112;hp=57c862d30cfeb4e68688aee153d6188520cfe8dd;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/vpatchgui.C b/cinelerra-5.1/cinelerra/vpatchgui.C index 57c862d3..dca01ad3 100644 --- a/cinelerra-5.1/cinelerra/vpatchgui.C +++ b/cinelerra-5.1/cinelerra/vpatchgui.C @@ -25,6 +25,7 @@ #include "edlsession.h" #include "floatauto.h" #include "floatautos.h" +#include "gwindowgui.h" #include "intauto.h" #include "intautos.h" #include "language.h" @@ -103,16 +104,9 @@ int VPatchGUI::update(int x, int y) } else { - FloatAuto *previous = 0, *next = 0; - double unit_position = mwindow->edl->local_session->get_selectionstart(1); - unit_position = mwindow->edl->align_to_frame(unit_position, 0); - unit_position = vtrack->to_units(unit_position, 0); - int value = (int)((FloatAutos*)vtrack->automation->autos[AUTOMATION_FADE])->get_value( - (int64_t)unit_position, PLAY_FORWARD, previous, next); - fade->update(fade->get_w(), value, + fade->update(fade->get_w(), mwindow->get_float_auto(this, AUTOMATION_FADE)->get_value(), mwindow->edl->local_session->automation_mins[AUTOGROUPTYPE_VIDEO_FADE], mwindow->edl->local_session->automation_maxs[AUTOGROUPTYPE_VIDEO_FADE]); -// fade->update((int)fade->get_keyframe(mwindow, this)->value); } } else @@ -137,7 +131,7 @@ int VPatchGUI::update(int x, int y) } else { - mode->update(mode->get_keyframe(mwindow, this)->value); + mode->update(mwindow->get_int_auto(this, AUTOMATION_MODE)->value); nudge->update(); } } @@ -179,14 +173,10 @@ void VPatchGUI::synchronize_fade(float value_change) VFadePatch::VFadePatch(MWindow *mwindow, VPatchGUI *patch, int x, int y, int w) - : BC_ISlider(x, - y, - 0, - w, - w, - mwindow->edl->local_session->automation_mins[AUTOGROUPTYPE_VIDEO_FADE], - mwindow->edl->local_session->automation_maxs[AUTOGROUPTYPE_VIDEO_FADE], - (int64_t)get_keyframe(mwindow, patch)->get_value()) + : BC_ISlider(x, y, 0, w, w, + mwindow->edl->local_session->automation_mins[AUTOGROUPTYPE_VIDEO_FADE], + mwindow->edl->local_session->automation_maxs[AUTOGROUPTYPE_VIDEO_FADE], + (int64_t)mwindow->get_float_auto(patch,AUTOMATION_FADE)->get_value()) { this->mwindow = mwindow; this->patch = patch; @@ -240,38 +230,70 @@ int VFadePatch::handle_event() return 1; } -FloatAuto* VFadePatch::get_keyframe(MWindow *mwindow, VPatchGUI *patch) + +VKeyFadePatch::VKeyFadePatch(MWindow *mwindow, VPatchGUI *patch, int x, int y) + : BC_SubWindow(x,y, patch->patchbay->get_w(),20, + GWindowGUI::auto_colors[AUTOMATION_FADE]) +{ + this->mwindow = mwindow; + this->patch = patch; +} + +void VKeyFadePatch::create_objects() +{ + vkey_fade_value = new VKeyFadeValue(this); + add_subwindow(vkey_fade_value); + vkey_fade_value->activate(); + show_window(); +} + +VKeyFadeValue::VKeyFadeValue(VKeyFadePatch *vkey_fade_patch) + : VFadePatch(vkey_fade_patch->mwindow, vkey_fade_patch->patch, + 0,0, vkey_fade_patch->get_w()) +{ + this->vkey_fade_patch = vkey_fade_patch; +} + +int VKeyFadeValue::button_release_event() +{ + VFadePatch::button_release_event(); + return 0; +} + +int VKeyFadeValue::handle_event() { - double unit_position = mwindow->edl->local_session->get_selectionstart(1); - unit_position = mwindow->edl->align_to_frame(unit_position, 0); - unit_position = patch->vtrack->to_units(unit_position, 0); - Auto *current = 0; - - return (FloatAuto*)patch->vtrack->automation->autos[AUTOMATION_FADE]->get_prev_auto( - (int64_t)unit_position, - PLAY_FORWARD, - current); + VPatchGUI *patch = vkey_fade_patch->patch; + int ret = VFadePatch::handle_event(); + VFadePatch *fade = patch->fade; + if( fade ) + fade->update(get_value()); + return ret; } + VModePatch::VModePatch(MWindow *mwindow, VPatchGUI *patch, int x, int y) - : BC_PopupMenu(x, - y, - patch->patchbay->mode_icons[0]->get_w() + 20, - "", - 1, - mwindow->theme->get_image_set("mode_popup", 0), - 10) + : BC_PopupMenu(x, y, patch->patchbay->mode_icons[0]->get_w() + 20, + "", 1, mwindow->theme->get_image_set("mode_popup", 0), 10) { this->mwindow = mwindow; this->patch = patch; - this->mode = get_keyframe(mwindow, patch)->value; + this->mode = mwindow->get_int_auto(patch, AUTOMATION_MODE)->value; set_icon(patch->patchbay->mode_to_icon(this->mode)); set_tooltip(_("Overlay mode")); } +VModePatch::VModePatch(MWindow *mwindow, VPatchGUI *patch) + : BC_PopupMenu(0, 0, 0, "", 0) +{ + this->mwindow = mwindow; + this->patch = patch; + this->mode = mwindow->get_int_auto(patch, AUTOMATION_MODE)->value; +} + + int VModePatch::handle_event() { // Set menu items @@ -308,24 +330,48 @@ int VModePatch::handle_event() return 1; } -IntAuto* VModePatch::get_keyframe(MWindow *mwindow, VPatchGUI *patch) -{ - Auto *current = 0; - double unit_position = mwindow->edl->local_session->get_selectionstart(1); - unit_position = mwindow->edl->align_to_frame(unit_position, 0); - unit_position = patch->vtrack->to_units(unit_position, 0); - - return (IntAuto*)patch->vtrack->automation->autos[AUTOMATION_MODE]->get_prev_auto( - (int64_t)unit_position, - PLAY_FORWARD, - current); -} - - void VModePatch::create_objects() { - for( int mode=0; modeadd_submenu(submenu = new VModePatchSubMenu(mode_item)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_ADDITION), TRANSFER_ADDITION)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SUBTRACT), TRANSFER_SUBTRACT)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DIVIDE), TRANSFER_DIVIDE)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_MULTIPLY), TRANSFER_MULTIPLY)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_REPLACE), TRANSFER_REPLACE)); + add_item(mode_item = new VModePatchItem(this, _("PorterDuff..."), -1)); + mode_item->add_submenu(submenu = new VModePatchSubMenu(mode_item)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DST), TRANSFER_DST)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DST_ATOP), TRANSFER_DST_ATOP)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DST_IN), TRANSFER_DST_IN)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DST_OUT), TRANSFER_DST_OUT)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DST_OVER), TRANSFER_DST_OVER)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SRC), TRANSFER_SRC)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SRC_ATOP), TRANSFER_SRC_ATOP)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SRC_IN), TRANSFER_SRC_IN)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SRC_OUT), TRANSFER_SRC_OUT)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SRC_OVER), TRANSFER_SRC_OVER)); + add_item(mode_item = new VModePatchItem(this, _("Logical..."), -1)); + mode_item->add_submenu(submenu = new VModePatchSubMenu(mode_item)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_MIN), TRANSFER_MIN)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_MAX), TRANSFER_MAX)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DARKEN), TRANSFER_DARKEN)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_LIGHTEN), TRANSFER_LIGHTEN)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_AND), TRANSFER_AND)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_OR), TRANSFER_OR)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_XOR), TRANSFER_XOR)); + add_item(mode_item = new VModePatchItem(this, _("Graphic Art..."), -1)); + mode_item->add_submenu(submenu = new VModePatchSubMenu(mode_item)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_OVERLAY), TRANSFER_OVERLAY)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SCREEN), TRANSFER_SCREEN)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_BURN), TRANSFER_BURN)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DODGE), TRANSFER_DODGE)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_DIFFERENCE),TRANSFER_DIFFERENCE)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_HARDLIGHT),TRANSFER_HARDLIGHT)); + submenu->add_submenuitem(new VModeSubMenuItem(submenu, mode_to_text(TRANSFER_SOFTLIGHT),TRANSFER_SOFTLIGHT)); } void VModePatch::update(int mode) @@ -335,6 +381,13 @@ void VModePatch::update(int mode) { VModePatchItem *item = (VModePatchItem*)get_item(i); item->set_checked(item->mode == mode); + VModePatchSubMenu *submenu = (VModePatchSubMenu *)item->get_submenu(); + if( !submenu ) continue; + int n = submenu->total_items(); + for( int j=0; jget_item(j); + subitem->set_checked(subitem->mode == mode); + } } } @@ -342,29 +395,36 @@ void VModePatch::update(int mode) const char* VModePatch::mode_to_text(int mode) { switch(mode) { - case TRANSFER_NORMAL: return _("Normal"); - case TRANSFER_ADDITION: return _("Addition"); - case TRANSFER_SUBTRACT: return _("Subtract"); - case TRANSFER_MULTIPLY: return _("Multiply"); - case TRANSFER_DIVIDE: return _("Divide"); - case TRANSFER_REPLACE: return _("Replace"); - case TRANSFER_MAX: return _("Max"); - case TRANSFER_MIN: return _("Min"); - case TRANSFER_AVERAGE: return _("Average"); - case TRANSFER_DARKEN: return _("Darken"); - case TRANSFER_LIGHTEN: return _("Lighten"); - case TRANSFER_DST: return _("Dst"); - case TRANSFER_DST_ATOP: return _("DstAtop"); - case TRANSFER_DST_IN: return _("DstIn"); - case TRANSFER_DST_OUT: return _("DstOut"); - case TRANSFER_DST_OVER: return _("DstOver"); - case TRANSFER_SRC: return _("Src"); - case TRANSFER_SRC_ATOP: return _("SrcAtop"); - case TRANSFER_SRC_IN: return _("SrcIn"); - case TRANSFER_SRC_OUT: return _("SrcOut"); - case TRANSFER_SRC_OVER: return _("SrcOver"); - case TRANSFER_OR: return _("Or"); - case TRANSFER_XOR: return _("Xor"); + case TRANSFER_NORMAL: return _("Normal"); + case TRANSFER_ADDITION: return _("Addition"); + case TRANSFER_SUBTRACT: return _("Subtract"); + case TRANSFER_MULTIPLY: return _("Multiply"); + case TRANSFER_DIVIDE: return _("Divide"); + case TRANSFER_REPLACE: return _("Replace"); + case TRANSFER_MAX: return _("Max"); + case TRANSFER_MIN: return _("Min"); + case TRANSFER_DARKEN: return _("Darken"); + case TRANSFER_LIGHTEN: return _("Lighten"); + case TRANSFER_DST: return _("Dst"); + case TRANSFER_DST_ATOP: return _("DstAtop"); + case TRANSFER_DST_IN: return _("DstIn"); + case TRANSFER_DST_OUT: return _("DstOut"); + case TRANSFER_DST_OVER: return _("DstOver"); + case TRANSFER_SRC: return _("Src"); + case TRANSFER_SRC_ATOP: return _("SrcAtop"); + case TRANSFER_SRC_IN: return _("SrcIn"); + case TRANSFER_SRC_OUT: return _("SrcOut"); + case TRANSFER_SRC_OVER: return _("SrcOver"); + case TRANSFER_AND: return _("AND"); + case TRANSFER_OR: return _("OR"); + case TRANSFER_XOR: return _("XOR"); + case TRANSFER_OVERLAY: return _("Overlay"); + case TRANSFER_SCREEN: return _("Screen"); + case TRANSFER_BURN: return _("Burn"); + case TRANSFER_DODGE: return _("Dodge"); + case TRANSFER_HARDLIGHT: return _("Hardlight"); + case TRANSFER_SOFTLIGHT: return _("Softlight"); + case TRANSFER_DIFFERENCE: return _("Difference"); } return _("Normal"); } @@ -381,8 +441,63 @@ VModePatchItem::VModePatchItem(VModePatch *popup, const char *text, int mode) int VModePatchItem::handle_event() { + if( mode >= 0 ) { + popup->mode = mode; +// popup->set_icon(popup->patch->patchbay->mode_to_icon(mode)); + popup->handle_event(); + } + return 1; +} + +VModePatchSubMenu::VModePatchSubMenu(VModePatchItem *mode_item) +{ + this->mode_item = mode_item; +} +VModePatchSubMenu::~VModePatchSubMenu() +{ +} + +VModeSubMenuItem::VModeSubMenuItem(VModePatchSubMenu *submenu, const char *text, int mode) + : BC_MenuItem(text) +{ + this->submenu = submenu; + this->mode = mode; + VModePatch *popup = submenu->mode_item->popup; + if(this->mode == popup->mode) set_checked(1); +} +VModeSubMenuItem::~VModeSubMenuItem() +{ +} + +int VModeSubMenuItem::handle_event() +{ + VModePatch *popup = submenu->mode_item->popup; popup->mode = mode; // popup->set_icon(popup->patch->patchbay->mode_to_icon(mode)); popup->handle_event(); return 1; } + + +VKeyModePatch::VKeyModePatch(MWindow *mwindow, VPatchGUI *patch) + : VModePatch(mwindow, patch) +{ +} + +int VKeyModePatch::button_release_event() +{ + VModePatch::button_release_event(); + return 0; +} + +int VKeyModePatch::handle_event() +{ + int ret = VModePatch::handle_event(); + VModePatch *mode = patch->mode; + if( mode ) + mode->update(this->mode); + return ret; +} + + +