From 761fae9b9b525b29b5b2367a6b96ac052ffa793b Mon Sep 17 00:00:00 2001 From: Joe Julian Date: Sun, 29 Mar 2026 15:35:32 -0700 Subject: [PATCH] Fix KeePassGO open screen field and banner UX --- main.go | 13 +++++++++++++ main_test.go | 12 ++++++------ ui_forms.go | 6 +++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/main.go b/main.go index 6afd5f1..10ff280 100644 --- a/main.go +++ b/main.go @@ -674,9 +674,22 @@ func (u *ui) runAction(label string, action func() error) { } u.loadingMessage = "" u.state.ErrorMessage = "" + if suppressStatusMessage(label) { + u.state.StatusMessage = "" + return + } u.state.StatusMessage = label + " complete" } +func suppressStatusMessage(label string) bool { + switch strings.TrimSpace(label) { + case "open vault", "open remote vault": + return true + default: + return false + } +} + func actionLoadingLabel(label string) string { label = strings.TrimSpace(label) if label == "" { diff --git a/main_test.go b/main_test.go index c4773c6..6f0bc26 100644 --- a/main_test.go +++ b/main_test.go @@ -1783,8 +1783,8 @@ func TestEnterOnLocalLifecycleScreenDefaultsToOpenVault(t *testing.T) { if !handled { t.Fatal("handleKeyPress(Return) = false, want true") } - if got := u.state.StatusMessage; got != "open vault complete" { - t.Fatalf("StatusMessage = %q, want %q", got, "open vault complete") + if got := u.state.StatusMessage; got != "" { + t.Fatalf("StatusMessage = %q, want empty after open", got) } } @@ -1815,8 +1815,8 @@ func TestEnterOnRemoteLifecycleScreenDefaultsToOpenRemoteVault(t *testing.T) { if !handled { t.Fatal("handleKeyPress(Return) = false, want true") } - if got := u.state.StatusMessage; got != "open remote vault complete" { - t.Fatalf("StatusMessage = %q, want %q", got, "open remote vault complete") + if got := u.state.StatusMessage; got != "" { + t.Fatalf("StatusMessage = %q, want empty after remote open", got) } } @@ -2072,8 +2072,8 @@ func TestUILocalLifecycleActionsUpdateVisibleStatusMessages(t *testing.T) { reopened.masterPassword.SetText("correct horse battery staple") reopened.vaultPath.SetText(path) reopened.runAction("open vault", reopened.openVaultAction) - if got := reopened.state.StatusMessage; got != "open vault complete" { - t.Fatalf("status after open = %q, want %q", got, "open vault complete") + if got := reopened.state.StatusMessage; got != "" { + t.Fatalf("status after open = %q, want empty", got) } if got := reopened.state.ErrorMessage; got != "" { t.Fatalf("error after open = %q, want empty", got) diff --git a/ui_forms.go b/ui_forms.go index 6d7be00..ffd363a 100644 --- a/ui_forms.go +++ b/ui_forms.go @@ -286,7 +286,10 @@ func selectorEditorHelp(th *material.Theme, label, help string, editor *widget.E return layout.Flex{Axis: layout.Vertical}.Layout(gtx, layout.Rigid(func(gtx layout.Context) layout.Dimensions { return layout.Flex{Alignment: layout.Middle}.Layout(gtx, - layout.Flexed(1, labeledEditor(th, label, editor, sensitive)), + layout.Flexed(1, func(gtx layout.Context) layout.Dimensions { + gtx.Constraints.Min.X = gtx.Constraints.Max.X + return labeledEditor(th, label, editor, sensitive)(gtx) + }), layout.Rigid(layout.Spacer{Width: unit.Dp(8)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, th, click, buttonLabel) @@ -336,6 +339,7 @@ func labeledEditorWithFocus( editor.Mask = '•' } defer func() { editor.Mask = mask }() + gtx.Constraints.Min.X = gtx.Constraints.Max.X ed := material.Editor(th, editor, label) return layout.UniformInset(unit.Dp(8)).Layout(gtx, ed.Layout) })