* Calculate correct invalidation rect in SetBarThickness()

* Improved ThumbFrame() for B_TRIANGLE_THUMB, too high horizontal slider
  had the thumb along the bottom and not on the bar.
* Improved triangel thumb drawing, the vertical drawing did look so good
  yet, I also put the triangle on the right side, it looked weird on the
  left and it reverted the hashmark meaning too.
* Small code cleanups.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26458 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2008-07-16 23:49:28 +00:00
parent 50baef55f2
commit 3cd9fb7518

View File

@ -1242,31 +1242,30 @@ BSlider::ThumbFrame() const
if (fStyle == B_BLOCK_THUMB) { if (fStyle == B_BLOCK_THUMB) {
if (Orientation() == B_HORIZONTAL) { if (Orientation() == B_HORIZONTAL) {
frame.left = (float)floor(Position() * (_MaxPosition() - _MinPosition()) + frame.left = floorf(Position() * (_MaxPosition()
_MinPosition()) - 8.0; - _MinPosition()) + _MinPosition()) - 8;
frame.top = 2.0 + (Label() ? textHeight + 4.0 : 0.0); frame.top = 2 + (Label() ? textHeight + 4 : 0);
frame.right = frame.left + 17.0; frame.right = frame.left + 17;
frame.bottom = frame.top + fBarThickness + 7.0; frame.bottom = frame.top + fBarThickness + 7;
} else { } else {
frame.left = floor((frame.Width() - fBarThickness) / 2.0) - 4; frame.left = floor((frame.Width() - fBarThickness) / 2) - 4;
frame.top = (float)floor(Position() * (_MaxPosition() - _MinPosition()) + frame.top = floorf(Position() * (_MaxPosition()
_MinPosition()) - 8.0; - _MinPosition()) + _MinPosition()) - 8;
frame.right = frame.left + fBarThickness + 7.0; frame.right = frame.left + fBarThickness + 7;
frame.bottom = frame.top + 17.0; frame.bottom = frame.top + 17;
} }
} else { } else {
if (Orientation() == B_HORIZONTAL) { if (Orientation() == B_HORIZONTAL) {
frame.left = (float)floor(Position() * (_MaxPosition() - _MinPosition()) + frame.left = floorf(Position() * (_MaxPosition()
_MinPosition()) - 6; - _MinPosition()) + _MinPosition()) - 6;
frame.right = frame.left + 12.0f; frame.right = frame.left + 12;
frame.bottom = frame.bottom - 2.0f - frame.top = 3 + fBarThickness + (Label() ? textHeight + 4 : 0);
(MinLimitLabel() || MaxLimitLabel() ? textHeight + 4.0f : 0.0f); frame.bottom = frame.top + 8;
frame.top = frame.bottom - 8.0f;
} else { } else {
frame.left = floor((frame.Width() - fBarThickness) / 2.0f) - 3; frame.left = floorf((frame.Width() + fBarThickness) / 2) - 3;
frame.top = (float)floor(Position() * (_MaxPosition() - _MinPosition())) + frame.top = floorf(Position() * (_MaxPosition()
_MinPosition() - 6.0f; - _MinPosition())) + _MinPosition() - 6;
frame.right = frame.left + 7; frame.right = frame.left + 8;
frame.bottom = frame.top + 12; frame.bottom = frame.top + 12;
} }
} }
@ -1310,35 +1309,32 @@ BSlider::ResizeToPreferred()
status_t status_t
BSlider::Invoke(BMessage *msg) BSlider::Invoke(BMessage* message)
{ {
return BControl::Invoke(msg); return BControl::Invoke(message);
} }
BHandler* BHandler*
BSlider::ResolveSpecifier(BMessage *message, int32 index, BSlider::ResolveSpecifier(BMessage* message, int32 index, BMessage* specifier,
BMessage *specifier, int32 command, int32 command, const char *property)
const char *property)
{ {
return BControl::ResolveSpecifier(message, index, specifier, return BControl::ResolveSpecifier(message, index, specifier, command,
command, property); property);
} }
status_t status_t
BSlider::GetSupportedSuites(BMessage *message) BSlider::GetSupportedSuites(BMessage* message)
{ {
return BControl::GetSupportedSuites(message); return BControl::GetSupportedSuites(message);
} }
void void
BSlider::SetModificationMessage(BMessage *message) BSlider::SetModificationMessage(BMessage* message)
{ {
if (fModificationMessage) delete fModificationMessage;
delete fModificationMessage;
fModificationMessage = message; fModificationMessage = message;
} }
@ -1370,9 +1366,9 @@ BSlider::SnoozeAmount() const
void void
BSlider::SetKeyIncrementValue(int32 increment_value) BSlider::SetKeyIncrementValue(int32 incrementValue)
{ {
fKeyIncrementValue = increment_value; fKeyIncrementValue = incrementValue;
} }
@ -1384,9 +1380,9 @@ BSlider::KeyIncrementValue() const
void void
BSlider::SetHashMarkCount(int32 hash_mark_count) BSlider::SetHashMarkCount(int32 hashMarkCount)
{ {
fHashMarkCount = hash_mark_count; fHashMarkCount = hashMarkCount;
Invalidate(); Invalidate();
} }
@ -1431,10 +1427,10 @@ BSlider::Style() const
void void
BSlider::SetBarColor(rgb_color bar_color) BSlider::SetBarColor(rgb_color barColor)
{ {
fBarColor = bar_color; fBarColor = barColor;
Invalidate(); Invalidate(BarFrame());
} }
@ -1446,22 +1442,22 @@ BSlider::BarColor() const
void void
BSlider::UseFillColor(bool use_fill, const rgb_color *bar_color) BSlider::UseFillColor(bool useFill, const rgb_color* barColor)
{ {
fUseFillColor = use_fill; fUseFillColor = useFill;
if (use_fill && bar_color) if (useFill && barColor)
fFillColor = *bar_color; fFillColor = *barColor;
Invalidate(); Invalidate(BarFrame());
} }
bool bool
BSlider::FillColor(rgb_color *bar_color) const BSlider::FillColor(rgb_color* barColor) const
{ {
if (bar_color && fUseFillColor) if (barColor && fUseFillColor)
*bar_color = fFillColor; *barColor = fFillColor;
return fUseFillColor; return fUseFillColor;
} }
@ -1507,7 +1503,20 @@ BSlider::SetBarThickness(float thickness)
if (thickness < 1.0) if (thickness < 1.0)
thickness = 1.0; thickness = 1.0;
if (thickness != fBarThickness) { if (thickness != fBarThickness) {
// calculate invalid barframe and extend by hashmark size
float hInset = 0.0;
float vInset = 0.0;
if (fOrientation == B_HORIZONTAL)
vInset = -6.0;
else
hInset = -6.0;
BRect invalid = BarFrame().InsetByCopy(hInset, vInset) | ThumbFrame();
fBarThickness = thickness; fBarThickness = thickness;
invalid = invalid | BarFrame().InsetByCopy(hInset, vInset)
| ThumbFrame();
Invalidate(invalid);
InvalidateLayout(); InvalidateLayout();
} }
} }
@ -1760,62 +1769,78 @@ BSlider::_DrawTriangleThumb()
} else { } else {
lightenmax = tint_color(no_tint, B_LIGHTEN_2_TINT); lightenmax = tint_color(no_tint, B_LIGHTEN_2_TINT);
lighten1 = tint_color(no_tint, B_LIGHTEN_1_TINT); lighten1 = tint_color(no_tint, B_LIGHTEN_1_TINT);
darken2 = tint_color(no_tint, (B_NO_TINT + B_DARKEN_1_TINT) / 2.0); darken2 = tint_color(no_tint, (B_NO_TINT + B_DARKEN_1_TINT) / 2);
darken3 = tint_color(no_tint, B_DARKEN_1_TINT); darken3 = tint_color(no_tint, B_DARKEN_1_TINT);
darkenmax = tint_color(no_tint, B_DARKEN_3_TINT); darkenmax = tint_color(no_tint, B_DARKEN_3_TINT);
} }
view->SetDrawingMode(B_OP_OVER);
if (Orientation() == B_HORIZONTAL) { if (Orientation() == B_HORIZONTAL) {
view->SetHighColor(lighten1); view->SetHighColor(lighten1);
view->FillTriangle(BPoint(frame.left + 1.0, frame.bottom - 2.0), view->FillTriangle(
BPoint(frame.left + 6.0, frame.top + 1.0), BPoint(frame.left + 1, frame.bottom - 3),
BPoint(frame.right - 1.0, frame.bottom - 2.0)); BPoint((frame.left + frame.right) / 2, frame.top + 1),
BPoint(frame.right - 1, frame.bottom - 3));
view->SetHighColor(no_tint); view->SetHighColor(no_tint);
view->StrokeLine(BPoint(frame.right - 2.0, frame.bottom - 2.0), view->StrokeLine(BPoint(frame.right - 2, frame.bottom - 3),
BPoint(frame.left + 3.0, frame.bottom - 2.0)); BPoint(frame.left + 3, frame.bottom - 3));
view->SetHighColor(darkenmax); view->SetHighColor(darkenmax);
view->StrokeLine(BPoint(frame.left, frame.bottom), view->StrokeLine(BPoint(frame.left, frame.bottom - 1),
BPoint(frame.right, frame.bottom)); BPoint(frame.right, frame.bottom - 1));
view->StrokeLine(BPoint(frame.right, frame.bottom - 1.0), view->StrokeLine(BPoint(frame.right, frame.bottom - 2),
BPoint(frame.left + 6.0, frame.top + 1.0)); BPoint((frame.left + frame.right) / 2, frame.top));
view->SetHighColor(darken2); view->SetHighColor(darken2);
view->StrokeLine(BPoint(frame.right - 1.0, frame.bottom - 1.0), view->StrokeLine(BPoint(frame.right - 1, frame.bottom - 2),
BPoint(frame.left + 1.0, frame.bottom - 1.0)); BPoint(frame.left + 1, frame.bottom - 2));
view->SetHighColor(darken3); view->SetHighColor(darken3);
view->StrokeLine(BPoint(frame.left, frame.bottom - 1.0), view->StrokeLine(BPoint(frame.left, frame.bottom - 2),
BPoint(frame.left + 5.0, frame.top + 2.0)); BPoint((frame.left + frame.right) / 2 - 1, frame.top + 1));
view->SetHighColor(lightenmax); view->SetHighColor(lightenmax);
view->StrokeLine(BPoint(frame.left + 2.0, frame.bottom - 2.0), view->StrokeLine(BPoint(frame.left + 2, frame.bottom - 3),
BPoint(frame.left + 6.0, frame.top + 2.0)); BPoint((frame.left + frame.right) / 2, frame.top + 1));
// Shadow
view->SetHighColor(0, 0, 0, IsEnabled() ? 80 : 40);
view->SetDrawingMode(B_OP_ALPHA);
view->StrokeLine(BPoint(frame.left + 1, frame.bottom),
BPoint(frame.right, frame.bottom));
} else { } else {
view->SetHighColor(lighten1); view->SetHighColor(lighten1);
view->FillTriangle(BPoint(frame.left + 1.0f, frame.top), view->FillTriangle(
BPoint(frame.left + 7.0f, frame.top + 6.0f), BPoint(frame.left, (frame.top + frame.bottom) / 2),
BPoint(frame.left + 1.0f, frame.bottom)); BPoint(frame.right - 1, frame.top + 1),
BPoint(frame.right - 1, frame.bottom - 1));
view->SetHighColor(darkenmax); view->SetHighColor(darkenmax);
view->StrokeLine(BPoint(frame.left, frame.top + 1), view->StrokeLine(BPoint(frame.right - 1, frame.top),
BPoint(frame.left, frame.bottom)); BPoint(frame.right - 1, frame.bottom));
view->StrokeLine(BPoint(frame.left + 1.0f, frame.bottom), view->StrokeLine(BPoint(frame.right - 1, frame.bottom),
BPoint(frame.left + 7.0f, frame.top + 6.0f)); BPoint(frame.right - 2, frame.bottom));
view->SetHighColor(darken2); view->SetHighColor(darken2);
view->StrokeLine(BPoint(frame.left, frame.top), view->StrokeLine(BPoint(frame.right - 2, frame.top + 2),
BPoint(frame.left, frame.bottom - 1)); BPoint(frame.right - 2, frame.bottom - 1));
view->StrokeLine(BPoint(frame.left + 1.0f, frame.top), view->StrokeLine(
BPoint(frame.left + 6.0f, frame.top + 5.0f)); BPoint(frame.left, (frame.top + frame.bottom) / 2),
BPoint(frame.right - 2, frame.top));
view->SetHighColor(darken3);
view->StrokeLine(
BPoint(frame.left + 1, (frame.top + frame.bottom) / 2 + 1),
BPoint(frame.right - 3, frame.bottom - 1));
view->SetHighColor(no_tint); view->SetHighColor(lightenmax);
view->StrokeLine(BPoint(frame.left + 1.0f, frame.top + 2.0f), view->StrokeLine(
BPoint(frame.left + 1.0f, frame.bottom - 1.0f)); BPoint(frame.left + 1, (frame.top + frame.bottom) / 2),
view->StrokeLine(BPoint(frame.left + 2.0f, frame.bottom - 2.0f), BPoint(frame.right - 2, frame.top + 1));
BPoint(frame.left + 6.0f, frame.top + 6.0f));
// Shadow
view->SetHighColor(0, 0, 0, IsEnabled() ? 80 : 40);
view->SetDrawingMode(B_OP_ALPHA);
view->StrokeLine(BPoint(frame.right, frame.top + 1),
BPoint(frame.right, frame.bottom));
} }
view->SetDrawingMode(B_OP_COPY); view->SetDrawingMode(B_OP_COPY);