Use signal_toggled instead of signal_clicked in ThemeManager so a theme is only ...
[ardour.git] / gtk2_ardour / gain_meter.cc
index 5f4afe538a2e8767dae1f4a717a63e88699e5fde..f67682019ed082627a88f8e3a95c26d4d170b943 100644 (file)
 #include <ardour/session_route.h>
 #include <ardour/dB.h>
 
+#include <gtkmm/style.h>
+#include <gdkmm/color.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/fastmeter.h>
 #include <gtkmm2ext/stop_signal.h>
 #include <gtkmm2ext/barcontroller.h>
+#include <gtkmm2ext/gtk_ui.h>
 #include <midi++/manager.h>
 #include <pbd/fastlog.h>
 
@@ -84,6 +87,7 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
        ignore_toggle = false;
        meter_menu = 0;
        next_release_selects = false;
+       style_changed = true;
 
        gain_slider = manage (new VSliderController (slider,
                                                     &gain_adjustment,
@@ -101,6 +105,7 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
        gain_display.signal_focus_in_event().connect (mem_fun (*this, &GainMeter::gain_focused), false);
        gain_display.signal_focus_out_event().connect (mem_fun (*this, &GainMeter::gain_focused), false);
 
+       gain_display_box.set_name ("MeterMetricsStrip");
        gain_display_box.set_homogeneous (true);
        gain_display_box.set_spacing (2);
        gain_display_box.pack_start (gain_display, true, true);
@@ -206,6 +211,8 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
        
        ResetAllPeakDisplays.connect (mem_fun(*this, &GainMeter::reset_peak_display));
        ResetGroupPeakDisplays.connect (mem_fun(*this, &GainMeter::reset_group_peak_display));
+
+       UI::instance()->theme_changed.connect (mem_fun(*this, &GainMeter::on_theme_changed));
 }
 
 void
@@ -227,6 +234,7 @@ GainMeter::set_width (Width w)
 Glib::RefPtr<Gdk::Pixmap>
 GainMeter::render_metrics (Gtk::Widget& w)
 {
+       //cerr << "GainMeter::render_metrics() called, red = " << w.get_style()->get_bg(Gtk::STATE_NORMAL).get_red() << endl;//DEBUG
        Glib::RefPtr<Gdk::Window> win (w.get_window());
        Glib::RefPtr<Gdk::GC> fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
        Glib::RefPtr<Gdk::GC> bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
@@ -268,9 +276,20 @@ GainMeter::render_metrics (Gtk::Widget& w)
 gint
 GainMeter::meter_metrics_expose (GdkEventExpose *ev)
 {
+       /* Only draw dB scale if we're metering audio */
+       if (_io->n_inputs().n_audio() + _io->n_outputs().n_audio() == 0)
+               return true;
+
+       static Glib::RefPtr<Gtk::Style> meter_style;
+       
+       if (style_changed) {
+               meter_style = meter_metric_area.get_style();
+       }
+               
        Glib::RefPtr<Gdk::Window> win (meter_metric_area.get_window());
-       Glib::RefPtr<Gdk::GC> fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
-       Glib::RefPtr<Gdk::GC> bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
+       Glib::RefPtr<Gdk::GC> fg_gc (meter_style->get_fg_gc (Gtk::STATE_NORMAL));
+       Glib::RefPtr<Gdk::GC> bg_gc (meter_style->get_bg_gc (Gtk::STATE_NORMAL));
+
        GdkRectangle base_rect;
        GdkRectangle draw_rect;
        gint width, height;
@@ -285,7 +304,7 @@ GainMeter::meter_metrics_expose (GdkEventExpose *ev)
        Glib::RefPtr<Gdk::Pixmap> pixmap;
        std::map<string,Glib::RefPtr<Gdk::Pixmap> >::iterator i = metric_pixmaps.find (meter_metric_area.get_name());
 
-       if (i == metric_pixmaps.end()) {
+       if (i == metric_pixmaps.end() || style_changed) {
                pixmap = render_metrics (meter_metric_area);
        } else {
                pixmap = i->second;
@@ -293,11 +312,18 @@ GainMeter::meter_metrics_expose (GdkEventExpose *ev)
 
        gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect);
        win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
-       win->draw_drawable (bg_gc, pixmap, draw_rect.x, draw_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
+       win->draw_drawable (fg_gc, pixmap, draw_rect.x, draw_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
        
+       style_changed = false;
        return true;
 }
 
+void
+GainMeter::on_theme_changed()
+{
+       style_changed = true;
+}
+
 GainMeter::~GainMeter ()
 {
        if (meter_menu) {
@@ -389,7 +415,7 @@ GainMeter::hide_all_meters ()
 void
 GainMeter::setup_meters ()
 {
-       uint32_t nmeters = _io->n_outputs().n_audio();
+       uint32_t nmeters = _io->n_outputs().n_total();
        guint16 width;
 
        hide_all_meters ();
@@ -399,18 +425,20 @@ GainMeter::setup_meters ()
        if ((r = dynamic_cast<Route*> (_io.get())) != 0) {
 
                switch (r->meter_point()) {
-               case MeterPreFader:
                case MeterInput:
-                       nmeters = r->n_inputs().n_audio();
+                       nmeters = r->n_inputs().n_total();
+                       break;
+               case MeterPreFader:
+                       nmeters = r->pre_fader_streams().n_total();
                        break;
                case MeterPostFader:
-                       nmeters = r->n_outputs().n_audio();
+                       nmeters = r->n_outputs().n_total();
                        break;
                }
 
        } else {
 
-               nmeters = _io->n_outputs().n_audio();
+               nmeters = _io->n_outputs().n_total();
 
        }
 
@@ -431,7 +459,7 @@ GainMeter::setup_meters ()
        /* pack them backwards */
 
        if (_width == Wide) {
-               meter_packer.pack_end (meter_metric_area, false, false);
+               meter_packer.pack_end (meter_metric_area, false, false);
                meter_metric_area.show_all ();
        }