Changes to let updates happen less frequently:
* _ContrainPoint() was broken as it could never change the point it was supposed to contrain. * MouseDown() no longer sends a notification message automatically (only if it changed something) * MouseMoved() and synchronous MouseDown() will now only send modification messages if something actually changed (not for every mouse update). * After key presses, the invokation message is only sent when the value changed. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19697 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -148,7 +148,7 @@ class BSlider : public BControl {
|
|||||||
|
|
||||||
float _MinPosition() const;
|
float _MinPosition() const;
|
||||||
float _MaxPosition() const;
|
float _MaxPosition() const;
|
||||||
bool _ConstrainPoint(BPoint point, BPoint compare) const;
|
bool _ConstrainPoint(BPoint& point, BPoint compare) const;
|
||||||
|
|
||||||
virtual void _ReservedSlider5();
|
virtual void _ReservedSlider5();
|
||||||
virtual void _ReservedSlider6();
|
virtual void _ReservedSlider6();
|
||||||
|
|||||||
@@ -407,14 +407,20 @@ BSlider::KeyDown(const char *bytes, int32 numBytes)
|
|||||||
switch (bytes[0]) {
|
switch (bytes[0]) {
|
||||||
case B_LEFT_ARROW:
|
case B_LEFT_ARROW:
|
||||||
case B_DOWN_ARROW: {
|
case B_DOWN_ARROW: {
|
||||||
|
int32 oldValue = Value();
|
||||||
|
|
||||||
SetValue(Value() - KeyIncrementValue());
|
SetValue(Value() - KeyIncrementValue());
|
||||||
Invoke();
|
if (oldValue != Value())
|
||||||
|
Invoke();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case B_RIGHT_ARROW:
|
case B_RIGHT_ARROW:
|
||||||
case B_UP_ARROW: {
|
case B_UP_ARROW: {
|
||||||
|
int32 oldValue = Value();
|
||||||
|
|
||||||
SetValue(Value() + KeyIncrementValue());
|
SetValue(Value() + KeyIncrementValue());
|
||||||
Invoke();
|
if (oldValue != Value())
|
||||||
|
Invoke();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -423,8 +429,13 @@ BSlider::KeyDown(const char *bytes, int32 numBytes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Makes sure the \a point is within valid bounds.
|
||||||
|
Returns \c true if the relevant coordinate (depending on the orientation
|
||||||
|
of the slider) differs from \a comparePoint.
|
||||||
|
*/
|
||||||
bool
|
bool
|
||||||
BSlider::_ConstrainPoint(BPoint point, BPoint comparePoint) const
|
BSlider::_ConstrainPoint(BPoint& point, BPoint comparePoint) const
|
||||||
{
|
{
|
||||||
if (fOrientation == B_HORIZONTAL) {
|
if (fOrientation == B_HORIZONTAL) {
|
||||||
if (point.x != comparePoint.x) {
|
if (point.x != comparePoint.x) {
|
||||||
@@ -465,7 +476,8 @@ BSlider::MouseDown(BPoint point)
|
|||||||
_ConstrainPoint(point, fInitialLocation);
|
_ConstrainPoint(point, fInitialLocation);
|
||||||
SetValue(ValueForPoint(point));
|
SetValue(ValueForPoint(point));
|
||||||
|
|
||||||
InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
|
if (_Location() != fInitialLocation)
|
||||||
|
InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
|
||||||
|
|
||||||
if (Window()->Flags() & B_ASYNCHRONOUS_CONTROLS) {
|
if (Window()->Flags() & B_ASYNCHRONOUS_CONTROLS) {
|
||||||
SetTracking(true);
|
SetTracking(true);
|
||||||
@@ -481,8 +493,11 @@ BSlider::MouseDown(BPoint point)
|
|||||||
GetMouse(&point, &buttons, true);
|
GetMouse(&point, &buttons, true);
|
||||||
|
|
||||||
if (_ConstrainPoint(point, prevPoint)) {
|
if (_ConstrainPoint(point, prevPoint)) {
|
||||||
SetValue(ValueForPoint(point));
|
int32 value = ValueForPoint(point);
|
||||||
InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
|
if (value != Value()) {
|
||||||
|
SetValue(value);
|
||||||
|
InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_Location() != fInitialLocation)
|
if (_Location() != fInitialLocation)
|
||||||
@@ -509,8 +524,11 @@ BSlider::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
|
|||||||
{
|
{
|
||||||
if (IsTracking()) {
|
if (IsTracking()) {
|
||||||
if (_ConstrainPoint(point, _Location())) {
|
if (_ConstrainPoint(point, _Location())) {
|
||||||
SetValue(ValueForPoint(point));
|
int32 value = ValueForPoint(point);
|
||||||
InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
|
if (value != Value()) {
|
||||||
|
SetValue(value);
|
||||||
|
InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
BControl::MouseMoved(point, transit, message);
|
BControl::MouseMoved(point, transit, message);
|
||||||
|
|||||||
Reference in New Issue
Block a user