iOS: Duo layout fixes, swipe-up option, fuller backup restore

- DuoRail sits at the bottom of the strip, clear of the back buttons
- Setting to turn off swipe up for Playing Next
- Tighter Now Playing on iPhone Duo (folded and docked), regular phones unchanged
- Bigger stacked stem faders in the Duo deck
- Backup v2 restores song mixes, custom presets and stem playlist covers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-11-10 09:07:22 -08:00
1 parent e8bc920454
commit fabca5d1aa
9 files changed
+166 -54

No files matched your search

+5 -13
View File
@@ -163,22 +163,14 @@ final class StemPlaylists {
return MixPresets.current(allStems, mix)?.label ?? "Custom Mix"
}
/// Brings in playlists from an export: new ids are added, ids already here are replaced when the
/// import was updated more recently. Returns how many lists were added or replaced.
/// Import from a backup: the backup's copy of each list wins, lists only on this phone stay.
@discardableResult
func merge(_ incoming: [StemPlaylist]) -> Int {
var n = 0
func restore(_ incoming: [StemPlaylist]) -> Int {
for pl in incoming {
if let i = lists.firstIndex(where: { $0.id == pl.id }) {
guard pl.updated > lists[i].updated else { continue }
lists[i] = pl
} else {
lists.append(pl)
}
n += 1
if let i = lists.firstIndex(where: { $0.id == pl.id }) { lists[i] = pl } else { lists.append(pl) }
}
if n > 0 { save() }
return n
if !incoming.isEmpty { save() }
return incoming.count
}
private func edit(_ id: String, _ change: (inout StemPlaylist) -> Void) {