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() }) 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 }