Make level meter colors user definable. Base, Mid, Top, and Clip colors are defined...
[ardour.git] / gtk2_ardour / route_time_axis.cc
index 237a39bba39b07fca41d520aaeb55d38dee372d0..ba3b3c19f09f273eab08983cc3cae9c28ca007da 100644 (file)
@@ -50,6 +50,7 @@
 #include <ardour/session.h>
 #include <ardour/session_playlist.h>
 #include <ardour/utils.h>
+#include <ardour/profile.h>
 
 #include "ardour_ui.h"
 #include "route_time_axis.h"
@@ -92,9 +93,12 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
          playlist_button (_("p")), 
          size_button (_("h")), // height
          automation_button (_("a")),
-         visual_button (_("v"))
+         visual_button (_("v")),
+         lm (rt, sess)
 
 {
+       lm.set_no_show_all();
+       lm.setup_meters(50);
        _has_state = true;
        playlist_menu = 0;
        playlist_action_menu = 0;
@@ -144,12 +148,18 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
 
                rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press), false);
                rec_enable_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::rec_enable_release));
-               controls_table.attach (*rec_enable_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+               controls_table.attach (*rec_enable_button, 4, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
                ARDOUR_UI::instance()->tooltips().set_tip(*rec_enable_button, _("Record"));
+
        }
 
-       controls_table.attach (*mute_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
-       controls_table.attach (*solo_button, 7, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::FILL|Gtk::EXPAND, 0, 0);
+       controls_hbox.pack_start(lm, false, false);
+       _route->meter_change.connect (mem_fun(*this, &RouteTimeAxisView::meter_changed));
+       _route->input_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
+       _route->output_changed.connect (mem_fun(*this, &RouteTimeAxisView::io_changed));
+
+       controls_table.attach (*mute_button, 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+       controls_table.attach (*solo_button, 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
 
        controls_table.attach (edit_group_button, 6, 7, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
 
@@ -251,7 +261,7 @@ RouteTimeAxisView::playlist_modified ()
 gint
 RouteTimeAxisView::edit_click (GdkEventButton *ev)
 {
-       if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+       if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
                _route->set_edit_group (0, this);
                return FALSE;
        } 
@@ -407,7 +417,9 @@ RouteTimeAxisView::build_display_menu ()
        items.push_back (SeparatorElem());
 
        build_remote_control_menu ();
-       items.push_back (MenuElem (_("Remote Control ID"), *remote_control_menu));
+       if (!Profile->get_sae()) {
+               items.push_back (MenuElem (_("Remote Control ID"), *remote_control_menu));
+       }
 
        build_automation_action_menu ();
        items.push_back (MenuElem (_("Automation"), *automation_action_menu));
@@ -437,10 +449,10 @@ RouteTimeAxisView::build_display_menu ()
                if (get_diskstream()->alignment_style() == CaptureTime)
                        align_capture_item->set_active();
                
-               items.push_back (MenuElem (_("Alignment"), *alignment_menu));
-
-               get_diskstream()->AlignmentStyleChanged.connect (
-                       mem_fun(*this, &RouteTimeAxisView::align_style_changed));
+               if (!Profile->get_sae()) {
+                       items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+                       get_diskstream()->AlignmentStyleChanged.connect (mem_fun(*this, &RouteTimeAxisView::align_style_changed));
+               }
 
                RadioMenuItem::Group mode_group;
                items.push_back (RadioMenuElem (mode_group, _("Normal mode"),
@@ -503,7 +515,7 @@ RouteTimeAxisView::set_track_mode (TrackMode mode)
 }
 
 void
-RouteTimeAxisView::_set_track_mode (Track* track, TrackMode mode, RadioMenuItem* reset_item)
+RouteTimeAxisView::_set_track_mode (boost::shared_ptr<Track> track, TrackMode mode, RadioMenuItem* reset_item)
 {
        bool needs_bounce;
 
@@ -644,8 +656,9 @@ RouteTimeAxisView::show_selection (TimeSelection& ts)
 void
 RouteTimeAxisView::set_height (TrackHeight h)
 {
+       int gmlen = (height_to_pixels (h)) - 5;
        bool height_changed = (height == 0) || (h != height_style);
-
+       lm.setup_meters (gmlen);
        TimeAxisView::set_height (h);
 
        ensure_xml_node ();
@@ -685,6 +698,7 @@ RouteTimeAxisView::set_height (TrackHeight h)
        case Large:
        case Larger:
        case Normal:
+               reset_meter();
                show_name_entry ();
                hide_name_label ();
 
@@ -705,6 +719,7 @@ RouteTimeAxisView::set_height (TrackHeight h)
                break;
 
        case Smaller:
+               reset_meter();
                show_name_entry ();
                hide_name_label ();
 
@@ -725,6 +740,7 @@ RouteTimeAxisView::set_height (TrackHeight h)
                break;
 
        case Small:
+               hide_meter ();
                hide_name_entry ();
                show_name_label ();
 
@@ -986,7 +1002,7 @@ RouteTimeAxisView::update_diskstream_display ()
 void
 RouteTimeAxisView::selection_click (GdkEventButton* ev)
 {
-       if (Keyboard::modifier_state_equals (ev->state, (Keyboard::Shift|Keyboard::Control))) {
+       if (Keyboard::modifier_state_equals (ev->state, (Keyboard::TertiaryModifier|Keyboard::PrimaryModifier))) {
 
                /* special case: select/deselect all tracks */
                if (editor.get_selection().selected (this)) {
@@ -1164,6 +1180,19 @@ RouteTimeAxisView::find_next_region (nframes_t pos, RegionPoint point, int32_t d
        return boost::shared_ptr<Region> ();
 }
 
+nframes64_t 
+RouteTimeAxisView::find_next_region_boundary (nframes64_t pos, int32_t dir)
+{
+       boost::shared_ptr<Diskstream> stream;
+       boost::shared_ptr<Playlist> playlist;
+
+       if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) {
+               return playlist->find_next_region_boundary (pos, dir);
+       }
+
+       return -1;
+}
+
 bool
 RouteTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
 {
@@ -1304,10 +1333,10 @@ RouteTimeAxisView::build_playlist_menu (Gtk::Menu * menu)
        playlist_items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteTimeAxisView::rename_current_playlist)));
        playlist_items.push_back (SeparatorElem());
 
-       playlist_items.push_back (MenuElem (_("New"), mem_fun(editor, &PublicEditor::new_playlists)));
-       playlist_items.push_back (MenuElem (_("New Copy"), mem_fun(editor, &PublicEditor::copy_playlists)));
+       playlist_items.push_back (MenuElem (_("New"), bind(mem_fun(editor, &PublicEditor::new_playlists), this)));
+       playlist_items.push_back (MenuElem (_("New Copy"), bind(mem_fun(editor, &PublicEditor::copy_playlists), this)));
        playlist_items.push_back (SeparatorElem());
-       playlist_items.push_back (MenuElem (_("Clear Current"), mem_fun(editor, &PublicEditor::clear_playlists)));
+       playlist_items.push_back (MenuElem (_("Clear Current"), bind(mem_fun(editor, &PublicEditor::clear_playlists), this)));
        playlist_items.push_back (SeparatorElem());
 
        playlist_items.push_back (MenuElem(_("Select from all ..."), mem_fun(*this, &RouteTimeAxisView::show_playlist_selector)));
@@ -1368,6 +1397,8 @@ RouteTimeAxisView::color_handler ()
        if (timestretch_rect) {
                timestretch_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchFill.get();
        }
+
+       reset_meter();
 }
 
 void
@@ -1490,7 +1521,7 @@ static string
 legalize_for_xml_node (string str)
 {
        string::size_type pos;
-       string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=:";
+       string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_=:";
        string legal;
 
        legal = str;
@@ -1774,4 +1805,51 @@ RouteTimeAxisView::update_rec_display ()
        RouteUI::update_rec_display ();
        name_entry.set_sensitive (!_route->record_enabled());
 }
-               
+
+void
+RouteTimeAxisView::fast_update ()
+{
+       lm.update_meters ();
+}
+
+void
+RouteTimeAxisView::hide_meter ()
+{
+       clear_meter ();
+       lm.hide_meters ();
+}
+
+void
+RouteTimeAxisView::show_meter ()
+{
+       reset_meter ();
+}
+
+void
+RouteTimeAxisView::reset_meter ()
+{
+       if (Config->get_show_track_meters()) {
+               lm.setup_meters (height-5);
+       } else {
+               hide_meter ();
+       }
+}
+
+void
+RouteTimeAxisView::clear_meter ()
+{
+       lm.clear_meters ();
+}
+
+void
+RouteTimeAxisView::meter_changed (void *src)
+{
+       ENSURE_GUI_THREAD (bind (mem_fun(*this, &RouteTimeAxisView::meter_changed), src));
+       reset_meter();
+}
+
+void
+RouteTimeAxisView::io_changed (IOChange change, void *src)
+{
+       reset_meter ();
+}