29 #include <sigc++/bind.h>
38 #include <gtkmm/menu.h>
39 #include <gtkmm/menuitem.h>
58 #include "canvas/debug.h"
100 , parent_canvas (canvas)
102 , button_table (3, 3)
103 , route_group_button (
S_(
"RTAV|G"))
104 , playlist_button (
S_(
"RTAV|P"))
105 , automation_button (
S_(
"RTAV|A"))
106 , automation_action_menu (0)
107 , plugins_submenu_item (0)
108 , route_group_menu (0)
109 , playlist_action_menu (0)
111 , color_mode_menu (0)
112 , gm (sess, true, 75, 14)
113 , _ignore_set_layer_display (false)
114 , gain_automation_item(NULL)
115 , trim_automation_item(NULL)
116 , mute_automation_item(NULL)
117 , pan_automation_item(NULL)
197 Gtk::Fixed *blank = manage(
new Gtk::Fixed());
200 controls_table.attach (*blank, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
202 controls_table.attach (*blank, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
234 Gtk::Fixed *blank = manage(
new Gtk::Fixed());
237 controls_table.attach (*blank, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
239 controls_table.attach (*blank, 4, 5, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
367 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
375 r.push_back (
route ());
397 if (track_number == 0) {
440 if (p ==
"track-name-number") {
480 using namespace Menu_Helpers;
496 items.push_back (MenuElem (
_(
"Show All Automation"),
499 items.push_back (MenuElem (
_(
"Show Existing Automation"),
502 items.push_back (MenuElem (
_(
"Hide All Automation"),
510 items.push_back (SeparatorElem ());
511 items.push_back (MenuElem (
_(
"Processor automation"),
subplugin_menu));
550 set<Evoral::Parameter>
const & params =
_route->
pannable()->what_can_be_automated ();
551 for (set<Evoral::Parameter>::const_iterator p = params.begin(); p != params.end(); ++p) {
560 using namespace Menu_Helpers;
579 items.push_back (SeparatorElem());
585 items.push_back (MenuElem (
_(
"Height"), *
_size_menu));
587 items.push_back (SeparatorElem());
592 items.push_back (SeparatorElem());
600 Menu* layers_menu = manage (
new Menu);
601 MenuList &layers_items = layers_menu->items();
602 layers_menu->set_name(
"ArdourContextMenu");
604 RadioMenuItem::Group layers_group;
611 for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
636 layers_items.push_back (RadioMenuElem (layers_group,
_(
"Overlaid")));
637 RadioMenuItem* i =
dynamic_cast<RadioMenuItem*
> (&layers_items.back ());
638 i->set_active (overlaid != 0 && stacked == 0);
639 i->set_inconsistent (overlaid != 0 && stacked != 0);
642 layers_items.push_back (RadioMenuElem (layers_group,
_(
"Stacked")));
643 i =
dynamic_cast<RadioMenuItem*
> (&layers_items.back ());
644 i->set_active (overlaid == 0 && stacked != 0);
645 i->set_inconsistent (overlaid != 0 && stacked != 0);
650 items.push_back (MenuElem (
_(
"Layers"), *layers_menu));
654 Menu* alignment_menu = manage (
new Menu);
655 MenuList& alignment_items = alignment_menu->items();
656 alignment_menu->set_name (
"ArdourContextMenu");
658 RadioMenuItem::Group align_group;
669 for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
676 first_track = r->
track();
708 inconsistent =
false;
717 if (!inconsistent && first_track) {
719 alignment_items.push_back (RadioMenuElem (align_group,
_(
"Automatic (based on I/O connections)")));
720 i =
dynamic_cast<RadioMenuItem*
> (&alignment_items.back());
721 i->set_active (automatic != 0 && existing == 0 && capture == 0);
728 alignment_items.push_back (MenuElem (
_(
"(Currently: Existing Material)")));
731 alignment_items.push_back (MenuElem (
_(
"(Currently: Capture Time)")));
739 alignment_items.push_back (RadioMenuElem (align_group,
_(
"Align With Existing Material")));
740 i =
dynamic_cast<RadioMenuItem*
> (&alignment_items.back());
741 i->set_active (existing != 0 && capture == 0 && automatic == 0);
744 alignment_items.push_back (RadioMenuElem (align_group,
_(
"Align With Capture Time")));
745 i =
dynamic_cast<RadioMenuItem*
> (&alignment_items.back());
746 i->set_active (existing == 0 && capture != 0 && automatic == 0);
749 items.push_back (MenuElem (
_(
"Alignment"), *alignment_menu));
756 MenuList& mode_items = mode_menu->items ();
757 mode_menu->set_name (
"ArdourContextMenu");
759 RadioMenuItem::Group mode_group;
765 for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
784 mode_items.push_back (RadioMenuElem (mode_group,
_(
"Normal Mode")));
785 i =
dynamic_cast<RadioMenuItem*
> (&mode_items.back ());
787 i->set_active (normal != 0 && tape == 0 && non_layered == 0);
788 i->set_inconsistent (normal != 0 && (tape != 0 || non_layered != 0));
790 mode_items.push_back (RadioMenuElem (mode_group,
_(
"Tape Mode")));
791 i =
dynamic_cast<RadioMenuItem*
> (&mode_items.back ());
793 i->set_active (normal == 0 && tape != 0 && non_layered == 0);
794 i->set_inconsistent (tape != 0 && (normal != 0 || non_layered != 0));
796 mode_items.push_back (RadioMenuElem (mode_group,
_(
"Non-Layered Mode")));
797 i =
dynamic_cast<RadioMenuItem*
> (&mode_items.back ());
799 i->set_active (normal == 0 && tape == 0 && non_layered != 0);
800 i->set_inconsistent (non_layered != 0 && (normal != 0 || tape != 0));
802 items.push_back (MenuElem (
_(
"Record Mode"), *mode_menu));
806 items.push_back (SeparatorElem());
819 r.push_back (rtv->
route ());
824 r.push_back (
route ());
833 items.push_back (SeparatorElem());
838 for (TrackSelection::const_iterator i = s.begin(); i != s.end(); ++i) {
851 items.push_back (CheckMenuElem (
_(
"Active")));
852 Gtk::CheckMenuItem* i =
dynamic_cast<Gtk::CheckMenuItem *
> (&items.back());
853 bool click_sets_active =
true;
854 if (active > 0 && inactive == 0) {
855 i->set_active (
true);
856 click_sets_active =
false;
857 }
else if (active > 0 && inactive > 0) {
858 i->set_inconsistent (
true);
863 items.push_back (SeparatorElem());
865 items.push_front (SeparatorElem());
872 if (apply_to_selection) {
876 bool needs_bounce =
false;
878 if (!
track()->can_use_mode (mode, needs_bounce)) {
884 cerr <<
"would bounce this one\n";
910 if (!(ts.track ==
this || (ts.group != 0 && ts.group ==
_route->
route_group()))) {
1071 if (!mitem->get_active()) {
1078 if (apply_to_selection) {
1103 prompter.set_title (
_(
"Rename Playlist"));
1104 prompter.
set_prompt (
_(
"New name for playlist:"));
1106 prompter.add_button (
_(
"Rename"), Gtk::RESPONSE_ACCEPT);
1107 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT,
false);
1109 switch (prompter.run ()) {
1110 case Gtk::RESPONSE_ACCEPT:
1112 if (name.length()) {
1125 std::string ret (basename);
1132 std::string tmp = (*i)->name();
1134 std::string::size_type idx = tmp.find(group_string);
1136 if (idx != string::npos) {
1137 tmp = tmp.substr(idx + group_string.length());
1141 if (x > maxnumber) {
1150 snprintf (buf,
sizeof(buf),
"%d", maxnumber);
1179 name = Playlist::bump_name (name, *
_session);
1189 prompter.set_title (
_(
"New Copy Playlist"));
1190 prompter.
set_prompt (
_(
"Name for new playlist:"));
1192 prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
1193 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT,
true);
1194 prompter.show_all ();
1196 switch (prompter.run ()) {
1197 case Gtk::RESPONSE_ACCEPT:
1206 if (name.length()) {
1234 name = Playlist::bump_name (name, *
_session);
1242 prompter.set_title (
_(
"New Playlist"));
1243 prompter.
set_prompt (
_(
"Name for new playlist:"));
1245 prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
1246 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT,
true);
1248 switch (prompter.run ()) {
1249 case Gtk::RESPONSE_ACCEPT:
1258 if (name.length()) {
1299 if (Keyboard::modifier_state_equals (ev->state, (Keyboard::TertiaryModifier|Keyboard::PrimaryModifier))) {
1343 (*i)->set_selected_points (points);
1370 if ((
_view && ((top < 0.0 && bot < 0.0))) ||
touched (top, bot)) {
1377 if (!(*i)->hidden()) {
1378 (*i)->get_selectables (start_adjusted, end_adjusted, top, bot, results, within);
1391 if (!(*i)->hidden()) {
1392 (*i)->get_inverted_selectables (sel, results);
1416 if ((tr =
track()) != 0) {
1436 if (x.length() == 0) {
1491 float const speed = tr->
speed();
1492 if (speed != 1.0
f) {
1493 for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) {
1504 vector<Command*> cmds;
1505 playlist->
rdiff (cmds);
1526 float const speed = tr->
speed();
1527 if (speed != 1.0
f) {
1528 for (TimeSelection::iterator i = time.begin(); i != time.end(); ++i) {
1539 if (playlist->
cut (time) != 0) {
1544 vector<Command*> cmds;
1545 playlist->
rdiff (cmds);
1553 if ((what_we_got = playlist->
cut (time)) != 0) {
1559 vector<Command*> cmds;
1560 playlist->
rdiff (cmds);
1567 if ((what_we_got = playlist->
copy (time)) != 0) {
1573 if ((what_we_got = playlist->
cut (time)) != 0) {
1578 vector<Command*> cmds;
1579 playlist->
rdiff (cmds);
1606 if (
track()->speed() != 1.0
f) {
1612 std::pair<framepos_t, framepos_t> extent = (*p)->get_extent();
1613 const framecnt_t duration = extent.second - extent.first;
1618 std::pair<framepos_t, framepos_t> extent = (*p)->get_extent_with_endspace();
1619 framecnt_t amount = extent.second - extent.first;
1624 vector<Command*> cmds;
1643 using namespace Menu_Helpers;
1655 playlist_items.clear();
1657 RadioMenuItem::Group playlist_group;
1660 vector<boost::shared_ptr<Playlist> > playlists_tr =
_session->
playlists->playlists_for_track (tr);
1664 sort (playlists_tr.begin(), playlists_tr.end(), cmp);
1668 playlist_items.push_back (RadioMenuElem (playlist_group, (*i)->name()));
1669 RadioMenuItem *item =
static_cast<RadioMenuItem*
>(&playlist_items.back());
1678 playlist_items.push_back (SeparatorElem());
1680 playlist_items.push_back (SeparatorElem());
1693 playlist_items.push_back (SeparatorElem());
1695 playlist_items.push_back (SeparatorElem());
1706 if (!item->get_active()) {
1727 std::string group_string =
"." + rg->
name() +
".";
1729 std::string take_name = pl->name();
1730 std::string::size_type idx = take_name.find(group_string);
1732 if (idx == std::string::npos)
1735 take_name = take_name.substr(idx + group_string.length());
1739 for (RouteList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
1740 if ((*i) == this->
route()) {
1744 std::string playlist_name = (*i)->name()+group_string+take_name;
1773 string group_string =
"." + rg->
name() +
".";
1776 string::size_type idx = take_name.find(group_string);
1778 if (idx != string::npos) {
1780 take_name = take_name.substr (idx + group_string.length());
1786 Glib::Markup::escape_text(rg->
name()),
1787 Glib::Markup::escape_text(take_name))
1814 switch (
track()->freeze_state()) {
1855 bool yn = menu->get_active();
1856 bool changed =
false;
1884 menu->set_active (
false);
1945 bool changed =
false;
1948 if ((*i)->set_marked_for_display (showit)) {
1961 bool changed =
false;
1964 (*i)->set_marked_for_display (
false);
1975 set<Evoral::Parameter> params =
_route->
panner()->what_can_be_automated();
1976 set<Evoral::Parameter>::iterator p;
1978 for (p = params.begin(); p != params.end(); ++p) {
1982 error <<
"Pan control has NULL automation type!" <<
endmsg;
2017 if (apply_to_selection) {
2025 i->second->set_marked_for_display (
true);
2030 menu->set_active(
true);
2038 for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
2039 if ((*ii)->view == 0) {
2043 (*ii)->menu_item->set_active (
true);
2058 if (apply_to_selection) {
2066 if (i->second->has_automation()) {
2067 i->second->set_marked_for_display (
true);
2071 menu->set_active(
true);
2079 for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
2080 if ((*ii)->view != 0 && (*i)->processor->control((*ii)->what)->list()->size() > 0) {
2081 (*ii)->menu_item->set_active (
true);
2095 if (apply_to_selection) {
2103 i->second->set_marked_for_display (
false);
2108 menu->set_active (
false);
2115 for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
2116 (*ii)->menu_item->set_active (
false);
2133 if ((atv = boost::dynamic_pointer_cast<AutomationTimeAxisView> (*i)) != 0) {
2139 (*i)->add_ghost(rv);
2145 for (vector<ProcessorAutomationNode*>::iterator i = lines.begin(); i != lines.end(); ++i) {
2153 parent.remove_processor_automation_node (
this);
2169 if ((*i)->processor == processor) {
2171 for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
2172 if ((*ii)->what == what) {
2191 error <<
_(
"programming error: ")
2192 <<
string_compose (
X_(
"processor automation curve for %1:%2/%3/%4 not registered with track!"),
2237 if (!processor || boost::dynamic_pointer_cast<Amp> (processor)) {
2242 set<Evoral::Parameter> existing;
2244 processor->what_has_data (existing);
2246 for (set<Evoral::Parameter>::iterator i = existing.begin(); i != existing.end(); ++i) {
2262 using namespace Menu_Helpers;
2299 if (!processor || !processor->display_to_user ()) {
2308 if (boost::dynamic_pointer_cast<Amp> (processor) != 0) {
2312 using namespace Menu_Helpers;
2314 list<ProcessorAutomationInfo*>::iterator x;
2316 const std::set<Evoral::Parameter>& automatable = processor->what_can_be_automated ();
2318 if (automatable.empty()) {
2323 if ((*x)->processor == processor) {
2343 rai->
menu = manage (
new Menu);
2344 MenuList& items = rai->
menu->items();
2345 rai->
menu->set_name (
"ArdourContextMenu");
2349 std::set<Evoral::Parameter> has_visible_automation;
2352 for (std::set<Evoral::Parameter>::const_iterator i = automatable.begin(); i != automatable.end(); ++i) {
2355 Gtk::CheckMenuItem* mitem;
2357 string name = processor->describe_parameter (*i);
2359 items.push_back (CheckMenuElem (name));
2360 mitem =
dynamic_cast<Gtk::CheckMenuItem*
> (&items.back());
2364 if (has_visible_automation.find((*i)) != has_visible_automation.end()) {
2365 mitem->set_active(
true);
2374 rai->
lines.push_back (pan);
2399 bool showit = pan->
menu_item->get_active();
2400 bool redraw =
false;
2402 if (pan->
view == 0 && showit) {
2419 if (c.
type == RouteProcessorChange::MeterPointChange) {
2424 using namespace Menu_Helpers;
2427 (*i)->valid =
false;
2432 bool deleted_processor_automation =
false;
2436 list<ProcessorAutomationInfo*>::iterator tmp;
2445 deleted_processor_automation =
true;
2452 if (deleted_processor_automation && !
no_redraw) {
2500 if (apply_to_selection) {
2559 int meter_width = 3;
2599 using namespace Menu_Helpers;
2602 MenuList& parent_items = parent_menu->items();
2603 Menu* gs_menu = manage (
new Menu);
2604 gs_menu->set_name (
"ArdourContextMenu");
2605 MenuList& gs_items = gs_menu->items();
2607 parent_items.push_back (MenuElem (
_(
"Underlays"), *gs_menu));
2610 gs_items.push_back(MenuElem(
string_compose(
_(
"Remove \"%1\""), (*it)->trackview().name()),
2627 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2628 child_node = *niter;
2630 if (child_node->
name() !=
"Underlay") {
2660 fatal <<
_(
"programming error: underlay reference pointer pairs are inconsistent!") <<
endmsg;
2669 #ifdef GUI_OBJECT_STATE_FIX_REQUIRED
2694 UnderlayMirrorList::iterator
gm = find(other._underlay_mirrors.begin(), other._underlay_mirrors.end(),
this);
2696 if (gm == other._underlay_mirrors.end()) {
2697 fatal <<
_(
"programming error: underlay reference pointer pairs are inconsistent!") <<
endmsg;
2704 other._underlay_mirrors.erase(gm);
2720 if (
Config->get_solo_control_is_listen_control()) {
2721 switch (
Config->get_listen_position()) {
2759 error <<
"Route has no gain automation, unable to add automation track view." <<
endmsg;
2769 _route->
amp()->describe_parameter(param)));
2806 error <<
"Route has no mute automation, unable to add automation track view." <<
endmsg;
2828 l->push_back (rv->
region());
2850 if (selected_regions.size() < 2) {
2887 for (RegionList::iterator i = selected_regions.begin(); i != selected_regions.end(); ++i) {
2909 if (i->second == a) {
LayerDisplay layer_display() const
void set_route_active(bool, bool)
void blink_rec_display(bool onoff)
RegionView * find_view(boost::shared_ptr< const ARDOUR::Region >)
bool transport_rolling() const
boost::shared_ptr< ARDOUR::Processor > processor
static PBD::Signal1< void, TimeAxisView * > CatchDeletion
void set_align_choice(AlignChoice, bool force=false)
std::list< ProcessorAutomationInfo * > processor_automation
void automation_track_hidden(Evoral::Parameter param)
void remove_child(boost::shared_ptr< TimeAxisView >)
void open_comment_editor()
void create_trim_automation_child(const Evoral::Parameter &, bool)
boost::shared_ptr< ARDOUR::Playlist > playlist() const
LIBPBD_API Transmitter fatal
void ripple(framepos_t at, framecnt_t distance, RegionList *exclude)
std::string to_string(T t, std::ios_base &(*f)(std::ios_base &))
UnderlayList _underlay_streams
void set_route(boost::shared_ptr< ARDOUR::Route >)
int atoi(const string &s)
void remove_ghost(RegionView *)
void conditionally_add_to_selection()
void open_remote_control_id_dialog()
virtual Gtk::CheckMenuItem * automation_child_menu_item(Evoral::Parameter)
void use_new_playlist(bool prompt, std::vector< boost::shared_ptr< ARDOUR::Playlist > > const &)
const std::string & value() const
PBD::Signal1< void, const PropertyChange & > PropertyChanged
bool is_midi_track() const
void update_gain_sensitive()
boost::shared_ptr< Amp > amp() const
XMLNode * underlay_xml_node
void take_name_changed(void *src)
ARDOUR::RouteGroup * route_group() const
std::string gui_property(const std::string &property_name) const
LIBARDOUR_API PBD::PropertyDescriptor< layer_t > layer
static unsigned int name_width_px
void update_pan_track_visibility()
bool is_audio_track() const
void fade_range(std::list< AudioRange > &)
bool touched(double top, double bot)
Gtk::CheckMenuItem * trim_automation_item
void set_layer_display(LayerDisplay)
void clear_meters(bool reset_highlight=true)
Gtk::CheckMenuItem * menu_item
PBD::Signal0< void > FreezeChange
ArdourButton playlist_button
virtual ~RouteTimeAxisView()
~ProcessorAutomationInfo()
const DataType & data_type() const
void edit_input_configuration()
virtual void set_height(uint32_t h, TrackHeightMode m=OnlySelf)
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
virtual void hide_timestretch()
static ARDOUR_UI * instance()
void cut_copy_clear(Selection &, Editing::CutCopyOp)
LIBARDOUR_API PBD::PropertyDescriptor< std::string > name
PBD::Signal0< void > meter_change
virtual int set_height(double)
void update_diskstream_display()
virtual bool controls_ebox_scroll(GdkEventScroll *)
const std::string & name() const
std::string resolve_new_group_playlist_name(std::string &, std::vector< boost::shared_ptr< ARDOUR::Playlist > > const &)
void set_fader_name(const char *name)
boost::shared_ptr< Pannable > pannable() const
Lists of selected things.
void add_command(Command *const cmd)
boost::shared_ptr< ARDOUR::Region > find_next_region(framepos_t pos, ARDOUR::RegionPoint, int32_t dir)
void add_underlay(StreamView *, bool update_xml=true)
void add_processor_automation_curve(boost::shared_ptr< ARDOUR::Processor > r, Evoral::Parameter)
boost::shared_ptr< Control > control(const Parameter &id, bool create_if_missing=false)
~ProcessorAutomationNode()
Representation of the interface of the Editor class.
boost::shared_ptr< AutomationControl > gain_control() const
void get_selectables(ARDOUR::framepos_t, ARDOUR::framepos_t, double, double, std::list< Selectable * > &, bool within=false)
void build_underlay_menu(Gtk::Menu *)
void set_layer_display(LayerDisplay d, bool apply_to_selection=false)
RouteTimeAxisView & trackview()
void set(std::list< Selectable * > const &)
virtual void set_route(boost::shared_ptr< ARDOUR::Route >)
Gtk::Table controls_table
LIBPBD_API Transmitter error
void clear_owned_changes()
ArdourCanvas::Canvas & parent_canvas
const XMLNodeList & children(const std::string &str=std::string()) const
virtual int set_mode(TrackMode)
bool set_name(const std::string &str)
RouteGroupMenu * route_group_menu
boost::shared_ptr< Panner > panner() const
void add_existing_processor_automation_curves(boost::weak_ptr< ARDOUR::Processor >)
bool is_auditioner() const
std::ostream & endmsg(std::ostream &ostr)
virtual void select_all_tracks()=0
void uncombine(boost::shared_ptr< Region >)
SessionConfiguration config
boost::shared_ptr< PeakMeter > shared_peak_meter() const
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
XMLNode * add_child(const char *)
uint32_t current_height() const
LIBPBD_API void strip_whitespace_edges(std::string &str)
AlignChoice alignment_choice() const
void set_samples_per_pixel(double)
virtual void remove_tracks()=0
virtual void copy_playlists(TimeAxisView *)=0
#define ENSURE_GUI_THREAD(obj, method,...)
virtual bool set_marked_for_display(bool)
void use_playlist(Gtk::RadioMenuItem *item, boost::weak_ptr< ARDOUR::Playlist > wpl)
virtual void name_entry_changed()
boost::shared_ptr< Region > combine(const RegionList &)
void set_initial_text(std::string txt)
void set_selected_regionviews(RegionSelection &)
virtual void build_display_menu()
virtual void clear_playlists(TimeAxisView *)=0
void set_track_mode(ARDOUR::TrackMode, bool apply_to_selection=false)
std::list< XMLNode * > XMLNodeList
void setup_meters(int len=0, int width=3, int thin=2)
std::vector< ProcessorAutomationNode * > lines
void update_trim_track_visibility()
virtual void add_processor_to_subplugin_menu(boost::weak_ptr< ARDOUR::Processor >)
void reset_samples_per_pixel()
virtual void show_existing_automation(bool apply_to_selection=false)
boost::shared_ptr< Amp > trim() const
void route_property_changed(const PBD::PropertyChange &)
void show_timestretch(framepos_t start, framepos_t end, int layers, int layer)
ProcessorAutomationNode * find_processor_automation_node(boost::shared_ptr< ARDOUR::Processor > i, Evoral::Parameter)
void set_height(uint32_t h, TrackHeightMode m=OnlySelf)
void foreach_selected_regionview(sigc::slot< void, RegionView * > slot)
void add(std::list< Selectable * > const &)
void processor_automation_track_hidden(ProcessorAutomationNode *, boost::shared_ptr< ARDOUR::Processor >)
ArdourButton * rec_enable_button
int64_t track_number() const
ArdourCanvas::Container * _canvas_display
virtual void show_timestretch(framepos_t start, framepos_t end, int layers, int layer)
void increase_n_playlists(ARDOUR::DataType t, size_t delta=1)
void create_gain_automation_child(const Evoral::Parameter &, bool)
boost::shared_ptr< ARDOUR::Route > _route
static Glib::RefPtr< Gtk::SizeGroup > controls_meters_size_group
void rename_current_playlist()
RouteTimeAxisView(PublicEditor &, ARDOUR::Session *, ArdourCanvas::Canvas &canvas)
void toggle(std::list< Selectable * > const &)
ArdourButton automation_button
virtual void new_playlists(TimeAxisView *)=0
virtual bool record_enabled() const
void foreach_regionview(sigc::slot< void, RegionView * > slot)
uint32_t gdk_color_to_rgba(Gdk::Color const &)
RegionView * combine_regions()
ArdourButton * solo_button
virtual void hide_track_in_display(TimeAxisView *tv, bool apply_to_selection=false)=0
LIBARDOUR_API PBD::PropertyDescriptor< bool > automatic
ArdourCanvas::Container * _ghost_group
virtual void label_view()
PBD::Signal2< void, std::string, void * > gui_changed
void get_inverted_selectables(Selection &, std::list< Selectable * > &)
void build_playlist_menu()
PBD::Signal0< void > track_number_changed
XMLProperty * property(const char *)
LIBARDOUR_API RCConfiguration * Config
virtual void append_extra_display_menu_items()
#define string_2_enum(str, e)
boost::shared_ptr< Region > find_next_region(framepos_t frame, RegionPoint point, int dir)
void add_ghost(RegionView *)
virtual PlaylistSelector & playlist_selector() const =0
boost::shared_ptr< ARDOUR::Region > region() const
void set_prompt(std::string prompt)
void remove_underlay(StreamView *)
virtual void blink_rec_display(bool onoff)
bool can_edit_name() const
void setup_processor_menu_and_curves()
int use_playlist(boost::shared_ptr< Playlist >)
ProcessorAutomationCurves processor_automation_curves
void set_selected_regionviews(RegionSelection &)
virtual framecnt_t get_current_zoom() const =0
virtual std::string describe_parameter(Evoral::Parameter param)
void set_align_choice(Gtk::RadioMenuItem *, ARDOUR::AlignChoice, bool apply_to_selection=false)
bool string_is_affirmative(const std::string &str)
ArdourCanvas::Container * canvas_display()
virtual void show_all_automation(bool apply_to_selection=false)
framepos_t find_next_region_boundary(framepos_t frame, int dir)
virtual void show_selection(TimeSelection &)
bool set_name(const std::string &str)
int remove(boost::shared_ptr< Route >)
bool is_child(TimeAxisView *)
const PBD::ID & id() const
ARDOUR::Session * session() const
boost::shared_ptr< AutomationTimeAxisView > mute_track
boost::shared_ptr< ARDOUR::Track > track() const
bool enabled_property(PBD::PropertyID)
void show_selection(TimeSelection &)
void selection_click(GdkEventButton *)
PBD::Signal0< void > SpeedChanged
void region_view_added(RegionView *)
virtual void create_automation_child(const Evoral::Parameter ¶m, bool show)=0
boost::shared_ptr< Playlist > playlist()
void foreach_processor(boost::function< void(boost::weak_ptr< Processor >)> method)
virtual Selection & get_cut_buffer() const =0
LIBARDOUR_API PBD::PropertyDescriptor< bool > mute
static void add_region_to_list(RegionView *rv, RegionList *l)
bool route_name_internal(std::string) const
#define DEBUG_TRACE(bits, str)
void fade_range(TimeSelection &)
virtual Selection & get_selection() const =0
void add_automation_child(Evoral::Parameter param, boost::shared_ptr< AutomationTimeAxisView > track, bool show=true)
void route_color_changed()
void set_selected_points(PointSelection &)
void ensure_pan_views(bool show=true)
PlaylistSelection playlists
virtual int set_samples_per_pixel(double)
LevelMeterHBox & get_level_meter() const
AutomationTracks _automation_tracks
LIBARDOUR_API PBD::PropertyDescriptor< bool > regions
Gtk::Menu * automation_action_menu
virtual RouteTimeAxisView * get_route_view_by_route_id(const PBD::ID &id) const =0
PBD::Signal1< void, std::string > ParameterChanged
LIBARDOUR_API PBD::PropertyDescriptor< bool > active
LIBARDOUR_API RuntimeProfile * Profile
void get_result(std::string &str, bool strip=true)
PBD::Signal0< void > PlaylistChanged
std::list< boost::shared_ptr< Region > > RegionList
ItemCounts counts
Count of consumed selection items.
const Parameter & parameter() const
void name_entry_changed()
void set_tip(Gtk::Widget &w, const gchar *tip)
void call_slot(EventLoop::InvalidationRecord *, const boost::function< void()> &)
boost::shared_ptr< AutomationTimeAxisView > gain_track
void get_inverted_selectables(Selection &, std::list< Selectable * > &results)
bool selected(TimeAxisView *)
XMLProperty * add_property(const char *name, const std::string &value)
Gtk::CheckMenuItem * gain_automation_item
ParameterMenuMap _subplugin_menu_map
void processors_changed(ARDOUR::RouteProcessorChange)
virtual void build_automation_action_menu(bool)
bool set_underlay_state()
PBD::Signal1< void, RouteProcessorChange > processors_changed
void create_mute_automation_child(const Evoral::Parameter &, bool)
Glib::RefPtr< Gtk::SizeGroup > controls_button_size_group
ARDOUR::framepos_t start()
ArdourCanvas::Container * selection_group
ARDOUR::framepos_t length()
boost::shared_ptr< Playlist > copy(std::list< AudioRange > &, bool result_is_hidden=true)
virtual void set_samples_per_pixel(double)
class LIBPBD_API PropertyList
ArdourButton route_group_button
static void what_has_visible_automation(const boost::shared_ptr< ARDOUR::Automatable > &automatable, std::set< Evoral::Parameter > &visible)
static Selection::Operation selection_type(guint state)
LIBARDOUR_API PBD::PropertyDescriptor< bool > solo
void add_child(boost::shared_ptr< TimeAxisView >)
void reset_peak_display()
virtual framecnt_t get_paste_offset(framepos_t pos, unsigned paste_count, framecnt_t duration)=0
static ARDOUR::framepos_t session_frame_to_track_frame(ARDOUR::framepos_t session_frame, double speed)
Gtkmm2ext::SliderController & get_gain_slider() const
void reset_processor_automation_curves()
ArdourButton * mute_button
bool parameter_is_midi(AutomationType type)
RouteGroup * route_group() const
void update_track_number_visibility()
boost::shared_ptr< RouteList > route_list()
static UIConfiguration * config()
uint32_t track_number_decimals() const
Gtk::CheckMenuItem * pan_automation_item
void rdiff(std::vector< Command * > &) const
boost::shared_ptr< AutomationTimeAxisView > automation_child(Evoral::Parameter param)
void parameter_changed(std::string const &p)
std::list< boost::weak_ptr< Route > > WeakRouteList
boost::shared_ptr< MuteControllable > mute_control() const
sigc::signal< void > ColorsChanged
LIBARDOUR_API PBD::PropertyDescriptor< bool > select
boost::shared_ptr< AutomationLine > find_processor_automation_curve(boost::shared_ptr< ARDOUR::Processor > i, Evoral::Parameter)
boost::shared_ptr< IO > input() const
virtual bool extend_selection_to_track(TimeAxisView &)=0
UnderlayMirrorList _underlay_mirrors
float times
Number of times to paste.
sigc::signal< void > ZoomChanged
virtual void hide_selection()
void edit_output_configuration()
boost::shared_ptr< SessionPlaylists > playlists
LayerDisplay layer_display() const
FreezeState freeze_state() const
bool contains(PropertyDescriptor< T > p) const
Gtk::Menu * playlist_action_menu
void foreach_route_time_axis(Function f)
void set_gui_property(const std::string &property_name, const T &value)
const_iterator get_nth(ARDOUR::DataType type, size_t nth) const
std::string state_id() const
LIBARDOUR_API GQuark capture
boost::shared_ptr< IO > output() const
AlignStyle alignment_style() const
void update_gain_track_visibility()
void show_playlist_selector()
static uint32_t preset_height(Height)
std::list< boost::shared_ptr< AutomationTimeAxisView > > pan_tracks
bool paste(ARDOUR::framepos_t, const Selection &, PasteContext &ctx)
void add_commands(std::vector< Command * > const &cmds)
virtual void begin_reversible_selection_op(std::string cmd_name)=0
void update_mute_track_visibility()
void io_changed(ARDOUR::IOChange, void *)
unsigned count
Number of previous pastes to the same position.
const std::string & set_value(const std::string &v)
void processor_menu_item_toggled(RouteTimeAxisView::ProcessorAutomationInfo *, RouteTimeAxisView::ProcessorAutomationNode *)
void remove_nodes_and_delete(const std::string &)
void apply_color(uint32_t, ColorTarget t)
size_t n_playlists(ARDOUR::DataType t) const
bool marked_for_display() const
LIBGTKMM2EXT_API void detach_menu(Gtk::Menu &)
virtual void clear_playlist(boost::shared_ptr< ARDOUR::Playlist >)=0
gint route_group_click(GdkEventButton *)
XMLNodeList::const_iterator XMLNodeConstIterator
Gtk::CheckMenuItem * mute_automation_item
virtual void remove_child(boost::shared_ptr< TimeAxisView >)
boost::shared_ptr< Playlist > cut(std::list< AudioRange > &, bool result_is_hidden=true)
virtual void set_controls(boost::shared_ptr< ARDOUR::Route > route, boost::shared_ptr< ARDOUR::PeakMeter > meter, boost::shared_ptr< ARDOUR::Amp > amp)
bool _ignore_set_layer_display
boost::shared_ptr< AutomationTimeAxisView > view
void use_copy_playlist(bool prompt, std::vector< boost::shared_ptr< ARDOUR::Playlist > > const &)
bool add(PropertyBase *prop)
boost::shared_ptr< AutomationLine > line()
ArdourButton number_label
ARDOUR::Session * _session
boost::shared_ptr< ARDOUR::Route > route() const
void get_selectables(ARDOUR::framepos_t start, ARDOUR::framepos_t end, double top, double bot, std::list< Selectable * > &, bool within=false)
void remove_processor_automation_node(ProcessorAutomationNode *pan)
void update_playlist_tip()
framepos_t find_next_region_boundary(framepos_t pos, int32_t dir)
sigc::signal< void > Hiding
std::string string_compose(const std::string &fmt, const T1 &o1)
int paste(boost::shared_ptr< Playlist >, framepos_t position, float times)
ArdourCanvas::Rectangle * timestretch_rect
virtual void commit_reversible_selection_op()=0
void build_display_menu()
void cleanup_gui_properties()
virtual void hide_all_automation(bool apply_to_selection=false)
void popup_error(const std::string &text)
boost::shared_ptr< AutomationTimeAxisView > trim_track
bool verify_new_route_name(const std::string &name)
ParameterMenuMap _main_automation_menu_map
void toggle_automation_track(const Evoral::Parameter ¶m)