Andrew minor fix for console running of Batch Render + RafaMar Spanish updates
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / trackcanvas.C
index c0fea44a35d82970fa662baf7f558a5e07a00a24..c6722e794db0d42d53456dfb66817aaf99c18d3f 100644 (file)
@@ -188,6 +188,7 @@ int TrackCanvas::drag_motion(
                Track **over_track, Edit **over_edit,
                PluginSet **over_pluginset, Plugin **over_plugin)
 {
+       int update_scroll = 0;
        int cursor_x = get_relative_cursor_x();
        int cursor_y = get_relative_cursor_y();
        if( get_cursor_over_window() ) {
@@ -196,6 +197,28 @@ int TrackCanvas::drag_motion(
        }
        if( over_track && !*over_track )
                *over_track = pane->over_patchbay();
+
+       switch( mwindow->session->current_operation ) {
+       case DRAG_EDIT_SELECT: {
+               Edit *edit = over_edit ? *over_edit : 0;
+               double position = mwindow->edl->get_cursor_position(cursor_x, pane->number);
+               mwindow->session->drag_position = mwindow->edl->align_to_frame(position, 0);
+               drag_edit_select(edit, 0, 1);
+               update_scroll = 1;
+               break; }
+       }
+
+       if( update_scroll ) {
+               if( !drag_scroll &&
+                   (cursor_x >= get_w() || cursor_x < 0 ||
+                    cursor_y >= get_h() || cursor_y < 0))
+                       start_dragscroll();
+               else if( drag_scroll &&
+                        cursor_x < get_w() && cursor_x >= 0 &&
+                        cursor_y < get_h() && cursor_y >= 0 )
+                       stop_dragscroll();
+       }
+
        return 0;
 }
 
@@ -500,7 +523,7 @@ int TrackCanvas::drag_stop(int *redraw)
                                result = 1;
                        }
                        break;
-               case DRAG_GROUP:
+               case DRAG_GROUP: {
                        mwindow->session->current_operation = NO_OPERATION;
                        EDL *drag_group = mwindow->session->drag_group;
                        if( drag_group ) {
@@ -532,10 +555,21 @@ int TrackCanvas::drag_stop(int *redraw)
                                }
                        }
                        result = 1;
+                       break; }
+               case DRAG_EDIT_SELECT:
+                       int select = ctrl_down() ? -1 : 1;
+                       drag_edit_select(mwindow->session->edit_highlighted, select, 0);
                        break;
                }
        }
 
+       switch( mwindow->session->current_operation ) {
+       case DRAG_EDIT_SELECT:
+               mwindow->session->current_operation = NO_OPERATION;
+               result = 1;
+               break;
+       }
+
        return result;
 }
 
@@ -771,14 +805,11 @@ void TrackCanvas::draw_resources(int mode,
 
        resource_timer->update();
 
+       if(!indexes_only) {
 // Age resource pixmaps for deletion
-       if(!indexes_only)
                for(int i = 0; i < gui->resource_pixmaps.total; i++)
                        gui->resource_pixmaps.values[i]->visible--;
-
-       if(mode == FORCE_REDRAW)
-               gui->resource_pixmaps.remove_all_objects();
-
+       }
        if(debug) PRINT_TRACE
        if(mode != IGNORE_THREAD)
                gui->resource_thread->reset(pane->number, indexes_only);
@@ -944,12 +975,9 @@ ResourcePixmap* TrackCanvas::create_pixmap(Edit *edit,
        if(!result)
        {
 //SET_TRACE
-               result = new ResourcePixmap(mwindow,
-                       gui,
-                       edit,
-                       pane->number,
-                       pixmap_w,
-                       pixmap_h);
+               result = new ResourcePixmap(mwindow, gui, edit, pane->number, pixmap_w, pixmap_h);
+               set_bg_color(BLACK);
+               clear_box(0,0, pixmap_w,pixmap_h, result);
 //SET_TRACE
                gui->resource_pixmaps.append(result);
        }
@@ -2051,6 +2079,7 @@ void TrackCanvas::draw_drag_handle()
 void TrackCanvas::draw_transitions()
 {
        int64_t x, y, w, h;
+       if( !mwindow->edl->session->auto_conf->transitions ) return;
 
        for(Track *track = mwindow->edl->tracks->first; track; track = track->next) {
                if( track->is_hidden() ) continue;
@@ -2205,7 +2234,8 @@ int TrackCanvas::do_keyframes(int cursor_x,
 // track context menu to appear
        int result = 0;
        EDLSession *session = mwindow->edl->session;
-       int gang = session->gang_tracks != GANG_NONE || get_double_click() ? 1 : 0;
+       int gang = mwindow->edl->local_session->gang_tracks != GANG_NONE ||
+                       get_double_click() ? 1 : 0;
 
        static BC_Pixmap *auto_pixmaps[AUTOMATION_TOTAL] =
        {
@@ -4292,6 +4322,53 @@ void TrackCanvas::update_drag_caption()
 }
 
 
+void TrackCanvas::drag_edit_select(Edit *over_edit, int select, int draw)
+{
+       if( !over_edit ) return;
+       if( !mwindow->session->drag_edit ) return;
+       Track *drag_track = mwindow->session->drag_edit->track;
+       Track *over_track = over_edit->track;
+       if( !drag_track || !over_track ) return;
+       if( drag_track->number_of() > over_track->number_of() ) {
+               Track *trk = drag_track;
+               drag_track = over_track;
+               over_track = trk;
+       }
+       double start_pos = mwindow->session->drag_start;
+       double end_pos = mwindow->session->drag_position;
+       if( start_pos > end_pos ) {
+               double pos = start_pos;
+               start_pos = end_pos;
+               end_pos = pos;
+       }
+       int done = 0, do_flash = 0;
+       for( Track *track=drag_track; !done; track=track->next ) {
+               if( !track->is_armed() ) continue;
+               for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
+                       int64_t pos = edit->startproject;
+                       int64_t end = pos + edit->length;
+                       double edit_start = track->from_units(pos);
+                       double edit_end = track->from_units(end);
+                       if( start_pos >= edit_end ) continue;
+                       if( edit_start > end_pos ) continue;
+                       if( select > 0 )
+                               edit->is_selected = 1;
+                       else if( select < 0 )
+                               edit->is_selected = 0;
+                       if( draw ) {
+                               int64_t edit_x, edit_y, edit_w, edit_h;
+                               edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
+                               set_color(YELLOW);
+                               draw_rectangle(edit_x, edit_y, edit_w, edit_h);
+                               do_flash = 1;
+                       }
+               }
+               if( track == over_track ) done = 1;
+       }
+       if( do_flash )
+               flash();
+}
+
 
 int TrackCanvas::cursor_update(int in_motion)
 {
@@ -4305,7 +4382,7 @@ int TrackCanvas::cursor_update(int in_motion)
        int update_cursor = 0;
        int rerender = 0;
        double position = 0.;
-//printf("TrackCanvas::cursor_update %d\n", __LINE__);
+//printf("TrackCanvas::cursor_update %d %d,%d\n", __LINE__, get_cursor_x(), get_cursor_y());
 
 // Default cursor
        int new_cursor =
@@ -4576,6 +4653,7 @@ int TrackCanvas::repeat_event(int64_t duration)
        int result = 0;
 
        switch(mwindow->session->current_operation) {
+               case DRAG_EDIT_SELECT:
                case SELECT_REGION:
 //printf("TrackCanvas::repeat_event 1 %d\n", mwindow->edl->local_session->view_start);
                if(get_cursor_x() > get_w()) {
@@ -4773,6 +4851,10 @@ int TrackCanvas::button_release_event()
                        drag_scroll = 0;
                        break; }
 
+               case DRAG_EDIT_SELECT:
+                       //result = 0;
+                       break;
+
                default:
                        if( mwindow->session->current_operation ) {
 //                             if(mwindow->session->current_operation == SELECT_REGION) {
@@ -5018,6 +5100,8 @@ int TrackCanvas::do_plugin_handles(int cursor_x,
 int TrackCanvas::do_transition_handles(int cursor_x, int cursor_y, int button_press,
                int &rerender, int &update_overlay, int &new_cursor, int &update_cursor)
 {
+       if( !mwindow->edl->session->auto_conf->transitions )
+               return 0;
        Transition *trans_result = 0;
        int result = 0;
 
@@ -5184,8 +5268,15 @@ int TrackCanvas::do_edits(int cursor_x, int cursor_y, int button_press, int drag
                                        mwindow->session->drag_origin_x = cursor_x;
                                        mwindow->session->drag_origin_y = cursor_y;
 // Where the drag started, so we know relative position inside the edit later
-                                       mwindow->session->drag_position =
-                                               mwindow->edl->get_cursor_position(cursor_x, pane->number);
+                                       double position = mwindow->edl->get_cursor_position(cursor_x, pane->number);
+                                       mwindow->session->drag_position = mwindow->edl->align_to_frame(position, 1);
+                                       if( get_buttonpress() == LEFT_BUTTON && alt_down() ) {
+                                               mwindow->session->drag_start = mwindow->session->drag_position;
+                                               drag_edit_select(edit, 0, 1);
+                                               mwindow->session->current_operation = DRAG_EDIT_SELECT;
+                                               result = 1;
+                                               continue;
+                                       }
                                        drag_start = 0; // if unselected "fast" drag
                                        if( !edit->silence() && !edit->is_selected ) {
                                                mwindow->edl->tracks->clear_selected_edits();