update resource pixmap settings even if asset not drawn
[goodguy/history.git] / cinelerra-5.1 / cinelerra / trackcanvas.C
index f4dd1916b643c8a6e1f89ec2d193f6b41d128713..061545bac18728ba5f25be967788c789a304367f 100644 (file)
@@ -642,7 +642,6 @@ int64_t TrackCanvas::drop_plugin_position(PluginSet *plugin_set, Plugin *moved_p
        return -1;
 }
 
-
 void TrackCanvas::draw(int mode, int hide_cursor)
 {
        const int debug = 0;
@@ -709,9 +708,6 @@ void TrackCanvas::draw_resources(int mode,
 
        if(debug) PRINT_TRACE
 
-       if(!mwindow->edl->session->show_assets) return;
-
-
 // can't stop thread here, because this is called for every pane
 //     if(mode != IGNORE_THREAD && !indexes_only)
 //             gui->resource_thread->stop_draw(!indexes_only);
@@ -801,24 +797,29 @@ void TrackCanvas::draw_resources(int mode,
                                if(pixmap_w && pixmap_h)
                                {
 // Create pixmap if it doesn't exist
-                                       ResourcePixmap* pixmap = create_pixmap(edit,
-                                               edit_x,
-                                               pixmap_x,
-                                               pixmap_w,
-                                               pixmap_h);
+                                       ResourcePixmap* pixmap = create_pixmap(edit, edit_x,
+                                               pixmap_x, pixmap_w, pixmap_h);
 // Resize it if it's bigger
-                                       if(pixmap_w > pixmap->pixmap_w ||
-                                               pixmap_h > pixmap->pixmap_h)
+                                       if( pixmap_w > pixmap->pixmap_w ||
+                                           pixmap_h > pixmap->pixmap_h)
                                                pixmap->resize(pixmap_w, pixmap_h);
-                                       pixmap->draw_data(this,
-                                               edit,
-                                               edit_x,
-                                               edit_w,
-                                               pixmap_x,
-                                               pixmap_w,
-                                               pixmap_h,
-                                               mode,
-                                               indexes_only);
+                                       pixmap->update_settings(edit, edit_x, edit_w,
+                                               pixmap_x, pixmap_w, pixmap_h);
+// Draw data
+                                       if( current->show_assets() )
+                                               pixmap->draw_data(this,
+                                                       edit, edit_x, edit_w,
+                                                       pixmap_x, pixmap_w, pixmap_h,
+                                                       mode, indexes_only);
+                                       else {
+                                               set_bg_color(BLACK);
+                                               clear_box(0,0, pixmap_w,pixmap_h, pixmap);
+                                       }
+// Draw title
+                                       if( current->show_titles() )
+                                               pixmap->draw_title(this,
+                                                       edit, edit_x, edit_w,
+                                                       pixmap_x, pixmap_w);
 // Resize it if it's smaller
                                        if(pixmap_w < pixmap->pixmap_w ||
                                                pixmap_h < pixmap->pixmap_h)
@@ -959,27 +960,22 @@ void TrackCanvas::get_pixmap_size(Edit *edit,
 //     }
 
        pixmap_h = mwindow->edl->local_session->zoom_track;
-       if(mwindow->edl->session->show_titles) pixmap_h += mwindow->theme->get_image("title_bg_data")->get_h();
+       Track *track = edit->edits->track;
+       if( track->show_titles() )
+               pixmap_h += mwindow->theme->get_image("title_bg_data")->get_h();
 //printf("get_pixmap_size %d %d %d %d\n", edit_x, edit_w, pixmap_x, pixmap_w);
 }
 
 void TrackCanvas::edit_dimensions(Edit *edit,
-       int64_t &x,
-       int64_t &y,
-       int64_t &w,
-       int64_t &h)
+       int64_t &x, int64_t &y, int64_t &w, int64_t &h)
 {
-//     w = Units::round(edit->track->from_units(edit->length) *
-//             mwindow->edl->session->sample_rate /
-//             mwindow->edl->local_session->zoom_sample);
-
-       h = resource_h();
-
        x = Units::round(edit->track->from_units(edit->startproject) *
                        mwindow->edl->session->sample_rate /
                        mwindow->edl->local_session->zoom_sample -
                        mwindow->edl->local_session->view_start[pane->number]);
 
+       y = edit->edits->track->y_pixel - mwindow->edl->local_session->track_start[pane->number];
+
 // Method for calculating w so when edits are together we never get off by one error due to rounding
        int64_t x_next = Units::round(edit->track->from_units(edit->startproject + edit->length) *
                        mwindow->edl->session->sample_rate /
@@ -987,10 +983,12 @@ void TrackCanvas::edit_dimensions(Edit *edit,
                        mwindow->edl->local_session->view_start[pane->number]);
        w = x_next - x;
 
-       y = edit->edits->track->y_pixel - mwindow->edl->local_session->track_start[pane->number];
-
-       if(mwindow->edl->session->show_titles)
-               h += mwindow->theme->get_image("title_bg_data")->get_h();
+       int edit_h = 0;
+       if( edit->track->show_titles() )
+               edit_h += mwindow->theme->get_image("title_bg_data")->get_h();
+       if( edit->track->show_assets() )
+               edit_h += resource_h();
+       h = edit_h;
 }
 
 void TrackCanvas::track_dimensions(Track *track, int64_t &x, int64_t &y, int64_t &w, int64_t &h)
@@ -1240,13 +1238,14 @@ void TrackCanvas::plugin_dimensions(Plugin *plugin, int64_t &x, int64_t &y, int6
        w = Units::round(plugin->track->from_units(plugin->length) *
                mwindow->edl->session->sample_rate /
                mwindow->edl->local_session->zoom_sample);
-       y = plugin->track->y_pixel -
-               mwindow->edl->local_session->track_start[pane->number] +
-               mwindow->edl->local_session->zoom_track +
-               plugin->plugin_set->get_number() *
-               mwindow->theme->get_image("plugin_bg_data")->get_h();
-       if(mwindow->edl->session->show_titles)
+       y = plugin->track->y_pixel
+               - mwindow->edl->local_session->track_start[pane->number];
+       if( plugin->track->show_titles() )
                y += mwindow->theme->get_image("title_bg_data")->get_h();
+       if( plugin->track->show_assets() )
+               y += resource_h();
+       y += plugin->plugin_set->get_number() *
+                       mwindow->theme->get_image("plugin_bg_data")->get_h();
        h = mwindow->theme->get_image("plugin_bg_data")->get_h();
 }
 
@@ -1379,42 +1378,30 @@ void TrackCanvas::get_handle_coords(Edit *edit, int64_t &x, int64_t &y, int64_t
 
        edit_dimensions(edit, x, y, w, h);
 
-       if(mwindow->edl->session->show_titles)
-       {
+       if( edit->track->show_titles() )
                y += mwindow->theme->get_image("title_bg_data")->get_h();
-       }
-       else
-       {
-               y = 0;
-       }
 
        if(side == EDIT_OUT)
-       {
                x += w - handle_w;
-       }
 
        h = handle_h;
        w = handle_w;
 }
 
-void TrackCanvas::get_transition_coords(int64_t &x, int64_t &y, int64_t &w, int64_t &h)
+void TrackCanvas::get_transition_coords(Edit *edit,
+               int64_t &x, int64_t &y, int64_t &w, int64_t &h)
 {
-//printf("TrackCanvas::get_transition_coords 1\n");
-//     int transition_w = mwindow->theme->transitionhandle_data[0]->get_w();
-//     int transition_h = mwindow->theme->transitionhandle_data[0]->get_h();
-       int transition_w = 30;
-       int transition_h = 30;
-//printf("TrackCanvas::get_transition_coords 1\n");
-
-       if(mwindow->edl->session->show_titles)
+       int transition_w = 30, transition_h = 30;
+
+       if( edit->track->show_titles() )
                y += mwindow->theme->get_image("title_bg_data")->get_h();
-//printf("TrackCanvas::get_transition_coords 2\n");
+       if( edit->track->show_assets() )
+               y += resource_h() / 2;
 
-       y += (h - mwindow->theme->get_image("title_bg_data")->get_h()) / 2 - transition_h / 2;
        x -= transition_w / 2;
-
-       h = transition_h;
+       y -= transition_h / 2;
        w = transition_w;
+       h = transition_h;
 }
 
 void TrackCanvas::draw_highlighting()
@@ -1429,21 +1416,18 @@ void TrackCanvas::draw_highlighting()
 //printf("TrackCanvas::draw_highlighting 1 %p %p\n",
 //     mwindow->session->track_highlighted, mwindow->session->edit_highlighted);
                        if(mwindow->session->edit_highlighted) {
-//printf("TrackCanvas::draw_highlighting 2\n");
                                if((mwindow->session->current_operation == DRAG_ATRANSITION &&
                                        mwindow->session->track_highlighted->data_type == TRACK_AUDIO) ||
                                        (mwindow->session->current_operation == DRAG_VTRANSITION &&
                                        mwindow->session->track_highlighted->data_type == TRACK_VIDEO)) {
-//printf("TrackCanvas::draw_highlighting 2\n");
-                                       edit_dimensions(mwindow->session->edit_highlighted, x, y, w, h);
-//printf("TrackCanvas::draw_highlighting 2\n");
-
+                                       edit_dimensions(mwindow->session->edit_highlighted,
+                                               x, y, w, h);
                                        if(MWindowGUI::visible(x, x + w, 0, get_w()) &&
                                                MWindowGUI::visible(y, y + h, 0, get_h())) {
                                                draw_box = 1;
-                                               get_transition_coords(x, y, w, h);
+                                               get_transition_coords(mwindow->session->edit_highlighted,
+                                                       x, y, w, h);
                                        }
-//printf("TrackCanvas::draw_highlighting 3\n");
                                }
                        }
                        break;
@@ -1611,8 +1595,6 @@ void TrackCanvas::draw_plugins()
        int current_show = 0;
        int current_preset = 0;
 
-//     if(!mwindow->edl->session->show_assets) goto done;
-
        for(int i = 0; i < plugin_on_toggles.total; i++)
                plugin_on_toggles.values[i]->in_use = 0;
        for(int i = 0; i < plugin_show_toggles.total; i++)
@@ -1788,14 +1770,19 @@ void TrackCanvas::draw_hard_edges()
 {
        int64_t x, y, w, h;
 
-//     if(!mwindow->edl->session->show_assets) return;
-
        for(Track *track = mwindow->edl->tracks->first; track; track = track->next) {
                for(Edit *edit = track->edits->first; edit; edit = edit->next) {
                        if( !edit->hard_left && !edit->hard_right ) continue;
                        edit_dimensions(edit, x, y, w, h);
                        set_color(GREEN);
-                       set_opaque();    int y1 = y+h-1;
+                       set_opaque();
+                       int y1 = y;
+                       if( track->show_titles() )
+                               y1 += mwindow->theme->get_image("title_bg_data")->get_h();
+                       if( track->show_assets() )
+                               y1 += resource_h();
+                       if( y1 == y )
+                               y1 += mwindow->theme->title_h;
                        if( edit->hard_left ) {
                                ArrayList<int> xpt, ypt;
                                xpt.append(x);              ypt.append(y1);
@@ -1844,16 +1831,16 @@ void TrackCanvas::draw_transitions()
 {
        int64_t x, y, w, h;
 
-//     if(!mwindow->edl->session->show_assets) return;
-
        for(Track *track = mwindow->edl->tracks->first; track; track = track->next) {
+               if( !track->show_transitions() ) continue;
+
                for(Edit *edit = track->edits->first; edit; edit = edit->next) {
                        if(!edit->transition) continue;
                        edit_dimensions(edit, x, y, w, h);
                        int strip_x = x, strip_y = y;
-                       if(mwindow->edl->session->show_titles)
+                       if( track->show_titles() )
                                strip_y += mwindow->theme->get_image("title_bg_data")->get_h();
-                       get_transition_coords(x, y, w, h);
+                       get_transition_coords(edit, x, y, w, h);
                        int strip_w = Units::round(edit->track->from_units(edit->transition->length) *
                                mwindow->edl->session->sample_rate / mwindow->edl->local_session->zoom_sample);
                        if( MWindowGUI::visible(x, x + w, 0, get_w()) &&
@@ -2046,16 +2033,27 @@ int TrackCanvas::do_keyframes(int cursor_x,
                                        case Autos::AUTOMATION_TYPE_FLOAT: {
                                                Automation automation(0, track);
                                                int grouptype = automation.autogrouptype(i, track);
+                                               if( buttonpress && i == AUTOMATION_SPEED ) {
+                                                       mwindow->speed_before();
+                                               }
+
                                                if(draw) // Do dropshadow
                                                        result = do_float_autos(track, autos,
                                                                cursor_x, cursor_y, draw,
                                                                buttonpress, 1, 1, MDGREY,
                                                                auto_keyframe, grouptype);
-
                                                result = do_float_autos(track, autos,
                                                        cursor_x, cursor_y, draw, buttonpress,
                                                        0, 0, GWindowGUI::auto_colors[i],
                                                        auto_keyframe, grouptype);
+
+                                               if( !result && buttonpress && i == AUTOMATION_SPEED )
+                                                       mwindow->speed_after(-1);
+                                               int current_grouptype = mwindow->edl->local_session->zoombar_showautotype;
+                                               if( result && buttonpress && grouptype != current_grouptype ) {
+                                                       mwindow->edl->local_session->zoombar_showautotype = grouptype;
+                                                       mwindow->gui->zoombar->update_autozoom();
+                                               }
                                                break; }
 
                                        case Autos::AUTOMATION_TYPE_INT: {
@@ -2117,9 +2115,7 @@ int TrackCanvas::do_keyframes(int cursor_x,
                        }
                }
 
-               if(!result &&
-                       session->auto_conf->plugins /* &&
-                       mwindow->edl->session->show_assets */) {
+               if(!result && session->auto_conf->plugins) {
                        Plugin *plugin;
                        KeyFrame *keyframe;
                        result = do_plugin_autos(track, cursor_x, cursor_y,
@@ -2865,14 +2861,13 @@ void TrackCanvas::calculate_viewport(Track *track,
                mwindow->edl->local_session->zoom_sample /
                mwindow->edl->session->sample_rate;
        unit_end = track->to_doubleunits(view_end);
-       yscale = mwindow->edl->local_session->zoom_track;
-//printf("TrackCanvas::calculate_viewport yscale=%.0f\n", yscale);
-       center_pixel = (int)(track->y_pixel -
-                       mwindow->edl->local_session->track_start[pane->number] +
-                       yscale / 2) +
-               (mwindow->edl->session->show_titles ?
-                       mwindow->theme->get_image("title_bg_data")->get_h() :
-                       0);
+       yscale = resource_h();
+       center_pixel = track->y_pixel
+                       - mwindow->edl->local_session->track_start[pane->number];
+       if( track->show_assets() )
+               center_pixel += yscale / 2;
+       if( track->show_titles() )
+               center_pixel += mwindow->theme->get_image("title_bg_data")->get_h();
        zoom_sample = mwindow->edl->local_session->zoom_sample;
 
        zoom_units = track->to_doubleunits(zoom_sample / mwindow->edl->session->sample_rate);
@@ -3365,11 +3360,13 @@ int TrackCanvas::do_plugin_autos(Track *track, int cursor_x, int cursor_y,
        for(int i = 0; i < track->plugin_set.total && !result; i++)
        {
                PluginSet *plugin_set = track->plugin_set.values[i];
-               int center_pixel = (int)(track->y_pixel -
-                       mwindow->edl->local_session->track_start[pane->number] +
-                       mwindow->edl->local_session->zoom_track +
-                       (i + 0.5) * mwindow->theme->get_image("plugin_bg_data")->get_h() +
-                       (mwindow->edl->session->show_titles ? mwindow->theme->get_image("title_bg_data")->get_h() : 0));
+               int center_pixel = track->y_pixel -
+                       mwindow->edl->local_session->track_start[pane->number];
+               if( track->show_titles() )
+                       center_pixel += mwindow->theme->get_image("title_bg_data")->get_h();
+               if( track->show_assets() )
+                       center_pixel += resource_h();
+               center_pixel += (i + 0.5) * mwindow->theme->get_image("plugin_bg_data")->get_h();
 
                for(Plugin *plugin = (Plugin*)plugin_set->first;
                        plugin && !result;
@@ -3481,7 +3478,7 @@ void TrackCanvas::draw_overlays()
        draw_inout_points();
 
 // Transitions
-       if(mwindow->edl->session->auto_conf->transitions) draw_transitions();
+       draw_transitions();
 
 // Plugins
        draw_plugins();
@@ -3902,7 +3899,7 @@ void TrackCanvas::update_drag_caption()
 
 
 
-int TrackCanvas::cursor_motion_event()
+int TrackCanvas::cursor_update(int in_motion)
 {
        int result = 0;
        int cursor_x = 0;
@@ -3915,7 +3912,7 @@ int TrackCanvas::cursor_motion_event()
        int new_cursor = 0;
        int rerender = 0;
        double position = 0.;
-//printf("TrackCanvas::cursor_motion_event %d\n", __LINE__);
+//printf("TrackCanvas::cursor_update %d\n", __LINE__);
 
 // Default cursor
        switch(mwindow->edl->session->editing_mode)
@@ -3978,6 +3975,8 @@ int TrackCanvas::cursor_motion_event()
                case DRAG_PROJECTOR_Z:
                        if(active) rerender = update_overlay =
                                update_drag_floatauto(get_cursor_x(), get_cursor_y());
+                       if( rerender && mwindow->session->current_operation == DRAG_SPEED )
+                               mwindow->speed_after(!in_motion ? 1 : 0);
                        break;
 
                case DRAG_PLAY:
@@ -4027,22 +4026,26 @@ int TrackCanvas::cursor_motion_event()
                                position = mwindow->edl->align_to_frame(position, 0);
                                position = MAX(position, 0);
 
+                               double start = mwindow->edl->local_session->get_selectionstart(1);
+                               double end = mwindow->edl->local_session->get_selectionend(1);
                                if(position < selection_midpoint) {
                                        mwindow->edl->local_session->set_selectionend(selection_midpoint);
                                        mwindow->edl->local_session->set_selectionstart(position);
-       // Que the CWindow
-                                       gui->unlock_window();
-                                       mwindow->cwindow->update(1, 0, 0, 0, 1);
-                                       gui->lock_window("TrackCanvas::cursor_motion_event 1");
-       // Update the faders
-                                       mwindow->update_plugin_guis();
-                                       gui->update_patchbay();
                                }
                                else {
                                        mwindow->edl->local_session->set_selectionstart(selection_midpoint);
                                        mwindow->edl->local_session->set_selectionend(position);
-       // Don't que the CWindow
                                }
+       // Que the CWindow
+                               gui->unlock_window();
+                               int dir =
+                                       start != mwindow->edl->local_session->get_selectionstart(1) ? 1 :
+                                       end != mwindow->edl->local_session->get_selectionend(1) ? -1 : 0;
+                               mwindow->cwindow->update(dir, 0, 0, 0, 1);
+                               gui->lock_window("TrackCanvas::cursor_update 1");
+       // Update the faders
+                               mwindow->update_plugin_guis();
+                               gui->update_patchbay();
 
                                timebar_position = mwindow->edl->local_session->get_selectionend(1);
 
@@ -4074,7 +4077,7 @@ int TrackCanvas::cursor_motion_event()
                                for(int i = 0; i < TOTAL_PANES; i++)
                                        if(gui->pane[i]) gui->pane[i]->canvas->timebar_position = position;
 
-//printf("TrackCanvas::cursor_motion_event %d %d %p %p\n", __LINE__, pane->number, pane, pane->timebar);
+//printf("TrackCanvas::cursor_update %d %d %p %p\n", __LINE__, pane->number, pane, pane->timebar);
                                gui->update_timebar(0);
 // Update cursor
                                if(do_transitions(get_cursor_x(), get_cursor_y(),
@@ -4092,13 +4095,13 @@ int TrackCanvas::cursor_motion_event()
                        break;
        }
 
-//printf("TrackCanvas::cursor_motion_event 1\n");
+//printf("TrackCanvas::cursor_update 1\n");
        if(update_cursor && new_cursor != get_cursor())
        {
                set_cursor(new_cursor, 0, 1);
        }
 
-//printf("TrackCanvas::cursor_motion_event 1 %d\n", rerender);
+//printf("TrackCanvas::cursor_update 1 %d\n", rerender);
        if(rerender && render_timer->get_difference() > 0.25 ) {
                render_timer->update();
                mwindow->restart_brender();
@@ -4106,7 +4109,7 @@ int TrackCanvas::cursor_motion_event()
                mwindow->update_plugin_guis();
                gui->unlock_window();
                mwindow->cwindow->update(1, 0, 0, 0, 1);
-               gui->lock_window("TrackCanvas::cursor_motion_event 2");
+               gui->lock_window("TrackCanvas::cursor_update 2");
        }
        if(rerender) {
 // Update faders
@@ -4137,10 +4140,15 @@ int TrackCanvas::cursor_motion_event()
                gui->draw_overlays(1);
        }
 
-//printf("TrackCanvas::cursor_motion_event %d\n", __LINE__);
+//printf("TrackCanvas::cursor_update %d\n", __LINE__);
        return result;
 }
 
+int TrackCanvas::cursor_motion_event()
+{
+       return cursor_update(1);
+}
+
 void TrackCanvas::start_dragscroll()
 {
        if(!drag_scroll) {
@@ -4240,7 +4248,8 @@ int TrackCanvas::repeat_event(int64_t duration)
 
 int TrackCanvas::button_release_event()
 {
-       int redraw = 0, update_overlay = 0, result = 0;
+       int redraw = -1, update_overlay = 0;
+       int result = 0, load_flags = 0;
 
 // printf("TrackCanvas::button_release_event %d\n",
 // mwindow->session->current_operation);
@@ -4274,8 +4283,10 @@ int TrackCanvas::button_release_event()
                        result = 1;
                        break;
 
-               case DRAG_FADE:
                case DRAG_SPEED:
+                       redraw = FORCE_REDRAW;
+                       load_flags |= LOAD_EDITS;
+               case DRAG_FADE:
 // delete the drag_auto_gang first and remove out of order keys
                        synchronize_autos(0, 0, 0, -1);
                case DRAG_CZOOM:
@@ -4292,6 +4303,7 @@ int TrackCanvas::button_release_event()
                case DRAG_PROJECTOR_Y:
                case DRAG_PROJECTOR_Z:
                case DRAG_PLUGINKEY:
+                       load_flags |= LOAD_AUTOMATION;
                        mwindow->session->current_operation = NO_OPERATION;
                        mwindow->session->drag_handle = 0;
 // Remove any out-of-order keyframe
@@ -4302,8 +4314,7 @@ int TrackCanvas::button_release_event()
                                update_overlay = 1;
                        }
 
-
-                       mwindow->undo->update_undo_after(_("keyframe"), LOAD_AUTOMATION);
+                       mwindow->undo->update_undo_after(_("keyframe"), load_flags);
                        result = 1;
                        break;
 
@@ -4330,13 +4341,14 @@ int TrackCanvas::button_release_event()
        }
 
        if (result)
-               cursor_motion_event();
+               cursor_update(0);
 
        if(update_overlay) {
                gui->draw_overlays(1);
        }
-       if(redraw) {
-               gui->draw_canvas(NORMAL_DRAW, 0);
+       if(redraw >= 0) {
+               gui->draw_canvas(redraw, 0);
+               gui->flash_canvas(1);
        }
        return result;
 }
@@ -4348,9 +4360,9 @@ int TrackCanvas::do_edit_handles(int cursor_x, int cursor_y, int button_press,
        int handle_result = -1;
        int result = 0;
 
-       if( !mwindow->edl->session->show_assets ) return 0;
-
        for( Track *track=mwindow->edl->tracks->first; track && !result; track=track->next) {
+               if( !track->show_assets() ) continue;
+
                for( Edit *edit=track->edits->first; edit && !result; edit=edit->next ) {
                        int64_t edit_x, edit_y, edit_w, edit_h;
                        edit_dimensions(edit, edit_x, edit_y, edit_w, edit_h);
@@ -4469,8 +4481,6 @@ int TrackCanvas::do_plugin_handles(int cursor_x,
        int handle_result = 0;
        int result = 0;
 
-//     if(!mwindow->edl->session->show_assets) return 0;
-
        for(Track *track = mwindow->edl->tracks->first;
                track && !result;
                track = track->next) {
@@ -4537,17 +4547,17 @@ int TrackCanvas::do_tracks(int cursor_x, int cursor_y, int button_press)
 {
        int result = 0;
 
-//     if(!mwindow->edl->session->show_assets) return 0;
-
        for(Track *track = mwindow->edl->tracks->first;
                track && !result;
                track = track->next) {
                int64_t track_x, track_y, track_w, track_h;
                track_dimensions(track, track_x, track_y, track_w, track_h);
 
-               if(button_press && get_buttonpress() == RIGHT_BUTTON &&
-                       cursor_y >= track_y && cursor_y < track_y + track_h) {
-                       gui->edit_menu->update(track, 0);
+               if( button_press && get_buttonpress() == RIGHT_BUTTON &&
+                   cursor_y >= track_y && cursor_y < track_y + track_h) {
+                       double pos = mwindow->edl->get_cursor_position(cursor_x, pane->number);
+                       int64_t position = track->to_units(pos, 0);
+                       gui->edit_menu->update(track, track->edits->editof(position, PLAY_FORWARD, 0));
                        gui->edit_menu->activate_menu();
                        result = 1;
                }
@@ -4561,9 +4571,8 @@ int TrackCanvas::do_edits(int cursor_x, int cursor_y, int button_press, int drag
 {
        int result = 0;
 
-       if(!mwindow->edl->session->show_assets) return 0;
-
        for(Track *track = mwindow->edl->tracks->first; track && !result; track = track->next) {
+               if( !track->show_assets() ) continue;
 
                for(Edit *edit = track->edits->first; edit && !result; edit = edit->next) {
                        int64_t edit_x, edit_y, edit_w, edit_h;
@@ -4650,10 +4659,6 @@ int TrackCanvas::do_plugins(int cursor_x, int cursor_y, int drag_start,
        int64_t x, y, w, h;
        Track *track = 0;
 
-
-//     if(!mwindow->edl->session->show_assets) return 0;
-
-
        for(track = mwindow->edl->tracks->first; track && !done; track = track->next) {
                if(!track->expand_view) continue;
 
@@ -4762,15 +4767,14 @@ int TrackCanvas::do_transitions(int cursor_x, int cursor_y,
        int result = 0;
        int64_t x, y, w, h;
 
-       if(/* !mwindow->edl->session->show_assets || */
-               !mwindow->edl->session->auto_conf->transitions) return 0;
 
        for( Track *track = mwindow->edl->tracks->first; track && !result; track = track->next ) {
+               if( !track->show_transitions() ) continue;
 
                for( Edit *edit = track->edits->first; edit; edit = edit->next ) {
                        if( edit->transition ) {
                                edit_dimensions(edit, x, y, w, h);
-                               get_transition_coords(x, y, w, h);
+                               get_transition_coords(edit, x, y, w, h);
 
                                if( MWindowGUI::visible(x, x + w, 0, get_w()) &&
                                        MWindowGUI::visible(y, y + h, 0, get_h()) ) {
@@ -4810,23 +4814,15 @@ int TrackCanvas::button_press_event()
        mwindow->session->trim_edits = 0;
 
        if(is_event_win() && cursor_inside()) {
-//             double position = (double)cursor_x *
-//                     mwindow->edl->local_session->zoom_sample /
-//                     mwindow->edl->session->sample_rate +
-//                     (double)mwindow->edl->local_session->view_start[pane->number] *
-//                     mwindow->edl->local_session->zoom_sample /
-//                     mwindow->edl->session->sample_rate;
+//             double position = mwindow->edl->get_cursor_position(cursor_x, pane->number);
 
                result = 1;
                if(!active) {
                        activate();
                }
 
-               if( get_buttonpress() == LEFT_BUTTON &&
-                   gui->mbuttons->transport->engine->command->command != STOP ) {
-                       gui->unlock_window();
-                       gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
-                       gui->lock_window("TrackCanvas::button_press_event");
+               if( get_buttonpress() == LEFT_BUTTON ) {
+                       gui->stop_transport("TrackCanvas::button_press_event");
                }
 
                int update_overlay = 0, update_cursor = 0, rerender = 0;
@@ -4898,12 +4894,7 @@ int TrackCanvas::button_press_event()
 
 // Test handles only and select a region
                        case EDITING_IBEAM: {
-                               double position = (double)cursor_x *
-                                       mwindow->edl->local_session->zoom_sample /
-                                       mwindow->edl->session->sample_rate +
-                                       (double)mwindow->edl->local_session->view_start[pane->number] *
-                                       mwindow->edl->local_session->zoom_sample /
-                                       mwindow->edl->session->sample_rate;
+                               double position = mwindow->edl->get_cursor_position(cursor_x, pane->number);
 //printf("TrackCanvas::button_press_event %d\n", position);
 
                                if( do_transitions(cursor_x, cursor_y,