#include "editor_locations.h"
#include "editor_snapshots.h"
#include "editor_summary.h"
+#include "region_layering_order_editor.h"
#include "i18n.h"
_dragging_edit_point = false;
select_new_marker = false;
rhythm_ferret = 0;
+ layering_order_editor = 0;
_bundle_manager = 0;
no_save_visual = false;
resize_idle_id = -1;
image_socket_listener = 0 ;
}
#endif
-
+
delete _routes;
delete _route_groups;
delete track_canvas;
mode and so offering region context is somewhat confusing.
*/
if ((tr = rtv->track()) && ((pl = tr->playlist())) && !internal_editing()) {
- Playlist::RegionList* regions = pl->regions_at ((nframes64_t) floor ( (double)frame * tr->speed()));
+ framepos_t framepos = (framepos_t) floor ((double)frame * tr->speed());
+ uint32_t regions_at = pl->count_regions_at (framepos);
+ list<boost::shared_ptr<Region> > regions_for_menu;
if (selection->regions.size() > 1) {
// there's already a multiple selection: just add a
// single region context menu that will act on all
// selected regions
- list<boost::shared_ptr<Region> > regions;
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
- regions.push_back ((*i)->region ());
+ regions_for_menu.push_back ((*i)->region ());
}
-
- add_region_context_items (rtv->view(), regions, edit_items);
- } else {
- for (Playlist::RegionList::reverse_iterator i = regions->rbegin(); i != regions->rend(); ++i) {
- list<boost::shared_ptr<Region> > regions;
- regions.push_back (*i);
- add_region_context_items (rtv->view(), regions, edit_items);
- }
- }
+ } else {
+ boost::shared_ptr<Region> top_region = pl->top_region_at (framepos);
+ if (top_region) {
+ regions_for_menu.push_back (top_region);
+ }
+ }
- delete regions;
+ add_region_context_items (rtv->view(), regions_for_menu, edit_items, framepos, regions_at > 1);
}
}
if ((tr = atv->track()) && ((pl = tr->playlist()) != 0) && ((apl = boost::dynamic_pointer_cast<AudioPlaylist> (pl)) != 0)) {
- Playlist::RegionList* regions = pl->regions_at (frame);
AudioPlaylist::Crossfades xfades;
apl->crossfades_at (frame, xfades);
add_crossfade_context_items (atv->audio_view(), (*i), edit_items, many);
}
+ framepos_t framepos = (framepos_t) floor ((double)frame * tr->speed());
+ uint32_t regions_at = pl->count_regions_at (framepos);
+ list<boost::shared_ptr<Region> > regions_for_menu;
+
if (selection->regions.size() > 1) {
- // there's already a multiple selection: just add a
- // single region context menu that will act on all
- // selected regions
+ // there's already a multiple selection: just add a
+ // single region context menu that will act on all
+ // selected regions
- list<boost::shared_ptr<Region> > regions;
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
- regions.push_back ((*i)->region ());
+ regions_for_menu.push_back ((*i)->region ());
}
-
- add_region_context_items (atv->audio_view(), regions, edit_items);
- } else {
- for (Playlist::RegionList::reverse_iterator i = regions->rbegin(); i != regions->rend(); ++i) {
- list<boost::shared_ptr<Region> > regions;
- regions.push_back (*i);
- add_region_context_items (atv->audio_view(), regions, edit_items);
- }
- }
- delete regions;
+ } else {
+ boost::shared_ptr<Region> top_region = pl->top_region_at (framepos);
+ if (top_region) {
+ regions_for_menu.push_back (top_region);
+ }
+ }
+
+ add_region_context_items (atv->audio_view(), regions_for_menu, edit_items, framepos, regions_at > 1);
}
}
}
void
-Editor::add_region_context_items (StreamView* sv, list<boost::shared_ptr<Region> > regions, Menu_Helpers::MenuList& edit_items)
+Editor::add_region_context_items (StreamView* sv, list<boost::shared_ptr<Region> > regions, Menu_Helpers::MenuList& edit_items,
+ framepos_t position, bool multiple_regions_at_position)
{
using namespace Menu_Helpers;
Gtk::MenuItem* foo_item;
}
edit_items.push_back (MenuElem (menu_item_name, *region_menu));
+ if (multiple_regions_at_position && (layering_order_editor == 0 || !layering_order_editor->is_visible ())) {
+ edit_items.push_back (MenuElem (_("Choose top region"), (bind (mem_fun(*this, &Editor::change_region_layering_order), position))));
+ }
edit_items.push_back (SeparatorElem());
}
}
}
+void
+Editor::change_region_layering_order (framepos_t position)
+{
+ if (!clicked_regionview) {
+ if (layering_order_editor) {
+ layering_order_editor->hide ();
+ }
+ return;
+ }
+
+ if (!clicked_routeview) {
+ return;
+ }
+
+ boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (clicked_routeview->route());
+
+ if (!track) {
+ return;
+ }
+
+ boost::shared_ptr<Playlist> pl = track->playlist();
+
+ if (!pl) {
+ return;
+ }
+
+ if (layering_order_editor == 0) {
+ layering_order_editor = new RegionLayeringOrderEditor(*this);
+ }
+
+ layering_order_editor->set_context (clicked_routeview->name(), _session, pl, position);
+ layering_order_editor->maybe_present ();
+}
+
+void
+Editor::update_region_layering_order_editor (framepos_t frame)
+{
+ if (layering_order_editor && layering_order_editor->is_visible ()) {
+ change_region_layering_order (frame);
+ }
+}
class EditorLocations;
class EditorSnapshots;
class EditorSummary;
+class RegionLayeringOrderEditor;
/* <CMT Additions> */
class ImageFrameView;
Gtk::Menu* build_track_selection_context_menu (nframes64_t);
void add_dstream_context_items (Gtk::Menu_Helpers::MenuList&);
void add_bus_context_items (Gtk::Menu_Helpers::MenuList&);
- void add_region_context_items (StreamView*, std::list<boost::shared_ptr<ARDOUR::Region> >, Gtk::Menu_Helpers::MenuList&);
+ void add_region_context_items (StreamView*, std::list<boost::shared_ptr<ARDOUR::Region> >, Gtk::Menu_Helpers::MenuList&,
+ ARDOUR::framepos_t, bool);
void add_crossfade_context_items (AudioStreamView*, boost::shared_ptr<ARDOUR::Crossfade>, Gtk::Menu_Helpers::MenuList&, bool many);
void add_selection_context_items (Gtk::Menu_Helpers::MenuList&);
void toggle_region_lock_style ();
void raise_region ();
void raise_region_to_top ();
+ void change_region_layering_order (ARDOUR::framepos_t);
void lower_region ();
void lower_region_to_bottom ();
void split_regions_at (nframes64_t, RegionSelection&);
double _last_motion_y;
+ RegionLayeringOrderEditor* layering_order_editor;
+ void update_region_layering_order_editor (ARDOUR::framepos_t);
+
friend class Drag;
friend class RegionDrag;
friend class RegionMoveDrag;