91 lines
2.9 KiB
Go
91 lines
2.9 KiB
Go
package gio
|
|
|
|
import (
|
|
"image/color"
|
|
|
|
"gioui.org/layout"
|
|
"gioui.org/op/paint"
|
|
"gioui.org/unit"
|
|
"gioui.org/widget/material"
|
|
)
|
|
|
|
var shellColors = struct {
|
|
background color.NRGBA
|
|
foreground color.NRGBA
|
|
primary color.NRGBA
|
|
onPrimary color.NRGBA
|
|
secondary color.NRGBA
|
|
}{
|
|
background: color.NRGBA{R: 248, G: 250, B: 252, A: 255},
|
|
foreground: color.NRGBA{R: 15, G: 23, B: 42, A: 255},
|
|
primary: color.NRGBA{R: 13, G: 148, B: 136, A: 255},
|
|
onPrimary: color.NRGBA{R: 255, G: 255, B: 255, A: 255},
|
|
secondary: color.NRGBA{R: 71, G: 85, B: 105, A: 255},
|
|
}
|
|
|
|
// AppShell is the modern window frame. Feature views are added in later tasks.
|
|
type AppShell struct {
|
|
edition string
|
|
}
|
|
|
|
// NewAppShell creates an empty shell for the supplied build edition.
|
|
func NewAppShell(edition string) *AppShell {
|
|
return &AppShell{edition: edition}
|
|
}
|
|
|
|
// NewTheme creates the semantic palette shared by the modern shell.
|
|
func NewTheme() *material.Theme {
|
|
theme := material.NewTheme()
|
|
theme.Palette = material.Palette{
|
|
Bg: shellColors.background,
|
|
Fg: shellColors.foreground,
|
|
ContrastBg: shellColors.primary,
|
|
ContrastFg: shellColors.onPrimary,
|
|
}
|
|
theme.FingerSize = unit.Dp(44)
|
|
return theme
|
|
}
|
|
|
|
// Layout renders the shell without performing IO or submitting use cases.
|
|
func (shell *AppShell) Layout(context layout.Context, theme *material.Theme) layout.Dimensions {
|
|
paint.Fill(context.Ops, theme.Bg)
|
|
|
|
return layout.UniformInset(unit.Dp(32)).Layout(context, func(context layout.Context) layout.Dimensions {
|
|
return layout.Flex{Axis: layout.Vertical}.Layout(
|
|
context,
|
|
layout.Rigid(func(context layout.Context) layout.Dimensions {
|
|
return layout.Flex{Alignment: layout.Middle}.Layout(
|
|
context,
|
|
layout.Rigid(material.H5(theme, "SoftBox").Layout),
|
|
layout.Rigid(layout.Spacer{Width: unit.Dp(16)}.Layout),
|
|
layout.Rigid(func(context layout.Context) layout.Dimensions {
|
|
label := material.Body2(theme, shell.edition)
|
|
label.Color = shellColors.primary
|
|
return label.Layout(context)
|
|
}),
|
|
)
|
|
}),
|
|
layout.Rigid(layout.Spacer{Height: unit.Dp(24)}.Layout),
|
|
layout.Flexed(1, func(context layout.Context) layout.Dimensions {
|
|
return layout.Center.Layout(context, func(context layout.Context) layout.Dimensions {
|
|
return layout.Flex{Axis: layout.Vertical, Alignment: layout.Middle}.Layout(
|
|
context,
|
|
layout.Rigid(material.H6(theme, "软件目录准备中").Layout),
|
|
layout.Rigid(layout.Spacer{Height: unit.Dp(8)}.Layout),
|
|
layout.Rigid(func(context layout.Context) layout.Dimensions {
|
|
label := material.Body1(theme, "当前窗口仅验证 Gio AppShell 与双构建链路。")
|
|
label.Color = shellColors.secondary
|
|
return label.Layout(context)
|
|
}),
|
|
)
|
|
})
|
|
}),
|
|
layout.Rigid(func(context layout.Context) layout.Dimensions {
|
|
label := material.Body2(theme, "Modern · Windows 10/11 x64")
|
|
label.Color = shellColors.secondary
|
|
return label.Layout(context)
|
|
}),
|
|
)
|
|
})
|
|
}
|