From 36c66871685f734f659a242cb73b7d5feec7c004 Mon Sep 17 00:00:00 2001 From: Joe Julian Date: Tue, 7 Apr 2026 22:05:13 -0700 Subject: [PATCH] Use Gio east alignment for dropdown actions --- main.go | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 86 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index 88c941e..5a73bac 100644 --- a/main.go +++ b/main.go @@ -5551,30 +5551,39 @@ func (u *ui) headerActions(gtx layout.Context) layout.Dimensions { } func (u *ui) mainMenu(gtx layout.Context) layout.Dimensions { + rows := []layout.Widget{ + func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, u.theme, &u.showEntries, "Entries") }, + func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, u.theme, &u.showRecycle, "Recycle Bin") }, + func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, u.theme, &u.showAPITokens, "API Tokens") }, + func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, u.theme, &u.showAPIAudit, "API Audit") }, + func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, u.theme, &u.showAbout, "About") }, + func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, u.theme, &u.openSecuritySettings, "Settings") }, + } + rowWidth := menuActionWidth(gtx, rows) return compactCard(gtx, func(gtx layout.Context) layout.Dimensions { return layout.Flex{Axis: layout.Vertical}.Layout(gtx, layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.showEntries, "Entries") + return rightAlignedMenuAction(gtx, rowWidth, rows[0]) }), layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.showRecycle, "Recycle Bin") + return rightAlignedMenuAction(gtx, rowWidth, rows[1]) }), layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.showAPITokens, "API Tokens") + return rightAlignedMenuAction(gtx, rowWidth, rows[2]) }), layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.showAPIAudit, "API Audit") + return rightAlignedMenuAction(gtx, rowWidth, rows[3]) }), layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.showAbout, "About") + return rightAlignedMenuAction(gtx, rowWidth, rows[4]) }), layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.openSecuritySettings, "Settings") + return rightAlignedMenuAction(gtx, rowWidth, rows[5]) }), ) }) @@ -5701,6 +5710,35 @@ func (u *ui) syncMenu(gtx layout.Context) layout.Dimensions { if len(u.vaultRemoteCredentialClicks) < len(credentials) { u.vaultRemoteCredentialClicks = make([]widget.Clickable, len(credentials)) } + actionRows := []layout.Widget{ + func(gtx layout.Context) layout.Dimensions { return tonedButton(gtx, u.theme, &u.openAdvancedSync, "Open Advanced Sync") }, + } + if supportsVaultShare(runtime.GOOS) && u.vaultSharer != nil && strings.TrimSpace(u.currentShareableVaultPath()) != "" { + actionRows = append(actionRows, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.shareCurrentVault, "Share Vault") + }) + } + if u.shouldShowRemoteSyncSetupShortcut() { + actionRows = append(actionRows, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.useSavedAdvancedSyncRemote, u.remoteSyncSetupShortcutLabel()) + }) + } + if u.shouldShowDirectRemoteSyncShortcut() { + actionRows = append(actionRows, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.openSelectedVaultRemote, u.directRemoteSyncShortcutLabel()) + }) + } + if u.shouldShowRemoteSyncSettingsShortcut() { + actionRows = append(actionRows, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.useSavedAdvancedSyncRemote, u.remoteSyncSettingsShortcutLabel()) + }) + } + if u.shouldShowRemoveRemoteSyncShortcut() { + actionRows = append(actionRows, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.removeSelectedRemoteBinding, u.removeRemoteSyncShortcutLabel()) + }) + } + actionWidth := menuActionWidth(gtx, actionRows) return compactCard(gtx, func(gtx layout.Context) layout.Dimensions { rows := []layout.FlexChild{ layout.Rigid(func(gtx layout.Context) layout.Dimensions { @@ -5715,20 +5753,26 @@ func (u *ui) syncMenu(gtx layout.Context) layout.Dimensions { } return layout.Flex{Axis: layout.Vertical}.Layout(gtx, layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.shareCurrentVault, "Share Vault") + return rightAlignedMenuAction(gtx, actionWidth, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.shareCurrentVault, "Share Vault") + }) }), layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), ) }), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.openAdvancedSync, "Open Advanced Sync") + return rightAlignedMenuAction(gtx, actionWidth, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.openAdvancedSync, "Open Advanced Sync") + }) }), } if u.shouldShowRemoteSyncSetupShortcut() { rows = append(rows, layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.useSavedAdvancedSyncRemote, u.remoteSyncSetupShortcutLabel()) + return rightAlignedMenuAction(gtx, actionWidth, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.useSavedAdvancedSyncRemote, u.remoteSyncSetupShortcutLabel()) + }) }), ) } @@ -5736,7 +5780,9 @@ func (u *ui) syncMenu(gtx layout.Context) layout.Dimensions { rows = append(rows, layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.openSelectedVaultRemote, u.directRemoteSyncShortcutLabel()) + return rightAlignedMenuAction(gtx, actionWidth, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.openSelectedVaultRemote, u.directRemoteSyncShortcutLabel()) + }) }), ) } @@ -5744,7 +5790,9 @@ func (u *ui) syncMenu(gtx layout.Context) layout.Dimensions { rows = append(rows, layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.useSavedAdvancedSyncRemote, u.remoteSyncSettingsShortcutLabel()) + return rightAlignedMenuAction(gtx, actionWidth, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.useSavedAdvancedSyncRemote, u.remoteSyncSettingsShortcutLabel()) + }) }), ) } @@ -5752,7 +5800,9 @@ func (u *ui) syncMenu(gtx layout.Context) layout.Dimensions { rows = append(rows, layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout), layout.Rigid(func(gtx layout.Context) layout.Dimensions { - return tonedButton(gtx, u.theme, &u.removeSelectedRemoteBinding, u.removeRemoteSyncShortcutLabel()) + return rightAlignedMenuAction(gtx, actionWidth, func(gtx layout.Context) layout.Dimensions { + return tonedButton(gtx, u.theme, &u.removeSelectedRemoteBinding, u.removeRemoteSyncShortcutLabel()) + }) }), ) } @@ -7422,6 +7472,30 @@ func syncChoiceButton(gtx layout.Context, th *material.Theme, click *widget.Clic return btn.Layout(gtx) } +func menuActionWidth(gtx layout.Context, rows []layout.Widget) int { + width := 0 + for _, row := range rows { + measureGTX := gtx + measureGTX.Constraints.Min = image.Point{} + macro := op.Record(gtx.Ops) + dims := row(measureGTX) + _ = macro.Stop() + if dims.Size.X > width { + width = dims.Size.X + } + } + return width +} + +func rightAlignedMenuAction(gtx layout.Context, width int, child layout.Widget) layout.Dimensions { + if width <= 0 { + return child(gtx) + } + gtx.Constraints.Min.X = width + gtx.Constraints.Max.X = width + return layout.E.Layout(gtx, child) +} + func syncDialogSectionLabel(th *material.Theme, text string) layout.Widget { return func(gtx layout.Context) layout.Dimensions { lbl := material.Label(th, unit.Sp(12), strings.ToUpper(text))