#include <utility>
#include <gtkmm2ext/barcontroller.h>
+#include <gtkmm2ext/utils.h>
+#include <boost/algorithm/string.hpp>
+#include <boost/lexical_cast.hpp>
#include "pbd/memento_command.h"
#include "pbd/stacktrace.h"
, _view (show_regions ? new AutomationStreamView (*this) : 0)
, _name (nom)
, auto_button (X_("")) /* force addition of a label */
+ , _show_regions (show_regions)
{
if (!have_name_font) {
name_font = get_font_for_style (X_("AutomationTrackName"));
/* rearrange the name display */
+ controls_table.remove (name_hbox);
+ controls_table.attach (name_hbox, 1, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 3, 0);
+
/* we never show these for automation tracks, so make
life easier and remove them.
*/
hide_name_entry();
- /* keep the parameter name short */
-
- string shortpname = _name;
- int ignore_width;
- shortpname = fit_to_pixels (_name, 60, name_font, ignore_width, true);
-
- name_label.set_text (shortpname);
+ name_label.set_text (_name);
name_label.set_alignment (Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
name_label.set_name (X_("TrackParameterName"));
+ name_label.set_ellipsize (Pango::ELLIPSIZE_END);
string tipname = nomparent;
if (!tipname.empty()) {
/* add the buttons */
controls_table.attach (hide_button, 0, 1, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
-
- controls_table.attach (auto_button, 5, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
+ controls_table.attach (auto_button, 6, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
if (_controller) {
/* add bar controller */
AutomationTimeAxisView::~AutomationTimeAxisView ()
{
+ delete _view;
}
void
automation_menu->set_name ("ArdourContextMenu");
MenuList& items (automation_menu->items());
- items.push_back (MenuElem (_("Manual"), sigc::bind (sigc::mem_fun(*this,
+ items.push_back (MenuElem (S_("Automation|Manual"), sigc::bind (sigc::mem_fun(*this,
&AutomationTimeAxisView::set_automation_state), (AutoState) Off)));
items.push_back (MenuElem (_("Play"), sigc::bind (sigc::mem_fun(*this,
&AutomationTimeAxisView::set_automation_state), (AutoState) Play)));
switch (state & (Off|Play|Touch|Write)) {
case Off:
- auto_button.set_label (_("Manual"));
+ auto_button.set_label (S_("Automation|Manual"));
if (auto_off_item) {
ignore_state_request = true;
auto_off_item->set_active (true);
auto_state_menu->set_name ("ArdourContextMenu");
MenuList& as_items = auto_state_menu->items();
- as_items.push_back (CheckMenuElem (_("Manual"), sigc::bind (
+ as_items.push_back (CheckMenuElem (S_("Automation|Manual"), sigc::bind (
sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state),
(AutoState) Off)));
auto_off_item = dynamic_cast<CheckMenuItem*>(&as_items.back());
}
void
-AutomationTimeAxisView::add_automation_event (ArdourCanvas::Item* /*item*/, GdkEvent* /*event*/, framepos_t when, double y)
+AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t when, double y)
{
if (!_line) {
return;
boost::shared_ptr<AutomationList> list = _line->the_list ();
+ _editor.snap_to_with_modifier (when, event);
+
_session->begin_reversible_command (_("add automation event"));
XMLNode& before = list->get_state();
if (yn) {
_canvas_display->show (); /* FIXME: necessary? show_at? */
}
- set_gui_property ("visible", (yn ? "yes" : "no"));
+ set_gui_property ("visible", yn);
} else {
- set_gui_property ("visible", "no");
+ set_gui_property ("visible", false);
}
}
}
int
-AutomationTimeAxisView::set_state (const XMLNode& node, int /*version*/)
+AutomationTimeAxisView::set_state (const XMLNode&, int /*version*/)
{
return 0;
}
_route->id(),
_parameter.type(),
_parameter.id(),
- _parameter.channel());
+ (int) _parameter.channel());
}
}
+
+/** Given a state id string, see if it is one generated by
+ * this class. If so, parse it into its components.
+ * @param state_id State ID string to parse.
+ * @param route_id Filled in with the route's ID if the state ID string is parsed.
+ * @param has_parameter Filled in with true if the state ID has a parameter, otherwise false.
+ * @param parameter Filled in with the state ID's parameter, if it has one.
+ * @return true if this is a state ID generated by this class, otherwise false.
+ */
+
+bool
+AutomationTimeAxisView::parse_state_id (
+ string const & state_id,
+ PBD::ID & route_id,
+ bool & has_parameter,
+ Evoral::Parameter & parameter)
+{
+ stringstream s;
+ s << state_id;
+
+ string a, b, c;
+ s >> a >> b >> c;
+
+ if (a != X_("automation")) {
+ return false;
+ }
+
+ route_id = PBD::ID (b);
+
+ if (c.empty ()) {
+ has_parameter = false;
+ return true;
+ }
+
+ has_parameter = true;
+
+ vector<string> p;
+ boost::split (p, c, boost::is_any_of ("/"));
+
+ assert (p.size() == 3);
+
+ parameter = Evoral::Parameter (
+ boost::lexical_cast<int> (p[0]),
+ boost::lexical_cast<int> (p[2]),
+ boost::lexical_cast<int> (p[1])
+ );
+
+ return true;
+}