X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindowedit.C;h=24763f75af6fc12d1b82917086f38620c97d496b;hb=9f0e523f895dabf635f694efc854f2be479d712c;hp=d69496dc7e9d99533bcbf83c982248ec17e698f1;hpb=df72ca6732207dc25472a23169ff79ef6d4cca1c;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/mwindowedit.C b/cinelerra-5.1/cinelerra/mwindowedit.C index d69496dc..24763f75 100644 --- a/cinelerra-5.1/cinelerra/mwindowedit.C +++ b/cinelerra-5.1/cinelerra/mwindowedit.C @@ -354,7 +354,9 @@ void MWindow::set_automation_mode(int mode) save_backup(); char string[BCSTRLEN]; sprintf(string,"set %s", FloatAuto::curve_name(mode)); - undo->update_undo_after(string, LOAD_AUTOMATION); + undo->update_undo_after(string, + !changed_edl ? LOAD_AUTOMATION : + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_gui(changed_edl); } @@ -366,7 +368,9 @@ void MWindow::clear_automation() edl->local_session->get_selectionend()); int changed_edl = speed_after(1); save_backup(); - undo->update_undo_after(_("clear keyframes"), LOAD_AUTOMATION); + undo->update_undo_after(_("clear keyframes"), + !changed_edl ? LOAD_AUTOMATION : + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_gui(changed_edl); } @@ -377,7 +381,9 @@ int MWindow::clear_default_keyframe() edl->tracks->clear_default_keyframe(); int changed_edl = speed_after(1); save_backup(); - undo->update_undo_after(_("clear default keyframe"), LOAD_AUTOMATION); + undo->update_undo_after(_("clear default keyframe"), + !changed_edl ? LOAD_AUTOMATION : + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_gui(changed_edl); return 0; } @@ -604,7 +610,9 @@ int MWindow::cut_automation() edl->local_session->get_selectionend()); int changed_edl = speed_after(1); save_backup(); - undo->update_undo_after(_("cut keyframes"), LOAD_AUTOMATION); + undo->update_undo_after(_("cut keyframes"), + !changed_edl ? LOAD_AUTOMATION : + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_gui(changed_edl); return 0; } @@ -618,7 +626,9 @@ int MWindow::cut_default_keyframe() edl->tracks->clear_default_keyframe(); int changed_edl = speed_after(1); save_backup(); - undo->update_undo_after(_("cut default keyframe"), LOAD_AUTOMATION); + undo->update_undo_after(_("cut default keyframe"), + !changed_edl ? LOAD_AUTOMATION : + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_gui(changed_edl); return 0; } @@ -1055,10 +1065,16 @@ void MWindow::overwrite(EDL *source, int all) { FileXML file; + LocalSession *src = source->local_session; double src_start = all ? 0 : - source->local_session->get_selectionstart(); - double overwrite_len = all ? source->tracks->total_length() : - source->local_session->get_selectionend() - src_start; + src->inpoint_valid() ? src->get_inpoint() : + src->outpoint_valid() ? 0 : + src->get_selectionstart(); + double src_end = all ? source->tracks->total_length() : + src->outpoint_valid() ? src->get_outpoint() : + src->inpoint_valid() ? source->tracks->total_length() : + src->get_selectionend(); + double overwrite_len = src_end - src_start; double dst_start = edl->local_session->get_selectionstart(); double dst_len = edl->local_session->get_selectionend() - dst_start; @@ -1241,7 +1257,7 @@ int MWindow::paste_automation() gui->from_clipboard(string, len, BC_PRIMARY_SELECTION); FileXML file; file.read_from_string(string); - + delete [] string; double start = edl->local_session->get_selectionstart(); double end = edl->local_session->get_selectionend(); edl->tracks->clear_automation(start, end); @@ -1249,8 +1265,9 @@ int MWindow::paste_automation() edl->session->typeless_keyframes); int changed_edl = speed_after(1); save_backup(); - undo->update_undo_after(_("paste keyframes"), LOAD_AUTOMATION); - delete [] string; + undo->update_undo_after(_("paste keyframes"), + !changed_edl ? LOAD_AUTOMATION : + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); update_gui(changed_edl); } @@ -1268,14 +1285,16 @@ int MWindow::paste_default_keyframe() gui->from_clipboard(string, len, BC_PRIMARY_SELECTION); FileXML file; file.read_from_string(string); + delete [] string; double start = edl->local_session->get_selectionstart(); edl->tracks->paste_automation(start, &file, 1, 0, edl->session->typeless_keyframes); // edl->tracks->paste_default_keyframe(&file); - undo->update_undo_after(_("paste default keyframe"), LOAD_AUTOMATION); int changed_edl = speed_after(1); + undo->update_undo_after(_("paste default keyframe"), + !changed_edl ? LOAD_AUTOMATION : + LOAD_AUTOMATION + LOAD_EDITS + LOAD_TIMEBAR); save_backup(); - delete [] string; update_gui(changed_edl); } @@ -1589,7 +1608,7 @@ void MWindow::paste_silence() if( edl->session->frame_rate > 0 ) end += 1./edl->session->frame_rate; } - undo->update_undo_before(); + undo->update_undo_before(_("silence"), this); edl->paste_silence(start, end, edl->session->labels_follow_edits, edl->session->plugins_follow_edits, @@ -1642,11 +1661,6 @@ void MWindow::paste_transition() PluginServer *server = session->drag_pluginservers->values[0]; undo->update_undo_before(); - if( server->audio ) - strcpy(edl->session->default_atransition, server->title); - else - strcpy(edl->session->default_vtransition, server->title); - edl->tracks->paste_transition(server, session->edit_highlighted); save_backup(); undo->update_undo_after(_("transition"), LOAD_EDITS); @@ -1663,7 +1677,6 @@ void MWindow::paste_transitions(int track_type, char *title) double start = edl->local_session->get_selectionstart(); double end = edl->local_session->get_selectionend(); edl->tracks->paste_transitions(start, end, track_type, title); - save_backup(); undo->update_undo_after(_("attach transitions"), LOAD_EDITS); @@ -1785,7 +1798,7 @@ void MWindow::align_edits() void MWindow::set_edit_length(double length) { - gui->lock_window("MWindow::detach_transitions 1"); + gui->lock_window("MWindow::set_edit_length 1"); undo->update_undo_before(); double start = edl->local_session->get_selectionstart(); @@ -1805,7 +1818,7 @@ void MWindow::set_edit_length(double length) void MWindow::set_transition_length(Transition *transition, double length) { - gui->lock_window("MWindow::detach_transitions 1"); + gui->lock_window("MWindow::set_transition_length 1"); undo->update_undo_before(); //double start = edl->local_session->get_selectionstart(); @@ -1824,7 +1837,7 @@ void MWindow::set_transition_length(Transition *transition, double length) void MWindow::set_transition_length(double length) { - gui->lock_window("MWindow::detach_transitions 1"); + gui->lock_window("MWindow::set_transition_length 2"); undo->update_undo_before(); double start = edl->local_session->get_selectionstart(); @@ -1868,6 +1881,7 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui) update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 1); + gui->update_proxy_toggle(); gui->unlock_window(); cwindow->update(1, 1, 1, 1, 1); cwindow->gui->unlock_window(); @@ -1880,9 +1894,6 @@ void MWindow::redo_entry(BC_WindowBase *calling_window_gui) } } - if( calling_window_gui != gui ) - gui->unlock_window(); - awindow->gui->async_update_assets(); cwindow->refresh_frame(CHANGE_ALL); @@ -1982,12 +1993,16 @@ void MWindow::unset_inoutpoint(int is_mwindow) void MWindow::splice(EDL *source, int all) { FileXML file; + LocalSession *src = source->local_session; undo->update_undo_before(); double source_start = all ? 0 : - source->local_session->get_selectionstart(); + src->inpoint_valid() ? src->get_inpoint() : + src->outpoint_valid() ? 0 : src->get_selectionstart(); double source_end = all ? source->tracks->total_length() : - source->local_session->get_selectionend(); + src->outpoint_valid() ? src->get_outpoint() : + src->inpoint_valid() ? source->tracks->total_length() : + src->get_selectionend(); source->copy(source_start, source_end, 1, &file, "", 1); //file.dump(); double start = edl->local_session->get_selectionstart(); @@ -2042,9 +2057,9 @@ void MWindow::save_clip(EDL *new_edl, const char *txt) n = snprintf(cp, sz, "%s", txt); cp += n; sz -= n; } - n = snprintf(cp, sz, + n = snprintf(cp, sz, "%02d/%02d/%02d %02d:%02d:%02d, +%s\n", - dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday, + dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday, dtm.tm_hour, dtm.tm_min, dtm.tm_sec, duration); cp += n; sz -= n; if( path && *path ) { @@ -2059,6 +2074,7 @@ void MWindow::save_clip(EDL *new_edl, const char *txt) "clip_%02d%02d%02d-%02d%02d%02d.png", dtm.tm_year+1900, dtm.tm_mon+1, dtm.tm_mday, dtm.tm_hour, dtm.tm_min, dtm.tm_sec); + new_edl->awindow_folder = AW_CLIP_FOLDER; edl->update_assets(new_edl); int cur_x, cur_y; gui->get_abs_cursor(cur_x, cur_y, 0); @@ -2074,14 +2090,16 @@ void MWindow::save_clip(EDL *new_edl, const char *txt) void MWindow::to_clip(EDL *edl, const char *txt, int all) { FileXML file; - double start, end; + LocalSession *src = edl->local_session; gui->lock_window("MWindow::to_clip 1"); - start = all ? 0 : - edl->local_session->get_selectionstart(); - end = all ? edl->tracks->total_length() : - edl->local_session->get_selectionend(); - + double start = all ? 0 : + src->inpoint_valid() ? src->get_inpoint() : + src->outpoint_valid() ? 0 : src->get_selectionstart(); + double end = all ? edl->tracks->total_length() : + src->outpoint_valid() ? src->get_outpoint() : + src->inpoint_valid() ? edl->tracks->total_length() : + src->get_selectionend(); if( EQUIV(end, start) ) { start = 0; end = edl->tracks->total_length(); @@ -2190,6 +2208,7 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui) update_plugin_guis(); gui->update(1, 2, 1, 1, 1, 1, 1); + gui->update_proxy_toggle(); gui->unlock_window(); cwindow->update(1, 1, 1, 1, 1); cwindow->gui->unlock_window(); @@ -2202,9 +2221,6 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui) } } - if( calling_window_gui != gui ) - gui->unlock_window(); - awindow->gui->async_update_assets(); cwindow->refresh_frame(CHANGE_ALL); @@ -2212,21 +2228,33 @@ void MWindow::undo_entry(BC_WindowBase *calling_window_gui) } -void MWindow::new_folder(const char *new_folder) +void MWindow::new_folder(const char *new_folder, int is_clips) { undo->update_undo_before(); - edl->new_folder(new_folder); + if( edl->new_folder(new_folder, is_clips) ) { + MainError::show_error(_("create new folder failed")); + } undo->update_undo_after(_("new folder"), LOAD_ALL); awindow->gui->async_update_assets(); } void MWindow::delete_folder(char *folder) { -// undo->update_undo_after(_("delete folder"), LOAD_ALL); + undo->update_undo_before(); + if( edl->delete_folder(folder) < 0 ) { + MainError::show_error(_("delete folder failed")); + } + undo->update_undo_after(_("del folder"), LOAD_ALL); + awindow->gui->async_update_assets(); } void MWindow::select_point(double position) { + gui->unlock_window(); + gui->stop_drawing(); + cwindow->stop_playback(0); + gui->lock_window("MWindow::select_point"); + edl->local_session->set_selectionstart(position); edl->local_session->set_selectionend(position); @@ -2306,114 +2334,21 @@ void MWindow::remap_audio(int pattern) } } -void MWindow::set_proxy(int use_scaler, int new_scale, int auto_scale, - ArrayList *orig_assets, - ArrayList *proxy_assets) -{ - int orig_use_scaler = edl->session->proxy_use_scaler; - int orig_scale = edl->session->proxy_scale; -// rescale to full size asset in read_frame - edl->session->proxy_use_scaler = use_scaler; - edl->session->proxy_scale = new_scale; - edl->session->proxy_auto_scale = auto_scale; - - if( use_scaler ) { - for( int i=0; isize(); ++i ) { - Asset *proxy_asset = (Asset *)proxy_assets->get(i); - proxy_asset->width = orig_assets->get(i)->get_w(); - proxy_asset->height = orig_assets->get(i)->get_h(); - } - new_scale = 1; - } - - if( !orig_use_scaler && new_scale != orig_scale ) { -// project size - float orig_w = (float)edl->session->output_w * orig_scale; - float orig_h = (float)edl->session->output_h * orig_scale; - edl->session->output_w = Units::round(orig_w / new_scale); - edl->session->output_h = Units::round(orig_h / new_scale); - -// track sizes - for( Track *track=edl->tracks->first; track; track=track->next ) { - if( track->data_type != TRACK_VIDEO ) continue; - orig_w = (float)track->track_w * orig_scale; - orig_h = (float)track->track_h * orig_scale; - track->track_w = Units::round(orig_w / new_scale); - track->track_h = Units::round(orig_h / new_scale); - ((MaskAutos*)track->automation->autos[AUTOMATION_MASK])-> - set_proxy(orig_scale, new_scale); - ((FloatAutos*)track->automation->autos[AUTOMATION_CAMERA_X])-> - set_proxy(orig_scale, new_scale); - ((FloatAutos*)track->automation->autos[AUTOMATION_CAMERA_Y])-> - set_proxy(orig_scale, new_scale); - ((FloatAutos*)track->automation->autos[AUTOMATION_PROJECTOR_X])-> - set_proxy(orig_scale, new_scale); - ((FloatAutos*)track->automation->autos[AUTOMATION_PROJECTOR_Y])-> - set_proxy(orig_scale, new_scale); - } - } -// change original assets to proxy assets - int awindow_folder = use_scaler || new_scale != 1 ? AW_PROXY_FOLDER : AW_MEDIA_FOLDER; - for( int i=0,n=proxy_assets->size(); iassets->update((Asset *)proxy_assets->get(i)); - proxy_asset->awindow_folder = awindow_folder; -// replace track contents - for( Track *track=edl->tracks->first; track; track=track->next ) { - if( track->data_type != TRACK_VIDEO ) continue; - for( Edit *edit=track->edits->first; edit; edit=edit->next ) { - if( !edit->asset ) continue; - if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) { - edit->asset = proxy_asset; - } - } - } - for( int j=0,m=edl->clips.size(); jclips[j]; - for( Track *track=clip->tracks->first; track; track=track->next ) { - if( track->data_type != TRACK_VIDEO ) continue; - for( Edit *edit=track->edits->first; edit; edit=edit->next ) { - if( !edit->asset ) continue; - if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) { - edit->asset = proxy_asset; - } - } - } - } - } +void MWindow::rescale_proxy(EDL *clip, int orig_scale, int new_scale) +{ + edl->rescale_proxy(orig_scale, new_scale); } void MWindow::add_proxy(int use_scaler, - ArrayList *orig_assets, - ArrayList *proxy_assets) -{ - if( use_scaler ) { - for( int i=0,n=proxy_assets->size(); iget(i); - proxy_asset->width = orig_assets->get(i)->get_w(); - proxy_asset->height = orig_assets->get(i)->get_h(); - } - } - -// change original assets to proxy assets - for( int i=0,n=proxy_assets->size(); iassets->update((Asset *)proxy_assets->get(i)); - proxy_asset->awindow_folder = AW_PROXY_FOLDER; -// replace track contents - for( Track *track=edl->tracks->first; track; track=track->next ) { - if( track->data_type != TRACK_VIDEO ) continue; - for( Edit *edit=track->edits->first; edit; edit=edit->next ) { - if( !edit->asset ) continue; - if( !strcmp(edit->asset->path, orig_assets->get(i)->path) ) { - edit->asset = proxy_asset; - } - } - } - } + ArrayList *orig_assets, ArrayList *proxy_assets) +{ + edl->add_proxy(use_scaler, orig_assets, proxy_assets); } void MWindow::cut_commercials() { +#ifdef HAVE_COMMERCIAL undo->update_undo_before(); commercials->scan_media(); edl->optimize(); @@ -2425,6 +2360,7 @@ void MWindow::cut_commercials() gui->update(1, 2, 1, 1, 1, 1, 0); cwindow->update(1, 0, 0, 0, 1); cwindow->refresh_frame(CHANGE_EDL); +#endif } int MWindow::normalize_speed(EDL *old_edl, EDL *new_edl) @@ -2473,11 +2409,13 @@ void MWindow::speed_before() int MWindow::speed_after(int done) { int result = 0; - if( speed_edl && done >= 0 ) - result = normalize_speed(speed_edl, edl); - if( done ) { - speed_edl->remove_user(); - speed_edl = 0; + if( speed_edl ) { + if( done >= 0 ) + result = normalize_speed(speed_edl, edl); + if( done != 0 ) { + speed_edl->remove_user(); + speed_edl = 0; + } } return result; }