X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftimebar.C;h=10a095f9546edbb81a97c4a0a10ec38bca83a73c;hp=03fa0357526810069023c7e9bd528a6ebdd2530a;hb=d60a59baa6cfe24c0fb153ed9e150a834ba29feb;hpb=0513350234a8dcd08e5a0117d5121724ef7b76b6 diff --git a/cinelerra-5.1/cinelerra/timebar.C b/cinelerra-5.1/cinelerra/timebar.C index 03fa0357..10a095f9 100644 --- a/cinelerra-5.1/cinelerra/timebar.C +++ b/cinelerra-5.1/cinelerra/timebar.C @@ -24,6 +24,7 @@ #include "cplayback.h" #include "cursors.h" #include "cwindow.h" +#include "cwindowgui.h" #include "edl.h" #include "edlsession.h" #include "filexml.h" @@ -205,12 +206,12 @@ int64_t TimeBar::position_to_pixel(double position) double TimeBar::pixel_to_position(int pixel) { if( pane ) { - pixel += mwindow->edl->local_session->view_start[pane->number]; + pixel += get_edl()->local_session->view_start[pane->number]; } return (double)pixel * - mwindow->edl->local_session->zoom_sample / - mwindow->edl->session->sample_rate; + get_edl()->local_session->zoom_sample / + get_edl()->session->sample_rate; } void TimeBar::update_labels() @@ -277,35 +278,60 @@ void TimeBar::update_labels() void TimeBar::update_highlights() { + EDL *edl = get_edl(); + if( !edl ) return; for( int i = 0; i < labels.total; i++ ) { LabelGUI *label = labels.values[i]; - if( mwindow->edl->equivalent(label->position, - mwindow->edl->local_session->get_selectionstart(1)) || - mwindow->edl->equivalent(label->position, - mwindow->edl->local_session->get_selectionend(1)) ) { + if( edl->equivalent(label->position, + edl->local_session->get_selectionstart(1)) || + edl->equivalent(label->position, + edl->local_session->get_selectionend(1)) ) { if( !label->get_value() ) label->update(1); } else if( label->get_value() ) label->update(0); } - if( mwindow->edl->equivalent(mwindow->edl->local_session->get_inpoint(), - mwindow->edl->local_session->get_selectionstart(1)) || - mwindow->edl->equivalent(mwindow->edl->local_session->get_inpoint(), - mwindow->edl->local_session->get_selectionend(1)) ) { + if( edl->equivalent(edl->local_session->get_inpoint(), + edl->local_session->get_selectionstart(1)) || + edl->equivalent(edl->local_session->get_inpoint(), + edl->local_session->get_selectionend(1)) ) { if( in_point ) in_point->update(1); } else if( in_point ) in_point->update(0); - if( mwindow->edl->equivalent(mwindow->edl->local_session->get_outpoint(), - mwindow->edl->local_session->get_selectionstart(1)) || - mwindow->edl->equivalent(mwindow->edl->local_session->get_outpoint(), - mwindow->edl->local_session->get_selectionend(1)) ) { + if( edl->equivalent(edl->local_session->get_outpoint(), + edl->local_session->get_selectionstart(1)) || + edl->equivalent(edl->local_session->get_outpoint(), + edl->local_session->get_selectionend(1)) ) { if( out_point ) out_point->update(1); } else if( out_point ) out_point->update(0); + + draw_inout_highlight(); +} + +void TimeBar::draw_inout_highlight() +{ + EDL *edl = get_edl(); + if( !edl->local_session->inpoint_valid() ) return; + if( !edl->local_session->outpoint_valid() ) return; + double in_position = edl->local_session->get_inpoint(); + double out_position = edl->local_session->get_outpoint(); + if( in_position >= out_position ) return; + int in_x = position_to_pixel(in_position); + int out_x = position_to_pixel(out_position); + CLAMP(in_x, 0, get_w()); + CLAMP(out_x, 0, get_w()); + set_color(GREEN); + int lw = 5; + set_line_width(lw); + set_inverse(); + draw_line(in_x, get_h()-2*lw, out_x, get_h()-2*lw); + set_opaque(); + set_line_width(1); } void TimeBar::update_points() @@ -393,7 +419,7 @@ void TimeBar::update(int flush) //printf("TimeBar::update %d %d\n", __LINE__, x); double position = pixel_to_position(x); - position = get_edl()->align_to_frame(position, 0); + position = mwindow->edl->align_to_frame(position, 0); pixel = position_to_pixel(position); update_clock(position); } @@ -519,55 +545,27 @@ int TimeBar::draw() double TimeBar::get_edl_length() { - edl_length = 0; - - if( get_edl() ) { -//printf("TimeBar::get_edl_length 1 %f\n", get_edl()->tracks->total_length()); - edl_length = get_edl()->tracks->total_length(); - } - -//printf("TimeBar::get_edl_length 2\n"); - if( !EQUIV(edl_length, 0) ) { -//printf("TimeBar::get_edl_length 3\n"); - time_per_pixel = edl_length / get_w(); -//printf("TimeBar::get_edl_length 4\n"); - } - else { - time_per_pixel = 0; - } -//printf("TimeBar::get_edl_length 5\n"); - + edl_length = get_edl() ? get_edl()->tracks->total_length() : 0; + int w1 = get_w()-1; + time_per_pixel = !EQUIV(edl_length, 0) ? edl_length/w1 : w1; return 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; } @@ -601,6 +599,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 ) @@ -614,6 +614,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 ) @@ -632,26 +634,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; @@ -665,6 +671,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); @@ -711,7 +718,7 @@ int TimeBar::button_press_event() stop_playback(); // Select region between two labels - if( get_double_click() ) { + if( !is_vwindow() && get_double_click() ) { int x = get_relative_cursor_x(); double position = pixel_to_position(x); // Test labels @@ -834,14 +841,14 @@ void TimeBar::handle_mwindow_drag() int TimeBar::select_region(double position) { Label *start = 0, *end = 0, *current; - for( current = mwindow->edl->labels->first; current; current = NEXT ) { + for( current = get_edl()->labels->first; current; current = NEXT ) { if( current->position > position ) { end = current; break; } } - for( current = mwindow->edl->labels->last ; current; current = PREVIOUS ) { + for( current = get_edl()->labels->last ; current; current = PREVIOUS ) { if( current->position <= position ) { start = current; break; @@ -851,28 +858,32 @@ int TimeBar::select_region(double position) // Select region if( end != start ) { if( !start ) - mwindow->edl->local_session->set_selectionstart(0); + get_edl()->local_session->set_selectionstart(0); else - mwindow->edl->local_session->set_selectionstart(start->position); + get_edl()->local_session->set_selectionstart(start->position); if( !end ) - mwindow->edl->local_session->set_selectionend(mwindow->edl->tracks->total_length()); + get_edl()->local_session->set_selectionend(get_edl()->tracks->total_length()); else - mwindow->edl->local_session->set_selectionend(end->position); + get_edl()->local_session->set_selectionend(end->position); } else if( end || start ) { - mwindow->edl->local_session->set_selectionstart(start->position); - mwindow->edl->local_session->set_selectionend(start->position); + get_edl()->local_session->set_selectionstart(start->position); + get_edl()->local_session->set_selectionend(start->position); } // Que the CWindow + mwindow->cwindow->gui->lock_window("TimeBar::select_region"); mwindow->cwindow->update(1, 0, 0); + mwindow->cwindow->gui->unlock_window(); + mwindow->gui->lock_window("TimeBar::select_region"); mwindow->gui->hide_cursor(0); mwindow->gui->draw_cursor(1); mwindow->gui->flash_canvas(0); mwindow->gui->activate_timeline(); mwindow->gui->zoombar->update(); + mwindow->gui->unlock_window(); update_highlights(); return 0; }