-
- if ((ev->state & (Keyboard::TertiaryModifier|Keyboard::PrimaryModifier)) == Keyboard::TertiaryModifier) {
- return TRUE;
- }
-
- if ((ev->state & (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) == (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) {
- scale = 0.01;
- } else if (ev->state & Keyboard::PrimaryModifier) {
- scale = 0.1;
- } else {
- scale = 1.0;
- }
-
- return mouse_control (ev->x, ev->window, scale);
-}
-
-gint
-BarController::mouse_control (double x, GdkWindow* window, double scaling)
-{
- double fract = 0.0;
- double delta;
-
- if (window != grab_window) {
- grab_x = x;
- grab_window = window;
- return TRUE;
- }
-
- delta = x - grab_x;
- grab_x = x;
-
- switch (_style) {
- case Line:
- case Blob:
- case LeftToRight:
- case CenterOut:
- fract = scaling * (delta / (darea.get_width() - 2));
- fract = min (1.0, fract);
- fract = max (-1.0, fract);
- adjustment.set_value (adjustment.get_value() + fract * (adjustment.get_upper() - adjustment.get_lower()));
- break;
- default:
- fract = 0.0;
- }
-
-
- return TRUE;
-}
-
-void
-BarController::create_patterns ()
-{
- Glib::RefPtr<Gdk::Window> win (darea.get_window());
- Cairo::RefPtr<Cairo::Context> context = win->create_cairo_context();
-
- 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 ();
-
- float rheight = darea.get_height()-2;
-
- cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, rheight);
- cairo_pattern_add_color_stop_rgba (pat, 0, r*0.8,g*0.8,b*0.8, 1.0);
- cairo_pattern_add_color_stop_rgba (pat, 1, r*0.6,g*0.6,b*0.6, 1.0);
- Cairo::RefPtr<Cairo::Pattern> p (new Cairo::Pattern (pat, false));
- pattern = p;
- cairo_pattern_destroy(pat);
-
- pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, rheight);
- cairo_pattern_add_color_stop_rgba (pat, 0, 1,1,1,0.0);
- cairo_pattern_add_color_stop_rgba (pat, 0.2, 1,1,1,0.3);
- cairo_pattern_add_color_stop_rgba (pat, 0.5, 1,1,1,0.0);
- cairo_pattern_add_color_stop_rgba (pat, 1, 1,1,1,0.0);
- Cairo::RefPtr<Cairo::Pattern> p2 (new Cairo::Pattern (pat, false));
- shine_pattern = p2;
- cairo_pattern_destroy(pat);
-
-}
-
-bool
-BarController::expose (GdkEventExpose* /*event*/)
-{
- Glib::RefPtr<Gdk::Window> win (darea.get_window());
- Cairo::RefPtr<Cairo::Context> context = win->create_cairo_context();
-
- if( !pattern )
- create_patterns();
-
- Gdk::Color c;
- Widget* parent;
- gint x1=0, x2=0, y2=0;
- gint w, h;
- double fract, radius;
- float r, g, b;
-
- fract = ((adjustment.get_value() - adjustment.get_lower()) /
- (adjustment.get_upper() - adjustment.get_lower()));
-
- switch (_style) {
- case Line:
- w = darea.get_width() - 1;
- h = darea.get_height();
- x1 = (gint) floor (w * fract);
- x2 = x1;
- y2 = h - 1;
-
- if (use_parent) {
- parent = get_parent();
-
- if (parent) {
- c = parent->get_style()->get_fg (parent->get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->rectangle (0, 0, darea.get_width(), darea.get_height());
- context->fill ();
- }
-
- } else {
-
- c = get_style()->get_bg (get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->rectangle (0, 0, darea.get_width() - ((darea.get_width()+1) % 2), darea.get_height());
- context->fill ();
- }
-
- c = get_style()->get_fg (get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->move_to (x1, 0);
- context->line_to (x1, h);
- context->stroke ();
- break;
-
- case Blob:
- w = darea.get_width() - 1;
- h = darea.get_height();
- x1 = (gint) floor (w * fract);
- x2 = min (w-2,h-2);
-
- if (use_parent) {
- parent = get_parent();
-
- if (parent) {
- c = parent->get_style()->get_fg (parent->get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->rectangle (0, 0, darea.get_width(), darea.get_height());
- context->fill ();
- }
-
- } else {
-
- c = get_style()->get_bg (get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->rectangle (0, 0, darea.get_width() - ((darea.get_width()+1) % 2), darea.get_height());
- context->fill ();
- }
-
- c = get_style()->get_fg (get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->arc (x1, ((h-2)/2)-1, x2, 0, 2*M_PI);
- break;
-
- case CenterOut:
- w = darea.get_width();
- h = darea.get_height()-2;
- if (use_parent) {
- parent = get_parent();
- if (parent) {
- c = parent->get_style()->get_fg (parent->get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->rectangle (0, 0, darea.get_width(), darea.get_height());
- context->fill ();
- }
- } else {
- c = get_style()->get_bg (get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->rectangle (0, 0, darea.get_width(), darea.get_height());
- context->fill ();
- }
- c = get_style()->get_fg (get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- x1 = (w/2) - ((w*fract)/2); // center, back up half the bar width
- context->set_source_rgb (r, g, b);
- context->rectangle (x1, 1, w*fract, h);
- context->fill ();
- break;
-
- case LeftToRight:
-
- w = darea.get_width() - 2;
- h = darea.get_height() - 2;
-
- x2 = (gint) floor (w * fract);
- y2 = h;
- radius = 4;
- if (x2 < 8) x2 = 8;
-
- /* border */
-
- context->set_source_rgb (0,0,0);
- cairo_rectangle (context->cobj(), 0, 0, darea.get_width(), darea.get_height());
- context->fill ();
-
- /* draw active box */
-
- context->set_source (pattern);
- rounded_rectangle (context, 1, 1, x2, y2, radius-1.5);
- context->fill ();
-
-// context->set_source (shine_pattern);
-// rounded_rectangle (context, 2, 3, x2-2, y2-8, radius-2);
-// context->fill ();
- break;
-
- case RightToLeft:
- break;
- case TopToBottom:
- break;
- case BottomToTop:
- break;
- }
-
- /* draw label */
-
- double xpos = -1;
- std::string const label = get_label (xpos);
-
- if (!label.empty()) {
-
- layout->set_text (label);
-
- int width, height, x;
- layout->get_pixel_size (width, height);
-
- if (xpos == -1) {
- x = max (3, 1 + (x2 - (width/2)));
- x = min (darea.get_width() - width - 3, (int) lrint (xpos));
- } else {
- x = lrint (darea.get_width() * xpos);
- }
-
- c = get_style()->get_text (get_state());
- r = c.get_red_p ();
- g = c.get_green_p ();
- b = c.get_blue_p ();
- context->set_source_rgb (r, g, b);
- context->move_to (x, (darea.get_height()/2) - (height/2));
- layout->show_in_cairo_context (context);
- }
-
- return true;