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 <[email protected]>
Reviewed-by: John Scipione <[email protected]>
Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
John Scipione
2026-05-13 16:17:08 +00:00
parent 5660b231ec
commit 7b8f09dc61
3 changed files with 46 additions and 48 deletions
+1 -1
View File
@@ -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);
+23 -13
View File
@@ -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);
+22 -34
View File
@@ -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);