@@ -7,6 +7,7 @@ items `[x]` as done.
|
||||
## Phase A — Skin subsystem (TODO items 5, 3, 4)
|
||||
|
||||
### A1. Extract classic-skin code into a project-level package (task 5)
|
||||
|
||||
- [x] New package `dartamp_skin` at `packages/dartamp_skin/`.
|
||||
- [x] Moved `classic_skin.dart`, `skin_loader.dart`, `bmp_decoder.dart`,
|
||||
`skin_image.dart`, `skin_slider.dart`, `text_font.dart`, and
|
||||
@@ -23,6 +24,7 @@ items `[x]` as done.
|
||||
`loadBaseSkin` uses that path.
|
||||
|
||||
### A2. Self-contained storage + .wsz import (task 3)
|
||||
|
||||
- [x] `SkinRegistry` in the package (`skin_registry.dart`): scans a directory for
|
||||
extracted skins, holds a `manifest.json` per skin (name + import time),
|
||||
`importArchive()` unzips a `.wsz` into `skins/<name>/` (flat top-level
|
||||
@@ -43,6 +45,7 @@ items `[x]` as done.
|
||||
(11 incl. `skin_registry_test.dart`), `flutter build macos --debug` ok.
|
||||
|
||||
### A3. Cursors (task 4)
|
||||
|
||||
- `ClassicSkin` exposes cursor bitmaps (`cursor.bmp`/`.cur`) + hotspot (default
|
||||
skin included).
|
||||
- Native `NSCursor` from skin bitmap via the `winamp` channel; applied with
|
||||
@@ -51,6 +54,7 @@ items `[x]` as done.
|
||||
## Phase B — Docking & window management (new `lib/src/docking/`)
|
||||
|
||||
### B1. Plumbing
|
||||
|
||||
- Persist per-window positions (`winamp.window_<name>_x/y` in PlayerState);
|
||||
sub-windows spawn at saved positions instead of `center()`.
|
||||
- Sub-windows report bounds over `winamp.subwindows`; main holds the
|
||||
@@ -62,6 +66,7 @@ items `[x]` as done.
|
||||
positions + recomputes attachments.
|
||||
|
||||
### B2. Dock logic (task 1) — port from DOCK.cpp / Set.cpp / ui.cpp
|
||||
|
||||
- `IsWindowAttached` (dynamic geometry), `SnapWindowToWindow`, `SnapToScreen`,
|
||||
`AdjustSnap`, `FixOverlaps`.
|
||||
- Shade-toggle re-pin (`doMyDirtyShitholeDockingShit`) when main/EQ/PL sizes
|
||||
@@ -71,6 +76,7 @@ items `[x]` as done.
|
||||
PL severs the chain.
|
||||
|
||||
### B3. Playlist resize from bottom-right (task 6)
|
||||
|
||||
- Custom bottom-right resize handle (window_manager startResizing is
|
||||
Win/Linux-only).
|
||||
- Verify original row-snapping constraints; reuse re-pin for windows docked
|
||||
@@ -79,20 +85,24 @@ items `[x]` as done.
|
||||
## Phase C — UI fixes
|
||||
|
||||
### C1. EQ presets window (task 7)
|
||||
|
||||
- Implement the presets window, wire the presets button, load/save to prefs.
|
||||
|
||||
### C2. PL bottom action buttons (task 8)
|
||||
|
||||
- Research original `button.bmp` regions + popup behavior; clipped sprites +
|
||||
long-press full-sheet popup with release-to-activate; verify vs original.
|
||||
|
||||
## Phase D — Preferences + dock menu
|
||||
|
||||
### D1. Preferences window (task 2)
|
||||
|
||||
- Match original classic layout (Setup, Audio, Visualization, Plug-ins,
|
||||
Skins, Titles, Directories, etc.); all tabs no-op except Skins (registry
|
||||
list + active selection).
|
||||
|
||||
### D2. Dock icon menu (task 9)
|
||||
|
||||
- `applicationDockMenu(_:)` with Main/EQ/PL visibility toggles; add missing
|
||||
main-window item to the Window menu; flip
|
||||
`applicationShouldTerminateAfterLastWindowClosed` -> `false` so closing all
|
||||
|
||||
Reference in New Issue
Block a user