36 #define CORNER_RADIUS 2.5
38 #define CORNER_OFFSET 1
39 #define FADER_RESERVE 6
49 , _span (fader_length)
50 , _girth (fader_girth)
51 , _min_span (fader_length)
52 , _min_girth (fader_girth)
53 , _orien (orientation)
57 , _centered_text (true)
64 Gdk::BUTTON_PRESS_MASK
65 | Gdk::BUTTON_RELEASE_MASK
66 | Gdk::POINTER_MOTION_MASK
68 | Gdk::ENTER_NOTIFY_MASK
69 | Gdk::LEAVE_NOTIFY_MASK
90 double abr,
double abg,
double abb,
94 if ((*f)->matches (afr, afg, afb, abr, abg, abb, w, h)) {
104 Gdk::Color c = get_style()->get_fg (get_state());
109 fg = c.get_green_p ();
110 fb = c.get_blue_p ();
112 c = get_style()->get_bg (get_state());
115 bg = c.get_green_p ();
116 bb = c.get_blue_p ();
118 cairo_surface_t* surface;
121 if (get_width() <= 1 || get_height() <= 1) {
132 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, get_width(), get_height() * 2.0);
133 tc = cairo_create (surface);
137 cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, get_width(), 0);
138 cairo_pattern_add_color_stop_rgba (shade_pattern, 0, br*0.4,bg*0.4,bb*0.4, 1.0);
139 cairo_pattern_add_color_stop_rgba (shade_pattern, 0.25, br*0.6,bg*0.6,bb*0.6, 1.0);
140 cairo_pattern_add_color_stop_rgba (shade_pattern, 1, br*0.8,bg*0.8,bb*0.8, 1.0);
141 cairo_set_source (tc, shade_pattern);
142 cairo_rectangle (tc, 0, 0, get_width(), get_height() * 2.0);
145 cairo_pattern_destroy (shade_pattern);
149 shade_pattern = cairo_pattern_create_linear (0.0, 0.0, get_width() - 2 -
CORNER_OFFSET , 0);
150 cairo_pattern_add_color_stop_rgba (shade_pattern, 0, fr*0.8,fg*0.8,fb*0.8, 1.0);
151 cairo_pattern_add_color_stop_rgba (shade_pattern, 1, fr*0.6,fg*0.6,fb*0.6, 1.0);
152 cairo_set_source (tc, shade_pattern);
157 cairo_pattern_destroy (shade_pattern);
159 _pattern = cairo_pattern_create_for_surface (surface);
163 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, get_width() * 2.0, get_height());
164 tc = cairo_create (surface);
168 cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height());
169 cairo_pattern_add_color_stop_rgba (shade_pattern, 0, br*0.4,bg*0.4,bb*0.4, 1.0);
170 cairo_pattern_add_color_stop_rgba (shade_pattern, 0.25, br*0.6,bg*0.6,bb*0.6, 1.0);
171 cairo_pattern_add_color_stop_rgba (shade_pattern, 1, br*0.8,bg*0.8,bb*0.8, 1.0);
172 cairo_set_source (tc, shade_pattern);
173 cairo_rectangle (tc, 0, 0, get_width() * 2.0, get_height());
178 shade_pattern = cairo_pattern_create_linear (0.0, 0.0, 0.0, get_height());
179 cairo_pattern_add_color_stop_rgba (shade_pattern, 0, fr*0.8,fg*0.8,fb*0.8, 1.0);
180 cairo_pattern_add_color_stop_rgba (shade_pattern, 1, fr*0.6,fg*0.6,fb*0.6, 1.0);
181 cairo_set_source (tc, shade_pattern);
185 cairo_pattern_destroy (shade_pattern);
187 _pattern = cairo_pattern_create_for_surface (surface);
195 cairo_surface_destroy (surface);
214 cairo_rectangle (cr, area->x, area->y, area->width, area->height);
221 const float w = get_width();
222 const float h = get_height();
225 cairo_rectangle (cr, 0, 0, w, h);
228 cairo_set_line_width (cr, 2);
229 cairo_set_source_rgba (cr, 0, 0, 0, 1.0);
231 cairo_matrix_t matrix;
235 cairo_stroke_preserve(cr);
245 cairo_matrix_init_translate (&matrix, 0, (h - ds));
246 cairo_pattern_set_matrix (
_pattern, &matrix);
275 cairo_matrix_init_translate (&matrix, w - ds, 0);
276 cairo_pattern_set_matrix (
_pattern, &matrix);
289 cairo_set_line_width(cr, 1);
290 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
291 Gdk::Color c = get_style()->get_fg (Gtk::STATE_ACTIVE);
292 cairo_set_source_rgba (cr, c.get_red_p() * 1.5, c.get_green_p() * 1.5, c.get_blue_p() * 1.5, 0.85);
313 }
else if (ds > .5 * w) {
315 cairo_set_operator(cr, CAIRO_OPERATOR_XOR);
320 pango_cairo_show_layout (cr,
_layout->gobj());
324 if (!get_sensitive()) {
326 cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.4);
330 cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1);
353 _girth = alloc.get_width ();
354 _span = alloc.get_height ();
356 _girth = alloc.get_height ();
357 _span = alloc.get_width ();
371 if (ev->type != GDK_BUTTON_PRESS) {
375 gdk_pointer_ungrab (GDK_CURRENT_TIME);
381 if (ev->button != 1 && ev->button != 2) {
391 gdk_pointer_grab(ev->window,
false,
392 GdkEventMask( Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK |Gdk::BUTTON_RELEASE_MASK),
395 if (ev->button == 2) {
405 double ev_pos = (
_orien ==
VERT) ? ev->y : ev->x;
407 switch (ev->button) {
412 gdk_pointer_ungrab (GDK_CURRENT_TIME);
424 ev_pos = rint(ev_pos);
430 #if 0 // ignore clicks
431 }
else if (ev_pos == slider_pos) {
451 gdk_pointer_ungrab (GDK_CURRENT_TIME);
479 switch (ev->direction) {
484 case GDK_SCROLL_DOWN:
492 int dir = ev->direction;
495 if (ev->direction == GDK_SCROLL_UP) dir = GDK_SCROLL_RIGHT;
496 if (ev->direction == GDK_SCROLL_DOWN) dir = GDK_SCROLL_LEFT;
500 case GDK_SCROLL_RIGHT:
504 case GDK_SCROLL_LEFT:
520 double const ev_pos = (
_orien ==
VERT) ? ev->y : ev->x;
540 const double span =
_span - off;
541 double fract = (delta / span);
543 fract = min (1.0, fract);
544 fract = max (-1.0, fract);
548 if (_orien ==
VERT) {
572 const double span =
_span - off;
573 ds = (int)rint (span * (1.0 - fract));
576 const double span =
_span - off;
577 ds = (int)rint (span * fract + off);
625 const double span =
_span - off;
626 double fract = (_orien ==
VERT) ? (1.0 - ((ev->y - off) / span)) : ((ev->x - off) / span);
628 fract = min (1.0, fract);
629 fract = max (0.0, fract);
644 bool need_redraw =
false;
660 if (!
_layout && !str.empty()) {
661 _layout = Pango::Layout::create (get_pango_context());
670 if (expose) queue_draw ();
677 Widget::on_state_changed (old_state);
686 std::string txt =
_layout->get_text();
700 Widget* parent = get_parent ();
703 if (parent->get_has_window()) {
706 parent = parent->get_parent();
709 if (parent && parent->get_has_window()) {
715 return parent->get_style ()->get_bg (parent->get_state());
718 return get_style ()->get_bg (get_state());
static void magic_widget_grab_focus()
bool on_enter_notify_event(GdkEventCrossing *ev)
void on_size_allocate(Gtk::Allocation &alloc)
Gdk::Color get_parent_bg()
static uint32_t GainFineScaleModifier
bool on_scroll_event(GdkEventScroll *ev)
Gtk::Adjustment & _adjustment
sigc::signal< void > StartGesture
bool on_leave_notify_event(GdkEventCrossing *ev)
Glib::RefPtr< Pango::Layout > _layout
static uint32_t ScrollHorizontalModifier
void adjustment_changed()
LIBGTKMM2EXT_API void rounded_top_half_rectangle(Cairo::RefPtr< Cairo::Context >, double x, double y, double w, double h, double r=10)
bool on_button_release_event(GdkEventButton *)
static uint32_t TertiaryModifier
void on_size_request(GtkRequisition *)
void on_style_changed(const Glib::RefPtr< Gtk::Style > &)
static std::list< FaderImage * > _patterns
void set_default_value(float)
sigc::connection _parent_style_change
PixFader(Gtk::Adjustment &adjustment, int orientation, int span, int girth)
void update_unity_position()
void set_text(const std::string &, bool centered=true, bool expose=true)
LIBGTKMM2EXT_API void rounded_right_half_rectangle(Cairo::RefPtr< Cairo::Context >, double x, double y, double w, double h, double r=10)
void set_adjustment_from_event(GdkEventButton *)
bool on_motion_notify_event(GdkEventMotion *)
static cairo_pattern_t * find_pattern(double afr, double afg, double afb, double abr, double abg, double abb, int w, int h)
void render(cairo_t *, cairo_rectangle_t *)
bool on_button_press_event(GdkEventButton *)
LIBGTKMM2EXT_API void rounded_rectangle(Cairo::RefPtr< Cairo::Context > context, double x, double y, double w, double h, double r=10)
void on_state_changed(Gtk::StateType)
cairo_pattern_t * _pattern
sigc::signal< void > OnExpose
sigc::signal< void > StopGesture
static void magic_widget_drop_focus()
static uint32_t GainExtraFineScaleModifier