• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files

hvirtual/cinelerra/mwindowedit.C

Go to the documentation of this file.
00001 #include "asset.h"
00002 #include "assets.h"
00003 #include "awindowgui.h"
00004 #include "awindow.h"
00005 #include "bcsignals.h"
00006 #include "cache.h"
00007 #include "clip.h"
00008 #include "clipedit.h"
00009 #include "cplayback.h"
00010 #include "ctimebar.h"
00011 #include "cwindow.h"
00012 #include "cwindowgui.h"
00013 #include "bchash.h"
00014 #include "edl.h"
00015 #include "edlsession.h"
00016 #include "filexml.h"
00017 #include "gwindow.h"
00018 #include "gwindowgui.h"
00019 #include "keyframe.h"
00020 #include "language.h"
00021 #include "labels.h"
00022 #include "levelwindow.h"
00023 #include "localsession.h"
00024 #include "mainclock.h"
00025 #include "maincursor.h"
00026 #include "mainerror.h"
00027 #include "mainindexes.h"
00028 #include "mainmenu.h"
00029 #include "mainsession.h"
00030 #include "mainundo.h"
00031 #include "maskautos.h"
00032 #include "mtimebar.h"
00033 #include "mwindowgui.h"
00034 #include "mwindow.h"
00035 #include "panauto.h"
00036 #include "patchbay.h"
00037 #include "playbackengine.h"
00038 #include "pluginset.h"
00039 #include "recordlabel.h"
00040 #include "samplescroll.h"
00041 #include "trackcanvas.h"
00042 #include "track.h"
00043 #include "trackscroll.h"
00044 #include "tracks.h"
00045 #include "transition.h"
00046 #include "transportque.h"
00047 #include "units.h"
00048 #include "undostackitem.h"
00049 #include "vplayback.h"
00050 #include "vwindow.h"
00051 #include "vwindowgui.h"
00052 #include "zoombar.h"
00053 #include "automation.h"
00054 #include "maskautos.h"
00055 
00056 
00057 #include <string.h>
00058 
00059 
00060 
00061 
00062 
00063 
00064 void MWindow::add_audio_track_entry(int above, Track *dst)
00065 {
00066         add_audio_track(above, dst);
00067         save_backup();
00068         undo->update_undo(_("add track"), LOAD_ALL);
00069 
00070         restart_brender();
00071         gui->get_scrollbars();
00072         gui->canvas->draw();
00073         gui->patchbay->update();
00074         gui->cursor->draw(1);
00075         gui->canvas->flash();
00076         gui->canvas->activate();
00077         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00078                 CHANGE_EDL,
00079                 edl,
00080                 1);
00081 }
00082 
00083 void MWindow::add_video_track_entry(Track *dst)
00084 {
00085         add_video_track(1, dst);
00086         undo->update_undo(_("add track"), LOAD_ALL);
00087 
00088         restart_brender();
00089         gui->get_scrollbars();
00090         gui->canvas->draw();
00091         gui->patchbay->update();
00092         gui->cursor->draw(1);
00093         gui->canvas->flash();
00094         gui->canvas->activate();
00095         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00096                                                         CHANGE_EDL,
00097                                                         edl,
00098                                                         1);
00099         save_backup();
00100 }
00101 
00102 
00103 int MWindow::add_audio_track(int above, Track *dst)
00104 {
00105         edl->tracks->add_audio_track(above, dst);
00106         edl->tracks->update_y_pixels(theme);
00107         save_backup();
00108         return 0;
00109 }
00110 
00111 int MWindow::add_video_track(int above, Track *dst)
00112 {
00113         edl->tracks->add_video_track(above, dst);
00114         edl->tracks->update_y_pixels(theme);
00115         save_backup();
00116         return 0;
00117 }
00118 
00119 
00120 
00121 
00122 
00123 void MWindow::asset_to_size()
00124 {
00125         if(session->drag_assets->total &&
00126                 session->drag_assets->values[0]->video_data)
00127         {
00128                 int w, h;
00129 
00130 // Get w and h
00131                 w = session->drag_assets->values[0]->width;
00132                 h = session->drag_assets->values[0]->height;
00133 
00134 
00135                 edl->session->output_w = w;
00136                 edl->session->output_h = h;
00137 
00138                 if(((edl->session->output_w % 4) || 
00139                         (edl->session->output_h % 4)) && 
00140                         edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL)
00141                 {
00142                         MainError::show_error(
00143                                 _("This project's dimensions are not multiples of 4 so\n"
00144                                 "it can't be rendered by OpenGL."));
00145                 }
00146 
00147 
00148 // Get aspect ratio
00149                 if(defaults->get("AUTOASPECT", 0))
00150                 {
00151                         create_aspect_ratio(edl->session->aspect_w, 
00152                                 edl->session->aspect_h, 
00153                                 w, 
00154                                 h);
00155                 }
00156 
00157                 save_backup();
00158 
00159                 undo->update_undo(_("asset to size"), LOAD_ALL);
00160                 restart_brender();
00161                 sync_parameters(CHANGE_ALL);
00162         }
00163 }
00164 
00165 
00166 void MWindow::asset_to_rate()
00167 {
00168         if(session->drag_assets->total &&
00169                 session->drag_assets->values[0]->video_data)
00170         {
00171                 double new_framerate = session->drag_assets->values[0]->frame_rate;
00172                 double old_framerate = edl->session->frame_rate;
00173 
00174                 edl->session->frame_rate = new_framerate;
00175                 edl->resample(old_framerate, new_framerate, TRACK_VIDEO);
00176 
00177                 save_backup();
00178 
00179                 undo->update_undo(_("asset to rate"), LOAD_ALL);
00180                 restart_brender();
00181                 gui->update(1,
00182                         2,
00183                         1,
00184                         1,
00185                         1, 
00186                         1,
00187                         0);
00188                 sync_parameters(CHANGE_ALL);
00189         }
00190 }
00191 
00192 
00193 
00194 void MWindow::clear_entry()
00195 {
00196         clear(1);
00197 
00198         edl->optimize();
00199         save_backup();
00200         undo->update_undo(_("clear"), LOAD_EDITS | LOAD_TIMEBAR);
00201 
00202         restart_brender();
00203         update_plugin_guis();
00204         gui->update(1, 2, 1, 1, 1, 1, 0);
00205         cwindow->update(1, 0, 0, 0, 1);
00206         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00207                            CHANGE_EDL,
00208                            edl,
00209                            1);
00210 }
00211 
00212 void MWindow::clear(int clear_handle)
00213 {
00214         double start = edl->local_session->get_selectionstart();
00215         double end = edl->local_session->get_selectionend();
00216         if(clear_handle || !EQUIV(start, end))
00217         {
00218                 edl->clear(start, 
00219                         end, 
00220                         edl->session->labels_follow_edits, 
00221                         edl->session->plugins_follow_edits);
00222         }
00223 }
00224 
00225 void MWindow::straighten_automation()
00226 {
00227         edl->tracks->straighten_automation(
00228                 edl->local_session->get_selectionstart(), 
00229                 edl->local_session->get_selectionend()); 
00230         save_backup();
00231         undo->update_undo(_("straighten curves"), LOAD_AUTOMATION); 
00232 
00233         restart_brender();
00234         update_plugin_guis();
00235         gui->canvas->draw_overlays();
00236         gui->canvas->flash();
00237         sync_parameters(CHANGE_PARAMS);
00238         gui->patchbay->update();
00239         cwindow->update(1, 0, 0);
00240 }
00241 
00242 void MWindow::clear_automation()
00243 {
00244         edl->tracks->clear_automation(edl->local_session->get_selectionstart(), 
00245                 edl->local_session->get_selectionend()); 
00246         save_backup();
00247         undo->update_undo(_("clear keyframes"), LOAD_AUTOMATION); 
00248 
00249         restart_brender();
00250         update_plugin_guis();
00251         gui->canvas->draw_overlays();
00252         gui->canvas->flash();
00253         sync_parameters(CHANGE_PARAMS);
00254         gui->patchbay->update();
00255         cwindow->update(1, 0, 0);
00256 }
00257 
00258 int MWindow::clear_default_keyframe()
00259 {
00260         edl->tracks->clear_default_keyframe();
00261         save_backup();
00262         undo->update_undo(_("clear default keyframe"), LOAD_AUTOMATION);
00263         
00264         restart_brender();
00265         gui->canvas->draw_overlays();
00266         gui->canvas->flash();
00267         sync_parameters(CHANGE_PARAMS);
00268         gui->patchbay->update();
00269         cwindow->update(1, 0, 0);
00270         
00271         return 0;
00272 }
00273 
00274 void MWindow::clear_labels()
00275 {
00276         clear_labels(edl->local_session->get_selectionstart(), 
00277                 edl->local_session->get_selectionend()); 
00278         undo->update_undo(_("clear labels"), LOAD_TIMEBAR);
00279         
00280         gui->timebar->update();
00281         cwindow->update(0, 0, 0, 0, 1);
00282         save_backup();
00283 }
00284 
00285 int MWindow::clear_labels(double start, double end)
00286 {
00287         edl->labels->clear(start, end, 0);
00288         return 0;
00289 }
00290 
00291 void MWindow::concatenate_tracks()
00292 {
00293         edl->tracks->concatenate_tracks(edl->session->plugins_follow_edits);
00294         save_backup();
00295         undo->update_undo(_("concatenate tracks"), LOAD_EDITS);
00296 
00297         restart_brender();
00298         gui->update(1, 1, 0, 0, 1, 0, 0);
00299         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00300                 CHANGE_EDL,
00301                 edl,
00302                 1);
00303 }
00304 
00305 
00306 void MWindow::copy()
00307 {
00308         copy(edl->local_session->get_selectionstart(), 
00309                 edl->local_session->get_selectionend());
00310 }
00311 
00312 int MWindow::copy(double start, double end)
00313 {
00314         if(start == end) return 1;
00315 
00316 //printf("MWindow::copy 1\n");
00317         FileXML file;
00318 //printf("MWindow::copy 1\n");
00319         edl->copy(start, 
00320                 end, 
00321                 0,
00322                 0,
00323                 0,
00324                 &file, 
00325                 plugindb,
00326                 "",
00327                 1);
00328 //printf("MWindow::copy 1\n");
00329 
00330 // File is now terminated and rewound
00331 
00332 //printf("MWindow::copy 1\n");
00333         gui->get_clipboard()->to_clipboard(file.string, strlen(file.string), SECONDARY_SELECTION);
00334 //printf("MWindow::copy\n%s\n", file.string);
00335 //printf("MWindow::copy 2\n");
00336         save_backup();
00337         return 0;
00338 }
00339 
00340 int MWindow::copy_automation()
00341 {
00342         FileXML file;
00343         edl->tracks->copy_automation(edl->local_session->get_selectionstart(), 
00344                 edl->local_session->get_selectionend(),
00345                 &file,
00346                 0,
00347                 0); 
00348         gui->get_clipboard()->to_clipboard(file.string, 
00349                 strlen(file.string), 
00350                 SECONDARY_SELECTION);
00351         return 0;
00352 }
00353 
00354 int MWindow::copy_default_keyframe()
00355 {
00356         FileXML file;
00357         edl->tracks->copy_default_keyframe(&file);
00358         gui->get_clipboard()->to_clipboard(file.string,
00359                 strlen(file.string),
00360                 SECONDARY_SELECTION);
00361         return 0;
00362 }
00363 
00364 
00365 // Uses cropping coordinates in edl session to crop and translate video.
00366 // We modify the projector since camera automation depends on the track size.
00367 void MWindow::crop_video()
00368 {
00369 
00370 // Clamp EDL crop region
00371         if(edl->session->crop_x1 > edl->session->crop_x2)
00372         {
00373                 edl->session->crop_x1 ^= edl->session->crop_x2;
00374                 edl->session->crop_x2 ^= edl->session->crop_x1;
00375                 edl->session->crop_x1 ^= edl->session->crop_x2;
00376         }
00377         if(edl->session->crop_y1 > edl->session->crop_y2)
00378         {
00379                 edl->session->crop_y1 ^= edl->session->crop_y2;
00380                 edl->session->crop_y2 ^= edl->session->crop_y1;
00381                 edl->session->crop_y1 ^= edl->session->crop_y2;
00382         }
00383 
00384         float old_projector_x = (float)edl->session->output_w / 2;
00385         float old_projector_y = (float)edl->session->output_h / 2;
00386         float new_projector_x = (float)(edl->session->crop_x1 + edl->session->crop_x2) / 2;
00387         float new_projector_y = (float)(edl->session->crop_y1 + edl->session->crop_y2) / 2;
00388         float projector_offset_x = -(new_projector_x - old_projector_x);
00389         float projector_offset_y = -(new_projector_y - old_projector_y);
00390 
00391         edl->tracks->translate_projector(projector_offset_x, projector_offset_y);
00392 
00393         edl->session->output_w = edl->session->crop_x2 - edl->session->crop_x1;
00394         edl->session->output_h = edl->session->crop_y2 - edl->session->crop_y1;
00395         edl->session->crop_x1 = 0;
00396         edl->session->crop_y1 = 0;
00397         edl->session->crop_x2 = edl->session->output_w;
00398         edl->session->crop_y2 = edl->session->output_h;
00399 
00400 // Recalculate aspect ratio
00401         if(defaults->get("AUTOASPECT", 0))
00402         {
00403                 create_aspect_ratio(edl->session->aspect_w, 
00404                         edl->session->aspect_h, 
00405                         edl->session->output_w, 
00406                         edl->session->output_h);
00407         }
00408 
00409         undo->update_undo(_("crop"), LOAD_ALL);
00410 
00411         restart_brender();
00412         cwindow->playback_engine->que->send_command(CURRENT_FRAME,
00413                 CHANGE_ALL,
00414                 edl,
00415                 1);
00416         save_backup();
00417 }
00418 
00419 void MWindow::cut()
00420 {
00421 
00422         double start = edl->local_session->get_selectionstart();
00423         double end = edl->local_session->get_selectionend();
00424 
00425         copy(start, end);
00426         edl->clear(start, 
00427                 end,
00428                 edl->session->labels_follow_edits, 
00429                 edl->session->plugins_follow_edits);
00430 
00431 
00432         edl->optimize();
00433         save_backup();
00434         undo->update_undo(_("cut"), LOAD_EDITS | LOAD_TIMEBAR);
00435 
00436         restart_brender();
00437         update_plugin_guis();
00438         gui->update(1, 2, 1, 1, 1, 1, 0);
00439         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00440                                                         CHANGE_EDL,
00441                                                         edl,
00442                                                         1);
00443 }
00444 
00445 int MWindow::cut_automation()
00446 {
00447         
00448         copy_automation();
00449 
00450         edl->tracks->clear_automation(edl->local_session->get_selectionstart(), 
00451                 edl->local_session->get_selectionend()); 
00452         save_backup();
00453         undo->update_undo(_("cut keyframes"), LOAD_AUTOMATION); 
00454 
00455 
00456         restart_brender();
00457         update_plugin_guis();
00458         gui->canvas->draw_overlays();
00459         gui->canvas->flash();
00460         sync_parameters(CHANGE_PARAMS);
00461         gui->patchbay->update();
00462         cwindow->update(1, 0, 0);
00463         return 0;
00464 }
00465 
00466 int MWindow::cut_default_keyframe()
00467 {
00468 
00469         copy_default_keyframe();
00470         edl->tracks->clear_default_keyframe();
00471         undo->update_undo(_("cut default keyframe"), LOAD_AUTOMATION);
00472 
00473         restart_brender();
00474         gui->canvas->draw_overlays();
00475         gui->canvas->flash();
00476         sync_parameters(CHANGE_PARAMS);
00477         gui->patchbay->update();
00478         cwindow->update(1, 0, 0);
00479         save_backup();
00480 
00481 
00482         return 0;
00483 }
00484 
00485 void MWindow::delete_inpoint()
00486 {
00487         edl->local_session->unset_inpoint();
00488         save_backup();
00489 }
00490 
00491 void MWindow::delete_outpoint()
00492 {
00493         edl->local_session->unset_outpoint();
00494         save_backup();
00495 }
00496 
00497 void MWindow::delete_track()
00498 {
00499         if (edl->tracks->last)
00500                 delete_track(edl->tracks->last);
00501 }
00502 
00503 void MWindow::delete_tracks()
00504 {
00505         edl->tracks->delete_tracks();
00506         undo->update_undo(_("delete tracks"), LOAD_ALL);
00507         save_backup();
00508 
00509         restart_brender();
00510         update_plugin_states();
00511         gui->update(1, 1, 1, 0, 1, 0, 0);
00512         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00513                            CHANGE_EDL,
00514                            edl,
00515                            1);
00516 }
00517 
00518 void MWindow::delete_track(Track *track)
00519 {
00520         edl->tracks->delete_track(track);
00521         undo->update_undo(_("delete track"), LOAD_ALL);
00522 
00523         restart_brender();
00524         update_plugin_states();
00525         gui->update(1, 1, 1, 0, 1, 0, 0);
00526         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00527                            CHANGE_EDL,
00528                            edl,
00529                            1);
00530         save_backup();
00531 }
00532 
00533 void MWindow::detach_transition(Transition *transition)
00534 {
00535         hide_plugin(transition, 1);
00536         int is_video = (transition->edit->track->data_type == TRACK_VIDEO);
00537         transition->edit->detach_transition();
00538         save_backup();
00539         undo->update_undo(_("detach transition"), LOAD_ALL);
00540 
00541         if(is_video) restart_brender();
00542         gui->update(0,
00543                 1,
00544                 0,
00545                 0,
00546                 0, 
00547                 0,
00548                 0);
00549         sync_parameters(CHANGE_EDL);
00550 }
00551 
00552 
00553 
00554 
00555 
00556 // Insert data from clipboard
00557 void MWindow::insert(double position, 
00558         FileXML *file,
00559         int edit_labels,
00560         int edit_plugins,
00561         EDL *parent_edl)
00562 {
00563 // For clipboard pasting make the new edl use a separate session 
00564 // from the master EDL.  Then it can be resampled to the master rates.
00565 // For splice, overwrite, and dragging need same session to get the assets.
00566         EDL edl(parent_edl);
00567         ArrayList<EDL*> new_edls;
00568         uint32_t load_flags = LOAD_ALL;
00569 
00570 
00571         new_edls.append(&edl);
00572         edl.create_objects();
00573 
00574 
00575 
00576 
00577         if(parent_edl) load_flags &= ~LOAD_SESSION;
00578         if(!edl.session->autos_follow_edits) load_flags &= ~LOAD_AUTOMATION;
00579         if(!edl.session->labels_follow_edits) load_flags &= ~LOAD_TIMEBAR;
00580 
00581         edl.load_xml(plugindb, file, load_flags);
00582 
00583 
00584 
00585 
00586 
00587 
00588         paste_edls(&new_edls, 
00589                 LOAD_PASTE, 
00590                 0, 
00591                 position,
00592                 edit_labels,
00593                 edit_plugins,
00594                 0); // overwrite
00595 // if(vwindow->edl)
00596 // printf("MWindow::insert 5 %f %f\n", 
00597 // vwindow->edl->local_session->in_point,
00598 // vwindow->edl->local_session->out_point);
00599         new_edls.remove_all();
00600 //printf("MWindow::insert 6 %p\n", vwindow->get_edl());
00601 }
00602 
00603 void MWindow::insert_effects_canvas(double start,
00604         double length)
00605 {
00606         Track *dest_track = session->track_highlighted;
00607         if(!dest_track) return;
00608 
00609 
00610         for(int i = 0; i < session->drag_pluginservers->total; i++)
00611         {
00612                 PluginServer *plugin = session->drag_pluginservers->values[i];
00613 
00614                 insert_effect(plugin->title,
00615                         0,
00616                         dest_track,
00617                         i == 0 ? session->pluginset_highlighted : 0,
00618                         start,
00619                         length,
00620                         PLUGIN_STANDALONE);
00621         }
00622 
00623         save_backup();
00624         undo->update_undo(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
00625         restart_brender();
00626         sync_parameters(CHANGE_EDL);
00627 // GUI updated in TrackCanvas, after current_operations are reset
00628 }
00629 
00630 void MWindow::insert_effects_cwindow(Track *dest_track)
00631 {
00632         if(!dest_track) return;
00633 
00634 
00635         double start = 0;
00636         double length = dest_track->get_length();
00637 
00638         if(edl->local_session->get_selectionend() > 
00639                 edl->local_session->get_selectionstart())
00640         {
00641                 start = edl->local_session->get_selectionstart();
00642                 length = edl->local_session->get_selectionend() - 
00643                         edl->local_session->get_selectionstart();
00644         }
00645 
00646         for(int i = 0; i < session->drag_pluginservers->total; i++)
00647         {
00648                 PluginServer *plugin = session->drag_pluginservers->values[i];
00649 
00650 
00651                 insert_effect(plugin->title,
00652                         0,
00653                         dest_track,
00654                         0,
00655                         start,
00656                         length,
00657                         PLUGIN_STANDALONE);
00658         }
00659 
00660         save_backup();
00661         undo->update_undo(_("insert effect"), LOAD_EDITS | LOAD_PATCHES);
00662         restart_brender();
00663         sync_parameters(CHANGE_EDL);
00664         gui->update(1,
00665                 1,
00666                 0,
00667                 0,
00668                 1,
00669                 0,
00670                 0);
00671 }
00672 
00673 
00674 
00675 void MWindow::insert_effect(char *title, 
00676         SharedLocation *shared_location, 
00677         Track *track,
00678         PluginSet *plugin_set,
00679         double start,
00680         double length,
00681         int plugin_type)
00682 {
00683         KeyFrame *default_keyframe = 0;
00684         PluginServer *server = 0;
00685 
00686 
00687 
00688 
00689 
00690 
00691 // Get default keyframe
00692         if(plugin_type == PLUGIN_STANDALONE)
00693         {
00694                 default_keyframe = new KeyFrame;
00695                 server = new PluginServer(*scan_plugindb(title, track->data_type));
00696 
00697                 server->open_plugin(0, preferences, edl, 0, -1);
00698                 server->save_data(default_keyframe);
00699         }
00700 
00701 
00702 
00703 // Insert plugin object
00704         track->insert_effect(title, 
00705                 shared_location, 
00706                 default_keyframe, 
00707                 plugin_set,
00708                 start,
00709                 length,
00710                 plugin_type);
00711 
00712         track->optimize();
00713 
00714 
00715         if(plugin_type == PLUGIN_STANDALONE)
00716         {
00717                 server->close_plugin();
00718                 delete server;
00719                 delete default_keyframe;
00720         }
00721 }
00722 
00723 int MWindow::modify_edithandles()
00724 {
00725 
00726         edl->modify_edithandles(session->drag_start, 
00727                 session->drag_position, 
00728                 session->drag_handle, 
00729                 edl->session->edit_handle_mode[session->drag_button],
00730                 edl->session->labels_follow_edits, 
00731                 edl->session->plugins_follow_edits);
00732 
00733         finish_modify_handles();
00734 
00735 
00736 //printf("MWindow::modify_handles 1\n");
00737         return 0;
00738 }
00739 
00740 int MWindow::modify_pluginhandles()
00741 {
00742 
00743         edl->modify_pluginhandles(session->drag_start, 
00744                 session->drag_position, 
00745                 session->drag_handle, 
00746                 edl->session->edit_handle_mode[session->drag_button],
00747                 edl->session->labels_follow_edits,
00748                 session->trim_edits);
00749 
00750         finish_modify_handles();
00751 
00752         return 0;
00753 }
00754 
00755 
00756 // Common to edithandles and plugin handles
00757 void MWindow::finish_modify_handles()
00758 {
00759         int edit_mode = edl->session->edit_handle_mode[session->drag_button];
00760 
00761         if((session->drag_handle == 1 && edit_mode != MOVE_NO_EDITS) ||
00762                 (session->drag_handle == 0 && edit_mode == MOVE_ONE_EDIT))
00763         {
00764                 edl->local_session->set_selectionstart(session->drag_position);
00765                 edl->local_session->set_selectionend(session->drag_position);
00766         }
00767         else
00768         if(edit_mode != MOVE_NO_EDITS)
00769         {
00770                 edl->local_session->set_selectionstart(session->drag_start);
00771                 edl->local_session->set_selectionend(session->drag_start);
00772         }
00773 
00774         if(edl->local_session->get_selectionstart(1) < 0)
00775         {
00776                 edl->local_session->set_selectionstart(0);
00777                 edl->local_session->set_selectionend(0);
00778         }
00779 
00780         save_backup();
00781         undo->update_undo(_("drag handle"), LOAD_EDITS | LOAD_TIMEBAR);
00782         restart_brender();
00783         sync_parameters(CHANGE_EDL);
00784         update_plugin_guis();
00785         gui->update(1, 2, 1, 1, 1, 1, 0);
00786         cwindow->update(1, 0, 0, 0, 1);
00787 }
00788 
00789 void MWindow::match_output_size(Track *track)
00790 {
00791         track->track_w = edl->session->output_w;
00792         track->track_h = edl->session->output_h;
00793         save_backup();
00794         undo->update_undo(_("match output size"), LOAD_ALL);
00795 
00796         restart_brender();
00797         sync_parameters(CHANGE_EDL);
00798 }
00799 
00800 
00801 void MWindow::move_edits(ArrayList<Edit*> *edits, 
00802                 Track *track,
00803                 double position,
00804                 int behaviour)
00805 {
00806 
00807         edl->tracks->move_edits(edits, 
00808                 track, 
00809                 position,
00810                 edl->session->labels_follow_edits, 
00811                 edl->session->plugins_follow_edits,
00812                 behaviour);
00813 
00814         save_backup();
00815         undo->update_undo(_("move edit"), LOAD_ALL);
00816 
00817         restart_brender();
00818         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00819                 CHANGE_EDL,
00820                 edl,
00821                 1);
00822 
00823         update_plugin_guis();
00824         gui->update(1,
00825                 1,      // 1 for incremental drawing.  2 for full refresh
00826                 1,
00827                 0,
00828                 0, 
00829                 0,
00830                 0);
00831 }
00832 
00833 void MWindow::move_effect(Plugin *plugin,
00834         PluginSet *dest_plugin_set,
00835         Track *dest_track,
00836         int64_t dest_position)
00837 {
00838 
00839         edl->tracks->move_effect(plugin, 
00840                 dest_plugin_set, 
00841                 dest_track, 
00842                 dest_position);
00843 
00844         save_backup();
00845         undo->update_undo(_("move effect"), LOAD_ALL);
00846 
00847         restart_brender();
00848         cwindow->playback_engine->que->send_command(CURRENT_FRAME, 
00849                 CHANGE_EDL,
00850