proxy toggle fix, rework preview range setup
[goodguy/history.git] / cinelerra-5.1 / cinelerra / timebar.C
index 7d25fb2c3195e37563ad58db99cefa8df4427a2c..8d8bfc7c6a58f7deeac606fba58980831e092370 100644 (file)
@@ -527,32 +527,19 @@ double TimeBar::get_edl_length()
 
 int TimeBar::get_preview_pixels(int &x1, int &x2)
 {
-       x1 = 0;
-       x2 = 0;
-
+       x1 = 0;  x2 = get_w();
        get_edl_length();
-
-       if( get_edl() ) {
-               if( !EQUIV(edl_length, 0) ) {
-                       if( get_edl()->local_session->preview_end <= 0 ||
-                           get_edl()->local_session->preview_end > edl_length )
-                               get_edl()->local_session->preview_end = edl_length;
-                       if( get_edl()->local_session->preview_start >
-                               get_edl()->local_session->preview_end )
-                               get_edl()->local_session->preview_start = 0;
-                       x1 = (int)(get_edl()->local_session->preview_start / time_per_pixel);
-                       x2 = (int)(get_edl()->local_session->preview_end / time_per_pixel);
-               }
-               else {
-                       x1 = 0;
-                       x2 = get_w();
+       EDL *edl = get_edl();
+       if( edl && !EQUIV(edl_length, 0) ) {
+               double preview_start = edl->local_session->preview_start;
+               double preview_end = edl->local_session->preview_end;
+               if( preview_end < 0 || preview_end > edl_length )
+                       preview_end = edl_length;
+               if( preview_end >= preview_start ) {
+                       x1 = (int)(preview_start / time_per_pixel);
+                       x2 = (int)(preview_end / time_per_pixel);
                }
        }
-// printf("TimeBar::get_preview_pixels %f %f %d %d\n",
-//     get_edl()->local_session->preview_start,
-//     get_edl()->local_session->preview_end,
-//     x1,
-//     x2);
        return 0;
 }
 
@@ -586,6 +573,8 @@ int TimeBar::test_preview(int buttonpress)
                        if( buttonpress ) {
                                current_operation = TIMEBAR_DRAG_RIGHT;
                                start_position = get_edl()->local_session->preview_end;
+                               if( start_position < 0 || start_position > edl_length )
+                                       start_position = edl_length;
                                start_cursor_x = x;
                        }
                        else if( get_cursor() != RIGHT_CURSOR )
@@ -599,6 +588,8 @@ int TimeBar::test_preview(int buttonpress)
                                current_operation = TIMEBAR_DRAG_CENTER;
                                starting_start_position = get_edl()->local_session->preview_start;
                                starting_end_position = get_edl()->local_session->preview_end;
+                               if( starting_end_position < 0 || starting_end_position > edl_length )
+                                       starting_end_position = edl_length;
                                start_cursor_x = x;
                        }
                        if( get_cursor() != HSEPARATE_CURSOR )
@@ -617,26 +608,30 @@ int TimeBar::test_preview(int buttonpress)
 int TimeBar::move_preview(int &redraw)
 {
        int result = 0, x = get_relative_cursor_x();
-
-       if( current_operation == TIMEBAR_DRAG_LEFT ) {
+       switch( current_operation ) {
+       case TIMEBAR_DRAG_LEFT: {
                get_edl()->local_session->preview_start =
                        start_position + time_per_pixel * (x - start_cursor_x);
-               CLAMP(get_edl()->local_session->preview_start,
-                       0,
-                       get_edl()->local_session->preview_end);
+               double preview_end = get_edl()->local_session->preview_end;
+               if( preview_end < 0 || preview_end > edl_length )
+                       preview_end = get_edl()->local_session->preview_end = edl_length;
+               CLAMP(get_edl()->local_session->preview_start, 0, preview_end);
                result = 1;
-       }
-       else
-       if( current_operation == TIMEBAR_DRAG_RIGHT ) {
-               get_edl()->local_session->preview_end =
+               break; }
+       case TIMEBAR_DRAG_RIGHT: {
+               double preview_end = get_edl()->local_session->preview_end =
                        start_position + time_per_pixel * (x - start_cursor_x);
-               CLAMP(get_edl()->local_session->preview_end,
-                       get_edl()->local_session->preview_start,
-                       edl_length);
+               double preview_start = get_edl()->local_session->preview_start;
+               if( preview_end >= edl_length && !preview_start ) {
+                       get_edl()->local_session->preview_end = -1;
+                       if( preview_start > preview_end )
+                               preview_start = get_edl()->local_session->preview_start = preview_end;
+               }
+               else
+                       CLAMP(get_edl()->local_session->preview_end, preview_start, edl_length);
                result = 1;
-       }
-       else
-       if( current_operation == TIMEBAR_DRAG_CENTER ) {
+               break; }
+       case TIMEBAR_DRAG_CENTER: {
                double dt = time_per_pixel * (x - start_cursor_x);
                get_edl()->local_session->preview_start = starting_start_position + dt;
                get_edl()->local_session->preview_end = starting_end_position + dt;
@@ -650,6 +645,7 @@ int TimeBar::move_preview(int &redraw)
                        get_edl()->local_session->preview_end = edl_length;
                }
                result = 1;
+               break; }
        }
 
 //printf("TimeBar::move_preview %d %d\n", __LINE__, current_operation);