diff options
Diffstat (limited to 'engine/Dynamic')
| -rw-r--r-- | engine/Dynamic/Descriptors/Menu.go | 21 | ||||
| -rw-r--r-- | engine/Dynamic/Descriptors/UIElement.go | 20 | ||||
| -rw-r--r-- | engine/Dynamic/DynamicMenu.go | 71 |
3 files changed, 112 insertions, 0 deletions
diff --git a/engine/Dynamic/Descriptors/Menu.go b/engine/Dynamic/Descriptors/Menu.go new file mode 100644 index 0000000..fc0c2de --- /dev/null +++ b/engine/Dynamic/Descriptors/Menu.go @@ -0,0 +1,21 @@ +package descriptors + +import ui "github.com/DegustatorPonos/RuinesOfRafdolon/UI" + +type MenuDescriptor struct { + PaddingX float32 + PaddingY float32 + Contents UIElementDescriptor +} + +func (base *MenuDescriptor) Parse() (*ui.Menu, error) { + var contents, contentsErr = base.Contents.Parse() + if contentsErr != nil { + return nil, contentsErr + } + return &ui.Menu { + PaddingX: base.PaddingX, + PaddingY: base.PaddingY, + Contents: contents, + }, nil +} diff --git a/engine/Dynamic/Descriptors/UIElement.go b/engine/Dynamic/Descriptors/UIElement.go index 9b88ab3..1b19ba2 100644 --- a/engine/Dynamic/Descriptors/UIElement.go +++ b/engine/Dynamic/Descriptors/UIElement.go @@ -22,11 +22,13 @@ type UIElementDescriptor struct { Spacing float32 } +// We have to initialize the map so that we avoid the circular reference in the recursive parsing func InitUIParser() { typeParsers = map[string]func(*UIElementDescriptor) ui.UIElement { ui.VoidTypeName: parseAsVoid, ui.LabelTypeName: parseAsLabel, ui.GridRowTypeName: parseAsGridRow, + ui.GridColumnTypeName: parseAsGridColumn, } } @@ -82,3 +84,21 @@ func parseAsGridRow(base *UIElementDescriptor) ui.UIElement { } return &outp } + +func parseAsGridColumn(base *UIElementDescriptor) ui.UIElement { + var outp = ui.GridColumn { + Weight: base.Weight, + Spacing: base.Spacing, + Style: base.Style.Parse(), + Objects: make([]ui.UIElement, 0, len(base.Children)), + } + for _, v := range base.Children { + var child, parseErr = v.Parse() + if parseErr != nil { + rl.TraceLog(rl.LogWarning, "Failed to parse a parent element of a grid column: %v", parseErr.Error()) + continue + } + outp.Objects = append(outp.Objects, child) + } + return &outp +} diff --git a/engine/Dynamic/DynamicMenu.go b/engine/Dynamic/DynamicMenu.go new file mode 100644 index 0000000..a1f3cd0 --- /dev/null +++ b/engine/Dynamic/DynamicMenu.go @@ -0,0 +1,71 @@ +package dynamic + +import ( + "encoding/json" + "fmt" + "os" + + coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" + descriptors "github.com/DegustatorPonos/RuinesOfRafdolon/Dynamic/Descriptors" + ui "github.com/DegustatorPonos/RuinesOfRafdolon/UI" + rl "github.com/gen2brain/raylib-go/raylib" +) + +// Represents a menu variant that is loaded from a file +type DynamicMenu struct { + FileLocation string + baseMenu *ui.Menu +} + +func (base *DynamicMenu) Create(manager *coreobjects.SceneManager) { + var err = base.LoadMenu() + if err != nil { + rl.TraceLog(rl.LogWarning, "Failed to load the menu from the file %v: %v", base.FileLocation, err.Error()) + base.baseMenu = &ui.Menu { + Contents: &ui.Void{}, + } + } + base.baseMenu.Create(manager) +} + +func (base *DynamicMenu) Destroy() { + base.baseMenu.Destroy() +} + +func (base *DynamicMenu) Update() { + base.baseMenu.Update() +} + +func (base *DynamicMenu) Draw() { + base.baseMenu.Draw() +} + +func (base *DynamicMenu) GetMousePosition() rl.Vector2 { + return rl.GetMousePosition() +} + +func (base *DynamicMenu) String() string { + var outp, jsonErr = json.Marshal(base) + if jsonErr != nil { + return fmt.Sprintf("Failed to parse: %s", jsonErr.Error()) + } + return string(outp) +} + +// Loads the menu from the file. Does not initialize it +func (base *DynamicMenu) LoadMenu() error { + var file, fErr = os.ReadFile(base.FileLocation) + if fErr != nil { + return fErr + } + var descriptor = descriptors.MenuDescriptor{} + if jsonErr := json.Unmarshal(file, &descriptor); jsonErr != nil { + return jsonErr + } + var parsed, parseErr = descriptor.Parse() + if parseErr != nil { + return parseErr + } + base.baseMenu = parsed + return nil +} |
