Allow customizing the window width/height thresholds for when to use portrait mode

This commit is contained in:
Stefan Haller 2026-03-31 12:31:42 +02:00
parent f8fd8d04bc
commit fde4bc1fb2
5 changed files with 127 additions and 1 deletions

View file

@ -298,6 +298,16 @@ gui:
# One of 'auto' (default) | 'always' | 'never'
portraitMode: auto
# In 'auto' mode, portrait mode will be used if the window width is less than or
# equal to portraitModeAutoMaxWidth and the window height is greater than or
# equal to portraitModeAutoMinHeight. Unused when portraitMode is not 'auto'.
portraitModeAutoMaxWidth: 84
# In 'auto' mode, portrait mode will be used if the window width is less than or
# equal to portraitModeAutoMaxWidth and the window height is greater than or
# equal to portraitModeAutoMinHeight. Unused when portraitMode is not 'auto'.
portraitModeAutoMinHeight: 46
# How things are filtered when typing '/'.
# One of 'substring' (default) | 'fuzzy'
filterMode: substring

View file

@ -187,6 +187,10 @@ type GuiConfig struct {
// Whether to stack UI components on top of each other.
// One of 'auto' (default) | 'always' | 'never'
PortraitMode string `yaml:"portraitMode"`
// In 'auto' mode, portrait mode will be used if the window width is less than or equal to portraitModeAutoMaxWidth and the window height is greater than or equal to portraitModeAutoMinHeight. Unused when portraitMode is not 'auto'.
PortraitModeAutoMaxWidth int `yaml:"portraitModeAutoMaxWidth"`
// In 'auto' mode, portrait mode will be used if the window width is less than or equal to portraitModeAutoMaxWidth and the window height is greater than or equal to portraitModeAutoMinHeight. Unused when portraitMode is not 'auto'.
PortraitModeAutoMinHeight int `yaml:"portraitModeAutoMinHeight"`
// How things are filtered when typing '/'.
// One of 'substring' (default) | 'fuzzy'
FilterMode string `yaml:"filterMode" jsonschema:"enum=substring,enum=fuzzy"`
@ -820,6 +824,8 @@ func GetDefaultConfig() *UserConfig {
Border: "rounded",
AnimateExplosion: true,
PortraitMode: "auto",
PortraitModeAutoMaxWidth: 84,
PortraitModeAutoMinHeight: 46,
FilterMode: "substring",
Spinner: SpinnerConfig{
Frames: []string{"|", "/", "-", "\\"},

View file

@ -116,7 +116,8 @@ func shouldUsePortraitMode(args WindowArrangementArgs) bool {
case "always":
return true
default: // "auto" or any garbage values in PortraitMode value
return args.Width <= 84 && args.Height > 45
return args.Width <= args.UserConfig.Gui.PortraitModeAutoMaxWidth &&
args.Height >= args.UserConfig.Gui.PortraitModeAutoMinHeight
}
}

View file

@ -346,6 +346,105 @@ func TestGetWindowDimensions(t *testing.T) {
B: information
`,
},
{
name: "portrait auto mode, enabled",
mutateArgs: func(args *WindowArrangementArgs) {
args.Width = 50
args.Height = 20
args.UserConfig.Gui.PortraitModeAutoMaxWidth = 50
args.UserConfig.Gui.PortraitModeAutoMinHeight = 20
},
expected: `
<status>
files
<branches>
<commits>
<stash>
main
<options>A<B>
A: statusSpacer1
B: information
`,
},
{
name: "portrait auto mode, disabled because width is too large",
mutateArgs: func(args *WindowArrangementArgs) {
args.Width = 50
args.Height = 20
args.UserConfig.Gui.PortraitModeAutoMaxWidth = 49
args.UserConfig.Gui.PortraitModeAutoMinHeight = 20
},
expected: `
<status>main
files
<branches>
<commits>
<stash>
<options>A<B>
A: statusSpacer1
B: information
`,
},
{
name: "portrait auto mode, disabled because height is too small",
mutateArgs: func(args *WindowArrangementArgs) {
args.Width = 50
args.Height = 20
args.UserConfig.Gui.PortraitModeAutoMaxWidth = 50
args.UserConfig.Gui.PortraitModeAutoMinHeight = 21
},
expected: `
<status>main
files
<branches>
<commits>
<stash>
<options>A<B>
A: statusSpacer1
B: information
`,
},
{
name: "search mode",
mutateArgs: func(args *WindowArrangementArgs) {

View file

@ -769,6 +769,16 @@
"description": "Whether to stack UI components on top of each other.\nOne of 'auto' (default) | 'always' | 'never'",
"default": "auto"
},
"portraitModeAutoMaxWidth": {
"type": "integer",
"description": "In 'auto' mode, portrait mode will be used if the window width is less than or equal to portraitModeAutoMaxWidth and the window height is greater than or equal to portraitModeAutoMinHeight. Unused when portraitMode is not 'auto'.",
"default": 84
},
"portraitModeAutoMinHeight": {
"type": "integer",
"description": "In 'auto' mode, portrait mode will be used if the window width is less than or equal to portraitModeAutoMaxWidth and the window height is greater than or equal to portraitModeAutoMinHeight. Unused when portraitMode is not 'auto'.",
"default": 46
},
"filterMode": {
"type": "string",
"enum": [