2021-09-12 00:25:10 +01:00
|
|
|
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()
|
|
|
|
})
|
|
|
|
|
2021-12-16 20:19:40 +00:00
|
|
|
debugBtn, _ := gtk.ButtonNewWithLabel("Debug")
|
|
|
|
layout.Put(debugBtn, 8, 260)
|
|
|
|
debugBtn.SetSizeRequest(334, 34)
|
|
|
|
debugBtn.Connect("clicked", func(b *gtk.Button) {
|
|
|
|
openDebugSettingsWindow(application, mainWindow, state)
|
|
|
|
})
|
|
|
|
|
2021-09-12 00:25:10 +01:00
|
|
|
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
|
|
|
|
}
|