aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-03 16:00:38 +0200
committerDanilo M. <danix@danix.xyz>2026-08-04 12:53:35 +0200
commit98c1c615d147bfee3f17d4f420e1512af5a79436 (patch)
tree82037d456544d6128324d85d5d572208f84c06a2 /docs
parenta5b2151ef4b602350bab6ecfcd05b4bae56fd6af (diff)
downloadqtmaildir-98c1c615d147bfee3f17d4f420e1512af5a79436.tar.gz
qtmaildir-98c1c615d147bfee3f17d4f420e1512af5a79436.zip
feat: persist window, splitter and column widths
Resizing the window, the splitter or a thread-list column was undone by the next launch. State now round-trips through a separate settings file at ~/.local/state/qtmaildir/uistate.conf, written on close and read at startup. The state file is deliberately not the user's config: a base64 geometry blob does not belong in a hand-edited file, and rewriting that file on exit would drop its comments and key order, which QSettings does not preserve. Two details that are easy to get wrong: QStandardPaths::StateLocation appends both the organization and the application name, and both are "qtmaildir" here, so it resolves to ~/.local/state/qtmaildir/qtmaildir. The path is built from GenericStateLocation instead, matching Config::defaultPath(). Restore runs after buildMenus() rather than at the end of buildUi(): QMainWindow::restoreState() matches toolbars by object name and silently drops the position of one that does not exist yet. Every restore is conditional on a non-empty blob, so a missing or rejected state file leaves the built-in defaults instead of producing a zero-size window. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'docs')
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md20
1 files changed, 19 insertions, 1 deletions
diff --git a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
index 7a6ecc2..debf79a 100644
--- a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
+++ b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
@@ -34,7 +34,7 @@ taking that too literally.
| # | Item | Cluster | Size | Status |
|---|------|---------|------|--------|
-| 1 | Splitter/column widths do not survive restart | persistence | S | open |
+| 1 | Splitter/column widths do not survive restart | persistence | S | **done** |
| 2 | No way to see full message details (From/To/Cc/Subject) | information | M | open |
| 3 | Too few clickable affordances, shortcuts are the only route | discoverability | M | **done** |
| 4 | Message-pane font size does not survive restart | persistence | S | open |
@@ -89,6 +89,24 @@ as well. Establish it once, in whichever lands first.
confirm both held. Then delete the state file and confirm the app still starts
with the 1200x800 default rather than a zero-size window.
+### Outcome (done)
+
+Built as described. `MainWindow::uiStatePath()` establishes the state file the
+plan calls for, so items 4 and 10 inherit it. Two things worth recording:
+
+- **`QStandardPaths::StateLocation` is the wrong enum here.** It appends both
+ the organization and the application name, and this app sets both to
+ `qtmaildir`, so it yields `~/.local/state/qtmaildir/qtmaildir/`. The path is
+ built from `GenericStateLocation` plus an explicit `/qtmaildir`, the same
+ shape as `Config::defaultPath()`. A test pins the component count.
+- **`restoreUiState()` runs after `buildMenus()`, not at the end of
+ `buildUi()`** as the plan proposed. `QMainWindow::restoreState()` matches
+ toolbars by object name, so a toolbar that does not exist yet has its
+ position silently dropped.
+
+Every restore is guarded on a non-empty blob, so absent state leaves the
+`buildUi()` defaults rather than producing a zero-size window.
+
## 2. No way to see full message details
**Observed:** From, To, Cc, Subject and the rest are not visible for the