, _orien (orientation)
, _pattern (0)
, _hovering (false)
- , _last_drawn (-1)
, _dragging (false)
, _centered_text (true)
, _current_parent (0)
_adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
_adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
-
+ signal_grab_broken_event ().connect (mem_fun (*this, &PixFader::on_grab_broken_event));
if (_orien == VERT) {
CairoWidget::set_size_request(_girth, _span);
} else {
if (_layout) _layout.clear (); // drop reference to existing layout
}
+void
+PixFader::flush_pattern_cache () {
+ for (list<FaderImage*>::iterator f = _patterns.begin(); f != _patterns.end(); ++f) {
+ cairo_pattern_destroy ((*f)->pattern);
+ }
+ _patterns.clear();
+}
+
+
cairo_pattern_t*
PixFader::find_pattern (double afr, double afg, double afb,
double abr, double abg, double abb,
Gtkmm2ext::rounded_rectangle (cr, CORNER_OFFSET, CORNER_OFFSET, w-CORNER_SIZE, h-CORNER_SIZE, CORNER_RADIUS);
cairo_set_source_rgba (cr, 0.505, 0.517, 0.525, 0.4);
cairo_fill (cr);
- } else if (_hovering) {
+ } else if (_hovering && CairoWidget::widget_prelight()) {
Gtkmm2ext::rounded_rectangle (cr, CORNER_OFFSET, CORNER_OFFSET, w-CORNER_SIZE, h-CORNER_SIZE, CORNER_RADIUS);
cairo_set_source_rgba (cr, 0.905, 0.917, 0.925, 0.1);
cairo_fill (cr);
}
-
- _last_drawn = ds;
}
void
void
PixFader::on_size_allocate (Gtk::Allocation& alloc)
{
+ int old_girth = _girth;
+ int old_span = _span;
+
CairoWidget::on_size_allocate(alloc);
if (_orien == VERT) {
_span = alloc.get_width ();
}
- if (is_realized()) {
+ if (is_realized() && ((old_girth != _girth) || (old_span != _span))) {
/* recreate patterns in case we've changed size */
create_patterns ();
}
update_unity_position ();
}
+bool
+PixFader::on_grab_broken_event (GdkEventGrabBroken* ev)
+{
+ if (_dragging) {
+ remove_modal_grab();
+ _dragging = false;
+ gdk_pointer_ungrab (GDK_CURRENT_TIME);
+ StopGesture ();
+ }
+ return (_tweaks & NoButtonForward) ? true : false;
+}
+
bool
PixFader::on_button_press_event (GdkEventButton* ev)
{
if (ev_pos == _grab_start) {
/* no motion - just a click */
- const double slider_pos = display_span();
ev_pos = rint(ev_pos);
if (ev->state & Keyboard::TertiaryModifier) {
double const delta = ev_pos - _grab_loc;
_grab_loc = ev_pos;
- double fract = (delta / _span);
+ const double off = FADER_RESERVE + ((_orien == VERT) ? CORNER_OFFSET : 0);
+ const double span = _span - off;
+ double fract = (delta / span);
fract = min (1.0, fract);
fract = max (-1.0, fract);
void
PixFader::adjustment_changed ()
{
- if (display_span() != _last_drawn) {
- queue_draw ();
- }
+ queue_draw ();
}
/** @return pixel offset of the current value from the right or bottom of the fader */
float fract = (_adjustment.get_value () - _adjustment.get_lower()) / ((_adjustment.get_upper() - _adjustment.get_lower()));
int ds;
if (_orien == VERT) {
- ds = (int)rint (_span * (1.0 - fract));
+ const double off = FADER_RESERVE + CORNER_OFFSET;
+ const double span = _span - off;
+ ds = (int)rint (span * (1.0 - fract));
} else {
- ds = (int)rint (_span * fract);
+ const double off = FADER_RESERVE;
+ const double span = _span - off;
+ ds = (int)rint (span * fract + off);
}
return ds;
PixFader::update_unity_position ()
{
if (_orien == VERT) {
- _unity_loc = (int) rint (_span * (1 - ((_default_value - _adjustment.get_lower()) / (_adjustment.get_upper() - _adjustment.get_lower())))) - 1;
+ const double span = _span - FADER_RESERVE - CORNER_OFFSET;
+ _unity_loc = (int) rint (span * (1 - ((_default_value - _adjustment.get_lower()) / (_adjustment.get_upper() - _adjustment.get_lower())))) - 1;
} else {
- _unity_loc = (int) rint ((_default_value - _adjustment.get_lower()) * _span / (_adjustment.get_upper() - _adjustment.get_lower()));
+ const double span = _span - FADER_RESERVE;
+ _unity_loc = (int) rint (FADER_RESERVE + (_default_value - _adjustment.get_lower()) * span / (_adjustment.get_upper() - _adjustment.get_lower()));
}
queue_draw ();
void
PixFader::set_adjustment_from_event (GdkEventButton* ev)
{
- double fract = (_orien == VERT) ? (1.0 - (ev->y / _span)) : (ev->x / _span);
+ const double off = FADER_RESERVE + ((_orien == VERT) ? CORNER_OFFSET : 0);
+ const double span = _span - off;
+ double fract = (_orien == VERT) ? (1.0 - ((ev->y - off) / span)) : ((ev->x - off) / span);
fract = min (1.0, fract);
fract = max (0.0, fract);
_text = "";
set_text (txt, _centered_text, false);
}
- /* patterns are cached and re-created as needed
+ /* patterns are cached and re-created as needed
* during 'expose' in the GUI thread */
_pattern = 0;
queue_draw ();