/*! Override the BSlider functionality to be able to grab the knob when it's over 0 dB for some pixels. */ void VolumeControl::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage) { if (!IsTracking()) { BSlider::MouseMoved(where, transit, dragMessage); return; } float cursorPosition = Orientation() == B_HORIZONTAL ? where.x : where.y; if (fSnapping && cursorPosition >= fMinSnap && cursorPosition <= fMaxSnap) { // Don't move the slider, keep the current value for a few // more pixels return; } fSnapping = false; int32 oldValue = Value(); int32 newValue = ValueForPoint(where); if (oldValue == newValue) { BSlider::MouseMoved(where, transit, dragMessage); return; } // Check if there is a 0 dB transition at all if ((oldValue < 0 && newValue >= 0) || (oldValue > 0 && newValue <= 0)) { SetValue(0); if (ModificationMessage() != NULL) Messenger().SendMessage(ModificationMessage()); float snapPoint = _PointForValue(0); const float kMinSnapOffset = 6; if (oldValue > newValue) { // movement from right to left fMinSnap = _PointForValue(-4); if (fabs(snapPoint - fMinSnap) < kMinSnapOffset) fMinSnap = snapPoint - kMinSnapOffset; fMaxSnap = _PointForValue(1); } else { // movement from left to right fMinSnap = _PointForValue(-1); fMaxSnap = _PointForValue(4); if (fabs(snapPoint - fMaxSnap) < kMinSnapOffset) fMaxSnap = snapPoint + kMinSnapOffset; } fSnapping = true; return; } BSlider::MouseMoved(where, transit, dragMessage); }
void BSlider::MouseDown(BPoint point) { if (!IsEnabled()) return; if (BarFrame().Contains(point) || ThumbFrame().Contains(point)) fInitialLocation = _Location(); uint32 buttons; GetMouse(&point, &buttons, true); _ConstrainPoint(point, fInitialLocation); SetValue(ValueForPoint(point)); if (_Location() != fInitialLocation) InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED); if (Window()->Flags() & B_ASYNCHRONOUS_CONTROLS) { SetTracking(true); SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS | B_NO_POINTER_HISTORY); } else { // synchronous mouse tracking BPoint prevPoint; while (buttons) { prevPoint = point; snooze(SnoozeAmount()); GetMouse(&point, &buttons, true); if (_ConstrainPoint(point, prevPoint)) { int32 value = ValueForPoint(point); if (value != Value()) { SetValue(value); InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED); } } } if (_Location() != fInitialLocation) Invoke(); } }
void BSlider::MouseMoved(BPoint point, uint32 transit, const BMessage *message) { if (IsTracking()) { if (_ConstrainPoint(point, _Location())) { int32 value = ValueForPoint(point); if (value != Value()) { SetValue(value); InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED); } } } else BControl::MouseMoved(point, transit, message); }