X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvpatchgui.C;h=8b9c0b4766d626c5f9c5b05e38999131d61f2363;hb=c279e21fc2394a7908bbd1ba8c79b116fe9fb14a;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..8b9c0b47 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" @@ -39,13 +40,11 @@ #include "trackcanvas.h" #include "vpatchgui.h" #include "vtrack.h" +#include "vwindow.h" #include - - - VPatchGUI::VPatchGUI(MWindow *mwindow, PatchBay *patchbay, VTrack *track, int x, int y) : PatchGUI(mwindow, patchbay, track, x, y) { @@ -57,8 +56,8 @@ VPatchGUI::VPatchGUI(MWindow *mwindow, PatchBay *patchbay, VTrack *track, int x, VPatchGUI::~VPatchGUI() { - if(fade) delete fade; - if(mode) delete mode; + if( fade ) delete fade; + if( mode ) delete mode; } void VPatchGUI::create_objects() @@ -71,20 +70,16 @@ int VPatchGUI::reposition(int x, int y) //int x1 = 0; int y1 = PatchGUI::reposition(x, y); - if(fade) fade->reposition_window(fade->get_x(), - y1 + y); - + if( fade ) + fade->reposition_window(fade->get_x(), y1+y); y1 += mwindow->theme->fade_h; - - if(mode) mode->reposition_window(mode->get_x(), - y1 + y); - - if(nudge) nudge->reposition_window(nudge->get_x(), - y1 + y); - - + if( mix ) + mix->reposition_window(mix->get_x(), y1+y); + if( mode ) + mode->reposition_window(mode->get_x(), y1+y); + if( nudge ) + nudge->reposition_window(nudge->get_x(), y1+y); y1 += mwindow->theme->mode_h; - return y1; } @@ -94,75 +89,51 @@ int VPatchGUI::update(int x, int y) int x1 = 0; int y1 = PatchGUI::update(x, y); - if(fade) - { - if(h - y1 < mwindow->theme->fade_h) - { + if( fade ) { + if( h - y1 < mwindow->theme->fade_h ) { delete fade; fade = 0; } - 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, + else { + 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 - if(h - y1 >= mwindow->theme->fade_h) - { - patchbay->add_subwindow(fade = new VFadePatch(mwindow, - this, - x1 + x, - y1 + y, + if( h - y1 >= mwindow->theme->fade_h ) { + patchbay->add_subwindow(fade = new VFadePatch(mwindow, this, x1+x, y1+y, patchbay->get_w() - 10)); } y1 += mwindow->theme->fade_h; - if(mode) - { - if(h - y1 < mwindow->theme->mode_h) - { - delete mode; - mode = 0; - delete nudge; - nudge = 0; + if( mode ) { + if( h - y1 < mwindow->theme->mode_h ) { + delete mix; mix = 0; + delete mode; mode = 0; + delete nudge; nudge = 0; } - else - { - mode->update(mode->get_keyframe(mwindow, this)->value); + else { + if( mwindow->session->selected_zwindow >= 0 ) { + int v = mwindow->mixer_track_active(track); + mix->update(v); + } + mode->update(mwindow->get_int_auto(this, AUTOMATION_MODE)->value); nudge->update(); } } else - if(h - y1 >= mwindow->theme->mode_h) - { - patchbay->add_subwindow(mode = new VModePatch(mwindow, - this, - x1 + x, - y1 + y)); + if( h - y1 >= mwindow->theme->mode_h ) { + patchbay->add_subwindow(mix = new VMixPatch(mwindow, this, x1+x, y1+y+5)); + x1 += mix->get_w(); + patchbay->add_subwindow(mode = new VModePatch(mwindow, this, x1+x, y1+y)); mode->create_objects(); - x1 += mode->get_w() + 10; - patchbay->add_subwindow(nudge = new NudgePatch(mwindow, - this, - x1 + x, - y1 + y, - patchbay->get_w() - x1 - 10)); + x1 += mode->get_w(); + patchbay->add_subwindow(nudge = new NudgePatch(mwindow, this, x1+x, y1+y, + patchbay->get_w() - x1-x - 10)); } - - - - y1 += mwindow->theme->mode_h; - return y1; } @@ -170,8 +141,7 @@ int VPatchGUI::update(int x, int y) void VPatchGUI::synchronize_fade(float value_change) { - if(fade && !change_source) - { + if( fade && !change_source ) { fade->update(Units::to_int64(fade->get_value() + value_change)); fade->update_edl(); } @@ -179,14 +149,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; @@ -213,8 +179,7 @@ float VFadePatch::update_edl() int VFadePatch::handle_event() { - if(shift_down()) - { + if( shift_down() ) { update(100); set_tooltip(get_caption()); } @@ -223,7 +188,7 @@ int VFadePatch::handle_event() float change = update_edl(); - if(patch->track->gang && patch->track->record) + if( patch->track->gang && patch->track->record ) patch->patchbay->synchronize_faders(change, TRACK_VIDEO, patch->track); patch->change_source = 0; @@ -233,52 +198,80 @@ int VFadePatch::handle_event() mwindow->restart_brender(); mwindow->sync_parameters(CHANGE_PARAMS); mwindow->gui->lock_window("VFadePatch::handle_event"); - if(mwindow->edl->session->auto_conf->autos[AUTOMATION_FADE]) - { + if( mwindow->edl->session->auto_conf->autos[AUTOMATION_FADE] ) { mwindow->gui->draw_overlays(1); } 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]) { - 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; + this->mwindow = mwindow; + this->patch = patch; +} - return (FloatAuto*)patch->vtrack->automation->autos[AUTOMATION_FADE]->get_prev_auto( - (int64_t)unit_position, - PLAY_FORWARD, - current); +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() +{ + 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 -// for(int i = 0; i < total_items(); i++) +// for( int i = 0; i < total_items(); i++ ) // { // VModePatchItem *item = (VModePatchItem*)get_item(i); -// if(item->mode == mode) +// if( item->mode == mode ) // item->set_checked(1); // else // item->set_checked(0); @@ -300,71 +293,107 @@ int VModePatch::handle_event() mwindow->sync_parameters(CHANGE_PARAMS); - if(mwindow->edl->session->auto_conf->autos[AUTOMATION_MODE]) - { + if( mwindow->edl->session->auto_conf->autos[AUTOMATION_MODE] ) { mwindow->gui->draw_overlays(1); } mwindow->session->changes_made = 1; 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) { set_icon(patch->patchbay->mode_to_icon(mode)); - for(int i = 0; i < total_items(); i++) - { + for( int i = 0; i < total_items(); i++ ) { 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); + } } } 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"); + 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_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"); } @@ -376,13 +405,77 @@ VModePatchItem::VModePatchItem(VModePatch *popup, const char *text, int mode) { this->popup = popup; this->mode = mode; - if(this->mode == popup->mode) set_checked(1); + if( this->mode == popup->mode ) set_checked(1); } 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; +} + + +VMixPatch::VMixPatch(MWindow *mwindow, VPatchGUI *patch, int x, int y) + : MixPatch(mwindow, patch, x, y) +{ + set_tooltip(_("Mixer")); +} + +VMixPatch::~VMixPatch() +{ +} +