Skip to content

Commit

Permalink
X, Y position
Browse files Browse the repository at this point in the history
  • Loading branch information
TheAndreiM committed Jan 6, 2025
1 parent d4f9bac commit 930a639
Show file tree
Hide file tree
Showing 4 changed files with 285 additions and 30 deletions.
10 changes: 10 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,19 @@ <h1>JukaGUI Generator</h1>
<div class="element" draggable="true" data-type="button">Button</div>
<div class="element" draggable="true" data-type="label">Label</div>
<div class="element" draggable="true" data-type="image">Image</div>
<div class="element" draggable="true" data-type="input">Input</div>
</div>
<div class="color-controls">
<label for="hiddenSetting" class="control-label" style="display:inline;">Attributes:</label>
<select id="hiddenSetting" class="trigger-selector" style="visibility: hidden;">
</select>

<label for="datax" class="control-label" style="display:none;">X:</label>
<span id="datax" class="color-picker" style="display:none;" ></span>

<label for="datay" class="control-label" style="display:none;">Y:</label>
<span id="datay" class="color-picker" style="display:none;"></span>

<!-- Color Picker for Modifying Text Color -->
<label for="colorPicker" class="control-label" style="display:none;">Font Color:</label>
<input type="color" id="colorPicker" class="color-picker" value="#000000" style="display:none;" />
Expand All @@ -95,6 +103,8 @@ <h1>JukaGUI Generator</h1>
<option value="exit">Exit</option>
<option value="external_app">Trigger External App</option>
<option value="set_variable">Set Variable</option>
<option value="play_video">Play Video</option>
<option value="play_image">Fullscreen Image</option>
</select>
<!-- Scene Selector for Change Scene Trigger -->
<select id="sceneChangeSelector" class="scene-change-selector" style="display:none;">
Expand Down
46 changes: 45 additions & 1 deletion player/jukaconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"big": 36,
"medium": 24,
"small": 18
}
},
"inputText": ""
},
"scenes": [
{
Expand Down Expand Up @@ -61,6 +62,36 @@
"width": "",
"height": ""
},
{
"type": "button",
"text": "two",
"color": "#000000",
"x": 559,
"y": 98,
"font": "title",
"bgColor": "#ffffff",
"trigger": "change_scene",
"triggerTarget": "Scene 2",
"triggerValue": "null",
"image": null,
"width": "",
"height": ""
},
{
"type": "button",
"text": "three",
"color": "#000000",
"x": 559,
"y": 338,
"font": "title",
"bgColor": "#ffffff",
"trigger": "change_scene",
"triggerTarget": "Scene 2",
"triggerValue": "null",
"image": null,
"width": "",
"height": ""
},
{
"type": "label",
"text": "Label",
Expand All @@ -74,6 +105,19 @@
"image": null,
"width": "",
"height": ""
},
{
"type": "button",
"text": "Enter Text",
"color": "#000000",
"x": 300,
"y": 350,
"font": "medium",
"bgColor": "#ffffff",
"trigger": "input",
"triggerTarget": "inputText",
"width": "200",
"height": "50"
}
]
},
Expand Down
220 changes: 194 additions & 26 deletions player/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"log"
"os"
"os/exec"
"runtime/debug"
"strconv"
"strings"
Expand Down Expand Up @@ -46,6 +47,7 @@ type Variables struct {
Medium int `json:"medium"`
Small int `json:"small"`
} `json:"fontSizes"`
InputText string `json:"inputText"`
}

type SceneConfig struct {
Expand All @@ -68,6 +70,24 @@ type Element struct {
Image string `json:"image"`
Width string `json:"width"`
Height string `json:"height"`
Video string `json:"video"`
Variable string `json:"variable"`
}

var videoPlayed = false // rack if video has been played
var inputText string // Global variable to store input text
var keyboard [][]string
var keyboardPosX, keyboardPosY int
var virtualKeyboardActive = false

func initKeyboard() {
keyboard = [][]string{
{"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"},
{"A", "S", "D", "F", "G", "H", "J", "K", "L"},
{"Z", "X", "C", "V", "B", "N", "M"},
{"SPACE", "BACK", "ENTER"},
}
keyboardPosX, keyboardPosY = 0, 0
}

var currentSceneIndex int
Expand Down Expand Up @@ -193,6 +213,66 @@ func renderText(renderer *sdl.Renderer, font *ttf.Font, text string, color sdl.C
return textWidth, textHeight
}

func renderButton(renderer *sdl.Renderer, config *Config, element Element) {
defaultTextColor := sdl.Color{R: 0, G: 0, B: 0, A: 255} // Default to black
defaultBgColor := sdl.Color{R: 255, G: 255, B: 255, A: 255} // Default to white

color := resolveColor(config, element.Color, defaultTextColor)
bgColor := resolveColor(config, element.BgColor, defaultBgColor)

// Render button background
renderer.SetDrawColor(bgColor.R, bgColor.G, bgColor.B, bgColor.A)
renderer.FillRect(&sdl.Rect{X: element.X, Y: element.Y, W: 200, H: 50})

// Render button text
font, _ := getFontAndSize(config, element.Font)
renderText(renderer, font, element.Text, color, element.X+100, element.Y+25)
}

func renderKeyboard(renderer *sdl.Renderer) {
startX, startY := 50, 450
keyWidth, keyHeight, padding := 40, 40, 10

for i, row := range keyboard {
for j, key := range row {
x := startX + j*(keyWidth+padding)
y := startY + i*(keyHeight+padding)

// Draw key background
renderer.SetDrawColor(255, 255, 255, 255) // White background
if i == keyboardPosY && j == keyboardPosX {
renderer.SetDrawColor(0, 255, 0, 255) // Green background for selected key
}
renderer.FillRect(&sdl.Rect{X: int32(x), Y: int32(y), W: int32(keyWidth), H: int32(keyHeight)})

// Draw key text
renderer.SetDrawColor(0, 0, 0, 255) // Black text
renderText(renderer, nil, key, sdl.Color{R: 0, G: 0, B: 0, A: 255}, int32(x+keyWidth/2), int32(y+keyHeight/2))
}
}
}

func isInputButtonSelected(element Element) bool {
return virtualKeyboardActive
}

func handleKeyboardInput(config *Config) {
selectedKey := keyboard[keyboardPosY][keyboardPosX]
switch selectedKey {
case "SPACE":
inputText += " "
case "BACK":
if len(inputText) > 0 {
inputText = inputText[:len(inputText)-1]
}
case "ENTER":
config.Variables.InputText = inputText
virtualKeyboardActive = false // Hide virtual keyboard after setting the variable
default:
inputText += selectedKey
}
}

func renderScene(renderer *sdl.Renderer, config *Config, sceneConfig SceneConfig) {
fontCache := make(map[string]*ttf.Font)
bgTexture := resolveBackground(renderer, config, sceneConfig.Background)
Expand All @@ -219,22 +299,63 @@ func renderScene(renderer *sdl.Renderer, config *Config, sceneConfig SceneConfig
fontCache[element.Font] = font
}

if element.Type == "image" && element.Image != "" {
imageTexture, err := img.LoadTexture(renderer, element.Image)
if err == nil {
defer imageTexture.Destroy()
switch element.Type {
case "image":
if element.Image != "" {
imageTexture, err := img.LoadTexture(renderer, element.Image)
if err == nil {
defer imageTexture.Destroy()
width, err := strconv.Atoi(element.Width)
if err != nil {
width = 0 // Default width if conversion fails
}
height, err := strconv.Atoi(element.Height)
if err != nil {
height = 0 // Default height if conversion fails
}
imageRect := sdl.Rect{X: element.X, Y: element.Y, W: int32(width), H: int32(height)}
renderer.Copy(imageTexture, nil, &imageRect)
}
}
case "input":
renderButton(renderer, config, element)
if isInputButtonSelected(element) {
virtualKeyboardActive = true
renderKeyboard(renderer)
}
case "video":
if !videoPlayed && element.Video != "" {
width, err := strconv.Atoi(element.Width)
if err != nil {
width = 0 // Default width if conversion fails
fmt.Println("Error converting width:", err)
continue
}
height, err := strconv.Atoi(element.Height)
if err != nil {
height = 0 // Default height if conversion fails
fmt.Println("Error converting height:", err)
continue
}
imageRect := sdl.Rect{X: element.X, Y: element.Y, W: int32(width), H: int32(height)}
renderer.Copy(imageTexture, nil, &imageRect)

// Construct the ffplay command with the correct parameters
cmd := exec.Command("ffmpeg/ffplay", element.Video,
"-noborder",
"-x", strconv.Itoa(width),
"-y", strconv.Itoa(height),
"-left", strconv.Itoa(int(element.X)),
"-top", strconv.Itoa(int(element.Y)),
"-autoexit")

// Start the ffplay process
if err := cmd.Start(); err != nil {
fmt.Println("Error starting ffplay:", err)
}
videoPlayed = true

/*if err := cmd.Wait(); err != nil {
fmt.Println("Error waiting for ffplay:", err)
}*/
}
} else {
default:
// Calculate text dimensions
textWidth, textHeight := getTextDimensions(font, element.Text)
width := textWidth + 20 // Add padding to text width
Expand Down Expand Up @@ -359,15 +480,38 @@ func main() {
switch e := event.(type) {
case *sdl.KeyboardEvent: // Use pointer receiver
if e.Type == sdl.KEYDOWN {
switch e.Keysym.Sym {
case sdl.K_UP, sdl.K_w:
moveSelection(config, -1)
case sdl.K_DOWN, sdl.K_s:
moveSelection(config, 1)
case sdl.K_RETURN, sdl.K_KP_ENTER:
triggerSelectedElement(config)
case sdl.K_ESCAPE:
running = false
if virtualKeyboardActive {
switch e.Keysym.Sym {
case sdl.K_UP, sdl.K_w:
if keyboardPosY > 0 {
keyboardPosY--
}
case sdl.K_DOWN, sdl.K_s:
if keyboardPosY < len(keyboard)-1 {
keyboardPosY++
}
case sdl.K_LEFT, sdl.K_a:
if keyboardPosX > 0 {
keyboardPosX--
}
case sdl.K_RIGHT, sdl.K_d:
if keyboardPosX < len(keyboard[keyboardPosY])-1 {
keyboardPosX++
}
case sdl.K_RETURN:
handleKeyboardInput(config)
}
} else {
switch e.Keysym.Sym {
case sdl.K_UP, sdl.K_w:
moveSelection(config, -1)
case sdl.K_DOWN, sdl.K_s:
moveSelection(config, 1)
case sdl.K_RETURN, sdl.K_KP_ENTER:
triggerSelectedElement(config)
case sdl.K_ESCAPE:
running = false
}
}
}
case *sdl.TextInputEvent: // Use pointer receiver
Expand All @@ -392,13 +536,36 @@ func main() {
}
case *sdl.ControllerButtonEvent: // Use pointer receiver
if e.Type == sdl.CONTROLLERBUTTONDOWN {
switch e.Button {
case sdl.CONTROLLER_BUTTON_DPAD_UP:
moveSelection(config, -1)
case sdl.CONTROLLER_BUTTON_DPAD_DOWN:
moveSelection(config, 1)
case sdl.CONTROLLER_BUTTON_A:
triggerSelectedElement(config)
if virtualKeyboardActive {
switch e.Button {
case sdl.CONTROLLER_BUTTON_DPAD_UP:
if keyboardPosY > 0 {
keyboardPosY--
}
case sdl.CONTROLLER_BUTTON_DPAD_DOWN:
if keyboardPosY < len(keyboard)-1 {
keyboardPosY++
}
case sdl.CONTROLLER_BUTTON_DPAD_LEFT:
if keyboardPosX > 0 {
keyboardPosX--
}
case sdl.CONTROLLER_BUTTON_DPAD_RIGHT:
if keyboardPosX < len(keyboard[keyboardPosY])-1 {
keyboardPosX++
}
case sdl.CONTROLLER_BUTTON_A, sdl.CONTROLLER_BUTTON_B:
handleKeyboardInput(config)
}
} else {
switch e.Button {
case sdl.CONTROLLER_BUTTON_DPAD_UP:
moveSelection(config, -1)
case sdl.CONTROLLER_BUTTON_DPAD_DOWN:
moveSelection(config, 1)
case sdl.CONTROLLER_BUTTON_A, sdl.CONTROLLER_BUTTON_B:
triggerSelectedElement(config)
}
}
}
//default:
Expand All @@ -423,7 +590,7 @@ func moveSelection(config *Config, direction int) {
for elements[selectedButtonIndex].Type != "button" {
selectedButtonIndex = (selectedButtonIndex + direction + numElements) % numElements
}
//fmt.Println("Selected button index:", selectedButtonIndex)
fmt.Println("Selected button index:", selectedButtonIndex)
}

func triggerSelectedElement(config *Config) {
Expand Down Expand Up @@ -451,6 +618,7 @@ func handleTrigger(config *Config, element Element) {
if scene.Name == element.TriggerTarget {
currentSceneIndex = i
selectedButtonIndex = 0
videoPlayed = false
//fmt.Println("Scene changed to:", element.TriggerTarget)
break
}
Expand Down
Loading

0 comments on commit 930a639

Please sign in to comment.