#include "ardour/dB.h"
#include "ardour/quantize.h"
#include "ardour/strip_silence.h"
+#include "ardour/route_group.h"
#include "ardour_ui.h"
#include "editor.h"
#include "utils.h"
#include "editor_drag.h"
#include "strip_silence_dialog.h"
+#include "editor_routes.h"
+#include "editor_regions.h"
#include "i18n.h"
void
Editor::split_region ()
-{
- split_region_at (get_preferred_edit_position());
-}
-
-void
-Editor::split_region_at (nframes64_t where)
{
RegionSelection rs;
- get_regions_for_action (rs);
- split_regions_at (where, selection->regions);
+ get_regions_for_action (rs, true);
+ split_regions_at (get_preferred_edit_position (), selection->regions);
}
void
}
boost::shared_ptr<Region>
-Editor::select_region_for_operation (int dir, TimeAxisView **tv)
+Editor::select_region_for_operation (int /*dir*/, TimeAxisView **tv)
{
RegionView* rv;
boost::shared_ptr<Region> region;
}
/* hide irrelevant tracks */
-
- no_route_list_redisplay = true;
+
+ _routes->suspend_redisplay ();
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
if (find (tracks.begin(), tracks.end(), (*i)) == tracks.end()) {
}
}
- no_route_list_redisplay = false;
- redisplay_route_list ();
+ _routes->resume_redisplay ();
vertical_adjustment.set_value (0.0);
no_save_visual = false;
}
void
-Editor::temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & op)
+Editor::temporal_zoom_by_frame (nframes64_t start, nframes64_t end, const string & /*op*/)
{
if (!session) return;
if ((playlist = tv->playlist()) == 0) {
return;
}
-
- Glib::RefPtr<TreeSelection> selected = region_list_display.get_selection();
-
- if (selected->count_selected_rows() != 1) {
+
+ boost::shared_ptr<Region> region = _regions->get_single_selection ();
+ if (region == 0) {
return;
}
-
- TreeView::Selection::ListHandle_Path rows = selected->get_selected_rows ();
-
- /* only one row selected, so rows.begin() is it */
-
- TreeIter iter;
-
- if ((iter = region_list_model->get_iter (*rows.begin()))) {
-
- boost::shared_ptr<Region> region = (*iter)[region_list_columns.region];
- begin_reversible_command (_("insert region"));
- XMLNode &before = playlist->get_state();
- playlist->add_region ((RegionFactory::create (region)), get_preferred_edit_position(), times);
- session->add_command(new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
- commit_reversible_command ();
- }
+ begin_reversible_command (_("insert region"));
+ XMLNode &before = playlist->get_state();
+ playlist->add_region ((RegionFactory::create (region)), get_preferred_edit_position(), times);
+ session->add_command(new MementoCommand<Playlist>(*playlist, &before, &playlist->get_state()));
+ commit_reversible_command ();
}
/* BUILT-IN EFFECTS */
strip_whitespace_edges (str);
if (!str.empty()) {
rs.front()->region()->set_name (str);
- redisplay_regions ();
+ _regions->redisplay ();
}
}
}
nframes64_t start = selection->time[clicked_selection].start;
nframes64_t end = selection->time[clicked_selection].end;
+ TrackSelection tracks = get_tracks_for_range_action ();
+
nframes64_t selection_cnt = end - start + 1;
- for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
+ for (TrackSelection::iterator i = tracks.begin(); i != tracks.end(); ++i) {
boost::shared_ptr<Region> current;
boost::shared_ptr<Playlist> pl;
nframes64_t internal_start;
}
}
-void
-Editor::separate_regions_between (const TimeSelection& ts)
+/** Return either:
+ * - selected tracks, or if there are none...
+ * - tracks containing selected regions, or if there are none...
+ * - all tracks
+ * @return tracks.
+ */
+TrackSelection
+Editor::get_tracks_for_range_action () const
{
- bool in_command = false;
- boost::shared_ptr<Playlist> playlist;
- RegionSelection new_selection;
- TrackSelection tmptracks;
-
+ TrackSelection t;
+
if (selection->tracks.empty()) {
/* use tracks with selected regions */
- RegionSelection rs;
-
- get_regions_for_action (rs);
+ RegionSelection rs = selection->regions;
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
TimeAxisView* tv = &(*i)->get_time_axis_view();
- if (find (tmptracks.begin(), tmptracks.end(), tv) == tmptracks.end()) {
- tmptracks.push_back (tv);
+ if (!t.contains (tv)) {
+ t.push_back (tv);
}
}
- if (tmptracks.empty()) {
- /* no regions selected: do nothing */
- return;
+ if (t.empty()) {
+ /* no regions and no tracks: use all tracks */
+ t = track_views;
}
} else {
- tmptracks = selection->tracks;
-
+ t = selection->tracks;
}
+ return t;
+}
+
+void
+Editor::separate_regions_between (const TimeSelection& ts)
+{
+ bool in_command = false;
+ boost::shared_ptr<Playlist> playlist;
+ RegionSelection new_selection;
+
+ TrackSelection tmptracks = get_tracks_for_range_action ();
sort_track_selection (&tmptracks);
for (TrackSelection::iterator i = tmptracks.begin(); i != tmptracks.end(); ++i) {
}
}
+/** Take tracks from get_tracks_for_range_action and cut any regions
+ * on those tracks so that the tracks are empty over the time
+ * selection.
+ */
void
Editor::separate_region_from_selection ()
{
return;
}
-
- Glib::RefPtr<TreeSelection> selected = region_list_display.get_selection();
-
- if (selected->count_selected_rows() != 1) {
+ boost::shared_ptr<Region> region = _regions->get_single_selection ();
+ if (region == 0) {
return;
}
- TreeModel::iterator i = region_list_display.get_selection()->get_selected();
- boost::shared_ptr<Region> region = (*i)[region_list_columns.region];
-
nframes64_t start = selection->time[clicked_selection].start;
nframes64_t end = selection->time[clicked_selection].end;
}
gint
-Editor::freeze_progress_timeout (void *arg)
+Editor::freeze_progress_timeout (void */*arg*/)
{
interthread_progress_bar.set_fraction (current_interthread_info->progress);
return !(current_interthread_info->done || current_interthread_info->cancel);
spin.set_increments (0.1, 1);
spin.set_value (0);
hbox.pack_start (spin);
+ spin.set_value (_last_normalization_value);
hbox.pack_start (*manage (new Label (_("dbFS"))));
hbox.show_all ();
dialog.get_vbox()->pack_start (hbox);
commit_reversible_command ();
track_canvas->get_window()->set_cursor (*current_canvas_cursor);
+
+ _last_normalization_value = spin.get_value ();
}
void
Editor::reset_region_gain_envelopes ()
{
- RegionSelection rs;
-
- get_regions_for_action (rs);
+ RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
if (!session || rs.empty()) {
return;
void
Editor::toggle_gain_envelope_visibility ()
{
- RegionSelection rs;
+ RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
- get_regions_for_action (rs);
+ if (!session || rs.empty()) {
+ return;
+ }
+
+ session->begin_reversible_command (_("region gain envelope visible"));
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
+ XMLNode &before = arv->region()->get_state ();
arv->set_envelope_visible (!arv->envelope_visible());
+ XMLNode &after = arv->region()->get_state ();
+ session->add_command (new MementoCommand<Region> (*(arv->region().get()), &before, &after));
}
}
+
+ session->commit_reversible_command ();
}
void
Editor::toggle_gain_envelope_active ()
{
- RegionSelection rs;
+ RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
- get_regions_for_action (rs);
+ if (!session || rs.empty()) {
+ return;
+ }
+
+ session->begin_reversible_command (_("region gain envelope active"));
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
if (arv) {
+ XMLNode &before = arv->region()->get_state ();
arv->audio_region()->set_envelope_active (!arv->audio_region()->envelope_active());
+ XMLNode &after = arv->region()->get_state ();
+ session->add_command (new MementoCommand<Region> (*(arv->region().get()), &before, &after));
}
}
+
+ session->commit_reversible_command ();
}
void
Editor::toggle_region_lock ()
{
- RegionSelection rs;
+ RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
- get_regions_for_action (rs);
+ if (!session || rs.empty()) {
+ return;
+ }
+
+ session->begin_reversible_command (_("region lock"));
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
+ XMLNode &before = (*i)->region()->get_state ();
(*i)->region()->set_locked (!(*i)->region()->locked());
+ XMLNode &after = (*i)->region()->get_state ();
+ session->add_command (new MementoCommand<Region> (*((*i)->region().get()), &before, &after));
}
+
+ session->commit_reversible_command ();
}
void
Editor::set_region_lock_style (Region::PositionLockStyle ps)
{
- RegionSelection rs;
+ RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
- get_regions_for_action (rs);
+ if (!session || rs.empty()) {
+ return;
+ }
+
+ session->begin_reversible_command (_("region lock style"));
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
+ XMLNode &before = (*i)->region()->get_state ();
(*i)->region()->set_position_lock_style (ps);
+ XMLNode &after = (*i)->region()->get_state ();
+ session->add_command (new MementoCommand<Region> (*((*i)->region().get()), &before, &after));
}
+
+ session->commit_reversible_command ();
}
void
Editor::toggle_region_mute ()
{
- RegionSelection rs;
+ RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
- get_regions_for_action (rs);
+ if (!session || rs.empty()) {
+ return;
+ }
+
+ session->begin_reversible_command (_("region mute"));
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
+ XMLNode &before = (*i)->region()->get_state ();
(*i)->region()->set_muted (!(*i)->region()->muted());
+ XMLNode &after = (*i)->region()->get_state ();
+ session->add_command (new MementoCommand<Region> (*((*i)->region().get()), &before, &after));
}
+
+ session->commit_reversible_command ();
}
void
Editor::toggle_region_opaque ()
{
- RegionSelection rs;
+ RegionSelection rs = get_equivalent_regions (selection->regions, RouteGroup::Edit);
- get_regions_for_action (rs);
+ if (!session || rs.empty()) {
+ return;
+ }
+
+ session->begin_reversible_command (_("region opacity"));
for (RegionSelection::iterator i = rs.begin(); i != rs.end(); ++i) {
+ XMLNode &before = (*i)->region()->get_state ();
(*i)->region()->set_opaque (!(*i)->region()->opaque());
+ XMLNode &after = (*i)->region()->get_state ();
+ session->add_command (new MementoCommand<Region> (*((*i)->region().get()), &before, &after));
}
+
+ session->commit_reversible_command ();
}
void
{
RegionSelection rs;
- get_regions_for_action (rs);
-
- /* we need a region to measure the offset from the start */
+ get_regions_for_action (rs, true);
- RegionView* rv;
-
- if (!rs.empty()) {
- rv = rs.front();
- } else if (entered_regionview) {
- rv = entered_regionview;
- } else {
+ if (rs.empty()) {
return;
}
+ /* we need a region to measure the offset from the start */
+
+ RegionView* rv = rs.front ();
+
nframes64_t pos = get_preferred_edit_position();
nframes64_t len;
char* cmd;
{
RegionSelection rs;
- get_regions_for_action (rs);
+ get_regions_for_action (rs, true);
nframes64_t where = get_preferred_edit_position();
}
void
-Editor::fit_tracks ()
+Editor::fit_selected_tracks ()
{
- if (selection->tracks.empty()) {
+ fit_tracks (selection->tracks);
+}
+
+void
+Editor::fit_tracks (TrackSelection & tracks)
+{
+ if (tracks.empty()) {
return;
}
uint32_t child_heights = 0;
- for (TrackSelection::iterator t = selection->tracks.begin(); t != selection->tracks.end(); ++t) {
+ for (TrackSelection::iterator t = tracks.begin(); t != tracks.end(); ++t) {
if (!(*t)->marked_for_display()) {
continue;
child_heights += (*t)->effective_height() - (*t)->current_height();
}
- uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize)/selection->tracks.size());
+ uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / tracks.size());
double first_y_pos = DBL_MAX;
if (h < TimeAxisView::hSmall) {
- MessageDialog msg (*this, _("There are too many selected tracks to fit in the current window"));
+ MessageDialog msg (*this, _("There are too many tracks to fit in the current window"));
/* too small to be displayed */
return;
}
/* operate on all tracks, hide unselected ones that are in the middle of selected ones */
bool prev_was_selected = false;
- bool is_selected = selection->selected (track_views.front());
+ bool is_selected = tracks.contains (track_views.front());
bool next_is_selected;
for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) {
++next;
if (next != track_views.end()) {
- next_is_selected = selection->selected (*next);
+ next_is_selected = tracks.contains (*next);
} else {
next_is_selected = false;
}