diff options
author | Ben Loftis <ben@glw.com> | 2012-12-07 22:38:49 +0000 |
---|---|---|
committer | Ben Loftis <ben@glw.com> | 2012-12-07 22:38:49 +0000 |
commit | 5249f826035c35ae3ea75cbbd2457a0d8a510a79 (patch) | |
tree | 979a94b3123d2cfb0bef3e7f704dc29ec56f3e2a /libs/gtkmm2ext/pixfader.cc | |
parent | 526a1a71fe8bf0b448a51c1cae47d7c516764882 (diff) |
more theming and layout tweaks. new faders that pre-light. fixed some spacing around mixer buttons. tweaked some colors (returned mutes to yellow). removed group button at bottom of mixer strip and replaced it with fader automation mode.
git-svn-id: svn://localhost/ardour2/branches/3.0@13617 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/gtkmm2ext/pixfader.cc')
-rw-r--r-- | libs/gtkmm2ext/pixfader.cc | 175 |
1 files changed, 122 insertions, 53 deletions
diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc index 02597f331e..11420159c4 100644 --- a/libs/gtkmm2ext/pixfader.cc +++ b/libs/gtkmm2ext/pixfader.cc @@ -23,11 +23,15 @@ #include "gtkmm2ext/pixfader.h" #include "gtkmm2ext/keyboard.h" #include "gtkmm2ext/rgb_macros.h" +#include "gtkmm2ext/utils.h" using namespace Gtkmm2ext; using namespace Gtk; using namespace std; +#define CORNER_RADIUS 4 +#define FADER_RESERVE (2*CORNER_RADIUS) + PixFader::PixFader ( Glib::RefPtr<Gdk::Pixbuf> belt, Glib::RefPtr<Gdk::Pixbuf> belt_desensitised, @@ -41,6 +45,10 @@ PixFader::PixFader ( pixbuf[NORMAL] = belt; pixbuf[DESENSITISED] = belt_desensitised; + pattern = 0; + shine_pattern = 0; + + _hovering = false; dragging = false; default_value = adjustment.get_value(); last_drawn = -1; @@ -49,9 +57,9 @@ PixFader::PixFader ( view.y = 0; if (orientation == VERT) { - view.width = girth = pixbuf[0]->get_width(); + view.width = girth = 24; } else { - view.height = girth = pixbuf[0]->get_height(); + view.height = girth = 24; } set_fader_length (fader_length); @@ -103,66 +111,93 @@ PixFader::set_border_colors (uint32_t left, uint32_t right) right_b = b/255.0; } +void +PixFader::create_patterns () +{ + Gdk::Color c = get_style()->get_fg (get_state()); + float r, g, b; + r = c.get_red_p (); + g = c.get_green_p (); + b = c.get_blue_p (); + + if (_orien == VERT) { + pattern = cairo_pattern_create_linear (0.0, 0.0, get_width(), 0); + cairo_pattern_add_color_stop_rgba (pattern, 0, r*0.8,g*0.8,b*0.8, 1.0); + cairo_pattern_add_color_stop_rgba (pattern, 1, r*0.6,g*0.6,b*0.6, 1.0); + + shine_pattern = cairo_pattern_create_linear (0.0, 0.0, 15, 0); + cairo_pattern_add_color_stop_rgba (shine_pattern, 0, 1,1,1,0.0); + cairo_pattern_add_color_stop_rgba (shine_pattern, 0.2, 1,1,1,0.3); + cairo_pattern_add_color_stop_rgba (shine_pattern, 0.5, 1,1,1,0.0); + cairo_pattern_add_color_stop_rgba (shine_pattern, 1, 1,1,1,0.0); + } else { + float rheight = get_height(); + + pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, rheight); + cairo_pattern_add_color_stop_rgba (pattern, 0, r*0.8,g*0.8,b*0.8, 1.0); + cairo_pattern_add_color_stop_rgba (pattern, 1, r*0.6,g*0.6,b*0.6, 1.0); + + shine_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, rheight); + cairo_pattern_add_color_stop_rgba (shine_pattern, 0, 1,1,1,0.0); + cairo_pattern_add_color_stop_rgba (shine_pattern, 0.2, 1,1,1,0.3); + cairo_pattern_add_color_stop_rgba (shine_pattern, 0.5, 1,1,1,0.0); + cairo_pattern_add_color_stop_rgba (shine_pattern, 1, 1,1,1,0.0); + } + +} + bool PixFader::on_expose_event (GdkEventExpose* ev) { - int const pi = get_sensitive() ? NORMAL : DESENSITISED; + Cairo::RefPtr<Cairo::Context> context = get_window()->create_cairo_context(); + cairo_t* cr = context->cobj(); + + if (!pattern) { + create_patterns(); + } + +// int const pi = get_sensitive() ? NORMAL : DESENSITISED; - Cairo::RefPtr<Cairo::Context> context = get_window()->create_cairo_context(); - int srcx, srcy; - int const ds = display_span (); - int offset_into_pixbuf = (int) floor (span / ((float) span / ds)); + int ds = display_span (); + + float w = get_width(); + float h = get_height(); + float radius = CORNER_RADIUS; + + /* black border */ + + cairo_set_source_rgb (cr, 0,0,0); + cairo_rectangle (cr, 0, 0, w, h); + cairo_fill (cr); + + /* draw active box */ - /* account for fader lengths that are shorter than the fader pixbuf */ if (_orien == VERT) { - offset_into_pixbuf += pixbuf[pi]->get_height() / 2 - view.height; + if (ds > h - FADER_RESERVE) + ds = h - FADER_RESERVE; + + cairo_set_source (cr, pattern); + Gtkmm2ext::rounded_rectangle (cr, 1, 1+ds, w-2, h-(1+ds)-1, radius-1.5); + cairo_fill (cr); + +// cairo_set_source (cr, shine_pattern); +// Gtkmm2ext::rounded_rectangle (cr, 2, ds, w-4, h-(1+ds)-1, radius-1.5); +// cairo_fill (cr); } else { - offset_into_pixbuf += pixbuf[pi]->get_width() / 2 - view.width; - } + if (ds < FADER_RESERVE) + ds = FADER_RESERVE; - context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height); - context->clip (); - - if (_orien == VERT) { - srcx = 0; - srcy = offset_into_pixbuf; - } else { - srcx = offset_into_pixbuf; - srcy = 0; - } - - /* fader */ - - context->save(); - context->set_source (belt_surface[pi], -srcx, -srcy); - context->rectangle (0, 0, get_width(), get_height()); - context->clip (); - context->paint(); - context->restore(); - - /* bounding box lines (2 colors for nicer visuals) */ - - /* top and left side */ - - context->set_line_width (1); - context->set_source_rgb (left_r, left_g, left_b); - context->move_to (view.width - 1, 0); /* upper right */ - context->line_to (0, 0); /* upper left */ - context->line_to (0, view.height - 1);/* lower left */ - context->stroke (); - - /* bottom & right side */ - - context->set_line_width (1); - context->set_source_rgb (right_r, right_g, right_b); - context->move_to (0, view.height - 0.5); /* lower left */ - context->line_to (view.width - 0.5, view.height - 0.5); /* lower right */ - context->line_to (view.width - 0.5, 0); /* upper right */ - context->stroke (); + cairo_set_source (cr, pattern); + Gtkmm2ext::rounded_rectangle (cr, 1, 1, ds-1, h-2, radius-1.5); + cairo_fill (cr); +// cairo_set_source (cr, shine_pattern); +// Gtkmm2ext::rounded_rectangle (cr, 2, 3, ds-1, 15, radius-1.5); +// cairo_fill (cr); + } + /* always draw the unity-position line */ - if (_orien == VERT) { context->set_line_width (1); context->set_source_rgb (0.0, 1.0, 0.0); @@ -173,10 +208,18 @@ PixFader::on_expose_event (GdkEventExpose* ev) context->set_line_width (1); context->set_source_rgb (0.0, 1.0, 0.0); context->move_to (unity_loc, 1); - context->line_to (unity_loc, girth - 1); + context->line_to (unity_loc, girth); context->stroke (); } +// if (Config->get_widget_prelight()) { //pixfader does not have access to config + if (_hovering) { + Gtkmm2ext::rounded_rectangle (cr, 0, 0, get_width(), get_height(), 3); + cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.2); + cairo_fill (cr); + } +// } + last_drawn = ds; return true; @@ -189,6 +232,21 @@ PixFader::on_size_request (GtkRequisition* req) req->height = view.height; } +void +PixFader::on_size_allocate (Gtk::Allocation& alloc) +{ + DrawingArea::on_size_allocate(alloc); + if (_orien == VERT) { + view.height = span = alloc.get_height(); + } else { + view.width = span = alloc.get_width(); + } + + update_unity_position (); + + queue_draw (); +} + bool PixFader::on_button_press_event (GdkEventButton* ev) { @@ -370,7 +428,14 @@ int PixFader::display_span () { float fract = (adjustment.get_value () - adjustment.get_lower()) / ((adjustment.get_upper() - adjustment.get_lower())); - return (_orien != VERT) ? (int)floor (span * (1.0 - fract)) : (int)floor (span * fract); + int ds; + if (_orien == VERT) { + ds = (int)floor ( span * (1.0 - fract)); + } else { + ds = (int)floor (span * fract); + } + + return ds; } void @@ -402,14 +467,18 @@ PixFader::update_unity_position () bool PixFader::on_enter_notify_event (GdkEventCrossing*) { + _hovering = true; Keyboard::magic_widget_grab_focus (); + queue_draw (); return false; } bool PixFader::on_leave_notify_event (GdkEventCrossing*) { + _hovering = false; Keyboard::magic_widget_drop_focus(); + queue_draw (); return false; } |