reposition_and_zoom (leftmost_after_zoom, nfpu);
}
+void
+Editor::temporal_zoom_region ()
+{
+
+ nframes64_t start = max_frames;
+ nframes64_t end = 0;
+
+ ensure_entered_region_selected (true);
+
+ if (selection->regions.empty()) {
+ info << _("cannot set loop: no region selected") << endmsg;
+ return;
+ }
+
+ for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ if ((*i)->region()->position() < start) {
+ start = (*i)->region()->position();
+ }
+ if ((*i)->region()->last_frame() + 1 > end) {
+ end = (*i)->region()->last_frame() + 1;
+ }
+ }
+
+ /* now comes an "interesting" hack ... make sure we leave a little space
+ at each end of the editor so that the zoom doesn't fit the region
+ precisely to the screen.
+ */
+
+ GdkScreen* screen = gdk_screen_get_default ();
+ gint pixwidth = gdk_screen_get_width (screen);
+ gint mmwidth = gdk_screen_get_width_mm (screen);
+ double pix_per_mm = (double) pixwidth/ (double) mmwidth;
+ double one_centimeter_in_pixels = pix_per_mm * 10.0;
+ nframes_t extra_samples = unit_to_frame (one_centimeter_in_pixels);
+
+ if (start > extra_samples) {
+ start -= extra_samples;
+ } else {
+ start = 0;
+ }
+
+ if (max_frames - extra_samples > end) {
+ end += extra_samples;
+ } else {
+ end = max_frames;
+ }
+
+ temporal_zoom_by_frame (start, end, "zoom to region");
+ zoomed_to_region = true;
+}
+
+void
+Editor::toggle_zoom_region ()
+{
+ if (zoomed_to_region) {
+ swap_visual_state ();
+ } else {
+ temporal_zoom_region ();
+ }
+}
+
void
Editor::temporal_zoom_selection ()
{
return;
}
} else if (entered_track != 0) {
- if ((tv = dynamic_cast<RouteTimeAxisView*>(selection->tracks.front())) == 0) {
+ if ((tv = dynamic_cast<RouteTimeAxisView*>(entered_track)) == 0) {
return;
}
} else {
session->request_play_range (true);
}
-void
-Editor::play_selected_region ()
-{
- if (!selection->regions.empty()) {
- RegionView *rv = *(selection->regions.begin());
-
- session->request_bounded_roll (rv->region()->position(), rv->region()->last_frame());
- }
-}
-
void
Editor::loop_selected_region ()
{
}
void
-Editor::audition_selected_region ()
+Editor::play_selected_region ()
{
- if (!selection->regions.empty()) {
- RegionView* rv = *(selection->regions.begin());
- session->audition_region (rv->region());
+ nframes64_t start = max_frames;
+ nframes64_t end = 0;
+
+ ensure_entered_region_selected (true);
+
+ if (selection->regions.empty()) {
+ return;
}
+
+ for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ if ((*i)->region()->position() < start) {
+ start = (*i)->region()->position();
+ }
+ if ((*i)->region()->last_frame() + 1 > end) {
+ end = (*i)->region()->last_frame() + 1;
+ }
+ }
+
+ session->request_bounded_roll (start, end);
}
void
crop_region_to (selection->time.start(), selection->time.end_frame());
- } else if (_edit_point != EditAtPlayhead) {
+ } else {
nframes64_t start;
nframes64_t end;
void
Editor::set_fade_length (bool in)
{
- ensure_entered_region_selected ();
+ ensure_entered_region_selected (true);
/* we need a region to measure the offset from the start */
commit_reversible_command ();
}
+
+void
+Editor::toggle_fade_active (bool in)
+{
+ ensure_entered_region_selected (true);
+
+ if (selection->regions.empty()) {
+ return;
+ }
+
+ const char* cmd = (in ? _("toggle fade in active") : _("toggle fade out active"));
+
+ begin_reversible_command (cmd);
+
+ for (RegionSelection::iterator x = selection->regions.begin(); x != selection->regions.end(); ++x) {
+ AudioRegionView* tmp = dynamic_cast<AudioRegionView*> (*x);
+
+ if (!tmp) {
+ return;
+ }
+
+ boost::shared_ptr<AudioRegion> region (tmp->audio_region());
+
+ XMLNode &before = region->get_state();
+
+ if (in) {
+ region->set_fade_in_active (!region->fade_in_active());
+ } else {
+ region->set_fade_out_active (!region->fade_out_active());
+ }
+
+ XMLNode &after = region->get_state();
+ session->add_command(new MementoCommand<AudioRegion>(*region.get(), &before, &after));
+ }
+
+ commit_reversible_command ();
+}
+
void
Editor::set_fade_in_shape (AudioRegion::FadeShape shape)
{
}
}
+void
+Editor::set_loop_from_region (bool play)
+{
+ nframes64_t start = max_frames;
+ nframes64_t end = 0;
+
+ ensure_entered_region_selected (true);
+
+ if (selection->regions.empty()) {
+ info << _("cannot set loop: no region selected") << endmsg;
+ return;
+ }
+
+ for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ if ((*i)->region()->position() < start) {
+ start = (*i)->region()->position();
+ }
+ if ((*i)->region()->last_frame() + 1 > end) {
+ end = (*i)->region()->last_frame() + 1;
+ }
+ }
+
+ set_loop_range (start, end, _("set loop range from region"));
+
+ if (play) {
+ session->request_play_loop (true);
+ session->request_locate (start, true);
+ }
+}
+
void
Editor::set_punch_from_selection ()
{
set_punch_range (start, end, _("set punch range from edit range"));
}
+void
+Editor::pitch_shift_regions ()
+{
+ ensure_entered_region_selected (true);
+
+ if (selection->regions.empty()) {
+ return;
+ }
+
+ pitch_shift (selection->regions, 1.2);
+}
+