package main import ( "fmt" "image/color" "strings" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) func main() { myApp := app.New() myWindow := myApp.NewWindow("Dice Statistics Calculator") // Output display outputDisplay := canvas.NewText("0", color.White) outputDisplay.TextSize = 32 // Dice input bar diceInputEntry := widget.NewEntry() diceInputEntry.SetPlaceHolder("e.g., 2d20H, 3d6+5") // Dice buttons for quick input diceButtonsContainer := container.NewGridWithColumns(5, widget.NewButton("d4", func() { diceInputEntry.SetText(diceInputEntry.Text + "d4") }), widget.NewButton("d6", func() { diceInputEntry.SetText(diceInputEntry.Text + "d6") }), widget.NewButton("d8", func() { diceInputEntry.SetText(diceInputEntry.Text + "d8") }), widget.NewButton("d10", func() { diceInputEntry.SetText(diceInputEntry.Text + "d10") }), widget.NewButton("d12", func() { diceInputEntry.SetText(diceInputEntry.Text + "d12") }), widget.NewButton("d20", func() { diceInputEntry.SetText(diceInputEntry.Text + "d20") }), widget.NewButton("d100", func() { diceInputEntry.SetText(diceInputEntry.Text + "d100") }), widget.NewButton("dx", func() { diceInputEntry.SetText(diceInputEntry.Text + "dx") }), widget.NewButton("H", func() { diceInputEntry.SetText(diceInputEntry.Text + "H") }), widget.NewButton("L", func() { diceInputEntry.SetText(diceInputEntry.Text + "L") }), ) // Roll button rollButton := widget.NewButton("ROLL", func() { diceInput := strings.TrimSpace(diceInputEntry.Text) if diceInput == "" { outputDisplay.Text = "Error: Empty input" outputDisplay.Refresh() return } result, err := CalculateDice(diceInput) if err != nil { outputDisplay.Text = fmt.Sprintf("Error: %v", err) } else { outputDisplay.Text = fmt.Sprintf("%d", result) } outputDisplay.Refresh() }) rollButton.Importance = widget.HighImportance // Calculator-style number buttons numberButtonsContainer := container.NewGridWithColumns(4, widget.NewButton("AC", func() { diceInputEntry.SetText("") outputDisplay.Text = "0" outputDisplay.Refresh() }), widget.NewButton("()", func() { // TODO: Implement parenthesis logic }), widget.NewButton("%", func() { diceInputEntry.SetText(diceInputEntry.Text + "%") }), widget.NewButton("÷", func() { diceInputEntry.SetText(diceInputEntry.Text + "/") }), createCalcButton("7", diceInputEntry), createCalcButton("8", diceInputEntry), createCalcButton("9", diceInputEntry), widget.NewButton("x", func() { diceInputEntry.SetText(diceInputEntry.Text + "*") }), createCalcButton("4", diceInputEntry), createCalcButton("5", diceInputEntry), createCalcButton("6", diceInputEntry), widget.NewButton("-", func() { diceInputEntry.SetText(diceInputEntry.Text + "-") }), createCalcButton("1", diceInputEntry), createCalcButton("2", diceInputEntry), createCalcButton("3", diceInputEntry), widget.NewButton("+", func() { diceInputEntry.SetText(diceInputEntry.Text + "+") }), createCalcButton("0", diceInputEntry), widget.NewButton(".", func() { diceInputEntry.SetText(diceInputEntry.Text + ".") }), widget.NewButton("⌫", func() { text := diceInputEntry.Text if len(text) > 0 { diceInputEntry.SetText(text[:len(text)-1]) } }), rollButton, ) // Output section outputSection := container.NewVBox( widget.NewLabel("Result:"), outputDisplay, ) // Main layout: output at top, dice bar below, calculator buttons below that mainContent := container.NewBorder( outputSection, container.NewVBox( widget.NewLabel("Dice Expression:"), diceInputEntry, ), nil, nil, container.NewVBox( widget.NewCard("Dice Options", "", diceButtonsContainer), widget.NewCard("Calculator", "", numberButtonsContainer), ), ) myWindow.SetContent(mainContent) myWindow.Resize(fyne.NewSize(400, 600)) myWindow.ShowAndRun() } func createCalcButton(label string, entry *widget.Entry) *widget.Button { return widget.NewButton(label, func() { entry.SetText(entry.Text + label) }) }