mirror of
https://codeberg.org/scip/golsky.git
synced 2025-12-16 12:10:58 +01:00
306 lines
8.9 KiB
Go
306 lines
8.9 KiB
Go
package cmd
|
|
|
|
import (
|
|
"image/color"
|
|
|
|
"github.com/ebitenui/ebitenui/image"
|
|
"github.com/ebitenui/ebitenui/widget"
|
|
)
|
|
|
|
func NewMenuButton(
|
|
text string,
|
|
action func(args *widget.ButtonClickedEventArgs)) *widget.Button {
|
|
|
|
buttonImage, _ := LoadButtonImage()
|
|
|
|
return widget.NewButton(
|
|
widget.ButtonOpts.WidgetOpts(
|
|
widget.WidgetOpts.LayoutData(widget.RowLayoutData{
|
|
Position: widget.RowLayoutPositionCenter,
|
|
Stretch: true,
|
|
MaxWidth: 200,
|
|
MaxHeight: 100,
|
|
}),
|
|
),
|
|
|
|
widget.ButtonOpts.Image(buttonImage),
|
|
|
|
widget.ButtonOpts.Text(text, *FontRenderer.FontSmall, &widget.ButtonTextColor{
|
|
Idle: color.NRGBA{0xdf, 0xf4, 0xff, 0xff},
|
|
}),
|
|
|
|
widget.ButtonOpts.TextPadding(widget.Insets{
|
|
Left: 5,
|
|
Right: 5,
|
|
Top: 5,
|
|
Bottom: 5,
|
|
}),
|
|
|
|
widget.ButtonOpts.ClickedHandler(action),
|
|
)
|
|
}
|
|
|
|
func NewCheckbox(
|
|
text string,
|
|
initialvalue bool,
|
|
action func(args *widget.CheckboxChangedEventArgs)) *widget.LabeledCheckbox {
|
|
|
|
checkboxImage, _ := LoadCheckboxImage()
|
|
buttonImage, _ := LoadButtonImage()
|
|
|
|
var state widget.WidgetState
|
|
if initialvalue {
|
|
state = widget.WidgetChecked
|
|
}
|
|
|
|
return widget.NewLabeledCheckbox(
|
|
widget.LabeledCheckboxOpts.CheckboxOpts(
|
|
widget.CheckboxOpts.ButtonOpts(
|
|
widget.ButtonOpts.Image(buttonImage),
|
|
),
|
|
widget.CheckboxOpts.Image(checkboxImage),
|
|
widget.CheckboxOpts.StateChangedHandler(action),
|
|
widget.CheckboxOpts.InitialState(state),
|
|
),
|
|
widget.LabeledCheckboxOpts.LabelOpts(
|
|
widget.LabelOpts.Text(text, *FontRenderer.FontSmall,
|
|
&widget.LabelColor{
|
|
Idle: color.NRGBA{0xdf, 0xf4, 0xff, 0xff},
|
|
}),
|
|
),
|
|
)
|
|
}
|
|
|
|
func NewSeparator(padding int) widget.PreferredSizeLocateableWidget {
|
|
c := widget.NewContainer(
|
|
widget.ContainerOpts.Layout(widget.NewRowLayout(
|
|
widget.RowLayoutOpts.Direction(widget.DirectionVertical),
|
|
widget.RowLayoutOpts.Padding(widget.Insets{
|
|
Top: padding,
|
|
Bottom: 0,
|
|
}))),
|
|
widget.ContainerOpts.WidgetOpts(
|
|
widget.WidgetOpts.LayoutData(
|
|
widget.RowLayoutData{Stretch: true})))
|
|
return c
|
|
}
|
|
|
|
type ListEntry struct {
|
|
id int
|
|
Name string
|
|
}
|
|
|
|
func NewCombobox(items []string, selected string,
|
|
action func(args *widget.ListComboButtonEntrySelectedEventArgs)) *widget.ListComboButton {
|
|
buttonImage, _ := LoadButtonImage()
|
|
|
|
entries := make([]any, 0, len(items))
|
|
idxselected := 0
|
|
for i, item := range items {
|
|
entries = append(entries, ListEntry{i, item})
|
|
if items[i] == selected {
|
|
idxselected = i
|
|
}
|
|
}
|
|
|
|
comboBox := widget.NewListComboButton(
|
|
widget.ListComboButtonOpts.SelectComboButtonOpts(
|
|
widget.SelectComboButtonOpts.ComboButtonOpts(
|
|
//Set the max height of the dropdown list
|
|
widget.ComboButtonOpts.MaxContentHeight(150),
|
|
//Set the parameters for the primary displayed button
|
|
widget.ComboButtonOpts.ButtonOpts(
|
|
widget.ButtonOpts.Image(buttonImage),
|
|
widget.ButtonOpts.TextPadding(widget.NewInsetsSimple(5)),
|
|
widget.ButtonOpts.Text("", *FontRenderer.FontSmall, &widget.ButtonTextColor{
|
|
Idle: color.White,
|
|
Disabled: color.White,
|
|
}),
|
|
widget.ButtonOpts.WidgetOpts(
|
|
//Set how wide the button should be
|
|
widget.WidgetOpts.MinSize(50, 0),
|
|
//Set the combobox's position
|
|
widget.WidgetOpts.LayoutData(widget.AnchorLayoutData{
|
|
HorizontalPosition: widget.AnchorLayoutPositionCenter,
|
|
VerticalPosition: widget.AnchorLayoutPositionCenter,
|
|
})),
|
|
),
|
|
),
|
|
),
|
|
widget.ListComboButtonOpts.ListOpts(
|
|
//Set how wide the dropdown list should be
|
|
widget.ListOpts.ContainerOpts(
|
|
widget.ContainerOpts.WidgetOpts(widget.WidgetOpts.MinSize(50, 0)),
|
|
),
|
|
//Set the entries in the list
|
|
widget.ListOpts.Entries(entries),
|
|
widget.ListOpts.ScrollContainerOpts(
|
|
//Set the background images/color for the dropdown list
|
|
widget.ScrollContainerOpts.Image(&widget.ScrollContainerImage{
|
|
Idle: image.NewNineSliceColor(color.NRGBA{100, 100, 100, 255}),
|
|
Disabled: image.NewNineSliceColor(color.NRGBA{100, 100, 100, 255}),
|
|
Mask: image.NewNineSliceColor(color.NRGBA{100, 100, 100, 255}),
|
|
}),
|
|
),
|
|
widget.ListOpts.SliderOpts(
|
|
//Set the background images/color for the background of the slider track
|
|
widget.SliderOpts.Images(&widget.SliderTrackImage{
|
|
Idle: image.NewNineSliceColor(color.NRGBA{100, 100, 100, 255}),
|
|
Hover: image.NewNineSliceColor(color.NRGBA{100, 100, 100, 255}),
|
|
}, buttonImage),
|
|
widget.SliderOpts.MinHandleSize(5),
|
|
//Set how wide the track should be
|
|
widget.SliderOpts.TrackPadding(widget.NewInsetsSimple(2))),
|
|
//Set the font for the list options
|
|
widget.ListOpts.EntryFontFace(*FontRenderer.FontSmall),
|
|
//Set the colors for the list
|
|
widget.ListOpts.EntryColor(&widget.ListEntryColor{
|
|
Selected: color.NRGBA{254, 255, 255, 255},
|
|
Unselected: color.NRGBA{254, 255, 255, 255},
|
|
SelectedBackground: HexColor2RGBA(THEMES["standard"].life),
|
|
SelectedFocusedBackground: HexColor2RGBA(THEMES["standard"].old),
|
|
FocusedBackground: HexColor2RGBA(THEMES["standard"].old),
|
|
DisabledUnselected: HexColor2RGBA(THEMES["standard"].grid),
|
|
DisabledSelected: HexColor2RGBA(THEMES["standard"].grid),
|
|
DisabledSelectedBackground: HexColor2RGBA(THEMES["standard"].grid),
|
|
}),
|
|
//Padding for each entry
|
|
widget.ListOpts.EntryTextPadding(widget.NewInsetsSimple(5)),
|
|
),
|
|
//Define how the entry is displayed
|
|
widget.ListComboButtonOpts.EntryLabelFunc(
|
|
func(e any) string {
|
|
//Button Label function, visible if not open
|
|
return e.(ListEntry).Name
|
|
},
|
|
func(e any) string {
|
|
//List Label function, visible items if open
|
|
return e.(ListEntry).Name
|
|
}),
|
|
//Callback when a new entry is selected
|
|
widget.ListComboButtonOpts.EntrySelectedHandler(action),
|
|
)
|
|
|
|
//Select the middle entry -- optional
|
|
comboBox.SetSelectedEntry(entries[idxselected])
|
|
|
|
return comboBox
|
|
}
|
|
|
|
func NewLabel(text string) *widget.Text {
|
|
return widget.NewText(
|
|
widget.TextOpts.Text(text, *FontRenderer.FontSmall, color.White),
|
|
widget.TextOpts.Position(widget.TextPositionCenter, widget.TextPositionCenter),
|
|
widget.TextOpts.WidgetOpts(
|
|
widget.WidgetOpts.LayoutData(widget.RowLayoutData{
|
|
Position: widget.RowLayoutPositionCenter,
|
|
}),
|
|
),
|
|
)
|
|
|
|
}
|
|
|
|
/////////////// containers
|
|
|
|
type RowContainer struct {
|
|
Root *widget.Container
|
|
Row *widget.Container
|
|
}
|
|
|
|
func (container *RowContainer) AddChild(child widget.PreferredSizeLocateableWidget) {
|
|
container.Row.AddChild(child)
|
|
}
|
|
|
|
func (container *RowContainer) Container() *widget.Container {
|
|
return container.Root
|
|
}
|
|
|
|
// set arg to false if no background needed
|
|
func NewRowContainer(title string) *RowContainer {
|
|
buttonImageHover := image.NewNineSlice(Assets["button-9slice3"], [3]int{3, 3, 3}, [3]int{3, 3, 3})
|
|
|
|
uiContainer := widget.NewContainer(
|
|
widget.ContainerOpts.Layout(widget.NewAnchorLayout()),
|
|
)
|
|
|
|
titleLabel := widget.NewText(
|
|
widget.TextOpts.WidgetOpts(widget.WidgetOpts.LayoutData(widget.RowLayoutData{
|
|
Stretch: true,
|
|
})),
|
|
widget.TextOpts.Text(title, *FontRenderer.FontNormal, color.NRGBA{0xdf, 0xf4, 0xff, 0xff}))
|
|
|
|
rowContainer := widget.NewContainer(
|
|
widget.ContainerOpts.WidgetOpts(
|
|
widget.WidgetOpts.LayoutData(widget.AnchorLayoutData{
|
|
HorizontalPosition: widget.AnchorLayoutPositionCenter,
|
|
VerticalPosition: widget.AnchorLayoutPositionCenter,
|
|
}),
|
|
),
|
|
widget.ContainerOpts.Layout(widget.NewRowLayout(
|
|
widget.RowLayoutOpts.Direction(widget.DirectionVertical),
|
|
widget.RowLayoutOpts.Padding(widget.NewInsetsSimple(8)),
|
|
widget.RowLayoutOpts.Spacing(0),
|
|
)),
|
|
widget.ContainerOpts.BackgroundImage(buttonImageHover),
|
|
)
|
|
|
|
rowContainer.AddChild(titleLabel)
|
|
|
|
uiContainer.AddChild(rowContainer)
|
|
|
|
return &RowContainer{
|
|
Root: uiContainer,
|
|
Row: rowContainer,
|
|
}
|
|
}
|
|
|
|
func NewColumnContainer() *widget.Container {
|
|
colcontainer := widget.NewContainer(
|
|
widget.ContainerOpts.Layout(
|
|
widget.NewGridLayout(
|
|
widget.GridLayoutOpts.Columns(2),
|
|
widget.GridLayoutOpts.Spacing(5, 0),
|
|
),
|
|
),
|
|
)
|
|
|
|
return colcontainer
|
|
}
|
|
|
|
func LoadButtonImage() (*widget.ButtonImage, error) {
|
|
idle := image.NewNineSlice(Assets["button-9slice2"], [3]int{3, 3, 3}, [3]int{3, 3, 3})
|
|
hover := image.NewNineSlice(Assets["button-9slice3"], [3]int{3, 3, 3}, [3]int{3, 3, 3})
|
|
pressed := image.NewNineSlice(Assets["button-9slice1"], [3]int{3, 3, 3}, [3]int{3, 3, 3})
|
|
|
|
return &widget.ButtonImage{
|
|
Idle: idle,
|
|
Hover: hover,
|
|
Pressed: pressed,
|
|
}, nil
|
|
}
|
|
|
|
func LoadComboLabelImage() *widget.ButtonImageImage {
|
|
return &widget.ButtonImageImage{
|
|
Idle: Assets["checkbox-9slice2"],
|
|
Disabled: Assets["checkbox-9slice2"],
|
|
}
|
|
}
|
|
|
|
func LoadCheckboxImage() (*widget.CheckboxGraphicImage, error) {
|
|
unchecked := &widget.ButtonImageImage{
|
|
Idle: Assets["checkbox-9slice2"],
|
|
Disabled: Assets["checkbox-9slice2"],
|
|
}
|
|
|
|
checked := &widget.ButtonImageImage{
|
|
Idle: Assets["checkbox-9slice1"],
|
|
Disabled: Assets["checkbox-9slice1"],
|
|
}
|
|
|
|
return &widget.CheckboxGraphicImage{
|
|
Checked: checked,
|
|
Unchecked: unchecked,
|
|
Greyed: unchecked,
|
|
}, nil
|
|
}
|