rework undo compression, add shift viewer overwr/copy/clip/splice, fix paste edl...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / cwindowgui.C
index 1c56a6d641e3b70f3f737906fe8c6d794d4a7884..37dd35bf20c3c244aead401cf5705b10e811dac6 100644 (file)
@@ -296,6 +296,32 @@ int CWindowGUI::resize_event(int w, int h)
 
 int CWindowGUI::button_press_event()
 {
+       if( current_operation == CWINDOW_NONE &&
+           mwindow->edl != 0 && canvas->get_canvas() &&
+           mwindow->edl->session->cwindow_click2play &&
+           canvas->get_canvas()->get_cursor_over_window() ) {
+               switch( get_buttonpress() ) {
+               case LEFT_BUTTON:
+                       if( !cwindow->playback_engine->is_playing_back ) {
+                               double length = mwindow->edl->tracks->total_playable_length();
+                               double position = cwindow->playback_engine->get_tracking_position();
+                               if( position >= length ) transport->goto_start();
+                       }
+                       return transport->forward_play->handle_event();
+               case MIDDLE_BUTTON:
+                       if( !cwindow->playback_engine->is_playing_back ) {
+                               double position = cwindow->playback_engine->get_tracking_position();
+                               if( position <= 0 ) transport->goto_end();
+                       }
+                       return transport->reverse_play->handle_event();
+               case RIGHT_BUTTON:  // activates popup
+                       break;
+               case WHEEL_UP:
+                       return transport->frame_forward_play->handle_event();
+               case WHEEL_DOWN:
+                       return transport->frame_reverse_play->handle_event();
+               }
+       }
        if(canvas->get_canvas())
                return canvas->button_press_event_base(canvas->get_canvas());
        return 0;
@@ -473,61 +499,63 @@ int CWindowGUI::keypress_event()
                        lock_window("CWindowGUI::keypress_event 4");
                        break;
                case LEFT:
-                       if(!ctrl_down())
-                       {
-                               if (alt_down())
-                               {
-                                       int shift_down = this->shift_down();
-                                       unlock_window();
-                                       mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
-
-                                       mwindow->gui->lock_window("CWindowGUI::keypress_event 2");
+                       if( !ctrl_down() ) {
+                               int alt_down = this->alt_down();
+                               int shift_down = this->shift_down();
+                               unlock_window();
+                               stop_transport(0);
+                               mwindow->gui->lock_window("CWindowGUI::keypress_event 5");
+                               if( alt_down )
                                        mwindow->prev_edit_handle(shift_down);
-                                       mwindow->gui->unlock_window();
-
-                                       lock_window("CWindowGUI::keypress_event 1");
-                               }
                                else
-                               {
-                                       unlock_window();
-
-                                       mwindow->gui->lock_window("CWindowGUI::keypress_event 3");
                                        mwindow->move_left();
-                                       mwindow->gui->unlock_window();
-
-                                       lock_window("CWindowGUI::keypress_event 2");
-                               }
+                               mwindow->gui->unlock_window();
+                               lock_window("CWindowGUI::keypress_event 6");
                                result = 1;
                        }
                        break;
-               case RIGHT:
-                       if(!ctrl_down())
-                       {
-                               if (alt_down())
-                               {
-                                       int shift_down = this->shift_down();
-                                       unlock_window();
-                                       mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
 
-                                       mwindow->gui->lock_window("CWindowGUI::keypress_event 2");
-                                       mwindow->next_edit_handle(shift_down);
-                                       mwindow->gui->unlock_window();
+               case ',':
+                       if( !ctrl_down() && !alt_down() ) {
+                               unlock_window();
+                               stop_transport(0);
+                               mwindow->gui->lock_window("CWindowGUI::keypress_event 7");
+                               mwindow->move_left();
+                               mwindow->gui->unlock_window();
+                               lock_window("CWindowGUI::keypress_event 8");
+                               result = 1;
+                       }
+                       break;
 
-                                       lock_window("CWindowGUI::keypress_event 2");
-                               }
+               case RIGHT:
+                       if( !ctrl_down() ) {
+                               int alt_down = this->alt_down();
+                               int shift_down = this->shift_down();
+                               unlock_window();
+                               stop_transport(0);
+                               mwindow->gui->lock_window("CWindowGUI::keypress_event 8");
+                               if( alt_down )
+                                       mwindow->next_edit_handle(shift_down);
                                else
-                               {
-                                       unlock_window();
-
-                                       mwindow->gui->lock_window("CWindowGUI::keypress_event 4");
                                        mwindow->move_right();
-                                       mwindow->gui->unlock_window();
+                               mwindow->gui->unlock_window();
+                               lock_window("CWindowGUI::keypress_event 9");
+                               result = 1;
+                       }
+                       break;
 
-                                       lock_window("CWindowGUI::keypress_event 3");
-                               }
+               case '.':
+                       if( !ctrl_down() && !alt_down() ) {
+                               unlock_window();
+                               stop_transport(0);
+                               mwindow->gui->lock_window("CWindowGUI::keypress_event 10");
+                               mwindow->move_right();
+                               mwindow->gui->unlock_window();
+                               lock_window("CWindowGUI::keypress_event 11");
                                result = 1;
                        }
                        break;
+
        }
 
        if(!result) result = transport->keypress_event();
@@ -676,30 +704,36 @@ void CWindowGUI::update_meters()
        }
 }
 
+void CWindowGUI::stop_transport(const char *lock_msg)
+{
+       if( lock_msg ) unlock_window();
+       mwindow->stop_transport();
+       if( lock_msg ) lock_window(lock_msg);
+}
+
 
 CWindowEditing::CWindowEditing(MWindow *mwindow, CWindow *cwindow)
- : EditPanel(mwindow,
-               cwindow->gui,
-               mwindow->theme->cedit_x,
-               mwindow->theme->cedit_y,
+ : EditPanel(mwindow, cwindow->gui, CWINDOW_ID,
+               mwindow->theme->cedit_x, mwindow->theme->cedit_y,
                mwindow->edl->session->editing_mode,
-               0,
-               1,
-               0,
-               0,
-               1,
-               1,
-               1,
-               1,
-               1,
-               0,
+               0, // use_editing_mode
+               1, // use_keyframe
+               0, // use_splice
+               0, // use_overwrite
+               1, // use_lift
+               1, // use_extract
+               1, // use_copy
+               1, // use_paste
+               1, // use_undo
+               0, // use_fit
                0, // locklabels
-               1,
-               1,
-               1,
-               0,
-               1,
-               0)
+               1, // use_labels
+               1, // use_toclip
+               1, // use_meters
+               1, // use_cut
+               0, // use_commerical
+               0, // use_goto
+               1) // use_clk2play
 {
        this->mwindow = mwindow;
        this->cwindow = cwindow;
@@ -718,14 +752,20 @@ CWrapper(set_inpoint)
 CWrapper(set_outpoint)
 CWrapper(unset_inoutpoint)
 CWrapper(toggle_label)
-CWrapper(prev_label)
-CWrapper(next_label)
-CWrapper(prev_edit)
-CWrapper(next_edit)
+
+#define CWrapper_cut(fn) void CWindowEditing::fn(int cut) { \
+       mwindow->gui->lock_window("CWrapper::" #fn); \
+       EditPanel::fn(cut); \
+       mwindow->gui->unlock_window(); \
+}
+CWrapper_cut(prev_label)
+CWrapper_cut(next_label)
+CWrapper_cut(prev_edit)
+CWrapper_cut(next_edit)
 
 void CWindowEditing::to_clip()
 {
-        mwindow->to_clip(mwindow->edl, _("composer window: "));
+        mwindow->to_clip(mwindow->edl, _("composer window: "), 0);
 }
 
 
@@ -3204,7 +3244,8 @@ int CWindowCanvas::button_press_event()
        gui->y_offset = get_y_offset(mwindow->edl, 0, zoom_y, conformed_w, conformed_h);
 
 // Scroll view
-       if(get_buttonpress() == 2)
+       if( mwindow->edl->session->cwindow_operation != CWINDOW_PROTECT &&
+           get_buttonpress() == 2 )
        {
                gui->current_operation = CWINDOW_SCROLL;
                result = 1;