From 127e1b8ab9e7168f86ce1604365da10eb64ec23b Mon Sep 17 00:00:00 2001 From: "Stanislav N. aka pztrn" Date: Sat, 10 Nov 2018 13:21:53 +0500 Subject: [PATCH] Updated to latest GTK2 bindings API and moved to Gitlab. --- cache/cache_object.go | 50 +- cache/cache_profiles.go | 154 +-- cache/cache_servers.go | 228 ++-- cache/exported.go | 18 +- cachemodels/profile.go | 6 +- cachemodels/server.go | 22 +- clipboardwatcher/exported.go | 20 +- context/context_object.go | 156 +-- database/database_object.go | 119 +-- database/exported.go | 12 +- doc/installation/macos/make-app.sh | 8 +- launcher/launcher_object.go | 202 ++-- requester/exported.go | 36 +- requester/pooler.go | 458 ++++---- timer/exported.go | 24 +- translator/exported.go | 14 +- ui/gtk2/about.go | 48 +- ui/gtk2/exported.go | 18 +- ui/gtk2/favorite.go | 436 ++++---- ui/gtk2/mainwindow.go | 1279 +++++++++++----------- ui/gtk2/mainwindow_init.go | 1423 ++++++++++++------------- ui/gtk2/mainwindow_launch.go | 426 ++++---- ui/gtk2/mainwindow_servers_sorting.go | 146 +-- ui/gtk2/options.go | 604 +++++------ ui/gtk2/options_profile.go | 641 ++++++----- ui/gtk2/server_cvars.go | 120 +-- urtrator.go | 30 +- 27 files changed, 3347 insertions(+), 3351 deletions(-) diff --git a/cache/cache_object.go b/cache/cache_object.go index e27c5ac..76f872a 100644 --- a/cache/cache_object.go +++ b/cache/cache_object.go @@ -10,41 +10,41 @@ package cache import ( - // stdlib - "fmt" - "sync" + // stdlib + "fmt" + "sync" - // local - "github.com/pztrn/urtrator/cachemodels" + // local + "gitlab.com/pztrn/urtrator/cachemodels" ) type Cache struct { - // Profiles cache. - Profiles map[string]*cachemodels.Profile - // Profiles cache mutex. - ProfilesMutex sync.Mutex - // Servers cache. - Servers map[string]*cachemodels.Server - // Servers cache mutex. - ServersMutex sync.Mutex + // Profiles cache. + Profiles map[string]*cachemodels.Profile + // Profiles cache mutex. + ProfilesMutex sync.Mutex + // Servers cache. + Servers map[string]*cachemodels.Server + // Servers cache mutex. + ServersMutex sync.Mutex } func (c *Cache) Initialize() { - fmt.Println("Initializing cache...") - c.initializeStorages() - c.LoadServers(map[string]string{}) + fmt.Println("Initializing cache...") + c.initializeStorages() + c.LoadServers(map[string]string{}) - Eventer.AddEventHandler("deleteProfile", c.deleteProfile) - Eventer.AddEventHandler("flushProfiles", c.FlushProfiles) - Eventer.AddEventHandler("loadProfiles", c.LoadProfiles) + Eventer.AddEventHandler("deleteProfile", c.deleteProfile) + Eventer.AddEventHandler("flushProfiles", c.FlushProfiles) + Eventer.AddEventHandler("loadProfiles", c.LoadProfiles) - Eventer.AddEventHandler("flushServers", c.FlushServers) - Eventer.AddEventHandler("loadServersIntoCache", c.LoadServers) + Eventer.AddEventHandler("flushServers", c.FlushServers) + Eventer.AddEventHandler("loadServersIntoCache", c.LoadServers) } func (c *Cache) initializeStorages() { - // Profiles cache. - c.Profiles = make(map[string]*cachemodels.Profile) - // Servers cache. - c.Servers = make(map[string]*cachemodels.Server) + // Profiles cache. + c.Profiles = make(map[string]*cachemodels.Profile) + // Servers cache. + c.Servers = make(map[string]*cachemodels.Server) } diff --git a/cache/cache_profiles.go b/cache/cache_profiles.go index b26be53..ace8684 100644 --- a/cache/cache_profiles.go +++ b/cache/cache_profiles.go @@ -10,105 +10,105 @@ package cache import ( - // stdlib - "fmt" - "strconv" + // stdlib + "fmt" + "strconv" - // local - "github.com/pztrn/urtrator/cachemodels" - "github.com/pztrn/urtrator/datamodels" + // local + "gitlab.com/pztrn/urtrator/cachemodels" + "gitlab.com/pztrn/urtrator/datamodels" ) func (c *Cache) CreateProfile(name string) { - fmt.Println("Creating profile " + name) - _, ok := c.Profiles[name] + fmt.Println("Creating profile " + name) + _, ok := c.Profiles[name] - if !ok { - c.ProfilesMutex.Lock() - c.Profiles[name] = &cachemodels.Profile{} - c.Profiles[name].Profile = &datamodels.Profile{} - c.ProfilesMutex.Unlock() - } + if !ok { + c.ProfilesMutex.Lock() + c.Profiles[name] = &cachemodels.Profile{} + c.Profiles[name].Profile = &datamodels.Profile{} + c.ProfilesMutex.Unlock() + } } func (c *Cache) deleteProfile(data map[string]string) { - fmt.Println("Deleting profile " + data["profile_name"]) + fmt.Println("Deleting profile " + data["profile_name"]) - c.ProfilesMutex.Lock() - _, ok := c.Profiles[data["profile_name"]] - c.ProfilesMutex.Unlock() - if ok { - c.ProfilesMutex.Lock() - delete(c.Profiles, data["profile_name"]) - c.ProfilesMutex.Unlock() - } + c.ProfilesMutex.Lock() + _, ok := c.Profiles[data["profile_name"]] + c.ProfilesMutex.Unlock() + if ok { + c.ProfilesMutex.Lock() + delete(c.Profiles, data["profile_name"]) + c.ProfilesMutex.Unlock() + } - c.ProfilesMutex.Lock() - _, ok1 := c.Profiles[data["profile_name"]] - c.ProfilesMutex.Unlock() - if !ok1 { - Database.Db.MustExec(Database.Db.Rebind("DELETE FROM urt_profiles WHERE name=?"), data["profile_name"]) - fmt.Println("Profile deleted") - } else { - fmt.Println("Something goes wrong! Profile is still here!") - } + c.ProfilesMutex.Lock() + _, ok1 := c.Profiles[data["profile_name"]] + c.ProfilesMutex.Unlock() + if !ok1 { + Database.Db.MustExec(Database.Db.Rebind("DELETE FROM urt_profiles WHERE name=?"), data["profile_name"]) + fmt.Println("Profile deleted") + } else { + fmt.Println("Something goes wrong! Profile is still here!") + } } func (c *Cache) FlushProfiles(data map[string]string) { - fmt.Println("Flushing profiles to database...") + fmt.Println("Flushing profiles to database...") - raw_profiles := []datamodels.Profile{} - err := Database.Db.Select(&raw_profiles, "SELECT * FROM urt_profiles") - if err != nil { - fmt.Println(err.Error()) - } + raw_profiles := []datamodels.Profile{} + err := Database.Db.Select(&raw_profiles, "SELECT * FROM urt_profiles") + if err != nil { + fmt.Println(err.Error()) + } - cached_profiles := make(map[string]*datamodels.Profile) - for i := range raw_profiles { - cached_profiles[raw_profiles[i].Name] = c.Profiles[raw_profiles[i].Name].Profile - } + cached_profiles := make(map[string]*datamodels.Profile) + for i := range raw_profiles { + cached_profiles[raw_profiles[i].Name] = c.Profiles[raw_profiles[i].Name].Profile + } - new_profiles := make(map[string]*datamodels.Profile) + new_profiles := make(map[string]*datamodels.Profile) - c.ProfilesMutex.Lock() - for _, profile := range c.Profiles { - _, ok := cached_profiles[profile.Profile.Name] - if !ok { - fmt.Println("Flushing new profile " + profile.Profile.Name) - new_profiles[profile.Profile.Name] = profile.Profile - } - } - c.ProfilesMutex.Unlock() + c.ProfilesMutex.Lock() + for _, profile := range c.Profiles { + _, ok := cached_profiles[profile.Profile.Name] + if !ok { + fmt.Println("Flushing new profile " + profile.Profile.Name) + new_profiles[profile.Profile.Name] = profile.Profile + } + } + c.ProfilesMutex.Unlock() - tx := Database.Db.MustBegin() - fmt.Println("Adding new profiles...") - for _, profile := range new_profiles { - tx.NamedExec("INSERT INTO urt_profiles (name, version, binary, second_x_session, additional_parameters, profile_path) VALUES (:name, :version, :binary, :second_x_session, :additional_parameters, :profile_path)", &profile) - } - fmt.Println("Updating existing profiles...") - for _, profile := range cached_profiles { - fmt.Println(fmt.Sprintf("%+v", profile)) - tx.NamedExec("UPDATE urt_profiles SET name=:name, version=:version, binary=:binary, second_x_session=:second_x_session, additional_parameters=:additional_parameters, profile_path=:profile_path WHERE name=:name", &profile) - } - tx.Commit() - fmt.Println("Done") + tx := Database.Db.MustBegin() + fmt.Println("Adding new profiles...") + for _, profile := range new_profiles { + tx.NamedExec("INSERT INTO urt_profiles (name, version, binary, second_x_session, additional_parameters, profile_path) VALUES (:name, :version, :binary, :second_x_session, :additional_parameters, :profile_path)", &profile) + } + fmt.Println("Updating existing profiles...") + for _, profile := range cached_profiles { + fmt.Println(fmt.Sprintf("%+v", profile)) + tx.NamedExec("UPDATE urt_profiles SET name=:name, version=:version, binary=:binary, second_x_session=:second_x_session, additional_parameters=:additional_parameters, profile_path=:profile_path WHERE name=:name", &profile) + } + tx.Commit() + fmt.Println("Done") } func (c *Cache) LoadProfiles(data map[string]string) { - fmt.Println("Loading profiles to cache...") + fmt.Println("Loading profiles to cache...") - raw_profiles := []datamodels.Profile{} - err := Database.Db.Select(&raw_profiles, "SELECT * FROM urt_profiles") - if err != nil { - fmt.Println(err.Error()) - } + raw_profiles := []datamodels.Profile{} + err := Database.Db.Select(&raw_profiles, "SELECT * FROM urt_profiles") + if err != nil { + fmt.Println(err.Error()) + } - c.ProfilesMutex.Lock() - for _, profile := range raw_profiles { - c.Profiles[profile.Name] = &cachemodels.Profile{} - c.Profiles[profile.Name].Profile = &profile - } - c.ProfilesMutex.Unlock() + c.ProfilesMutex.Lock() + for _, profile := range raw_profiles { + c.Profiles[profile.Name] = &cachemodels.Profile{} + c.Profiles[profile.Name].Profile = &profile + } + c.ProfilesMutex.Unlock() - fmt.Println("Load completed. Loaded " + strconv.Itoa(len(c.Profiles)) + " profiles.") + fmt.Println("Load completed. Loaded " + strconv.Itoa(len(c.Profiles)) + " profiles.") } diff --git a/cache/cache_servers.go b/cache/cache_servers.go index 0b202ee..4ef73e4 100644 --- a/cache/cache_servers.go +++ b/cache/cache_servers.go @@ -10,135 +10,135 @@ package cache import ( - // stdlib - "fmt" + // stdlib + "fmt" - // local - "github.com/pztrn/urtrator/cachemodels" - "github.com/pztrn/urtrator/datamodels" + // local + "gitlab.com/pztrn/urtrator/cachemodels" + "gitlab.com/pztrn/urtrator/datamodels" ) func (c *Cache) CreateServer(addr string) { - _, ok := c.Servers[addr] - if !ok { - c.ServersMutex.Lock() - c.Servers[addr] = &cachemodels.Server{} - c.Servers[addr].Server = &datamodels.Server{} - c.ServersMutex.Unlock() - } else { - fmt.Println("Server " + addr + " already exist.") - } + _, ok := c.Servers[addr] + if !ok { + c.ServersMutex.Lock() + c.Servers[addr] = &cachemodels.Server{} + c.Servers[addr].Server = &datamodels.Server{} + c.ServersMutex.Unlock() + } else { + fmt.Println("Server " + addr + " already exist.") + } } // Flush servers to database. func (c *Cache) FlushServers(data map[string]string) { - fmt.Println("Updating servers information in database...") - raw_cached := []datamodels.Server{} - Database.Db.Select(&raw_cached, "SELECT * FROM servers") + fmt.Println("Updating servers information in database...") + raw_cached := []datamodels.Server{} + Database.Db.Select(&raw_cached, "SELECT * FROM servers") - // Create map[string]*datamodels.Server once, so we won't iterate - // over slice of datamodels.Server everytime. - cached_servers := make(map[string]*datamodels.Server) - for s := range raw_cached { - mapping_item_name := raw_cached[s].Ip + ":" + raw_cached[s].Port - cached_servers[mapping_item_name] = &raw_cached[s] - } + // Create map[string]*datamodels.Server once, so we won't iterate + // over slice of datamodels.Server everytime. + cached_servers := make(map[string]*datamodels.Server) + for s := range raw_cached { + mapping_item_name := raw_cached[s].Ip + ":" + raw_cached[s].Port + cached_servers[mapping_item_name] = &raw_cached[s] + } - new_servers := make(map[string]*datamodels.Server) + new_servers := make(map[string]*datamodels.Server) - // Update our cached mapping. - for _, s := range c.Servers { - mapping_item_name := s.Server.Ip + ":" + s.Server.Port - _, ok := cached_servers[mapping_item_name] - if !ok { - fmt.Println(mapping_item_name + " not found!") - new_servers[mapping_item_name] = &datamodels.Server{} - new_servers[mapping_item_name].Ip = s.Server.Ip - new_servers[mapping_item_name].Port = s.Server.Port - new_servers[mapping_item_name].Name = s.Server.Name - new_servers[mapping_item_name].Players = s.Server.Players - new_servers[mapping_item_name].Bots = s.Server.Bots - new_servers[mapping_item_name].Maxplayers = s.Server.Maxplayers - new_servers[mapping_item_name].Ping = s.Server.Ping - new_servers[mapping_item_name].Map = s.Server.Map - new_servers[mapping_item_name].Gamemode = s.Server.Gamemode - new_servers[mapping_item_name].Version = s.Server.Version - new_servers[mapping_item_name].ExtendedConfig = s.Server.ExtendedConfig - new_servers[mapping_item_name].PlayersInfo = s.Server.PlayersInfo - new_servers[mapping_item_name].IsPrivate = s.Server.IsPrivate - new_servers[mapping_item_name].Favorite = s.Server.Favorite - new_servers[mapping_item_name].ProfileToUse = s.Server.ProfileToUse - new_servers[mapping_item_name].Password = s.Server.Password - } else { - cached_servers[mapping_item_name].Ip = s.Server.Ip - cached_servers[mapping_item_name].Port = s.Server.Port - cached_servers[mapping_item_name].Name = s.Server.Name - cached_servers[mapping_item_name].Players = s.Server.Players - cached_servers[mapping_item_name].Bots = s.Server.Bots - cached_servers[mapping_item_name].Maxplayers = s.Server.Maxplayers - cached_servers[mapping_item_name].Ping = s.Server.Ping - cached_servers[mapping_item_name].Map = s.Server.Map - cached_servers[mapping_item_name].Gamemode = s.Server.Gamemode - cached_servers[mapping_item_name].Version = s.Server.Version - cached_servers[mapping_item_name].ExtendedConfig = s.Server.ExtendedConfig - cached_servers[mapping_item_name].PlayersInfo = s.Server.PlayersInfo - cached_servers[mapping_item_name].IsPrivate = s.Server.IsPrivate - cached_servers[mapping_item_name].Favorite = s.Server.Favorite - cached_servers[mapping_item_name].ProfileToUse = s.Server.ProfileToUse - cached_servers[mapping_item_name].Password = s.Server.Password - } - } + // Update our cached mapping. + for _, s := range c.Servers { + mapping_item_name := s.Server.Ip + ":" + s.Server.Port + _, ok := cached_servers[mapping_item_name] + if !ok { + fmt.Println(mapping_item_name + " not found!") + new_servers[mapping_item_name] = &datamodels.Server{} + new_servers[mapping_item_name].Ip = s.Server.Ip + new_servers[mapping_item_name].Port = s.Server.Port + new_servers[mapping_item_name].Name = s.Server.Name + new_servers[mapping_item_name].Players = s.Server.Players + new_servers[mapping_item_name].Bots = s.Server.Bots + new_servers[mapping_item_name].Maxplayers = s.Server.Maxplayers + new_servers[mapping_item_name].Ping = s.Server.Ping + new_servers[mapping_item_name].Map = s.Server.Map + new_servers[mapping_item_name].Gamemode = s.Server.Gamemode + new_servers[mapping_item_name].Version = s.Server.Version + new_servers[mapping_item_name].ExtendedConfig = s.Server.ExtendedConfig + new_servers[mapping_item_name].PlayersInfo = s.Server.PlayersInfo + new_servers[mapping_item_name].IsPrivate = s.Server.IsPrivate + new_servers[mapping_item_name].Favorite = s.Server.Favorite + new_servers[mapping_item_name].ProfileToUse = s.Server.ProfileToUse + new_servers[mapping_item_name].Password = s.Server.Password + } else { + cached_servers[mapping_item_name].Ip = s.Server.Ip + cached_servers[mapping_item_name].Port = s.Server.Port + cached_servers[mapping_item_name].Name = s.Server.Name + cached_servers[mapping_item_name].Players = s.Server.Players + cached_servers[mapping_item_name].Bots = s.Server.Bots + cached_servers[mapping_item_name].Maxplayers = s.Server.Maxplayers + cached_servers[mapping_item_name].Ping = s.Server.Ping + cached_servers[mapping_item_name].Map = s.Server.Map + cached_servers[mapping_item_name].Gamemode = s.Server.Gamemode + cached_servers[mapping_item_name].Version = s.Server.Version + cached_servers[mapping_item_name].ExtendedConfig = s.Server.ExtendedConfig + cached_servers[mapping_item_name].PlayersInfo = s.Server.PlayersInfo + cached_servers[mapping_item_name].IsPrivate = s.Server.IsPrivate + cached_servers[mapping_item_name].Favorite = s.Server.Favorite + cached_servers[mapping_item_name].ProfileToUse = s.Server.ProfileToUse + cached_servers[mapping_item_name].Password = s.Server.Password + } + } - tx := Database.Db.MustBegin() - fmt.Println("Adding new servers...") - if len(new_servers) > 0 { - for _, srv := range new_servers { - tx.NamedExec("INSERT INTO servers (ip, port, name, ping, players, maxplayers, gamemode, map, version, extended_config, players_info, is_private, favorite, profile_to_use, bots) VALUES (:ip, :port, :name, :ping, :players, :maxplayers, :gamemode, :map, :version, :extended_config, :players_info, :is_private, :favorite, :profile_to_use, :bots)", srv) - } - } - fmt.Println("Updating cached servers...") - for _, srv := range cached_servers { - _, err := tx.NamedExec("UPDATE servers SET name=:name, players=:players, maxplayers=:maxplayers, gamemode=:gamemode, map=:map, ping=:ping, version=:version, extended_config=:extended_config, favorite=:favorite, password=:password, players_info=:players_info, is_private=:is_private, profile_to_use=:profile_to_use, bots=:bots WHERE ip=:ip AND port=:port", &srv) - if err != nil { - fmt.Println(err.Error()) - } - } + tx := Database.Db.MustBegin() + fmt.Println("Adding new servers...") + if len(new_servers) > 0 { + for _, srv := range new_servers { + tx.NamedExec("INSERT INTO servers (ip, port, name, ping, players, maxplayers, gamemode, map, version, extended_config, players_info, is_private, favorite, profile_to_use, bots) VALUES (:ip, :port, :name, :ping, :players, :maxplayers, :gamemode, :map, :version, :extended_config, :players_info, :is_private, :favorite, :profile_to_use, :bots)", srv) + } + } + fmt.Println("Updating cached servers...") + for _, srv := range cached_servers { + _, err := tx.NamedExec("UPDATE servers SET name=:name, players=:players, maxplayers=:maxplayers, gamemode=:gamemode, map=:map, ping=:ping, version=:version, extended_config=:extended_config, favorite=:favorite, password=:password, players_info=:players_info, is_private=:is_private, profile_to_use=:profile_to_use, bots=:bots WHERE ip=:ip AND port=:port", &srv) + if err != nil { + fmt.Println(err.Error()) + } + } - tx.Commit() - fmt.Println("Done") + tx.Commit() + fmt.Println("Done") } func (c *Cache) LoadServers(data map[string]string) { - fmt.Println("Loading servers into cache...") - c.Servers = make(map[string]*cachemodels.Server) - // Getting servers from database. - raw_servers := []datamodels.Server{} - err := Database.Db.Select(&raw_servers, "SELECT * FROM servers") - if err != nil { - fmt.Println(err.Error()) - } + fmt.Println("Loading servers into cache...") + c.Servers = make(map[string]*cachemodels.Server) + // Getting servers from database. + raw_servers := []datamodels.Server{} + err := Database.Db.Select(&raw_servers, "SELECT * FROM servers") + if err != nil { + fmt.Println(err.Error()) + } - // Due to nature of pointers and goroutines thing (?) this should - // be done in this way. - for _, server := range raw_servers { - key := server.Ip + ":" + server.Port - c.CreateServer(key) - c.Servers[key].Server.Name = server.Name - c.Servers[key].Server.Ip = server.Ip - c.Servers[key].Server.Port = server.Port - c.Servers[key].Server.Players = server.Players - c.Servers[key].Server.Bots = server.Bots - c.Servers[key].Server.Maxplayers = server.Maxplayers - c.Servers[key].Server.Ping = server.Ping - c.Servers[key].Server.Gamemode = server.Gamemode - c.Servers[key].Server.Map = server.Map - c.Servers[key].Server.Version = server.Version - c.Servers[key].Server.Favorite = server.Favorite - c.Servers[key].Server.Password = server.Password - c.Servers[key].Server.ProfileToUse = server.ProfileToUse - c.Servers[key].Server.ExtendedConfig = server.ExtendedConfig - c.Servers[key].Server.PlayersInfo = server.PlayersInfo - c.Servers[key].Server.IsPrivate = server.IsPrivate - } - fmt.Println("Load completed.") + // Due to nature of pointers and goroutines thing (?) this should + // be done in this way. + for _, server := range raw_servers { + key := server.Ip + ":" + server.Port + c.CreateServer(key) + c.Servers[key].Server.Name = server.Name + c.Servers[key].Server.Ip = server.Ip + c.Servers[key].Server.Port = server.Port + c.Servers[key].Server.Players = server.Players + c.Servers[key].Server.Bots = server.Bots + c.Servers[key].Server.Maxplayers = server.Maxplayers + c.Servers[key].Server.Ping = server.Ping + c.Servers[key].Server.Gamemode = server.Gamemode + c.Servers[key].Server.Map = server.Map + c.Servers[key].Server.Version = server.Version + c.Servers[key].Server.Favorite = server.Favorite + c.Servers[key].Server.Password = server.Password + c.Servers[key].Server.ProfileToUse = server.ProfileToUse + c.Servers[key].Server.ExtendedConfig = server.ExtendedConfig + c.Servers[key].Server.PlayersInfo = server.PlayersInfo + c.Servers[key].Server.IsPrivate = server.IsPrivate + } + fmt.Println("Load completed.") } diff --git a/cache/exported.go b/cache/exported.go index 55e88dc..1792cd0 100644 --- a/cache/exported.go +++ b/cache/exported.go @@ -10,19 +10,19 @@ package cache import ( - // local - event "github.com/pztrn/urtrator/eventer" - "github.com/pztrn/urtrator/database" + // local + "gitlab.com/pztrn/urtrator/database" + event "gitlab.com/pztrn/urtrator/eventer" ) var ( - Database *database.Database - Eventer *event.Eventer + Database *database.Database + Eventer *event.Eventer ) func New(d *database.Database, e *event.Eventer) *Cache { - Database = d - Eventer = e - c := Cache{} - return &c + Database = d + Eventer = e + c := Cache{} + return &c } diff --git a/cachemodels/profile.go b/cachemodels/profile.go index ac03288..fbb523f 100644 --- a/cachemodels/profile.go +++ b/cachemodels/profile.go @@ -10,10 +10,10 @@ package cachemodels import ( - // local - "github.com/pztrn/urtrator/datamodels" + // local + "gitlab.com/pztrn/urtrator/datamodels" ) type Profile struct { - Profile *datamodels.Profile + Profile *datamodels.Profile } diff --git a/cachemodels/server.go b/cachemodels/server.go index 33412cc..815b760 100644 --- a/cachemodels/server.go +++ b/cachemodels/server.go @@ -10,20 +10,20 @@ package cachemodels import ( - // local - "github.com/pztrn/urtrator/datamodels" + // local + "gitlab.com/pztrn/urtrator/datamodels" - // Other - "github.com/mattn/go-gtk/gtk" + // Other + "github.com/mattn/go-gtk/gtk" ) type Server struct { - Server *datamodels.Server - AllServersIter *gtk.TreeIter - AllServersIterSet bool - AllServersIterInList bool + Server *datamodels.Server + AllServersIter *gtk.TreeIter + AllServersIterSet bool + AllServersIterInList bool - FavServersIter *gtk.TreeIter - FavServersIterSet bool - FavServersIterInList bool + FavServersIter *gtk.TreeIter + FavServersIterSet bool + FavServersIterInList bool } diff --git a/clipboardwatcher/exported.go b/clipboardwatcher/exported.go index 98afd46..ab31092 100644 --- a/clipboardwatcher/exported.go +++ b/clipboardwatcher/exported.go @@ -9,20 +9,20 @@ // ToDo: put full text of license here. package clipboardwatcher -import( - // local - "github.com/pztrn/urtrator/cache" - "github.com/pztrn/urtrator/eventer" +import ( + // local + "gitlab.com/pztrn/urtrator/cache" + "gitlab.com/pztrn/urtrator/eventer" ) var ( - Cache *cache.Cache - Eventer *eventer.Eventer + Cache *cache.Cache + Eventer *eventer.Eventer ) func New(c *cache.Cache, e *eventer.Eventer) *ClipboardWatcher { - Cache = c - Eventer = e - cw := ClipboardWatcher{} - return &cw + Cache = c + Eventer = e + cw := ClipboardWatcher{} + return &cw } diff --git a/context/context_object.go b/context/context_object.go index 9b9bc7a..04e074f 100644 --- a/context/context_object.go +++ b/context/context_object.go @@ -10,125 +10,125 @@ package context import ( - // stdlib - "errors" - "fmt" + // stdlib + "errors" + "fmt" - // local - "github.com/pztrn/urtrator/cache" - "github.com/pztrn/urtrator/clipboardwatcher" - "github.com/pztrn/urtrator/colorizer" - "github.com/pztrn/urtrator/configuration" - "github.com/pztrn/urtrator/database" - "github.com/pztrn/urtrator/eventer" - "github.com/pztrn/urtrator/launcher" - "github.com/pztrn/urtrator/requester" - "github.com/pztrn/urtrator/timer" - "github.com/pztrn/urtrator/translator" + // local + "gitlab.com/pztrn/urtrator/cache" + "gitlab.com/pztrn/urtrator/clipboardwatcher" + "gitlab.com/pztrn/urtrator/colorizer" + "gitlab.com/pztrn/urtrator/configuration" + "gitlab.com/pztrn/urtrator/database" + "gitlab.com/pztrn/urtrator/eventer" + "gitlab.com/pztrn/urtrator/launcher" + "gitlab.com/pztrn/urtrator/requester" + "gitlab.com/pztrn/urtrator/timer" + "gitlab.com/pztrn/urtrator/translator" - // Github - "github.com/mattn/go-gtk/gtk" + // Github + "github.com/mattn/go-gtk/gtk" ) type Context struct { - // Caching. - Cache *cache.Cache - // Clipboard watcher. - Clipboard *clipboardwatcher.ClipboardWatcher - // Colors parser and prettifier. - Colorizer *colorizer.Colorizer - // Configuration. - Cfg *configuration.Config - // Database. - Database *database.Database - // Eventer. - Eventer *eventer.Eventer - // Game launcher. - Launcher *launcher.Launcher - // Requester, which requests server's information. - Requester *requester.Requester - // Timer. - Timer *timer.Timer - // Translator. - Translator *translator.Translator + // Caching. + Cache *cache.Cache + // Clipboard watcher. + Clipboard *clipboardwatcher.ClipboardWatcher + // Colors parser and prettifier. + Colorizer *colorizer.Colorizer + // Configuration. + Cfg *configuration.Config + // Database. + Database *database.Database + // Eventer. + Eventer *eventer.Eventer + // Game launcher. + Launcher *launcher.Launcher + // Requester, which requests server's information. + Requester *requester.Requester + // Timer. + Timer *timer.Timer + // Translator. + Translator *translator.Translator } func (ctx *Context) Close() error { - fmt.Println("Closing URTrator...") + fmt.Println("Closing URTrator...") - launched := ctx.Launcher.CheckForLaunchedUrbanTerror() - if launched != nil { - return errors.New("Urban Terror is launched!") - } - ctx.Cache.FlushProfiles(map[string]string{}) - ctx.Cache.FlushServers(map[string]string{}) - ctx.Database.Close() + launched := ctx.Launcher.CheckForLaunchedUrbanTerror() + if launched != nil { + return errors.New("Urban Terror is launched!") + } + ctx.Cache.FlushProfiles(map[string]string{}) + ctx.Cache.FlushServers(map[string]string{}) + ctx.Database.Close() - // At last, close main window. - gtk.MainQuit() - return nil + // At last, close main window. + gtk.MainQuit() + return nil } func (ctx *Context) initializeCache() { - ctx.Cache = cache.New(ctx.Database, ctx.Eventer) - ctx.Cache.Initialize() + ctx.Cache = cache.New(ctx.Database, ctx.Eventer) + ctx.Cache.Initialize() } func (ctx *Context) InitializeClipboardWatcher() { - ctx.Clipboard = clipboardwatcher.New(ctx.Cache, ctx.Eventer) - ctx.Clipboard.Initialize() + ctx.Clipboard = clipboardwatcher.New(ctx.Cache, ctx.Eventer) + ctx.Clipboard.Initialize() } func (ctx *Context) initializeColorizer() { - ctx.Colorizer = colorizer.New() - ctx.Colorizer.Initialize() + ctx.Colorizer = colorizer.New() + ctx.Colorizer.Initialize() } func (ctx *Context) initializeConfig() { - ctx.Cfg = configuration.New() - ctx.Cfg.Initialize() + ctx.Cfg = configuration.New() + ctx.Cfg.Initialize() } func (ctx *Context) initializeDatabase() { - ctx.Database = database.New(ctx.Cfg) - ctx.Database.Initialize(ctx.Cfg) - ctx.Database.Migrate() + ctx.Database = database.New(ctx.Cfg) + ctx.Database.Initialize(ctx.Cfg) + ctx.Database.Migrate() } func (ctx *Context) initializeEventer() { - ctx.Eventer = eventer.New() - ctx.Eventer.Initialize() + ctx.Eventer = eventer.New() + ctx.Eventer.Initialize() } func (ctx *Context) initializeLauncher() { - ctx.Launcher = launcher.New() - ctx.Launcher.Initialize() + ctx.Launcher = launcher.New() + ctx.Launcher.Initialize() } func (ctx *Context) initializeRequester() { - ctx.Requester = requester.New(ctx.Cache, ctx.Eventer, ctx.Cfg, ctx.Timer) - ctx.Requester.Initialize() + ctx.Requester = requester.New(ctx.Cache, ctx.Eventer, ctx.Cfg, ctx.Timer) + ctx.Requester.Initialize() } func (ctx *Context) initializeTimer() { - ctx.Timer = timer.New(ctx.Eventer, ctx.Cfg) - ctx.Timer.Initialize() + ctx.Timer = timer.New(ctx.Eventer, ctx.Cfg) + ctx.Timer.Initialize() } func (ctx *Context) initializeTranslator() { - ctx.Translator = translator.New(ctx.Cfg) - ctx.Translator.Initialize() + ctx.Translator = translator.New(ctx.Cfg) + ctx.Translator.Initialize() } func (ctx *Context) Initialize() { - fmt.Println("Initializing application context...") - ctx.initializeColorizer() - ctx.initializeConfig() - ctx.initializeDatabase() - ctx.initializeTranslator() - ctx.initializeEventer() - ctx.initializeCache() - ctx.initializeLauncher() - ctx.initializeTimer() - ctx.initializeRequester() + fmt.Println("Initializing application context...") + ctx.initializeColorizer() + ctx.initializeConfig() + ctx.initializeDatabase() + ctx.initializeTranslator() + ctx.initializeEventer() + ctx.initializeCache() + ctx.initializeLauncher() + ctx.initializeTimer() + ctx.initializeRequester() } diff --git a/database/database_object.go b/database/database_object.go index db779be..a038abb 100644 --- a/database/database_object.go +++ b/database/database_object.go @@ -10,85 +10,84 @@ package database import ( - // stdlib - //"database/sql" - "fmt" - "path" - "runtime" - "strconv" + // stdlib + //"database/sql" + "fmt" + "path" + "runtime" + "strconv" - // local - "github.com/pztrn/urtrator/configuration" - "github.com/pztrn/urtrator/datamodels" + // local + "gitlab.com/pztrn/urtrator/configuration" + "gitlab.com/pztrn/urtrator/datamodels" - // Other - "github.com/jmoiron/sqlx" - _ "github.com/mattn/go-sqlite3" + // Other + "github.com/jmoiron/sqlx" + _ "github.com/mattn/go-sqlite3" ) type Database struct { - // Configuration. - cfg *configuration.Config - // Pointer to initialized database connection. - Db *sqlx.DB + // Configuration. + cfg *configuration.Config + // Pointer to initialized database connection. + Db *sqlx.DB } func (d *Database) Close() { - fmt.Println("Closing database...") + fmt.Println("Closing database...") - // Save configuration. - // Delete previous configuration. - d.Db.MustExec("DELETE FROM configuration") - tx := d.Db.MustBegin() - for k, v := range cfg.Cfg { - cfg_item := datamodels.Configuration{} - cfg_item.Key = k - cfg_item.Value = v - tx.NamedExec("INSERT INTO configuration (key, value) VALUES (:key, :value)", &cfg_item) - } - tx.Commit() + // Save configuration. + // Delete previous configuration. + d.Db.MustExec("DELETE FROM configuration") + tx := d.Db.MustBegin() + for k, v := range cfg.Cfg { + cfg_item := datamodels.Configuration{} + cfg_item.Key = k + cfg_item.Value = v + tx.NamedExec("INSERT INTO configuration (key, value) VALUES (:key, :value)", &cfg_item) + } + tx.Commit() - d.Db.Close() + d.Db.Close() - runtime.UnlockOSThread() + runtime.UnlockOSThread() } func (d *Database) Initialize(cfg *configuration.Config) { - fmt.Println("Initializing database...") + fmt.Println("Initializing database...") - runtime.LockOSThread() + runtime.LockOSThread() - // Connect to database. - db_path := path.Join(cfg.TEMP["DATA"], "database.sqlite3") - fmt.Println("Database path: " + db_path) - db, err := sqlx.Connect("sqlite3", db_path) - if err != nil { - fmt.Println(err.Error()) - } - d.Db = db + // Connect to database. + db_path := path.Join(cfg.TEMP["DATA"], "database.sqlite3") + fmt.Println("Database path: " + db_path) + db, err := sqlx.Connect("sqlite3", db_path) + if err != nil { + fmt.Println(err.Error()) + } + d.Db = db - // Load configuration. - cfgs := []datamodels.Configuration{} - d.Db.Select(&cfgs, "SELECT * FROM configuration") - if len(cfgs) > 0 { - for i := range cfgs { - cfg.Cfg[cfgs[i].Key] = cfgs[i].Value - } - } + // Load configuration. + cfgs := []datamodels.Configuration{} + d.Db.Select(&cfgs, "SELECT * FROM configuration") + if len(cfgs) > 0 { + for i := range cfgs { + cfg.Cfg[cfgs[i].Key] = cfgs[i].Value + } + } } func (d *Database) Migrate() { - // Getting current database version. - dbver := 0 - database := []datamodels.Database{} - d.Db.Select(&database, "SELECT * FROM database") - if len(database) > 0 { - fmt.Println("Current database version: " + database[0].Version) - dbver, _ = strconv.Atoi(database[0].Version) - } else { - fmt.Println("No database found, will create new one") - } + // Getting current database version. + dbver := 0 + database := []datamodels.Database{} + d.Db.Select(&database, "SELECT * FROM database") + if len(database) > 0 { + fmt.Println("Current database version: " + database[0].Version) + dbver, _ = strconv.Atoi(database[0].Version) + } else { + fmt.Println("No database found, will create new one") + } - - migrate_full(d, dbver) + migrate_full(d, dbver) } diff --git a/database/exported.go b/database/exported.go index f0c91e8..3a89b30 100644 --- a/database/exported.go +++ b/database/exported.go @@ -10,16 +10,16 @@ package database import ( - // Local - "github.com/pztrn/urtrator/configuration" + // Local + "gitlab.com/pztrn/urtrator/configuration" ) var ( - cfg *configuration.Config + cfg *configuration.Config ) func New(c *configuration.Config) *Database { - cfg = c - d := Database{} - return &d + cfg = c + d := Database{} + return &d } diff --git a/doc/installation/macos/make-app.sh b/doc/installation/macos/make-app.sh index d401562..9096b16 100755 --- a/doc/installation/macos/make-app.sh +++ b/doc/installation/macos/make-app.sh @@ -51,14 +51,14 @@ fi # Okay, let's compile. echo "Getting URTrator (and dependencies) sources" -go get -u -v -d github.com/pztrn/urtrator +go get -u -v -d gitlab.com/pztrn/urtrator if [ $? -ne 0 ]; then echo "Failed to get URTrator sources" exit 1 fi echo "Building URTrator..." -go install -v github.com/pztrn/urtrator +go install -v gitlab.com/pztrn/urtrator if [ $? -ne 0 ]; then echo "Failed to build URTrator! Please, create a new bug report at https://github.com/pztrn/urtrator and attach FULL console output!" exit 1 @@ -69,7 +69,7 @@ mkdir -p URTrator.app/Contents/{MacOS,Framework,Resources} # Copying URTrator binary cp $GOPATH/bin/urtrator URTrator.app/Contents/MacOS/ # Copying main resources. -cp $GOPATH/src/github.com/pztrn/urtrator/artwork/urtrator.icns ./URTrator.app/Contents/Resources/ +cp $GOPATH/src/gitlab.com/pztrn/urtrator/artwork/urtrator.icns ./URTrator.app/Contents/Resources/ cp -R ./Resources/themes ./URTrator.app/Contents/Resources/ ##################################################################### @@ -90,7 +90,7 @@ INFOPLIST=' CFBundleIconFile urtrator.icns CFBundleShortVersionString - 0.1.0 + 0.2.0 CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/launcher/launcher_object.go b/launcher/launcher_object.go index 94f5ab4..b260fee 100644 --- a/launcher/launcher_object.go +++ b/launcher/launcher_object.go @@ -10,128 +10,128 @@ package launcher import ( - // stdlib - "errors" - "fmt" - "os" - "os/exec" - "path/filepath" - "runtime" - "strconv" - "strings" + // stdlib + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "strings" - // local - "github.com/pztrn/urtrator/datamodels" + // local + "gitlab.com/pztrn/urtrator/datamodels" - // Github - "github.com/mattn/go-gtk/gtk" + // Github + "github.com/mattn/go-gtk/gtk" ) type Launcher struct { - // Flags. - // Is Urban Terror launched ATM? - launched bool + // Flags. + // Is Urban Terror launched ATM? + launched bool } func (l *Launcher) CheckForLaunchedUrbanTerror() error { - if l.launched { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := "Game is launched.\n\nCannot quit, because game is launched.\nQuit Urban Terror to exit URTrator!" - m := gtk.NewMessageDialog(nil, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - return errors.New("User didn't select valid profile, mismatch with server's version.") - } - } + if l.launched { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := "Game is launched.\n\nCannot quit, because game is launched.\nQuit Urban Terror to exit URTrator!" + m := gtk.NewMessageDialog(nil, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + return errors.New("User didn't select valid profile, mismatch with server's version.") + } + } - return nil + return nil } func (l *Launcher) findFreeDisplay() string { - current_display_raw := os.Getenv("DISPLAY") - current_display, _ := strconv.Atoi(strings.Split(current_display_raw, ":")[1]) - current_display += 1 - return strconv.Itoa(current_display) + current_display_raw := os.Getenv("DISPLAY") + current_display, _ := strconv.Atoi(strings.Split(current_display_raw, ":")[1]) + current_display += 1 + return strconv.Itoa(current_display) } func (l *Launcher) Initialize() { - fmt.Println("Initializing game launcher...") + fmt.Println("Initializing game launcher...") } func (l *Launcher) Launch(server_profile *datamodels.Server, user_profile *datamodels.Profile, password string, additional_parameters []string, callback func()) { - // ToDo: only one instance of Urban Terror should be launched, so button - // should be disabled. - fmt.Println("Launching Urban Terror...") + // ToDo: only one instance of Urban Terror should be launched, so button + // should be disabled. + fmt.Println("Launching Urban Terror...") - done := make(chan bool, 1) + done := make(chan bool, 1) - // Create launch string. - var launch_bin string = "" - launch_bin, err := exec.LookPath(user_profile.Binary) - if err != nil { - fmt.Println(err.Error()) - } + // Create launch string. + var launch_bin string = "" + launch_bin, err := exec.LookPath(user_profile.Binary) + if err != nil { + fmt.Println(err.Error()) + } - server_address := server_profile.Ip + ":" + server_profile.Port + server_address := server_profile.Ip + ":" + server_profile.Port - var launch_params []string - if len(server_address) > 0 { - launch_params = append(launch_params, "+connect", server_address) - } - if len(password) > 0 { - launch_params = append(launch_params, "+password", password) - } - if len(user_profile.Additional_params) > 0 { - additional_params := strings.Split(user_profile.Additional_params, " ") - launch_params = append(launch_params, additional_params...) - } - if len(additional_parameters) > 0 { - for i := range additional_parameters { - launch_params = append(launch_params, additional_parameters[i]) - } - } - if runtime.GOOS == "linux" && user_profile.Second_x_session == "1" { - launch_params = append([]string{launch_bin}, launch_params...) - display := l.findFreeDisplay() - launch_bin, err = exec.LookPath("xinit") - if err != nil { - fmt.Println(err.Error()) - } - launch_params = append(launch_params, "--", ":" + display) - } - if runtime.GOOS == "darwin" { - // On macOS we should not start binary, but application bundle. - // So we will obtain app bundle path. - bundle_path := strings.Split(launch_bin, "/Contents")[0] - // and create special launch string, which involves open. - launch_bin = "/usr/bin/open" - launch_params = append([]string{launch_bin, "-W", "-a", bundle_path, "--args"}, launch_params...) - } - fmt.Println(launch_bin, launch_params) - go func() { - go func() { - cmd := exec.Command(launch_bin, launch_params...) - // This workaround is required on Windows, otherwise ioq3 - // will not find game data. - if runtime.GOOS == "windows" { - dir := filepath.Dir(launch_bin) - cmd.Dir = dir - } - out, err1 := cmd.Output() - if err1 != nil { - fmt.Println("Launch error: " + err1.Error()) - } - fmt.Println(string(out)) - done <- true - }() + var launch_params []string + if len(server_address) > 0 { + launch_params = append(launch_params, "+connect", server_address) + } + if len(password) > 0 { + launch_params = append(launch_params, "+password", password) + } + if len(user_profile.Additional_params) > 0 { + additional_params := strings.Split(user_profile.Additional_params, " ") + launch_params = append(launch_params, additional_params...) + } + if len(additional_parameters) > 0 { + for i := range additional_parameters { + launch_params = append(launch_params, additional_parameters[i]) + } + } + if runtime.GOOS == "linux" && user_profile.Second_x_session == "1" { + launch_params = append([]string{launch_bin}, launch_params...) + display := l.findFreeDisplay() + launch_bin, err = exec.LookPath("xinit") + if err != nil { + fmt.Println(err.Error()) + } + launch_params = append(launch_params, "--", ":"+display) + } + if runtime.GOOS == "darwin" { + // On macOS we should not start binary, but application bundle. + // So we will obtain app bundle path. + bundle_path := strings.Split(launch_bin, "/Contents")[0] + // and create special launch string, which involves open. + launch_bin = "/usr/bin/open" + launch_params = append([]string{launch_bin, "-W", "-a", bundle_path, "--args"}, launch_params...) + } + fmt.Println(launch_bin, launch_params) + go func() { + go func() { + cmd := exec.Command(launch_bin, launch_params...) + // This workaround is required on Windows, otherwise ioq3 + // will not find game data. + if runtime.GOOS == "windows" { + dir := filepath.Dir(launch_bin) + cmd.Dir = dir + } + out, err1 := cmd.Output() + if err1 != nil { + fmt.Println("Launch error: " + err1.Error()) + } + fmt.Println(string(out)) + done <- true + }() - select { - case <- done: - callback() - } - }() + select { + case <-done: + callback() + } + }() } diff --git a/requester/exported.go b/requester/exported.go index f141dff..6e3d8be 100644 --- a/requester/exported.go +++ b/requester/exported.go @@ -10,29 +10,29 @@ package requester import ( - // stdlib - "fmt" + // stdlib + "fmt" - // local - "github.com/pztrn/urtrator/cache" - "github.com/pztrn/urtrator/configuration" - "github.com/pztrn/urtrator/eventer" - "github.com/pztrn/urtrator/timer" + // local + "gitlab.com/pztrn/urtrator/cache" + "gitlab.com/pztrn/urtrator/configuration" + "gitlab.com/pztrn/urtrator/eventer" + "gitlab.com/pztrn/urtrator/timer" ) var ( - Cache *cache.Cache - Cfg *configuration.Config - Eventer *eventer.Eventer - Timer *timer.Timer + Cache *cache.Cache + Cfg *configuration.Config + Eventer *eventer.Eventer + Timer *timer.Timer ) func New(c *cache.Cache, e *eventer.Eventer, cc *configuration.Config, t *timer.Timer) *Requester { - Cache = c - Cfg = cc - Eventer = e - Timer = t - fmt.Println("Creating Requester object...") - r := Requester{} - return &r + Cache = c + Cfg = cc + Eventer = e + Timer = t + fmt.Println("Creating Requester object...") + r := Requester{} + return &r } diff --git a/requester/pooler.go b/requester/pooler.go index 8c12dcf..7b6dcae 100644 --- a/requester/pooler.go +++ b/requester/pooler.go @@ -10,281 +10,281 @@ package requester import ( - // stdlib - "errors" - "fmt" - "net" - "runtime" - "strconv" - "strings" - "sync" - "time" + // stdlib + "errors" + "fmt" + "net" + "runtime" + "strconv" + "strings" + "sync" + "time" - // local - "github.com/pztrn/urtrator/datamodels" + // local + "gitlab.com/pztrn/urtrator/datamodels" ) type Pooler struct { - // Maximum number of simultaneous requests running. - maxrequests int - // Packet prefix. - pp string - // Current requests counter mutex. - cur_requests_mutex sync.Mutex + // Maximum number of simultaneous requests running. + maxrequests int + // Packet prefix. + pp string + // Current requests counter mutex. + cur_requests_mutex sync.Mutex } func (p *Pooler) Initialize() { - fmt.Println("Initializing requester goroutine pooler...") - // ToDo: figure out how to make this work nice. - p.maxrequests = 150 - _ = runtime.GOMAXPROCS(runtime.NumCPU() * 4) - p.pp = "\377\377\377\377" - fmt.Println("Pooler initialized") + fmt.Println("Initializing requester goroutine pooler...") + // ToDo: figure out how to make this work nice. + p.maxrequests = 150 + _ = runtime.GOMAXPROCS(runtime.NumCPU() * 4) + p.pp = "\377\377\377\377" + fmt.Println("Pooler initialized") } func (p *Pooler) PingOneServer(server_address string) { - var wait sync.WaitGroup + var wait sync.WaitGroup - Cache.ServersMutex.Lock() - server := Cache.Servers[server_address].Server - Cache.ServersMutex.Unlock() + Cache.ServersMutex.Lock() + server := Cache.Servers[server_address].Server + Cache.ServersMutex.Unlock() - wait.Add(1) - go func(srv *datamodels.Server) { - defer wait.Done() - p.pingServersExecutor(srv) - }(server) - wait.Wait() + wait.Add(1) + go func(srv *datamodels.Server) { + defer wait.Done() + p.pingServersExecutor(srv) + }(server) + wait.Wait() } // Servers pinging pooler. Should be started as goroutine to prevent // UI blocking. func (p *Pooler) PingServers(servers_type string) { - fmt.Println("About to ping " + servers_type + " servers...") + fmt.Println("About to ping " + servers_type + " servers...") - cur_requests := 0 - var wait sync.WaitGroup + cur_requests := 0 + var wait sync.WaitGroup - Cache.ServersMutex.Lock() - for _, server_to_ping := range Cache.Servers { - if servers_type == "favorites" && server_to_ping.Server.Favorite != "1" { - continue - } - for { - p.cur_requests_mutex.Lock() - if cur_requests == p.maxrequests { - p.cur_requests_mutex.Unlock() - time.Sleep(time.Second * 1) - } else { - p.cur_requests_mutex.Unlock() - break - } - } - wait.Add(1) - p.cur_requests_mutex.Lock() - cur_requests += 1 - p.cur_requests_mutex.Unlock() - go func(srv *datamodels.Server) { - defer wait.Done() - p.pingServersExecutor(srv) - p.cur_requests_mutex.Lock() - cur_requests -= 1 - p.cur_requests_mutex.Unlock() - }(server_to_ping.Server) - } - wait.Wait() - Cache.ServersMutex.Unlock() + Cache.ServersMutex.Lock() + for _, server_to_ping := range Cache.Servers { + if servers_type == "favorites" && server_to_ping.Server.Favorite != "1" { + continue + } + for { + p.cur_requests_mutex.Lock() + if cur_requests == p.maxrequests { + p.cur_requests_mutex.Unlock() + time.Sleep(time.Second * 1) + } else { + p.cur_requests_mutex.Unlock() + break + } + } + wait.Add(1) + p.cur_requests_mutex.Lock() + cur_requests += 1 + p.cur_requests_mutex.Unlock() + go func(srv *datamodels.Server) { + defer wait.Done() + p.pingServersExecutor(srv) + p.cur_requests_mutex.Lock() + cur_requests -= 1 + p.cur_requests_mutex.Unlock() + }(server_to_ping.Server) + } + wait.Wait() + Cache.ServersMutex.Unlock() } func (p *Pooler) pingServersExecutor(server *datamodels.Server) error { - srv := server.Ip + ":" + server.Port - fmt.Println("Pinging " + srv) - // Dial to server. - start_p := time.Now() - conn_ping, err2 := net.Dial("udp", srv) - if err2 != nil { - fmt.Println("Error dialing to server " + srv + "!") - return errors.New("Error dialing to server " + srv + "!") - } - // Set deadline, so we won't wait forever. - ddl_ping := time.Now() - // This should be enough. Maybe, you should'n run URTrator on modem - // connections? :) - ddl_ping = ddl_ping.Add(time.Second * 10) - conn_ping.SetDeadline(ddl_ping) + srv := server.Ip + ":" + server.Port + fmt.Println("Pinging " + srv) + // Dial to server. + start_p := time.Now() + conn_ping, err2 := net.Dial("udp", srv) + if err2 != nil { + fmt.Println("Error dialing to server " + srv + "!") + return errors.New("Error dialing to server " + srv + "!") + } + // Set deadline, so we won't wait forever. + ddl_ping := time.Now() + // This should be enough. Maybe, you should'n run URTrator on modem + // connections? :) + ddl_ping = ddl_ping.Add(time.Second * 10) + conn_ping.SetDeadline(ddl_ping) - msg_ping := []byte(p.pp + "getinfo") - conn_ping.Write(msg_ping) + msg_ping := []byte(p.pp + "getinfo") + conn_ping.Write(msg_ping) - // UDP Buffer. - var received_buf_ping []byte = make([]byte, 128) - // Received buffer. - var raw_received_ping []byte - _, err := conn_ping.Read(received_buf_ping) - if err != nil { - fmt.Println("PING ERROR") - } - raw_received_ping = append(raw_received_ping, received_buf_ping...) - conn_ping.Close() + // UDP Buffer. + var received_buf_ping []byte = make([]byte, 128) + // Received buffer. + var raw_received_ping []byte + _, err := conn_ping.Read(received_buf_ping) + if err != nil { + fmt.Println("PING ERROR") + } + raw_received_ping = append(raw_received_ping, received_buf_ping...) + conn_ping.Close() - delta := strconv.Itoa(int(time.Since(start_p).Nanoseconds()) / 1000000) - server.Ping = delta + delta := strconv.Itoa(int(time.Since(start_p).Nanoseconds()) / 1000000) + server.Ping = delta - return nil + return nil } func (p *Pooler) UpdateOneServer(server_address string) { - var wait sync.WaitGroup + var wait sync.WaitGroup - Cache.ServersMutex.Lock() - server := Cache.Servers[server_address].Server - Cache.ServersMutex.Unlock() + Cache.ServersMutex.Lock() + server := Cache.Servers[server_address].Server + Cache.ServersMutex.Unlock() - wait.Add(1) - go func(server *datamodels.Server) { - defer wait.Done() - p.UpdateSpecificServer(server) - }(server) - wait.Wait() - p.PingOneServer(server_address) - Eventer.LaunchEvent("flushServers", map[string]string{}) + wait.Add(1) + go func(server *datamodels.Server) { + defer wait.Done() + p.UpdateSpecificServer(server) + }(server) + wait.Wait() + p.PingOneServer(server_address) + Eventer.LaunchEvent("flushServers", map[string]string{}) - Eventer.LaunchEvent("loadAllServers", map[string]string{}) - Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) - Eventer.LaunchEvent("serversUpdateCompleted", map[string]string{}) + Eventer.LaunchEvent("loadAllServers", map[string]string{}) + Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + Eventer.LaunchEvent("serversUpdateCompleted", map[string]string{}) } func (p *Pooler) UpdateServers(servers_type string) { - var wait sync.WaitGroup + var wait sync.WaitGroup - Cache.ServersMutex.Lock() - for _, server := range Cache.Servers { - if servers_type == "favorites" && server.Server.Favorite != "1" { - continue - } - wait.Add(1) - go func(server *datamodels.Server) { - defer wait.Done() - p.UpdateSpecificServer(server) - }(server.Server) - } - wait.Wait() - Cache.ServersMutex.Unlock() - p.PingServers(servers_type) - Eventer.LaunchEvent("flushServers", map[string]string{}) + Cache.ServersMutex.Lock() + for _, server := range Cache.Servers { + if servers_type == "favorites" && server.Server.Favorite != "1" { + continue + } + wait.Add(1) + go func(server *datamodels.Server) { + defer wait.Done() + p.UpdateSpecificServer(server) + }(server.Server) + } + wait.Wait() + Cache.ServersMutex.Unlock() + p.PingServers(servers_type) + Eventer.LaunchEvent("flushServers", map[string]string{}) - Eventer.LaunchEvent("loadAllServers", map[string]string{}) - Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) - Eventer.LaunchEvent("serversUpdateCompleted", map[string]string{}) + Eventer.LaunchEvent("loadAllServers", map[string]string{}) + Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + Eventer.LaunchEvent("serversUpdateCompleted", map[string]string{}) } // Updates information about specific server. func (p *Pooler) UpdateSpecificServer(server *datamodels.Server) error { - server_addr := server.Ip + ":" + server.Port - fmt.Println("Updating server: " + server_addr) + server_addr := server.Ip + ":" + server.Port + fmt.Println("Updating server: " + server_addr) - // Dial to server. - conn, err1 := net.Dial("udp", server_addr) - if err1 != nil { - fmt.Println("Error dialing to server " + server_addr + "!") - return errors.New("Error dialing to server " + server_addr + "!") - } + // Dial to server. + conn, err1 := net.Dial("udp", server_addr) + if err1 != nil { + fmt.Println("Error dialing to server " + server_addr + "!") + return errors.New("Error dialing to server " + server_addr + "!") + } - // Set deadline, so we won't wait forever. - ddl := time.Now() - // This should be enough. Maybe, you should'n run URTrator on modem - // connections? :) - ddl = ddl.Add(time.Second * 2) - conn.SetDeadline(ddl) + // Set deadline, so we won't wait forever. + ddl := time.Now() + // This should be enough. Maybe, you should'n run URTrator on modem + // connections? :) + ddl = ddl.Add(time.Second * 2) + conn.SetDeadline(ddl) - msg := []byte(p.pp + "getstatus") - conn.Write(msg) + msg := []byte(p.pp + "getstatus") + conn.Write(msg) - // UDP Buffer. - var received_buf []byte = make([]byte, 4096) - // Received buffer. - var raw_received []byte - for { - _, err := conn.Read(received_buf) - if err != nil { - break - } - raw_received = append(raw_received, received_buf...) - } - conn.Close() + // UDP Buffer. + var received_buf []byte = make([]byte, 4096) + // Received buffer. + var raw_received []byte + for { + _, err := conn.Read(received_buf) + if err != nil { + break + } + raw_received = append(raw_received, received_buf...) + } + conn.Close() - // First line is "infoResponse" string, which we should skip by - // splitting response by "\n". - received_lines := strings.Split(string(raw_received), "\n") - // We have server's data! - if len(received_lines) > 1 { - srv_config := strings.Split(received_lines[1], "\\") - // Parse server configuration into passed server's datamodel. - for i := 0; i < len(srv_config); i = i + 1 { - if srv_config[i] == "g_modversion" { - server.Version = srv_config[i + 1] - } - if srv_config[i] == "g_gametype" { - server.Gamemode = srv_config[i + 1] - } - if srv_config[i] == "sv_maxclients" { - server.Maxplayers = srv_config[i + 1] - } - if srv_config[i] == "clients" { - server.Players = srv_config[i + 1] - } - if srv_config[i] == "mapname" { - server.Map = srv_config[i + 1] - } - if srv_config[i] == "sv_hostname" { - server.Name = srv_config[i + 1] - } - if srv_config[i] == "g_needpass" { - if srv_config[i + 1] == "0" { - server.IsPrivate = "0" - } else { - server.IsPrivate = "1" - } - } - server.ExtendedConfig = received_lines[1] - } - if len(received_lines) >= 2 { - // Here we go, players information. - players := received_lines[2:] - var real_players int = 0 - var bots int = 0 - // Calculate players! - if len(players) == 1 && len(players[0]) > 255 { - server.Players = "0" - server.Bots = "0" - } else { - // Looks like we have last element to be empty, due to - // strings.Split() call before. - for i := range players { - // Get slice with data for bots-humans parsing. - player_data := strings.Split(string(players[i]), " ") - // If slice length isn't equal 3 - this is not what - // we want. - if len(player_data) != 3 { - continue - } + // First line is "infoResponse" string, which we should skip by + // splitting response by "\n". + received_lines := strings.Split(string(raw_received), "\n") + // We have server's data! + if len(received_lines) > 1 { + srv_config := strings.Split(received_lines[1], "\\") + // Parse server configuration into passed server's datamodel. + for i := 0; i < len(srv_config); i = i + 1 { + if srv_config[i] == "g_modversion" { + server.Version = srv_config[i+1] + } + if srv_config[i] == "g_gametype" { + server.Gamemode = srv_config[i+1] + } + if srv_config[i] == "sv_maxclients" { + server.Maxplayers = srv_config[i+1] + } + if srv_config[i] == "clients" { + server.Players = srv_config[i+1] + } + if srv_config[i] == "mapname" { + server.Map = srv_config[i+1] + } + if srv_config[i] == "sv_hostname" { + server.Name = srv_config[i+1] + } + if srv_config[i] == "g_needpass" { + if srv_config[i+1] == "0" { + server.IsPrivate = "0" + } else { + server.IsPrivate = "1" + } + } + server.ExtendedConfig = received_lines[1] + } + if len(received_lines) >= 2 { + // Here we go, players information. + players := received_lines[2:] + var real_players int = 0 + var bots int = 0 + // Calculate players! + if len(players) == 1 && len(players[0]) > 255 { + server.Players = "0" + server.Bots = "0" + } else { + // Looks like we have last element to be empty, due to + // strings.Split() call before. + for i := range players { + // Get slice with data for bots-humans parsing. + player_data := strings.Split(string(players[i]), " ") + // If slice length isn't equal 3 - this is not what + // we want. + if len(player_data) != 3 { + continue + } - if player_data[1] == "0" { - bots++ - } else { - real_players++ - } - } - //server.Players = strconv.Itoa(len(players) - 1) - server.Players = strconv.Itoa(real_players) - server.Bots = strconv.Itoa(bots) - fmt.Println(server.Players, server.Bots) - } - server.PlayersInfo = strings.Join(received_lines[2:], "\\") - } - } + if player_data[1] == "0" { + bots++ + } else { + real_players++ + } + } + //server.Players = strconv.Itoa(len(players) - 1) + server.Players = strconv.Itoa(real_players) + server.Bots = strconv.Itoa(bots) + fmt.Println(server.Players, server.Bots) + } + server.PlayersInfo = strings.Join(received_lines[2:], "\\") + } + } - // ToDo: Calculate ping. 0 for now. - server.Ping = "0" - return nil + // ToDo: Calculate ping. 0 for now. + server.Ping = "0" + return nil } diff --git a/timer/exported.go b/timer/exported.go index 11fb5e5..9b6ef70 100644 --- a/timer/exported.go +++ b/timer/exported.go @@ -10,23 +10,23 @@ package timer import ( - // stdlib - "fmt" + // stdlib + "fmt" - // local - "github.com/pztrn/urtrator/configuration" - "github.com/pztrn/urtrator/eventer" + // local + "gitlab.com/pztrn/urtrator/configuration" + "gitlab.com/pztrn/urtrator/eventer" ) var ( - Cfg *configuration.Config - Eventer *eventer.Eventer + Cfg *configuration.Config + Eventer *eventer.Eventer ) func New(e *eventer.Eventer, cc *configuration.Config) *Timer { - Cfg = cc - Eventer = e - fmt.Println("Creating Timer object...") - t := Timer{} - return &t + Cfg = cc + Eventer = e + fmt.Println("Creating Timer object...") + t := Timer{} + return &t } diff --git a/translator/exported.go b/translator/exported.go index a182d0e..3ffb252 100644 --- a/translator/exported.go +++ b/translator/exported.go @@ -10,17 +10,17 @@ package translator import ( - // local - "github.com/pztrn/urtrator/configuration" + // local + "gitlab.com/pztrn/urtrator/configuration" ) var ( - // Configuration. - cfg *configuration.Config + // Configuration. + cfg *configuration.Config ) func New(c *configuration.Config) *Translator { - cfg = c - t := Translator{} - return &t + cfg = c + t := Translator{} + return &t } diff --git a/ui/gtk2/about.go b/ui/gtk2/about.go index db3f609..3ced35b 100644 --- a/ui/gtk2/about.go +++ b/ui/gtk2/about.go @@ -10,40 +10,40 @@ package ui import ( - // local - "github.com/pztrn/urtrator/common" + // local + "gitlab.com/pztrn/urtrator/common" - // other - "github.com/mattn/go-gtk/gtk" + // other + "github.com/mattn/go-gtk/gtk" ) func ShowAboutDialog() { - ad := gtk.NewAboutDialog() + ad := gtk.NewAboutDialog() - ad.SetProgramName("URTrator") - ad.SetComments(ctx.Translator.Translate("Urban Terror servers browser and game launcher", nil)) - ad.SetVersion(common.URTRATOR_VERSION) - ad.SetWebsite("http://urtrator.pztrn.name") - ad.SetLogo(logo) + ad.SetProgramName("URTrator") + ad.SetComments(ctx.Translator.Translate("Urban Terror servers browser and game launcher", nil)) + ad.SetVersion(common.URTRATOR_VERSION) + ad.SetWebsite("https://gitlab.com/pztrn/urtrator") + ad.SetLogo(logo) - // ToDo: put it in plain text files. - var authors []string - authors = append(authors, "Stanislav N. aka pztrn - project creator, main developer.") - ad.SetAuthors(authors) + // ToDo: put it in plain text files. + var authors []string + authors = append(authors, "Stanislav N. aka pztrn - project creator, main developer.") + ad.SetAuthors(authors) - var artists []string - artists = append(artists, "UrTConnector team, for great icons and allowing to use them.") - ad.SetArtists(artists) + var artists []string + artists = append(artists, "UrTConnector team, for great icons and allowing to use them.") + ad.SetArtists(artists) - var documenters []string - documenters = append(documenters, "No one at this moment") - ad.SetDocumenters(documenters) + var documenters []string + documenters = append(documenters, "No one at this moment") + ad.SetDocumenters(documenters) - ad.SetCopyright("Stanislav N. aka pztrn") - ad.SetLicense(GPL_LICENSE) + ad.SetCopyright("Stanislav N. aka pztrn") + ad.SetLicense(GPL_LICENSE) - ad.Run() - ad.Destroy() + ad.Run() + ad.Destroy() } var GPL_LICENSE = ` diff --git a/ui/gtk2/exported.go b/ui/gtk2/exported.go index 85e995c..4f8dab3 100644 --- a/ui/gtk2/exported.go +++ b/ui/gtk2/exported.go @@ -10,21 +10,21 @@ package ui import ( - // local - "github.com/pztrn/urtrator/context" + // local + "gitlab.com/pztrn/urtrator/context" - // Other - "github.com/mattn/go-gtk/gdkpixbuf" + // Other + "github.com/mattn/go-gtk/gdkpixbuf" ) var ( - ctx *context.Context + ctx *context.Context - logo *gdkpixbuf.Pixbuf + logo *gdkpixbuf.Pixbuf ) func NewMainWindow(c *context.Context) *MainWindow { - ctx = c - m := MainWindow{} - return &m + ctx = c + m := MainWindow{} + return &m } diff --git a/ui/gtk2/favorite.go b/ui/gtk2/favorite.go index 443b34e..608b8c0 100644 --- a/ui/gtk2/favorite.go +++ b/ui/gtk2/favorite.go @@ -10,283 +10,283 @@ package ui import ( - // stdlib - "encoding/base64" - "errors" - "fmt" - "runtime" - "strings" + // stdlib + "encoding/base64" + "errors" + "fmt" + "runtime" + "strings" - // Local - "github.com/pztrn/urtrator/cachemodels" - "github.com/pztrn/urtrator/common" - "github.com/pztrn/urtrator/datamodels" + // Local + "gitlab.com/pztrn/urtrator/cachemodels" + "gitlab.com/pztrn/urtrator/common" + "gitlab.com/pztrn/urtrator/datamodels" - // Other - "github.com/mattn/go-gtk/gdkpixbuf" - "github.com/mattn/go-gtk/gtk" + // Other + "github.com/mattn/go-gtk/gdkpixbuf" + "github.com/mattn/go-gtk/gtk" ) type FavoriteDialog struct { - // Widgets. - // Dialog's window. - window *gtk.Window - // Main vertical box. - vbox *gtk.VBox - // Server name. - server_name *gtk.Entry - // Server address. - server_address *gtk.Entry - // Server password - server_password *gtk.Entry - // Profile. - profile *gtk.ComboBoxText + // Widgets. + // Dialog's window. + window *gtk.Window + // Main vertical box. + vbox *gtk.VBox + // Server name. + server_name *gtk.Entry + // Server address. + server_address *gtk.Entry + // Server password + server_password *gtk.Entry + // Profile. + profile *gtk.ComboBoxText - // Flags. - // Is known server update performed? - update bool + // Flags. + // Is known server update performed? + update bool - // Data. - // Server's we're working with. - server *datamodels.Server - // Profiles count that was added to profiles combobox. - profiles int + // Data. + // Server's we're working with. + server *datamodels.Server + // Profiles count that was added to profiles combobox. + profiles int } func (f *FavoriteDialog) Close() {} func (f *FavoriteDialog) closeByCancel() { - f.window.Destroy() + f.window.Destroy() } func (f *FavoriteDialog) fill() { - f.server_name.SetText(f.server.Name) - f.server_address.SetText(f.server.Ip + ":" + f.server.Port) - f.server_password.SetText(f.server.Password) + f.server_name.SetText(f.server.Name) + f.server_address.SetText(f.server.Ip + ":" + f.server.Port) + f.server_password.SetText(f.server.Password) - // Profiles. - // Remove old profiles. - if f.profiles > 0 { - for i := 0; i <= f.profiles; i++ { - f.profile.RemoveText(0) - } - } + // Profiles. + // Remove old profiles. + if f.profiles > 0 { + for i := 0; i <= f.profiles; i++ { + f.profile.RemoveText(0) + } + } - profiles := []datamodels.Profile{} - err := ctx.Database.Db.Select(&profiles, "SELECT * FROM urt_profiles") - if err != nil { - fmt.Println(err.Error()) - } - var idx_in_combobox int = 0 - var idx_should_be_active int = 0 - for p := range profiles { - if profiles[p].Version == f.server.Version { - f.profile.AppendText(profiles[p].Name) - idx_should_be_active = idx_in_combobox - idx_in_combobox += 1 - f.profiles += 1 - } - } + profiles := []datamodels.Profile{} + err := ctx.Database.Db.Select(&profiles, "SELECT * FROM urt_profiles") + if err != nil { + fmt.Println(err.Error()) + } + var idx_in_combobox int = 0 + var idx_should_be_active int = 0 + for p := range profiles { + if profiles[p].Version == f.server.Version { + f.profile.AppendText(profiles[p].Name) + idx_should_be_active = idx_in_combobox + idx_in_combobox += 1 + f.profiles += 1 + } + } - f.profile.SetActive(idx_should_be_active) + f.profile.SetActive(idx_should_be_active) } func (f *FavoriteDialog) InitializeNew() { - f.update = false - f.server = &datamodels.Server{} - f.profiles = 0 - f.initializeWindow() + f.update = false + f.server = &datamodels.Server{} + f.profiles = 0 + f.initializeWindow() } func (f *FavoriteDialog) InitializeUpdate(server *datamodels.Server) { - fmt.Println("Favorites updating...") - f.update = true - f.server = server - f.profiles = 0 - f.initializeWindow() - f.fill() + fmt.Println("Favorites updating...") + f.update = true + f.server = server + f.profiles = 0 + f.initializeWindow() + f.fill() } func (f *FavoriteDialog) initializeWindow() { - f.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) - if f.update { - f.window.SetTitle(ctx.Translator.Translate("URTrator - {{ action }} favorite server", map[string]string{"action": "Update"})) - } else { - f.window.SetTitle(ctx.Translator.Translate("URTrator - {{ action }} favorite server", map[string]string{"action": "Add"})) - } - f.window.Connect("destroy", f.Close) - f.window.SetPosition(gtk.WIN_POS_CENTER) - f.window.SetModal(true) - f.window.SetSizeRequest(400, 200) - f.window.SetResizable(false) + f.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) + if f.update { + f.window.SetTitle(ctx.Translator.Translate("URTrator - {{ action }} favorite server", map[string]string{"action": "Update"})) + } else { + f.window.SetTitle(ctx.Translator.Translate("URTrator - {{ action }} favorite server", map[string]string{"action": "Add"})) + } + f.window.Connect("destroy", f.Close) + f.window.SetPosition(gtk.WIN_POS_CENTER) + f.window.SetModal(true) + f.window.SetSizeRequest(400, 200) + f.window.SetResizable(false) - // Load program icon from base64. - icon_bytes, _ := base64.StdEncoding.DecodeString(common.Logo) - icon_pixbuf := gdkpixbuf.NewLoader() - icon_pixbuf.Write(icon_bytes) - logo = icon_pixbuf.GetPixbuf() - f.window.SetIcon(logo) + // Load program icon from base64. + icon_bytes, _ := base64.StdEncoding.DecodeString(common.Logo) + icon_pixbuf := gdkpixbuf.NewLoader() + icon_pixbuf.Write(icon_bytes) + logo = icon_pixbuf.GetPixbuf() + f.window.SetIcon(logo) - // Set some GTK options for this window. - gtk_opts_raw := gtk.SettingsGetDefault() - gtk_opts := gtk_opts_raw.ToGObject() - gtk_opts.Set("gtk-button-images", true) + // Set some GTK options for this window. + gtk_opts_raw := gtk.SettingsGetDefault() + gtk_opts := gtk_opts_raw.ToGObject() + gtk_opts.Set("gtk-button-images", true) - f.vbox = gtk.NewVBox(false, 0) + f.vbox = gtk.NewVBox(false, 0) - table := gtk.NewTable(5, 2, false) - f.vbox.PackStart(table, true, true, 5) + table := gtk.NewTable(5, 2, false) + f.vbox.PackStart(table, true, true, 5) - // Server name. - srv_name_label := gtk.NewLabel(ctx.Translator.Translate("Server name:", nil)) - srv_name_label.SetAlignment(0, 0) - table.Attach(srv_name_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) + // Server name. + srv_name_label := gtk.NewLabel(ctx.Translator.Translate("Server name:", nil)) + srv_name_label.SetAlignment(0, 0) + table.Attach(srv_name_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) - f.server_name = gtk.NewEntry() - table.Attach(f.server_name, 1, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5) + f.server_name = gtk.NewEntry() + table.Attach(f.server_name, 1, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5) - // Server address. - srv_addr_label := gtk.NewLabel(ctx.Translator.Translate("Server address:", nil)) - srv_addr_label.SetAlignment(0, 0) - table.Attach(srv_addr_label, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK, 5, 5) + // Server address. + srv_addr_label := gtk.NewLabel(ctx.Translator.Translate("Server address:", nil)) + srv_addr_label.SetAlignment(0, 0) + table.Attach(srv_addr_label, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK, 5, 5) - srv_addr_hbox := gtk.NewHBox(false, 0) - f.server_address = gtk.NewEntry() - srv_addr_hbox.PackStart(f.server_address, true, true, 0) - srv_addr_update_btn := gtk.NewButton() - srv_addr_update_btn.SetTooltipText(ctx.Translator.Translate("Update server information", nil)) - srv_addr_update_btn_image := gtk.NewImageFromStock(gtk.STOCK_REDO, gtk.ICON_SIZE_SMALL_TOOLBAR) - srv_addr_update_btn.SetImage(srv_addr_update_btn_image) - srv_addr_update_btn.Clicked(f.updateServerInfo) - srv_addr_hbox.PackStart(srv_addr_update_btn, false, true, 5) - if f.update { - f.server_address.SetSensitive(false) - } - table.Attach(srv_addr_hbox, 1, 2, 1, 2, gtk.FILL, gtk.FILL, 5, 5) + srv_addr_hbox := gtk.NewHBox(false, 0) + f.server_address = gtk.NewEntry() + srv_addr_hbox.PackStart(f.server_address, true, true, 0) + srv_addr_update_btn := gtk.NewButton() + srv_addr_update_btn.SetTooltipText(ctx.Translator.Translate("Update server information", nil)) + srv_addr_update_btn_image := gtk.NewImageFromStock(gtk.STOCK_REDO, gtk.ICON_SIZE_SMALL_TOOLBAR) + srv_addr_update_btn.SetImage(srv_addr_update_btn_image) + srv_addr_update_btn.Clicked(f.updateServerInfo) + srv_addr_hbox.PackStart(srv_addr_update_btn, false, true, 5) + if f.update { + f.server_address.SetSensitive(false) + } + table.Attach(srv_addr_hbox, 1, 2, 1, 2, gtk.FILL, gtk.FILL, 5, 5) - // Server password. - srv_pass_label := gtk.NewLabel(ctx.Translator.Translate("Password:", nil)) - srv_pass_label.SetAlignment(0, 0) - table.Attach(srv_pass_label, 0, 1, 2, 3, gtk.FILL, gtk.SHRINK, 5, 5) + // Server password. + srv_pass_label := gtk.NewLabel(ctx.Translator.Translate("Password:", nil)) + srv_pass_label.SetAlignment(0, 0) + table.Attach(srv_pass_label, 0, 1, 2, 3, gtk.FILL, gtk.SHRINK, 5, 5) - f.server_password = gtk.NewEntry() - table.Attach(f.server_password, 1, 2, 2, 3, gtk.FILL, gtk.FILL, 5, 5) + f.server_password = gtk.NewEntry() + table.Attach(f.server_password, 1, 2, 2, 3, gtk.FILL, gtk.FILL, 5, 5) - // Profile to use. - profile_label := gtk.NewLabel(ctx.Translator.Translate("Profile:", nil)) - profile_label.SetAlignment(0, 0) - table.Attach(profile_label, 0, 1, 3, 4, gtk.FILL, gtk.SHRINK, 5, 5) + // Profile to use. + profile_label := gtk.NewLabel(ctx.Translator.Translate("Profile:", nil)) + profile_label.SetAlignment(0, 0) + table.Attach(profile_label, 0, 1, 3, 4, gtk.FILL, gtk.SHRINK, 5, 5) - f.profile = gtk.NewComboBoxText() - table.Attach(f.profile , 1, 2, 3, 4, gtk.FILL, gtk.FILL, 5, 5) + f.profile = gtk.NewComboBoxText() + table.Attach(f.profile, 1, 2, 3, 4, gtk.FILL, gtk.FILL, 5, 5) - // Invisible thing. - inv_label1 := gtk.NewLabel("") - table.Attach(inv_label1, 0, 1, 4, 5, gtk.EXPAND, gtk.FILL, 5, 5) - inv_label2 := gtk.NewLabel("") - table.Attach(inv_label2, 1, 2, 4, 5, gtk.EXPAND, gtk.FILL, 5, 5) + // Invisible thing. + inv_label1 := gtk.NewLabel("") + table.Attach(inv_label1, 0, 1, 4, 5, gtk.EXPAND, gtk.FILL, 5, 5) + inv_label2 := gtk.NewLabel("") + table.Attach(inv_label2, 1, 2, 4, 5, gtk.EXPAND, gtk.FILL, 5, 5) - // Buttons hbox. - buttons_hbox := gtk.NewHBox(false, 0) - sep := gtk.NewHSeparator() - buttons_hbox.PackStart(sep, true, true, 5) - // OK-Cancel buttons. - cancel_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Cancel", nil)) - cancel_button.Clicked(f.closeByCancel) - buttons_hbox.PackStart(cancel_button, false, true, 5) + // Buttons hbox. + buttons_hbox := gtk.NewHBox(false, 0) + sep := gtk.NewHSeparator() + buttons_hbox.PackStart(sep, true, true, 5) + // OK-Cancel buttons. + cancel_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Cancel", nil)) + cancel_button.Clicked(f.closeByCancel) + buttons_hbox.PackStart(cancel_button, false, true, 5) - ok_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("OK", nil)) - ok_button.Clicked(f.saveFavorite) - buttons_hbox.PackStart(ok_button, false, true, 5) + ok_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("OK", nil)) + ok_button.Clicked(f.saveFavorite) + buttons_hbox.PackStart(ok_button, false, true, 5) - f.vbox.PackStart(buttons_hbox, false, true, 5) + f.vbox.PackStart(buttons_hbox, false, true, 5) - f.window.Add(f.vbox) - f.window.ShowAll() + f.window.Add(f.vbox) + f.window.ShowAll() } func (f *FavoriteDialog) saveFavorite() error { - // Update server's information. - f.server.Name = f.server_name.GetText() - //ctx.Requester.Pooler.UpdateSpecificServer(f.server) + // Update server's information. + f.server.Name = f.server_name.GetText() + //ctx.Requester.Pooler.UpdateSpecificServer(f.server) - if len(f.server_address.GetText()) == 0 { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Server address is empty.\n\nServers without address cannot be added.", nil) - m := gtk.NewMessageDialog(f.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } - return errors.New("No server address specified") - } + if len(f.server_address.GetText()) == 0 { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Server address is empty.\n\nServers without address cannot be added.", nil) + m := gtk.NewMessageDialog(f.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } + return errors.New("No server address specified") + } - var port string = "" - if strings.Contains(f.server_address.GetText(), ":") { - port = strings.Split(f.server_address.GetText(), ":")[1] - } else { - port = "27960" - } - f.server.Ip = strings.Split(f.server_address.GetText(), ":")[0] - f.server.Port = port + var port string = "" + if strings.Contains(f.server_address.GetText(), ":") { + port = strings.Split(f.server_address.GetText(), ":")[1] + } else { + port = "27960" + } + f.server.Ip = strings.Split(f.server_address.GetText(), ":")[0] + f.server.Port = port - if len(f.profile.GetActiveText()) == 0 { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Profile wasn't selected.\n\nPlease, select valid profile for this server.\nIf you haven't add profiles yet - you can do it\nin options on \"Urban Terror\" tab.", nil) - m := gtk.NewMessageDialog(f.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } - return errors.New("No game profile specified") - } + if len(f.profile.GetActiveText()) == 0 { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Profile wasn't selected.\n\nPlease, select valid profile for this server.\nIf you haven't add profiles yet - you can do it\nin options on \"Urban Terror\" tab.", nil) + m := gtk.NewMessageDialog(f.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } + return errors.New("No game profile specified") + } - fmt.Println("Saving favorite server...") - fmt.Println(fmt.Sprintf("%+v", f.server)) + fmt.Println("Saving favorite server...") + fmt.Println(fmt.Sprintf("%+v", f.server)) - key := strings.Split(f.server_address.GetText(), ":")[0] + ":" + port + key := strings.Split(f.server_address.GetText(), ":")[0] + ":" + port - // Check if server already in cache. This would replace data about it. - _, ok := ctx.Cache.Servers[key] - if !ok { - ctx.Cache.Servers[key] = &cachemodels.Server{} - ctx.Cache.Servers[key].Server = &datamodels.Server{} - } + // Check if server already in cache. This would replace data about it. + _, ok := ctx.Cache.Servers[key] + if !ok { + ctx.Cache.Servers[key] = &cachemodels.Server{} + ctx.Cache.Servers[key].Server = &datamodels.Server{} + } - ctx.Cache.Servers[key].Server.Ip = f.server.Ip - ctx.Cache.Servers[key].Server.Port = f.server.Port - ctx.Cache.Servers[key].Server.Name = f.server.Name - ctx.Cache.Servers[key].Server.Password = f.server_password.GetText() - ctx.Cache.Servers[key].Server.ProfileToUse = f.profile.GetActiveText() - ctx.Cache.Servers[key].Server.Favorite = "1" - ctx.Cache.Servers[key].Server.ExtendedConfig = f.server.ExtendedConfig - ctx.Cache.Servers[key].Server.PlayersInfo = f.server.PlayersInfo + ctx.Cache.Servers[key].Server.Ip = f.server.Ip + ctx.Cache.Servers[key].Server.Port = f.server.Port + ctx.Cache.Servers[key].Server.Name = f.server.Name + ctx.Cache.Servers[key].Server.Password = f.server_password.GetText() + ctx.Cache.Servers[key].Server.ProfileToUse = f.profile.GetActiveText() + ctx.Cache.Servers[key].Server.Favorite = "1" + ctx.Cache.Servers[key].Server.ExtendedConfig = f.server.ExtendedConfig + ctx.Cache.Servers[key].Server.PlayersInfo = f.server.PlayersInfo - ctx.Eventer.LaunchEvent("flushServers", map[string]string{}) - ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) - f.window.Destroy() + ctx.Eventer.LaunchEvent("flushServers", map[string]string{}) + ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + f.window.Destroy() - return nil + return nil } func (f *FavoriteDialog) updateServerInfo() { - fmt.Println("Updating server information...") - var port string = "" - if strings.Contains(f.server_address.GetText(), ":") { - port = strings.Split(f.server_address.GetText(), ":")[1] - } else { - port = "27960" - } - f.server.Ip = strings.Split(f.server_address.GetText(), ":")[0] - f.server.Port = port + fmt.Println("Updating server information...") + var port string = "" + if strings.Contains(f.server_address.GetText(), ":") { + port = strings.Split(f.server_address.GetText(), ":")[1] + } else { + port = "27960" + } + f.server.Ip = strings.Split(f.server_address.GetText(), ":")[0] + f.server.Port = port - ctx.Requester.Pooler.UpdateSpecificServer(f.server) + ctx.Requester.Pooler.UpdateSpecificServer(f.server) - f.fill() + f.fill() } diff --git a/ui/gtk2/mainwindow.go b/ui/gtk2/mainwindow.go index a9c22e8..2ee658e 100644 --- a/ui/gtk2/mainwindow.go +++ b/ui/gtk2/mainwindow.go @@ -10,830 +10,829 @@ package ui import ( - // stdlib - "fmt" - "runtime" - "sort" - "strconv" - "strings" + // stdlib + "fmt" + "runtime" + "sort" + "strconv" + "strings" - // Local - "github.com/pztrn/urtrator/datamodels" - "github.com/pztrn/urtrator/ioq3dataparser" + // Local + "gitlab.com/pztrn/urtrator/datamodels" + "gitlab.com/pztrn/urtrator/ioq3dataparser" - // Other - "github.com/mattn/go-gtk/gdkpixbuf" - "github.com/mattn/go-gtk/glib" - "github.com/mattn/go-gtk/gtk" + // Other + "github.com/mattn/go-gtk/gdkpixbuf" + "github.com/mattn/go-gtk/glib" + "github.com/mattn/go-gtk/gtk" ) type MainWindow struct { - // Gamemodes. - gamemodes map[string]string + // Gamemodes. + gamemodes map[string]string - text string + text string - // Widgets. - // The window itself. - window *gtk.Window - // Vertical Box. - vbox *gtk.VBox - // Main menu. - menubar *gtk.MenuBar - // Toolbar - toolbar *gtk.Toolbar - // Horizontal box for main window. - hpane *gtk.HPaned - // Tab widget. - tab_widget *gtk.Notebook - // Tabs list. - tabs map[string]*gtk.Frame - // All servers widget. - all_servers *gtk.TreeView - // Favorite servers widget. - fav_servers *gtk.TreeView - // Statusbar. - statusbar *gtk.Statusbar - // Statusbar context ID. - statusbar_context_id uint - // Profiles combobox. - profiles *gtk.ComboBoxText - // Checkbox for hiding/showing offline servers in 'Servers' tab list. - all_servers_hide_offline *gtk.CheckButton - // Checkbox for hiding/showing passworded servers in 'Servers' tab list. - all_servers_hide_private *gtk.CheckButton - // Combobox for filtering server's versions. - all_servers_version *gtk.ComboBoxText - // Combobox for filtering by gamemode. - all_servers_gamemode *gtk.ComboBoxText - // Checkbox for hiding/showing offline servers in 'Favorites' tab list. - fav_servers_hide_offline *gtk.CheckButton - // Checkbox for hiding/showing passworded servers in 'Favorites' tab list. - fav_servers_hide_private *gtk.CheckButton - // Combobox for filtering server's versions. - fav_servers_version *gtk.ComboBoxText - // Combobox for filtering by gamemode. - fav_servers_gamemode *gtk.ComboBoxText - // Game launch button. - launch_button *gtk.Button - // Server's main information. - server_info *gtk.TreeView - // Players information. - players_info *gtk.TreeView - // Quick connect: server address - qc_server_address *gtk.Entry - // Quick connect: password - qc_password *gtk.Entry - // Quick connect: nickname - qc_nickname *gtk.Entry - // Tray icon. - tray_icon *gtk.StatusIcon - // Tray menu. - tray_menu *gtk.Menu - // Toolbar's label. - toolbar_label *gtk.Label + // Widgets. + // The window itself. + window *gtk.Window + // Vertical Box. + vbox *gtk.VBox + // Main menu. + menubar *gtk.MenuBar + // Toolbar + toolbar *gtk.Toolbar + // Horizontal box for main window. + hpane *gtk.HPaned + // Tab widget. + tab_widget *gtk.Notebook + // Tabs list. + tabs map[string]*gtk.Frame + // All servers widget. + all_servers *gtk.TreeView + // Favorite servers widget. + fav_servers *gtk.TreeView + // Statusbar. + statusbar *gtk.Statusbar + // Statusbar context ID. + statusbar_context_id uint + // Profiles combobox. + profiles *gtk.ComboBoxText + // Checkbox for hiding/showing offline servers in 'Servers' tab list. + all_servers_hide_offline *gtk.CheckButton + // Checkbox for hiding/showing passworded servers in 'Servers' tab list. + all_servers_hide_private *gtk.CheckButton + // Combobox for filtering server's versions. + all_servers_version *gtk.ComboBoxText + // Combobox for filtering by gamemode. + all_servers_gamemode *gtk.ComboBoxText + // Checkbox for hiding/showing offline servers in 'Favorites' tab list. + fav_servers_hide_offline *gtk.CheckButton + // Checkbox for hiding/showing passworded servers in 'Favorites' tab list. + fav_servers_hide_private *gtk.CheckButton + // Combobox for filtering server's versions. + fav_servers_version *gtk.ComboBoxText + // Combobox for filtering by gamemode. + fav_servers_gamemode *gtk.ComboBoxText + // Game launch button. + launch_button *gtk.Button + // Server's main information. + server_info *gtk.TreeView + // Players information. + players_info *gtk.TreeView + // Quick connect: server address + qc_server_address *gtk.Entry + // Quick connect: password + qc_password *gtk.Entry + // Quick connect: nickname + qc_nickname *gtk.Entry + // Tray icon. + tray_icon *gtk.StatusIcon + // Tray menu. + tray_menu *gtk.Menu + // Toolbar's label. + toolbar_label *gtk.Label - // Storages. - // All servers store. - all_servers_store *gtk.ListStore - // All servers sortable store. - all_servers_store_sortable *gtk.TreeSortable - // Favorites - fav_servers_store *gtk.ListStore - // Server's information store. - server_info_store *gtk.ListStore - // Players information store. - players_info_store *gtk.ListStore + // Storages. + // All servers store. + all_servers_store *gtk.ListStore + // All servers sortable store. + all_servers_store_sortable *gtk.TreeSortable + // Favorites + fav_servers_store *gtk.ListStore + // Server's information store. + server_info_store *gtk.ListStore + // Players information store. + players_info_store *gtk.ListStore - // Dialogs. - options_dialog *OptionsDialog - server_cvars_dialog *ServerCVarsDialog + // Dialogs. + options_dialog *OptionsDialog + server_cvars_dialog *ServerCVarsDialog - // Other - // Old profiles count. - old_profiles_count int - // Window size. - window_width int - window_height int - // Window position. - window_pos_x int - window_pos_y int - // Main pane delimiter position. It is calculated like: - // - // window_width - pane_position - // - // so we will get same right pane width even if we will resize - // main window. On resize and restore it will be set like: - // - // window_width - m.pane_negative_position - pane_negative_position int - // Columns names for servers tabs. - column_names map[string]string - // Real columns positions on servers tabs. - column_pos map[string]map[string]int + // Other + // Old profiles count. + old_profiles_count int + // Window size. + window_width int + window_height int + // Window position. + window_pos_x int + window_pos_y int + // Main pane delimiter position. It is calculated like: + // + // window_width - pane_position + // + // so we will get same right pane width even if we will resize + // main window. On resize and restore it will be set like: + // + // window_width - m.pane_negative_position + pane_negative_position int + // Columns names for servers tabs. + column_names map[string]string + // Real columns positions on servers tabs. + column_pos map[string]map[string]int - // Resources. - // Pixbufs. - // For unavailable (e.g. offline) server. - server_offline_pic *gdkpixbuf.Pixbuf - // For online server. - server_online_pic *gdkpixbuf.Pixbuf - // For private (passworded) server. - server_private_pic *gdkpixbuf.Pixbuf - // For public server - server_public_pic *gdkpixbuf.Pixbuf + // Resources. + // Pixbufs. + // For unavailable (e.g. offline) server. + server_offline_pic *gdkpixbuf.Pixbuf + // For online server. + server_online_pic *gdkpixbuf.Pixbuf + // For private (passworded) server. + server_private_pic *gdkpixbuf.Pixbuf + // For public server + server_public_pic *gdkpixbuf.Pixbuf - - // Flags. - // Application is initialized? - initialized bool - // Window is hidden? - hidden bool - // Use other's tab information? - // Used when user changed active tab, to show information about - // server which is selected on activated tab. - use_other_servers_tab bool - // Does servers updating already in progress? - // This helps to prevent random crashes when more than one - // updating process in progress. - servers_already_updating bool + // Flags. + // Application is initialized? + initialized bool + // Window is hidden? + hidden bool + // Use other's tab information? + // Used when user changed active tab, to show information about + // server which is selected on activated tab. + use_other_servers_tab bool + // Does servers updating already in progress? + // This helps to prevent random crashes when more than one + // updating process in progress. + servers_already_updating bool } func (m *MainWindow) addToFavorites() { - fmt.Println("Adding server to favorites...") + fmt.Println("Adding server to favorites...") - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - server_address := "" - if !strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - server_address = m.getIpFromServersList(current_tab) - } + server_address := "" + if !strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + server_address = m.getIpFromServersList(current_tab) + } - // Getting server from database. - fd := &FavoriteDialog{} - if len(server_address) > 0 { - servers := []datamodels.Server{} - address := strings.Split(server_address, ":")[0] - port := strings.Split(server_address, ":")[1] - err1 := ctx.Database.Db.Select(&servers, ctx.Database.Db.Rebind("SELECT * FROM servers WHERE ip=? AND port=?"), address, port) - if err1 != nil { - fmt.Println(err1.Error()) - } - fd.InitializeUpdate(&servers[0]) - } else { - fd.InitializeNew() - } + // Getting server from database. + fd := &FavoriteDialog{} + if len(server_address) > 0 { + servers := []datamodels.Server{} + address := strings.Split(server_address, ":")[0] + port := strings.Split(server_address, ":")[1] + err1 := ctx.Database.Db.Select(&servers, ctx.Database.Db.Rebind("SELECT * FROM servers WHERE ip=? AND port=?"), address, port) + if err1 != nil { + fmt.Println(err1.Error()) + } + fd.InitializeUpdate(&servers[0]) + } else { + fd.InitializeNew() + } } func (m *MainWindow) allServersGamemodeFilterChanged() { - ctx.Cfg.Cfg["/serverslist/all_servers/gamemode"] = strconv.Itoa(m.all_servers_gamemode.GetActive()) - ctx.Eventer.LaunchEvent("loadAllServers", nil) + ctx.Cfg.Cfg["/serverslist/all_servers/gamemode"] = strconv.Itoa(m.all_servers_gamemode.GetActive()) + ctx.Eventer.LaunchEvent("loadAllServers", nil) } func (m *MainWindow) allServersVersionFilterChanged() { - ctx.Cfg.Cfg["/serverslist/all_servers/version"] = strconv.Itoa(m.all_servers_version.GetActive()) - ctx.Eventer.LaunchEvent("loadAllServers", nil) + ctx.Cfg.Cfg["/serverslist/all_servers/version"] = strconv.Itoa(m.all_servers_version.GetActive()) + ctx.Eventer.LaunchEvent("loadAllServers", nil) } // Executes when delimiter for two panes is moved, to calculate VALID // position. func (m *MainWindow) checkMainPanePosition() { - glib.IdleAdd(func() bool { - m.pane_negative_position = m.window_width - m.hpane.GetPosition() - return false - }) + glib.IdleAdd(func() bool { + m.pane_negative_position = m.window_width - m.hpane.GetPosition() + return false + }) } // Executes when main window is moved or resized. // Also calculating pane delimiter position and set it to avoid // widgets hell :). func (m *MainWindow) checkPositionAndSize() { - glib.IdleAdd(func() bool { - m.window.GetPosition(&m.window_pos_x, &m.window_pos_y) - m.window.GetSize(&m.window_width, &m.window_height) + glib.IdleAdd(func() bool { + m.window_pos_x, m.window_pos_y = m.window.GetPosition() + m.window_width, m.window_height = m.window.GetSize() - m.hpane.SetPosition(m.window_width - m.pane_negative_position) - return false - }) + m.hpane.SetPosition(m.window_width - m.pane_negative_position) + return false + }) } // Executes on URTrator shutdown. func (m *MainWindow) Close() { - // Save window parameters. - ctx.Cfg.Cfg["/mainwindow/width"] = strconv.Itoa(m.window_width) - ctx.Cfg.Cfg["/mainwindow/height"] = strconv.Itoa(m.window_height) - ctx.Cfg.Cfg["/mainwindow/position_x"] = strconv.Itoa(m.window_pos_x) - ctx.Cfg.Cfg["/mainwindow/position_y"] = strconv.Itoa(m.window_pos_y) - ctx.Cfg.Cfg["/mainwindow/pane_negative_position"] = strconv.Itoa(m.pane_negative_position) + // Save window parameters. + ctx.Cfg.Cfg["/mainwindow/width"] = strconv.Itoa(m.window_width) + ctx.Cfg.Cfg["/mainwindow/height"] = strconv.Itoa(m.window_height) + ctx.Cfg.Cfg["/mainwindow/position_x"] = strconv.Itoa(m.window_pos_x) + ctx.Cfg.Cfg["/mainwindow/position_y"] = strconv.Itoa(m.window_pos_y) + ctx.Cfg.Cfg["/mainwindow/pane_negative_position"] = strconv.Itoa(m.pane_negative_position) - // Saving columns sizes and positions. - all_servers_columns := m.all_servers.GetColumns() - for i := range all_servers_columns { - ctx.Cfg.Cfg["/mainwindow/all_servers/" + all_servers_columns[i].GetTitle() + "_position"] = strconv.Itoa(i) - ctx.Cfg.Cfg["/mainwindow/all_servers/" + all_servers_columns[i].GetTitle() + "_width"] = strconv.Itoa(all_servers_columns[i].GetWidth()) - } - fav_servers_columns := m.fav_servers.GetColumns() - for i := range fav_servers_columns { - ctx.Cfg.Cfg["/mainwindow/fav_servers/" + fav_servers_columns[i].GetTitle() + "_position"] = strconv.Itoa(i) - ctx.Cfg.Cfg["/mainwindow/fav_servers/" + fav_servers_columns[i].GetTitle() + "_width"] = strconv.Itoa(fav_servers_columns[i].GetWidth()) - } + // Saving columns sizes and positions. + all_servers_columns := m.all_servers.GetColumns() + for i := range all_servers_columns { + ctx.Cfg.Cfg["/mainwindow/all_servers/"+all_servers_columns[i].GetTitle()+"_position"] = strconv.Itoa(i) + ctx.Cfg.Cfg["/mainwindow/all_servers/"+all_servers_columns[i].GetTitle()+"_width"] = strconv.Itoa(all_servers_columns[i].GetWidth()) + } + fav_servers_columns := m.fav_servers.GetColumns() + for i := range fav_servers_columns { + ctx.Cfg.Cfg["/mainwindow/fav_servers/"+fav_servers_columns[i].GetTitle()+"_position"] = strconv.Itoa(i) + ctx.Cfg.Cfg["/mainwindow/fav_servers/"+fav_servers_columns[i].GetTitle()+"_width"] = strconv.Itoa(fav_servers_columns[i].GetWidth()) + } - // Additional actions should be taken on Windows. - if runtime.GOOS == "windows" { - m.closeWin() - } + // Additional actions should be taken on Windows. + if runtime.GOOS == "windows" { + m.closeWin() + } - ctx.Close() + ctx.Close() } func (m *MainWindow) copyServerCredentialsToClipboard() { - fmt.Println("Copying server's credentials to clipboard...") - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - server_address := m.getIpFromServersList(current_tab) - ctx.Clipboard.CopyServerData(server_address) + fmt.Println("Copying server's credentials to clipboard...") + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + server_address := m.getIpFromServersList(current_tab) + ctx.Clipboard.CopyServerData(server_address) } // Deleting server from favorites. func (m *MainWindow) deleteFromFavorites() { - fmt.Println("Removing server from favorites...") - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + fmt.Println("Removing server from favorites...") + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - server_address := m.getIpFromServersList(current_tab) + server_address := m.getIpFromServersList(current_tab) - var not_favorited bool = false - if len(server_address) > 0 { - if ctx.Cache.Servers[server_address].Server.Favorite == "1" { - ctx.Cache.Servers[server_address].Server.Favorite = "0" - } else { - not_favorited = true - } - } else { - not_favorited = true - } + var not_favorited bool = false + if len(server_address) > 0 { + if ctx.Cache.Servers[server_address].Server.Favorite == "1" { + ctx.Cache.Servers[server_address].Server.Favorite = "0" + } else { + not_favorited = true + } + } else { + not_favorited = true + } - if not_favorited { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Cannot delete server from favorites.\n\nServer isn't favorited.", nil) - d := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, mbox_string) - d.Response(func() { - d.Destroy() - }) - d.Run() - } else { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Server isn't favorited", nil) + ""}) - } - } + if not_favorited { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Cannot delete server from favorites.\n\nServer isn't favorited.", nil) + d := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, mbox_string) + d.Response(func() { + d.Destroy() + }) + d.Run() + } else { + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Server isn't favorited", nil) + ""}) + } + } - ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) } // Drop database data. // ToDo: extend so we should have an ability to decide what to drop. func (m *MainWindow) dropDatabasesData() { - fmt.Println("Dropping database data...") - var will_continue bool = false - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("You are about to drop whole database data.\n\nAfter clicking \"YES\" ALL data in database (servers, profiles, settings, etc.)\nwill be lost FOREVER. Are you sure?", nil) - d := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO, mbox_string) - d.Connect("response", func(resp *glib.CallbackContext) { - if resp.Args(0) == 4294967287 { - will_continue = false - } else { - will_continue = true - } - d.Destroy() - }) - d.Run() - } else { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Remove ~/.config/urtrator/database.sqlite3 manually!", nil) + ""}) - } + fmt.Println("Dropping database data...") + var will_continue bool = false + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("You are about to drop whole database data.\n\nAfter clicking \"YES\" ALL data in database (servers, profiles, settings, etc.)\nwill be lost FOREVER. Are you sure?", nil) + d := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO, mbox_string) + d.Connect("response", func(resp *glib.CallbackContext) { + if resp.Args(0) == 4294967287 { + will_continue = false + } else { + will_continue = true + } + d.Destroy() + }) + d.Run() + } else { + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Remove ~/.config/urtrator/database.sqlite3 manually!", nil) + ""}) + } - if will_continue { - ctx.Database.Db.MustExec("DELETE FROM servers") - ctx.Database.Db.MustExec("DELETE FROM settings") - ctx.Database.Db.MustExec("DELETE FROM urt_profiles") + if will_continue { + ctx.Database.Db.MustExec("DELETE FROM servers") + ctx.Database.Db.MustExec("DELETE FROM settings") + ctx.Database.Db.MustExec("DELETE FROM urt_profiles") - ctx.Eventer.LaunchEvent("loadProfiles", map[string]string{}) - ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) - ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) - } + ctx.Eventer.LaunchEvent("loadProfiles", map[string]string{}) + ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) + ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + } } // Executes on "Edit favorite server" click. func (m *MainWindow) editFavorite() { - fmt.Println("Editing favorite server...") + fmt.Println("Editing favorite server...") - server_address := m.getIpFromServersList("Favorites") + server_address := m.getIpFromServersList("Favorites") - if len(server_address) > 0 { - srv := ctx.Cache.Servers[server_address].Server - fd := FavoriteDialog{} - fd.InitializeUpdate(srv) - } + if len(server_address) > 0 { + srv := ctx.Cache.Servers[server_address].Server + fd := FavoriteDialog{} + fd.InitializeUpdate(srv) + } } func (m *MainWindow) favServersGamemodeFilterChanged() { - ctx.Cfg.Cfg["/serverslist/favorite/gamemode"] = strconv.Itoa(m.fav_servers_gamemode.GetActive()) - ctx.Eventer.LaunchEvent("loadFavoriteServers", nil) + ctx.Cfg.Cfg["/serverslist/favorite/gamemode"] = strconv.Itoa(m.fav_servers_gamemode.GetActive()) + ctx.Eventer.LaunchEvent("loadFavoriteServers", nil) } func (m *MainWindow) favServersVersionFilterChanged() { - ctx.Cfg.Cfg["/serverslist/favorite/version"] = strconv.Itoa(m.fav_servers_version.GetActive()) - ctx.Eventer.LaunchEvent("loadFavoriteServers", nil) + ctx.Cfg.Cfg["/serverslist/favorite/version"] = strconv.Itoa(m.fav_servers_version.GetActive()) + ctx.Eventer.LaunchEvent("loadFavoriteServers", nil) } // Executes when "Hide offline servers" checkbox changed it's state on // "Servers" tab. func (m *MainWindow) hideOfflineAllServers() { - fmt.Println("(Un)Hiding offline servers in 'Servers' tab...") - if m.all_servers_hide_offline.GetActive() { - ctx.Cfg.Cfg["/serverslist/all_servers/hide_offline"] = "1" - } else { - ctx.Cfg.Cfg["/serverslist/all_servers/hide_offline"] = "0" - } - ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) + fmt.Println("(Un)Hiding offline servers in 'Servers' tab...") + if m.all_servers_hide_offline.GetActive() { + ctx.Cfg.Cfg["/serverslist/all_servers/hide_offline"] = "1" + } else { + ctx.Cfg.Cfg["/serverslist/all_servers/hide_offline"] = "0" + } + ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) } // Executes when "Hide passworded servers" checkbox changed it's state on // "Servers" tab. func (m *MainWindow) hidePrivateAllServers() { - fmt.Println("(Un)Hiding private servers in 'Servers' tab...") - if m.all_servers_hide_private.GetActive() { - ctx.Cfg.Cfg["/serverslist/all_servers/hide_private"] = "1" - } else { - ctx.Cfg.Cfg["/serverslist/all_servers/hide_private"] = "0" - } - ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) + fmt.Println("(Un)Hiding private servers in 'Servers' tab...") + if m.all_servers_hide_private.GetActive() { + ctx.Cfg.Cfg["/serverslist/all_servers/hide_private"] = "1" + } else { + ctx.Cfg.Cfg["/serverslist/all_servers/hide_private"] = "0" + } + ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) } // Executes when "Hide offline servers" checkbox changed it's state on // "Favorites" tab. func (m *MainWindow) hideOfflineFavoriteServers() { - fmt.Println("(Un)Hiding offline servers in 'Favorite' tab...") - if m.fav_servers_hide_offline.GetActive() { - ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"] = "1" - } else { - ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"] = "0" - } - ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + fmt.Println("(Un)Hiding offline servers in 'Favorite' tab...") + if m.fav_servers_hide_offline.GetActive() { + ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"] = "1" + } else { + ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"] = "0" + } + ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) } // Executes when "Hide passworded servers" checkbox changed it's state on // "Favorites" tab. func (m *MainWindow) hidePrivateFavoriteServers() { - fmt.Println("(Un)Hiding private servers in 'Favorite' tab...") - if m.all_servers_hide_private.GetActive() { - ctx.Cfg.Cfg["/serverslist/favorite/hide_private"] = "1" - } else { - ctx.Cfg.Cfg["/serverslist/favorite/hide_private"] = "0" - } - ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + fmt.Println("(Un)Hiding private servers in 'Favorite' tab...") + if m.all_servers_hide_private.GetActive() { + ctx.Cfg.Cfg["/serverslist/favorite/hide_private"] = "1" + } else { + ctx.Cfg.Cfg["/serverslist/favorite/hide_private"] = "0" + } + ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) } func (m *MainWindow) loadAllServers(data map[string]string) { - fmt.Println("Loading all servers...") - for _, server := range ctx.Cache.Servers { - iter := new(gtk.TreeIter) - ping, _ := strconv.Atoi(server.Server.Ping) + fmt.Println("Loading all servers...") + for _, server := range ctx.Cache.Servers { + iter := new(gtk.TreeIter) + ping, _ := strconv.Atoi(server.Server.Ping) - if !server.AllServersIterSet { - server.AllServersIter = iter - server.AllServersIterSet = true - } else { - iter = server.AllServersIter - } + if !server.AllServersIterSet { + server.AllServersIter = iter + server.AllServersIterSet = true + } else { + iter = server.AllServersIter + } - // Hide offline servers? - if m.all_servers_hide_offline.GetActive() && (server.Server.Players == "" && server.Server.Maxplayers == "" || ping > 9000) { - if server.AllServersIterInList && server.AllServersIterSet { - m.all_servers_store.Remove(iter) - server.AllServersIterInList = false - } - continue - } + // Hide offline servers? + if m.all_servers_hide_offline.GetActive() && (server.Server.Players == "" && server.Server.Maxplayers == "" || ping > 9000) { + if server.AllServersIterInList && server.AllServersIterSet { + m.all_servers_store.Remove(iter) + server.AllServersIterInList = false + } + continue + } - // Hide private servers? - if m.all_servers_hide_private.GetActive() && server.Server.IsPrivate == "1" { - if server.AllServersIterInList && server.AllServersIterSet { - m.all_servers_store.Remove(iter) - server.AllServersIterInList = false - } - continue - } + // Hide private servers? + if m.all_servers_hide_private.GetActive() && server.Server.IsPrivate == "1" { + if server.AllServersIterInList && server.AllServersIterSet { + m.all_servers_store.Remove(iter) + server.AllServersIterInList = false + } + continue + } - // Hide servers that using different version than selected in - // filter? - if m.all_servers_version.GetActiveText() != ctx.Translator.Translate("All versions", nil) && m.all_servers_version.GetActiveText() != server.Server.Version { - if server.AllServersIterInList && server.AllServersIterSet { - m.all_servers_store.Remove(iter) - server.AllServersIterInList = false - } - continue - } + // Hide servers that using different version than selected in + // filter? + if m.all_servers_version.GetActiveText() != ctx.Translator.Translate("All versions", nil) && m.all_servers_version.GetActiveText() != server.Server.Version { + if server.AllServersIterInList && server.AllServersIterSet { + m.all_servers_store.Remove(iter) + server.AllServersIterInList = false + } + continue + } - // Hide servers that using different gamemode than selected in - // filter? - gm_int_as_str := strconv.Itoa(m.all_servers_gamemode.GetActive()) - if m.all_servers_gamemode.GetActiveText() != ctx.Translator.Translate("All gamemodes", nil) && gm_int_as_str != server.Server.Gamemode { - if server.AllServersIterInList && server.AllServersIterSet { - m.all_servers_store.Remove(iter) - server.AllServersIterInList = false - } - continue - } + // Hide servers that using different gamemode than selected in + // filter? + gm_int_as_str := strconv.Itoa(m.all_servers_gamemode.GetActive()) + if m.all_servers_gamemode.GetActiveText() != ctx.Translator.Translate("All gamemodes", nil) && gm_int_as_str != server.Server.Gamemode { + if server.AllServersIterInList && server.AllServersIterSet { + m.all_servers_store.Remove(iter) + server.AllServersIterInList = false + } + continue + } - if !server.AllServersIterInList && server.AllServersIterSet { - m.all_servers_store.Append(iter) - server.AllServersIterInList = true - } + if !server.AllServersIterInList && server.AllServersIterSet { + m.all_servers_store.Append(iter) + server.AllServersIterInList = true + } - if server.Server.Name == "" && server.Server.Players == "" { - m.all_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("IP", nil)], server.Server.Ip + ":" + server.Server.Port) - } else { - if ping > 9000 { - m.all_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) - } else { - m.all_servers_store.SetValue(iter, 0, m.server_online_pic.GPixbuf) - } - if server.Server.IsPrivate == "1" { - m.all_servers_store.SetValue(iter, 1, m.server_private_pic.GPixbuf) - } else { - m.all_servers_store.SetValue(iter, 1, m.server_public_pic.GPixbuf) - } - server_name := ctx.Colorizer.Fix(server.Server.Name) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], server_name) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Mode", nil)], m.getGameModeName(server.Server.Gamemode)) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Map", nil)], server.Server.Map) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], server.Server.Players + "/" + server.Server.Bots + "/" + server.Server.Maxplayers) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], server.Server.Ping) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Version", nil)], server.Server.Version) - m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("IP", nil)], server.Server.Ip + ":" + server.Server.Port) - } - } + if server.Server.Name == "" && server.Server.Players == "" { + m.all_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("IP", nil)], server.Server.Ip+":"+server.Server.Port) + } else { + if ping > 9000 { + m.all_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) + } else { + m.all_servers_store.SetValue(iter, 0, m.server_online_pic.GPixbuf) + } + if server.Server.IsPrivate == "1" { + m.all_servers_store.SetValue(iter, 1, m.server_private_pic.GPixbuf) + } else { + m.all_servers_store.SetValue(iter, 1, m.server_public_pic.GPixbuf) + } + server_name := ctx.Colorizer.Fix(server.Server.Name) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], server_name) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Mode", nil)], m.getGameModeName(server.Server.Gamemode)) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Map", nil)], server.Server.Map) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], server.Server.Players+"/"+server.Server.Bots+"/"+server.Server.Maxplayers) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], server.Server.Ping) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("Version", nil)], server.Server.Version) + m.all_servers_store.SetValue(iter, m.column_pos["Servers"][ctx.Translator.Translate("IP", nil)], server.Server.Ip+":"+server.Server.Port) + } + } } func (m *MainWindow) loadFavoriteServers(data map[string]string) { - fmt.Println("Loading favorite servers...") - for _, server := range ctx.Cache.Servers { - iter := new(gtk.TreeIter) - ping, _ := strconv.Atoi(server.Server.Ping) + fmt.Println("Loading favorite servers...") + for _, server := range ctx.Cache.Servers { + iter := new(gtk.TreeIter) + ping, _ := strconv.Atoi(server.Server.Ping) - if !server.FavServersIterSet { - server.FavServersIter = iter - server.FavServersIterSet = true - } else { - iter = server.FavServersIter - } + if !server.FavServersIterSet { + server.FavServersIter = iter + server.FavServersIterSet = true + } else { + iter = server.FavServersIter + } - // Hide offline servers? - if m.fav_servers_hide_offline.GetActive() && (server.Server.Players == "" && server.Server.Maxplayers == "" || ping > 9000) { - if server.FavServersIterInList { - m.fav_servers_store.Remove(iter) - server.FavServersIterInList = false - } - continue - } + // Hide offline servers? + if m.fav_servers_hide_offline.GetActive() && (server.Server.Players == "" && server.Server.Maxplayers == "" || ping > 9000) { + if server.FavServersIterInList { + m.fav_servers_store.Remove(iter) + server.FavServersIterInList = false + } + continue + } - // Hide private servers? - if m.fav_servers_hide_private.GetActive() && server.Server.IsPrivate == "1" { - if server.FavServersIterInList && server.FavServersIterSet { - m.fav_servers_store.Remove(iter) - server.FavServersIterInList = false - } - continue - } + // Hide private servers? + if m.fav_servers_hide_private.GetActive() && server.Server.IsPrivate == "1" { + if server.FavServersIterInList && server.FavServersIterSet { + m.fav_servers_store.Remove(iter) + server.FavServersIterInList = false + } + continue + } - // Hide servers that using different version than selected in - // filter? - if m.fav_servers_version.GetActiveText() != ctx.Translator.Translate("All versions", nil) && m.fav_servers_version.GetActiveText() != server.Server.Version { - if server.FavServersIterInList && server.FavServersIterSet { - m.fav_servers_store.Remove(iter) - server.FavServersIterInList = false - } - continue - } + // Hide servers that using different version than selected in + // filter? + if m.fav_servers_version.GetActiveText() != ctx.Translator.Translate("All versions", nil) && m.fav_servers_version.GetActiveText() != server.Server.Version { + if server.FavServersIterInList && server.FavServersIterSet { + m.fav_servers_store.Remove(iter) + server.FavServersIterInList = false + } + continue + } - // Hide servers that using different gamemode than selected in - // filter? - gm_int_as_str := strconv.Itoa(m.fav_servers_gamemode.GetActive()) - if m.fav_servers_gamemode.GetActiveText() != ctx.Translator.Translate("All gamemodes", nil) && gm_int_as_str != server.Server.Gamemode { - if server.FavServersIterInList && server.FavServersIterSet { - m.fav_servers_store.Remove(iter) - server.FavServersIterInList = false - } - continue - } + // Hide servers that using different gamemode than selected in + // filter? + gm_int_as_str := strconv.Itoa(m.fav_servers_gamemode.GetActive()) + if m.fav_servers_gamemode.GetActiveText() != ctx.Translator.Translate("All gamemodes", nil) && gm_int_as_str != server.Server.Gamemode { + if server.FavServersIterInList && server.FavServersIterSet { + m.fav_servers_store.Remove(iter) + server.FavServersIterInList = false + } + continue + } - // If server on favorites widget, but not favorited (e.g. just - // removed from favorites) - remove it from list. - if server.Server.Favorite != "1" && server.FavServersIterSet && server.FavServersIterInList { - m.fav_servers_store.Remove(server.FavServersIter) - server.FavServersIterInList = false - server.FavServersIterSet = false - } + // If server on favorites widget, but not favorited (e.g. just + // removed from favorites) - remove it from list. + if server.Server.Favorite != "1" && server.FavServersIterSet && server.FavServersIterInList { + m.fav_servers_store.Remove(server.FavServersIter) + server.FavServersIterInList = false + server.FavServersIterSet = false + } - // Server isn't in favorites and wasn't previously added to widget. - if server.Server.Favorite != "1" { - continue - } + // Server isn't in favorites and wasn't previously added to widget. + if server.Server.Favorite != "1" { + continue + } - if !server.FavServersIterInList && server.FavServersIterSet { - m.fav_servers_store.Append(iter) - server.FavServersIterInList = true - } + if !server.FavServersIterInList && server.FavServersIterSet { + m.fav_servers_store.Append(iter) + server.FavServersIterInList = true + } - if server.Server.Name == "" && server.Server.Players == "" { - m.fav_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("IP", nil)], server.Server.Ip + ":" + server.Server.Port) - } else { - if ping > 9000 { - m.fav_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) - } else { - m.fav_servers_store.SetValue(iter, 0, m.server_online_pic.GPixbuf) - } - if server.Server.IsPrivate == "1" { - m.fav_servers_store.SetValue(iter, 1, m.server_private_pic.GPixbuf) - } else { - m.fav_servers_store.SetValue(iter, 1, m.server_public_pic.GPixbuf) - } - server_name := ctx.Colorizer.Fix(server.Server.Name) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], server_name) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Mode", nil)], m.getGameModeName(server.Server.Gamemode)) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Map", nil)], server.Server.Map) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], server.Server.Players + "/" + server.Server.Bots + "/" + server.Server.Maxplayers) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], server.Server.Ping) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Version", nil)], server.Server.Version) - m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("IP", nil)], server.Server.Ip + ":" + server.Server.Port) - } - } + if server.Server.Name == "" && server.Server.Players == "" { + m.fav_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("IP", nil)], server.Server.Ip+":"+server.Server.Port) + } else { + if ping > 9000 { + m.fav_servers_store.SetValue(iter, 0, m.server_offline_pic.GPixbuf) + } else { + m.fav_servers_store.SetValue(iter, 0, m.server_online_pic.GPixbuf) + } + if server.Server.IsPrivate == "1" { + m.fav_servers_store.SetValue(iter, 1, m.server_private_pic.GPixbuf) + } else { + m.fav_servers_store.SetValue(iter, 1, m.server_public_pic.GPixbuf) + } + server_name := ctx.Colorizer.Fix(server.Server.Name) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], server_name) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Mode", nil)], m.getGameModeName(server.Server.Gamemode)) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Map", nil)], server.Server.Map) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], server.Server.Players+"/"+server.Server.Bots+"/"+server.Server.Maxplayers) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], server.Server.Ping) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("Version", nil)], server.Server.Version) + m.fav_servers_store.SetValue(iter, m.column_pos["Favorites"][ctx.Translator.Translate("IP", nil)], server.Server.Ip+":"+server.Server.Port) + } + } } func (m *MainWindow) loadProfiles(data map[string]string) { - fmt.Println("Loading profiles into combobox on MainWindow") - for i := 0; i < m.old_profiles_count; i++ { - // ComboBox indexes are shifting on element deletion, so we should - // detele very first element every time. - m.profiles.Remove(0) - } + fmt.Println("Loading profiles into combobox on MainWindow") + for i := 0; i < m.old_profiles_count; i++ { + // ComboBox indexes are shifting on element deletion, so we should + // detele very first element every time. + m.profiles.Remove(0) + } - for _, profile := range ctx.Cache.Profiles { - m.profiles.AppendText(profile.Profile.Name) - } + for _, profile := range ctx.Cache.Profiles { + m.profiles.AppendText(profile.Profile.Name) + } - m.old_profiles_count = len(ctx.Cache.Profiles) - fmt.Println("Added " + strconv.Itoa(m.old_profiles_count) + " profiles") + m.old_profiles_count = len(ctx.Cache.Profiles) + fmt.Println("Added " + strconv.Itoa(m.old_profiles_count) + " profiles") - m.profiles.SetActive(0) + m.profiles.SetActive(0) } func (m *MainWindow) tabChanged() { - if !m.initialized { - return - } + if !m.initialized { + return + } - fmt.Println("Active tab changed...") - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - fmt.Println(current_tab) + fmt.Println("Active tab changed...") + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + fmt.Println(current_tab) - m.use_other_servers_tab = true - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - m.fav_servers.Emit("cursor-changed") - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - m.all_servers.Emit("cursor-changed") - } - m.use_other_servers_tab = false + m.use_other_servers_tab = true + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + m.fav_servers.Emit("cursor-changed") + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + m.all_servers.Emit("cursor-changed") + } + m.use_other_servers_tab = false } func (m *MainWindow) serversUpdateCompleted(data map[string]string) { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": ctx.Translator.Translate("Servers updated.", nil)}) - // Trigger "selection-changed" events on currently active tab's - // servers list. - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": ctx.Translator.Translate("Servers updated.", nil)}) + // Trigger "selection-changed" events on currently active tab's + // servers list. + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - m.all_servers.Emit("cursor-changed") - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - m.fav_servers.Emit("cursor-changed") - } + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + m.all_servers.Emit("cursor-changed") + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + m.fav_servers.Emit("cursor-changed") + } - m.servers_already_updating = false + m.servers_already_updating = false } func (m *MainWindow) setQuickConnectDetails(data map[string]string) { - fmt.Println("Setting quick connect data...") - m.qc_server_address.SetText(data["server"]) - m.qc_password.SetText(data["password"]) + fmt.Println("Setting quick connect data...") + m.qc_server_address.SetText(data["server"]) + m.qc_password.SetText(data["password"]) } func (m *MainWindow) setToolbarLabelText(data map[string]string) { - fmt.Println("Setting toolbar's label text...") - if strings.Contains(data["text"], "") { - fmt.Println("With markup") - m.toolbar_label.SetMarkup(data["text"]) - } else { - fmt.Println("Without markup") - m.toolbar_label.SetLabel(data["text"]) - } + fmt.Println("Setting toolbar's label text...") + if strings.Contains(data["text"], "") { + fmt.Println("With markup") + m.toolbar_label.SetMarkup(data["text"]) + } else { + fmt.Println("Without markup") + m.toolbar_label.SetLabel(data["text"]) + } } func (m *MainWindow) showHide() { - if m.hidden { - m.window.Show() - m.hidden = false - // Set window position on restore. Window loosing it on - // multimonitor configurations. - m.window.Move(m.window_pos_x, m.window_pos_y) - } else { - m.window.Hide() - m.hidden = true - } + if m.hidden { + m.window.Show() + m.hidden = false + // Set window position on restore. Window loosing it on + // multimonitor configurations. + m.window.Move(m.window_pos_x, m.window_pos_y) + } else { + m.window.Hide() + m.hidden = true + } } func (m *MainWindow) showServerCVars() { - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - if m.use_other_servers_tab { - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - current_tab = "Favorites" - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - current_tab = "Servers" - } - } - srv_address := m.getIpFromServersList(current_tab) - if len(srv_address) > 0 { - m.server_cvars_dialog.Initialize(m.window, srv_address) - } + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + if m.use_other_servers_tab { + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + current_tab = "Favorites" + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + current_tab = "Servers" + } + } + srv_address := m.getIpFromServersList(current_tab) + if len(srv_address) > 0 { + m.server_cvars_dialog.Initialize(m.window, srv_address) + } } func (m *MainWindow) showShortServerInformation() { - fmt.Println("Server selection changed, updating server's information widget...") - m.server_info_store.Clear() - m.players_info_store.Clear() - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - if m.use_other_servers_tab { - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - current_tab = "Favorites" - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - current_tab = "Servers" - } - } - srv_address := m.getIpFromServersList(current_tab) + fmt.Println("Server selection changed, updating server's information widget...") + m.server_info_store.Clear() + m.players_info_store.Clear() + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + if m.use_other_servers_tab { + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + current_tab = "Favorites" + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + current_tab = "Servers" + } + } + srv_address := m.getIpFromServersList(current_tab) - // Getting server information from cache. - if len(srv_address) > 0 && ctx.Cache.Servers[srv_address].Server.Players != "" { - server_info := ctx.Cache.Servers[srv_address].Server - parsed_general_data := ioq3dataparser.ParseInfoToMap(server_info.ExtendedConfig) - parsed_players_info := ioq3dataparser.ParsePlayersInfoToMap(server_info.PlayersInfo) - // Append to treeview generic info first. After appending it - // will be deleted from map. + // Getting server information from cache. + if len(srv_address) > 0 && ctx.Cache.Servers[srv_address].Server.Players != "" { + server_info := ctx.Cache.Servers[srv_address].Server + parsed_general_data := ioq3dataparser.ParseInfoToMap(server_info.ExtendedConfig) + parsed_players_info := ioq3dataparser.ParsePlayersInfoToMap(server_info.PlayersInfo) + // Append to treeview generic info first. After appending it + // will be deleted from map. - // Server's name. - iter := new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Server's name", nil)) - m.server_info_store.SetValue(iter, 1, ctx.Colorizer.Fix(parsed_general_data["sv_hostname"])) - delete(parsed_general_data, "sv_hostname") + // Server's name. + iter := new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Server's name", nil)) + m.server_info_store.SetValue(iter, 1, ctx.Colorizer.Fix(parsed_general_data["sv_hostname"])) + delete(parsed_general_data, "sv_hostname") - // Game version. - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Game version", nil)) - m.server_info_store.SetValue(iter, 1, parsed_general_data["g_modversion"]) - delete(parsed_general_data, "g_modversion") + // Game version. + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Game version", nil)) + m.server_info_store.SetValue(iter, 1, parsed_general_data["g_modversion"]) + delete(parsed_general_data, "g_modversion") - // Players. - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Players", nil)) - m.server_info_store.SetValue(iter, 1, server_info.Players + " of " + parsed_general_data["sv_maxclients"] + " (" + server_info.Bots + " bots)") - delete(parsed_general_data, "sv_maxclients") + // Players. + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Players", nil)) + m.server_info_store.SetValue(iter, 1, server_info.Players+" of "+parsed_general_data["sv_maxclients"]+" ("+server_info.Bots+" bots)") + delete(parsed_general_data, "sv_maxclients") - // Ping - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Ping", nil)) - m.server_info_store.SetValue(iter, 1, server_info.Ping + " ms") + // Ping + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Ping", nil)) + m.server_info_store.SetValue(iter, 1, server_info.Ping+" ms") - // Game mode - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Game mode", nil)) - m.server_info_store.SetValue(iter, 1, m.gamemodes[server_info.Gamemode]) + // Game mode + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Game mode", nil)) + m.server_info_store.SetValue(iter, 1, m.gamemodes[server_info.Gamemode]) - // Map name - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Current map", nil)) - m.server_info_store.SetValue(iter, 1, server_info.Map) + // Map name + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Current map", nil)) + m.server_info_store.SetValue(iter, 1, server_info.Map) - // Private or public? - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Passworded", nil)) - passworded_status := "" + ctx.Translator.Translate("No", nil) + "" - if server_info.IsPrivate == "1" { - passworded_status = "" + ctx.Translator.Translate("Yes", nil) + "" - } - m.server_info_store.SetValue(iter, 1, passworded_status) + // Private or public? + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, ctx.Translator.Translate("Passworded", nil)) + passworded_status := "" + ctx.Translator.Translate("No", nil) + "" + if server_info.IsPrivate == "1" { + passworded_status = "" + ctx.Translator.Translate("Yes", nil) + "" + } + m.server_info_store.SetValue(iter, 1, passworded_status) - // Sorting keys of map. - players_map_keys := make([]string, 0, len(parsed_players_info)) - for k := range parsed_players_info { - // ToDo: figure out how to do this properly without - // append(). - players_map_keys = append(players_map_keys, k) - } + // Sorting keys of map. + players_map_keys := make([]string, 0, len(parsed_players_info)) + for k := range parsed_players_info { + // ToDo: figure out how to do this properly without + // append(). + players_map_keys = append(players_map_keys, k) + } - sort.Strings(players_map_keys) + sort.Strings(players_map_keys) - for k := range players_map_keys { - iter = new(gtk.TreeIter) - nick := ctx.Colorizer.Fix(parsed_players_info[players_map_keys[k]]["nick"]) - m.players_info_store.Append(iter) - m.players_info_store.SetValue(iter, 0, nick) - m.players_info_store.SetValue(iter, 1, parsed_players_info[players_map_keys[k]]["frags"]) - m.players_info_store.SetValue(iter, 2, parsed_players_info[players_map_keys[k]]["ping"]) - } + for k := range players_map_keys { + iter = new(gtk.TreeIter) + nick := ctx.Colorizer.Fix(parsed_players_info[players_map_keys[k]]["nick"]) + m.players_info_store.Append(iter) + m.players_info_store.SetValue(iter, 0, nick) + m.players_info_store.SetValue(iter, 1, parsed_players_info[players_map_keys[k]]["frags"]) + m.players_info_store.SetValue(iter, 2, parsed_players_info[players_map_keys[k]]["ping"]) + } - /* - // Just a separator. - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) + /* + // Just a separator. + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) - // Other parameters :). - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, "OTHER PARAMETERS") + // Other parameters :). + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, "OTHER PARAMETERS") - // Sort it! - general_data_keys := make([]string, 0, len(parsed_general_data)) - for k := range parsed_general_data { - general_data_keys = append(general_data_keys, k) - } + // Sort it! + general_data_keys := make([]string, 0, len(parsed_general_data)) + for k := range parsed_general_data { + general_data_keys = append(general_data_keys, k) + } - sort.Strings(general_data_keys) + sort.Strings(general_data_keys) - for k := range general_data_keys { - iter = new(gtk.TreeIter) - m.server_info_store.Append(iter) - m.server_info_store.SetValue(iter, 0, general_data_keys[k]) - m.server_info_store.SetValue(iter, 1, parsed_general_data[general_data_keys[k]]) - } - */ - } + for k := range general_data_keys { + iter = new(gtk.TreeIter) + m.server_info_store.Append(iter) + m.server_info_store.SetValue(iter, 0, general_data_keys[k]) + m.server_info_store.SetValue(iter, 1, parsed_general_data[general_data_keys[k]]) + } + */ + } } // Show tray menu on right-click on tray icon. func (m *MainWindow) showTrayMenu(cbx *glib.CallbackContext) { - m.tray_menu.Popup(nil, nil, gtk.StatusIconPositionMenu, m.tray_icon, uint(cbx.Args(0)), uint32(cbx.Args(1))) + m.tray_menu.Popup(nil, nil, gtk.StatusIconPositionMenu, m.tray_icon, uint(cbx.Args(0)), uint32(cbx.Args(1))) } // Unlocking interface after game shut down. func (m *MainWindow) unlockInterface() { - m.launch_button.SetSensitive(true) - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": ctx.Translator.Translate("URTrator is ready.", nil)}) + m.launch_button.SetSensitive(true) + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": ctx.Translator.Translate("URTrator is ready.", nil)}) } func (m *MainWindow) updateOneServer() { - if m.servers_already_updating { - return - } - m.servers_already_updating = true + if m.servers_already_updating { + return + } + m.servers_already_updating = true - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Updating selected server...", nil) + ""}) - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - srv_address := m.getIpFromServersList(current_tab) + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Updating selected server...", nil) + ""}) + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + srv_address := m.getIpFromServersList(current_tab) - if len(srv_address) > 0 { - go ctx.Requester.UpdateOneServer(srv_address) - } + if len(srv_address) > 0 { + go ctx.Requester.UpdateOneServer(srv_address) + } } // Triggered when "Update all servers" button is clicked. func (m *MainWindow) UpdateServers() { - if m.servers_already_updating { - return - } - m.servers_already_updating = true + if m.servers_already_updating { + return + } + m.servers_already_updating = true - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Updating servers...", nil) + ""}) - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - fmt.Println("Updating servers on tab '" + current_tab + "'...") + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Updating servers...", nil) + ""}) + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + fmt.Println("Updating servers on tab '" + current_tab + "'...") - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - go ctx.Requester.UpdateAllServers(false) - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - go ctx.Requester.UpdateFavoriteServers() - } + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + go ctx.Requester.UpdateAllServers(false) + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + go ctx.Requester.UpdateFavoriteServers() + } } func (m *MainWindow) UpdateServersEventHandler(data map[string]string) { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Updating servers...", nil) + ""}) + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Updating servers...", nil) + ""}) - go ctx.Requester.UpdateAllServers(true) + go ctx.Requester.UpdateAllServers(true) } diff --git a/ui/gtk2/mainwindow_init.go b/ui/gtk2/mainwindow_init.go index 9db8432..eedfeb6 100644 --- a/ui/gtk2/mainwindow_init.go +++ b/ui/gtk2/mainwindow_init.go @@ -1,869 +1,868 @@ package ui import ( - // stdlib - "encoding/base64" - "fmt" - "runtime" - "sort" - "strconv" + // stdlib + "encoding/base64" + "fmt" + "runtime" + "sort" + "strconv" - // local - "github.com/pztrn/urtrator/common" - "github.com/pztrn/urtrator/timer" + // local + "gitlab.com/pztrn/urtrator/common" + "gitlab.com/pztrn/urtrator/timer" - // Other - "github.com/mattn/go-gtk/gdkpixbuf" - "github.com/mattn/go-gtk/glib" - "github.com/mattn/go-gtk/gtk" + // Other + "github.com/mattn/go-gtk/gdkpixbuf" + "github.com/mattn/go-gtk/glib" + "github.com/mattn/go-gtk/gtk" ) // Main window initialization. func (m *MainWindow) Initialize() { - gtk.Init(nil) + gtk.Init(nil) - m.initializeStorages() - ctx.InitializeClipboardWatcher() + m.initializeStorages() + ctx.InitializeClipboardWatcher() - m.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) - m.window.SetTitle("URTrator") - m.window.Connect("destroy", m.Close) - m.vbox = gtk.NewVBox(false, 0) + m.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) + m.window.SetTitle("URTrator") + m.window.Connect("destroy", m.Close) + m.vbox = gtk.NewVBox(false, 0) - // Load program icon from base64. - icon_bytes, _ := base64.StdEncoding.DecodeString(common.Logo) - icon_pixbuf := gdkpixbuf.NewLoader() - icon_pixbuf.Write(icon_bytes) - logo = icon_pixbuf.GetPixbuf() - m.window.SetIcon(logo) + // Load program icon from base64. + icon_bytes, _ := base64.StdEncoding.DecodeString(common.Logo) + icon_pixbuf := gdkpixbuf.NewLoader() + icon_pixbuf.Write(icon_bytes) + logo = icon_pixbuf.GetPixbuf() + m.window.SetIcon(logo) - m.window.Connect("configure-event", m.checkPositionAndSize) + m.window.Connect("configure-event", m.checkPositionAndSize) - // Additional OS-specific initialization. - if runtime.GOOS == "windows" { - m.initializeWin() - } - if runtime.GOOS == "darwin" { - m.initializeMac() - } + // Additional OS-specific initialization. + if runtime.GOOS == "windows" { + m.initializeWin() + } + if runtime.GOOS == "darwin" { + m.initializeMac() + } - // Restoring window position. - var win_pos_x_str string = "0" - var win_pos_y_str string = "0" - saved_win_pos_x_str, ok := ctx.Cfg.Cfg["/mainwindow/position_x"] - if ok { - win_pos_x_str = saved_win_pos_x_str - } - saved_win_pos_y_str, ok := ctx.Cfg.Cfg["/mainwindow/position_y"] - if ok { - win_pos_y_str = saved_win_pos_y_str - } - win_pos_x, _ := strconv.Atoi(win_pos_x_str) - win_pos_y, _ := strconv.Atoi(win_pos_y_str) - m.window.Move(win_pos_x, win_pos_y) + // Restoring window position. + var win_pos_x_str string = "0" + var win_pos_y_str string = "0" + saved_win_pos_x_str, ok := ctx.Cfg.Cfg["/mainwindow/position_x"] + if ok { + win_pos_x_str = saved_win_pos_x_str + } + saved_win_pos_y_str, ok := ctx.Cfg.Cfg["/mainwindow/position_y"] + if ok { + win_pos_y_str = saved_win_pos_y_str + } + win_pos_x, _ := strconv.Atoi(win_pos_x_str) + win_pos_y, _ := strconv.Atoi(win_pos_y_str) + m.window.Move(win_pos_x, win_pos_y) - // Restoring window size. - var win_size_width_str string = "1000" - var win_size_height_str string = "600" - saved_win_size_width_str, ok := ctx.Cfg.Cfg["/mainwindow/width"] - if ok { - win_size_width_str = saved_win_size_width_str - } - saved_win_size_height_str, ok := ctx.Cfg.Cfg["/mainwindow/height"] - if ok { - win_size_height_str = saved_win_size_height_str - } + // Restoring window size. + var win_size_width_str string = "1000" + var win_size_height_str string = "600" + saved_win_size_width_str, ok := ctx.Cfg.Cfg["/mainwindow/width"] + if ok { + win_size_width_str = saved_win_size_width_str + } + saved_win_size_height_str, ok := ctx.Cfg.Cfg["/mainwindow/height"] + if ok { + win_size_height_str = saved_win_size_height_str + } - m.window_width, _ = strconv.Atoi(win_size_width_str) - m.window_height, _ = strconv.Atoi(win_size_height_str) - m.window.SetDefaultSize(m.window_width, m.window_height) + m.window_width, _ = strconv.Atoi(win_size_width_str) + m.window_height, _ = strconv.Atoi(win_size_height_str) + m.window.SetDefaultSize(m.window_width, m.window_height) - // Set some GTK options for this window. - gtk_opts_raw := gtk.SettingsGetDefault() - gtk_opts := gtk_opts_raw.ToGObject() - gtk_opts.Set("gtk-button-images", true) + // Set some GTK options for this window. + gtk_opts_raw := gtk.SettingsGetDefault() + gtk_opts := gtk_opts_raw.ToGObject() + gtk_opts.Set("gtk-button-images", true) - // Dialogs initialization. - m.options_dialog = &OptionsDialog{} - m.server_cvars_dialog = &ServerCVarsDialog{} + // Dialogs initialization. + m.options_dialog = &OptionsDialog{} + m.server_cvars_dialog = &ServerCVarsDialog{} - // Main menu. - if runtime.GOOS == "darwin" { - m.initializeMacMenu() - } else { - m.InitializeMainMenu() - } + // Main menu. + if runtime.GOOS == "darwin" { + m.initializeMacMenu() + } else { + m.InitializeMainMenu() + } - // Toolbar. - m.InitializeToolbar() + // Toolbar. + m.InitializeToolbar() - m.hpane = gtk.NewHPaned() - m.vbox.PackStart(m.hpane, true, true, 5) - m.hpane.Connect("event", m.checkMainPanePosition) + m.hpane = gtk.NewHPaned() + m.vbox.PackStart(m.hpane, true, true, 5) + m.hpane.Connect("event", m.checkMainPanePosition) - // Restore pane position. - // We will restore saved thing, or will use "window_width - 150". - saved_pane_pos, ok := ctx.Cfg.Cfg["/mainwindow/pane_negative_position"] - if ok { - pane_negative_pos, _ := strconv.Atoi(saved_pane_pos) - m.hpane.SetPosition(m.window_width - pane_negative_pos) - } else { - var w, h int = 0, 0 - m.window.GetSize(&w, &h) - m.hpane.SetPosition(w - 150) - } + // Restore pane position. + // We will restore saved thing, or will use "window_width - 150". + saved_pane_pos, ok := ctx.Cfg.Cfg["/mainwindow/pane_negative_position"] + if ok { + pane_negative_pos, _ := strconv.Atoi(saved_pane_pos) + m.hpane.SetPosition(m.window_width - pane_negative_pos) + } else { + w, _ := m.window.GetSize() + m.hpane.SetPosition(w - 150) + } - // Tabs initialization. - m.InitializeTabs() + // Tabs initialization. + m.InitializeTabs() - // Sidebar initialization. - m.initializeSidebar() + // Sidebar initialization. + m.initializeSidebar() - // Tray icon. - if ctx.Cfg.Cfg["/general/show_tray_icon"] == "1" { - m.initializeTrayIcon() - } + // Tray icon. + if ctx.Cfg.Cfg["/general/show_tray_icon"] == "1" { + m.initializeTrayIcon() + } - // Events. - m.initializeEvents() + // Events. + m.initializeEvents() - // Game profiles and launch button. - profile_and_launch_hbox := gtk.NewHBox(false, 0) - m.vbox.PackStart(profile_and_launch_hbox, false, true, 5) + // Game profiles and launch button. + profile_and_launch_hbox := gtk.NewHBox(false, 0) + m.vbox.PackStart(profile_and_launch_hbox, false, true, 5) - // Separator - sep := gtk.NewHBox(false, 0) - profile_and_launch_hbox.PackStart(sep, true, true, 5) + // Separator + sep := gtk.NewHBox(false, 0) + profile_and_launch_hbox.PackStart(sep, true, true, 5) - // Profile selection. - profiles_label := gtk.NewLabel(ctx.Translator.Translate("Game profile:", nil)) - m.profiles = gtk.NewComboBoxText() - m.profiles.SetTooltipText(ctx.Translator.Translate("Profile which will be used for launching", nil)) + // Profile selection. + profiles_label := gtk.NewLabel(ctx.Translator.Translate("Game profile:", nil)) + m.profiles = gtk.NewComboBoxText() + m.profiles.SetTooltipText(ctx.Translator.Translate("Profile which will be used for launching", nil)) - profile_and_launch_hbox.PackStart(profiles_label, false, true, 5) - profile_and_launch_hbox.PackStart(m.profiles, false, true, 5) + profile_and_launch_hbox.PackStart(profiles_label, false, true, 5) + profile_and_launch_hbox.PackStart(m.profiles, false, true, 5) - // One more separator. - sepp := gtk.NewVSeparator() - profile_and_launch_hbox.PackStart(sepp, false, true, 5) + // One more separator. + sepp := gtk.NewVSeparator() + profile_and_launch_hbox.PackStart(sepp, false, true, 5) - // Game launching button. - m.launch_button = gtk.NewButtonWithLabel(ctx.Translator.Translate("Launch!", nil)) - m.launch_button.SetTooltipText(ctx.Translator.Translate("Launch Urban Terror", nil)) - m.launch_button.Clicked(m.launchGame) - launch_button_image := gtk.NewImageFromPixbuf(logo.ScaleSimple(24, 24, gdkpixbuf.INTERP_HYPER)) - m.launch_button.SetImage(launch_button_image) - profile_and_launch_hbox.PackStart(m.launch_button, false, true, 5) + // Game launching button. + m.launch_button = gtk.NewButtonWithLabel(ctx.Translator.Translate("Launch!", nil)) + m.launch_button.SetTooltipText(ctx.Translator.Translate("Launch Urban Terror", nil)) + m.launch_button.Clicked(m.launchGame) + launch_button_image := gtk.NewImageFromPixbuf(logo.ScaleSimple(24, 24, gdkpixbuf.INTERP_HYPER)) + m.launch_button.SetImage(launch_button_image) + profile_and_launch_hbox.PackStart(m.launch_button, false, true, 5) - m.window.Add(m.vbox) + m.window.Add(m.vbox) - if runtime.GOOS == "darwin" { - m.initializeMacAfter() - } + if runtime.GOOS == "darwin" { + m.initializeMacAfter() + } - m.window.ShowAll() + m.window.ShowAll() - // Launch events. - ctx.Eventer.LaunchEvent("loadProfiles", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) - ctx.Eventer.LaunchEvent("loadServersIntoCache", map[string]string{}) - ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) - ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) - ctx.Eventer.LaunchEvent("initializeTasksForMainWindow", map[string]string{}) - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": ctx.Translator.Translate("URTrator is ready.", nil)}) + // Launch events. + ctx.Eventer.LaunchEvent("loadProfiles", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("loadServersIntoCache", map[string]string{}) + ctx.Eventer.LaunchEvent("loadAllServers", map[string]string{}) + ctx.Eventer.LaunchEvent("loadFavoriteServers", map[string]string{}) + ctx.Eventer.LaunchEvent("initializeTasksForMainWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": ctx.Translator.Translate("URTrator is ready.", nil)}) - // Set flag that shows to other parts that we're initialized. - m.initialized = true + // Set flag that shows to other parts that we're initialized. + m.initialized = true - gtk.Main() + gtk.Main() } // Events initialization. func (m *MainWindow) initializeEvents() { - fmt.Println("Initializing events...") - ctx.Eventer.AddEventHandler("initializeTasksForMainWindow", m.initializeTasks) - ctx.Eventer.AddEventHandler("loadAllServers", m.loadAllServers) - ctx.Eventer.AddEventHandler("loadFavoriteServers", m.loadFavoriteServers) - ctx.Eventer.AddEventHandler("loadProfilesIntoMainWindow", m.loadProfiles) - ctx.Eventer.AddEventHandler("serversUpdateCompleted", m.serversUpdateCompleted) - ctx.Eventer.AddEventHandler("setQuickConnectDetails", m.setQuickConnectDetails) - ctx.Eventer.AddEventHandler("setToolbarLabelText", m.setToolbarLabelText) - ctx.Eventer.AddEventHandler("updateAllServers", m.UpdateServersEventHandler) + fmt.Println("Initializing events...") + ctx.Eventer.AddEventHandler("initializeTasksForMainWindow", m.initializeTasks) + ctx.Eventer.AddEventHandler("loadAllServers", m.loadAllServers) + ctx.Eventer.AddEventHandler("loadFavoriteServers", m.loadFavoriteServers) + ctx.Eventer.AddEventHandler("loadProfilesIntoMainWindow", m.loadProfiles) + ctx.Eventer.AddEventHandler("serversUpdateCompleted", m.serversUpdateCompleted) + ctx.Eventer.AddEventHandler("setQuickConnectDetails", m.setQuickConnectDetails) + ctx.Eventer.AddEventHandler("setToolbarLabelText", m.setToolbarLabelText) + ctx.Eventer.AddEventHandler("updateAllServers", m.UpdateServersEventHandler) } // Main menu initialization. func (m *MainWindow) InitializeMainMenu() { - m.menubar = gtk.NewMenuBar() - m.vbox.PackStart(m.menubar, false, false, 0) + m.menubar = gtk.NewMenuBar() + m.vbox.PackStart(m.menubar, false, false, 0) - // File menu. - fm := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("File", nil)) - m.menubar.Append(fm) - file_menu := gtk.NewMenu() - fm.SetSubmenu(file_menu) + // File menu. + fm := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("File", nil)) + m.menubar.Append(fm) + file_menu := gtk.NewMenu() + fm.SetSubmenu(file_menu) - // Options. - options_menu_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("_Options", nil)) - file_menu.Append(options_menu_item) - options_menu_item.Connect("activate", m.options_dialog.ShowOptionsDialog) + // Options. + options_menu_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("_Options", nil)) + file_menu.Append(options_menu_item) + options_menu_item.Connect("activate", m.options_dialog.ShowOptionsDialog) - // Separator. - file_menu_sep1 := gtk.NewSeparatorMenuItem() - file_menu.Append(file_menu_sep1) + // Separator. + file_menu_sep1 := gtk.NewSeparatorMenuItem() + file_menu.Append(file_menu_sep1) - // Exit. - exit_menu_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("E_xit", nil)) - file_menu.Append(exit_menu_item) - exit_menu_item.Connect("activate", m.Close) + // Exit. + exit_menu_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("E_xit", nil)) + file_menu.Append(exit_menu_item) + exit_menu_item.Connect("activate", m.Close) - // About menu. - am := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("_?", nil)) - m.menubar.Append(am) - about_menu := gtk.NewMenu() - am.SetSubmenu(about_menu) + // About menu. + am := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("_?", nil)) + m.menubar.Append(am) + about_menu := gtk.NewMenu() + am.SetSubmenu(about_menu) - // About app item. - about_app_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("About _URTrator...", nil)) - about_menu.Append(about_app_item) - about_app_item.Connect("activate", ShowAboutDialog) + // About app item. + about_app_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("About _URTrator...", nil)) + about_menu.Append(about_app_item) + about_app_item.Connect("activate", ShowAboutDialog) - // Separator. - about_menu_sep1 := gtk.NewSeparatorMenuItem() - about_menu.Append(about_menu_sep1) + // Separator. + about_menu_sep1 := gtk.NewSeparatorMenuItem() + about_menu.Append(about_menu_sep1) - // Drop databases thing. - about_menu_drop_database_data_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("Drop local caches and settings", nil)) - about_menu.Append(about_menu_drop_database_data_item) - about_menu_drop_database_data_item.Connect("activate", m.dropDatabasesData) + // Drop databases thing. + about_menu_drop_database_data_item := gtk.NewMenuItemWithMnemonic(ctx.Translator.Translate("Drop local caches and settings", nil)) + about_menu.Append(about_menu_drop_database_data_item) + about_menu_drop_database_data_item.Connect("activate", m.dropDatabasesData) } // Sidebar (with quick connect and server's information) initialization. func (m *MainWindow) initializeSidebar() { - sidebar_vbox := gtk.NewVBox(false, 0) + sidebar_vbox := gtk.NewVBox(false, 0) - server_info_frame := gtk.NewFrame(ctx.Translator.Translate("Server information", nil)) - sidebar_vbox.PackStart(server_info_frame, true, true, 5) - si_vbox := gtk.NewVBox(false, 0) - server_info_frame.Add(si_vbox) + server_info_frame := gtk.NewFrame(ctx.Translator.Translate("Server information", nil)) + sidebar_vbox.PackStart(server_info_frame, true, true, 5) + si_vbox := gtk.NewVBox(false, 0) + server_info_frame.Add(si_vbox) - // Scrolled thing. - si_scroll := gtk.NewScrolledWindow(nil, nil) - si_scroll.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - si_vbox.PackStart(si_scroll, true, true, 5) + // Scrolled thing. + si_scroll := gtk.NewScrolledWindow(nil, nil) + si_scroll.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + si_vbox.PackStart(si_scroll, true, true, 5) - // Server's information. - m.server_info = gtk.NewTreeView() - m.server_info.SetModel(m.server_info_store) + // Server's information. + m.server_info = gtk.NewTreeView() + m.server_info.SetModel(m.server_info_store) - key_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Key", nil), gtk.NewCellRendererText(), "markup", 0) - m.server_info.AppendColumn(key_column) + key_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Key", nil), gtk.NewCellRendererText(), "markup", 0) + m.server_info.AppendColumn(key_column) - value_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Value", nil), gtk.NewCellRendererText(), "markup", 1) - m.server_info.AppendColumn(value_column) + value_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Value", nil), gtk.NewCellRendererText(), "markup", 1) + m.server_info.AppendColumn(value_column) - si_scroll.Add(m.server_info) + si_scroll.Add(m.server_info) - // Players information. - players_info_frame := gtk.NewFrame(ctx.Translator.Translate("Players", nil)) - sidebar_vbox.PackStart(players_info_frame, true, true, 5) + // Players information. + players_info_frame := gtk.NewFrame(ctx.Translator.Translate("Players", nil)) + sidebar_vbox.PackStart(players_info_frame, true, true, 5) - pi_scroll := gtk.NewScrolledWindow(nil, nil) - pi_scroll.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - players_info_frame.Add(pi_scroll) + pi_scroll := gtk.NewScrolledWindow(nil, nil) + pi_scroll.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + players_info_frame.Add(pi_scroll) - m.players_info = gtk.NewTreeView() - m.players_info.SetModel(m.players_info_store) - pi_scroll.Add(m.players_info) + m.players_info = gtk.NewTreeView() + m.players_info.SetModel(m.players_info_store) + pi_scroll.Add(m.players_info) - name_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Player name", nil), gtk.NewCellRendererText(), "markup", 0) - m.players_info.AppendColumn(name_column) + name_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Player name", nil), gtk.NewCellRendererText(), "markup", 0) + m.players_info.AppendColumn(name_column) - frags_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Frags", nil), gtk.NewCellRendererText(), "markup", 1) - m.players_info.AppendColumn(frags_column) + frags_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Frags", nil), gtk.NewCellRendererText(), "markup", 1) + m.players_info.AppendColumn(frags_column) - ping_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Ping", nil), gtk.NewCellRendererText(), "markup", 2) - m.players_info.AppendColumn(ping_column) + ping_column := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Ping", nil), gtk.NewCellRendererText(), "markup", 2) + m.players_info.AppendColumn(ping_column) - // Show CVars button. - show_cvars_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Show CVars", nil)) - show_cvars_button.SetTooltipText(ctx.Translator.Translate("Show server's CVars", nil)) - show_cvars_button.Clicked(m.showServerCVars) - sidebar_vbox.PackStart(show_cvars_button, false, true, 5) + // Show CVars button. + show_cvars_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Show CVars", nil)) + show_cvars_button.SetTooltipText(ctx.Translator.Translate("Show server's CVars", nil)) + show_cvars_button.Clicked(m.showServerCVars) + sidebar_vbox.PackStart(show_cvars_button, false, true, 5) - // Quick connect frame. - quick_connect_frame := gtk.NewFrame(ctx.Translator.Translate("Quick connect", nil)) - sidebar_vbox.PackStart(quick_connect_frame, false, true, 5) - qc_vbox := gtk.NewVBox(false, 0) - quick_connect_frame.Add(qc_vbox) + // Quick connect frame. + quick_connect_frame := gtk.NewFrame(ctx.Translator.Translate("Quick connect", nil)) + sidebar_vbox.PackStart(quick_connect_frame, false, true, 5) + qc_vbox := gtk.NewVBox(false, 0) + quick_connect_frame.Add(qc_vbox) - // Server address. - srv_tooltip := ctx.Translator.Translate("Server address we will connect to", nil) - srv_label := gtk.NewLabel(ctx.Translator.Translate("Server address:", nil)) - srv_label.SetTooltipText(srv_tooltip) - qc_vbox.PackStart(srv_label, false, true, 5) + // Server address. + srv_tooltip := ctx.Translator.Translate("Server address we will connect to", nil) + srv_label := gtk.NewLabel(ctx.Translator.Translate("Server address:", nil)) + srv_label.SetTooltipText(srv_tooltip) + qc_vbox.PackStart(srv_label, false, true, 5) - m.qc_server_address = gtk.NewEntry() - m.qc_server_address.SetTooltipText(srv_tooltip) - qc_vbox.PackStart(m.qc_server_address, false, true, 5) + m.qc_server_address = gtk.NewEntry() + m.qc_server_address.SetTooltipText(srv_tooltip) + qc_vbox.PackStart(m.qc_server_address, false, true, 5) - // Password. - pass_tooltip := ctx.Translator.Translate("Password we will use for server", nil) - pass_label := gtk.NewLabel(ctx.Translator.Translate("Password:", nil)) - pass_label.SetTooltipText(pass_tooltip) - qc_vbox.PackStart(pass_label, false, true, 5) + // Password. + pass_tooltip := ctx.Translator.Translate("Password we will use for server", nil) + pass_label := gtk.NewLabel(ctx.Translator.Translate("Password:", nil)) + pass_label.SetTooltipText(pass_tooltip) + qc_vbox.PackStart(pass_label, false, true, 5) - m.qc_password = gtk.NewEntry() - m.qc_password.SetTooltipText(pass_tooltip) - qc_vbox.PackStart(m.qc_password, false, true, 5) + m.qc_password = gtk.NewEntry() + m.qc_password.SetTooltipText(pass_tooltip) + qc_vbox.PackStart(m.qc_password, false, true, 5) - // Nickname - nick_tooltip := ctx.Translator.Translate("Nickname we will use", nil) - nick_label := gtk.NewLabel(ctx.Translator.Translate("Nickname:", nil)) - nick_label.SetTooltipText(nick_tooltip) - qc_vbox.PackStart(nick_label, false, true, 5) + // Nickname + nick_tooltip := ctx.Translator.Translate("Nickname we will use", nil) + nick_label := gtk.NewLabel(ctx.Translator.Translate("Nickname:", nil)) + nick_label.SetTooltipText(nick_tooltip) + qc_vbox.PackStart(nick_label, false, true, 5) - m.qc_nickname = gtk.NewEntry() - m.qc_nickname.SetTooltipText(nick_tooltip) - qc_vbox.PackStart(m.qc_nickname, false, true, 5) + m.qc_nickname = gtk.NewEntry() + m.qc_nickname.SetTooltipText(nick_tooltip) + qc_vbox.PackStart(m.qc_nickname, false, true, 5) - m.hpane.Add2(sidebar_vbox) + m.hpane.Add2(sidebar_vbox) } // Initializes internal storages. func (m *MainWindow) initializeStorages() { - // Application isn't initialized. - m.initialized = false - m.use_other_servers_tab = false - m.servers_already_updating = false - // Gamemodes. - m.gamemodes = make(map[string]string) - m.gamemodes = map[string]string{ - "1": "Last Man Standing", - "2": "Free For All", - "3": "Team DM", - "4": "Team Survivor", - "5": "Follow The Leader", - "6": "Cap'n'Hold", - "7": "Capture The Flag", - "8": "Bomb", - "9": "Jump", - "10": "Freeze Tag", - "11": "Gun Game", - "12": "Instagib", - } + // Application isn't initialized. + m.initialized = false + m.use_other_servers_tab = false + m.servers_already_updating = false + // Gamemodes. + m.gamemodes = make(map[string]string) + m.gamemodes = map[string]string{ + "1": "Last Man Standing", + "2": "Free For All", + "3": "Team DM", + "4": "Team Survivor", + "5": "Follow The Leader", + "6": "Cap'n'Hold", + "7": "Capture The Flag", + "8": "Bomb", + "9": "Jump", + "10": "Freeze Tag", + "11": "Gun Game", + "12": "Instagib", + } - // Columns names. - // Key - default position in lists. - m.column_names = map[string]string{ - "2": ctx.Translator.Translate("Name", nil), - "3": ctx.Translator.Translate("Mode", nil), - "4": ctx.Translator.Translate("Map", nil), - "5": ctx.Translator.Translate("Players", nil), - "6": ctx.Translator.Translate("Ping", nil), - "7": ctx.Translator.Translate("Version", nil), - "8": ctx.Translator.Translate("IP", nil), - } - // Real columns positions. - m.column_pos = make(map[string]map[string]int) - m.column_pos["Servers"] = make(map[string]int) - m.column_pos["Favorites"] = make(map[string]int) + // Columns names. + // Key - default position in lists. + m.column_names = map[string]string{ + "2": ctx.Translator.Translate("Name", nil), + "3": ctx.Translator.Translate("Mode", nil), + "4": ctx.Translator.Translate("Map", nil), + "5": ctx.Translator.Translate("Players", nil), + "6": ctx.Translator.Translate("Ping", nil), + "7": ctx.Translator.Translate("Version", nil), + "8": ctx.Translator.Translate("IP", nil), + } + // Real columns positions. + m.column_pos = make(map[string]map[string]int) + m.column_pos["Servers"] = make(map[string]int) + m.column_pos["Favorites"] = make(map[string]int) - // Frames storage. - m.tabs = make(map[string]*gtk.Frame) - m.tabs["dummy"] = gtk.NewFrame("dummy") - delete(m.tabs, "dummy") + // Frames storage. + m.tabs = make(map[string]*gtk.Frame) + m.tabs["dummy"] = gtk.NewFrame("dummy") + delete(m.tabs, "dummy") - // Servers tab list view storage. - // Structure: - // Server status icon|Server name|Mode|Map|Players|Ping|Version - m.all_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING) - m.all_servers_store_sortable = gtk.NewTreeSortable(m.all_servers_store) + // Servers tab list view storage. + // Structure: + // Server status icon|Server name|Mode|Map|Players|Ping|Version + m.all_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING) + m.all_servers_store_sortable = gtk.NewTreeSortable(m.all_servers_store) - // Same as above, but for favorite servers. - m.fav_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING) + // Same as above, but for favorite servers. + m.fav_servers_store = gtk.NewListStore(gdkpixbuf.GetType(), gdkpixbuf.GetType(), glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING) - // Server's information store. Used for quick preview in main window. - m.server_info_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING) + // Server's information store. Used for quick preview in main window. + m.server_info_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING) - // Players information store. Used in sidebar for players list for - // currently selected server. - m.players_info_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING) + // Players information store. Used in sidebar for players list for + // currently selected server. + m.players_info_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_STRING) - // Profiles count after filling combobox. Defaulting to 0. - m.old_profiles_count = 0 + // Profiles count after filling combobox. Defaulting to 0. + m.old_profiles_count = 0 - // Window hidden flag. - m.hidden = false + // Window hidden flag. + m.hidden = false - // Pixbufs. - // Offline server. - srv_offline_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_OFFLINE) - srv_offline_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - srv_offline_pixbuf.SetSize(24, 24) - srv_offline_pixbuf.Write(srv_offline_bytes) - m.server_offline_pic = srv_offline_pixbuf.GetPixbuf() - // Online server. - srv_online_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_ONLINE) - srv_online_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - srv_online_pixbuf.SetSize(24, 24) - srv_online_pixbuf.Write(srv_online_bytes) - m.server_online_pic = srv_online_pixbuf.GetPixbuf() - // Private server. - srv_private_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_PRIVATE) - srv_private_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - srv_private_pixbuf.SetSize(24, 24) - srv_private_pixbuf.Write(srv_private_bytes) - m.server_private_pic = srv_private_pixbuf.GetPixbuf() - // Public server. - srv_public_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_PUBLIC) - srv_public_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - srv_public_pixbuf.SetSize(24, 24) - srv_public_pixbuf.Write(srv_public_bytes) - m.server_public_pic = srv_public_pixbuf.GetPixbuf() + // Pixbufs. + // Offline server. + srv_offline_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_OFFLINE) + srv_offline_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + srv_offline_pixbuf.SetSize(24, 24) + srv_offline_pixbuf.Write(srv_offline_bytes) + m.server_offline_pic = srv_offline_pixbuf.GetPixbuf() + // Online server. + srv_online_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_ONLINE) + srv_online_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + srv_online_pixbuf.SetSize(24, 24) + srv_online_pixbuf.Write(srv_online_bytes) + m.server_online_pic = srv_online_pixbuf.GetPixbuf() + // Private server. + srv_private_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_PRIVATE) + srv_private_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + srv_private_pixbuf.SetSize(24, 24) + srv_private_pixbuf.Write(srv_private_bytes) + m.server_private_pic = srv_private_pixbuf.GetPixbuf() + // Public server. + srv_public_bytes, _ := base64.StdEncoding.DecodeString(common.SERVER_PUBLIC) + srv_public_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + srv_public_pixbuf.SetSize(24, 24) + srv_public_pixbuf.Write(srv_public_bytes) + m.server_public_pic = srv_public_pixbuf.GetPixbuf() } // Tabs widget initialization, including all child widgets. func (m *MainWindow) InitializeTabs() { - // Create tabs widget. - m.tab_widget = gtk.NewNotebook() - m.tab_widget.Connect("switch-page", m.tabChanged) + // Create tabs widget. + m.tab_widget = gtk.NewNotebook() + m.tab_widget.Connect("switch-page", m.tabChanged) - tab_allsrv_hbox := gtk.NewHBox(false, 0) - swin1 := gtk.NewScrolledWindow(nil, nil) + tab_allsrv_hbox := gtk.NewHBox(false, 0) + swin1 := gtk.NewScrolledWindow(nil, nil) - m.all_servers = gtk.NewTreeView() - swin1.Add(m.all_servers) - tab_allsrv_hbox.PackStart(swin1, true, true, 5) - m.tab_widget.AppendPage(tab_allsrv_hbox, gtk.NewLabel(ctx.Translator.Translate("Servers", nil))) + m.all_servers = gtk.NewTreeView() + swin1.Add(m.all_servers) + tab_allsrv_hbox.PackStart(swin1, true, true, 5) + m.tab_widget.AppendPage(tab_allsrv_hbox, gtk.NewLabel(ctx.Translator.Translate("Servers", nil))) - m.all_servers.SetModel(m.all_servers_store) - // These columns are static. - m.all_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Status", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 0)) - m.all_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Public", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 1)) + m.all_servers.SetModel(m.all_servers_store) + // These columns are static. + m.all_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Status", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 0)) + m.all_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Public", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 1)) - // ...aand lets do dynamic generation :) - // +2 because we have 2 static columns. - all_servers_columns_to_append := make([]*gtk.TreeViewColumn, len(m.column_names) + 2) - for pos, name := range m.column_names { - // Check if we have column position saved. If so - use it. - // Otherwise use default position. - // Should be actual only for first launch. - position := ctx.Cfg.Cfg["/mainwindow/all_servers/" + ctx.Translator.Translate(name, nil) + "_position"] - if len(position) == 0 { - position = pos - } - position_int, _ := strconv.Atoi(position) - // Same for width. - width := ctx.Cfg.Cfg["/mainwindow/all_servers/" + ctx.Translator.Translate(name, nil) + "_width"] - if len(width) == 0 { - width = "-1" - } - width_int, _ := strconv.Atoi(width) + // ...aand lets do dynamic generation :) + // +2 because we have 2 static columns. + all_servers_columns_to_append := make([]*gtk.TreeViewColumn, len(m.column_names)+2) + for pos, name := range m.column_names { + // Check if we have column position saved. If so - use it. + // Otherwise use default position. + // Should be actual only for first launch. + position := ctx.Cfg.Cfg["/mainwindow/all_servers/"+ctx.Translator.Translate(name, nil)+"_position"] + if len(position) == 0 { + position = pos + } + position_int, _ := strconv.Atoi(position) + // Same for width. + width := ctx.Cfg.Cfg["/mainwindow/all_servers/"+ctx.Translator.Translate(name, nil)+"_width"] + if len(width) == 0 { + width = "-1" + } + width_int, _ := strconv.Atoi(width) - col := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate(name, nil), gtk.NewCellRendererText(), "markup", position_int) - col.SetSortColumnId(position_int) - col.SetReorderable(true) - col.SetResizable(true) - // GtkTreeViewColumn.SetFixedWidth() accepts only positive integers. - if width_int > 1 { - col.SetSizing(gtk.TREE_VIEW_COLUMN_FIXED) - col.SetFixedWidth(width_int) - } - m.column_pos["Servers"][name] = position_int - all_servers_columns_to_append[position_int] = col - } + col := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate(name, nil), gtk.NewCellRendererText(), "markup", position_int) + col.SetSortColumnId(position_int) + col.SetReorderable(true) + col.SetResizable(true) + // GtkTreeViewColumn.SetFixedWidth() accepts only positive integers. + if width_int > 1 { + col.SetSizing(gtk.TREE_VIEW_COLUMN_FIXED) + col.SetFixedWidth(width_int) + } + m.column_pos["Servers"][name] = position_int + all_servers_columns_to_append[position_int] = col + } - for i := range all_servers_columns_to_append { - if i < 2 { - continue - } - m.all_servers.AppendColumn(all_servers_columns_to_append[i]) - } + for i := range all_servers_columns_to_append { + if i < 2 { + continue + } + m.all_servers.AppendColumn(all_servers_columns_to_append[i]) + } - // Sorting. - // By default we are sorting by server name. - m.all_servers_store_sortable.SetSortColumnId(m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], gtk.SORT_ASCENDING) + // Sorting. + // By default we are sorting by server name. + m.all_servers_store_sortable.SetSortColumnId(m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], gtk.SORT_ASCENDING) - // Sorting functions. - m.all_servers_store_sortable.SetSortFunc(m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], m.sortServersByName) - m.all_servers_store_sortable.SetSortFunc(m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], m.sortServersByPlayers) - m.all_servers_store_sortable.SetSortFunc(m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], m.sortServersByPing) + // Sorting functions. + m.all_servers_store_sortable.SetSortFunc(m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], m.sortServersByName, nil) + m.all_servers_store_sortable.SetSortFunc(m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], m.sortServersByPlayers, nil) + m.all_servers_store_sortable.SetSortFunc(m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], m.sortServersByPing, nil) - // Selection changed signal, which will update server's short info pane. - m.all_servers.Connect("cursor-changed", m.showShortServerInformation) + // Selection changed signal, which will update server's short info pane. + m.all_servers.Connect("cursor-changed", m.showShortServerInformation) - // VBox for some servers list controllers. - tab_all_srv_ctl_vbox := gtk.NewVBox(false, 0) - tab_allsrv_hbox.PackStart(tab_all_srv_ctl_vbox, false, true, 5) + // VBox for some servers list controllers. + tab_all_srv_ctl_vbox := gtk.NewVBox(false, 0) + tab_allsrv_hbox.PackStart(tab_all_srv_ctl_vbox, false, true, 5) - // Checkbox for hiding offline servers. - m.all_servers_hide_offline = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide offline servers", nil)) - m.all_servers_hide_offline.SetTooltipText(ctx.Translator.Translate("Hide offline servers on Servers tab", nil)) - tab_all_srv_ctl_vbox.PackStart(m.all_servers_hide_offline, false, true, 5) - m.all_servers_hide_offline.Clicked(m.hideOfflineAllServers) - // Restore value of hide offline servers checkbox. - // Set to checked for new installations. - all_servers_hide_offline_cb_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/hide_offline"] - if !ok { - m.all_servers_hide_offline.SetActive(true) - } else { - if all_servers_hide_offline_cb_val == "1" { - m.all_servers_hide_offline.SetActive(true) - } - } + // Checkbox for hiding offline servers. + m.all_servers_hide_offline = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide offline servers", nil)) + m.all_servers_hide_offline.SetTooltipText(ctx.Translator.Translate("Hide offline servers on Servers tab", nil)) + tab_all_srv_ctl_vbox.PackStart(m.all_servers_hide_offline, false, true, 5) + m.all_servers_hide_offline.Clicked(m.hideOfflineAllServers) + // Restore value of hide offline servers checkbox. + // Set to checked for new installations. + all_servers_hide_offline_cb_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/hide_offline"] + if !ok { + m.all_servers_hide_offline.SetActive(true) + } else { + if all_servers_hide_offline_cb_val == "1" { + m.all_servers_hide_offline.SetActive(true) + } + } - // Checkbox for hiding passworded servers. - m.all_servers_hide_private = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide private servers", nil)) - m.all_servers_hide_private.SetTooltipText(ctx.Translator.Translate("Hide servers which requires password to enter", nil)) - tab_all_srv_ctl_vbox.PackStart(m.all_servers_hide_private, false, true, 5) - m.all_servers_hide_private.Clicked(m.hidePrivateAllServers) - // Restore checkbox value. - all_servers_hide_private_cb_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/hide_private"] - if !ok { - m.all_servers_hide_private.SetActive(true) - } else { - if all_servers_hide_private_cb_val == "1" { - m.all_servers_hide_private.SetActive(true) - } - } + // Checkbox for hiding passworded servers. + m.all_servers_hide_private = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide private servers", nil)) + m.all_servers_hide_private.SetTooltipText(ctx.Translator.Translate("Hide servers which requires password to enter", nil)) + tab_all_srv_ctl_vbox.PackStart(m.all_servers_hide_private, false, true, 5) + m.all_servers_hide_private.Clicked(m.hidePrivateAllServers) + // Restore checkbox value. + all_servers_hide_private_cb_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/hide_private"] + if !ok { + m.all_servers_hide_private.SetActive(true) + } else { + if all_servers_hide_private_cb_val == "1" { + m.all_servers_hide_private.SetActive(true) + } + } - // Filtering by version. - m.all_servers_version = gtk.NewComboBoxText() - m.all_servers_version.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected version of Urban Terror", nil)) - m.all_servers_version.AppendText(ctx.Translator.Translate("All versions", nil)) - for i := range common.SUPPORTED_URT_VERSIONS { - m.all_servers_version.AppendText(common.SUPPORTED_URT_VERSIONS[i]) - } - all_servers_version_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/version"] - if ok { - all_servers_version_int, _ := strconv.Atoi(all_servers_version_val) - m.all_servers_version.SetActive(all_servers_version_int) - } else { - m.all_servers_version.SetActive(0) - } - m.all_servers_version.Connect("changed", m.allServersVersionFilterChanged) - tab_all_srv_ctl_vbox.PackStart(m.all_servers_version, false, true, 5) + // Filtering by version. + m.all_servers_version = gtk.NewComboBoxText() + m.all_servers_version.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected version of Urban Terror", nil)) + m.all_servers_version.AppendText(ctx.Translator.Translate("All versions", nil)) + for i := range common.SUPPORTED_URT_VERSIONS { + m.all_servers_version.AppendText(common.SUPPORTED_URT_VERSIONS[i]) + } + all_servers_version_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/version"] + if ok { + all_servers_version_int, _ := strconv.Atoi(all_servers_version_val) + m.all_servers_version.SetActive(all_servers_version_int) + } else { + m.all_servers_version.SetActive(0) + } + m.all_servers_version.Connect("changed", m.allServersVersionFilterChanged) + tab_all_srv_ctl_vbox.PackStart(m.all_servers_version, false, true, 5) - // Filtering by gamemode - m.all_servers_gamemode = gtk.NewComboBoxText() - m.all_servers_gamemode.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected game mode", nil)) - m.all_servers_gamemode.AppendText(ctx.Translator.Translate("All gamemodes", nil)) - // Get sorted gamemodes keys. - gm_keys := make([]int, 0, len(m.gamemodes)) - for i := range m.gamemodes { - key, _ := strconv.Atoi(i) - gm_keys = append(gm_keys, key) - } - sort.Ints(gm_keys) - for i := range gm_keys { - m.all_servers_gamemode.AppendText(m.gamemodes[strconv.Itoa(gm_keys[i])]) - } - all_servers_gamemode_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/gamemode"] - if ok { - all_servers_gamemode_int, _ := strconv.Atoi(all_servers_gamemode_val) - m.all_servers_gamemode.SetActive(all_servers_gamemode_int) - } else { - m.all_servers_gamemode.SetActive(0) - } - m.all_servers_gamemode.Connect("changed", m.allServersGamemodeFilterChanged) - tab_all_srv_ctl_vbox.PackStart(m.all_servers_gamemode, false, true, 5) + // Filtering by gamemode + m.all_servers_gamemode = gtk.NewComboBoxText() + m.all_servers_gamemode.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected game mode", nil)) + m.all_servers_gamemode.AppendText(ctx.Translator.Translate("All gamemodes", nil)) + // Get sorted gamemodes keys. + gm_keys := make([]int, 0, len(m.gamemodes)) + for i := range m.gamemodes { + key, _ := strconv.Atoi(i) + gm_keys = append(gm_keys, key) + } + sort.Ints(gm_keys) + for i := range gm_keys { + m.all_servers_gamemode.AppendText(m.gamemodes[strconv.Itoa(gm_keys[i])]) + } + all_servers_gamemode_val, ok := ctx.Cfg.Cfg["/serverslist/all_servers/gamemode"] + if ok { + all_servers_gamemode_int, _ := strconv.Atoi(all_servers_gamemode_val) + m.all_servers_gamemode.SetActive(all_servers_gamemode_int) + } else { + m.all_servers_gamemode.SetActive(0) + } + m.all_servers_gamemode.Connect("changed", m.allServersGamemodeFilterChanged) + tab_all_srv_ctl_vbox.PackStart(m.all_servers_gamemode, false, true, 5) - // Final separator. - ctl_sep := gtk.NewVBox(false, 0) - tab_all_srv_ctl_vbox.PackStart(ctl_sep, true, true, 5) + // Final separator. + ctl_sep := gtk.NewVBox(false, 0) + tab_all_srv_ctl_vbox.PackStart(ctl_sep, true, true, 5) - // Favorites servers - // ToDo: sorting as in all servers list. - tab_fav_srv_hbox := gtk.NewHBox(false, 0) - m.fav_servers = gtk.NewTreeView() - swin2 := gtk.NewScrolledWindow(nil, nil) - swin2.Add(m.fav_servers) - tab_fav_srv_hbox.PackStart(swin2, true, true, 5) - m.tab_widget.AppendPage(tab_fav_srv_hbox, gtk.NewLabel(ctx.Translator.Translate("Favorites", nil))) - m.fav_servers.SetModel(m.fav_servers_store) - m.fav_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Status", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 0)) - m.fav_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Public", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 1)) + // Favorites servers + // ToDo: sorting as in all servers list. + tab_fav_srv_hbox := gtk.NewHBox(false, 0) + m.fav_servers = gtk.NewTreeView() + swin2 := gtk.NewScrolledWindow(nil, nil) + swin2.Add(m.fav_servers) + tab_fav_srv_hbox.PackStart(swin2, true, true, 5) + m.tab_widget.AppendPage(tab_fav_srv_hbox, gtk.NewLabel(ctx.Translator.Translate("Favorites", nil))) + m.fav_servers.SetModel(m.fav_servers_store) + m.fav_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Status", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 0)) + m.fav_servers.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Public", nil), gtk.NewCellRendererPixbuf(), "pixbuf", 1)) - // +2 because we have 2 static columns. - fav_servers_columns_to_append := make([]*gtk.TreeViewColumn, len(m.column_names) + 2) - for pos, name := range m.column_names { - // Check if we have column position saved. If so - use it. - // Otherwise use default position. - // Should be actual only for first launch. - position := ctx.Cfg.Cfg["/mainwindow/fav_servers/" + ctx.Translator.Translate(name, nil) + "_position"] - if len(position) == 0 { - position = pos - } - position_int, _ := strconv.Atoi(position) - // Same for width. - width := ctx.Cfg.Cfg["/mainwindow/fav_servers/" + ctx.Translator.Translate(name, nil) + "_width"] - if len(width) == 0 { - width = "-1" - } - width_int, _ := strconv.Atoi(width) + // +2 because we have 2 static columns. + fav_servers_columns_to_append := make([]*gtk.TreeViewColumn, len(m.column_names)+2) + for pos, name := range m.column_names { + // Check if we have column position saved. If so - use it. + // Otherwise use default position. + // Should be actual only for first launch. + position := ctx.Cfg.Cfg["/mainwindow/fav_servers/"+ctx.Translator.Translate(name, nil)+"_position"] + if len(position) == 0 { + position = pos + } + position_int, _ := strconv.Atoi(position) + // Same for width. + width := ctx.Cfg.Cfg["/mainwindow/fav_servers/"+ctx.Translator.Translate(name, nil)+"_width"] + if len(width) == 0 { + width = "-1" + } + width_int, _ := strconv.Atoi(width) - col := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate(name, nil), gtk.NewCellRendererText(), "markup", position_int) - // For some reason this cause panic on Windows, so disabling - // default sorting here. - if runtime.GOOS != "windows" { - col.SetSortColumnId(position_int) - } - col.SetReorderable(true) - col.SetResizable(true) - // GtkTreeViewColumn.SetFixedWidth() accepts only positive integers. - if width_int > 1 { - col.SetSizing(gtk.TREE_VIEW_COLUMN_FIXED) - col.SetFixedWidth(width_int) - } - m.column_pos["Favorites"][name] = position_int - fav_servers_columns_to_append[position_int] = col - } + col := gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate(name, nil), gtk.NewCellRendererText(), "markup", position_int) + // For some reason this cause panic on Windows, so disabling + // default sorting here. + if runtime.GOOS != "windows" { + col.SetSortColumnId(position_int) + } + col.SetReorderable(true) + col.SetResizable(true) + // GtkTreeViewColumn.SetFixedWidth() accepts only positive integers. + if width_int > 1 { + col.SetSizing(gtk.TREE_VIEW_COLUMN_FIXED) + col.SetFixedWidth(width_int) + } + m.column_pos["Favorites"][name] = position_int + fav_servers_columns_to_append[position_int] = col + } - for i := range fav_servers_columns_to_append { - if i < 2 { - continue - } - m.fav_servers.AppendColumn(fav_servers_columns_to_append[i]) - } + for i := range fav_servers_columns_to_append { + if i < 2 { + continue + } + m.fav_servers.AppendColumn(fav_servers_columns_to_append[i]) + } - // Sorting functions. - m.all_servers_store_sortable.SetSortFunc(m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], m.sortServersByName) - m.all_servers_store_sortable.SetSortFunc(m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], m.sortServersByPlayers) - m.all_servers_store_sortable.SetSortFunc(m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], m.sortServersByPing) + // Sorting functions. + m.all_servers_store_sortable.SetSortFunc(m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], m.sortServersByName, nil) + m.all_servers_store_sortable.SetSortFunc(m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], m.sortServersByPlayers, nil) + m.all_servers_store_sortable.SetSortFunc(m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], m.sortServersByPing, nil) - // Selection changed signal, which will update server's short info pane. - m.fav_servers.Connect("cursor-changed", m.showShortServerInformation) + // Selection changed signal, which will update server's short info pane. + m.fav_servers.Connect("cursor-changed", m.showShortServerInformation) - // VBox for some servers list controllers. - tab_fav_srv_ctl_vbox := gtk.NewVBox(false, 0) - tab_fav_srv_hbox.PackStart(tab_fav_srv_ctl_vbox, false, true, 5) + // VBox for some servers list controllers. + tab_fav_srv_ctl_vbox := gtk.NewVBox(false, 0) + tab_fav_srv_hbox.PackStart(tab_fav_srv_ctl_vbox, false, true, 5) - // Checkbox for hiding offline servers. - m.fav_servers_hide_offline = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide offline servers", nil)) - m.fav_servers_hide_offline.SetTooltipText(ctx.Translator.Translate("Hide offline servers on Favorites tab", nil)) - tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_hide_offline, false, true, 5) - m.fav_servers_hide_offline.Clicked(m.hideOfflineFavoriteServers) - // Restore value of hide offline servers checkbox. - // Set to checked for new installations. - favorite_servers_hide_offline_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"] - if !ok { - m.fav_servers_hide_offline.SetActive(true) - } else { - if favorite_servers_hide_offline_cb_val == "1" { - m.fav_servers_hide_offline.SetActive(true) - } - } + // Checkbox for hiding offline servers. + m.fav_servers_hide_offline = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide offline servers", nil)) + m.fav_servers_hide_offline.SetTooltipText(ctx.Translator.Translate("Hide offline servers on Favorites tab", nil)) + tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_hide_offline, false, true, 5) + m.fav_servers_hide_offline.Clicked(m.hideOfflineFavoriteServers) + // Restore value of hide offline servers checkbox. + // Set to checked for new installations. + favorite_servers_hide_offline_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"] + if !ok { + m.fav_servers_hide_offline.SetActive(true) + } else { + if favorite_servers_hide_offline_cb_val == "1" { + m.fav_servers_hide_offline.SetActive(true) + } + } - // Checkbox for hiding passworded servers. - m.fav_servers_hide_private = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide private servers", nil)) - m.fav_servers_hide_private.SetTooltipText(ctx.Translator.Translate("Hide servers which requires password to enter", nil)) - tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_hide_private, false, true, 5) - m.fav_servers_hide_private.Clicked(m.hidePrivateFavoriteServers) - // Restore checkbox value. - fav_servers_hide_private_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_private"] - if !ok { - m.fav_servers_hide_private.SetActive(true) - } else { - if fav_servers_hide_private_cb_val == "1" { - m.fav_servers_hide_private.SetActive(true) - } - } + // Checkbox for hiding passworded servers. + m.fav_servers_hide_private = gtk.NewCheckButtonWithLabel(ctx.Translator.Translate("Hide private servers", nil)) + m.fav_servers_hide_private.SetTooltipText(ctx.Translator.Translate("Hide servers which requires password to enter", nil)) + tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_hide_private, false, true, 5) + m.fav_servers_hide_private.Clicked(m.hidePrivateFavoriteServers) + // Restore checkbox value. + fav_servers_hide_private_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_private"] + if !ok { + m.fav_servers_hide_private.SetActive(true) + } else { + if fav_servers_hide_private_cb_val == "1" { + m.fav_servers_hide_private.SetActive(true) + } + } - m.fav_servers_version = gtk.NewComboBoxText() - m.fav_servers_version.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected version of Urban Terror", nil)) - m.fav_servers_version.AppendText(ctx.Translator.Translate("All versions", nil)) - for i := range common.SUPPORTED_URT_VERSIONS { - m.fav_servers_version.AppendText(common.SUPPORTED_URT_VERSIONS[i]) - } - fav_servers_version_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/version"] - if ok { - fav_servers_version_int, _ := strconv.Atoi(fav_servers_version_val) - m.fav_servers_version.SetActive(fav_servers_version_int) - } else { - m.fav_servers_version.SetActive(0) - } - m.fav_servers_version.Connect("changed", m.favServersVersionFilterChanged) - tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_version, false, true, 5) + m.fav_servers_version = gtk.NewComboBoxText() + m.fav_servers_version.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected version of Urban Terror", nil)) + m.fav_servers_version.AppendText(ctx.Translator.Translate("All versions", nil)) + for i := range common.SUPPORTED_URT_VERSIONS { + m.fav_servers_version.AppendText(common.SUPPORTED_URT_VERSIONS[i]) + } + fav_servers_version_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/version"] + if ok { + fav_servers_version_int, _ := strconv.Atoi(fav_servers_version_val) + m.fav_servers_version.SetActive(fav_servers_version_int) + } else { + m.fav_servers_version.SetActive(0) + } + m.fav_servers_version.Connect("changed", m.favServersVersionFilterChanged) + tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_version, false, true, 5) - // Filtering by gamemode - m.fav_servers_gamemode = gtk.NewComboBoxText() - m.fav_servers_gamemode.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected game mode", nil)) - m.fav_servers_gamemode.AppendText(ctx.Translator.Translate("All gamemodes", nil)) - // Gamemode keys already sorted while adding same filter to "Servers" - // tab, so just re-use them. - for i := range gm_keys { - m.fav_servers_gamemode.AppendText(m.gamemodes[strconv.Itoa(gm_keys[i])]) - } - fav_servers_gamemode_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/gamemode"] - if ok { - fav_servers_gamemode_int, _ := strconv.Atoi(fav_servers_gamemode_val) - m.fav_servers_gamemode.SetActive(fav_servers_gamemode_int) - } else { - m.fav_servers_gamemode.SetActive(0) - } - m.fav_servers_gamemode.Connect("changed", m.favServersGamemodeFilterChanged) - tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_gamemode, false, true, 5) + // Filtering by gamemode + m.fav_servers_gamemode = gtk.NewComboBoxText() + m.fav_servers_gamemode.SetTooltipText(ctx.Translator.Translate("Show only servers which uses selected game mode", nil)) + m.fav_servers_gamemode.AppendText(ctx.Translator.Translate("All gamemodes", nil)) + // Gamemode keys already sorted while adding same filter to "Servers" + // tab, so just re-use them. + for i := range gm_keys { + m.fav_servers_gamemode.AppendText(m.gamemodes[strconv.Itoa(gm_keys[i])]) + } + fav_servers_gamemode_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/gamemode"] + if ok { + fav_servers_gamemode_int, _ := strconv.Atoi(fav_servers_gamemode_val) + m.fav_servers_gamemode.SetActive(fav_servers_gamemode_int) + } else { + m.fav_servers_gamemode.SetActive(0) + } + m.fav_servers_gamemode.Connect("changed", m.favServersGamemodeFilterChanged) + tab_fav_srv_ctl_vbox.PackStart(m.fav_servers_gamemode, false, true, 5) - // Final separator. - ctl_fav_sep := gtk.NewVBox(false, 0) - tab_fav_srv_ctl_vbox.PackStart(ctl_fav_sep, true, true, 5) + // Final separator. + ctl_fav_sep := gtk.NewVBox(false, 0) + tab_fav_srv_ctl_vbox.PackStart(ctl_fav_sep, true, true, 5) - // Add tab_widget widget to window. - m.hpane.Add1(m.tab_widget) + // Add tab_widget widget to window. + m.hpane.Add1(m.tab_widget) } // Tasks. func (m *MainWindow) initializeTasks(data map[string]string) { - // Get task status, if it already running. - task_status := ctx.Timer.GetTaskStatus("Server's autoupdating") - // Remove tasks if they exist. - ctx.Timer.RemoveTask("Server's autoupdating") + // Get task status, if it already running. + task_status := ctx.Timer.GetTaskStatus("Server's autoupdating") + // Remove tasks if they exist. + ctx.Timer.RemoveTask("Server's autoupdating") - // Add servers autoupdate task. - if ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] == "1" { - task := timer.TimerTask{ - Name: "Server's autoupdating", - Callee: "updateAllServers", - InProgress: task_status, - } + // Add servers autoupdate task. + if ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] == "1" { + task := timer.TimerTask{ + Name: "Server's autoupdating", + Callee: "updateAllServers", + InProgress: task_status, + } - timeout, ok := ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] - if ok { - timeout_int, err := strconv.Atoi(timeout) - if err != nil { - task.Timeout = 10 * 60 - } else { - task.Timeout = timeout_int * 60 - } - } else { - task.Timeout = 10 * 60 - } + timeout, ok := ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] + if ok { + timeout_int, err := strconv.Atoi(timeout) + if err != nil { + task.Timeout = 10 * 60 + } else { + task.Timeout = timeout_int * 60 + } + } else { + task.Timeout = 10 * 60 + } - ctx.Timer.AddTask(&task) - } + ctx.Timer.AddTask(&task) + } } // Toolbar initialization. func (m *MainWindow) InitializeToolbar() { - m.toolbar = gtk.NewToolbar() - m.vbox.PackStart(m.toolbar, false, false, 5) + m.toolbar = gtk.NewToolbar() + m.vbox.PackStart(m.toolbar, false, false, 5) - // Update servers button. - button_update_all_servers_icon_bytes, _ := base64.StdEncoding.DecodeString(common.REFRESH_ALL_SERVERS) - button_update_all_servers_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - button_update_all_servers_icon_pixbuf.SetSize(24, 24) - button_update_all_servers_icon_pixbuf.Write(button_update_all_servers_icon_bytes) - button_update_all_servers_icon := gtk.NewImageFromPixbuf(button_update_all_servers_icon_pixbuf.GetPixbuf()) - button_update_all_servers := gtk.NewToolButton(button_update_all_servers_icon, ctx.Translator.Translate("Update all servers", nil)) - button_update_all_servers.SetTooltipText(ctx.Translator.Translate("Update all servers in currently selected tab", nil)) - button_update_all_servers.OnClicked(m.UpdateServers) - m.toolbar.Insert(button_update_all_servers, 0) + // Update servers button. + button_update_all_servers_icon_bytes, _ := base64.StdEncoding.DecodeString(common.REFRESH_ALL_SERVERS) + button_update_all_servers_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + button_update_all_servers_icon_pixbuf.SetSize(24, 24) + button_update_all_servers_icon_pixbuf.Write(button_update_all_servers_icon_bytes) + button_update_all_servers_icon := gtk.NewImageFromPixbuf(button_update_all_servers_icon_pixbuf.GetPixbuf()) + button_update_all_servers := gtk.NewToolButton(button_update_all_servers_icon, ctx.Translator.Translate("Update all servers", nil)) + button_update_all_servers.SetTooltipText(ctx.Translator.Translate("Update all servers in currently selected tab", nil)) + button_update_all_servers.OnClicked(m.UpdateServers) + m.toolbar.Insert(button_update_all_servers, 0) - button_update_one_server_icon_bytes, _ := base64.StdEncoding.DecodeString(common.REFRESH_ONE_SERVER) - button_update_one_server_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - button_update_one_server_icon_pixbuf.SetSize(24, 24) - button_update_one_server_icon_pixbuf.Write(button_update_one_server_icon_bytes) - button_update_one_server_icon := gtk.NewImageFromPixbuf(button_update_one_server_icon_pixbuf.GetPixbuf()) - button_update_one_server := gtk.NewToolButton(button_update_one_server_icon, ctx.Translator.Translate("Update selected server", nil)) - button_update_one_server.SetTooltipText(ctx.Translator.Translate("Update only selected server", nil)) - button_update_one_server.OnClicked(m.updateOneServer) - m.toolbar.Insert(button_update_one_server, 1) + button_update_one_server_icon_bytes, _ := base64.StdEncoding.DecodeString(common.REFRESH_ONE_SERVER) + button_update_one_server_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + button_update_one_server_icon_pixbuf.SetSize(24, 24) + button_update_one_server_icon_pixbuf.Write(button_update_one_server_icon_bytes) + button_update_one_server_icon := gtk.NewImageFromPixbuf(button_update_one_server_icon_pixbuf.GetPixbuf()) + button_update_one_server := gtk.NewToolButton(button_update_one_server_icon, ctx.Translator.Translate("Update selected server", nil)) + button_update_one_server.SetTooltipText(ctx.Translator.Translate("Update only selected server", nil)) + button_update_one_server.OnClicked(m.updateOneServer) + m.toolbar.Insert(button_update_one_server, 1) - // Separator. - separator := gtk.NewSeparatorToolItem() - m.toolbar.Insert(separator, 2) + // Separator. + separator := gtk.NewSeparatorToolItem() + m.toolbar.Insert(separator, 2) - // Add server to favorites button. - fav_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.ADD_TO_FAVORITES) - fav_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - fav_button_icon_pixbuf.SetSize(24, 24) - fav_button_icon_pixbuf.Write(fav_button_icon_bytes) - fav_button_icon := gtk.NewImageFromPixbuf(fav_button_icon_pixbuf.GetPixbuf()) - fav_button := gtk.NewToolButton(fav_button_icon, ctx.Translator.Translate("Add to favorites", nil)) - fav_button.SetTooltipText(ctx.Translator.Translate("Add selected server to favorites", nil)) - fav_button.OnClicked(m.addToFavorites) - m.toolbar.Insert(fav_button, 3) + // Add server to favorites button. + fav_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.ADD_TO_FAVORITES) + fav_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + fav_button_icon_pixbuf.SetSize(24, 24) + fav_button_icon_pixbuf.Write(fav_button_icon_bytes) + fav_button_icon := gtk.NewImageFromPixbuf(fav_button_icon_pixbuf.GetPixbuf()) + fav_button := gtk.NewToolButton(fav_button_icon, ctx.Translator.Translate("Add to favorites", nil)) + fav_button.SetTooltipText(ctx.Translator.Translate("Add selected server to favorites", nil)) + fav_button.OnClicked(m.addToFavorites) + m.toolbar.Insert(fav_button, 3) - fav_edit_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.EDIT_FAVORITE) - fav_edit_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - fav_edit_button_icon_pixbuf.SetSize(24, 24) - fav_edit_button_icon_pixbuf.Write(fav_edit_button_icon_bytes) - fav_edit_button_icon := gtk.NewImageFromPixbuf(fav_edit_button_icon_pixbuf.GetPixbuf()) - fav_edit_button := gtk.NewToolButton(fav_edit_button_icon, ctx.Translator.Translate("Edit favorite", nil)) - fav_edit_button.SetTooltipText(ctx.Translator.Translate("Edit selected favorite server", nil)) - fav_edit_button.OnClicked(m.editFavorite) - m.toolbar.Insert(fav_edit_button, 4) + fav_edit_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.EDIT_FAVORITE) + fav_edit_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + fav_edit_button_icon_pixbuf.SetSize(24, 24) + fav_edit_button_icon_pixbuf.Write(fav_edit_button_icon_bytes) + fav_edit_button_icon := gtk.NewImageFromPixbuf(fav_edit_button_icon_pixbuf.GetPixbuf()) + fav_edit_button := gtk.NewToolButton(fav_edit_button_icon, ctx.Translator.Translate("Edit favorite", nil)) + fav_edit_button.SetTooltipText(ctx.Translator.Translate("Edit selected favorite server", nil)) + fav_edit_button.OnClicked(m.editFavorite) + m.toolbar.Insert(fav_edit_button, 4) - // Remove server from favorites button. - fav_delete_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.REMOVE_FAVORITE) - fav_delete_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - fav_delete_button_icon_pixbuf.SetSize(24, 24) - fav_delete_button_icon_pixbuf.Write(fav_delete_button_icon_bytes) - fav_delete_button_icon := gtk.NewImageFromPixbuf(fav_delete_button_icon_pixbuf.GetPixbuf()) - fav_delete_button := gtk.NewToolButton(fav_delete_button_icon, ctx.Translator.Translate("Remove from favorites", nil)) - fav_delete_button.SetTooltipText(ctx.Translator.Translate("Remove selected server from favorites", nil)) - fav_delete_button.OnClicked(m.deleteFromFavorites) - m.toolbar.Insert(fav_delete_button, 5) + // Remove server from favorites button. + fav_delete_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.REMOVE_FAVORITE) + fav_delete_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + fav_delete_button_icon_pixbuf.SetSize(24, 24) + fav_delete_button_icon_pixbuf.Write(fav_delete_button_icon_bytes) + fav_delete_button_icon := gtk.NewImageFromPixbuf(fav_delete_button_icon_pixbuf.GetPixbuf()) + fav_delete_button := gtk.NewToolButton(fav_delete_button_icon, ctx.Translator.Translate("Remove from favorites", nil)) + fav_delete_button.SetTooltipText(ctx.Translator.Translate("Remove selected server from favorites", nil)) + fav_delete_button.OnClicked(m.deleteFromFavorites) + m.toolbar.Insert(fav_delete_button, 5) - // Copy server address button. - copy_srv_addr_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.COPY_CREDENTIALS) - copy_srv_addr_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") - copy_srv_addr_button_icon_pixbuf.SetSize(24, 24) - copy_srv_addr_button_icon_pixbuf.Write(copy_srv_addr_button_icon_bytes) - copy_srv_addr_button_icon := gtk.NewImageFromPixbuf(copy_srv_addr_button_icon_pixbuf.GetPixbuf()) - copy_srv_addr_button := gtk.NewToolButton(copy_srv_addr_button_icon, ctx.Translator.Translate("Copy server's creds", nil)) - copy_srv_addr_button.SetTooltipText(ctx.Translator.Translate("Copy server's credentials to clipboard for sharing", nil)) - copy_srv_addr_button.OnClicked(m.copyServerCredentialsToClipboard) - m.toolbar.Insert(copy_srv_addr_button, 6) + // Copy server address button. + copy_srv_addr_button_icon_bytes, _ := base64.StdEncoding.DecodeString(common.COPY_CREDENTIALS) + copy_srv_addr_button_icon_pixbuf, _ := gdkpixbuf.NewLoaderWithType("png") + copy_srv_addr_button_icon_pixbuf.SetSize(24, 24) + copy_srv_addr_button_icon_pixbuf.Write(copy_srv_addr_button_icon_bytes) + copy_srv_addr_button_icon := gtk.NewImageFromPixbuf(copy_srv_addr_button_icon_pixbuf.GetPixbuf()) + copy_srv_addr_button := gtk.NewToolButton(copy_srv_addr_button_icon, ctx.Translator.Translate("Copy server's creds", nil)) + copy_srv_addr_button.SetTooltipText(ctx.Translator.Translate("Copy server's credentials to clipboard for sharing", nil)) + copy_srv_addr_button.OnClicked(m.copyServerCredentialsToClipboard) + m.toolbar.Insert(copy_srv_addr_button, 6) - // Separator for toolbar's label and buttons. - toolbar_separator_toolitem := gtk.NewToolItem() - toolbar_separator_toolitem.SetExpand(true) - m.toolbar.Insert(toolbar_separator_toolitem, 7) - // Toolbar's label. - m.toolbar_label = gtk.NewLabel(ctx.Translator.Translate("URTrator is ready", nil)) - toolbar_label_toolitem := gtk.NewToolItem() - toolbar_label_toolitem.Add(m.toolbar_label) - m.toolbar.Insert(toolbar_label_toolitem, 8) + // Separator for toolbar's label and buttons. + toolbar_separator_toolitem := gtk.NewToolItem() + toolbar_separator_toolitem.SetExpand(true) + m.toolbar.Insert(toolbar_separator_toolitem, 7) + // Toolbar's label. + m.toolbar_label = gtk.NewLabel(ctx.Translator.Translate("URTrator is ready", nil)) + toolbar_label_toolitem := gtk.NewToolItem() + toolbar_label_toolitem.Add(m.toolbar_label) + m.toolbar.Insert(toolbar_label_toolitem, 8) } // Tray icon initialization. func (m *MainWindow) initializeTrayIcon() { - fmt.Println("Initializing tray icon...") + fmt.Println("Initializing tray icon...") - icon_bytes, _ := base64.StdEncoding.DecodeString(common.Logo) - icon_pixbuf := gdkpixbuf.NewLoader() - icon_pixbuf.Write(icon_bytes) - logo = icon_pixbuf.GetPixbuf() + icon_bytes, _ := base64.StdEncoding.DecodeString(common.Logo) + icon_pixbuf := gdkpixbuf.NewLoader() + icon_pixbuf.Write(icon_bytes) + logo = icon_pixbuf.GetPixbuf() - m.tray_icon = gtk.NewStatusIconFromPixbuf(logo) - m.tray_icon.SetName("URTrator") - m.tray_icon.SetTitle("URTrator") - m.tray_icon.SetTooltipText(ctx.Translator.Translate("URTrator is ready", nil)) + m.tray_icon = gtk.NewStatusIconFromPixbuf(logo) + m.tray_icon.SetName("URTrator") + m.tray_icon.SetTitle("URTrator") + m.tray_icon.SetTooltipText(ctx.Translator.Translate("URTrator is ready", nil)) - // Tray menu is still buggy on windows, so skipping initialization, - // if OS is Windows. - if runtime.GOOS != "windows" { - m.tray_menu = gtk.NewMenu() + // Tray menu is still buggy on windows, so skipping initialization, + // if OS is Windows. + if runtime.GOOS != "windows" { + m.tray_menu = gtk.NewMenu() - // Open/Close URTrator menu item. - open_close_item := gtk.NewMenuItemWithLabel(ctx.Translator.Translate("Show / Hide URTrator", nil)) - open_close_item.Connect("activate", m.showHide) - m.tray_menu.Append(open_close_item) + // Open/Close URTrator menu item. + open_close_item := gtk.NewMenuItemWithLabel(ctx.Translator.Translate("Show / Hide URTrator", nil)) + open_close_item.Connect("activate", m.showHide) + m.tray_menu.Append(open_close_item) - // Separator - sep1 := gtk.NewSeparatorMenuItem() - m.tray_menu.Append(sep1) + // Separator + sep1 := gtk.NewSeparatorMenuItem() + m.tray_menu.Append(sep1) - // Exit menu item. - exit_item := gtk.NewMenuItemWithLabel(ctx.Translator.Translate("Exit", nil)) - exit_item.Connect("activate", m.window.Destroy) - m.tray_menu.Append(exit_item) + // Exit menu item. + exit_item := gtk.NewMenuItemWithLabel(ctx.Translator.Translate("Exit", nil)) + exit_item.Connect("activate", m.window.Destroy) + m.tray_menu.Append(exit_item) - // Connect things. - m.tray_icon.Connect("activate", m.showHide) - m.tray_icon.Connect("popup-menu", m.showTrayMenu) - m.tray_menu.ShowAll() - } + // Connect things. + m.tray_icon.Connect("activate", m.showHide) + m.tray_icon.Connect("popup-menu", m.showTrayMenu) + m.tray_menu.ShowAll() + } } diff --git a/ui/gtk2/mainwindow_launch.go b/ui/gtk2/mainwindow_launch.go index 18c4001..50b4c1e 100644 --- a/ui/gtk2/mainwindow_launch.go +++ b/ui/gtk2/mainwindow_launch.go @@ -1,253 +1,253 @@ package ui import ( - // stdlib - "errors" - "fmt" - "runtime" - "strings" + // stdlib + "errors" + "fmt" + "runtime" + "strings" - // Local - "github.com/pztrn/urtrator/datamodels" + // Local + "gitlab.com/pztrn/urtrator/datamodels" - // other - "github.com/mattn/go-gtk/glib" - "github.com/mattn/go-gtk/gtk" + // other + "github.com/mattn/go-gtk/glib" + "github.com/mattn/go-gtk/gtk" ) func (m *MainWindow) launchGame() error { - fmt.Println("Launching Urban Terror...") - if len(m.qc_server_address.GetText()) != 0 { - m.launchWithQuickConnect() - } else { - m.launchAsUsual() - } + fmt.Println("Launching Urban Terror...") + if len(m.qc_server_address.GetText()) != 0 { + m.launchWithQuickConnect() + } else { + m.launchAsUsual() + } - return nil + return nil } // Triggers if we clicked "Launch" button without any text in quick connect // widget. func (m *MainWindow) launchAsUsual() error { - fmt.Println("Connecting to selected server...") - var srv_address string = "" + fmt.Println("Connecting to selected server...") + var srv_address string = "" - // Getting server's name from list. - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - sel := m.all_servers.GetSelection() - model := m.all_servers.GetModel() - if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - sel = m.fav_servers.GetSelection() - model = m.fav_servers.GetModel() - } - iter := new(gtk.TreeIter) - _ = sel.GetSelected(iter) + // Getting server's name from list. + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + sel := m.all_servers.GetSelection() + model := m.all_servers.GetModel() + if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + sel = m.fav_servers.GetSelection() + model = m.fav_servers.GetModel() + } + iter := new(gtk.TreeIter) + _ = sel.GetSelected(iter) - // Getting server address. - var srv_addr string - srv_address_gval := glib.ValueFromNative(srv_addr) - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - model.GetValue(iter, m.column_pos["Servers"]["IP"], srv_address_gval) - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - model.GetValue(iter, m.column_pos["Favorites"]["IP"], srv_address_gval) - } - srv_address = srv_address_gval.GetString() - if len(srv_address) == 0 { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("No server selected.\n\nPlease, select a server to continue connecting.", nil) - messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - messagebox.Response(func() { - messagebox.Destroy() - }) - messagebox.Run() - } else { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Select a server we will connect to!", nil) + ""}) - } - return errors.New(ctx.Translator.Translate("No server selected.", nil)) - } - server_profile := ctx.Cache.Servers[srv_address].Server + // Getting server address. + var srv_addr string + srv_address_gval := glib.ValueFromNative(srv_addr) + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + model.GetValue(iter, m.column_pos["Servers"]["IP"], srv_address_gval) + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + model.GetValue(iter, m.column_pos["Favorites"]["IP"], srv_address_gval) + } + srv_address = srv_address_gval.GetString() + if len(srv_address) == 0 { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("No server selected.\n\nPlease, select a server to continue connecting.", nil) + messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + messagebox.Response(func() { + messagebox.Destroy() + }) + messagebox.Run() + } else { + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Select a server we will connect to!", nil) + ""}) + } + return errors.New(ctx.Translator.Translate("No server selected.", nil)) + } + server_profile := ctx.Cache.Servers[srv_address].Server - // Check for proper server name. If length == 0: server is offline, - // we should show notification to user. - if len(server_profile.Name) == 0 { - var will_continue bool = false - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Selected server is offline.\n\nWould you still want to launch Urban Terror?\nIt will just launch a game, without connecting to\nany server.", nil) - messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_YES_NO, mbox_string) - messagebox.Connect("response", func(resp *glib.CallbackContext) { - if resp.Args(0) == 4294967287 { - will_continue = false - } else { - will_continue = true - } - messagebox.Destroy() - }) - messagebox.Run() - } else { - // We're okay to connect to empty server, temporary. - will_continue = true - } + // Check for proper server name. If length == 0: server is offline, + // we should show notification to user. + if len(server_profile.Name) == 0 { + var will_continue bool = false + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Selected server is offline.\n\nWould you still want to launch Urban Terror?\nIt will just launch a game, without connecting to\nany server.", nil) + messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_YES_NO, mbox_string) + messagebox.Connect("response", func(resp *glib.CallbackContext) { + if resp.Args(0) == 4294967287 { + will_continue = false + } else { + will_continue = true + } + messagebox.Destroy() + }) + messagebox.Run() + } else { + // We're okay to connect to empty server, temporary. + will_continue = true + } - if !will_continue { - return errors.New(ctx.Translator.Translate("User declined to connect to offline server", nil)) - } - } + if !will_continue { + return errors.New(ctx.Translator.Translate("User declined to connect to offline server", nil)) + } + } - // Getting selected profile's name. - profile_name := m.profiles.GetActiveText() - user_profile := &datamodels.Profile{} - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - // Checking profile name length. If 0 - then stop executing :) - // This check only relevant to "Servers" tab, favorite servers - // have profiles defined (see next). - if len(profile_name) == 0 { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Invalid game profile selected.\n\nPlease, select profile and retry.", nil) - messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - messagebox.Response(func() { - messagebox.Destroy() - }) - messagebox.Run() - } else { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Invalid game profile selected.", nil) + ""}) - } - return errors.New(ctx.Translator.Translate("User didn't select valid profile.", nil)) - } - user_profile = ctx.Cache.Profiles[profile_name].Profile - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - // For favorite servers profile specified in favorite server - // information have higher priority, so we just override it :) - user_profile_cached, ok := ctx.Cache.Profiles[server_profile.ProfileToUse] - if !ok { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Invalid game profile specified for favorite server.\n\nPlease, edit your favorite server, select valid profile and retry.", nil) - messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - messagebox.Response(func() { - messagebox.Destroy() - }) - messagebox.Run() - } else { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Invalid game profile specified in favorite entry.", nil) + ""}) - } - return errors.New(ctx.Translator.Translate("User didn't select valid profile.", nil)) - } - user_profile = user_profile_cached.Profile - } + // Getting selected profile's name. + profile_name := m.profiles.GetActiveText() + user_profile := &datamodels.Profile{} + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + // Checking profile name length. If 0 - then stop executing :) + // This check only relevant to "Servers" tab, favorite servers + // have profiles defined (see next). + if len(profile_name) == 0 { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Invalid game profile selected.\n\nPlease, select profile and retry.", nil) + messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + messagebox.Response(func() { + messagebox.Destroy() + }) + messagebox.Run() + } else { + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Invalid game profile selected.", nil) + ""}) + } + return errors.New(ctx.Translator.Translate("User didn't select valid profile.", nil)) + } + user_profile = ctx.Cache.Profiles[profile_name].Profile + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + // For favorite servers profile specified in favorite server + // information have higher priority, so we just override it :) + user_profile_cached, ok := ctx.Cache.Profiles[server_profile.ProfileToUse] + if !ok { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Invalid game profile specified for favorite server.\n\nPlease, edit your favorite server, select valid profile and retry.", nil) + messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + messagebox.Response(func() { + messagebox.Destroy() + }) + messagebox.Run() + } else { + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Invalid game profile specified in favorite entry.", nil) + ""}) + } + return errors.New(ctx.Translator.Translate("User didn't select valid profile.", nil)) + } + user_profile = user_profile_cached.Profile + } - m.launchActually(server_profile, user_profile, "", "") - return nil + m.launchActually(server_profile, user_profile, "", "") + return nil } // Triggers when Launch button was clicked with some text in quick connect // widget. func (m *MainWindow) launchWithQuickConnect() error { - fmt.Println("Launching game with data from quick connect...") + fmt.Println("Launching game with data from quick connect...") - srv_address := m.qc_server_address.GetText() - srv_password := m.qc_password.GetText() - srv_nickname := m.qc_nickname.GetText() - current_profile_name := m.profiles.GetActiveText() + srv_address := m.qc_server_address.GetText() + srv_password := m.qc_password.GetText() + srv_nickname := m.qc_nickname.GetText() + current_profile_name := m.profiles.GetActiveText() - // As we're launching without any profile defined - we should - // check server version and globally selected profile. - // Checking if we have server defined in cache. - var ip string = "" - var port string = "" - if strings.Contains(srv_address, ":") { - ip = strings.Split(srv_address, ":")[0] - port = strings.Split(srv_address, ":")[1] - } else { - ip = strings.Split(srv_address, ":")[0] - port = "27960" - } + // As we're launching without any profile defined - we should + // check server version and globally selected profile. + // Checking if we have server defined in cache. + var ip string = "" + var port string = "" + if strings.Contains(srv_address, ":") { + ip = strings.Split(srv_address, ":")[0] + port = strings.Split(srv_address, ":")[1] + } else { + ip = strings.Split(srv_address, ":")[0] + port = "27960" + } - key := ip + ":" + port + key := ip + ":" + port - _, ok := ctx.Cache.Servers[key] - if !ok { - ctx.Cache.CreateServer(key) - fmt.Println("Server not found in cache, requesting information...") - ctx.Requester.UpdateOneServer(key) - } + _, ok := ctx.Cache.Servers[key] + if !ok { + ctx.Cache.CreateServer(key) + fmt.Println("Server not found in cache, requesting information...") + ctx.Requester.UpdateOneServer(key) + } - server_profile := ctx.Cache.Servers[key] - user_profile := ctx.Cache.Profiles[current_profile_name] + server_profile := ctx.Cache.Servers[key] + user_profile := ctx.Cache.Profiles[current_profile_name] - m.launchActually(server_profile.Server, user_profile.Profile, srv_password, srv_nickname) - return nil + m.launchActually(server_profile.Server, user_profile.Profile, srv_password, srv_nickname) + return nil } func (m *MainWindow) launchActually(server_profile *datamodels.Server, user_profile *datamodels.Profile, password string, nickname_to_use string) error { - if server_profile.Name == "" { - var will_continue bool = false - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Selected server is offline.\n\nWould you still want to launch Urban Terror?\nIt will just launch a game, without connecting to\nany server.", nil) - messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_YES_NO, mbox_string) - messagebox.Connect("response", func(resp *glib.CallbackContext) { - if resp.Args(0) == 4294967287 { - will_continue = false - } else { - will_continue = true - } - messagebox.Destroy() - }) - messagebox.Run() - } else { - // We're ok here, temporary. - will_continue = true - } + if server_profile.Name == "" { + var will_continue bool = false + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Selected server is offline.\n\nWould you still want to launch Urban Terror?\nIt will just launch a game, without connecting to\nany server.", nil) + messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_YES_NO, mbox_string) + messagebox.Connect("response", func(resp *glib.CallbackContext) { + if resp.Args(0) == 4294967287 { + will_continue = false + } else { + will_continue = true + } + messagebox.Destroy() + }) + messagebox.Run() + } else { + // We're ok here, temporary. + will_continue = true + } - if !will_continue { - return errors.New(ctx.Translator.Translate("User declined to connect to offline server", nil)) - } - } + if !will_continue { + return errors.New(ctx.Translator.Translate("User declined to connect to offline server", nil)) + } + } - // Check if server is applicable for selected profile. - if server_profile.Version != user_profile.Version { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Invalid game profile selected.\n\nSelected profile have different game version than server.\nPlease, select valid profile and retry.", nil) - messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - messagebox.Response(func() { - messagebox.Destroy() - }) - messagebox.Run() - } else { - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Invalid game profile selected.", nil) + ""}) - } - return errors.New(ctx.Translator.Translate("User didn't select valid profile, mismatch with server's version.", nil)) - } + // Check if server is applicable for selected profile. + if server_profile.Version != user_profile.Version { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Invalid game profile selected.\n\nSelected profile have different game version than server.\nPlease, select valid profile and retry.", nil) + messagebox := gtk.NewMessageDialog(m.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + messagebox.Response(func() { + messagebox.Destroy() + }) + messagebox.Run() + } else { + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Invalid game profile selected.", nil) + ""}) + } + return errors.New(ctx.Translator.Translate("User didn't select valid profile, mismatch with server's version.", nil)) + } - server_password := password - if len(server_password) == 0 { - server_password = server_profile.Password - } + server_password := password + if len(server_password) == 0 { + server_password = server_profile.Password + } - // Hey, we're ok here! :) Launch Urban Terror! - // Clear server name from "" things. - srv_name_for_label := server_profile.Name - if strings.Contains(server_profile.Name, "markup") { - srv_name_for_label = string([]byte(server_profile.Name)[8:len(server_profile.Name)-9]) - } else { - srv_name := ctx.Colorizer.Fix(server_profile.Name) - srv_name_for_label = string([]byte(srv_name)[8:len(srv_name)-9]) - } - // Show great coloured label. - ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Urban Terror is launched with profile", nil) + " " + user_profile.Name + " " + ctx.Translator.Translate("and connected to", nil) + " " + srv_name_for_label + ""}) - m.launch_button.SetSensitive(false) - // ToDo: handling server passwords. - ctx.Launcher.Launch(server_profile, user_profile, server_password, []string{"+name", nickname_to_use}, m.unlockInterface) + // Hey, we're ok here! :) Launch Urban Terror! + // Clear server name from "" things. + srv_name_for_label := server_profile.Name + if strings.Contains(server_profile.Name, "markup") { + srv_name_for_label = string([]byte(server_profile.Name)[8 : len(server_profile.Name)-9]) + } else { + srv_name := ctx.Colorizer.Fix(server_profile.Name) + srv_name_for_label = string([]byte(srv_name)[8 : len(srv_name)-9]) + } + // Show great coloured label. + ctx.Eventer.LaunchEvent("setToolbarLabelText", map[string]string{"text": "" + ctx.Translator.Translate("Urban Terror is launched with profile", nil) + " " + user_profile.Name + " " + ctx.Translator.Translate("and connected to", nil) + " " + srv_name_for_label + ""}) + m.launch_button.SetSensitive(false) + // ToDo: handling server passwords. + ctx.Launcher.Launch(server_profile, user_profile, server_password, []string{"+name", nickname_to_use}, m.unlockInterface) - return nil + return nil } diff --git a/ui/gtk2/mainwindow_servers_sorting.go b/ui/gtk2/mainwindow_servers_sorting.go index 1975a90..0342882 100644 --- a/ui/gtk2/mainwindow_servers_sorting.go +++ b/ui/gtk2/mainwindow_servers_sorting.go @@ -1,96 +1,96 @@ package ui import ( - // stdlib - "strconv" - "strings" + // stdlib + "strconv" + "strings" - // other - "github.com/mattn/go-gtk/glib" - "github.com/mattn/go-gtk/gtk" + // other + "github.com/mattn/go-gtk/glib" + "github.com/mattn/go-gtk/gtk" ) -func (m *MainWindow) sortServersByName(model *gtk.TreeModel, a *gtk.TreeIter, b *gtk.TreeIter) int { - var name1_raw glib.GValue - var name2_raw glib.GValue +func (m *MainWindow) sortServersByName(model *gtk.TreeModel, a *gtk.TreeIter, b *gtk.TreeIter, userData interface{}) int { + var name1_raw glib.GValue + var name2_raw glib.GValue - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - model.GetValue(a, m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], &name1_raw) - model.GetValue(b, m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], &name2_raw) - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - model.GetValue(a, m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], &name1_raw) - model.GetValue(b, m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], &name2_raw) - } else { - return 0 - } + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + model.GetValue(a, m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], &name1_raw) + model.GetValue(b, m.column_pos["Servers"][ctx.Translator.Translate("Name", nil)], &name2_raw) + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + model.GetValue(a, m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], &name1_raw) + model.GetValue(b, m.column_pos["Favorites"][ctx.Translator.Translate("Name", nil)], &name2_raw) + } else { + return 0 + } - name1 := strings.ToLower(ctx.Colorizer.ClearFromMarkup(name1_raw.GetString())) - name2 := strings.ToLower(ctx.Colorizer.ClearFromMarkup(name2_raw.GetString())) + name1 := strings.ToLower(ctx.Colorizer.ClearFromMarkup(name1_raw.GetString())) + name2 := strings.ToLower(ctx.Colorizer.ClearFromMarkup(name2_raw.GetString())) - if name1 < name2 { - return -1 - } else { - return 1 - } + if name1 < name2 { + return -1 + } else { + return 1 + } - return 0 + return 0 } -func (m *MainWindow) sortServersByPlayers(model *gtk.TreeModel, a *gtk.TreeIter, b *gtk.TreeIter) int { - var players1_raw glib.GValue - var players2_raw glib.GValue +func (m *MainWindow) sortServersByPlayers(model *gtk.TreeModel, a *gtk.TreeIter, b *gtk.TreeIter, userData interface{}) int { + var players1_raw glib.GValue + var players2_raw glib.GValue - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - model.GetValue(a, m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], &players1_raw) - model.GetValue(b, m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], &players2_raw) - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - model.GetValue(a, m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], &players1_raw) - model.GetValue(b, m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], &players2_raw) - } else { - return 0 - } + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + model.GetValue(a, m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], &players1_raw) + model.GetValue(b, m.column_pos["Servers"][ctx.Translator.Translate("Players", nil)], &players2_raw) + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + model.GetValue(a, m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], &players1_raw) + model.GetValue(b, m.column_pos["Favorites"][ctx.Translator.Translate("Players", nil)], &players2_raw) + } else { + return 0 + } - players1_online := strings.Split(players1_raw.GetString(), "/")[0] - players2_online := strings.Split(players2_raw.GetString(), "/")[0] + players1_online := strings.Split(players1_raw.GetString(), "/")[0] + players2_online := strings.Split(players2_raw.GetString(), "/")[0] - if len(players1_online) > 0 && len(players2_online) > 0 { - players1, _ := strconv.Atoi(players1_online) - players2, _ := strconv.Atoi(players2_online) - if players1 > players2 { - return -1 - } else { - return 1 - } - } + if len(players1_online) > 0 && len(players2_online) > 0 { + players1, _ := strconv.Atoi(players1_online) + players2, _ := strconv.Atoi(players2_online) + if players1 > players2 { + return -1 + } else { + return 1 + } + } - return -1 + return -1 } -func (m *MainWindow) sortServersByPing(model *gtk.TreeModel, a *gtk.TreeIter, b *gtk.TreeIter) int { - var ping1_raw glib.GValue - var ping2_raw glib.GValue +func (m *MainWindow) sortServersByPing(model *gtk.TreeModel, a *gtk.TreeIter, b *gtk.TreeIter, userData interface{}) int { + var ping1_raw glib.GValue + var ping2_raw glib.GValue - current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) - if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { - model.GetValue(a, m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], &ping1_raw) - model.GetValue(b, m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], &ping2_raw) - } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { - model.GetValue(a, m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], &ping1_raw) - model.GetValue(b, m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], &ping2_raw) - } else { - return 0 - } + current_tab := m.tab_widget.GetTabLabelText(m.tab_widget.GetNthPage(m.tab_widget.GetCurrentPage())) + if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) { + model.GetValue(a, m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], &ping1_raw) + model.GetValue(b, m.column_pos["Servers"][ctx.Translator.Translate("Ping", nil)], &ping2_raw) + } else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) { + model.GetValue(a, m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], &ping1_raw) + model.GetValue(b, m.column_pos["Favorites"][ctx.Translator.Translate("Ping", nil)], &ping2_raw) + } else { + return 0 + } - ping1, _ := strconv.Atoi(ping1_raw.GetString()) - ping2, _ := strconv.Atoi(ping2_raw.GetString()) + ping1, _ := strconv.Atoi(ping1_raw.GetString()) + ping2, _ := strconv.Atoi(ping2_raw.GetString()) - if ping1 < ping2 { - return 1 - } else { - return -1 - } + if ping1 < ping2 { + return 1 + } else { + return -1 + } - return -1 + return -1 } diff --git a/ui/gtk2/options.go b/ui/gtk2/options.go index d5f24fb..f82fc17 100644 --- a/ui/gtk2/options.go +++ b/ui/gtk2/options.go @@ -10,427 +10,427 @@ package ui import ( - // stdlib - "fmt" - "runtime" + // stdlib + "fmt" + "runtime" - // Local - "github.com/pztrn/urtrator/datamodels" + // Local + "gitlab.com/pztrn/urtrator/datamodels" - // Other - "github.com/mattn/go-gtk/gtk" - "github.com/mattn/go-gtk/glib" + // Other + "github.com/mattn/go-gtk/glib" + "github.com/mattn/go-gtk/gtk" ) type OptionsDialog struct { - // Window. - window *gtk.Window - // Options main VBox. - vbox *gtk.VBox - // Tabs widget. - tab_widget *gtk.Notebook + // Window. + window *gtk.Window + // Options main VBox. + vbox *gtk.VBox + // Tabs widget. + tab_widget *gtk.Notebook - // Widgets. - // General tab. - // Show tray icon checkbutton. - show_tray_icon *gtk.CheckButton - // Enable autoupdate checkbutton. - autoupdate *gtk.CheckButton - // Appearance tab. - // Language to use. - language_combo *gtk.ComboBoxText - // Urban Terror tab. - // Profiles list. - profiles_list *gtk.TreeView - // Servers updating tab. - // Master server address. - master_server_addr *gtk.Entry - // Servers autoupdate. - servers_autoupdate *gtk.CheckButton - // Timeout for servers autoupdating. - servers_autoupdate_timeout *gtk.Entry + // Widgets. + // General tab. + // Show tray icon checkbutton. + show_tray_icon *gtk.CheckButton + // Enable autoupdate checkbutton. + autoupdate *gtk.CheckButton + // Appearance tab. + // Language to use. + language_combo *gtk.ComboBoxText + // Urban Terror tab. + // Profiles list. + profiles_list *gtk.TreeView + // Servers updating tab. + // Master server address. + master_server_addr *gtk.Entry + // Servers autoupdate. + servers_autoupdate *gtk.CheckButton + // Timeout for servers autoupdating. + servers_autoupdate_timeout *gtk.Entry - // Data stores. - // Urban Terror profiles list. - profiles_list_store *gtk.ListStore + // Data stores. + // Urban Terror profiles list. + profiles_list_store *gtk.ListStore } func (o *OptionsDialog) addProfile() { - fmt.Println("Adding profile...") + fmt.Println("Adding profile...") - op := OptionsProfile{} - op.Initialize(false) - ctx.Eventer.LaunchEvent("flushProfiles", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) + op := OptionsProfile{} + op.Initialize(false) + ctx.Eventer.LaunchEvent("flushProfiles", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) } func (o *OptionsDialog) closeOptionsDialogByCancel() { - o.window.Destroy() + o.window.Destroy() } func (o *OptionsDialog) closeOptionsDialogWithDiscard() { } func (o *OptionsDialog) closeOptionsDialogWithSaving() { - fmt.Println("Saving changes to options...") + fmt.Println("Saving changes to options...") - o.saveGeneral() - o.saveAppearance() + o.saveGeneral() + o.saveAppearance() - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Some options require application restart to be applied.", nil) - m := gtk.NewMessageDialog(o.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Some options require application restart to be applied.", nil) + m := gtk.NewMessageDialog(o.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } - o.window.Destroy() + o.window.Destroy() } func (o *OptionsDialog) deleteProfile() { - // Oh... dat... GTK... - sel := o.profiles_list.GetSelection() - model := o.profiles_list.GetModel() - iter := new(gtk.TreeIter) - _ = sel.GetSelected(iter) - var p string - gval := glib.ValueFromNative(p) - model.GetValue(iter, 0, gval) - profile_name := gval.GetString() + // Oh... dat... GTK... + sel := o.profiles_list.GetSelection() + model := o.profiles_list.GetModel() + iter := new(gtk.TreeIter) + _ = sel.GetSelected(iter) + var p string + gval := glib.ValueFromNative(p) + model.GetValue(iter, 0, gval) + profile_name := gval.GetString() - if len(profile_name) > 0 { - fmt.Println("Deleting profile '" + profile_name + "'") + if len(profile_name) > 0 { + fmt.Println("Deleting profile '" + profile_name + "'") - profile := datamodels.Profile{} - profile.Name = profile_name - ctx.Eventer.LaunchEvent("deleteProfile", map[string]string{"profile_name": profile_name}) - ctx.Eventer.LaunchEvent("flushProfiles", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) - } + profile := datamodels.Profile{} + profile.Name = profile_name + ctx.Eventer.LaunchEvent("deleteProfile", map[string]string{"profile_name": profile_name}) + ctx.Eventer.LaunchEvent("flushProfiles", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) + } } func (o *OptionsDialog) editProfile() { - // Oh... dat... GTK... - sel := o.profiles_list.GetSelection() - model := o.profiles_list.GetModel() - iter := new(gtk.TreeIter) - _ = sel.GetSelected(iter) - var p string - gval := glib.ValueFromNative(p) - model.GetValue(iter, 0, gval) - profile_name := gval.GetString() + // Oh... dat... GTK... + sel := o.profiles_list.GetSelection() + model := o.profiles_list.GetModel() + iter := new(gtk.TreeIter) + _ = sel.GetSelected(iter) + var p string + gval := glib.ValueFromNative(p) + model.GetValue(iter, 0, gval) + profile_name := gval.GetString() - if len(profile_name) > 0 { - op := OptionsProfile{} - op.InitializeUpdate(profile_name) - ctx.Eventer.LaunchEvent("flushProfiles", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) - } + if len(profile_name) > 0 { + op := OptionsProfile{} + op.InitializeUpdate(profile_name) + ctx.Eventer.LaunchEvent("flushProfiles", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) + } } func (o *OptionsDialog) fill() { - if ctx.Cfg.Cfg["/general/show_tray_icon"] == "1" { - o.show_tray_icon.SetActive(true) - } - if ctx.Cfg.Cfg["/general/urtrator_autoupdate"] == "1" { - o.autoupdate.SetActive(true) - } + if ctx.Cfg.Cfg["/general/show_tray_icon"] == "1" { + o.show_tray_icon.SetActive(true) + } + if ctx.Cfg.Cfg["/general/urtrator_autoupdate"] == "1" { + o.autoupdate.SetActive(true) + } - // Servers updating tab. - master_server_addr, ok := ctx.Cfg.Cfg["/servers_updating/master_server"] - if !ok { - o.master_server_addr.SetText("master.urbanterror.info:27900") - } else { - o.master_server_addr.SetText(master_server_addr) - } + // Servers updating tab. + master_server_addr, ok := ctx.Cfg.Cfg["/servers_updating/master_server"] + if !ok { + o.master_server_addr.SetText("master.urbanterror.info:27900") + } else { + o.master_server_addr.SetText(master_server_addr) + } - servers_autoupdate, ok1 := ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] - if ok1 { - if servers_autoupdate == "1" { - o.servers_autoupdate.SetActive(true) - } - } + servers_autoupdate, ok1 := ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] + if ok1 { + if servers_autoupdate == "1" { + o.servers_autoupdate.SetActive(true) + } + } - servers_update_timeout, ok2 := ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] - if !ok2 { - o.servers_autoupdate_timeout.SetText("10") - } else { - o.servers_autoupdate_timeout.SetText(servers_update_timeout) - } + servers_update_timeout, ok2 := ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] + if !ok2 { + o.servers_autoupdate_timeout.SetText("10") + } else { + o.servers_autoupdate_timeout.SetText(servers_update_timeout) + } } // Appearance tab initialization. func (o *OptionsDialog) initializeAppearanceTab() { - appearance_vbox := gtk.NewVBox(false, 0) + appearance_vbox := gtk.NewVBox(false, 0) - appearance_table := gtk.NewTable(1, 2, false) + appearance_table := gtk.NewTable(1, 2, false) - language_selection_tooltip := ctx.Translator.Translate("Language which URTrator will use.\n\nChanging this requires URTrator restart!", nil) + language_selection_tooltip := ctx.Translator.Translate("Language which URTrator will use.\n\nChanging this requires URTrator restart!", nil) - language_selection_label := gtk.NewLabel(ctx.Translator.Translate("Language:", nil)) - language_selection_label.SetAlignment(0, 0) - language_selection_label.SetTooltipText(language_selection_tooltip) - appearance_table.Attach(language_selection_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) + language_selection_label := gtk.NewLabel(ctx.Translator.Translate("Language:", nil)) + language_selection_label.SetAlignment(0, 0) + language_selection_label.SetTooltipText(language_selection_tooltip) + appearance_table.Attach(language_selection_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) - o.language_combo = gtk.NewComboBoxText() - o.language_combo.SetTooltipText(language_selection_tooltip) - // Get all available languages and fill combobox. - lang_idx := 0 - var lang_active int = 0 - for lang, _ := range ctx.Translator.AcceptedLanguages { - o.language_combo.AppendText(lang) - if ctx.Translator.AcceptedLanguages[lang] == ctx.Cfg.Cfg["/general/language"] { - lang_active = lang_idx - } - lang_idx += 1 - } - o.language_combo.SetActive(lang_active) + o.language_combo = gtk.NewComboBoxText() + o.language_combo.SetTooltipText(language_selection_tooltip) + // Get all available languages and fill combobox. + lang_idx := 0 + var lang_active int = 0 + for lang, _ := range ctx.Translator.AcceptedLanguages { + o.language_combo.AppendText(lang) + if ctx.Translator.AcceptedLanguages[lang] == ctx.Cfg.Cfg["/general/language"] { + lang_active = lang_idx + } + lang_idx += 1 + } + o.language_combo.SetActive(lang_active) - appearance_table.Attach(o.language_combo, 1, 2, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL, 5, 5) + appearance_table.Attach(o.language_combo, 1, 2, 0, 1, gtk.FILL|gtk.EXPAND, gtk.FILL, 5, 5) - appearance_vbox.PackStart(appearance_table, false, true, 0) - o.tab_widget.AppendPage(appearance_vbox, gtk.NewLabel(ctx.Translator.Translate("Appearance", nil))) + appearance_vbox.PackStart(appearance_table, false, true, 0) + o.tab_widget.AppendPage(appearance_vbox, gtk.NewLabel(ctx.Translator.Translate("Appearance", nil))) } func (o *OptionsDialog) initializeGeneralTab() { - general_vbox := gtk.NewVBox(false, 0) + general_vbox := gtk.NewVBox(false, 0) - general_table := gtk.NewTable(2, 2, false) + general_table := gtk.NewTable(2, 2, false) - // Tray icon checkbox. - show_tray_icon_label := gtk.NewLabel(ctx.Translator.Translate("Show icon in tray", nil)) - show_tray_icon_label.SetAlignment(0, 0) - general_table.Attach(show_tray_icon_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) + // Tray icon checkbox. + show_tray_icon_label := gtk.NewLabel(ctx.Translator.Translate("Show icon in tray", nil)) + show_tray_icon_label.SetAlignment(0, 0) + general_table.Attach(show_tray_icon_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) - o.show_tray_icon = gtk.NewCheckButtonWithLabel("") - o.show_tray_icon.SetTooltipText(ctx.Translator.Translate("Show icon in tray", nil)) - general_table.Attach(o.show_tray_icon, 1, 2, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL, 5, 5) + o.show_tray_icon = gtk.NewCheckButtonWithLabel("") + o.show_tray_icon.SetTooltipText(ctx.Translator.Translate("Show icon in tray", nil)) + general_table.Attach(o.show_tray_icon, 1, 2, 0, 1, gtk.FILL|gtk.EXPAND, gtk.FILL, 5, 5) - // Autoupdate checkbox. - autoupdate_tooltip := ctx.Translator.Translate("Should URTrator check for updates and update itself? Not working now.", nil) - autoupdate_label := gtk.NewLabel(ctx.Translator.Translate("Automatically update URTrator?", nil)) - autoupdate_label.SetTooltipText(autoupdate_tooltip) - autoupdate_label.SetAlignment(0, 0) - general_table.Attach(autoupdate_label, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK, 5, 5) + // Autoupdate checkbox. + autoupdate_tooltip := ctx.Translator.Translate("Should URTrator check for updates and update itself? Not working now.", nil) + autoupdate_label := gtk.NewLabel(ctx.Translator.Translate("Automatically update URTrator?", nil)) + autoupdate_label.SetTooltipText(autoupdate_tooltip) + autoupdate_label.SetAlignment(0, 0) + general_table.Attach(autoupdate_label, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK, 5, 5) - o.autoupdate = gtk.NewCheckButtonWithLabel("") - o.autoupdate.SetTooltipText(autoupdate_tooltip) - general_table.Attach(o.autoupdate, 1, 2, 1, 2, gtk.FILL | gtk.EXPAND, gtk.FILL, 5, 5) + o.autoupdate = gtk.NewCheckButtonWithLabel("") + o.autoupdate.SetTooltipText(autoupdate_tooltip) + general_table.Attach(o.autoupdate, 1, 2, 1, 2, gtk.FILL|gtk.EXPAND, gtk.FILL, 5, 5) - // Vertical separator. - sep := gtk.NewVBox(false, 0) + // Vertical separator. + sep := gtk.NewVBox(false, 0) - general_vbox.PackStart(general_table, false, true, 0) - general_vbox.PackStart(sep, false, true, 0) + general_vbox.PackStart(general_table, false, true, 0) + general_vbox.PackStart(sep, false, true, 0) - o.tab_widget.AppendPage(general_vbox, gtk.NewLabel(ctx.Translator.Translate("General", nil))) + o.tab_widget.AppendPage(general_vbox, gtk.NewLabel(ctx.Translator.Translate("General", nil))) } func (o *OptionsDialog) initializeServersOptionsTab() { - servers_options_vbox := gtk.NewVBox(false, 0) + servers_options_vbox := gtk.NewVBox(false, 0) - servers_updating_table := gtk.NewTable(3, 2, false) - servers_updating_table.SetRowSpacings(2) + servers_updating_table := gtk.NewTable(3, 2, false) + servers_updating_table.SetRowSpacings(2) - // Master server address. - master_server_addr_tooltip := ctx.Translator.Translate("Address of master server. Specify in form: addr:port.", nil) - master_server_addr_label := gtk.NewLabel(ctx.Translator.Translate("Master server address", nil)) - master_server_addr_label.SetTooltipText(master_server_addr_tooltip) - master_server_addr_label.SetAlignment(0, 0) - servers_updating_table.Attach(master_server_addr_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) + // Master server address. + master_server_addr_tooltip := ctx.Translator.Translate("Address of master server. Specify in form: addr:port.", nil) + master_server_addr_label := gtk.NewLabel(ctx.Translator.Translate("Master server address", nil)) + master_server_addr_label.SetTooltipText(master_server_addr_tooltip) + master_server_addr_label.SetAlignment(0, 0) + servers_updating_table.Attach(master_server_addr_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) - o.master_server_addr = gtk.NewEntry() - o.master_server_addr.SetTooltipText(master_server_addr_tooltip) - servers_updating_table.Attach(o.master_server_addr, 1, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5) + o.master_server_addr = gtk.NewEntry() + o.master_server_addr.SetTooltipText(master_server_addr_tooltip) + servers_updating_table.Attach(o.master_server_addr, 1, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5) - // Servers autoupdate checkbox. - servers_autoupdate_cb_tooptip := ctx.Translator.Translate("Should servers be automatically updated?", nil) - servers_autoupdate_cb_label := gtk.NewLabel(ctx.Translator.Translate("Servers autoupdate", nil)) - servers_autoupdate_cb_label.SetTooltipText(servers_autoupdate_cb_tooptip) - servers_autoupdate_cb_label.SetAlignment(0, 0) - servers_updating_table.Attach(servers_autoupdate_cb_label, 0, 1 ,1, 2, gtk.FILL, gtk.SHRINK, 5, 5) + // Servers autoupdate checkbox. + servers_autoupdate_cb_tooptip := ctx.Translator.Translate("Should servers be automatically updated?", nil) + servers_autoupdate_cb_label := gtk.NewLabel(ctx.Translator.Translate("Servers autoupdate", nil)) + servers_autoupdate_cb_label.SetTooltipText(servers_autoupdate_cb_tooptip) + servers_autoupdate_cb_label.SetAlignment(0, 0) + servers_updating_table.Attach(servers_autoupdate_cb_label, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK, 5, 5) - o.servers_autoupdate = gtk.NewCheckButtonWithLabel("") - o.servers_autoupdate.SetTooltipText(servers_autoupdate_cb_tooptip) - servers_updating_table.Attach(o.servers_autoupdate, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL, 5, 5) + o.servers_autoupdate = gtk.NewCheckButtonWithLabel("") + o.servers_autoupdate.SetTooltipText(servers_autoupdate_cb_tooptip) + servers_updating_table.Attach(o.servers_autoupdate, 1, 2, 1, 2, gtk.EXPAND|gtk.FILL, gtk.FILL, 5, 5) - // Servers update timeout. - servers_autoupdate_timeout_tooltip := ctx.Translator.Translate("Timeout which will trigger servers information update, in minutes.", nil) - servers_autoupdate_label := gtk.NewLabel(ctx.Translator.Translate("Servers update timeout (minutes)", nil)) - servers_autoupdate_label.SetTooltipText(servers_autoupdate_timeout_tooltip) - servers_autoupdate_label.SetAlignment(0, 0) - servers_updating_table.Attach(servers_autoupdate_label, 0, 1, 2, 3, gtk.FILL, gtk.SHRINK, 5, 5) + // Servers update timeout. + servers_autoupdate_timeout_tooltip := ctx.Translator.Translate("Timeout which will trigger servers information update, in minutes.", nil) + servers_autoupdate_label := gtk.NewLabel(ctx.Translator.Translate("Servers update timeout (minutes)", nil)) + servers_autoupdate_label.SetTooltipText(servers_autoupdate_timeout_tooltip) + servers_autoupdate_label.SetAlignment(0, 0) + servers_updating_table.Attach(servers_autoupdate_label, 0, 1, 2, 3, gtk.FILL, gtk.SHRINK, 5, 5) - o.servers_autoupdate_timeout = gtk.NewEntry() - o.servers_autoupdate_timeout.SetTooltipText(servers_autoupdate_timeout_tooltip) - servers_updating_table.Attach(o.servers_autoupdate_timeout, 1, 2, 2, 3, gtk.FILL, gtk.FILL, 5, 5) + o.servers_autoupdate_timeout = gtk.NewEntry() + o.servers_autoupdate_timeout.SetTooltipText(servers_autoupdate_timeout_tooltip) + servers_updating_table.Attach(o.servers_autoupdate_timeout, 1, 2, 2, 3, gtk.FILL, gtk.FILL, 5, 5) - // Vertical separator. - sep := gtk.NewVBox(false, 0) + // Vertical separator. + sep := gtk.NewVBox(false, 0) - servers_options_vbox.PackStart(servers_updating_table, false, true, 0) - servers_options_vbox.PackStart(sep, true, true, 0) + servers_options_vbox.PackStart(servers_updating_table, false, true, 0) + servers_options_vbox.PackStart(sep, true, true, 0) - o.tab_widget.AppendPage(servers_options_vbox, gtk.NewLabel(ctx.Translator.Translate("Servers updating", nil))) + o.tab_widget.AppendPage(servers_options_vbox, gtk.NewLabel(ctx.Translator.Translate("Servers updating", nil))) } func (o *OptionsDialog) initializeStorages() { - // Structure: - // Name|Version|Second X session - o.profiles_list_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_BOOL) + // Structure: + // Name|Version|Second X session + o.profiles_list_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING, glib.G_TYPE_BOOL) } func (o *OptionsDialog) initializeTabs() { - o.initializeStorages() - o.tab_widget = gtk.NewNotebook() - o.tab_widget.SetTabPos(gtk.POS_LEFT) + o.initializeStorages() + o.tab_widget = gtk.NewNotebook() + o.tab_widget.SetTabPos(gtk.POS_LEFT) - o.initializeGeneralTab() - o.initializeAppearanceTab() - o.initializeUrtTab() - o.initializeServersOptionsTab() + o.initializeGeneralTab() + o.initializeAppearanceTab() + o.initializeUrtTab() + o.initializeServersOptionsTab() - // Buttons for saving and discarding changes. - buttons_hbox := gtk.NewHBox(false, 0) - sep := gtk.NewHBox(false, 0) + // Buttons for saving and discarding changes. + buttons_hbox := gtk.NewHBox(false, 0) + sep := gtk.NewHBox(false, 0) - cancel_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Cancel", nil)) - cancel_button.Clicked(o.closeOptionsDialogByCancel) + cancel_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Cancel", nil)) + cancel_button.Clicked(o.closeOptionsDialogByCancel) - ok_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("OK", nil)) - ok_button.Clicked(o.closeOptionsDialogWithSaving) + ok_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("OK", nil)) + ok_button.Clicked(o.closeOptionsDialogWithSaving) - buttons_hbox.PackStart(sep, true, true, 5) - buttons_hbox.PackStart(cancel_button, false, true, 5) - buttons_hbox.PackStart(ok_button, false, true, 5) + buttons_hbox.PackStart(sep, true, true, 5) + buttons_hbox.PackStart(cancel_button, false, true, 5) + buttons_hbox.PackStart(ok_button, false, true, 5) - o.vbox.PackStart(o.tab_widget, true, true, 5) - o.vbox.PackStart(buttons_hbox, false, true, 5) + o.vbox.PackStart(o.tab_widget, true, true, 5) + o.vbox.PackStart(buttons_hbox, false, true, 5) - ctx.Eventer.AddEventHandler("loadProfilesIntoOptionsWindow", o.loadProfiles) + ctx.Eventer.AddEventHandler("loadProfilesIntoOptionsWindow", o.loadProfiles) } func (o *OptionsDialog) initializeUrtTab() { - urt_hbox := gtk.NewHBox(false, 5) + urt_hbox := gtk.NewHBox(false, 5) - // Profiles list. - o.profiles_list = gtk.NewTreeView() - o.profiles_list.SetTooltipText(ctx.Translator.Translate("All available profiles", nil)) - urt_hbox.Add(o.profiles_list) - o.profiles_list.SetModel(o.profiles_list_store) - o.profiles_list.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Profile name", nil), gtk.NewCellRendererText(), "text", 0)) - o.profiles_list.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Urban Terror version", nil), gtk.NewCellRendererText(), "text", 1)) + // Profiles list. + o.profiles_list = gtk.NewTreeView() + o.profiles_list.SetTooltipText(ctx.Translator.Translate("All available profiles", nil)) + urt_hbox.Add(o.profiles_list) + o.profiles_list.SetModel(o.profiles_list_store) + o.profiles_list.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Profile name", nil), gtk.NewCellRendererText(), "text", 0)) + o.profiles_list.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Urban Terror version", nil), gtk.NewCellRendererText(), "text", 1)) - // Profiles list buttons. - urt_profiles_buttons_vbox := gtk.NewVBox(false, 0) + // Profiles list buttons. + urt_profiles_buttons_vbox := gtk.NewVBox(false, 0) - button_add := gtk.NewButtonWithLabel(ctx.Translator.Translate("Add", nil)) - button_add.SetTooltipText(ctx.Translator.Translate("Add new profile", nil)) - button_add.Clicked(o.addProfile) - urt_profiles_buttons_vbox.PackStart(button_add, false, true, 0) + button_add := gtk.NewButtonWithLabel(ctx.Translator.Translate("Add", nil)) + button_add.SetTooltipText(ctx.Translator.Translate("Add new profile", nil)) + button_add.Clicked(o.addProfile) + urt_profiles_buttons_vbox.PackStart(button_add, false, true, 0) - button_edit := gtk.NewButtonWithLabel(ctx.Translator.Translate("Edit", nil)) - button_edit.SetTooltipText(ctx.Translator.Translate("Edit selected profile. Do nothing if no profile was selected.", nil)) - button_edit.Clicked(o.editProfile) - urt_profiles_buttons_vbox.PackStart(button_edit, false, true, 5) + button_edit := gtk.NewButtonWithLabel(ctx.Translator.Translate("Edit", nil)) + button_edit.SetTooltipText(ctx.Translator.Translate("Edit selected profile. Do nothing if no profile was selected.", nil)) + button_edit.Clicked(o.editProfile) + urt_profiles_buttons_vbox.PackStart(button_edit, false, true, 5) - // Spacer for profiles list buttons. - sep := gtk.NewVBox(false, 0) - urt_profiles_buttons_vbox.PackStart(sep, true, true, 5) + // Spacer for profiles list buttons. + sep := gtk.NewVBox(false, 0) + urt_profiles_buttons_vbox.PackStart(sep, true, true, 5) - button_delete := gtk.NewButtonWithLabel(ctx.Translator.Translate("Delete", nil)) - button_delete.SetTooltipText(ctx.Translator.Translate("Delete selected profile. Do nothing if no profile was selected.", nil)) - button_delete.Clicked(o.deleteProfile) - urt_profiles_buttons_vbox.PackStart(button_delete, false, true, 0) + button_delete := gtk.NewButtonWithLabel(ctx.Translator.Translate("Delete", nil)) + button_delete.SetTooltipText(ctx.Translator.Translate("Delete selected profile. Do nothing if no profile was selected.", nil)) + button_delete.Clicked(o.deleteProfile) + urt_profiles_buttons_vbox.PackStart(button_delete, false, true, 0) - urt_hbox.Add(urt_profiles_buttons_vbox) + urt_hbox.Add(urt_profiles_buttons_vbox) - o.tab_widget.AppendPage(urt_hbox, gtk.NewLabel(ctx.Translator.Translate("Urban Terror", nil))) + o.tab_widget.AppendPage(urt_hbox, gtk.NewLabel(ctx.Translator.Translate("Urban Terror", nil))) - // Load Profiles. - ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) + // Load Profiles. + ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) } func (o *OptionsDialog) loadProfiles(data map[string]string) { - fmt.Println("Loading profiles...") - o.profiles_list_store.Clear() + fmt.Println("Loading profiles...") + o.profiles_list_store.Clear() - ctx.Cache.ProfilesMutex.Lock() - for _, p := range ctx.Cache.Profiles { - var iter gtk.TreeIter - o.profiles_list_store.Append(&iter) - o.profiles_list_store.Set(&iter, 0, p.Profile.Name) - o.profiles_list_store.Set(&iter, 1, p.Profile.Version) - } - ctx.Cache.ProfilesMutex.Unlock() + ctx.Cache.ProfilesMutex.Lock() + for _, p := range ctx.Cache.Profiles { + var iter gtk.TreeIter + o.profiles_list_store.Append(&iter) + o.profiles_list_store.Set(&iter, 0, p.Profile.Name) + o.profiles_list_store.Set(&iter, 1, p.Profile.Version) + } + ctx.Cache.ProfilesMutex.Unlock() } func (o *OptionsDialog) saveAppearance() { - ctx.Cfg.Cfg["/general/language"] = ctx.Translator.AcceptedLanguages[o.language_combo.GetActiveText()] + ctx.Cfg.Cfg["/general/language"] = ctx.Translator.AcceptedLanguages[o.language_combo.GetActiveText()] } func (o *OptionsDialog) saveGeneral() { - if o.show_tray_icon.GetActive() { - ctx.Cfg.Cfg["/general/show_tray_icon"] = "1" - } else { - ctx.Cfg.Cfg["/general/show_tray_icon"] = "0" - } + if o.show_tray_icon.GetActive() { + ctx.Cfg.Cfg["/general/show_tray_icon"] = "1" + } else { + ctx.Cfg.Cfg["/general/show_tray_icon"] = "0" + } - if o.autoupdate.GetActive() { - ctx.Cfg.Cfg["/general/urtrator_autoupdate"] = "1" - } else { - ctx.Cfg.Cfg["/general/urtrator_autoupdate"] = "0" - } + if o.autoupdate.GetActive() { + ctx.Cfg.Cfg["/general/urtrator_autoupdate"] = "1" + } else { + ctx.Cfg.Cfg["/general/urtrator_autoupdate"] = "0" + } - // Servers updating tab. - master_server_addr := o.master_server_addr.GetText() - if len(master_server_addr) < 1 { - ctx.Cfg.Cfg["/servers_updating/master_server"] = "master.urbanterror.info:27900" - } else { - ctx.Cfg.Cfg["/servers_updating/master_server"] = master_server_addr - } + // Servers updating tab. + master_server_addr := o.master_server_addr.GetText() + if len(master_server_addr) < 1 { + ctx.Cfg.Cfg["/servers_updating/master_server"] = "master.urbanterror.info:27900" + } else { + ctx.Cfg.Cfg["/servers_updating/master_server"] = master_server_addr + } - if o.servers_autoupdate.GetActive() { - ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] = "1" - } else { - ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] = "0" - } + if o.servers_autoupdate.GetActive() { + ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] = "1" + } else { + ctx.Cfg.Cfg["/servers_updating/servers_autoupdate"] = "0" + } - update_timeout := o.servers_autoupdate_timeout.GetText() - if len(update_timeout) < 1 { - ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] = "10" - } else { - ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] = update_timeout - } + update_timeout := o.servers_autoupdate_timeout.GetText() + if len(update_timeout) < 1 { + ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] = "10" + } else { + ctx.Cfg.Cfg["/servers_updating/servers_autoupdate_timeout"] = update_timeout + } - ctx.Eventer.LaunchEvent("initializeTasksForMainWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("initializeTasksForMainWindow", map[string]string{}) } func (o *OptionsDialog) ShowOptionsDialog() { - o.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) - o.window.SetTitle(ctx.Translator.Translate("URTrator - Options", nil)) - o.window.Connect("destroy", o.closeOptionsDialogWithDiscard) - o.window.SetModal(true) - o.window.SetSizeRequest(750, 600) - o.window.SetPosition(gtk.WIN_POS_CENTER) - o.window.SetIcon(logo) + o.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) + o.window.SetTitle(ctx.Translator.Translate("URTrator - Options", nil)) + o.window.Connect("destroy", o.closeOptionsDialogWithDiscard) + o.window.SetModal(true) + o.window.SetSizeRequest(750, 600) + o.window.SetPosition(gtk.WIN_POS_CENTER) + o.window.SetIcon(logo) - o.vbox = gtk.NewVBox(false, 0) + o.vbox = gtk.NewVBox(false, 0) - o.initializeTabs() - o.fill() + o.initializeTabs() + o.fill() - o.window.Add(o.vbox) + o.window.Add(o.vbox) - ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) - o.window.ShowAll() + o.window.ShowAll() } diff --git a/ui/gtk2/options_profile.go b/ui/gtk2/options_profile.go index 4b14fa4..dbf688a 100644 --- a/ui/gtk2/options_profile.go +++ b/ui/gtk2/options_profile.go @@ -10,391 +10,390 @@ package ui import ( - // stdlib - "fmt" - "os" - "runtime" - "strings" + // stdlib + "fmt" + "os" + "runtime" + "strings" - // Local - "github.com/pztrn/urtrator/datamodels" + // Local + "gitlab.com/pztrn/urtrator/datamodels" - // Other - "github.com/mattn/go-gtk/gtk" - //"github.com/mattn/go-gtk/glib" + // Other + "github.com/mattn/go-gtk/gtk" + //"github.com/mattn/go-gtk/glib" ) type OptionsProfile struct { - // Window. - window *gtk.Window - // Main table. - table *gtk.Table - // Profile name. - profile_name *gtk.Entry - // Binary path. - binary_path *gtk.Entry - // Profile directory path. - profile_path *gtk.Entry - // Urban Terror versions combobox - urt_version_combo *gtk.ComboBoxText - // Another X session? - another_x_session *gtk.CheckButton - // Additional parameters for game launching. - additional_parameters *gtk.Entry + // Window. + window *gtk.Window + // Main table. + table *gtk.Table + // Profile name. + profile_name *gtk.Entry + // Binary path. + binary_path *gtk.Entry + // Profile directory path. + profile_path *gtk.Entry + // Urban Terror versions combobox + urt_version_combo *gtk.ComboBoxText + // Another X session? + another_x_session *gtk.CheckButton + // Additional parameters for game launching. + additional_parameters *gtk.Entry - // File chooser dialog for selecting binary. - f *gtk.FileChooserDialog - // Profile directory chooser dialog. - p *gtk.FileChooserDialog + // File chooser dialog for selecting binary. + f *gtk.FileChooserDialog + // Profile directory chooser dialog. + p *gtk.FileChooserDialog - // Flags. - // This is profile update? - update bool + // Flags. + // This is profile update? + update bool - // Others. - // Old profile, needed for proper update. - old_profile *datamodels.Profile + // Others. + // Old profile, needed for proper update. + old_profile *datamodels.Profile } func (op *OptionsProfile) browseForBinary() { - op.f = gtk.NewFileChooserDialog(ctx.Translator.Translate("URTrator - Select Urban Terror binary", nil), op.window, gtk.FILE_CHOOSER_ACTION_OPEN, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) - op.f.Response(op.browseForBinaryHelper) - op.f.Run() + op.f = gtk.NewFileChooserDialog(ctx.Translator.Translate("URTrator - Select Urban Terror binary", nil), op.window, gtk.FILE_CHOOSER_ACTION_OPEN, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) + op.f.Response(op.browseForBinaryHelper) + op.f.Run() } func (op *OptionsProfile) browseForProfile() { - op.p = gtk.NewFileChooserDialog(ctx.Translator.Translate("URTrator - Select Urban Terror profile path", nil), op.window, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) - op.p.Response(op.browseForProfileHelper) - if op.profile_path.GetText() != "" { - op.p.SetCurrentFolder(op.profile_path.GetText()) - } - op.p.Run() + op.p = gtk.NewFileChooserDialog(ctx.Translator.Translate("URTrator - Select Urban Terror profile path", nil), op.window, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT) + op.p.Response(op.browseForProfileHelper) + if op.profile_path.GetText() != "" { + op.p.SetCurrentFolder(op.profile_path.GetText()) + } + op.p.Run() } func (op *OptionsProfile) browseForBinaryHelper() { - filename := op.f.GetFilename() - op.binary_path.SetText(filename) - op.f.Destroy() - fmt.Println(filename) + filename := op.f.GetFilename() + op.binary_path.SetText(filename) + op.f.Destroy() + fmt.Println(filename) - // Check for valid filename. - // ToDo: add more OSes. - if runtime.GOOS == "linux" { - // Filename should end with approriate arch. - if runtime.GOARCH == "amd64" { - if len(filename) > 0 && strings.Split(filename, ".")[1] != "x86_64" && strings.Split(filename, ".")[0] != "Quake3-UrT" { - fmt.Println("Invalid binary selected!") - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Invalid binary selected!\nAccording to your OS, it should be", nil) + " Quake3-UrT.x86_64." - m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } else { - // - } - op.binary_path.SetText("") - } - } - } else if runtime.GOOS == "darwin" { - // Official application: Quake3-UrT.app. Split by it and get second - // part of string. - if strings.Contains(filename, "Quake3-UrT.app") { - filename = strings.Split(filename, "Quake3-UrT.app")[1] - if len(filename) > 0 && !strings.Contains(strings.Split(filename, ".")[1], "x86_64") && !strings.Contains(strings.Split(filename, ".")[0], "Quake3-UrT") { - fmt.Println("Invalid binary selected!") - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Invalid binary selected!\nAccording to your OS, it should be", nil) + " Quake3-UrT.app/Contents/MacOS/Quake3-UrT.x86_64." - m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } else { - // - } - op.binary_path.SetText("") - } - } else { - // Temporary disable all these modals on Linux. - // See https://github.com/mattn/go-gtk/issues/289. - if runtime.GOOS != "linux" { - mbox_string := ctx.Translator.Translate("Invalid binary selected!\nAccording to your OS, it should be", nil) + " Quake3-UrT.app/Contents/MacOS/Quake3-UrT.x86_64.\n\n" + ctx.Translator.Translate("Note, that currently URTrator supports only official binary.", nil) - m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } else { - // - } - } - } + // Check for valid filename. + // ToDo: add more OSes. + if runtime.GOOS == "linux" { + // Filename should end with approriate arch. + if runtime.GOARCH == "amd64" { + if len(filename) > 0 && strings.Split(filename, ".")[1] != "x86_64" && strings.Split(filename, ".")[0] != "Quake3-UrT" { + fmt.Println("Invalid binary selected!") + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Invalid binary selected!\nAccording to your OS, it should be", nil) + " Quake3-UrT.x86_64." + m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } else { + // + } + op.binary_path.SetText("") + } + } + } else if runtime.GOOS == "darwin" { + // Official application: Quake3-UrT.app. Split by it and get second + // part of string. + if strings.Contains(filename, "Quake3-UrT.app") { + filename = strings.Split(filename, "Quake3-UrT.app")[1] + if len(filename) > 0 && !strings.Contains(strings.Split(filename, ".")[1], "x86_64") && !strings.Contains(strings.Split(filename, ".")[0], "Quake3-UrT") { + fmt.Println("Invalid binary selected!") + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Invalid binary selected!\nAccording to your OS, it should be", nil) + " Quake3-UrT.app/Contents/MacOS/Quake3-UrT.x86_64." + m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } else { + // + } + op.binary_path.SetText("") + } + } else { + // Temporary disable all these modals on Linux. + // See https://github.com/mattn/go-gtk/issues/289. + if runtime.GOOS != "linux" { + mbox_string := ctx.Translator.Translate("Invalid binary selected!\nAccording to your OS, it should be", nil) + " Quake3-UrT.app/Contents/MacOS/Quake3-UrT.x86_64.\n\n" + ctx.Translator.Translate("Note, that currently URTrator supports only official binary.", nil) + m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } else { + // + } + } + } - if op.profile_path.GetText() == "" { - op.profile_path.SetText(ctx.Cfg.TEMP["DEFAULT_PROFILE_PATH"]) - } + if op.profile_path.GetText() == "" { + op.profile_path.SetText(ctx.Cfg.TEMP["DEFAULT_PROFILE_PATH"]) + } } func (op *OptionsProfile) browseForProfileHelper() { - directory := op.p.GetFilename() - op.profile_path.SetText(directory) - op.p.Destroy() + directory := op.p.GetFilename() + op.profile_path.SetText(directory) + op.p.Destroy() } func (op *OptionsProfile) closeByCancel() { - op.window.Destroy() + op.window.Destroy() } func (op *OptionsProfile) closeWithDiscard() { } func (op *OptionsProfile) Initialize(update bool) { - if update { - op.update = true - } + if update { + op.update = true + } - op.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) - if update { - op.window.SetTitle(ctx.Translator.Translate("URTrator - Update Urban Terror profile", nil)) - } else { - op.window.SetTitle(ctx.Translator.Translate("URTrator - Add Urban Terror profile", nil)) - } - op.window.Connect("destroy", op.closeWithDiscard) - op.window.SetModal(true) - op.window.SetSizeRequest(550, 400) - op.window.SetPosition(gtk.WIN_POS_CENTER) - op.window.SetIcon(logo) + op.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) + if update { + op.window.SetTitle(ctx.Translator.Translate("URTrator - Update Urban Terror profile", nil)) + } else { + op.window.SetTitle(ctx.Translator.Translate("URTrator - Add Urban Terror profile", nil)) + } + op.window.Connect("destroy", op.closeWithDiscard) + op.window.SetModal(true) + op.window.SetSizeRequest(550, 400) + op.window.SetPosition(gtk.WIN_POS_CENTER) + op.window.SetIcon(logo) - op.table = gtk.NewTable(7, 2, false) - op.table.SetRowSpacings(2) + op.table = gtk.NewTable(7, 2, false) + op.table.SetRowSpacings(2) - // Profile name. - profile_name_tooltip := ctx.Translator.Translate("This how you will see profile on profiles lists.", nil) - pn_label := gtk.NewLabel(ctx.Translator.Translate("Profile name:", nil)) - pn_label.SetTooltipText(profile_name_tooltip) - pn_label.SetAlignment(0, 0) - op.table.Attach(pn_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) + // Profile name. + profile_name_tooltip := ctx.Translator.Translate("This how you will see profile on profiles lists.", nil) + pn_label := gtk.NewLabel(ctx.Translator.Translate("Profile name:", nil)) + pn_label.SetTooltipText(profile_name_tooltip) + pn_label.SetAlignment(0, 0) + op.table.Attach(pn_label, 0, 1, 0, 1, gtk.FILL, gtk.SHRINK, 5, 5) - op.profile_name = gtk.NewEntry() - op.profile_name.SetTooltipText(profile_name_tooltip) - op.table.Attach(op.profile_name, 1, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5) + op.profile_name = gtk.NewEntry() + op.profile_name.SetTooltipText(profile_name_tooltip) + op.table.Attach(op.profile_name, 1, 2, 0, 1, gtk.FILL, gtk.FILL, 5, 5) + // Urban Terror version. + urt_version_tooltip := ctx.Translator.Translate("Urban Terror version for which this profile applies.", nil) + urt_version_label := gtk.NewLabel(ctx.Translator.Translate("Urban Terror version:", nil)) + urt_version_label.SetTooltipText(urt_version_tooltip) + urt_version_label.SetAlignment(0, 0) + op.table.Attach(urt_version_label, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK, 5, 5) - // Urban Terror version. - urt_version_tooltip := ctx.Translator.Translate("Urban Terror version for which this profile applies.", nil) - urt_version_label := gtk.NewLabel(ctx.Translator.Translate("Urban Terror version:", nil)) - urt_version_label.SetTooltipText(urt_version_tooltip) - urt_version_label.SetAlignment(0, 0) - op.table.Attach(urt_version_label, 0, 1, 1, 2, gtk.FILL, gtk.SHRINK, 5, 5) + op.urt_version_combo = gtk.NewComboBoxText() + op.urt_version_combo.SetTooltipText(urt_version_tooltip) + op.urt_version_combo.AppendText("4.2.023") + op.urt_version_combo.AppendText("4.3.1") + op.urt_version_combo.AppendText("4.3.2") + op.urt_version_combo.SetActive(2) + op.table.Attach(op.urt_version_combo, 1, 2, 1, 2, gtk.FILL, gtk.FILL, 5, 5) - op.urt_version_combo = gtk.NewComboBoxText() - op.urt_version_combo.SetTooltipText(urt_version_tooltip) - op.urt_version_combo.AppendText("4.2.023") - op.urt_version_combo.AppendText("4.3.1") - op.urt_version_combo.AppendText("4.3.2") - op.urt_version_combo.SetActive(2) - op.table.Attach(op.urt_version_combo, 1, 2, 1, 2, gtk.FILL, gtk.FILL, 5, 5) + // Urban Terror binary path. + select_binary_tooltip := ctx.Translator.Translate("Urban Terror binary. Some checks will be executed, so make sure you have selected right binary:\n\nQuake3-UrT.i386 for linux-x86\nQuake3-UrT.x86_64 for linux-amd64\nQuake3-UrT.app for macOS", nil) + binpath_hbox := gtk.NewHBox(false, 0) + binpath_label := gtk.NewLabel(ctx.Translator.Translate("Urban Terror binary:", nil)) + binpath_label.SetTooltipText(select_binary_tooltip) + binpath_label.SetAlignment(0, 0) + op.table.Attach(binpath_label, 0, 1, 2, 3, gtk.FILL, gtk.SHRINK, 5, 5) - // Urban Terror binary path. - select_binary_tooltip := ctx.Translator.Translate("Urban Terror binary. Some checks will be executed, so make sure you have selected right binary:\n\nQuake3-UrT.i386 for linux-x86\nQuake3-UrT.x86_64 for linux-amd64\nQuake3-UrT.app for macOS", nil) - binpath_hbox := gtk.NewHBox(false, 0) - binpath_label := gtk.NewLabel(ctx.Translator.Translate("Urban Terror binary:", nil)) - binpath_label.SetTooltipText(select_binary_tooltip) - binpath_label.SetAlignment(0, 0) - op.table.Attach(binpath_label, 0, 1, 2, 3, gtk.FILL, gtk.SHRINK, 5, 5) + op.binary_path = gtk.NewEntry() + op.binary_path.SetTooltipText(select_binary_tooltip) + button_select_binary := gtk.NewButtonWithLabel(ctx.Translator.Translate("Browse", nil)) + button_select_binary.SetTooltipText(select_binary_tooltip) + button_select_binary.Clicked(op.browseForBinary) + binpath_hbox.PackStart(op.binary_path, true, true, 5) + binpath_hbox.PackStart(button_select_binary, false, true, 5) + op.table.Attach(binpath_hbox, 1, 2, 2, 3, gtk.FILL, gtk.FILL, 0, 0) - op.binary_path = gtk.NewEntry() - op.binary_path.SetTooltipText(select_binary_tooltip) - button_select_binary := gtk.NewButtonWithLabel(ctx.Translator.Translate("Browse", nil)) - button_select_binary.SetTooltipText(select_binary_tooltip) - button_select_binary.Clicked(op.browseForBinary) - binpath_hbox.PackStart(op.binary_path, true, true, 5) - binpath_hbox.PackStart(button_select_binary, false, true, 5) - op.table.Attach(binpath_hbox, 1, 2, 2, 3, gtk.FILL, gtk.FILL, 0, 0) + // Path to Urban Terror's profile directory. + // Should be in user's home directory automatically, but can be + // changed :). + select_profile_path_tooltip := ctx.Translator.Translate("Urban Terror profile path.\n\nSpecify directory where configs, demos\nand downloaded maps are located.\n\nDefault: $HOME/.q3ut4", nil) + profile_path_hbox := gtk.NewHBox(false, 0) + profile_path_label := gtk.NewLabel(ctx.Translator.Translate("Profile path:", nil)) + profile_path_label.SetTooltipText(select_profile_path_tooltip) + profile_path_label.SetAlignment(0, 0) + op.table.Attach(profile_path_label, 0, 1, 3, 4, gtk.FILL, gtk.SHRINK, 5, 5) - // Path to Urban Terror's profile directory. - // Should be in user's home directory automatically, but can be - // changed :). - select_profile_path_tooltip := ctx.Translator.Translate("Urban Terror profile path.\n\nSpecify directory where configs, demos\nand downloaded maps are located.\n\nDefault: $HOME/.q3ut4", nil) - profile_path_hbox := gtk.NewHBox(false, 0) - profile_path_label := gtk.NewLabel(ctx.Translator.Translate("Profile path:", nil)) - profile_path_label.SetTooltipText(select_profile_path_tooltip) - profile_path_label.SetAlignment(0, 0) - op.table.Attach(profile_path_label, 0, 1, 3, 4, gtk.FILL, gtk.SHRINK, 5, 5) + op.profile_path = gtk.NewEntry() + op.profile_path.SetTooltipText(select_profile_path_tooltip) + button_select_path := gtk.NewButtonWithLabel(ctx.Translator.Translate("Browse", nil)) + button_select_path.SetTooltipText(select_profile_path_tooltip) + button_select_path.Clicked(op.browseForProfile) + profile_path_hbox.PackStart(op.profile_path, true, true, 5) + profile_path_hbox.PackStart(button_select_path, false, true, 5) + op.table.Attach(profile_path_hbox, 1, 2, 3, 4, gtk.FILL, gtk.FILL, 0, 0) - op.profile_path = gtk.NewEntry() - op.profile_path.SetTooltipText(select_profile_path_tooltip) - button_select_path := gtk.NewButtonWithLabel(ctx.Translator.Translate("Browse", nil)) - button_select_path.SetTooltipText(select_profile_path_tooltip) - button_select_path.Clicked(op.browseForProfile) - profile_path_hbox.PackStart(op.profile_path, true, true, 5) - profile_path_hbox.PackStart(button_select_path, false, true, 5) - op.table.Attach(profile_path_hbox, 1, 2, 3, 4, gtk.FILL, gtk.FILL, 0, 0) + // Should we use additional X session? + another_x_tooltip := ctx.Translator.Translate("If this is checked, Urban Terror will be launched in another X session.\n\nThis could help if you're experiencing visual lag, glitches and FPS drops under compositing WMs, like Mutter and KWin.", nil) + another_x_label := gtk.NewLabel(ctx.Translator.Translate("Start Urban Terror in another X session?", nil)) + another_x_label.SetTooltipText(another_x_tooltip) + another_x_label.SetAlignment(0, 0) + op.table.Attach(another_x_label, 0, 1, 4, 5, gtk.FILL, gtk.SHRINK, 5, 5) + op.another_x_session = gtk.NewCheckButtonWithLabel("") + op.another_x_session.SetTooltipText(another_x_tooltip) + // macOS and Windows can't do that :). + if runtime.GOOS != "linux" { + op.another_x_session.SetSensitive(false) + } + op.table.Attach(op.another_x_session, 1, 2, 4, 5, gtk.FILL, gtk.FILL, 5, 5) - // Should we use additional X session? - another_x_tooltip := ctx.Translator.Translate("If this is checked, Urban Terror will be launched in another X session.\n\nThis could help if you're experiencing visual lag, glitches and FPS drops under compositing WMs, like Mutter and KWin.", nil) - another_x_label := gtk.NewLabel(ctx.Translator.Translate("Start Urban Terror in another X session?", nil)) - another_x_label.SetTooltipText(another_x_tooltip) - another_x_label.SetAlignment(0, 0) - op.table.Attach(another_x_label, 0, 1, 4, 5, gtk.FILL, gtk.SHRINK, 5, 5) - op.another_x_session = gtk.NewCheckButtonWithLabel("") - op.another_x_session.SetTooltipText(another_x_tooltip) - // macOS and Windows can't do that :). - if runtime.GOOS != "linux" { - op.another_x_session.SetSensitive(false) - } - op.table.Attach(op.another_x_session, 1, 2, 4, 5, gtk.FILL, gtk.FILL, 5, 5) + // Additional game parameters. + params_tooltip := ctx.Translator.Translate("Additional parameters that will be passed to Urban Terror executable.", nil) + params_label := gtk.NewLabel(ctx.Translator.Translate("Additional parameters:", nil)) + params_label.SetTooltipText(params_tooltip) + params_label.SetAlignment(0, 0) + op.table.Attach(params_label, 0, 1, 5, 6, gtk.FILL, gtk.SHRINK, 5, 5) - // Additional game parameters. - params_tooltip := ctx.Translator.Translate("Additional parameters that will be passed to Urban Terror executable.", nil) - params_label := gtk.NewLabel(ctx.Translator.Translate("Additional parameters:", nil)) - params_label.SetTooltipText(params_tooltip) - params_label.SetAlignment(0, 0) - op.table.Attach(params_label, 0, 1, 5, 6, gtk.FILL, gtk.SHRINK, 5, 5) + op.additional_parameters = gtk.NewEntry() + op.additional_parameters.SetTooltipText(params_tooltip) + op.table.Attach(op.additional_parameters, 1, 2, 5, 6, gtk.FILL, gtk.FILL, 5, 5) - op.additional_parameters = gtk.NewEntry() - op.additional_parameters.SetTooltipText(params_tooltip) - op.table.Attach(op.additional_parameters, 1, 2, 5, 6, gtk.FILL, gtk.FILL, 5, 5) + // Invisible thing. + inv_label := gtk.NewLabel("") + op.table.Attach(inv_label, 1, 2, 6, 7, gtk.EXPAND, gtk.FILL, 5, 5) - // Invisible thing. - inv_label := gtk.NewLabel("") - op.table.Attach(inv_label, 1, 2, 6, 7, gtk.EXPAND, gtk.FILL, 5, 5) + // The buttons. + buttons_box := gtk.NewHBox(false, 0) + buttons_sep := gtk.NewHBox(false, 0) - // The buttons. - buttons_box := gtk.NewHBox(false, 0) - buttons_sep := gtk.NewHBox(false, 0) + cancel_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Cancel", nil)) + cancel_button.SetTooltipText(ctx.Translator.Translate("Close without saving", nil)) + cancel_button.Clicked(op.closeByCancel) + buttons_box.PackStart(cancel_button, false, true, 5) - cancel_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Cancel", nil)) - cancel_button.SetTooltipText(ctx.Translator.Translate("Close without saving", nil)) - cancel_button.Clicked(op.closeByCancel) - buttons_box.PackStart(cancel_button, false, true, 5) + buttons_box.PackStart(buttons_sep, true, true, 5) - buttons_box.PackStart(buttons_sep, true, true, 5) + add_button := gtk.NewButton() + if op.update { + add_button.SetLabel(ctx.Translator.Translate("Update", nil)) + add_button.SetTooltipText(ctx.Translator.Translate("Update profile", nil)) + } else { + add_button.SetLabel(ctx.Translator.Translate("Add", nil)) + add_button.SetTooltipText(ctx.Translator.Translate("Add profile", nil)) + } + add_button.Clicked(op.saveProfile) + buttons_box.PackStart(add_button, false, true, 5) - add_button := gtk.NewButton() - if op.update { - add_button.SetLabel(ctx.Translator.Translate("Update", nil)) - add_button.SetTooltipText(ctx.Translator.Translate("Update profile", nil)) - } else { - add_button.SetLabel(ctx.Translator.Translate("Add", nil)) - add_button.SetTooltipText(ctx.Translator.Translate("Add profile", nil)) - } - add_button.Clicked(op.saveProfile) - buttons_box.PackStart(add_button, false, true, 5) + vert_sep_box := gtk.NewVBox(false, 0) - vert_sep_box := gtk.NewVBox(false, 0) + vbox := gtk.NewVBox(false, 0) + vbox.PackStart(op.table, false, true, 5) + vbox.PackStart(vert_sep_box, true, true, 5) + vbox.PackStart(buttons_box, false, true, 5) - vbox := gtk.NewVBox(false, 0) - vbox.PackStart(op.table, false, true, 5) - vbox.PackStart(vert_sep_box, true, true, 5) - vbox.PackStart(buttons_box, false, true, 5) - - op.window.Add(vbox) - op.window.ShowAll() + op.window.Add(vbox) + op.window.ShowAll() } func (op *OptionsProfile) InitializeUpdate(profile_name string) { - fmt.Println("Updating profile '" + profile_name + "'") - op.Initialize(true) + fmt.Println("Updating profile '" + profile_name + "'") + op.Initialize(true) - // Get profile data. - profile := ctx.Cache.Profiles[profile_name].Profile - op.profile_name.SetText(profile.Name) - op.binary_path.SetText(profile.Binary) - op.additional_parameters.SetText(profile.Additional_params) - if profile.Profile_path == "" { - op.profile_path.SetText(ctx.Cfg.TEMP["DEFAULT_PROFILE_PATH"]) - } else { - op.profile_path.SetText(profile.Profile_path) - } - if profile.Second_x_session == "1" { - op.another_x_session.SetActive(true) - } + // Get profile data. + profile := ctx.Cache.Profiles[profile_name].Profile + op.profile_name.SetText(profile.Name) + op.binary_path.SetText(profile.Binary) + op.additional_parameters.SetText(profile.Additional_params) + if profile.Profile_path == "" { + op.profile_path.SetText(ctx.Cfg.TEMP["DEFAULT_PROFILE_PATH"]) + } else { + op.profile_path.SetText(profile.Profile_path) + } + if profile.Second_x_session == "1" { + op.another_x_session.SetActive(true) + } - if profile.Version == "4.3.1" { - op.urt_version_combo.SetActive(1) - } else if profile.Version == "4.3.2" { - op.urt_version_combo.SetActive(2) - } else { - op.urt_version_combo.SetActive(0) - } + if profile.Version == "4.3.1" { + op.urt_version_combo.SetActive(1) + } else if profile.Version == "4.3.2" { + op.urt_version_combo.SetActive(2) + } else { + op.urt_version_combo.SetActive(0) + } - op.old_profile = profile + op.old_profile = profile } func (op *OptionsProfile) saveProfile() { - fmt.Println("Saving profile...") + fmt.Println("Saving profile...") - // Validating fields. - // Profile name must not be empty. - if len(op.profile_name.GetText()) < 1 { - mbox_string := ctx.Translator.Translate("Empty profile name!\nProfile must be named somehow.", nil) - m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } - // Binary path must also be filled. - if len(op.binary_path.GetText()) < 1 { - mbox_string := ctx.Translator.Translate("Empty path to binary!\nThis profile will be unusable if you\nwill not provide path to binary!", nil) - m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } - // ...and must be executable! :) - _, err := os.Stat(op.binary_path.GetText()) - if err != nil { - mbox_string := ctx.Translator.Translate("Invalid path to binary!\n\nError was:\n", nil) + err.Error() + ctx.Translator.Translate("\n\nCheck binary path and try again.", nil) - m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } else { - // ToDo: executable flag checking. - //fmt.Println(filestat.Mode()) - profile_name := op.profile_name.GetText() + // Validating fields. + // Profile name must not be empty. + if len(op.profile_name.GetText()) < 1 { + mbox_string := ctx.Translator.Translate("Empty profile name!\nProfile must be named somehow.", nil) + m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } + // Binary path must also be filled. + if len(op.binary_path.GetText()) < 1 { + mbox_string := ctx.Translator.Translate("Empty path to binary!\nThis profile will be unusable if you\nwill not provide path to binary!", nil) + m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } + // ...and must be executable! :) + _, err := os.Stat(op.binary_path.GetText()) + if err != nil { + mbox_string := ctx.Translator.Translate("Invalid path to binary!\n\nError was:\n", nil) + err.Error() + ctx.Translator.Translate("\n\nCheck binary path and try again.", nil) + m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } else { + // ToDo: executable flag checking. + //fmt.Println(filestat.Mode()) + profile_name := op.profile_name.GetText() - _, ok := ctx.Cache.Profiles[profile_name] - if ok && !op.update { - mbox_string := ctx.Translator.Translate("Game profile with same name already exist.\nRename profile for saving.", nil) - m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) - m.Response(func() { - m.Destroy() - }) - m.Run() - } else { - ctx.Cache.CreateProfile(profile_name) - ctx.Cache.Profiles[profile_name].Profile.Name = profile_name - ctx.Cache.Profiles[profile_name].Profile.Version = op.urt_version_combo.GetActiveText() - ctx.Cache.Profiles[profile_name].Profile.Binary = op.binary_path.GetText() - ctx.Cache.Profiles[profile_name].Profile.Additional_params = op.additional_parameters.GetText() + _, ok := ctx.Cache.Profiles[profile_name] + if ok && !op.update { + mbox_string := ctx.Translator.Translate("Game profile with same name already exist.\nRename profile for saving.", nil) + m := gtk.NewMessageDialog(op.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, mbox_string) + m.Response(func() { + m.Destroy() + }) + m.Run() + } else { + ctx.Cache.CreateProfile(profile_name) + ctx.Cache.Profiles[profile_name].Profile.Name = profile_name + ctx.Cache.Profiles[profile_name].Profile.Version = op.urt_version_combo.GetActiveText() + ctx.Cache.Profiles[profile_name].Profile.Binary = op.binary_path.GetText() + ctx.Cache.Profiles[profile_name].Profile.Additional_params = op.additional_parameters.GetText() - if op.profile_path.GetText() == "" { - ctx.Cache.Profiles[profile_name].Profile.Profile_path = "~/.q3ut4" - } else { - ctx.Cache.Profiles[profile_name].Profile.Profile_path = op.profile_path.GetText() - } + if op.profile_path.GetText() == "" { + ctx.Cache.Profiles[profile_name].Profile.Profile_path = "~/.q3ut4" + } else { + ctx.Cache.Profiles[profile_name].Profile.Profile_path = op.profile_path.GetText() + } - if op.another_x_session.GetActive() { - ctx.Cache.Profiles[profile_name].Profile.Second_x_session = "1" - } else { - ctx.Cache.Profiles[profile_name].Profile.Second_x_session = "0" - } - } - } - ctx.Eventer.LaunchEvent("flushProfiles", nil) - ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) - ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) - op.window.Destroy() + if op.another_x_session.GetActive() { + ctx.Cache.Profiles[profile_name].Profile.Second_x_session = "1" + } else { + ctx.Cache.Profiles[profile_name].Profile.Second_x_session = "0" + } + } + } + ctx.Eventer.LaunchEvent("flushProfiles", nil) + ctx.Eventer.LaunchEvent("loadProfilesIntoOptionsWindow", map[string]string{}) + ctx.Eventer.LaunchEvent("loadProfilesIntoMainWindow", map[string]string{}) + op.window.Destroy() } diff --git a/ui/gtk2/server_cvars.go b/ui/gtk2/server_cvars.go index 1456294..96b383e 100644 --- a/ui/gtk2/server_cvars.go +++ b/ui/gtk2/server_cvars.go @@ -10,95 +10,95 @@ package ui import ( - // stdlib - "fmt" - "sort" + // stdlib + "fmt" + "sort" - // Local - "github.com/pztrn/urtrator/ioq3dataparser" + // Local + "gitlab.com/pztrn/urtrator/ioq3dataparser" - // Other - "github.com/mattn/go-gtk/gtk" - "github.com/mattn/go-gtk/glib" + // Other + "github.com/mattn/go-gtk/glib" + "github.com/mattn/go-gtk/gtk" ) type ServerCVarsDialog struct { - // Window. - window *gtk.Window - // Main Vertical Box. - vbox *gtk.VBox - // Treeview for CVars. - treeview *gtk.TreeView - // Store for treeview. - treeview_store *gtk.ListStore + // Window. + window *gtk.Window + // Main Vertical Box. + vbox *gtk.VBox + // Treeview for CVars. + treeview *gtk.TreeView + // Store for treeview. + treeview_store *gtk.ListStore } func (scd *ServerCVarsDialog) Close() { - scd.window.Destroy() + scd.window.Destroy() } func (scd *ServerCVarsDialog) fill(srv_address string) { - server_info := ctx.Cache.Servers[srv_address].Server - parsed_general_data := ioq3dataparser.ParseInfoToMap(server_info.ExtendedConfig) + server_info := ctx.Cache.Servers[srv_address].Server + parsed_general_data := ioq3dataparser.ParseInfoToMap(server_info.ExtendedConfig) - // Sort it! - general_data_keys := make([]string, 0, len(parsed_general_data)) - for k := range parsed_general_data { - general_data_keys = append(general_data_keys, k) - } + // Sort it! + general_data_keys := make([]string, 0, len(parsed_general_data)) + for k := range parsed_general_data { + general_data_keys = append(general_data_keys, k) + } - sort.Strings(general_data_keys) + sort.Strings(general_data_keys) - for k := range general_data_keys { - iter := new(gtk.TreeIter) - scd.treeview_store.Append(iter) - scd.treeview_store.SetValue(iter, 0, general_data_keys[k]) - scd.treeview_store.SetValue(iter, 1, parsed_general_data[general_data_keys[k]]) - } + for k := range general_data_keys { + iter := new(gtk.TreeIter) + scd.treeview_store.Append(iter) + scd.treeview_store.SetValue(iter, 0, general_data_keys[k]) + scd.treeview_store.SetValue(iter, 1, parsed_general_data[general_data_keys[k]]) + } } func (scd *ServerCVarsDialog) Initialize(w *gtk.Window, srv_address string) { - fmt.Println("Showing server's CVars...") + fmt.Println("Showing server's CVars...") - scd.initializeStorages() + scd.initializeStorages() - scd.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) - scd.window.SetTitle(ctx.Translator.Translate("URTrator - Server CVars", nil)) - scd.window.Connect("destroy", scd.Close) - scd.window.SetTransientFor(w) - scd.window.SetDefaultSize(300, 400) + scd.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL) + scd.window.SetTitle(ctx.Translator.Translate("URTrator - Server CVars", nil)) + scd.window.Connect("destroy", scd.Close) + scd.window.SetTransientFor(w) + scd.window.SetDefaultSize(300, 400) - scd.vbox = gtk.NewVBox(false, 0) - scd.window.Add(scd.vbox) + scd.vbox = gtk.NewVBox(false, 0) + scd.window.Add(scd.vbox) - // CVars scrolls. - si := gtk.NewScrolledWindow(nil, nil) - scd.vbox.PackStart(si, true, true, 5) + // CVars scrolls. + si := gtk.NewScrolledWindow(nil, nil) + scd.vbox.PackStart(si, true, true, 5) - // CVars list. - scd.treeview = gtk.NewTreeView() - scd.treeview.SetModel(scd.treeview_store) - si.Add(scd.treeview) + // CVars list. + scd.treeview = gtk.NewTreeView() + scd.treeview.SetModel(scd.treeview_store) + si.Add(scd.treeview) - scd.treeview.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Key", nil), gtk.NewCellRendererText(), "markup", 0)) - scd.treeview.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Value", nil), gtk.NewCellRendererText(), "markup", 1)) + scd.treeview.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Key", nil), gtk.NewCellRendererText(), "markup", 0)) + scd.treeview.AppendColumn(gtk.NewTreeViewColumnWithAttributes(ctx.Translator.Translate("Value", nil), gtk.NewCellRendererText(), "markup", 1)) - // Close button. - hbox := gtk.NewHBox(false, 0) - scd.vbox.PackStart(hbox, false, true, 5) + // Close button. + hbox := gtk.NewHBox(false, 0) + scd.vbox.PackStart(hbox, false, true, 5) - sep := gtk.NewHBox(false, 0) - hbox.PackStart(sep, true, true, 5) + sep := gtk.NewHBox(false, 0) + hbox.PackStart(sep, true, true, 5) - close_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Close", nil)) - close_button.Clicked(scd.Close) - hbox.PackStart(close_button, false, true, 5) + close_button := gtk.NewButtonWithLabel(ctx.Translator.Translate("Close", nil)) + close_button.Clicked(scd.Close) + hbox.PackStart(close_button, false, true, 5) - scd.fill(srv_address) + scd.fill(srv_address) - scd.window.ShowAll() + scd.window.ShowAll() } func (scd *ServerCVarsDialog) initializeStorages() { - scd.treeview_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING) + scd.treeview_store = gtk.NewListStore(glib.G_TYPE_STRING, glib.G_TYPE_STRING) } diff --git a/urtrator.go b/urtrator.go index e63742a..9611140 100644 --- a/urtrator.go +++ b/urtrator.go @@ -10,26 +10,26 @@ package main import ( - // local - "github.com/pztrn/urtrator/common" - "github.com/pztrn/urtrator/context" - "github.com/pztrn/urtrator/ui/gtk2" - //"github.com/pztrn/urtrator/ui/qt5" + // local + "gitlab.com/pztrn/urtrator/common" + "gitlab.com/pztrn/urtrator/context" + "gitlab.com/pztrn/urtrator/ui/gtk2" + //"github.com/pztrn/urtrator/ui/qt5" - // stdlib - "fmt" - "runtime" + // stdlib + "fmt" + "runtime" ) func main() { - fmt.Println("This is URTrator, version " + common.URTRATOR_VERSION) + fmt.Println("This is URTrator, version " + common.URTRATOR_VERSION) - numCPUs := runtime.NumCPU() - runtime.GOMAXPROCS(numCPUs) + numCPUs := runtime.NumCPU() + runtime.GOMAXPROCS(numCPUs) - ctx := context.New() - ctx.Initialize() + ctx := context.New() + ctx.Initialize() - ui := ui.NewMainWindow(ctx) - ui.Initialize() + ui := ui.NewMainWindow(ctx) + ui.Initialize() }