#include "ardour/quantize.h"
#include "ardour/strip_silence.h"
#include "ardour/route_group.h"
+#include "ardour/operations.h"
#include "ardour_ui.h"
+#include "debug.h"
#include "editor.h"
#include "time_axis_view.h"
#include "route_time_axis.h"
#include "normalize_dialog.h"
#include "editor_cursors.h"
#include "mouse_cursors.h"
+#include "patch_change_dialog.h"
#include "i18n.h"
void
Editor::split_regions_at (framepos_t where, RegionSelection& regions)
{
+ bool frozen = false;
+
list <boost::shared_ptr<Playlist > > used_playlists;
if (regions.empty()) {
}
} else {
snap_to (where);
+
+ frozen = true;
+ EditorFreeze(); /* Emit Signal */
}
for (RegionSelection::iterator a = regions.begin(); a != regions.end(); ) {
}
commit_reversible_command ();
+
+ if (frozen){
+ EditorThaw(); /* Emit Signal */
+ }
}
boost::shared_ptr<Region>
return;
}
- switch (point){
+ switch (point) {
case Start:
pos = r->first_frame ();
break;
return;
}
- switch (point){
+ switch (point) {
case Start:
pos = r->first_frame ();
break;
_session->request_locate (pos);
}
-void
-Editor::playhead_backward ()
-{
- framepos_t pos;
- framepos_t cnt;
- float prefix;
- bool was_floating;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = 1;
- } else {
- if (was_floating) {
- cnt = (framepos_t) floor (prefix * _session->frame_rate ());
- } else {
- cnt = (framepos_t) prefix;
- }
- }
-
- pos = playhead_cursor->current_frame;
-
- if ((framepos_t) pos < cnt) {
- pos = 0;
- } else {
- pos -= cnt;
- }
-
- /* XXX this is completely insane. with the current buffering
- design, we'll force a complete track buffer flush and
- reload, just to move 1 sample !!!
- */
-
- _session->request_locate (pos);
-}
-
-void
-Editor::playhead_forward ()
-{
- framepos_t pos;
- framepos_t cnt;
- bool was_floating;
- float prefix;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = 1;
- } else {
- if (was_floating) {
- cnt = (framepos_t) floor (prefix * _session->frame_rate ());
- } else {
- cnt = (framepos_t) floor (prefix);
- }
- }
-
- pos = playhead_cursor->current_frame;
-
- /* XXX this is completely insane. with the current buffering
- design, we'll force a complete track buffer flush and
- reload, just to move 1 sample !!!
- */
-
- _session->request_locate (pos+cnt);
-}
-
void
Editor::cursor_align (bool playhead_to_edit)
{
}
}
-void
-Editor::edit_cursor_backward ()
-{
- framepos_t pos;
- framepos_t cnt;
- float prefix;
- bool was_floating;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = 1;
- } else {
- if (was_floating) {
- cnt = (framepos_t) floor (prefix * _session->frame_rate ());
- } else {
- cnt = (framepos_t) prefix;
- }
- }
-
- if ((pos = get_preferred_edit_position()) < 0) {
- return;
- }
-
- if (pos < cnt) {
- pos = 0;
- } else {
- pos -= cnt;
- }
-
- // EDIT CURSOR edit_cursor->set_position (pos);
-}
-
-void
-Editor::edit_cursor_forward ()
-{
- //framepos_t pos;
- framepos_t cnt;
- bool was_floating;
- float prefix;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = 1;
- } else {
- if (was_floating) {
- cnt = (framepos_t) floor (prefix * _session->frame_rate ());
- } else {
- cnt = (framepos_t) floor (prefix);
- }
- }
-
- // pos = edit_cursor->current_frame;
- // EDIT CURSOR edit_cursor->set_position (pos+cnt);
-}
-
-void
-Editor::goto_frame ()
-{
- float prefix;
- bool was_floating;
- framepos_t frame;
-
- if (get_prefix (prefix, was_floating)) {
- return;
- }
-
- if (was_floating) {
- frame = (framepos_t) floor (prefix * _session->frame_rate());
- } else {
- frame = (framepos_t) floor (prefix);
- }
-
- _session->request_locate (frame);
-}
-
void
Editor::scroll_backward (float pages)
{
- framepos_t frame;
- framepos_t one_page = (framepos_t) rint (_canvas_width * frames_per_unit);
- bool was_floating;
- float prefix;
- framepos_t cnt;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = (framepos_t) floor (pages * one_page);
- } else {
- if (was_floating) {
- cnt = (framepos_t) floor (prefix * _session->frame_rate());
- } else {
- cnt = (framepos_t) floor (prefix * one_page);
- }
- }
+ framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit);
+ framepos_t const cnt = (framepos_t) floor (pages * one_page);
+ framepos_t frame;
if (leftmost_frame < cnt) {
frame = 0;
} else {
void
Editor::scroll_forward (float pages)
{
- framepos_t frame;
- framepos_t one_page = (framepos_t) rint (_canvas_width * frames_per_unit);
- bool was_floating;
- float prefix;
- framepos_t cnt;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = (framepos_t) floor (pages * one_page);
- } else {
- if (was_floating) {
- cnt = (framepos_t) floor (prefix * _session->frame_rate());
- } else {
- cnt = (framepos_t) floor (prefix * one_page);
- }
- }
+ framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit);
+ framepos_t const cnt = (framepos_t) floor (pages * one_page);
+ framepos_t frame;
if (max_framepos - cnt < leftmost_frame) {
frame = max_framepos - cnt;
} else {
void
Editor::scroll_tracks_down ()
{
- float prefix;
- bool was_floating;
- int cnt;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = 1;
- } else {
- cnt = (int) floor (prefix);
- }
-
- double vert_value = vertical_adjustment.get_value() + (cnt *
- vertical_adjustment.get_page_size());
+ double vert_value = vertical_adjustment.get_value() + vertical_adjustment.get_page_size();
if (vert_value > vertical_adjustment.get_upper() - _canvas_height) {
vert_value = vertical_adjustment.get_upper() - _canvas_height;
}
+
vertical_adjustment.set_value (vert_value);
}
void
Editor::scroll_tracks_up ()
{
- float prefix;
- bool was_floating;
- int cnt;
-
- if (get_prefix (prefix, was_floating)) {
- cnt = 1;
- } else {
- cnt = (int) floor (prefix);
- }
-
- vertical_adjustment.set_value (vertical_adjustment.get_value() - (cnt * vertical_adjustment.get_page_size()));
+ vertical_adjustment.set_value (vertical_adjustment.get_value() - vertical_adjustment.get_page_size());
}
void
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) {
- hide_track_in_display (*i, true);
+ hide_track_in_display (*i);
}
}
ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_session)
if (_session) {
- nframes_t const l = _session->current_end_frame() - _session->current_start_frame();
+ framecnt_t const l = _session->current_end_frame() - _session->current_start_frame();
double s = _session->current_start_frame() - l * 0.01;
if (s < 0) {
s = 0;
}
- nframes_t const e = _session->current_end_frame() + l * 0.01;
- temporal_zoom_by_frame (nframes_t (s), e, "zoom to _session");
+ framecnt_t const e = _session->current_end_frame() + l * 0.01;
+ temporal_zoom_by_frame (framecnt_t (s), e, "zoom to _session");
}
}
if (new_leftmost > frame) {
new_leftmost = 0;
}
-// begin_reversible_command (_("zoom to frame"));
-// _session->add_undo (sigc::bind (sigc::mem_fun(*this, &Editor::reposition_and_zoom), leftmost_frame, frames_per_unit));
-// _session->add_redo (sigc::bind (sigc::mem_fun(*this, &Editor::reposition_and_zoom), new_leftmost, new_fpu));
-// commit_reversible_command ();
+
+ if (new_leftmost < 0) {
+ new_leftmost = 0;
+ }
reposition_and_zoom (new_leftmost, new_fpu);
}
_session->commit_reversible_command ();
}
-void
-Editor::amplitude_zoom_step (bool in)
-{
- gdouble zoom = 1.0;
-
- if (in) {
- zoom *= 2.0;
- } else {
- if (zoom > 2.0) {
- zoom /= 2.0;
- } else {
- zoom = 1.0;
- }
- }
-
-#ifdef FIX_FOR_CANVAS
- /* XXX DO SOMETHING */
-#endif
-}
-
-
-/* DELETION */
-
-
-void
-Editor::delete_sample_forward ()
-{
-}
-
-void
-Editor::delete_sample_backward ()
-{
-}
-
-void
-Editor::delete_screen ()
-{
-}
-
-/* SEARCH */
-
-void
-Editor::search_backwards ()
-{
- /* what ? */
-}
-
-void
-Editor::search_forwards ()
-{
- /* what ? */
-}
-
/* MARKS */
void
void
Editor::set_mark ()
{
- framepos_t pos;
- float prefix;
- bool was_floating;
- string markername;
+ framepos_t const pos = _session->audible_frame ();
- if (get_prefix (prefix, was_floating)) {
- pos = _session->audible_frame ();
- } else {
- if (was_floating) {
- pos = (framepos_t) floor (prefix * _session->frame_rate ());
- } else {
- pos = (framepos_t) floor (prefix);
- }
- }
-
- _session->locations()->next_available_name(markername,"mark");
- if (!choose_new_marker_name(markername)) {
+ string markername;
+ _session->locations()->next_available_name (markername, "mark");
+
+ if (!choose_new_marker_name (markername)) {
return;
}
+
_session->locations()->add (new Location (*_session, pos, 0, markername, Location::IsMark), true);
}
{
double wx, wy;
double cx, cy;
- nframes_t where;
+ framepos_t where;
RouteTimeAxisView *dest_rtv = 0;
RouteTimeAxisView *source_rtv = 0;
{
vector<PlaylistState> playlists;
- RegionSelection rs = get_regions_from_selection_and_entered ();
+ RegionSelection rs;
+
+ rs = get_regions_from_selection_and_entered();
if (!_session || rs.empty()) {
return;
framepos_t const end = _session->current_end_frame ();
- begin_reversible_command (_("region fill"));
+ begin_reversible_command (Operations::region_fill);
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
framepos_t selection_length = end - start;
float times = (float)selection_length / region->length();
- begin_reversible_command (_("fill selection"));
+ begin_reversible_command (Operations::fill_selection);
for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
region->clear_changes ();
- if(forward){
+ if (forward) {
next_region = playlist->find_next_region (region->first_frame(), Start, 1);
- if(!next_region){
+ if (!next_region) {
continue;
}
return;
}
+ if (!clicked_routeview->track()->bounceable()) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (clicked_routeview);
+ if (rtv && !rtv->track()->bounceable()) {
+ MessageDialog d (
+ _("This route cannot be frozen because it has more outputs than inputs. "
+ "You can fix this by increasing the number of inputs.")
+ );
+ d.set_title (_("Cannot freeze"));
+ d.run ();
+ return;
+ }
+ }
+
InterThreadInfo itt;
current_interthread_info = &itt;
TrackSelection views = selection->tracks;
+ for (TrackViewList::iterator i = views.begin(); i != views.end(); ++i) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+ if (rtv && !rtv->track()->bounceable()) {
+ MessageDialog d (
+ _("One or more selected tracks cannot be bounced because it has more outputs than inputs. "
+ "You can fix this by increasing the number of inputs on that track.")
+ );
+ d.set_title (_("Cannot bounce"));
+ d.run ();
+ return;
+ }
+ }
+
framepos_t start = selection->time[clicked_selection].start;
framepos_t end = selection->time[clicked_selection].end;
framepos_t cnt = end - start + 1;
void
Editor::paste (float times)
{
+ DEBUG_TRACE (DEBUG::CutNPaste, "paste to preferred edit pos\n");
paste_internal (get_preferred_edit_position(), times);
}
void
Editor::paste_internal (framepos_t position, float times)
{
- bool commit = false;
+ DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("apparent paste position is %1\n", position));
if (internal_editing()) {
if (cut_buffer->midi_notes.empty()) {
if (position == max_framepos) {
position = get_preferred_edit_position();
+ DEBUG_TRACE (DEBUG::CutNPaste, string_compose ("preferred edit position is %1\n", position));
}
- begin_reversible_command (_("paste"));
-
TrackViewList ts;
TrackViewList::iterator i;
size_t nth;
ts.push_back (_last_cut_copy_source_track);
}
- for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) {
+ if (internal_editing ()) {
/* undo/redo is handled by individual tracks/regions */
-
- if (internal_editing()) {
-
+
+ for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) {
+
RegionSelection rs;
RegionSelection::iterator r;
MidiNoteSelection::iterator cb;
-
+
get_regions_at (rs, position, ts);
-
+
for (cb = cut_buffer->midi_notes.begin(), r = rs.begin();
cb != cut_buffer->midi_notes.end() && r != rs.end(); ++r) {
MidiRegionView* mrv = dynamic_cast<MidiRegionView*> (*r);
++cb;
}
}
+ }
+
+ } else {
- } else {
+ /* we do redo (do you do voodoo?) */
- if ((*i)->paste (position, times, *cut_buffer, nth)) {
- commit = true;
- }
+ begin_reversible_command (Operations::paste);
+
+ for (nth = 0, i = ts.begin(); i != ts.end(); ++i, ++nth) {
+ (*i)->paste (position, times, *cut_buffer, nth);
}
- }
-
- if (commit) {
+
commit_reversible_command ();
}
}
RegionSelection sel = regions; // clear (below) may clear the argument list if its the current region selection
RegionSelection foo;
- nframes_t const start_frame = regions.start ();
- nframes_t const end_frame = regions.end_frame ();
+ framepos_t const start_frame = regions.start ();
+ framepos_t const end_frame = regions.end_frame ();
- begin_reversible_command (_("duplicate region"));
+ begin_reversible_command (Operations::duplicate_region);
selection->clear_regions ();
}
arv->region()->clear_changes ();
-
- double fraction = gain_to_slider_position (arv->audio_region()->scale_amplitude ());
+
+ double dB = accurate_coefficient_to_dB (arv->audio_region()->scale_amplitude ());
if (up) {
- fraction += 0.05;
- fraction = min (fraction, 1.0);
+ dB += 1;
} else {
- fraction -= 0.05;
- fraction = max (fraction, 0.0);
- }
-
- if (!up && fraction <= 0) {
- continue;
+ dB -= 1;
}
- fraction = slider_position_to_gain (fraction);
-
- if (up && fraction >= 2.0) {
- continue;
- }
-
- arv->audio_region()->set_scale_amplitude (fraction);
+ arv->audio_region()->set_scale_amplitude (dB_to_coefficient (dB));
_session->add_command (new StatefulDiffCommand (arv->region()));
}
return;
}
- std::list<boost::shared_ptr<AudioRegion> > ar;
+ std::list<RegionView*> audio_only;
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*> (*i);
if (arv) {
- ar.push_back (arv->audio_region ());
+ audio_only.push_back (arv);
}
}
- StripSilenceDialog d (_session, ar);
+ StripSilenceDialog d (_session, audio_only);
int const r = d.run ();
- if (r == Gtk::RESPONSE_OK) {
- StripSilence s (*_session, d.threshold (), d.minimum_length (), d.fade_length ());
+ d.drop_rects ();
+
+ if (r == Gtk::RESPONSE_OK) {
+ ARDOUR::AudioIntervalMap silences;
+ d.silences (silences);
+ StripSilence s (*_session, silences, d.fade_length());
apply_filter (s, _("strip silence"), &d);
- }
+ }
}
Command*
return;
}
- for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ) {
- RegionSelection::iterator tmp = r;
- ++tmp;
-
+ for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
MidiRegionView* const mrv = dynamic_cast<MidiRegionView*> (*r);
if (mrv) {
selected_midi_region_cnt++;
}
}
+void
+Editor::insert_patch_change ()
+{
+ RegionSelection rs = get_regions_from_selection_and_entered ();
+ if (rs.empty ()) {
+ return;
+ }
+
+ framepos_t const p = get_preferred_edit_position (false);
+
+ Evoral::PatchChange<Evoral::MusicalTime> empty (0, 0, 0, 0);
+ PatchChangeDialog d (0, _session, empty, Gtk::Stock::ADD);
+
+ if (d.run() == RESPONSE_CANCEL) {
+ return;
+ }
+
+ for (RegionSelection::iterator i = rs.begin (); i != rs.end(); ++i) {
+ MidiRegionView* const mrv = dynamic_cast<MidiRegionView*> (*i);
+ if (mrv) {
+ if (p >= mrv->region()->first_frame() && p <= mrv->region()->last_frame()) {
+ mrv->add_patch_change (p - mrv->region()->position(), d.patch ());
+ }
+ }
+ }
+}
+
void
Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress)
{
/* more to come */
}
-void
-Editor::brush (framepos_t pos)
-{
- snap_to (pos);
-
- RegionSelection rs = get_regions_from_selection_and_entered ();
-
- if (rs.empty()) {
- return;
- }
-
- for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
- mouse_brush_insert_region ((*i), pos);
- }
-}
-
void
Editor::reset_region_gain_envelopes ()
{
}
void
-Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList& positions, bool can_ferret)
+Editor::split_region_at_points (boost::shared_ptr<Region> r, AnalysisFeatureList& positions, bool can_ferret, bool select_new)
{
bool use_rhythmic_rodent = false;
-
+
boost::shared_ptr<Playlist> pl = r->playlist();
+
+ list<boost::shared_ptr<Region> > new_regions;
if (!pl) {
return;
}
- if (positions.size() > 20) {
+ if (positions.size() > 20 && can_ferret) {
std::string msgstr = string_compose (_("You are about to split\n%1\ninto %2 pieces.\nThis could take a long time."), r->name(), positions.size() + 1);
MessageDialog msg (msgstr,
false,
while (x != positions.end()) {
/* deal with positons that are out of scope of present region bounds */
- if (*x <= 0 || *x > r->length()){
+ if (*x <= 0 || *x > r->length()) {
++x;
continue;
}
plist.add (ARDOUR::Properties::layer, 0);
boost::shared_ptr<Region> nr = RegionFactory::create (r->sources(), plist, false);
+
pl->add_region (nr, r->position() + pos);
+ if (select_new) {
+ new_regions.push_front(nr);
+ }
+
pos += len;
++x;
}
boost::shared_ptr<Region> nr = RegionFactory::create (r->sources(), plist, false);
pl->add_region (nr, r->position() + pos);
-
+ if (select_new) {
+ new_regions.push_front(nr);
+ }
+
pl->thaw ();
_session->add_command (new StatefulDiffCommand (pl));
+
+ if (select_new) {
+
+ for (list<boost::shared_ptr<Region> >::iterator i = new_regions.begin(); i != new_regions.end(); ++i){
+ set_selected_regionview_from_region_list ((*i), Selection::Add);
+ }
+ }
}
void
return;
}
- ArdourCanvas::SimpleLine* _line = reinterpret_cast<ArdourCanvas::SimpleLine*> (item);
+ ArdourCanvas::Line* _line = reinterpret_cast<ArdourCanvas::Line*> (item);
assert (_line);
AudioRegionView* _arv = reinterpret_cast<AudioRegionView*> (item->get_data ("regionview"));
- _arv->remove_transient(_line->property_x1());
+ _arv->remove_transient (*(float*) _line->get_data ("position"));
}
void
Editor::snap_regions_to_grid ()
{
+ list <boost::shared_ptr<Playlist > > used_playlists;
+
RegionSelection rs = get_regions_from_selection_and_entered ();
if (!_session || rs.empty()) {
_session->begin_reversible_command (_("snap regions to grid"));
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
+
+ boost::shared_ptr<Playlist> pl = (*r)->region()->playlist();
+
+ if (!pl->frozen()) {
+ /* we haven't seen this playlist before */
+
+ /* remember used playlists so we can thaw them later */
+ used_playlists.push_back(pl);
+ pl->freeze();
+ }
+
framepos_t start_frame = (*r)->region()->first_frame ();
snap_to (start_frame);
(*r)->region()->set_position (start_frame, this);
}
+ while (used_playlists.size() > 0) {
+ list <boost::shared_ptr<Playlist > >::iterator i = used_playlists.begin();
+ (*i)->thaw();
+ used_playlists.pop_front();
+ }
+
_session->commit_reversible_command ();
}
void
Editor::close_region_gaps ()
-{
+{
+ list <boost::shared_ptr<Playlist > > used_playlists;
+
RegionSelection rs = get_regions_from_selection_and_entered ();
if (!_session || rs.empty()) {
SpinButton spin_crossfade (1, 0);
spin_crossfade.set_range (0, 15);
spin_crossfade.set_increments (1, 1);
- spin_crossfade.set_value (3);
+ spin_crossfade.set_value (5);
table.attach (spin_crossfade, 1, 2, 0, 1);
table.attach (*manage (new Label (_("ms"))), 2, 3, 0, 1);
table.attach (*l, 0, 1, 1, 2);
SpinButton spin_pullback (1, 0);
- spin_pullback.set_range (0, 15);
+ spin_pullback.set_range (0, 100);
spin_pullback.set_increments (1, 1);
- spin_pullback.set_value (5);
+ spin_pullback.set_value(30);
table.attach (spin_pullback, 1, 2, 1, 2);
table.attach (*manage (new Label (_("ms"))), 2, 3, 1, 2);
/* Iterate over the region list and make adjacent regions overlap by crossfade_len_ms */
_session->begin_reversible_command (_("close region gaps"));
-
+
int idx = 0;
boost::shared_ptr<Region> last_region;
rs.sort_by_position_and_track();
for (RegionSelection::iterator r = rs.begin(); r != rs.end(); ++r) {
+
+ boost::shared_ptr<Playlist> pl = (*r)->region()->playlist();
+
+ if (!pl->frozen()) {
+ /* we haven't seen this playlist before */
+
+ /* remember used playlists so we can thaw them later */
+ used_playlists.push_back(pl);
+ pl->freeze();
+ }
framepos_t position = (*r)->region()->position();
idx++;
}
+ while (used_playlists.size() > 0) {
+ list <boost::shared_ptr<Playlist > >::iterator i = used_playlists.begin();
+ (*i)->thaw();
+ used_playlists.pop_front();
+ }
+
_session->commit_reversible_command ();
}
TrackSelection& ts (selection->tracks);
for (TrackSelection::iterator x = ts.begin(); x != ts.end(); ++x) {
- (*x)->set_height (h);
+ (*x)->set_height_enum (h);
}
}
target = !rtv->_route->active();
first = false;
}
- rtv->_route->set_active (target);
+ rtv->_route->set_active (target, this);
}
}
}
msg.run ();
return;
}
-
+
if (ntracks + nbusses == 0) {
- return;
+ return;
}
if (ntracks > 1) {
void
Editor::fit_selected_tracks ()
{
- fit_tracks (selection->tracks);
+ if (!selection->tracks.empty()) {
+ fit_tracks (selection->tracks);
+ } else {
+ TrackViewList tvl;
+
+ /* no selected tracks - use tracks with selected regions */
+
+ if (!selection->regions.empty()) {
+ for (RegionSelection::iterator r = selection->regions.begin(); r != selection->regions.end(); ++r) {
+ tvl.push_back (&(*r)->get_time_axis_view ());
+ }
+
+ if (!tvl.empty()) {
+ fit_tracks (tvl);
+ }
+ } else if (internal_editing()) {
+ /* no selected tracks, or regions, but in internal edit mode, so follow the mouse and use
+ the entered track
+ */
+ if (entered_track) {
+ tvl.push_back (entered_track);
+ fit_tracks (tvl);
+ }
+ }
+ }
}
void
}
uint32_t child_heights = 0;
+ int visible_tracks = 0;
for (TrackSelection::iterator t = tracks.begin(); t != tracks.end(); ++t) {
}
child_heights += (*t)->effective_height() - (*t)->current_height();
+ ++visible_tracks;
}
- uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / tracks.size());
+ uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / visible_tracks);
double first_y_pos = DBL_MAX;
if (h < TimeAxisView::preset_height (HeightSmall)) {
next_is_selected = false;
}
- if (is_selected) {
- (*t)->set_height (h);
- first_y_pos = std::min ((*t)->y_position (), first_y_pos);
- } else {
- if (prev_was_selected && next_is_selected) {
- hide_track_in_display (*t);
+ if ((*t)->marked_for_display ()) {
+ if (is_selected) {
+ (*t)->set_height (h);
+ first_y_pos = std::min ((*t)->y_position (), first_y_pos);
+ } else {
+ if (prev_was_selected && next_is_selected) {
+ hide_track_in_display (*t);
+ }
}
}