blade and hard egdes, undo cache reset bug, sams ladspa icons, theme image access...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / trackcanvas.C
index 5d925e6e1a3650180ba13526f339be1033192108..00ca2b6392588eb75c9f2be0085f630100ffae4f 100644 (file)
@@ -1596,7 +1596,7 @@ void TrackCanvas::draw_plugins()
        char string[BCTEXTLEN];
        int current_on = 0;
        int current_show = 0;
-
+       int current_preset = 0;
 
 //     if(!mwindow->edl->session->show_assets) goto done;
 
@@ -1604,6 +1604,8 @@ void TrackCanvas::draw_plugins()
                plugin_on_toggles.values[i]->in_use = 0;
        for(int i = 0; i < plugin_show_toggles.total; i++)
                plugin_show_toggles.values[i]->in_use = 0;
+       for(int i = 0; i < preset_edit_buttons.total; i++)
+               plugin_show_toggles.values[i]->in_use = 0;
 
 
        for(Track *track = mwindow->edl->tracks->first;
@@ -1711,9 +1713,21 @@ void TrackCanvas::draw_plugins()
                                                                }
                                                                current_show++;
                                                        }
-
-
-
+                                                       toggle_x -= PluginPresetEdit::calculate_w(mwindow) + 10;
+                                                       if(toggle_x > min_x)
+                                                       {
+                                                               if(current_preset >= preset_edit_buttons.total)
+                                                               {
+                                                                       PluginPresetEdit *preset_edit = new PluginPresetEdit(mwindow, toggle_x, toggle_y, plugin);
+                                                                       add_subwindow(preset_edit);
+                                                                       preset_edit_buttons.append(preset_edit);
+                                                               }
+                                                               else
+                                                               {
+                                                                       preset_edit_buttons.values[current_preset]->update(toggle_x, toggle_y, plugin);
+                                                               }
+                                                               current_preset++;
+                                                       }
                                                }
                                        }
                                }
@@ -1723,6 +1737,10 @@ void TrackCanvas::draw_plugins()
 
 // Remove unused toggles
 
+       while(current_preset < preset_edit_buttons.total)
+       {
+               preset_edit_buttons.remove_object_number(current_preset);
+       }
        while(current_show < plugin_show_toggles.total)
        {
                plugin_show_toggles.remove_object_number(current_show);
@@ -1732,7 +1750,6 @@ void TrackCanvas::draw_plugins()
        {
                plugin_on_toggles.remove_object_number(current_on);
        }
-
 }
 
 void TrackCanvas::refresh_plugintoggles()
@@ -1747,6 +1764,41 @@ void TrackCanvas::refresh_plugintoggles()
                PluginShow *show = plugin_show_toggles.values[i];
                show->reposition_window(show->get_x(), show->get_y());
        }
+       for(int i = 0; i < preset_edit_buttons.total; i++)
+       {
+               PluginPresetEdit *preset_edit = preset_edit_buttons.values[i];
+               preset_edit->reposition_window(preset_edit->get_x(), preset_edit->get_y());
+       }
+}
+
+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;
+                       if( edit->hard_left ) {
+                               ArrayList<int> xpt, ypt;
+                               xpt.append(x);              ypt.append(y1);
+                               xpt.append(x+HANDLE_W);     ypt.append(y1);
+                               xpt.append(x);              ypt.append(y1-HANDLE_H);
+                               fill_polygon(&xpt, &ypt);
+                       }
+                       if( edit->hard_right ) {
+                               ArrayList<int> xpt, ypt;   int x1 = x+w-1;
+                               xpt.append(x1);            ypt.append(y1);
+                               xpt.append(x1-HANDLE_W);   ypt.append(y1);
+                               xpt.append(x1);            ypt.append(y1-HANDLE_H);
+                               fill_polygon(&xpt, &ypt);
+                       }
+               }
+       }
 }
 
 void TrackCanvas::draw_inout_points()
@@ -3420,6 +3472,7 @@ void TrackCanvas::draw_overlays()
 
 // Plugins
        draw_plugins();
+       draw_hard_edges();
 
 // Loop points
        draw_loop_points();
@@ -4279,53 +4332,58 @@ int TrackCanvas::do_edit_handles(int cursor_x, int cursor_y, int button_press,
        int &rerender, int &update_overlay, int &new_cursor, int &update_cursor)
 {
        Edit *edit_result = 0;
-       int handle_result = 0;
+       int handle_result = -1;
        int result = 0;
 
-       if(!mwindow->edl->session->show_assets) return 0;
+       if( !mwindow->edl->session->show_assets ) return 0;
 
-       for(Track *track = mwindow->edl->tracks->first;
-               track && !result;
-               track = track->next) {
-               for(Edit *edit = track->edits->first;
-                       edit && !result;
-                       edit = edit->next) {
+       for( Track *track=mwindow->edl->tracks->first; track && !result; track=track->next) {
+               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);
 
-                       if(cursor_x >= edit_x && cursor_x <= edit_x + edit_w &&
-                               cursor_y >= edit_y && cursor_y < edit_y + edit_h) {
-                               if(cursor_x < edit_x + HANDLE_W) {
+                       if( cursor_x >= edit_x && cursor_x <= edit_x + edit_w &&
+                               cursor_y >= edit_y && cursor_y < edit_y + edit_h ) {
+                               if( cursor_x < edit_x + HANDLE_W ) {
                                        edit_result = edit;
                                        handle_result = 0;
-                                       result = 1;
+                                       if( cursor_y >= edit_y+edit_h - HANDLE_W ) {
+                                               new_cursor = DOWNLEFT_RESIZE;
+                                               if( button_press == LEFT_BUTTON )
+                                                       result = -1;
+                                       }
+                                       else
+                                               result = 1;
                                }
-                               else if(cursor_x >= edit_x + edit_w - HANDLE_W) {
+                               else if( cursor_x >= edit_x + edit_w - HANDLE_W ) {
                                        edit_result = edit;
                                        handle_result = 1;
-                                       result = 1;
-                               }
-                               else {
-                                       result = 0;
+                                       if( cursor_y >= edit_y+edit_h - HANDLE_W ) {
+                                               new_cursor = DOWNRIGHT_RESIZE;
+                                               if( button_press == LEFT_BUTTON )
+                                                       result = -1;
+                                       }
+                                       else
+                                               result = 1;
                                }
                        }
                }
        }
 
        update_cursor = 1;
-       if(result) {
+       if( result > 0 ) {
                double position = 0;
-               if(handle_result == 0) {
+               if( handle_result == 0 ) {
                        position = edit_result->track->from_units(edit_result->startproject);
                        new_cursor = LEFT_CURSOR;
                }
-               else if(handle_result == 1) {
+               else if( handle_result == 1 ) {
                        position = edit_result->track->from_units(edit_result->startproject + edit_result->length);
                        new_cursor = RIGHT_CURSOR;
                }
 
 // Reposition cursor
-               if(button_press) {
+               if( button_press ) {
                        mwindow->session->drag_edit = edit_result;
                        mwindow->session->drag_handle = handle_result;
                        mwindow->session->drag_button = get_buttonpress() - 1;
@@ -4339,6 +4397,43 @@ int TrackCanvas::do_edit_handles(int cursor_x, int cursor_y, int button_press,
                        update_overlay = 1;
                }
        }
+       else if( result <  0) {
+               mwindow->undo->update_undo_before();
+               if( !shift_down() ) {
+                       if( handle_result == 0 )
+                               edit_result->hard_left = !edit_result->hard_left;
+                       else if( handle_result == 1 )
+                               edit_result->hard_right = !edit_result->hard_right;
+               }
+               else {
+                       int status = handle_result == 0 ? edit_result->hard_left :
+                                    handle_result == 1 ? edit_result->hard_right : 0;
+                       int new_status = !status;
+                       int64_t edit_edge = edit_result->startproject;
+                       if( handle_result == 1 ) edit_edge += edit_result->length;
+                       double edge_position = edit_result->track->from_units(edit_edge);
+                       for( Track *track=mwindow->edl->tracks->first; track!=0; track=track->next ) {
+                               int64_t track_position = track->to_units(edge_position, 1);
+                               Edit *left_edit = track->edits->editof(track_position, PLAY_FORWARD, 0);
+                               if( left_edit ) {
+                                       int64_t left_edge = left_edit->startproject;
+                                       double left_position = track->from_units(left_edge);
+                                       if( EQUIV(edge_position, left_position) )
+                                               left_edit->hard_left = new_status;
+                               }
+                               Edit *right_edit = track->edits->editof(track_position, PLAY_REVERSE, 0);
+                               if( right_edit ) {
+                                       int64_t right_edge = right_edit->startproject + right_edit->length;
+                                       double right_position = track->from_units(right_edge);
+                                       if( EQUIV(edge_position, right_position) )
+                                               right_edit->hard_right = new_status;
+                               }
+                       }
+               }
+               rerender = update_overlay = 1;
+               mwindow->undo->update_undo_after(_("hard_edge"), LOAD_EDITS);
+               result = 1;
+       }
 
        return result;
 }
@@ -4509,8 +4604,6 @@ int TrackCanvas::do_edits(int cursor_x, int cursor_y, int button_press, int drag
 
                                                int cx, cy;
                                                get_abs_cursor(cx, cy);
-                                               cx -= mwindow->theme->get_image("clip_icon")->get_w() / 2,
-                                               cy -= mwindow->theme->get_image("clip_icon")->get_h() / 2;
                                                gui->drag_popup = new BC_DragWindow(gui,
                                                        mwindow->theme->get_image("clip_icon"), cx, cy);
 
@@ -4623,8 +4716,6 @@ int TrackCanvas::do_plugins(int cursor_x, int cursor_y, int drag_start,
                                        }
                                        int cx, cy;
                                        get_abs_cursor(cx, cy);
-                                       cx -= frame->get_w() / 2;
-                                       cy -= frame->get_h() / 2;
                                        gui->drag_popup = new BC_DragWindow(gui, frame, cx, cy);
                                                break; }
 
@@ -4633,8 +4724,6 @@ int TrackCanvas::do_plugins(int cursor_x, int cursor_y, int drag_start,
                                        VFrame *frame = mwindow->theme->get_image("clip_icon");
                                        int cx, cy;
                                        get_abs_cursor(cx, cy);
-                                       cx -= frame->get_w() / 2;
-                                       cy -= frame->get_h() / 2;
                                        gui->drag_popup = new BC_DragWindow(gui, frame, cx, cy);
                                        break; }
                                }