Merge branch 'master' into windows
[ardour.git] / gtk2_ardour / ardour_ui_dialogs.cc
index 96d5de60def27c2597e2b6b2f742bf9613f91d51..bca762569fa269cef640157399b0c23f57916404 100644 (file)
 #include "ardour/audioengine.h"
 #include "ardour/automation_watch.h"
 
+#ifdef interface
+#undef interface
+#endif
+
 #include "actions.h"
 #include "add_route_dialog.h"
 #include "add_video_dialog.h"
@@ -53,6 +57,8 @@
 #include "theme_manager.h"
 #include "time_info_box.h"
 
+#include <gtkmm2ext/keyboard.h>
+
 #include "i18n.h"
 
 using namespace ARDOUR;
@@ -192,6 +198,7 @@ ARDOUR_UI::set_session (Session *s)
                meter_box.remove(*editor_meter);
                delete editor_meter;
                editor_meter = 0;
+               editor_meter_peak_display.hide();
        }
 
        if (_session && _session->master_out()) {
@@ -200,11 +207,29 @@ ARDOUR_UI::set_session (Session *s)
                editor_meter->clear_meters();
                editor_meter->set_type (_session->master_out()->meter_type());
                editor_meter->setup_meters (30, 12, 6);
+               editor_meter->show();
                meter_box.pack_start(*editor_meter);
 
                ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
                ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
                ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
+
+               editor_meter_peak_display.set_name ("meterbridge peakindicator");
+               editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+               editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
+               editor_meter_peak_display.set_size_request(6, -1);
+               editor_meter_peak_display.set_corner_radius(2);
+
+               editor_meter_max_peak = -INFINITY;
+               editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
+
+               if (Config->get_show_editor_meter()) {
+                       meter_box.show();
+                       editor_meter_peak_display.show();
+               } else {
+                       meter_box.hide();
+                       editor_meter_peak_display.hide();
+               }
        }
 
 }
@@ -250,6 +275,7 @@ ARDOUR_UI::unload_session (bool hide_stuff)
                meter_box.remove(*editor_meter);
                delete editor_meter;
                editor_meter = 0;
+               editor_meter_peak_display.hide();
        }
 
        ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
@@ -524,3 +550,18 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window
 
        return false;
 }
+
+bool
+ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
+{
+       if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
+               ArdourMeter::ResetAllPeakDisplays ();
+       } else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
+               if (_session->master_out()) {
+                       ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
+               }
+       } else if (_session->master_out()) {
+               ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
+       }
+       return true;
+}