summaryrefslogtreecommitdiff
path: root/gtk2_ardour/route_time_axis.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/route_time_axis.cc')
-rw-r--r--gtk2_ardour/route_time_axis.cc232
1 files changed, 222 insertions, 10 deletions
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 900064a763..f113724cf5 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -23,6 +23,7 @@
#include <algorithm>
#include <string>
#include <vector>
+#include <utility>
#include <sigc++/bind.h>
@@ -50,6 +51,7 @@
#include <ardour/session.h>
#include <ardour/session_playlist.h>
#include <ardour/utils.h>
+#include <ardour/param_id.h>
#include "ardour_ui.h"
#include "route_time_axis.h"
@@ -80,6 +82,7 @@ using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
using namespace Editing;
+using namespace sigc;
RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::shared_ptr<Route> rt, Canvas& canvas)
@@ -252,6 +255,58 @@ RouteTimeAxisView::playlist_modified ()
{
}
+void
+RouteTimeAxisView::set_state (const XMLNode& node)
+{
+ const XMLProperty *prop;
+
+ TimeAxisView::set_state (node);
+
+ if ((prop = node.property ("shown_editor")) != 0) {
+ if (prop->value() == "no") {
+ _marked_for_display = false;
+ } else {
+ _marked_for_display = true;
+ }
+ } else {
+ _marked_for_display = true;
+ }
+
+ XMLNodeList nlist = node.children();
+ XMLNodeConstIterator niter;
+ XMLNode *child_node;
+
+ _show_automation.clear();
+
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ child_node = *niter;
+
+ ParamID param(child_node->name());
+
+ if (param) {
+
+ cerr << "RTAV::set_state parameter: " << param.to_string() << endl;
+
+ XMLProperty* prop = child_node->property ("shown");
+
+ if (_automation_tracks.find(param) == _automation_tracks.end())
+ create_automation_child(param);
+
+ if (prop != 0 && prop->value() == "yes")
+ _show_automation.insert(ParamID(GainAutomation));
+
+ } else {
+ cerr << "RTAV: no parameter " << child_node->name() << endl;
+ }
+ }
+}
+
+XMLNode*
+RouteTimeAxisView::get_child_xml_node (const string & childname)
+{
+ return RouteUI::get_child_xml_node (childname);
+}
+
gint
RouteTimeAxisView::edit_click (GdkEventButton *ev)
{
@@ -386,6 +441,24 @@ RouteTimeAxisView::build_automation_action_menu ()
mem_fun(*this, &RouteTimeAxisView::hide_all_automation)));
automation_items.push_back (MenuElem (_("Plugins"), subplugin_menu));
+
+ map<ARDOUR::ParamID, RouteAutomationNode*>::iterator i;
+ for (i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
+
+ automation_items.push_back (SeparatorElem());
+
+ if ( ! i->second->menu_item) {
+ automation_items.push_back(CheckMenuElem (_route->describe_parameter(i->second->param),
+ bind (mem_fun(*this, &RouteTimeAxisView::toggle_automation_track), i->second->param)));
+
+ i->second->menu_item = static_cast<Gtk::CheckMenuItem*>(&automation_items.back());
+
+ } else {
+ automation_items.push_back (*i->second->menu_item);
+ }
+
+ i->second->menu_item->set_active(show_automation(i->second->param));
+ }
}
void
@@ -1092,6 +1165,33 @@ RouteTimeAxisView::get_inverted_selectables (Selection& sel, list<Selectable*>&
return;
}
+bool
+RouteTimeAxisView::show_automation(ParamID param)
+{
+ return (_show_automation.find(param) != _show_automation.end());
+}
+
+/** Retuns NULL if track for \a param doesn't exist.
+ */
+RouteTimeAxisView::RouteAutomationNode*
+RouteTimeAxisView::automation_track(ParamID param)
+{
+ map<ARDOUR::ParamID, RouteAutomationNode*>::iterator i = _automation_tracks.find(param);
+
+ if (i != _automation_tracks.end())
+ return i->second;
+ else
+ return NULL;
+}
+
+/** Shorthand for GainAutomation, etc.
+ */
+RouteTimeAxisView::RouteAutomationNode*
+RouteTimeAxisView::automation_track(AutomationType type)
+{
+ return automation_track(ParamID(type));
+}
+
RouteGroup*
RouteTimeAxisView::edit_group() const
{
@@ -1380,9 +1480,69 @@ RouteTimeAxisView::color_handler ()
}
void
+RouteTimeAxisView::toggle_automation_track (ParamID param)
+{
+ RouteAutomationNode* node = automation_track(param);
+
+ if (!node)
+ return;
+
+ bool showit = node->menu_item->get_active();
+
+ if (showit != node->track->marked_for_display()) {
+ if (showit) {
+ node->track->set_marked_for_display (true);
+ node->track->canvas_display->show();
+ node->track->get_state_node()->add_property ("shown", X_("yes"));
+ } else {
+ node->track->set_marked_for_display (false);
+ node->track->hide ();
+ node->track->get_state_node()->add_property ("shown", X_("no"));
+ }
+
+ /* now trigger a redisplay */
+
+ if (!no_redraw) {
+ _route->gui_changed (X_("track_height"), (void *) 0); /* EMIT_SIGNAL */
+ }
+ }
+}
+
+void
+RouteTimeAxisView::automation_track_hidden (ParamID param)
+{
+ RouteAutomationNode* ran = automation_track(param);
+ if (!ran)
+ return;
+
+ _show_automation.erase(param);
+ ran->track->get_state_node()->add_property (X_("shown"), X_("no"));
+
+ if (ran->menu_item && !_hidden) {
+ ran->menu_item->set_active (false);
+ }
+
+ _route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
+}
+
+
+void
RouteTimeAxisView::show_all_automation ()
{
no_redraw = true;
+
+ /* Show our automation */
+
+ map<ARDOUR::ParamID, RouteAutomationNode*>::iterator i;
+ for (i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
+ i->second->track->set_marked_for_display (true);
+ i->second->track->canvas_display->show();
+ i->second->track->get_state_node()->add_property ("shown", X_("yes"));
+ i->second->menu_item->set_active(true);
+ }
+
+
+ /* Show insert automation */
for (list<InsertAutomationInfo*>::iterator i = insert_automation.begin(); i != insert_automation.end(); ++i) {
for (vector<InsertAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
@@ -1396,6 +1556,9 @@ RouteTimeAxisView::show_all_automation ()
no_redraw = false;
+
+ /* Redraw */
+
_route->gui_changed ("track_height", (void *) 0); /* EMIT_SIGNAL */
}
@@ -1403,6 +1566,22 @@ void
RouteTimeAxisView::show_existing_automation ()
{
no_redraw = true;
+
+ /* Show our automation */
+
+ map<ARDOUR::ParamID, RouteAutomationNode*>::iterator i;
+ for (i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
+ // FIXME: only shown if /first/ line has points
+ if (!i->second->track->lines.empty() && i->second->track->lines[0]->npoints() > 0) {
+ i->second->track->set_marked_for_display (true);
+ i->second->track->canvas_display->show();
+ i->second->track->get_state_node()->add_property ("shown", X_("yes"));
+ i->second->menu_item->set_active(true);
+ }
+ }
+
+
+ /* Show insert automation */
for (list<InsertAutomationInfo*>::iterator i = insert_automation.begin(); i != insert_automation.end(); ++i) {
for (vector<InsertAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
@@ -1477,7 +1656,7 @@ RouteTimeAxisView::remove_ran (InsertAutomationNode* ran)
}
RouteTimeAxisView::InsertAutomationNode*
-RouteTimeAxisView::find_insert_automation_node (boost::shared_ptr<Insert> insert, uint32_t what)
+RouteTimeAxisView::find_insert_automation_node (boost::shared_ptr<Insert> insert, ParamID what)
{
for (list<InsertAutomationInfo*>::iterator i = insert_automation.begin(); i != insert_automation.end(); ++i) {
@@ -1514,7 +1693,7 @@ legalize_for_xml_node (string str)
void
-RouteTimeAxisView::add_insert_automation_curve (boost::shared_ptr<Insert> insert, uint32_t what)
+RouteTimeAxisView::add_insert_automation_curve (boost::shared_ptr<Insert> insert, ParamID what)
{
RedirectAutomationLine* ral;
string name;
@@ -1538,13 +1717,13 @@ RouteTimeAxisView::add_insert_automation_curve (boost::shared_ptr<Insert> insert
/* create a string that is a legal XML node name that can be used to refer to this redirect+port combination */
char state_name[256];
- snprintf (state_name, sizeof (state_name), "Redirect-%s-%" PRIu32, legalize_for_xml_node (insert->name()).c_str(), what);
+ snprintf (state_name, sizeof (state_name), "Redirect-%s-%" PRIu32, legalize_for_xml_node (insert->name()).c_str(), what.id());
ran->view = new RedirectAutomationTimeAxisView (_session, _route, editor, *this, parent_canvas, name, what, *insert, state_name);
ral = new RedirectAutomationLine (name,
*insert, what, _session, *ran->view,
- *ran->view->canvas_display, insert->automation_list (what));
+ *ran->view->canvas_display, *insert->automation_list (what, true));
ral->set_line_color (Config->canvasvar_RedirectAutomationLine.get());
ral->queue_reset ();
@@ -1583,12 +1762,12 @@ RouteTimeAxisView::insert_automation_track_hidden (RouteTimeAxisView::InsertAuto
void
RouteTimeAxisView::add_existing_insert_automation_curves (boost::shared_ptr<Insert> insert)
{
- set<uint32_t> s;
+ set<ParamID> s;
RedirectAutomationLine *ral;
insert->what_has_visible_automation (s);
- for (set<uint32_t>::iterator i = s.begin(); i != s.end(); ++i) {
+ for (set<ParamID>::iterator i = s.begin(); i != s.end(); ++i) {
if ((ral = find_insert_automation_curve (insert, *i)) != 0) {
ral->queue_reset ();
@@ -1599,14 +1778,47 @@ RouteTimeAxisView::add_existing_insert_automation_curves (boost::shared_ptr<Inse
}
void
+RouteTimeAxisView::add_automation_child(ParamID param, AutomationTimeAxisView* track)
+{
+ using namespace Menu_Helpers;
+
+ XMLProperty* prop;
+
+ add_child (track);
+
+ track->Hiding.connect (bind (mem_fun (*this, &RouteTimeAxisView::automation_track_hidden), param));
+
+ bool hideit = true;
+
+ XMLNode* node;
+
+ if ((node = track->get_state_node()) != 0) {
+ if ((prop = node->property ("shown")) != 0) {
+ if (prop->value() == "yes") {
+ hideit = false;
+ }
+ }
+ }
+
+ if (hideit) {
+ track->hide ();
+ } else {
+ _show_automation.insert(param);
+ }
+
+ _automation_tracks.insert(std::make_pair(param, new RouteAutomationNode(param, NULL, track)));
+}
+
+
+void
RouteTimeAxisView::add_insert_to_subplugin_menu (boost::shared_ptr<Insert> insert)
{
using namespace Menu_Helpers;
InsertAutomationInfo *rai;
list<InsertAutomationInfo*>::iterator x;
- const std::set<uint32_t>& automatable = insert->what_can_be_automated ();
- std::set<uint32_t> has_visible_automation;
+ const std::set<ParamID>& automatable = insert->what_can_be_automated ();
+ std::set<ParamID> has_visible_automation;
insert->what_has_visible_automation(has_visible_automation);
@@ -1641,7 +1853,7 @@ RouteTimeAxisView::add_insert_to_subplugin_menu (boost::shared_ptr<Insert> inser
items.clear ();
- for (std::set<uint32_t>::const_iterator i = automatable.begin(); i != automatable.end(); ++i) {
+ for (std::set<ParamID>::const_iterator i = automatable.begin(); i != automatable.end(); ++i) {
InsertAutomationNode* ran;
CheckMenuItem* mitem;
@@ -1755,7 +1967,7 @@ RouteTimeAxisView::inserts_changed ()
}
RedirectAutomationLine *
-RouteTimeAxisView::find_insert_automation_curve (boost::shared_ptr<Insert> insert, uint32_t what)
+RouteTimeAxisView::find_insert_automation_curve (boost::shared_ptr<Insert> insert, ParamID what)
{
InsertAutomationNode* ran;