factor out shuttle controller to its own class, new design
[ardour.git] / gtk2_ardour / led.cc
index e1a98da2281dee336fca3a3264eeb16e0c3aedb4..76d71bc35e7316446b172526c234744680e4f85a 100644 (file)
@@ -52,21 +52,28 @@ LED::render (cairo_t* cr)
 
         //background
 
-        RefPtr<Style> style = get_style();
+        Widget* parent;
+        RefPtr<Style> style;
         Color c;
-        
-        switch (_visual_state) {
-        case 0:
-                c = style->get_bg (STATE_NORMAL);
-                break;
-        default:
-                c = style->get_bg (STATE_ACTIVE);
-                break;
+
+        parent = get_parent ();
+
+        while (parent && !parent->get_has_window()) {
+                parent = parent->get_parent();
         }
 
+        if (parent && parent->get_has_window()) {
+                style = parent->get_style ();
+                c = style->get_bg (parent->get_state());
+        } else {
+                style = get_style ();
+                c = style->get_bg (get_state());
+        }
+
+
         cairo_rectangle(cr, 0, 0, _width, _height);
         cairo_stroke_preserve(cr);
-        cairo_set_source_rgb(cr, c.get_green_p(), c.get_red_p(), c.get_blue_p());
+        cairo_set_source_rgb(cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
         cairo_fill(cr);
 
        cairo_translate(cr, _width/2, _height/2);
@@ -115,24 +122,7 @@ LED::set_visual_state (int32_t s)
         if (s != _visual_state) {
 
                 _visual_state = s;
-
-                RefPtr<Style> style = get_style();
-                Color c;
-                
-                switch (_visual_state) {
-                case 0:
-                        c = style->get_fg (STATE_NORMAL);
-                        break;
-                default:
-                        c = style->get_fg (STATE_ACTIVE);
-                        break;
-                }
-
-                _red = c.get_red_p ();
-                _green = c.get_green_p ();
-                _blue = c.get_blue_p ();
-                
-                set_dirty ();
+                set_colors_from_style ();
         }
 }
 
@@ -148,6 +138,13 @@ LED::set_diameter (float d)
         set_dirty ();
 }
 
+void
+LED::on_realize ()
+{
+        set_colors_from_style ();
+        CairoWidget::on_realize ();
+}
+
 void
 LED::on_size_request (Gtk::Requisition* req)
 {
@@ -158,3 +155,25 @@ LED::on_size_request (Gtk::Requisition* req)
                 CairoWidget::on_size_request (req);
         }
 }
+
+void
+LED::set_colors_from_style ()
+{
+        RefPtr<Style> style = get_style();
+        Color c;
+        
+        switch (_visual_state) {
+        case 0:
+                c = style->get_fg (STATE_NORMAL);
+                break;
+        default:
+                c = style->get_fg (STATE_ACTIVE);
+                break;
+        }
+        
+        _red = c.get_red_p ();
+        _green = c.get_green_p ();
+        _blue = c.get_blue_p ();
+        
+        set_dirty ();
+}