Social bar position is a click-toggle, not a drag — the drag-snap misbehaved for shaky hands (snapped up but wouldn't come back down; jitter around the deadzone). Clicking the bar now flips it top/bottom via ToggleSocialBarPosition; SocialBarSnap and its units removed — 153 tests passing, 0 warnings
This commit is contained in:
+5
-53
@@ -254,60 +254,12 @@ public partial class MainWindow : Window
|
||||
private void OpacitySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
|
||||
=> OpacityValueText.Text = $"{Math.Round(e.NewValue * 100)}%";
|
||||
|
||||
// ─── Social bar drag: vertical only, direction-snaps to the top/bottom edge ───
|
||||
private const double SocialBarBottomTop = 1040;
|
||||
private bool _isDraggingSocialBar;
|
||||
private double _socialBarDragStartY;
|
||||
private SocialBarPosition? _socialBarDragDirection;
|
||||
|
||||
private void SocialBar_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
// ─── Social bar: click toggles top ⇄ bottom. KISS — the drag variant was
|
||||
// unusable for shaky hands (jitter around the direction deadzone), so the bar
|
||||
// rides on {Binding SocialBarTop} alone and a click flips it. ───
|
||||
private void SocialBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var bar = (FrameworkElement)sender;
|
||||
_isDraggingSocialBar = true;
|
||||
_socialBarDragDirection = null;
|
||||
var toCanvas = CanvasGrid.TransformToVisual(bar).Inverse;
|
||||
var p = toCanvas.Transform(e.GetPosition(bar));
|
||||
_socialBarDragStartY = p.Y;
|
||||
bar.CaptureMouse();
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void SocialBar_PreviewMouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (!_isDraggingSocialBar) return;
|
||||
var bar = (FrameworkElement)sender;
|
||||
var toCanvas = CanvasGrid.TransformToVisual(bar).Inverse;
|
||||
var p = toCanvas.Transform(e.GetPosition(bar));
|
||||
|
||||
// Derive the drag direction once it commits (past the deadzone) and keep it
|
||||
// for the rest of the drag — the bar snaps to the edge it's being dragged
|
||||
// toward and is never left mid-screen.
|
||||
var direction = _socialBarDragDirection
|
||||
?? SocialBarSnap.Decide(p.Y - _socialBarDragStartY);
|
||||
if (direction != null)
|
||||
{
|
||||
_socialBarDragDirection = direction;
|
||||
Canvas.SetTop(bar, direction == SocialBarPosition.Top ? 0 : SocialBarBottomTop);
|
||||
}
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void SocialBar_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (!_isDraggingSocialBar) return;
|
||||
var bar = (FrameworkElement)sender;
|
||||
bar.ReleaseMouseCapture();
|
||||
_isDraggingSocialBar = false;
|
||||
|
||||
var direction = _socialBarDragDirection
|
||||
?? (Canvas.GetTop(bar) <= SocialBarBottomTop / 2.0
|
||||
? SocialBarPosition.Top : SocialBarPosition.Bottom);
|
||||
|
||||
// ClearValue removes the local value Canvas.SetTop applied during the drag —
|
||||
// a local value permanently overrides the {Binding SocialBarTop}, which is
|
||||
// why the release snap never used to show. Clearing re-engages the binding.
|
||||
bar.ClearValue(Canvas.TopProperty);
|
||||
_viewModel.SetSocialBarPosition(direction);
|
||||
_viewModel.ToggleSocialBarPosition();
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user