From 7b8f09dc6107d1fde651777559d8cab56710c951 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Sun, 3 May 2026 13:27:36 -0400 Subject: [PATCH] Tracker: Make selected pose text semi-transparent on drag. - cut items 75% opaque - dragged items 50% opaque - cut dragged items 25% opaque Fixes #19429. Change-Id: I0278d5aa57d06e11907dd17810feb539cd5b22ab Reviewed-on: https://review.haiku-os.org/c/haiku/+/10887 Haiku-Format: Haiku-format Bot Reviewed-by: John Scipione Tested-by: Commit checker robot --- src/kits/tracker/DraggableContainerIcon.cpp | 2 +- src/kits/tracker/Pose.cpp | 36 ++++++++----- src/kits/tracker/TextWidget.cpp | 56 ++++++++------------- 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/src/kits/tracker/DraggableContainerIcon.cpp b/src/kits/tracker/DraggableContainerIcon.cpp index be7178ffa0..a9fc57a921 100644 --- a/src/kits/tracker/DraggableContainerIcon.cpp +++ b/src/kits/tracker/DraggableContainerIcon.cpp @@ -144,7 +144,7 @@ DraggableContainerIcon::MouseMoved(BPoint where, uint32, const BMessage*) view->SetDrawingMode(B_OP_ALPHA); rgb_color textColor = ui_color(B_PANEL_TEXT_COLOR); - textColor.alpha = 192; // 75% opaque + textColor.alpha = 128; // 50% opaque view->SetHighColor(textColor); view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE); diff --git a/src/kits/tracker/Pose.cpp b/src/kits/tracker/Pose.cpp index 9a1748113a..41db7280cc 100644 --- a/src/kits/tracker/Pose.cpp +++ b/src/kits/tracker/Pose.cpp @@ -536,6 +536,9 @@ BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView, BView* dra fBackgroundClean = false; bool direct = drawView == poseView; + bool dragging = false; + if (!direct && poseView->Window() != NULL && poseView->Window()->CurrentMessage() != NULL) + dragging = poseView->Window()->CurrentMessage()->what == kMsgMouseDragged; bool windowActive = poseView->Window()->IsActive(); bool showSelectionWhenInactive = poseView->ShowSelectionWhenInactive(); bool drawIconUnselected = !windowActive && !showSelectionWhenInactive; @@ -543,11 +546,20 @@ BPose::Draw(BRect rect, const BRect& updateRect, BPoseView* poseView, BView* dra if (direct) poseView->PushState(); - // This is so that the cut icon will be drawn semi-transparent. - if (fClipboardMode == kMoveSelectionTo) { + // This is so that cut and dragged items will be drawn semi-transparent. + if (fClipboardMode == kMoveSelectionTo || dragging) { drawView->SetDrawingMode(B_OP_ALPHA); drawView->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE); - uint8 alpha = 128; // 50% opaque + uint8 alpha; + if (fClipboardMode == kMoveSelectionTo && dragging) + alpha = 64; // cut and dragging, 25% opaque + else if (dragging) + alpha = 128; // dragging, 50% opaque + else if (fClipboardMode == kMoveSelectionTo) + alpha = 192; // cut, 75% opaque + else + alpha = 255; + if (poseView->HighColor().IsDark()) drawView->SetHighColor(0, 0, 0, alpha); else @@ -639,36 +651,34 @@ BPose::DrawTextWidget(BRect rect, BRect textRect, BTextWidget* widget, widget->Draw(rect, textRect, poseView, drawView, selected, fClipboardMode, offset); if (selected) { + // the selection rect is alpha-blended on top BRect invertRect(textRect.OffsetByCopy(offset)); invertRect.left = ceilf(invertRect.left); invertRect.top = ceilf(invertRect.top); invertRect.right = floorf(invertRect.right); invertRect.bottom = floorf(invertRect.bottom); + if (windowActive || isDrawingSelectionRect) { // invert colors to select label using "reverse video" drawView->InvertRect(invertRect); - if (clipboardMode == kMoveSelectionTo) { - // blend selected cut item background with gray - drawView->SetDrawingMode(B_OP_BLEND); - drawView->SetHighColor(128, 128, 128, 128); - drawView->FillRect(invertRect); - drawView->SetDrawingMode(B_OP_OVER); - } } else if (!windowActive && showSelectionWhenInactive) { if (direct) drawView->PushState(); - // the selection rect is alpha-blended on top for inactive windows + // invert colors to select label using "reverse video" drawView->InvertRect(invertRect); + drawView->SetDrawingMode(B_OP_BLEND); - // blend cut item background with less contrast if (clipboardMode == kMoveSelectionTo) { + // blend inactive cut item background with less contrast if (drawView->LowColor().IsLight()) drawView->SetHighColor(192, 192, 192, 255); else drawView->SetHighColor(64, 64, 64, 255); - } else + } else { + // blend inactive background with gray drawView->SetHighColor(128, 128, 128, 255); + } drawView->FillRect(invertRect); drawView->SetDrawingMode(B_OP_OVER); diff --git a/src/kits/tracker/TextWidget.cpp b/src/kits/tracker/TextWidget.cpp index b609529c17..bb9ab5fc59 100644 --- a/src/kits/tracker/TextWidget.cpp +++ b/src/kits/tracker/TextWidget.cpp @@ -651,10 +651,19 @@ BTextWidget::Draw(BRect eraseRect, BRect textRect, BPoseView* view, BView* drawV // BPose::Draw before and after calling this function. bool direct = drawView == view; + bool dragging = false; + if (!direct && view->Window() != NULL && view->Window()->CurrentMessage() != NULL) + dragging = view->Window()->CurrentMessage()->what == kMsgMouseDragged; if (selected) { - // erase selection rect background - drawView->SetDrawingMode(B_OP_COPY); + if (dragging) { + drawView->SetDrawingMode(B_OP_ALPHA); + drawView->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE); + } else { + // erase selection rect background + drawView->SetDrawingMode(B_OP_COPY); + } + BRect invertRect(textRect); invertRect.left = ceilf(invertRect.left); invertRect.top = ceilf(invertRect.top); @@ -665,38 +674,32 @@ BTextWidget::Draw(BRect eraseRect, BRect textRect, BPoseView* view, BView* drawV // High color is set to inverted low, then the whole thing is // inverted again so that the background color "shines through". drawView->SetHighColor(InvertColorSmart(drawView->LowColor())); - } else if (clipboardMode == kMoveSelectionTo) { - drawView->SetDrawingMode(B_OP_ALPHA); - drawView->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE); - uint8 alpha = 128; // 50% opaque - if (drawView->LowColor().IsLight()) - drawView->SetHighColor(0, 0, 0, alpha); - else - drawView->SetHighColor(255, 255, 255, alpha); } else { - drawView->SetDrawingMode(B_OP_OVER); if (view->IsDesktopView()) drawView->SetHighColor(view->HighColor()); else drawView->SetHighUIColor(view->HighUIColor()); } + if (dragging || (direct && clipboardMode == kMoveSelectionTo)) { + drawView->SetDrawingMode(B_OP_ALPHA); + drawView->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_COMPOSITE); + } else { + drawView->SetDrawingMode(B_OP_OVER); + } + + // high color and drawing mode are set to draw text + float decenderHeight = roundf(view->FontInfo().descent); BPoint location(textRect.left, textRect.bottom - decenderHeight); const char* fittingText = fText->FittingText(view); - // Draw text outline unless selected or column resizing. - // The direct parameter is false when dragging or column resizing. - if (!selected && direct && view->WidgetTextOutline()) { + // Draw text outline if enabled unless selected or column resizing. + if (view->WidgetTextOutline() && !selected && (direct || dragging)) { // draw a halo around the text by using the "false bold" // feature for text rendering. Either black or white is used for // the glow (whatever acts as contrast) with a some alpha value, - if (direct && clipboardMode != kMoveSelectionTo) { - drawView->SetDrawingMode(B_OP_ALPHA); - drawView->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY); - } - BFont font; drawView->GetFont(&font); @@ -741,9 +744,6 @@ BTextWidget::Draw(BRect eraseRect, BRect textRect, BPoseView* view, BView* drawV drawView->DrawString(fittingText, location + BPoint(1, 1)); } - if (direct && clipboardMode != kMoveSelectionTo) - drawView->SetDrawingMode(B_OP_OVER); - drawView->SetHighColor(textColor); } @@ -753,23 +753,11 @@ BTextWidget::Draw(BRect eraseRect, BRect textRect, BPoseView* view, BView* drawV // TODO: // this should be exported to the WidgetAttribute class, probably // by having a per widget kind style - if (direct && clipboardMode != kMoveSelectionTo) { - rgb_color underlineColor = drawView->HighColor(); - underlineColor.alpha = 180; - - drawView->SetDrawingMode(B_OP_ALPHA); - drawView->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY); - drawView->SetHighColor(underlineColor); - } - BRect lineRect(textRect.OffsetByCopy(0, decenderHeight > 2 ? -(decenderHeight - 2) : 0)); // move underline 2px under text lineRect.InsetBy(roundf(textRect.Width() - fText->Width(view)), 0); // only underline text part drawView->StrokeLine(lineRect.LeftBottom(), lineRect.RightBottom(), B_MIXED_COLORS); - - if (direct && clipboardMode != kMoveSelectionTo) - drawView->SetDrawingMode(B_OP_OVER); } drawView->ConstrainClippingRegion(NULL);