go-susapp/settingswindow.go

233 lines
7.0 KiB
Go

package main
import (
"fmt"
"log"
"strconv"
"codehub.onpointcoding.net/sean/go-susapp/enum"
"github.com/gotk3/gotk3/glib"
"github.com/gotk3/gotk3/gtk"
)
var langaugeIdxMap = []int{
enum.GAMEKEYWORD_ALL,
enum.GAMEKEYWORD_OTHER,
enum.GAMEKEYWORD_SPANISH,
enum.GAMEKEYWORD_KOREAN,
enum.GAMEKEYWORD_RUSSIAN,
enum.GAMEKEYWORD_PORTUGUESE,
enum.GAMEKEYWORD_ARABIC,
enum.GAMEKEYWORD_FILIPINO,
enum.GAMEKEYWORD_POLISH,
enum.GAMEKEYWORD_ENGLISH,
enum.GAMEKEYWORD_JAPANESE,
}
var quickChatIdxMap = []int{
enum.FREE_CHAT_OR_QUICK_CHAT,
enum.QUICK_CHAT_ONLY,
}
func openSettingsWindow(application *gtk.Application, mainWindow *gtk.ApplicationWindow, state *State) {
optWindow, err := gtk.ApplicationWindowNew(application)
if err != nil {
log.Fatal("Could not create application window.", err)
}
// Set ApplicationWindow Properties
optWindow.SetTitle("Sus App > Settings")
optWindow.SetDefaultSize(350, 350)
layout, _ := gtk.LayoutNew(nil, nil)
optWindow.Add(layout)
_, usernameEntry := addTextWidget(layout, 8, "Username:", state.Settings.PlayerName)
_, colorEntry := addColorWidget(layout, 50, "Color:", state.Settings.PlayerColor)
_, serverEntry := addTextWidget(layout, 92, "Address:", state.Settings.ServerAddress)
_, portEntry := addTextWidget(layout, 134, "Port:", strconv.FormatInt(state.Settings.ServerPort, 10))
_, languageEntry := addLanguageWidget(layout, 176, "Language:", state.Settings.Language)
_, quickChatEntry := addQuickChatWidget(layout, 218, "Quick Chat:", state.Settings.QuickChatMode)
applyBtn, _ := gtk.ButtonNewWithLabel("Apply")
layout.Put(applyBtn, 8, 218)
applyBtn.SetSizeRequest(334, 34)
applyBtn.Connect("clicked", func(b *gtk.Button) {
//
// Username
//
a1, err := usernameEntry.GetText()
if err == nil {
state.Settings.PlayerName = a1
} else {
showSettingsErrorDialog(optWindow, "Failed to get new player name")
}
//
// Server
//
a2, err := serverEntry.GetText()
if err == nil {
state.Settings.ServerAddress = a2
} else {
showSettingsErrorDialog(optWindow, "Failed to get new server address")
}
//
// Port
//
a3, err := portEntry.GetText()
if err == nil {
b3, err := strconv.ParseInt(a3, 10, 64)
if err == nil {
state.Settings.ServerPort = b3
} else {
showSettingsErrorDialog(optWindow, fmt.Sprintf("Failed to parse port %v as it is not a valid integer", a3))
}
} else {
showSettingsErrorDialog(optWindow, "Failed to get new port")
}
//
// Language
//
a4 := languageEntry.GetActive()
state.Settings.Language = uint32(langaugeIdxMap[a4])
//
// Quick chat mode
//
a5 := quickChatEntry.GetActive()
state.Settings.QuickChatMode = byte(quickChatIdxMap[a5])
//
// Color
//
a6 := colorEntry.GetActive()
state.Settings.PlayerColor = byte(a6)
//
// Save
//
state.SaveSettings()
})
debugBtn, _ := gtk.ButtonNewWithLabel("Debug")
layout.Put(debugBtn, 8, 260)
debugBtn.SetSizeRequest(334, 34)
debugBtn.Connect("clicked", func(b *gtk.Button) {
openDebugSettingsWindow(application, mainWindow, state)
})
optWindow.ShowAll()
}
func showSettingsErrorDialog(optWindow *gtk.ApplicationWindow, msg string) {
mDialog := gtk.MessageDialogNew(optWindow, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg)
mDialog.SetTitle("Sus App Error")
mDialog.Run()
mDialog.Destroy()
}
func addTextWidget(layout *gtk.Layout, y int, txt string, orig string) (*gtk.Label, *gtk.Entry) {
label, _ := gtk.LabelNew(txt)
layout.Put(label, 8, y+6)
entry, _ := gtk.EntryNew()
layout.Put(entry, 100, y)
entry.SetSizeRequest(242, 34)
entry.SetText(orig)
return label, entry
}
func addLanguageWidget(layout *gtk.Layout, y int, txt string, orig uint32) (*gtk.Label, *gtk.ComboBox) {
var origIter *gtk.TreeIter
langStore, _ := gtk.ListStoreNew(glib.TYPE_UINT, glib.TYPE_STRING)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_ALL, "All", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_OTHER, "Other", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_SPANISH, "Spanish", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_KOREAN, "Korean", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_RUSSIAN, "Russian", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_PORTUGUESE, "Portuguese", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_ARABIC, "Arabic", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_FILIPINO, "Filipino", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_POLISH, "Polish", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_ENGLISH, "English", orig, origIter)
_, origIter = addRow(langStore, enum.GAMEKEYWORD_JAPANESE, "Japanese", orig, origIter)
label, _ := gtk.LabelNew(txt)
layout.Put(label, 8, y+6)
combo, _ := gtk.ComboBoxNewWithModel(langStore)
rendererText, _ := gtk.CellRendererTextNew()
combo.PackStart(rendererText, true)
combo.AddAttribute(rendererText, "text", 1)
combo.SetSizeRequest(242, 34)
combo.SetActiveIter(origIter)
layout.Put(combo, 100, y)
return label, combo
}
func addQuickChatWidget(layout *gtk.Layout, y int, txt string, orig byte) (*gtk.Label, *gtk.ComboBox) {
var origIter *gtk.TreeIter
modeStore, _ := gtk.ListStoreNew(glib.TYPE_UINT, glib.TYPE_STRING)
_, origIter = addRow(modeStore, enum.FREE_CHAT_OR_QUICK_CHAT, "Free Chat or Quick Chat", uint32(orig), origIter)
_, origIter = addRow(modeStore, enum.QUICK_CHAT_ONLY, "Quick Chat Only", uint32(orig), origIter)
label, _ := gtk.LabelNew(txt)
layout.Put(label, 8, y+6)
combo, _ := gtk.ComboBoxNewWithModel(modeStore)
rendererText, _ := gtk.CellRendererTextNew()
combo.PackStart(rendererText, true)
combo.AddAttribute(rendererText, "text", 1)
combo.SetSizeRequest(242, 34)
combo.SetActiveIter(origIter)
layout.Put(combo, 100, y)
return label, combo
}
func addColorWidget(layout *gtk.Layout, y int, txt string, orig byte) (*gtk.Label, *gtk.ComboBox) {
var origIter *gtk.TreeIter
modeStore, _ := gtk.ListStoreNew(glib.TYPE_UINT, glib.TYPE_STRING)
for i := 0; i < enum.GetPlayerTotalColors(); i++ {
_, origIter = addRow(modeStore, uint32(i), enum.GetPlayerColorName(i), uint32(orig), origIter)
}
label, _ := gtk.LabelNew(txt)
layout.Put(label, 8, y+6)
combo, _ := gtk.ComboBoxNewWithModel(modeStore)
rendererText, _ := gtk.CellRendererTextNew()
combo.PackStart(rendererText, true)
combo.AddAttribute(rendererText, "text", 1)
combo.SetSizeRequest(242, 34)
combo.SetActiveIter(origIter)
layout.Put(combo, 100, y)
return label, combo
}
// Append a row to the list store for the tree view
func addRow(listStore *gtk.ListStore, id uint32, feature string, origId uint32, origIter *gtk.TreeIter) (*gtk.TreeIter, *gtk.TreeIter) {
// Get an iterator for a new row at the end of the list store
iter := listStore.Append()
if id == origId {
origIter = iter
}
// Set the contents of the list store row that the iterator represents
err := listStore.Set(iter,
[]int{0, 1},
[]interface{}{id, feature})
if err != nil {
log.Fatal("Unable to add row:", err)
}
return iter, origIter
}