Allow dragging the macOS player controls bar to reposition it

The glass controls capsule can now be dragged anywhere over the video.
Position is stored as a fraction of the container size so it survives
window resizes and aspect-ratio driven sheet resizes, persists across
sessions via SettingsManager, and snaps back magnetically when dropped
near the default bottom-center spot. Travel is clamped so the capsule
stays inside the player and never overlaps the top button row. A
mouseDownCanMoveWindow=false backing view keeps the window's
movable-by-background behavior from swallowing the drag.
This commit is contained in:
Arkadiusz Fal
2026-06-21 17:39:48 +02:00
parent 76ae2717b2
commit 1cd566ae29
4 changed files with 166 additions and 1 deletions

View File

@@ -47,6 +47,8 @@ enum SettingsKey: String, CaseIterable {
// Platform-specific
case macPlayerSeparateWindow
case macPlayerFloating
case macControlsBarOffsetX // Normalized X offset of macOS control bar from default position
case macControlsBarOffsetY // Normalized Y offset of macOS control bar from default position
case playerSheetAutoResize
case listStyle
@@ -140,6 +142,7 @@ enum SettingsKey: String, CaseIterable {
switch self {
case .preferredQuality, .cellularQuality, .allowSoftwareDecodedFormats,
.macPlayerSeparateWindow, .macPlayerFloating, .listStyle,
.macControlsBarOffsetX, .macControlsBarOffsetY,
// Home layout different UI paradigms per platform
.homeShortcutOrder, .homeShortcutVisibility, .homeShortcutLayout, .homeShortcutCardStyle,
.homeShortcutCardColor, .homeShortcutColorfulPalette, .homeShortcutCustomPaletteColors,

View File

@@ -95,6 +95,34 @@ extension SettingsManager {
}
}
/// Normalized X offset of the macOS floating control bar from its default
/// bottom-center position, stored as a fraction of the player container width.
/// 0 = default docked position.
var macControlsBarOffsetX: Double {
get {
if let cached = _macControlsBarOffsetX { return cached }
return double(for: .macControlsBarOffsetX)
}
set {
_macControlsBarOffsetX = newValue
set(newValue, for: .macControlsBarOffsetX)
}
}
/// Normalized Y offset of the macOS floating control bar from its default
/// bottom-center position, stored as a fraction of the player container height.
/// 0 = default docked position.
var macControlsBarOffsetY: Double {
get {
if let cached = _macControlsBarOffsetY { return cached }
return double(for: .macControlsBarOffsetY)
}
set {
_macControlsBarOffsetY = newValue
set(newValue, for: .macControlsBarOffsetY)
}
}
/// Whether the player sheet automatically resizes to match video aspect ratio.
/// When enabled, the sheet window will resize when video loads or changes.
/// Default is true.

View File

@@ -74,6 +74,8 @@ final class SettingsManager {
#if os(macOS)
var _macPlayerSeparateWindow: Bool?
var _macPlayerFloating: Bool?
var _macControlsBarOffsetX: Double?
var _macControlsBarOffsetY: Double?
var _playerSheetAutoResize: Bool?
#endif
@@ -460,6 +462,8 @@ final class SettingsManager {
#if os(macOS)
_macPlayerSeparateWindow = nil
_macPlayerFloating = nil
_macControlsBarOffsetX = nil
_macControlsBarOffsetY = nil
_playerSheetAutoResize = nil
#endif
// miniPlayerShowVideo and miniPlayerVideoTapAction moved to preset