mirror of
https://codeberg.org/scip/golsky.git
synced 2025-12-16 20:20:57 +01:00
added option to select theme, can be used also to select RLEs :)
This commit is contained in:
@@ -117,7 +117,19 @@ func (scene *SceneOptions) Init() {
|
|||||||
})
|
})
|
||||||
scene.SetInitialValue(wrap, scene.Config.Wrap)
|
scene.SetInitialValue(wrap, scene.Config.Wrap)
|
||||||
|
|
||||||
|
themes := NewCombobox(
|
||||||
|
[]string{"dark", "light"},
|
||||||
|
scene.Config.Theme,
|
||||||
|
func(args *widget.ListComboButtonEntrySelectedEventArgs) {
|
||||||
|
scene.Config.SwitchTheme(args.Entry.(ListEntry).Name)
|
||||||
|
})
|
||||||
|
themelabel := NewLabel("Themes")
|
||||||
|
combocontainer := NewColumnContainer()
|
||||||
|
combocontainer.AddChild(themes)
|
||||||
|
combocontainer.AddChild(themelabel)
|
||||||
|
|
||||||
separator := NewSeparator(3)
|
separator := NewSeparator(3)
|
||||||
|
separator2 := NewSeparator(3)
|
||||||
|
|
||||||
cancel := NewMenuButton("Close",
|
cancel := NewMenuButton("Close",
|
||||||
func(args *widget.ButtonClickedEventArgs) {
|
func(args *widget.ButtonClickedEventArgs) {
|
||||||
@@ -130,7 +142,13 @@ func (scene *SceneOptions) Init() {
|
|||||||
rowContainer.AddChild(gridlines)
|
rowContainer.AddChild(gridlines)
|
||||||
rowContainer.AddChild(evolution)
|
rowContainer.AddChild(evolution)
|
||||||
rowContainer.AddChild(wrap)
|
rowContainer.AddChild(wrap)
|
||||||
|
|
||||||
rowContainer.AddChild(separator)
|
rowContainer.AddChild(separator)
|
||||||
|
|
||||||
|
rowContainer.AddChild(combocontainer)
|
||||||
|
|
||||||
|
rowContainer.AddChild(separator2)
|
||||||
|
|
||||||
rowContainer.AddChild(cancel)
|
rowContainer.AddChild(cancel)
|
||||||
|
|
||||||
scene.Ui = &ebitenui.UI{
|
scene.Ui = &ebitenui.UI{
|
||||||
|
|||||||
136
src/widgets.go
136
src/widgets.go
@@ -78,6 +78,122 @@ func NewSeparator(padding int) widget.PreferredSizeLocateableWidget {
|
|||||||
return c
|
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
|
||||||
|
// FIXME: Change to our own color set
|
||||||
|
widget.ListOpts.EntryColor(&widget.ListEntryColor{
|
||||||
|
Selected: color.NRGBA{254, 255, 255, 255}, //Foreground color for the unfocused selected entry
|
||||||
|
Unselected: color.NRGBA{254, 255, 255, 255}, //Foreground color for the unfocused unselected entry
|
||||||
|
SelectedBackground: color.NRGBA{R: 130, G: 130, B: 200, A: 255}, //Background color for the unfocused selected entry
|
||||||
|
SelectedFocusedBackground: color.NRGBA{R: 130, G: 130, B: 170, A: 255}, //Background color for the focused selected entry
|
||||||
|
FocusedBackground: color.NRGBA{R: 170, G: 170, B: 180, A: 255}, //Background color for the focused unselected entry
|
||||||
|
DisabledUnselected: color.NRGBA{100, 100, 100, 255}, //Foreground color for the disabled unselected entry
|
||||||
|
DisabledSelected: color.NRGBA{100, 100, 100, 255}, //Foreground color for the disabled selected entry
|
||||||
|
DisabledSelectedBackground: color.NRGBA{100, 100, 100, 255}, //Background color for the disabled selected entry
|
||||||
|
}),
|
||||||
|
//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 {
|
type RowContainer struct {
|
||||||
Root *widget.Container
|
Root *widget.Container
|
||||||
Row *widget.Container
|
Row *widget.Container
|
||||||
@@ -130,6 +246,19 @@ func NewRowContainer(title string) *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) {
|
func LoadButtonImage() (*widget.ButtonImage, error) {
|
||||||
idle := image.NewNineSlice(Assets["button-9slice2"], [3]int{3, 3, 3}, [3]int{3, 3, 3})
|
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})
|
hover := image.NewNineSlice(Assets["button-9slice3"], [3]int{3, 3, 3}, [3]int{3, 3, 3})
|
||||||
@@ -142,6 +271,13 @@ func LoadButtonImage() (*widget.ButtonImage, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func LoadComboLabelImage() *widget.ButtonImageImage {
|
||||||
|
return &widget.ButtonImageImage{
|
||||||
|
Idle: Assets["checkbox-9slice2"],
|
||||||
|
Disabled: Assets["checkbox-9slice2"],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func LoadCheckboxImage() (*widget.CheckboxGraphicImage, error) {
|
func LoadCheckboxImage() (*widget.CheckboxGraphicImage, error) {
|
||||||
unchecked := &widget.ButtonImageImage{
|
unchecked := &widget.ButtonImageImage{
|
||||||
Idle: Assets["checkbox-9slice2"],
|
Idle: Assets["checkbox-9slice2"],
|
||||||
|
|||||||
Reference in New Issue
Block a user