X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmwindowmove.C;h=3bad75ef0e9ea905780c891d27e2f00eab105869;hp=d64b6c1b6504873dc414eb2d102aa9e3e0de3985;hb=refs%2Fheads%2Fmaster;hpb=0c7b0aebb5e9f85f4eb7abb69b800d8d37b30b0f diff --git a/cinelerra-5.1/cinelerra/mwindowmove.C b/cinelerra-5.1/cinelerra/mwindowmove.C index d64b6c1b..3bad75ef 100644 --- a/cinelerra-5.1/cinelerra/mwindowmove.C +++ b/cinelerra-5.1/cinelerra/mwindowmove.C @@ -2,6 +2,7 @@ /* * CINELERRA * Copyright (C) 1997-2014 Adam Williams + * Copyright (C) 2003-2016 Cinelerra CV contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,6 +29,7 @@ #include "edits.h" #include "edl.h" #include "edlsession.h" +#include "gwindowgui.h" #include "keyframe.h" #include "labels.h" #include "localsession.h" @@ -259,7 +261,7 @@ void MWindow::change_currentautorange(int autogrouptype, int increment, int chan break; case AUTOGROUPTYPE_X: case AUTOGROUPTYPE_Y: - val = floor(val + 5); + val = floor(val + 50); break; } } @@ -278,7 +280,7 @@ void MWindow::change_currentautorange(int autogrouptype, int increment, int chan break; case AUTOGROUPTYPE_X: case AUTOGROUPTYPE_Y: - val = floor(val-5); + val = floor(val-50); break; } } @@ -296,6 +298,18 @@ void MWindow::change_currentautorange(int autogrouptype, int increment, int chan } } +void MWindow::update_autorange(int type, int increment, int use_max) +{ + gui->lock_window("MWindow::update_autorange"); + int group = Automation::autogrouptype(type, 0); + change_currentautorange(group, increment, use_max); + int color = GWindowGUI::auto_colors[type]; + gui->zoombar->update_autozoom(group, color); + gui->draw_overlays(0); + gui->update_patchbay(); + gui->flash_canvas(1); + gui->unlock_window(); +} void MWindow::expand_autos(int changeall, int domin, int domax) { @@ -353,26 +367,39 @@ void MWindow::zoom_amp(int64_t zoom_amp) gui->flush(); } -void MWindow::zoom_track(int64_t zoom_track) +void MWindow::zoom_atrack(int64_t zoom) { -// scale waveforms - edl->local_session->zoom_y = (int64_t)((float)edl->local_session->zoom_y * - zoom_track / - edl->local_session->zoom_track); - CLAMP(edl->local_session->zoom_y, MIN_AMP_ZOOM, MAX_AMP_ZOOM); - -// scale tracks - double scale = (double)zoom_track / edl->local_session->zoom_track; - edl->local_session->zoom_track = zoom_track; + int64_t old_zoom = edl->local_session->zoom_atrack; + CLAMP(zoom, MIN_TRACK_ZOOM, MAX_TRACK_ZOOM); + edl->local_session->zoom_atrack = zoom; + edl->local_session->zoom_atrack = zoom; + for( Track *track= edl->tracks->first; track; track=track->next ) { + if( track->data_type != TRACK_AUDIO ) continue; + track->data_h = zoom; + } // shift row position - for(int i = 0; i < TOTAL_PANES; i++) - { - edl->local_session->track_start[i] *= scale; + for( int i=0; ilocal_session->track_start[i] = + (edl->local_session->track_start[i] * zoom) / old_zoom; + edl->tracks->update_y_pixels(theme); + gui->draw_trackmovement(); +} + +void MWindow::zoom_vtrack(int64_t zoom) +{ + int64_t old_zoom = edl->local_session->zoom_vtrack; + CLAMP(zoom, MIN_TRACK_ZOOM, MAX_TRACK_ZOOM); + edl->local_session->zoom_vtrack = zoom; + + for( Track *track= edl->tracks->first; track; track=track->next ) { + if( track->data_type != TRACK_VIDEO ) continue; + track->data_h = zoom; } +// shift row position + for( int i=0; ilocal_session->track_start[i] = + (edl->local_session->track_start[i] * zoom) / old_zoom; edl->tracks->update_y_pixels(theme); gui->draw_trackmovement(); -//printf("MWindow::zoom_track %d %d\n", edl->local_session->zoom_y, edl->local_session->zoom_track); } void MWindow::trackmovement(int offset, int pane_number) @@ -405,16 +432,14 @@ void MWindow::trackmovement(int offset, int pane_number) void MWindow::move_up(int64_t distance) { TimelinePane *pane = gui->get_focused_pane(); - if(distance == 0) distance = edl->local_session->zoom_track; - + if(distance == 0) distance = pane->canvas->get_h() / 10; trackmovement(-distance, pane->number); } void MWindow::move_down(int64_t distance) { TimelinePane *pane = gui->get_focused_pane(); - if(distance == 0) distance = edl->local_session->zoom_track; - + if(distance == 0) distance = pane->canvas->get_h() / 10; trackmovement(distance, pane->number); } @@ -423,10 +448,8 @@ int MWindow::goto_end() TimelinePane *pane = gui->get_focused_pane(); int64_t old_view_start = edl->local_session->view_start[pane->number]; - if(edl->tracks->total_length() > (double)pane->canvas->get_w() * - edl->local_session->zoom_sample / - edl->session->sample_rate) - { + if( edl->tracks->total_length() > (double)pane->canvas->get_w() * + edl->local_session->zoom_sample / edl->session->sample_rate ) { edl->local_session->view_start[pane->number] = Units::round(edl->tracks->total_length() * edl->session->sample_rate / @@ -500,21 +523,10 @@ int MWindow::goto_start() int MWindow::goto_position(double position) { - TimelinePane *pane = gui->get_focused_pane(); - int64_t old_view_start = edl->local_session->view_start[pane->number]; - edl->local_session->set_selectionstart(position); - edl->local_session->set_selectionend(position); - find_cursor(); - int64_t new_view_start = edl->local_session->view_start[pane->number]; - if(new_view_start != old_view_start) - samplemovement(new_view_start, pane->number); - update_plugin_guis(); - gui->update_patchbay(); - gui->update_cursor(); + position = edl->align_to_frame(position, 0); + if( position < 0 ) position = 0; + select_point(position); gui->activate_timeline(); - gui->zoombar->update(); - gui->update_timebar(1); - cwindow->update(1, 0, 0, 0, 1); return 0; } @@ -548,8 +560,7 @@ int MWindow::move_left(int64_t distance) { TimelinePane *pane = gui->get_focused_pane(); if(!distance) - distance = pane->canvas->get_w() / - 10; + distance = pane->canvas->get_w() / 10; edl->local_session->view_start[pane->number] -= distance; samplemovement(edl->local_session->view_start[pane->number], pane->number); @@ -560,8 +571,7 @@ int MWindow::move_right(int64_t distance) { TimelinePane *pane = gui->get_focused_pane(); if(!distance) - distance = pane->canvas->get_w() / - 10; + distance = pane->canvas->get_w() / 10; edl->local_session->view_start[pane->number] += distance; samplemovement(edl->local_session->view_start[pane->number], pane->number); @@ -657,9 +667,10 @@ int MWindow::nearest_plugin_keyframe(int shift_down, int dir) KeyFrame *keyframe = 0; double start = edl->local_session->get_selectionstart(1); double end = edl->local_session->get_selectionend(1); - double position = dir == PLAY_FORWARD ? end : start, new_position = 0; + double position = dir == PLAY_FORWARD ? end : start; + double new_position = dir == PLAY_FORWARD ? start : end; for( Track *track=edl->tracks->first; track; track=track->next ) { - if( !track->record ) continue; + if( !track->is_armed() ) continue; for( int i=0; iplugin_set.size(); ++i ) { PluginSet *plugin_set = track->plugin_set[i]; int64_t pos = track->to_units(position, 0); @@ -689,6 +700,47 @@ int MWindow::nearest_plugin_keyframe(int shift_down, int dir) return find_selection(new_position); } +int MWindow::nearest_auto_keyframe(int shift_down, int dir) +{ + Auto *keyframe = 0; + double start = edl->local_session->get_selectionstart(1); + double end = edl->local_session->get_selectionend(1); + double position = dir == PLAY_FORWARD ? end : start; + double new_position = dir == PLAY_FORWARD ? start : end; + for( Track *track=edl->tracks->first; track; track=track->next ) { + if( !track->is_armed() ) continue; + int64_t pos = track->to_units(position, 0); + for( int i=0; iautomation->autos[i]; + if( !autos ) continue; + Auto *key = dir == PLAY_FORWARD ? + autos->nearest_after(pos) : + autos->nearest_before(pos); + if( !key ) continue; + double key_position = track->from_units(key->position); + if( keyframe && (dir == PLAY_FORWARD ? + key_position >= new_position : + new_position >= key_position ) ) continue; + keyframe = key; new_position = key_position; + } + } + + new_position = keyframe ? + keyframe->autos->track->from_units(keyframe->position) : + dir == PLAY_FORWARD ? edl->tracks->total_length() : 0; + + if( !shift_down ) + start = end = new_position; + else if( dir == PLAY_FORWARD ) + end = new_position; + else + start = new_position; + + edl->local_session->set_selectionstart(start); + edl->local_session->set_selectionend(end); + return find_selection(new_position); +} + int MWindow::find_selection(double position, int scroll_display) { update_plugin_guis(); @@ -718,21 +770,37 @@ int MWindow::find_selection(double position, int scroll_display) double MWindow::get_position() { - return edl->local_session->get_selectionstart(1); + return edl->local_session->get_selectionstart(1); } void MWindow::set_position(double position) { - if( position != get_position() ) { - if( position < 0 ) position = 0; - edl->local_session->set_selectionstart(position); - edl->local_session->set_selectionend(position); - gui->lock_window(); - find_cursor(); - gui->update(1, NORMAL_DRAW, 1, 1, 1, 1, 0); - gui->unlock_window(); - cwindow->update(1, 0, 0, 0, 0); - } + if( position != get_position() ) { + if( position < 0 ) position = 0; + edl->local_session->set_selectionstart(position); + edl->local_session->set_selectionend(position); + gui->lock_window(); + find_cursor(); + gui->update(1, NORMAL_DRAW, 1, 1, 1, 1, 0); + gui->unlock_window(); + cwindow->update(1, 0, 0, 0, 0); + } +} + + +double MWindow::get_timecode_offset() +{ + return edl->session->timecode_offset; +} + +void MWindow::set_timecode_offset(double offset) +{ + edl->session->time_format = TIME_TIMECODE; + edl->session->timecode_offset = offset; + gui->lock_window(); + gui->update(1, NORMAL_DRAW, 1, 1, 1, 1, 0); + gui->unlock_window(); + cwindow->update(1, 0, 0, 0, 0); } @@ -756,18 +824,24 @@ int MWindow::zoom_in_y() int MWindow::expand_t() { - int result = edl->local_session->zoom_track * 2; - result = MIN(result, MAX_TRACK_ZOOM); - zoom_track(result); + int zoom = edl->local_session->zoom_atrack * 2; + zoom = MIN(zoom, MAX_TRACK_ZOOM); + zoom_atrack(zoom); + zoom = edl->local_session->zoom_vtrack * 2; + zoom = MIN(zoom, MAX_TRACK_ZOOM); + zoom_vtrack(zoom); gui->zoombar->update(); return 0; } int MWindow::zoom_in_t() { - int result = edl->local_session->zoom_track / 2; - result = MAX(result, MIN_TRACK_ZOOM); - zoom_track(result); + int zoom = edl->local_session->zoom_atrack / 2; + zoom = MAX(zoom, MIN_TRACK_ZOOM); + zoom_atrack(zoom); + zoom = edl->local_session->zoom_vtrack / 2; + zoom = MAX(zoom, MIN_TRACK_ZOOM); + zoom_vtrack(zoom); gui->zoombar->update(); return 0; }