ripple edge drag_handle tweaks, sync_parameter fix, shuttlerc, shortcuts
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / cwindowgui.C
index 2150e061e6738a7aa7eddc2dd9fff892f08d1095..02ed52d32ad93ae559acb39554362dd0ce85e5d1 100644 (file)
@@ -572,10 +572,7 @@ int CWindowGUI::keypress_event()
 
        if( !result && cwindow_operation < 0 && ctrl_down() && shift_down() ) {
                switch( get_keypress() ) {
 
        if( !result && cwindow_operation < 0 && ctrl_down() && shift_down() ) {
                switch( get_keypress() ) {
-               case KEY_F1:
-               case KEY_F2:
-               case KEY_F3:
-               case KEY_F4:
+               case KEY_F1 ... KEY_F4: // mainmenu, load layout
                        resend_event(mwindow->gui);
                        result = 1;
                        break;
                        resend_event(mwindow->gui);
                        result = 1;
                        break;
@@ -671,6 +668,25 @@ void CWindowGUI::keyboard_zoomout()
 //     }
 }
 
 //     }
 }
 
+void CWindowGUI::sync_parameters(int change_type, int redraw, int overlay)
+{
+       if( redraw ) {
+               update_tool();
+               canvas->draw_refresh();
+       }
+       if( change_type < 0 && !overlay ) return;
+       unlock_window();
+       if( change_type >= 0 ) {
+               mwindow->restart_brender();
+               mwindow->sync_parameters(change_type);
+       }
+       if( overlay ) {
+               mwindow->gui->lock_window("CWindow::camera_keyframe");
+               mwindow->gui->draw_overlays(1);
+               mwindow->gui->unlock_window();
+       }
+       lock_window("CWindowGUI::sync_parameters");
+}
 
 void CWindowGUI::drag_motion()
 {
 
 void CWindowGUI::drag_motion()
 {
@@ -741,7 +757,7 @@ int CWindowGUI::drag_stop()
                        mwindow->gui->update(1, NORMAL_DRAW, 1, 1, 0, 1, 0);
                        mwindow->undo->update_undo_after(_("insert assets"), LOAD_ALL);
                        mwindow->gui->unlock_window();
                        mwindow->gui->update(1, NORMAL_DRAW, 1, 1, 0, 1, 0);
                        mwindow->undo->update_undo_after(_("insert assets"), LOAD_ALL);
                        mwindow->gui->unlock_window();
-                       mwindow->sync_parameters(CHANGE_ALL);
+                       sync_parameters(CHANGE_ALL);
                }
        }
 
                }
        }
 
@@ -825,6 +841,7 @@ CWindowEditing::CWindowEditing(MWindow *mwindow, CWindow *cwindow)
 #define panel_btn(fn, args, s) \
  panel_fn(panel_##fn, args, mwindow->gui->mbuttons->edit_panel->panel_##s)
 
 #define panel_btn(fn, args, s) \
  panel_fn(panel_##fn, args, mwindow->gui->mbuttons->edit_panel->panel_##s)
 
+
 double CWindowEditing::get_position()
 {
        relock_cm("get_position");
 double CWindowEditing::get_position()
 {
        relock_cm("get_position");
@@ -836,18 +853,19 @@ double CWindowEditing::get_position()
 void CWindowEditing::set_position(double position)
 {
        relock_cm("set_position");
 void CWindowEditing::set_position(double position)
 {
        relock_cm("set_position");
-       set_position(position);
+       mwindow->gui->mbuttons->edit_panel->set_position(position);
        relock_mc("set_position");
 }
 
 void CWindowEditing::set_click_to_play(int v)
 {
        relock_mc("set_position");
 }
 
 void CWindowEditing::set_click_to_play(int v)
 {
-       relock_cm("set_click_to_play");
+       relock_cm("set_position");
        mwindow->edl->session->cwindow_click2play = v;
        mwindow->edl->session->cwindow_click2play = v;
+       relock_mc("set_position");
        click2play->update(v);
        click2play->update(v);
-       relock_mc("set_click_to_play");
 }
 
 }
 
+
 void panel_btn(stop_transport,(), stop_transport())
 void panel_btn(toggle_label,(), toggle_label())
 void panel_btn(next_label,(int cut), next_label(cut))
 void panel_btn(stop_transport,(), stop_transport())
 void panel_btn(toggle_label,(), toggle_label())
 void panel_btn(next_label,(int cut), next_label(cut))
@@ -2542,11 +2560,7 @@ void CWindowCanvas::create_keyframe(int do_camera)
                y_keyframe->set_value(y_value);
                z_keyframe->set_value(z_value);
 
                y_keyframe->set_value(y_value);
                z_keyframe->set_value(z_value);
 
-               mwindow->sync_parameters(CHANGE_PARAMS);
-               gui->update_tool();
-               mwindow->gui->lock_window("CWindow::camera_keyframe");
-               mwindow->gui->draw_overlays(1);
-               mwindow->gui->unlock_window();
+               gui->sync_parameters(CHANGE_PARAMS, 1, 1);
        }
 }
 
        }
 }
 
@@ -2566,11 +2580,7 @@ void CWindowCanvas::reset_keyframe(int do_camera)
                y_keyframe->set_value(0);
                z_keyframe->set_value(1);
 
                y_keyframe->set_value(0);
                z_keyframe->set_value(1);
 
-               mwindow->sync_parameters(CHANGE_PARAMS);
-               gui->update_tool();
-               mwindow->gui->lock_window("CWindow::camera_keyframe");
-               mwindow->gui->draw_overlays(1);
-               mwindow->gui->unlock_window();
+               gui->sync_parameters(CHANGE_PARAMS, 1, 1);
        }
 }
 
        }
 }
 
@@ -2892,12 +2902,15 @@ void CWindowCanvas::draw_bezier(int do_camera)
        int64_t position = track->to_units(
                mwindow->edl->local_session->get_selectionstart(1),
                0);
        int64_t position = track->to_units(
                mwindow->edl->local_session->get_selectionstart(1),
                0);
-
-       track->automation->get_projector(&center_x,
-               &center_y,
-               &center_z,
-               position,
-               PLAY_FORWARD);
+       if( do_camera ) {
+               track->automation->get_camera(&center_x,
+                       &center_y, &center_z, position, PLAY_FORWARD);
+// follow image, not camera
+               center_x = -center_x;  center_y = -center_y;
+       }
+       else
+               track->automation->get_projector(&center_x,
+                       &center_y, &center_z, position, PLAY_FORWARD);
 
 //     center_x += track->track_w / 2;
 //     center_y += track->track_h / 2;
 
 //     center_x += track->track_w / 2;
 //     center_y += track->track_h / 2;
@@ -3086,6 +3099,7 @@ int CWindowCanvas::test_bezier(int button_press,
                                last_center_y = gui->affected_y->get_value();
                                float dx = cursor_x - gui->x_origin;
                                float dy = cursor_y - gui->y_origin;
                                last_center_y = gui->affected_y->get_value();
                                float dx = cursor_x - gui->x_origin;
                                float dy = cursor_y - gui->y_origin;
+// follow image, not camera
                                if(gui->current_operation == CWINDOW_CAMERA ) {
                                        dx = -dx;  dy = -dy;
                                }
                                if(gui->current_operation == CWINDOW_CAMERA ) {
                                        dx = -dx;  dy = -dy;
                                }
@@ -3117,7 +3131,7 @@ int CWindowCanvas::test_bezier(int button_press,
 
                if(gui->affected_track)
                {
 
                if(gui->affected_track)
                {
-                       if(gui->current_operation == CWINDOW_CAMERA)
+                       if( do_camera )
                                mwindow->undo->update_undo_before(_("camera"), this);
                        else
                                mwindow->undo->update_undo_before(_("projector"), this);
                                mwindow->undo->update_undo_before(_("camera"), this);
                        else
                                mwindow->undo->update_undo_before(_("projector"), this);
@@ -3329,38 +3343,9 @@ int CWindowCanvas::cursor_motion_event()
                }
        }
 
                }
        }
 
+       int change_type = rerender ? CHANGE_PARAMS : -1;
+       gui->sync_parameters(change_type, redraw, redraw_canvas);
 
 
-// If the window is never unlocked before calling send_command the
-// display shouldn't get stuck on the old video frame although it will
-// flicker between the old video frame and the new video frame.
-
-       if(redraw)
-       {
-               draw_refresh();
-               gui->update_tool();
-       }
-
-       if(redraw_canvas)
-       {
-               gui->unlock_window();
-
-
-               mwindow->gui->lock_window("CWindowCanvas::cursor_motion_event 1");
-               mwindow->gui->draw_overlays(1);
-               mwindow->gui->unlock_window();
-
-               gui->lock_window("CWindowCanvas::cursor_motion_event 1");
-       }
-
-       if(rerender)
-       {
-               gui->unlock_window();
-               mwindow->restart_brender();
-               mwindow->sync_parameters(CHANGE_PARAMS);
-               mwindow->cwindow->refresh_frame(CHANGE_NONE);
-               if(!redraw) gui->update_tool();
-               gui->lock_window("CWindowCanvas::cursor_motion_event 2");
-       }
        return result;
 }
 
        return result;
 }
 
@@ -3426,31 +3411,9 @@ int CWindowCanvas::button_press_event()
                }
        }
 
                }
        }
 
-       if(redraw)
-       {
-               draw_refresh();
-               gui->unlock_window();
-
-
-               mwindow->gui->lock_window("CWindowCanvas::button_press_event 1");
-               mwindow->gui->draw_overlays(1);
-               mwindow->gui->unlock_window();
-               gui->update_tool();
-
-               gui->lock_window("CWindowCanvas::button_press_event 1");
-       }
-
-// rerendering can also be caused by press event
-       if(rerender)
-       {
-               gui->unlock_window();
+       int change_type = rerender ? CHANGE_PARAMS : -1;
+       gui->sync_parameters(change_type, redraw, redraw_canvas);
 
 
-               mwindow->restart_brender();
-               mwindow->sync_parameters(CHANGE_PARAMS);
-               mwindow->cwindow->refresh_frame(CHANGE_NONE);
-               if(!redraw) gui->update_tool();
-               gui->lock_window("CWindowCanvas::button_press_event 2");
-       }
        return result;
 }
 
        return result;
 }