From 3cd9fb75187b2cdec981a75f058a1548ed8ea903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Wed, 16 Jul 2008 23:49:28 +0000 Subject: [PATCH] * 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 --- src/kits/interface/Slider.cpp | 187 +++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 81 deletions(-) diff --git a/src/kits/interface/Slider.cpp b/src/kits/interface/Slider.cpp index acc8cb990c..9683950eb3 100644 --- a/src/kits/interface/Slider.cpp +++ b/src/kits/interface/Slider.cpp @@ -1242,31 +1242,30 @@ BSlider::ThumbFrame() const if (fStyle == B_BLOCK_THUMB) { if (Orientation() == B_HORIZONTAL) { - frame.left = (float)floor(Position() * (_MaxPosition() - _MinPosition()) + - _MinPosition()) - 8.0; - frame.top = 2.0 + (Label() ? textHeight + 4.0 : 0.0); - frame.right = frame.left + 17.0; - frame.bottom = frame.top + fBarThickness + 7.0; + frame.left = floorf(Position() * (_MaxPosition() + - _MinPosition()) + _MinPosition()) - 8; + frame.top = 2 + (Label() ? textHeight + 4 : 0); + frame.right = frame.left + 17; + frame.bottom = frame.top + fBarThickness + 7; } else { - frame.left = floor((frame.Width() - fBarThickness) / 2.0) - 4; - frame.top = (float)floor(Position() * (_MaxPosition() - _MinPosition()) + - _MinPosition()) - 8.0; - frame.right = frame.left + fBarThickness + 7.0; - frame.bottom = frame.top + 17.0; + frame.left = floor((frame.Width() - fBarThickness) / 2) - 4; + frame.top = floorf(Position() * (_MaxPosition() + - _MinPosition()) + _MinPosition()) - 8; + frame.right = frame.left + fBarThickness + 7; + frame.bottom = frame.top + 17; } } else { if (Orientation() == B_HORIZONTAL) { - frame.left = (float)floor(Position() * (_MaxPosition() - _MinPosition()) + - _MinPosition()) - 6; - frame.right = frame.left + 12.0f; - frame.bottom = frame.bottom - 2.0f - - (MinLimitLabel() || MaxLimitLabel() ? textHeight + 4.0f : 0.0f); - frame.top = frame.bottom - 8.0f; + frame.left = floorf(Position() * (_MaxPosition() + - _MinPosition()) + _MinPosition()) - 6; + frame.right = frame.left + 12; + frame.top = 3 + fBarThickness + (Label() ? textHeight + 4 : 0); + frame.bottom = frame.top + 8; } else { - frame.left = floor((frame.Width() - fBarThickness) / 2.0f) - 3; - frame.top = (float)floor(Position() * (_MaxPosition() - _MinPosition())) + - _MinPosition() - 6.0f; - frame.right = frame.left + 7; + frame.left = floorf((frame.Width() + fBarThickness) / 2) - 3; + frame.top = floorf(Position() * (_MaxPosition() + - _MinPosition())) + _MinPosition() - 6; + frame.right = frame.left + 8; frame.bottom = frame.top + 12; } } @@ -1310,35 +1309,32 @@ BSlider::ResizeToPreferred() status_t -BSlider::Invoke(BMessage *msg) +BSlider::Invoke(BMessage* message) { - return BControl::Invoke(msg); + return BControl::Invoke(message); } BHandler* -BSlider::ResolveSpecifier(BMessage *message, int32 index, - BMessage *specifier, int32 command, - const char *property) +BSlider::ResolveSpecifier(BMessage* message, int32 index, BMessage* specifier, + int32 command, const char *property) { - return BControl::ResolveSpecifier(message, index, specifier, - command, property); + return BControl::ResolveSpecifier(message, index, specifier, command, + property); } status_t -BSlider::GetSupportedSuites(BMessage *message) +BSlider::GetSupportedSuites(BMessage* message) { return BControl::GetSupportedSuites(message); } void -BSlider::SetModificationMessage(BMessage *message) +BSlider::SetModificationMessage(BMessage* message) { - if (fModificationMessage) - delete fModificationMessage; - + delete fModificationMessage; fModificationMessage = message; } @@ -1370,9 +1366,9 @@ BSlider::SnoozeAmount() const void -BSlider::SetKeyIncrementValue(int32 increment_value) +BSlider::SetKeyIncrementValue(int32 incrementValue) { - fKeyIncrementValue = increment_value; + fKeyIncrementValue = incrementValue; } @@ -1384,9 +1380,9 @@ BSlider::KeyIncrementValue() const void -BSlider::SetHashMarkCount(int32 hash_mark_count) +BSlider::SetHashMarkCount(int32 hashMarkCount) { - fHashMarkCount = hash_mark_count; + fHashMarkCount = hashMarkCount; Invalidate(); } @@ -1431,10 +1427,10 @@ BSlider::Style() const void -BSlider::SetBarColor(rgb_color bar_color) +BSlider::SetBarColor(rgb_color barColor) { - fBarColor = bar_color; - Invalidate(); + fBarColor = barColor; + Invalidate(BarFrame()); } @@ -1446,22 +1442,22 @@ BSlider::BarColor() const 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) - fFillColor = *bar_color; + if (useFill && barColor) + fFillColor = *barColor; - Invalidate(); + Invalidate(BarFrame()); } bool -BSlider::FillColor(rgb_color *bar_color) const +BSlider::FillColor(rgb_color* barColor) const { - if (bar_color && fUseFillColor) - *bar_color = fFillColor; + if (barColor && fUseFillColor) + *barColor = fFillColor; return fUseFillColor; } @@ -1507,7 +1503,20 @@ BSlider::SetBarThickness(float thickness) if (thickness < 1.0) thickness = 1.0; 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; + + invalid = invalid | BarFrame().InsetByCopy(hInset, vInset) + | ThumbFrame(); + Invalidate(invalid); InvalidateLayout(); } } @@ -1760,62 +1769,78 @@ BSlider::_DrawTriangleThumb() } else { lightenmax = tint_color(no_tint, B_LIGHTEN_2_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); darkenmax = tint_color(no_tint, B_DARKEN_3_TINT); } - view->SetDrawingMode(B_OP_OVER); - if (Orientation() == B_HORIZONTAL) { view->SetHighColor(lighten1); - view->FillTriangle(BPoint(frame.left + 1.0, frame.bottom - 2.0), - BPoint(frame.left + 6.0, frame.top + 1.0), - BPoint(frame.right - 1.0, frame.bottom - 2.0)); + view->FillTriangle( + BPoint(frame.left + 1, frame.bottom - 3), + BPoint((frame.left + frame.right) / 2, frame.top + 1), + BPoint(frame.right - 1, frame.bottom - 3)); view->SetHighColor(no_tint); - view->StrokeLine(BPoint(frame.right - 2.0, frame.bottom - 2.0), - BPoint(frame.left + 3.0, frame.bottom - 2.0)); + view->StrokeLine(BPoint(frame.right - 2, frame.bottom - 3), + BPoint(frame.left + 3, frame.bottom - 3)); view->SetHighColor(darkenmax); - view->StrokeLine(BPoint(frame.left, frame.bottom), - BPoint(frame.right, frame.bottom)); - view->StrokeLine(BPoint(frame.right, frame.bottom - 1.0), - BPoint(frame.left + 6.0, frame.top + 1.0)); + view->StrokeLine(BPoint(frame.left, frame.bottom - 1), + BPoint(frame.right, frame.bottom - 1)); + view->StrokeLine(BPoint(frame.right, frame.bottom - 2), + BPoint((frame.left + frame.right) / 2, frame.top)); view->SetHighColor(darken2); - view->StrokeLine(BPoint(frame.right - 1.0, frame.bottom - 1.0), - BPoint(frame.left + 1.0, frame.bottom - 1.0)); + view->StrokeLine(BPoint(frame.right - 1, frame.bottom - 2), + BPoint(frame.left + 1, frame.bottom - 2)); view->SetHighColor(darken3); - view->StrokeLine(BPoint(frame.left, frame.bottom - 1.0), - BPoint(frame.left + 5.0, frame.top + 2.0)); + view->StrokeLine(BPoint(frame.left, frame.bottom - 2), + BPoint((frame.left + frame.right) / 2 - 1, frame.top + 1)); view->SetHighColor(lightenmax); - view->StrokeLine(BPoint(frame.left + 2.0, frame.bottom - 2.0), - BPoint(frame.left + 6.0, frame.top + 2.0)); + view->StrokeLine(BPoint(frame.left + 2, frame.bottom - 3), + 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 { view->SetHighColor(lighten1); - view->FillTriangle(BPoint(frame.left + 1.0f, frame.top), - BPoint(frame.left + 7.0f, frame.top + 6.0f), - BPoint(frame.left + 1.0f, frame.bottom)); + view->FillTriangle( + BPoint(frame.left, (frame.top + frame.bottom) / 2), + BPoint(frame.right - 1, frame.top + 1), + BPoint(frame.right - 1, frame.bottom - 1)); view->SetHighColor(darkenmax); - view->StrokeLine(BPoint(frame.left, frame.top + 1), - BPoint(frame.left, frame.bottom)); - view->StrokeLine(BPoint(frame.left + 1.0f, frame.bottom), - BPoint(frame.left + 7.0f, frame.top + 6.0f)); + view->StrokeLine(BPoint(frame.right - 1, frame.top), + BPoint(frame.right - 1, frame.bottom)); + view->StrokeLine(BPoint(frame.right - 1, frame.bottom), + BPoint(frame.right - 2, frame.bottom)); view->SetHighColor(darken2); - view->StrokeLine(BPoint(frame.left, frame.top), - BPoint(frame.left, frame.bottom - 1)); - view->StrokeLine(BPoint(frame.left + 1.0f, frame.top), - BPoint(frame.left + 6.0f, frame.top + 5.0f)); + view->StrokeLine(BPoint(frame.right - 2, frame.top + 2), + BPoint(frame.right - 2, frame.bottom - 1)); + view->StrokeLine( + 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->StrokeLine(BPoint(frame.left + 1.0f, frame.top + 2.0f), - BPoint(frame.left + 1.0f, frame.bottom - 1.0f)); - view->StrokeLine(BPoint(frame.left + 2.0f, frame.bottom - 2.0f), - BPoint(frame.left + 6.0f, frame.top + 6.0f)); + view->SetHighColor(lightenmax); + view->StrokeLine( + BPoint(frame.left + 1, (frame.top + frame.bottom) / 2), + BPoint(frame.right - 2, frame.top + 1)); + + // 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);