summaryrefslogtreecommitdiff
path: root/engine/Dynamic
diff options
context:
space:
mode:
Diffstat (limited to 'engine/Dynamic')
-rw-r--r--engine/Dynamic/Descriptors/Menu.go21
-rw-r--r--engine/Dynamic/Descriptors/UIElement.go20
-rw-r--r--engine/Dynamic/DynamicMenu.go71
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
+}