version update
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / cwindowtool.C
index 04457c838d41b8364cb956f21c90fafaf0e68b8b..0b0b6069fa55c9697d286f2c4f4595b5853d0a4b 100644 (file)
@@ -1922,16 +1922,6 @@ int CWindowMaskDelPoint::handle_event()
        return 1;
 }
 
-int CWindowMaskDelPoint::keypress_event()
-{
-       if( get_keypress() == BACKSPACE ||
-           get_keypress() == DELETE )
-               return handle_event();
-       return 0;
-}
-
-
-
 
 CWindowMaskAffectedPoint::CWindowMaskAffectedPoint(MWindow *mwindow,
        CWindowMaskGUI *gui, int x, int y)
@@ -2018,9 +2008,9 @@ CWindowMaskScaleXY::~CWindowMaskScaleXY()
 int CWindowMaskScaleXY::handle_event()
 {
        gui->scale_mode = id;
-       gui->mask_scale_x->update(id == 0);
-       gui->mask_scale_y->update(id == 1);
-       gui->mask_scale_xy->update(id == 2);
+       gui->mask_scale_x->update(id == MASK_SCALE_X);
+       gui->mask_scale_y->update(id == MASK_SCALE_Y);
+       gui->mask_scale_xy->update(id == MASK_SCALE_XY);
        return 1;
 }
 
@@ -2351,6 +2341,24 @@ int CWindowMaskGangFocus::handle_event()
        return 1;
 }
 
+CWindowMaskGangPoint::CWindowMaskGangPoint(MWindow *mwindow,
+               CWindowMaskGUI *gui, int x, int y)
+ : BC_Toggle(x, y, mwindow->theme->get_image_set("gangpatch_data"), 0)
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+       set_tooltip(_("Gang points"));
+}
+
+CWindowMaskGangPoint::~CWindowMaskGangPoint()
+{
+}
+
+int CWindowMaskGangPoint::handle_event()
+{
+       return 1;
+}
+
 
 CWindowMaskSmoothButton::CWindowMaskSmoothButton(MWindow *mwindow, CWindowMaskGUI *gui,
                const char *tip, int type, int on, int x, int y, const char *images)
@@ -2579,7 +2587,7 @@ void CWindowMaskGUI::create_objects()
        }
        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, _("Presets shapes")));
+       add_subwindow(title_bar = new BC_TitleBar(x, y, get_w()-2*x, 20, 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")));
@@ -2600,11 +2608,11 @@ void CWindowMaskGUI::create_objects()
        add_subwindow(mask_normal = new CWindowMaskNormal(mwindow, this, t[1], y, 80));
 
        add_subwindow(mask_scale_x = new CWindowMaskScaleXY(mwindow, this,
-               t[5], y, theme->get_image_set("mask_scale_x"), 0, 0, _("xlate/scale x")));
+               t[5], y, theme->get_image_set("mask_scale_x"), 0, MASK_SCALE_X, _("xlate/scale x")));
        add_subwindow(mask_scale_y = new CWindowMaskScaleXY(mwindow, this,
-               t[6], y, theme->get_image_set("mask_scale_y"), 0, 1, _("xlate/scale y")));
+               t[6], y, theme->get_image_set("mask_scale_y"), 0, MASK_SCALE_Y, _("xlate/scale y")));
        add_subwindow(mask_scale_xy = new CWindowMaskScaleXY(mwindow, this,
-               t[7], y, theme->get_image_set("mask_scale_xy"), 1, 2, _("xlate/scale xy")));
+               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")));
        y += title_bar->get_h() + 2*margin;
@@ -2637,6 +2645,7 @@ void CWindowMaskGUI::create_objects()
        add_subwindow(mask_pnt_smooth = new CWindowMaskSmoothButton(mwindow, this,
                _("smooth point"), 0, 1, t[4], y, "mask_pnt_smooth_images"));
        add_subwindow(del_point = new CWindowMaskDelPoint(mwindow, this, del_x, y));
+       add_subwindow(gang_point = new CWindowMaskGangPoint(mwindow, this, clr_x, y));
        y += active_point->get_h() + margin;
        add_subwindow(title = new BC_Title(x, y, "X:"));
        this->x = new CWindowCoord(this, t[0], y, (float)0.0);
@@ -2687,7 +2696,6 @@ void CWindowMaskGUI::create_objects()
                "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 point\n"
                "Shift+MMB: Set Pivot Point at pointer\n"
                "Wheel: rotate around Pivot Point\n"
                "Shift+Wheel: scale around Pivot Point\n"
@@ -2791,44 +2799,53 @@ void CWindowMaskGUI::update()
 
 void CWindowMaskGUI::handle_event()
 {
-       Track *track;
-       MaskAuto *keyframe;
-       MaskAutos *autos;
-       SubMask *mask;
-       MaskPoint *point;
-       get_keyframe(track, autos, keyframe, mask, point, 0);
-
-       mwindow->undo->update_undo_before(_("mask point"), this);
-
-       if(point)
-       {
+       int redraw = 0;
+       if( event_caller == this->focus_x ||
+           event_caller == this->focus_y ) {
+               redraw = 1;
+       }
+       else if( event_caller == this->x ||
+                event_caller == this->y ) {
+               Track *track;
+               MaskAuto *keyframe;
+               MaskAutos *autos;
+               SubMask *mask;
+               MaskPoint *point;
+               get_keyframe(track, autos, keyframe, mask, point, 0);
+
+               mwindow->undo->update_undo_before(_("mask point"), this);
+
+               if( point ) {
+                       float px = atof(x->get_text());
+                       float py = atof(y->get_text());
+                       float dx = px - point->x, dy = py - point->y;
 #ifdef USE_KEYFRAME_SPANNING
 // Create temp keyframe
-               MaskAuto temp_keyframe(mwindow->edl, autos);
-               temp_keyframe.copy_data(keyframe);
+                       MaskAuto temp_keyframe(mwindow->edl, autos);
+                       temp_keyframe.copy_data(keyframe);
 // Get affected point in temp keyframe
-               mask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask);
-               if(mwindow->cwindow->gui->affected_point < mask->points.total &&
-                       mwindow->cwindow->gui->affected_point >= 0)
-               {
-                       point = mask->points.values[mwindow->cwindow->gui->affected_point];
-               }
-
-               if(point)
-               {
-                       point->x = atof(x->get_text());
-                       point->y = atof(y->get_text());
+                       mask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask);
+#endif
+                       MaskPoints &points = mask->points;
+                       int gang = gang_point->get_value();
+                       int k = mwindow->cwindow->gui->affected_point;
+                       int n = gang ? points.size() : k+1;
+                       for( int i=gang? 0 : k; i<n; ++i ) {
+                               if( i < 0 || i >= points.size() ) continue;
+                               MaskPoint *point = points[i];
+                               point->x += dx;  point->y += dy;
+                       }
+#ifdef USE_KEYFRAME_SPANNING
 // Commit to spanned keyframes
                        autos->update_parameter(&temp_keyframe);
-               }
-#else
-               point->x = atof(x->get_text());
-               point->y = atof(y->get_text());
 #endif
+               }
+               mwindow->undo->update_undo_after(_("mask point"), LOAD_AUTOMATION);
+               redraw = 1;
        }
 
-       update_preview();
-       mwindow->undo->update_undo_after(_("mask point"), LOAD_AUTOMATION);
+       if( redraw )
+               update_preview();
 }
 
 void CWindowMaskGUI::set_focused(int v, float cx, float cy)
@@ -3302,7 +3319,7 @@ CWindowMaskDelete::CWindowMaskDelete(MWindow *mwindow,
 {
        this->mwindow = mwindow;
        this->gui = gui;
-       set_tooltip(_("delete preset"));
+       set_tooltip(_("Delete preset"));
 }
 
 int CWindowMaskDelete::handle_event()