gofmt.
This commit is contained in:
parent
39ac02dfc5
commit
2b3c9ef9ea
@ -10,105 +10,105 @@
|
||||
package clipboardwatcher
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
// stdlib
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
// other
|
||||
"github.com/mattn/go-gtk/gdk"
|
||||
"github.com/mattn/go-gtk/gtk"
|
||||
// other
|
||||
"github.com/mattn/go-gtk/gdk"
|
||||
"github.com/mattn/go-gtk/gtk"
|
||||
)
|
||||
|
||||
type ClipboardWatcher struct {
|
||||
// Clipboard.
|
||||
clipboard *gtk.Clipboard
|
||||
// PRIMARY clipboard.
|
||||
prim_clipboard *gtk.Clipboard
|
||||
// Clipboard.
|
||||
clipboard *gtk.Clipboard
|
||||
// PRIMARY clipboard.
|
||||
prim_clipboard *gtk.Clipboard
|
||||
|
||||
// Flags.
|
||||
// We have just copy connect string to clipboard.
|
||||
// Used to ignore clipboard data in check*Input()
|
||||
just_set bool
|
||||
// Flags.
|
||||
// We have just copy connect string to clipboard.
|
||||
// Used to ignore clipboard data in check*Input()
|
||||
just_set bool
|
||||
}
|
||||
|
||||
func (cw *ClipboardWatcher) checkInput() {
|
||||
if !cw.just_set {
|
||||
text := cw.clipboard.WaitForText()
|
||||
cw.parseData(text)
|
||||
} else {
|
||||
cw.just_set = false
|
||||
}
|
||||
if !cw.just_set {
|
||||
text := cw.clipboard.WaitForText()
|
||||
cw.parseData(text)
|
||||
} else {
|
||||
cw.just_set = false
|
||||
}
|
||||
}
|
||||
|
||||
func (cw *ClipboardWatcher) checkPrimaryInput() {
|
||||
if !cw.just_set {
|
||||
text := cw.prim_clipboard.WaitForText()
|
||||
cw.parseData(text)
|
||||
} else {
|
||||
cw.just_set = false
|
||||
}
|
||||
if !cw.just_set {
|
||||
text := cw.prim_clipboard.WaitForText()
|
||||
cw.parseData(text)
|
||||
} else {
|
||||
cw.just_set = false
|
||||
}
|
||||
}
|
||||
|
||||
func (cw *ClipboardWatcher) CopyServerData(server_address string) error {
|
||||
server, ok := Cache.Servers[server_address]
|
||||
if !ok {
|
||||
// ToDo: show message box?
|
||||
return errors.New("Server wasn't selected")
|
||||
}
|
||||
server, ok := Cache.Servers[server_address]
|
||||
if !ok {
|
||||
// ToDo: show message box?
|
||||
return errors.New("Server wasn't selected")
|
||||
}
|
||||
|
||||
// Composing connection string.
|
||||
var connect_string string = ""
|
||||
connect_string += "/connect " + server.Server.Ip + ":" + server.Server.Port
|
||||
if len(server.Server.Password) >= 1 {
|
||||
connect_string += ";password " + server.Server.Password
|
||||
}
|
||||
fmt.Println("Connect string: ", connect_string)
|
||||
cw.just_set = true
|
||||
cw.clipboard.SetText(connect_string)
|
||||
// Composing connection string.
|
||||
var connect_string string = ""
|
||||
connect_string += "/connect " + server.Server.Ip + ":" + server.Server.Port
|
||||
if len(server.Server.Password) >= 1 {
|
||||
connect_string += ";password " + server.Server.Password
|
||||
}
|
||||
fmt.Println("Connect string: ", connect_string)
|
||||
cw.just_set = true
|
||||
cw.clipboard.SetText(connect_string)
|
||||
|
||||
return nil
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cw *ClipboardWatcher) Initialize() {
|
||||
fmt.Println("Initializing clipboard watcher...")
|
||||
fmt.Println("Initializing clipboard watcher...")
|
||||
|
||||
cw.just_set = false
|
||||
cw.just_set = false
|
||||
|
||||
cw.clipboard = gtk.NewClipboardGetForDisplay(gdk.DisplayGetDefault(), gdk.SELECTION_CLIPBOARD)
|
||||
cw.clipboard.Connect("owner-change", cw.checkInput)
|
||||
cw.clipboard = gtk.NewClipboardGetForDisplay(gdk.DisplayGetDefault(), gdk.SELECTION_CLIPBOARD)
|
||||
cw.clipboard.Connect("owner-change", cw.checkInput)
|
||||
|
||||
cw.prim_clipboard = gtk.NewClipboardGetForDisplay(gdk.DisplayGetDefault(), gdk.SELECTION_PRIMARY)
|
||||
cw.prim_clipboard.Connect("owner-change", cw.checkPrimaryInput)
|
||||
cw.prim_clipboard = gtk.NewClipboardGetForDisplay(gdk.DisplayGetDefault(), gdk.SELECTION_PRIMARY)
|
||||
cw.prim_clipboard.Connect("owner-change", cw.checkPrimaryInput)
|
||||
}
|
||||
|
||||
func (cw *ClipboardWatcher) parseData(data string) {
|
||||
// We should check only first string.
|
||||
data = strings.Split(data, "\n")[0]
|
||||
// Checking if we have connection string here.
|
||||
if strings.Contains(data, "ct ") {
|
||||
fmt.Println("Connection string detected!")
|
||||
var server string = ""
|
||||
var password string = ""
|
||||
conn_string := strings.Split(data, ";")
|
||||
if len(conn_string) > 0 {
|
||||
srv_string := strings.Split(data, ";")[0]
|
||||
srv_splitted := strings.Split(srv_string, "ct ")
|
||||
if len(srv_splitted) > 1 {
|
||||
server_raw := strings.Split(srv_splitted[1], " ")[0]
|
||||
// Get rid of spaces.
|
||||
server = strings.TrimSpace(server_raw)
|
||||
}
|
||||
}
|
||||
if len(conn_string) > 1 && strings.Contains(data, "password") {
|
||||
pw_string := strings.Split(data, ";")[1]
|
||||
pw_splitted := strings.Split(pw_string, "password ")
|
||||
if len(pw_splitted) > 1 {
|
||||
password_raw := strings.Split(pw_splitted[1], " ")[0]
|
||||
// Get rid of spaces.
|
||||
password = strings.TrimSpace(password_raw)
|
||||
}
|
||||
}
|
||||
Eventer.LaunchEvent("setQuickConnectDetails", map[string]string{"server": server, "password": password})
|
||||
}
|
||||
// We should check only first string.
|
||||
data = strings.Split(data, "\n")[0]
|
||||
// Checking if we have connection string here.
|
||||
if strings.Contains(data, "ct ") {
|
||||
fmt.Println("Connection string detected!")
|
||||
var server string = ""
|
||||
var password string = ""
|
||||
conn_string := strings.Split(data, ";")
|
||||
if len(conn_string) > 0 {
|
||||
srv_string := strings.Split(data, ";")[0]
|
||||
srv_splitted := strings.Split(srv_string, "ct ")
|
||||
if len(srv_splitted) > 1 {
|
||||
server_raw := strings.Split(srv_splitted[1], " ")[0]
|
||||
// Get rid of spaces.
|
||||
server = strings.TrimSpace(server_raw)
|
||||
}
|
||||
}
|
||||
if len(conn_string) > 1 && strings.Contains(data, "password") {
|
||||
pw_string := strings.Split(data, ";")[1]
|
||||
pw_splitted := strings.Split(pw_string, "password ")
|
||||
if len(pw_splitted) > 1 {
|
||||
password_raw := strings.Split(pw_splitted[1], " ")[0]
|
||||
// Get rid of spaces.
|
||||
password = strings.TrimSpace(password_raw)
|
||||
}
|
||||
}
|
||||
Eventer.LaunchEvent("setQuickConnectDetails", map[string]string{"server": server, "password": password})
|
||||
}
|
||||
}
|
||||
|
@ -10,76 +10,76 @@
|
||||
package colorizer
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"fmt"
|
||||
"html"
|
||||
"strings"
|
||||
// stdlib
|
||||
"fmt"
|
||||
"html"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Colorizer struct {
|
||||
// RAW colors to Pango relation.
|
||||
colors map[string]string
|
||||
// RAW colors to Pango relation.
|
||||
colors map[string]string
|
||||
}
|
||||
|
||||
func (c *Colorizer) ClearFromMarkup(data string) string {
|
||||
var result string = ""
|
||||
var result string = ""
|
||||
|
||||
data = html.EscapeString(data)
|
||||
data = html.EscapeString(data)
|
||||
|
||||
data_splitted := strings.Split(data, ">")
|
||||
data_splitted := strings.Split(data, ">")
|
||||
|
||||
if len(data_splitted) > 1 {
|
||||
for item := range data_splitted {
|
||||
if len(data_splitted[item]) > 0 {
|
||||
result += strings.Split(data_splitted[item], "<")[0]
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result = data_splitted[0]
|
||||
}
|
||||
if len(data_splitted) > 1 {
|
||||
for item := range data_splitted {
|
||||
if len(data_splitted[item]) > 0 {
|
||||
result += strings.Split(data_splitted[item], "<")[0]
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result = data_splitted[0]
|
||||
}
|
||||
|
||||
return result
|
||||
return result
|
||||
}
|
||||
|
||||
func (c *Colorizer) Fix(data string) string {
|
||||
var result string = ""
|
||||
var result string = ""
|
||||
|
||||
data = html.EscapeString(data)
|
||||
data = html.EscapeString(data)
|
||||
|
||||
data_splitted := strings.Split(data, "^")
|
||||
if len(data_splitted) > 1 {
|
||||
for item := range data_splitted {
|
||||
if len(data_splitted[item]) > 0 {
|
||||
colorcode_raw := string([]rune(data_splitted[item])[0])
|
||||
colorcode, ok := c.colors[colorcode_raw]
|
||||
if !ok {
|
||||
colorcode = "#000000"
|
||||
}
|
||||
result += "<span foreground=\"" + colorcode + "\">" + string([]rune(data_splitted[item])[1:]) + "</span>"
|
||||
} else {
|
||||
result += data_splitted[item]
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result = data_splitted[0]
|
||||
}
|
||||
return "<markup>" + result + "</markup>"
|
||||
data_splitted := strings.Split(data, "^")
|
||||
if len(data_splitted) > 1 {
|
||||
for item := range data_splitted {
|
||||
if len(data_splitted[item]) > 0 {
|
||||
colorcode_raw := string([]rune(data_splitted[item])[0])
|
||||
colorcode, ok := c.colors[colorcode_raw]
|
||||
if !ok {
|
||||
colorcode = "#000000"
|
||||
}
|
||||
result += "<span foreground=\"" + colorcode + "\">" + string([]rune(data_splitted[item])[1:]) + "</span>"
|
||||
} else {
|
||||
result += data_splitted[item]
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result = data_splitted[0]
|
||||
}
|
||||
return "<markup>" + result + "</markup>"
|
||||
}
|
||||
|
||||
func (c *Colorizer) Initialize() {
|
||||
fmt.Println("Initializing colorizer...")
|
||||
c.initializeStorages()
|
||||
fmt.Println("Initializing colorizer...")
|
||||
c.initializeStorages()
|
||||
}
|
||||
|
||||
func (c *Colorizer) initializeStorages() {
|
||||
c.colors = map[string]string{
|
||||
"1": "#cc0000",
|
||||
"2": "#00cc00",
|
||||
"3": "#eeee00",
|
||||
"4": "#1c86ee",
|
||||
"5": "#00eeee",
|
||||
"6": "#ee00ee",
|
||||
"7": "#000000",
|
||||
"8": "#000000",
|
||||
}
|
||||
c.colors = map[string]string{
|
||||
"1": "#cc0000",
|
||||
"2": "#00cc00",
|
||||
"3": "#eeee00",
|
||||
"4": "#1c86ee",
|
||||
"5": "#00eeee",
|
||||
"6": "#ee00ee",
|
||||
"7": "#000000",
|
||||
"8": "#000000",
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,6 @@
|
||||
package colorizer
|
||||
|
||||
func New() *Colorizer {
|
||||
c := Colorizer {}
|
||||
return &c
|
||||
c := Colorizer{}
|
||||
return &c
|
||||
}
|
||||
|
@ -10,85 +10,85 @@
|
||||
package configuration
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
// stdlib
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
// Configuration from database.
|
||||
Cfg map[string]string
|
||||
// Temporary (or runtime) configuration things.
|
||||
TEMP map[string]string
|
||||
// Configuration from database.
|
||||
Cfg map[string]string
|
||||
// Temporary (or runtime) configuration things.
|
||||
TEMP map[string]string
|
||||
}
|
||||
|
||||
func (c *Config) initializePathsMac() {
|
||||
fmt.Println("Initializing configuration paths...")
|
||||
home_path := os.Getenv("HOME")
|
||||
data_path := path.Join(home_path, "Library", "Application Support", "URTrator")
|
||||
fmt.Println("Will use data path: " + data_path)
|
||||
c.TEMP["DATA"] = data_path
|
||||
fmt.Println("Initializing configuration paths...")
|
||||
home_path := os.Getenv("HOME")
|
||||
data_path := path.Join(home_path, "Library", "Application Support", "URTrator")
|
||||
fmt.Println("Will use data path: " + data_path)
|
||||
c.TEMP["DATA"] = data_path
|
||||
|
||||
profile_path := path.Join(home_path, "Library", "Application Support", "Quake3", "q3ut4")
|
||||
c.TEMP["DEFAULT_PROFILE_PATH"] = profile_path
|
||||
profile_path := path.Join(home_path, "Library", "Application Support", "Quake3", "q3ut4")
|
||||
c.TEMP["DEFAULT_PROFILE_PATH"] = profile_path
|
||||
|
||||
if _, err := os.Stat(data_path); os.IsNotExist(err) {
|
||||
os.MkdirAll(data_path, 0755)
|
||||
}
|
||||
if _, err := os.Stat(data_path); os.IsNotExist(err) {
|
||||
os.MkdirAll(data_path, 0755)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Config) initializePathsNix() {
|
||||
fmt.Println("Initializing configuration paths...")
|
||||
fmt.Println("Initializing configuration paths...")
|
||||
|
||||
// Get storage path. By default we will use ~/.config/urtrator
|
||||
// directory.
|
||||
home_path := os.Getenv("HOME")
|
||||
data_path := path.Join(home_path, ".config", "urtrator")
|
||||
fmt.Println("Will use data path: " + data_path)
|
||||
c.TEMP["DATA"] = data_path
|
||||
// Get storage path. By default we will use ~/.config/urtrator
|
||||
// directory.
|
||||
home_path := os.Getenv("HOME")
|
||||
data_path := path.Join(home_path, ".config", "urtrator")
|
||||
fmt.Println("Will use data path: " + data_path)
|
||||
c.TEMP["DATA"] = data_path
|
||||
|
||||
profile_path := path.Join(home_path, ".q3a", "q3ut4")
|
||||
c.TEMP["DEFAULT_PROFILE_PATH"] = profile_path
|
||||
profile_path := path.Join(home_path, ".q3a", "q3ut4")
|
||||
c.TEMP["DEFAULT_PROFILE_PATH"] = profile_path
|
||||
|
||||
if _, err := os.Stat(data_path); os.IsNotExist(err) {
|
||||
os.MkdirAll(data_path, 0755)
|
||||
}
|
||||
if _, err := os.Stat(data_path); os.IsNotExist(err) {
|
||||
os.MkdirAll(data_path, 0755)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Config) initializePathsWin() {
|
||||
fmt.Println("Initializing configuration paths...")
|
||||
homepath_without_drive := os.Getenv("HOMEPATH")
|
||||
homedrive := os.Getenv("HOMEDRIVE")
|
||||
data_path := path.Join(homedrive, homepath_without_drive, "AppData", "Roaming", "URTrator")
|
||||
c.TEMP["DATA"] = data_path
|
||||
fmt.Println("Initializing configuration paths...")
|
||||
homepath_without_drive := os.Getenv("HOMEPATH")
|
||||
homedrive := os.Getenv("HOMEDRIVE")
|
||||
data_path := path.Join(homedrive, homepath_without_drive, "AppData", "Roaming", "URTrator")
|
||||
c.TEMP["DATA"] = data_path
|
||||
|
||||
// Verify it!
|
||||
profile_path := path.Join(homedrive, homepath_without_drive, "AppData", "UrbanTerror43", "q3ut4")
|
||||
c.TEMP["DEFAULT_PROFILE_PATH"] = profile_path
|
||||
// Verify it!
|
||||
profile_path := path.Join(homedrive, homepath_without_drive, "AppData", "UrbanTerror43", "q3ut4")
|
||||
c.TEMP["DEFAULT_PROFILE_PATH"] = profile_path
|
||||
|
||||
if _, err := os.Stat(data_path); os.IsNotExist(err) {
|
||||
os.MkdirAll(data_path, 0755)
|
||||
}
|
||||
if _, err := os.Stat(data_path); os.IsNotExist(err) {
|
||||
os.MkdirAll(data_path, 0755)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Config) initializeStorages() {
|
||||
c.TEMP = make(map[string]string)
|
||||
c.Cfg = make(map[string]string)
|
||||
c.TEMP = make(map[string]string)
|
||||
c.Cfg = make(map[string]string)
|
||||
}
|
||||
|
||||
func (c *Config) Initialize() {
|
||||
fmt.Println("Initializing configuration storage...")
|
||||
c.initializeStorages()
|
||||
fmt.Println("Initializing configuration storage...")
|
||||
c.initializeStorages()
|
||||
|
||||
if runtime.GOOS == "linux" {
|
||||
c.initializePathsNix()
|
||||
} else if runtime.GOOS == "darwin" {
|
||||
c.initializePathsMac()
|
||||
} else if runtime.GOOS == "windows" {
|
||||
c.initializePathsWin()
|
||||
} else {
|
||||
panic("We're not ready for other OSes yet!")
|
||||
}
|
||||
if runtime.GOOS == "linux" {
|
||||
c.initializePathsNix()
|
||||
} else if runtime.GOOS == "darwin" {
|
||||
c.initializePathsMac()
|
||||
} else if runtime.GOOS == "windows" {
|
||||
c.initializePathsWin()
|
||||
} else {
|
||||
panic("We're not ready for other OSes yet!")
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,6 @@
|
||||
package configuration
|
||||
|
||||
func New() *Config {
|
||||
c := Config{}
|
||||
return &c
|
||||
c := Config{}
|
||||
return &c
|
||||
}
|
||||
|
@ -10,6 +10,6 @@
|
||||
package context
|
||||
|
||||
func New() *Context {
|
||||
c := Context{}
|
||||
return &c
|
||||
c := Context{}
|
||||
return &c
|
||||
}
|
||||
|
@ -10,8 +10,8 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"fmt"
|
||||
// stdlib
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var start_schema = `
|
||||
@ -39,95 +39,128 @@ INSERT INTO database (version) VALUES (1);
|
||||
// Migrate database to latest version.
|
||||
// ToDo: make it more good :).
|
||||
func migrate_full(db *Database, version int) {
|
||||
if version < 1 {start_to_one(db); version = 1}
|
||||
if version == 1 {one_to_two(db); version = 2}
|
||||
if version == 2 {two_to_three(db); version = 3}
|
||||
if version == 3 {three_to_four(db); version = 4}
|
||||
if version == 4 {four_to_five(db); version = 5}
|
||||
if version == 5 {five_to_six(db); version = 6 }
|
||||
if version == 6 {six_to_seven(db); version = 7}
|
||||
if version == 7 {seven_to_eight(db); version = 8}
|
||||
if version == 8 {eight_to_nine(db); version = 9}
|
||||
if version == 9 {nine_to_ten(db); version = 10}
|
||||
if version == 10 {ten_to_eleven(db); version = 11}
|
||||
if version < 1 {
|
||||
start_to_one(db)
|
||||
version = 1
|
||||
}
|
||||
if version == 1 {
|
||||
one_to_two(db)
|
||||
version = 2
|
||||
}
|
||||
if version == 2 {
|
||||
two_to_three(db)
|
||||
version = 3
|
||||
}
|
||||
if version == 3 {
|
||||
three_to_four(db)
|
||||
version = 4
|
||||
}
|
||||
if version == 4 {
|
||||
four_to_five(db)
|
||||
version = 5
|
||||
}
|
||||
if version == 5 {
|
||||
five_to_six(db)
|
||||
version = 6
|
||||
}
|
||||
if version == 6 {
|
||||
six_to_seven(db)
|
||||
version = 7
|
||||
}
|
||||
if version == 7 {
|
||||
seven_to_eight(db)
|
||||
version = 8
|
||||
}
|
||||
if version == 8 {
|
||||
eight_to_nine(db)
|
||||
version = 9
|
||||
}
|
||||
if version == 9 {
|
||||
nine_to_ten(db)
|
||||
version = 10
|
||||
}
|
||||
if version == 10 {
|
||||
ten_to_eleven(db)
|
||||
version = 11
|
||||
}
|
||||
}
|
||||
|
||||
// Initial database structure.
|
||||
func start_to_one(db *Database) {
|
||||
fmt.Println("Upgrading database from 0 to 1...")
|
||||
db.Db.MustExec(start_schema)
|
||||
fmt.Println("Upgrading database from 0 to 1...")
|
||||
db.Db.MustExec(start_schema)
|
||||
}
|
||||
|
||||
// Favorite server mark.
|
||||
func one_to_two(db *Database) {
|
||||
fmt.Println("Upgrading database from 1 to 2...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD favorite VARCHAR(1) DEFAULT '0'")
|
||||
db.Db.MustExec("UPDATE database SET version=2")
|
||||
fmt.Println("Upgrading database from 1 to 2...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD favorite VARCHAR(1) DEFAULT '0'")
|
||||
db.Db.MustExec("UPDATE database SET version=2")
|
||||
}
|
||||
|
||||
// URTRator settings and Urban Terror profiles.
|
||||
func two_to_three(db *Database) {
|
||||
fmt.Println("Upgrading database from 2 to 3...")
|
||||
db.Db.MustExec("DROP TABLE IF EXISTS settings")
|
||||
db.Db.MustExec("CREATE TABLE settings (show_tray_icon VARCHAR(1) NOT NULL DEFAULT '0', enable_autoupdate VARCHAR(1) NOT NULL DEFAULT '0')")
|
||||
db.Db.MustExec("DROP TABLE IF EXISTS urt_profiles")
|
||||
db.Db.MustExec("CREATE TABLE urt_profiles (name VARCHAR(128) NOT NULL, version VARCHAR(5) NOT NULL DEFAULT '4.3', binary VARCHAR(1024) NOT NULL, second_x_session VARCHAR(1) NOT NULL DEFAULT '0', additional_parameters VARCHAR(1024) NOT NULL DEFAULT '')")
|
||||
db.Db.MustExec("UPDATE database SET version=3")
|
||||
fmt.Println("Upgrading database from 2 to 3...")
|
||||
db.Db.MustExec("DROP TABLE IF EXISTS settings")
|
||||
db.Db.MustExec("CREATE TABLE settings (show_tray_icon VARCHAR(1) NOT NULL DEFAULT '0', enable_autoupdate VARCHAR(1) NOT NULL DEFAULT '0')")
|
||||
db.Db.MustExec("DROP TABLE IF EXISTS urt_profiles")
|
||||
db.Db.MustExec("CREATE TABLE urt_profiles (name VARCHAR(128) NOT NULL, version VARCHAR(5) NOT NULL DEFAULT '4.3', binary VARCHAR(1024) NOT NULL, second_x_session VARCHAR(1) NOT NULL DEFAULT '0', additional_parameters VARCHAR(1024) NOT NULL DEFAULT '')")
|
||||
db.Db.MustExec("UPDATE database SET version=3")
|
||||
}
|
||||
|
||||
// UrT version inconsistency.
|
||||
func three_to_four(db *Database) {
|
||||
fmt.Println("Upgrading database from 3 to 4...")
|
||||
db.Db.MustExec("UPDATE urt_profiles SET version='4.3.0' WHERE version='4.3.000'")
|
||||
db.Db.MustExec("UPDATE database SET version=4")
|
||||
fmt.Println("Upgrading database from 3 to 4...")
|
||||
db.Db.MustExec("UPDATE urt_profiles SET version='4.3.0' WHERE version='4.3.000'")
|
||||
db.Db.MustExec("UPDATE database SET version=4")
|
||||
}
|
||||
|
||||
// Server's passwords.
|
||||
func four_to_five(db *Database) {
|
||||
fmt.Println("Upgrading database from 4 to 5...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD password VARCHAR(64) DEFAULT ''")
|
||||
db.Db.MustExec("UPDATE database SET version=5")
|
||||
fmt.Println("Upgrading database from 4 to 5...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD password VARCHAR(64) DEFAULT ''")
|
||||
db.Db.MustExec("UPDATE database SET version=5")
|
||||
}
|
||||
|
||||
// Profile for server.
|
||||
func five_to_six(db *Database) {
|
||||
fmt.Println("Upgrading database from 5 to 6...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD profile_to_use VARCHAR(128) DEFAULT ''")
|
||||
db.Db.MustExec("UPDATE database SET version=6")
|
||||
fmt.Println("Upgrading database from 5 to 6...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD profile_to_use VARCHAR(128) DEFAULT ''")
|
||||
db.Db.MustExec("UPDATE database SET version=6")
|
||||
}
|
||||
|
||||
// Configuration storage.
|
||||
func six_to_seven(db *Database) {
|
||||
fmt.Println("Upgrading database from 6 to 7...")
|
||||
db.Db.MustExec("CREATE TABLE configuration (key VARCHAR(128) NOT NULL, value VARCHAR(1024) NOT NULL)")
|
||||
db.Db.MustExec("UPDATE database SET version=7")
|
||||
fmt.Println("Upgrading database from 6 to 7...")
|
||||
db.Db.MustExec("CREATE TABLE configuration (key VARCHAR(128) NOT NULL, value VARCHAR(1024) NOT NULL)")
|
||||
db.Db.MustExec("UPDATE database SET version=7")
|
||||
}
|
||||
|
||||
// Server's extended information.
|
||||
func seven_to_eight(db *Database) {
|
||||
fmt.Println("Upgrading database from 7 to 8...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD extended_config VARCHAR(4096) NOT NULL DEFAULT ''")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD players_info VARCHAR(8192) NOT NULL DEFAULT ''")
|
||||
db.Db.MustExec("UPDATE database SET version=8")
|
||||
fmt.Println("Upgrading database from 7 to 8...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD extended_config VARCHAR(4096) NOT NULL DEFAULT ''")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD players_info VARCHAR(8192) NOT NULL DEFAULT ''")
|
||||
db.Db.MustExec("UPDATE database SET version=8")
|
||||
}
|
||||
|
||||
// Is server private flag.
|
||||
func eight_to_nine(db *Database) {
|
||||
fmt.Println("Upgrading database from 8 to 9...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD is_private VARCHAR(1) NOT NULL DEFAULT '0'")
|
||||
db.Db.MustExec("UPDATE database SET version=9")
|
||||
fmt.Println("Upgrading database from 8 to 9...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD is_private VARCHAR(1) NOT NULL DEFAULT '0'")
|
||||
db.Db.MustExec("UPDATE database SET version=9")
|
||||
}
|
||||
|
||||
// Bots count.
|
||||
func nine_to_ten(db *Database) {
|
||||
fmt.Println("Upgrading database from 9 to 10...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD bots VARCHAR(2) NOT NULL DEFAULT '0'")
|
||||
db.Db.MustExec("UPDATE database SET version=10")
|
||||
fmt.Println("Upgrading database from 9 to 10...")
|
||||
db.Db.MustExec("ALTER TABLE servers ADD bots VARCHAR(2) NOT NULL DEFAULT '0'")
|
||||
db.Db.MustExec("UPDATE database SET version=10")
|
||||
}
|
||||
|
||||
// Urban terror's profile path.
|
||||
func ten_to_eleven(db *Database) {
|
||||
fmt.Println("Upgrading database from 10 to 11...")
|
||||
db.Db.MustExec("ALTER TABLE urt_profiles ADD profile_path VARCHAR(4096) NOT NULL DEFAULT '~/.q3ut4'")
|
||||
db.Db.MustExec("UPDATE database SET version=11")
|
||||
fmt.Println("Upgrading database from 10 to 11...")
|
||||
db.Db.MustExec("ALTER TABLE urt_profiles ADD profile_path VARCHAR(4096) NOT NULL DEFAULT '~/.q3ut4'")
|
||||
db.Db.MustExec("UPDATE database SET version=11")
|
||||
}
|
||||
|
@ -10,6 +10,6 @@
|
||||
package datamodels
|
||||
|
||||
type Configuration struct {
|
||||
Key string `db:"key"`
|
||||
Value string `db:"value"`
|
||||
Key string `db:"key"`
|
||||
Value string `db:"value"`
|
||||
}
|
||||
|
@ -10,5 +10,5 @@
|
||||
package datamodels
|
||||
|
||||
type Database struct {
|
||||
Version string `db:"version"`
|
||||
Version string `db:"version"`
|
||||
}
|
||||
|
@ -10,16 +10,16 @@
|
||||
package datamodels
|
||||
|
||||
type Profile struct {
|
||||
// Profile name.
|
||||
Name string `db:"name"`
|
||||
// Game version.
|
||||
Version string `db:"version"`
|
||||
// Binary path.
|
||||
Binary string `db:"binary"`
|
||||
// Will we use second X session?
|
||||
Second_x_session string `db:"second_x_session"`
|
||||
// Additional game parameters we will pass.
|
||||
Additional_params string `db:"additional_parameters"`
|
||||
// Profile path.
|
||||
Profile_path string `db:"profile_path"`
|
||||
// Profile name.
|
||||
Name string `db:"name"`
|
||||
// Game version.
|
||||
Version string `db:"version"`
|
||||
// Binary path.
|
||||
Binary string `db:"binary"`
|
||||
// Will we use second X session?
|
||||
Second_x_session string `db:"second_x_session"`
|
||||
// Additional game parameters we will pass.
|
||||
Additional_params string `db:"additional_parameters"`
|
||||
// Profile path.
|
||||
Profile_path string `db:"profile_path"`
|
||||
}
|
||||
|
@ -10,36 +10,36 @@
|
||||
package datamodels
|
||||
|
||||
type Server struct {
|
||||
// Server's address
|
||||
Ip string `db:"ip"`
|
||||
// Server's port
|
||||
Port string `db:"port"`
|
||||
// Server's name
|
||||
Name string `db:"name"`
|
||||
// Current players count
|
||||
Players string `db:"players"`
|
||||
// Bots count
|
||||
Bots string `db:"bots"`
|
||||
// Maximum players
|
||||
Maxplayers string `db:"maxplayers"`
|
||||
// Ping
|
||||
Ping string `db:"ping"`
|
||||
// Gametype. See Urban Terror documentation on relationship.
|
||||
Gamemode string `db:"gamemode"`
|
||||
// Current map
|
||||
Map string `db:"map"`
|
||||
// Server's software version
|
||||
Version string `db:"version"`
|
||||
// Is server was favorited?
|
||||
Favorite string `db:"favorite"`
|
||||
// Server's password.
|
||||
Password string `db:"password"`
|
||||
// Profile to use with server.
|
||||
ProfileToUse string `db:"profile_to_use"`
|
||||
// Extended server's configuration.
|
||||
ExtendedConfig string `db:"extended_config"`
|
||||
// Players information.
|
||||
PlayersInfo string `db:"players_info"`
|
||||
// Is server private?
|
||||
IsPrivate string `db:"is_private"`
|
||||
// Server's address
|
||||
Ip string `db:"ip"`
|
||||
// Server's port
|
||||
Port string `db:"port"`
|
||||
// Server's name
|
||||
Name string `db:"name"`
|
||||
// Current players count
|
||||
Players string `db:"players"`
|
||||
// Bots count
|
||||
Bots string `db:"bots"`
|
||||
// Maximum players
|
||||
Maxplayers string `db:"maxplayers"`
|
||||
// Ping
|
||||
Ping string `db:"ping"`
|
||||
// Gametype. See Urban Terror documentation on relationship.
|
||||
Gamemode string `db:"gamemode"`
|
||||
// Current map
|
||||
Map string `db:"map"`
|
||||
// Server's software version
|
||||
Version string `db:"version"`
|
||||
// Is server was favorited?
|
||||
Favorite string `db:"favorite"`
|
||||
// Server's password.
|
||||
Password string `db:"password"`
|
||||
// Profile to use with server.
|
||||
ProfileToUse string `db:"profile_to_use"`
|
||||
// Extended server's configuration.
|
||||
ExtendedConfig string `db:"extended_config"`
|
||||
// Players information.
|
||||
PlayersInfo string `db:"players_info"`
|
||||
// Is server private?
|
||||
IsPrivate string `db:"is_private"`
|
||||
}
|
||||
|
@ -10,66 +10,66 @@
|
||||
package eventer
|
||||
|
||||
import (
|
||||
crand "crypto/rand"
|
||||
"errors"
|
||||
"fmt"
|
||||
//"reflect"
|
||||
crand "crypto/rand"
|
||||
"errors"
|
||||
"fmt"
|
||||
//"reflect"
|
||||
|
||||
// github
|
||||
"github.com/mattn/go-gtk/glib"
|
||||
"github.com/mattn/go-gtk/gtk"
|
||||
// github
|
||||
"github.com/mattn/go-gtk/glib"
|
||||
"github.com/mattn/go-gtk/gtk"
|
||||
)
|
||||
|
||||
type Eventer struct {
|
||||
// Events
|
||||
events map[string]map[string]func(data map[string]string)
|
||||
// Events
|
||||
events map[string]map[string]func(data map[string]string)
|
||||
}
|
||||
|
||||
func (e *Eventer) AddEventHandler(event string, handler func(data map[string]string)) {
|
||||
_, ok := e.events[event]
|
||||
if !ok {
|
||||
e.events[event] = make(map[string]func(data map[string]string))
|
||||
}
|
||||
event_id_raw := make([]byte, 16)
|
||||
crand.Read(event_id_raw)
|
||||
event_id := fmt.Sprintf("%x", event_id_raw)
|
||||
e.events[event][event_id] = handler
|
||||
_, ok := e.events[event]
|
||||
if !ok {
|
||||
e.events[event] = make(map[string]func(data map[string]string))
|
||||
}
|
||||
event_id_raw := make([]byte, 16)
|
||||
crand.Read(event_id_raw)
|
||||
event_id := fmt.Sprintf("%x", event_id_raw)
|
||||
e.events[event][event_id] = handler
|
||||
}
|
||||
|
||||
func (e *Eventer) Initialize() {
|
||||
e.initializeStorage()
|
||||
e.initializeStorage()
|
||||
}
|
||||
|
||||
func (e *Eventer) initializeStorage() {
|
||||
e.events = make(map[string]map[string]func(data map[string]string))
|
||||
e.events = make(map[string]map[string]func(data map[string]string))
|
||||
}
|
||||
|
||||
func (e *Eventer) LaunchEvent(event string, data map[string]string) error {
|
||||
_, ok := e.events[event]
|
||||
if !ok {
|
||||
return errors.New("Event " + event + " not found!")
|
||||
}
|
||||
_, ok := e.events[event]
|
||||
if !ok {
|
||||
return errors.New("Event " + event + " not found!")
|
||||
}
|
||||
|
||||
fmt.Println("Launching event " + event)
|
||||
glib.IdleAdd(func() bool {
|
||||
e.reallyLaunchEvent(event, data)
|
||||
return false
|
||||
})
|
||||
fmt.Println("Launching event " + event)
|
||||
glib.IdleAdd(func() bool {
|
||||
e.reallyLaunchEvent(event, data)
|
||||
return false
|
||||
})
|
||||
|
||||
for {
|
||||
if gtk.EventsPending() {
|
||||
gtk.MainIteration()
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
for {
|
||||
if gtk.EventsPending() {
|
||||
gtk.MainIteration()
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *Eventer) reallyLaunchEvent(event string, data map[string]string) {
|
||||
fmt.Println("Really launching event " + event + "...")
|
||||
for _, val := range e.events[event] {
|
||||
val(data)
|
||||
}
|
||||
fmt.Println("Really launching event " + event + "...")
|
||||
for _, val := range e.events[event] {
|
||||
val(data)
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,6 @@
|
||||
package eventer
|
||||
|
||||
func New() *Eventer {
|
||||
e := Eventer{}
|
||||
return &e
|
||||
e := Eventer{}
|
||||
return &e
|
||||
}
|
||||
|
@ -10,39 +10,39 @@
|
||||
package ioq3dataparser
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"strings"
|
||||
// stdlib
|
||||
"strings"
|
||||
)
|
||||
|
||||
func ParseInfoToMap(data string) map[string]string {
|
||||
parsed_data := make(map[string]string)
|
||||
parsed_data := make(map[string]string)
|
||||
|
||||
srv_config := strings.Split(data, "\\")
|
||||
srv_config = srv_config[1:]
|
||||
// Parse server configuration into passed server's datamodel.
|
||||
for i := 0; i < len(srv_config[1:]); i = i + 2 {
|
||||
parsed_data[srv_config[i]] = srv_config[i + 1]
|
||||
}
|
||||
srv_config := strings.Split(data, "\\")
|
||||
srv_config = srv_config[1:]
|
||||
// Parse server configuration into passed server's datamodel.
|
||||
for i := 0; i < len(srv_config[1:]); i = i + 2 {
|
||||
parsed_data[srv_config[i]] = srv_config[i+1]
|
||||
}
|
||||
|
||||
return parsed_data
|
||||
return parsed_data
|
||||
}
|
||||
|
||||
func ParsePlayersInfoToMap(data string) map[string]map[string]string {
|
||||
parsed_data := make(map[string]map[string]string)
|
||||
parsed_data := make(map[string]map[string]string)
|
||||
|
||||
// Structure: frags|ping|nick
|
||||
raw_data := strings.Split(data, "\\")
|
||||
for i := range raw_data {
|
||||
raw_player_data := strings.Split(raw_data[i], " ")
|
||||
player_data := make(map[string]string)
|
||||
if len(raw_player_data) > 1 {
|
||||
nickname := strings.Join(raw_player_data[2:], " ")
|
||||
player_data["nick"] = string([]byte(nickname)[1:len(nickname)-1])
|
||||
player_data["ping"] = raw_player_data[1]
|
||||
player_data["frags"] = raw_player_data[0]
|
||||
parsed_data[player_data["nick"]] = player_data
|
||||
}
|
||||
}
|
||||
// Structure: frags|ping|nick
|
||||
raw_data := strings.Split(data, "\\")
|
||||
for i := range raw_data {
|
||||
raw_player_data := strings.Split(raw_data[i], " ")
|
||||
player_data := make(map[string]string)
|
||||
if len(raw_player_data) > 1 {
|
||||
nickname := strings.Join(raw_player_data[2:], " ")
|
||||
player_data["nick"] = string([]byte(nickname)[1 : len(nickname)-1])
|
||||
player_data["ping"] = raw_player_data[1]
|
||||
player_data["frags"] = raw_player_data[0]
|
||||
parsed_data[player_data["nick"]] = player_data
|
||||
}
|
||||
}
|
||||
|
||||
return parsed_data
|
||||
return parsed_data
|
||||
}
|
||||
|
@ -10,6 +10,6 @@
|
||||
package launcher
|
||||
|
||||
func New() *Launcher {
|
||||
l := Launcher{}
|
||||
return &l
|
||||
l := Launcher{}
|
||||
return &l
|
||||
}
|
||||
|
162
timer/timer.go
162
timer/timer.go
@ -10,121 +10,121 @@
|
||||
package timer
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
// stdlib
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Timer struct {
|
||||
// Tasks.
|
||||
tasks map[string]*TimerTask
|
||||
// Tasks map mutex.
|
||||
tasksMutex sync.Mutex
|
||||
// Tasks.
|
||||
tasks map[string]*TimerTask
|
||||
// Tasks map mutex.
|
||||
tasksMutex sync.Mutex
|
||||
}
|
||||
|
||||
func (t *Timer) AddTask(task *TimerTask) error {
|
||||
fmt.Println("Adding task '" + task.Name + "'...")
|
||||
fmt.Println("Adding task '" + task.Name + "'...")
|
||||
|
||||
_, ok := t.tasks[task.Name]
|
||||
if ok {
|
||||
error_text := "Task '" + task.Name + "' already exist! Ignoring..."
|
||||
fmt.Println(error_text)
|
||||
return errors.New(error_text)
|
||||
}
|
||||
_, ok := t.tasks[task.Name]
|
||||
if ok {
|
||||
error_text := "Task '" + task.Name + "' already exist! Ignoring..."
|
||||
fmt.Println(error_text)
|
||||
return errors.New(error_text)
|
||||
}
|
||||
|
||||
task.InProgress = false
|
||||
task.InProgress = false
|
||||
|
||||
curtime := time.Now()
|
||||
nextlaunch := curtime.Add(time.Duration(task.Timeout) * time.Second)
|
||||
task.NextLaunch = nextlaunch
|
||||
curtime := time.Now()
|
||||
nextlaunch := curtime.Add(time.Duration(task.Timeout) * time.Second)
|
||||
task.NextLaunch = nextlaunch
|
||||
|
||||
t.tasksMutex.Lock()
|
||||
t.tasks[task.Name] = task
|
||||
t.tasksMutex.Unlock()
|
||||
t.tasksMutex.Lock()
|
||||
t.tasks[task.Name] = task
|
||||
t.tasksMutex.Unlock()
|
||||
|
||||
fmt.Println("Added task '" + task.Name + "' with " + strconv.Itoa(task.Timeout) + " seconds timeout")
|
||||
return nil
|
||||
fmt.Println("Added task '" + task.Name + "' with " + strconv.Itoa(task.Timeout) + " seconds timeout")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *Timer) executeTasks() {
|
||||
t.tasksMutex.Lock()
|
||||
for task_name, task := range t.tasks {
|
||||
// Check if task should be run.
|
||||
curtime := time.Now()
|
||||
diff := curtime.Sub(task.NextLaunch)
|
||||
//fmt.Println(diff)
|
||||
if diff > 0 {
|
||||
fmt.Println("Checking task '" + task_name + "'...")
|
||||
// Check if task is already running.
|
||||
if task.InProgress {
|
||||
fmt.Println("Already executing, skipping...")
|
||||
continue
|
||||
}
|
||||
t.tasksMutex.Lock()
|
||||
for task_name, task := range t.tasks {
|
||||
// Check if task should be run.
|
||||
curtime := time.Now()
|
||||
diff := curtime.Sub(task.NextLaunch)
|
||||
//fmt.Println(diff)
|
||||
if diff > 0 {
|
||||
fmt.Println("Checking task '" + task_name + "'...")
|
||||
// Check if task is already running.
|
||||
if task.InProgress {
|
||||
fmt.Println("Already executing, skipping...")
|
||||
continue
|
||||
}
|
||||
|
||||
fmt.Println("Launching task '" + task_name + "'...")
|
||||
task.InProgress = true
|
||||
Eventer.LaunchEvent(task.Callee, map[string]string{})
|
||||
fmt.Println("Launching task '" + task_name + "'...")
|
||||
task.InProgress = true
|
||||
Eventer.LaunchEvent(task.Callee, map[string]string{})
|
||||
|
||||
curtime = time.Now()
|
||||
nextlaunch := curtime.Add(time.Duration(task.Timeout) * time.Second)
|
||||
task.NextLaunch = nextlaunch
|
||||
}
|
||||
}
|
||||
t.tasksMutex.Unlock()
|
||||
curtime = time.Now()
|
||||
nextlaunch := curtime.Add(time.Duration(task.Timeout) * time.Second)
|
||||
task.NextLaunch = nextlaunch
|
||||
}
|
||||
}
|
||||
t.tasksMutex.Unlock()
|
||||
}
|
||||
|
||||
func (t *Timer) GetTaskStatus(task_name string) bool {
|
||||
t.tasksMutex.Lock()
|
||||
task, ok := t.tasks[task_name]
|
||||
t.tasksMutex.Unlock()
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
t.tasksMutex.Lock()
|
||||
task, ok := t.tasks[task_name]
|
||||
t.tasksMutex.Unlock()
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
return task.InProgress
|
||||
return task.InProgress
|
||||
}
|
||||
|
||||
func (t *Timer) Initialize() {
|
||||
fmt.Println("Initializing timer...")
|
||||
fmt.Println("Initializing timer...")
|
||||
|
||||
t.initializeStorage()
|
||||
Eventer.AddEventHandler("taskDone", t.SetTaskNotInProgress)
|
||||
t.initializeStorage()
|
||||
Eventer.AddEventHandler("taskDone", t.SetTaskNotInProgress)
|
||||
|
||||
ticker := time.NewTicker(time.Second * 1)
|
||||
go func() {
|
||||
for _ = range ticker.C {
|
||||
go t.executeTasks()
|
||||
}
|
||||
}()
|
||||
ticker := time.NewTicker(time.Second * 1)
|
||||
go func() {
|
||||
for _ = range ticker.C {
|
||||
go t.executeTasks()
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (t *Timer) initializeStorage() {
|
||||
t.tasks = make(map[string]*TimerTask)
|
||||
t.tasks = make(map[string]*TimerTask)
|
||||
}
|
||||
|
||||
func (t *Timer) RemoveTask(task_name string) {
|
||||
t.tasksMutex.Lock()
|
||||
_, ok := t.tasks[task_name]
|
||||
t.tasksMutex.Unlock()
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
t.tasksMutex.Lock()
|
||||
_, ok := t.tasks[task_name]
|
||||
t.tasksMutex.Unlock()
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
t.tasksMutex.Lock()
|
||||
delete(t.tasks, task_name)
|
||||
t.tasksMutex.Unlock()
|
||||
t.tasksMutex.Lock()
|
||||
delete(t.tasks, task_name)
|
||||
t.tasksMutex.Unlock()
|
||||
}
|
||||
|
||||
func (t *Timer) SetTaskNotInProgress(data map[string]string) {
|
||||
t.tasksMutex.Lock()
|
||||
_, ok := t.tasks[data["task_name"]]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
t.tasksMutex.Lock()
|
||||
_, ok := t.tasks[data["task_name"]]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
t.tasks[data["task_name"]].InProgress = false
|
||||
t.tasksMutex.Unlock()
|
||||
t.tasks[data["task_name"]].InProgress = false
|
||||
t.tasksMutex.Unlock()
|
||||
}
|
||||
|
@ -10,25 +10,25 @@
|
||||
package timer
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"time"
|
||||
// stdlib
|
||||
"time"
|
||||
)
|
||||
|
||||
type TimerTask struct {
|
||||
// Task name.
|
||||
Name string
|
||||
// Task timeout, in seconds.
|
||||
Timeout int
|
||||
// What we should call?
|
||||
// This should be an event name.
|
||||
Callee string
|
||||
// Task name.
|
||||
Name string
|
||||
// Task timeout, in seconds.
|
||||
Timeout int
|
||||
// What we should call?
|
||||
// This should be an event name.
|
||||
Callee string
|
||||
|
||||
// Internal variables, used by Timer.
|
||||
// These variables can be defined, but they will be most likely
|
||||
// overrided after first task launch.
|
||||
// Next task launch time.
|
||||
NextLaunch time.Time
|
||||
// Is task currently executed?
|
||||
// Kinda alternative to mutex.
|
||||
InProgress bool
|
||||
// Internal variables, used by Timer.
|
||||
// These variables can be defined, but they will be most likely
|
||||
// overrided after first task launch.
|
||||
// Next task launch time.
|
||||
NextLaunch time.Time
|
||||
// Is task currently executed?
|
||||
// Kinda alternative to mutex.
|
||||
InProgress bool
|
||||
}
|
||||
|
@ -14,23 +14,23 @@
|
||||
package translator
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
// stdlib
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Translator struct {
|
||||
// Accepted languages.
|
||||
AcceptedLanguages map[string]string
|
||||
// Currently active language.
|
||||
Language string
|
||||
// Translations.
|
||||
translations map[string]map[string]string
|
||||
// Path to translations files.
|
||||
translationsPath string
|
||||
// Accepted languages.
|
||||
AcceptedLanguages map[string]string
|
||||
// Currently active language.
|
||||
Language string
|
||||
// Translations.
|
||||
translations map[string]map[string]string
|
||||
// Path to translations files.
|
||||
translationsPath string
|
||||
}
|
||||
|
||||
// Formats string from passed map.
|
||||
@ -50,73 +50,73 @@ type Translator struct {
|
||||
// Also note that we will replace ALL occurences of "{{ VAR }}" within string!
|
||||
// All untranslated variables will not be touched at all.
|
||||
func (t *Translator) formatFromMap(data string, params map[string]string) string {
|
||||
new_data := data
|
||||
for k, v := range params {
|
||||
new_data = strings.Replace(new_data, "{{ " + k + " }}", v, -1)
|
||||
}
|
||||
return new_data
|
||||
new_data := data
|
||||
for k, v := range params {
|
||||
new_data = strings.Replace(new_data, "{{ "+k+" }}", v, -1)
|
||||
}
|
||||
return new_data
|
||||
}
|
||||
|
||||
// Translator initialization.
|
||||
func (t *Translator) Initialize() {
|
||||
fmt.Println("Initializing translations...")
|
||||
fmt.Println("Initializing translations...")
|
||||
|
||||
t.AcceptedLanguages = map[string]string{
|
||||
"System's default language": "default",
|
||||
"English": "en_US",
|
||||
"French": "fr_FR",
|
||||
"Russian": "ru_RU",
|
||||
}
|
||||
t.AcceptedLanguages = map[string]string{
|
||||
"System's default language": "default",
|
||||
"English": "en_US",
|
||||
"French": "fr_FR",
|
||||
"Russian": "ru_RU",
|
||||
}
|
||||
|
||||
// Initialize storages.
|
||||
t.translations = make(map[string]map[string]string)
|
||||
t.translationsPath = ""
|
||||
// Initialize storages.
|
||||
t.translations = make(map[string]map[string]string)
|
||||
t.translationsPath = ""
|
||||
|
||||
// Getting locale name from environment.
|
||||
// ToDo: Windows compatability. Possible reference:
|
||||
// https://github.com/cloudfoundry-attic/jibber_jabber/blob/master/jibber_jabber_windows.go
|
||||
t.detectLanguage()
|
||||
// Getting locale name from environment.
|
||||
// ToDo: Windows compatability. Possible reference:
|
||||
// https://github.com/cloudfoundry-attic/jibber_jabber/blob/master/jibber_jabber_windows.go
|
||||
t.detectLanguage()
|
||||
|
||||
fmt.Println("Using translations for '" + t.Language + "'")
|
||||
fmt.Println("Using translations for '" + t.Language + "'")
|
||||
|
||||
err := t.detectTranslationsDirectory()
|
||||
if err == nil {
|
||||
t.loadTranslations()
|
||||
} else {
|
||||
fmt.Println("Skipping translations loading due to missing translations directory.")
|
||||
}
|
||||
err := t.detectTranslationsDirectory()
|
||||
if err == nil {
|
||||
t.loadTranslations()
|
||||
} else {
|
||||
fmt.Println("Skipping translations loading due to missing translations directory.")
|
||||
}
|
||||
}
|
||||
|
||||
// Load translations into memory.
|
||||
func (t *Translator) loadTranslations() {
|
||||
fmt.Println("Loading translations for language " + t.Language)
|
||||
fmt.Println("Translations directory: " + t.translationsPath)
|
||||
fmt.Println("Loading translations for language " + t.Language)
|
||||
fmt.Println("Translations directory: " + t.translationsPath)
|
||||
|
||||
t.translations[t.Language] = make(map[string]string)
|
||||
t.translations[t.Language] = make(map[string]string)
|
||||
|
||||
if t.translationsPath != "" {
|
||||
// Check if language was selected in options dialog. In that
|
||||
// case it will overwrite autodetected language.
|
||||
var translationsDir string = ""
|
||||
if cfg.Cfg["/general/language"] != "" {
|
||||
translationsDir = filepath.Join(t.translationsPath, cfg.Cfg["/general/language"])
|
||||
t.Language = cfg.Cfg["/general/language"]
|
||||
} else {
|
||||
translationsDir = filepath.Join(t.translationsPath, t.Language)
|
||||
}
|
||||
files_list, _ := ioutil.ReadDir(translationsDir)
|
||||
if len(files_list) > 0 {
|
||||
for i := range files_list {
|
||||
// Read file.
|
||||
file_path := filepath.Join(translationsDir, files_list[i].Name())
|
||||
file_data, _ := ioutil.ReadFile(file_path)
|
||||
var trans map[string]string
|
||||
json.Unmarshal(file_data, &trans)
|
||||
// Assign parsed translations to language code.
|
||||
t.translations[t.Language] = trans
|
||||
}
|
||||
}
|
||||
}
|
||||
if t.translationsPath != "" {
|
||||
// Check if language was selected in options dialog. In that
|
||||
// case it will overwrite autodetected language.
|
||||
var translationsDir string = ""
|
||||
if cfg.Cfg["/general/language"] != "" {
|
||||
translationsDir = filepath.Join(t.translationsPath, cfg.Cfg["/general/language"])
|
||||
t.Language = cfg.Cfg["/general/language"]
|
||||
} else {
|
||||
translationsDir = filepath.Join(t.translationsPath, t.Language)
|
||||
}
|
||||
files_list, _ := ioutil.ReadDir(translationsDir)
|
||||
if len(files_list) > 0 {
|
||||
for i := range files_list {
|
||||
// Read file.
|
||||
file_path := filepath.Join(translationsDir, files_list[i].Name())
|
||||
file_data, _ := ioutil.ReadFile(file_path)
|
||||
var trans map[string]string
|
||||
json.Unmarshal(file_data, &trans)
|
||||
// Assign parsed translations to language code.
|
||||
t.translations[t.Language] = trans
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Actual translation function.
|
||||
@ -129,18 +129,18 @@ func (t *Translator) loadTranslations() {
|
||||
// Translates passed data from loaded translations file.
|
||||
// Returns passed data without changes if translation wasn't found.
|
||||
func (t *Translator) Translate(data string, params map[string]string) string {
|
||||
val, ok := t.translations[t.Language][data]
|
||||
if !ok {
|
||||
if params != nil && len(params) > 0 {
|
||||
return t.formatFromMap(data, params)
|
||||
} else {
|
||||
return data
|
||||
}
|
||||
}
|
||||
val, ok := t.translations[t.Language][data]
|
||||
if !ok {
|
||||
if params != nil && len(params) > 0 {
|
||||
return t.formatFromMap(data, params)
|
||||
} else {
|
||||
return data
|
||||
}
|
||||
}
|
||||
|
||||
if params != nil && len(params) > 0 {
|
||||
return t.formatFromMap(val, params)
|
||||
}
|
||||
if params != nil && len(params) > 0 {
|
||||
return t.formatFromMap(val, params)
|
||||
}
|
||||
|
||||
return val
|
||||
return val
|
||||
}
|
||||
|
@ -22,64 +22,64 @@
|
||||
package translator
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
// stdlib
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Detect language on Unices.
|
||||
func (t *Translator) detectLanguage() {
|
||||
// Use LC_ALL first.
|
||||
t.Language = os.Getenv("LC_ALL")
|
||||
// If LC_ALL is empty - use LANG.
|
||||
if t.Language == "" {
|
||||
t.Language = os.Getenv("LANG")
|
||||
}
|
||||
// Use LC_ALL first.
|
||||
t.Language = os.Getenv("LC_ALL")
|
||||
// If LC_ALL is empty - use LANG.
|
||||
if t.Language == "" {
|
||||
t.Language = os.Getenv("LANG")
|
||||
}
|
||||
|
||||
// If still nothing - force "en_US" as default locale. Otherwise
|
||||
// split language string by "." and take first part.
|
||||
// Note: en_US is a default thing, so you will not found anything
|
||||
// in "translations" directory!
|
||||
if t.Language == "" {
|
||||
fmt.Println("No locale data for current user found, using default (en_US)...")
|
||||
t.Language = "en_US"
|
||||
} else {
|
||||
t.Language = strings.Split(t.Language, ".")[0]
|
||||
}
|
||||
// If still nothing - force "en_US" as default locale. Otherwise
|
||||
// split language string by "." and take first part.
|
||||
// Note: en_US is a default thing, so you will not found anything
|
||||
// in "translations" directory!
|
||||
if t.Language == "" {
|
||||
fmt.Println("No locale data for current user found, using default (en_US)...")
|
||||
t.Language = "en_US"
|
||||
} else {
|
||||
t.Language = strings.Split(t.Language, ".")[0]
|
||||
}
|
||||
}
|
||||
|
||||
func (t *Translator) detectTranslationsDirectory() error {
|
||||
// Try to use directory near binary.
|
||||
dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
|
||||
// ..which can be overriden by URTRATOR_BINDIR environment variable.
|
||||
// Useful for developers.
|
||||
envdir := os.Getenv("URTRATOR_BINDIR")
|
||||
if envdir != "" {
|
||||
dir = envdir
|
||||
}
|
||||
// Try to use directory near binary.
|
||||
dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
|
||||
// ..which can be overriden by URTRATOR_BINDIR environment variable.
|
||||
// Useful for developers.
|
||||
envdir := os.Getenv("URTRATOR_BINDIR")
|
||||
if envdir != "" {
|
||||
dir = envdir
|
||||
}
|
||||
|
||||
translations_dir := filepath.Join(dir, "translations")
|
||||
_, err := os.Stat(translations_dir)
|
||||
if err != nil {
|
||||
fmt.Println("Translations wasn't found near binary!")
|
||||
// As we're using JSON translation storage, it should be
|
||||
// put in /usr/share/urtrator/translations by package
|
||||
// maintainers in distros.
|
||||
fmt.Println("Trying /usr/share/urtrator/translations...")
|
||||
_, err := os.Stat("/usr/share/urtrator/translations")
|
||||
if err != nil {
|
||||
t.Language = "en_US"
|
||||
fmt.Println("Translations unavailable, forcing en_US language code")
|
||||
return errors.New("No translations directory was detected!")
|
||||
} else {
|
||||
t.translationsPath = "/usr/share/urtrator/translations"
|
||||
}
|
||||
} else {
|
||||
t.translationsPath = translations_dir
|
||||
}
|
||||
translations_dir := filepath.Join(dir, "translations")
|
||||
_, err := os.Stat(translations_dir)
|
||||
if err != nil {
|
||||
fmt.Println("Translations wasn't found near binary!")
|
||||
// As we're using JSON translation storage, it should be
|
||||
// put in /usr/share/urtrator/translations by package
|
||||
// maintainers in distros.
|
||||
fmt.Println("Trying /usr/share/urtrator/translations...")
|
||||
_, err := os.Stat("/usr/share/urtrator/translations")
|
||||
if err != nil {
|
||||
t.Language = "en_US"
|
||||
fmt.Println("Translations unavailable, forcing en_US language code")
|
||||
return errors.New("No translations directory was detected!")
|
||||
} else {
|
||||
t.translationsPath = "/usr/share/urtrator/translations"
|
||||
}
|
||||
} else {
|
||||
t.translationsPath = translations_dir
|
||||
}
|
||||
|
||||
return nil
|
||||
return nil
|
||||
}
|
||||
|
@ -22,23 +22,23 @@
|
||||
package translator
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"os"
|
||||
// stdlib
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
// Detect language on Windows.
|
||||
func (t *Translator) detectLanguage() {
|
||||
fmt.Println("ToDo! Forcing en_US for now!")
|
||||
t.Language = "en_US"
|
||||
fmt.Println("ToDo! Forcing en_US for now!")
|
||||
t.Language = "en_US"
|
||||
}
|
||||
|
||||
func (t *Translator) detectTranslationsDirectory() error {
|
||||
// Translations MUST reside in directory neear binary!
|
||||
// ToDo: more checks.
|
||||
dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
|
||||
t.translationsPath = filepath.Join(dir, "translations")
|
||||
// Translations MUST reside in directory neear binary!
|
||||
// ToDo: more checks.
|
||||
dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
|
||||
t.translationsPath = filepath.Join(dir, "translations")
|
||||
|
||||
return nil
|
||||
return nil
|
||||
}
|
||||
|
@ -1,47 +1,47 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"strings"
|
||||
// stdlib
|
||||
"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) getGameModeName(name string) string {
|
||||
val, ok := m.gamemodes[name]
|
||||
val, ok := m.gamemodes[name]
|
||||
|
||||
if !ok {
|
||||
return "Unknown or custom"
|
||||
}
|
||||
if !ok {
|
||||
return "Unknown or custom"
|
||||
}
|
||||
|
||||
return val
|
||||
return val
|
||||
}
|
||||
|
||||
func (m *MainWindow) getIpFromServersList(current_tab string) string {
|
||||
// Getting server's address from list.
|
||||
// Assuming that we're on "Servers" tab by default.
|
||||
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()
|
||||
}
|
||||
// Getting server's address from list.
|
||||
// Assuming that we're on "Servers" tab by default.
|
||||
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)
|
||||
iter := new(gtk.TreeIter)
|
||||
_ = sel.GetSelected(iter)
|
||||
|
||||
// Getting server address.
|
||||
var srv_addr string
|
||||
srv_addr_gval := glib.ValueFromNative(srv_addr)
|
||||
// Getting server address.
|
||||
var srv_addr string
|
||||
srv_addr_gval := glib.ValueFromNative(srv_addr)
|
||||
|
||||
if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) {
|
||||
model.GetValue(iter, m.column_pos["Servers"]["IP"], srv_addr_gval)
|
||||
} else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) {
|
||||
model.GetValue(iter, m.column_pos["Favorites"]["IP"], srv_addr_gval)
|
||||
}
|
||||
server_address := srv_addr_gval.GetString()
|
||||
if strings.Contains(current_tab, ctx.Translator.Translate("Servers", nil)) {
|
||||
model.GetValue(iter, m.column_pos["Servers"]["IP"], srv_addr_gval)
|
||||
} else if strings.Contains(current_tab, ctx.Translator.Translate("Favorites", nil)) {
|
||||
model.GetValue(iter, m.column_pos["Favorites"]["IP"], srv_addr_gval)
|
||||
}
|
||||
server_address := srv_addr_gval.GetString()
|
||||
|
||||
return server_address
|
||||
return server_address
|
||||
}
|
||||
|
@ -10,16 +10,16 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
// local
|
||||
"github.com/pztrn/urtrator/context"
|
||||
// local
|
||||
"github.com/pztrn/urtrator/context"
|
||||
)
|
||||
|
||||
var (
|
||||
ctx *context.Context
|
||||
ctx *context.Context
|
||||
)
|
||||
|
||||
func NewMainWindow(c *context.Context) *MainWindow {
|
||||
ctx = c
|
||||
m := MainWindow{}
|
||||
return &m
|
||||
ctx = c
|
||||
m := MainWindow{}
|
||||
return &m
|
||||
}
|
||||
|
@ -10,109 +10,108 @@
|
||||
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
|
||||
//"github.com/pztrn/urtrator/datamodels"
|
||||
//"github.com/pztrn/urtrator/ioq3dataparser"
|
||||
|
||||
// github
|
||||
"github.com/therecipe/qt/widgets"
|
||||
// github
|
||||
"github.com/therecipe/qt/widgets"
|
||||
)
|
||||
|
||||
type MainWindow struct {
|
||||
//////////////////////////////////////////////////
|
||||
// Main widgets and pointers.
|
||||
//////////////////////////////////////////////////
|
||||
// Application.
|
||||
app *widgets.QApplication
|
||||
// Main window.
|
||||
window *widgets.QMainWindow
|
||||
// Main menu.
|
||||
mainmenu *widgets.QMenuBar
|
||||
// Main vertical box.
|
||||
vbox *widgets.QVBoxLayout
|
||||
// Toolbar.
|
||||
toolbar *widgets.QToolBar
|
||||
// Splitter.
|
||||
splitter *widgets.QSplitter
|
||||
// Tabs widget.
|
||||
tabs *widgets.QTabWidget
|
||||
//////////////////////////////////////////////////
|
||||
// Main widgets and pointers.
|
||||
//////////////////////////////////////////////////
|
||||
// Application.
|
||||
app *widgets.QApplication
|
||||
// Main window.
|
||||
window *widgets.QMainWindow
|
||||
// Main menu.
|
||||
mainmenu *widgets.QMenuBar
|
||||
// Main vertical box.
|
||||
vbox *widgets.QVBoxLayout
|
||||
// Toolbar.
|
||||
toolbar *widgets.QToolBar
|
||||
// Splitter.
|
||||
splitter *widgets.QSplitter
|
||||
// Tabs widget.
|
||||
tabs *widgets.QTabWidget
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Servers lists and related.
|
||||
//////////////////////////////////////////////////
|
||||
// "Servers" tab list.
|
||||
all_servers *widgets.QTreeView
|
||||
// Hide offline servers checkbox.
|
||||
all_servers_hide_offline *widgets.QCheckBox
|
||||
// Hide private servers?
|
||||
all_servers_hide_private *widgets.QCheckBox
|
||||
// Server's version.
|
||||
all_servers_version *widgets.QComboBox
|
||||
// Game mode.
|
||||
all_servers_gamemode *widgets.QComboBox
|
||||
// Favorites tab list.
|
||||
fav_servers *widgets.QTreeView
|
||||
// Hide offline servers checkbox.
|
||||
fav_servers_hide_offline *widgets.QCheckBox
|
||||
// Hide private servers?
|
||||
fav_servers_hide_private *widgets.QCheckBox
|
||||
// Server's version.
|
||||
fav_servers_version *widgets.QComboBox
|
||||
// Game mode.
|
||||
fav_servers_gamemode *widgets.QComboBox
|
||||
// Sidebar's server's information widget.
|
||||
sidebar_server_info *widgets.QTreeView
|
||||
// Sidebar's server's players widget.
|
||||
sidebar_server_players *widgets.QTreeView
|
||||
//////////////////////////////////////////////////
|
||||
// Servers lists and related.
|
||||
//////////////////////////////////////////////////
|
||||
// "Servers" tab list.
|
||||
all_servers *widgets.QTreeView
|
||||
// Hide offline servers checkbox.
|
||||
all_servers_hide_offline *widgets.QCheckBox
|
||||
// Hide private servers?
|
||||
all_servers_hide_private *widgets.QCheckBox
|
||||
// Server's version.
|
||||
all_servers_version *widgets.QComboBox
|
||||
// Game mode.
|
||||
all_servers_gamemode *widgets.QComboBox
|
||||
// Favorites tab list.
|
||||
fav_servers *widgets.QTreeView
|
||||
// Hide offline servers checkbox.
|
||||
fav_servers_hide_offline *widgets.QCheckBox
|
||||
// Hide private servers?
|
||||
fav_servers_hide_private *widgets.QCheckBox
|
||||
// Server's version.
|
||||
fav_servers_version *widgets.QComboBox
|
||||
// Game mode.
|
||||
fav_servers_gamemode *widgets.QComboBox
|
||||
// Sidebar's server's information widget.
|
||||
sidebar_server_info *widgets.QTreeView
|
||||
// Sidebar's server's players widget.
|
||||
sidebar_server_players *widgets.QTreeView
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Datas.
|
||||
//////////////////////////////////////////////////
|
||||
// Window size.
|
||||
window_width int
|
||||
window_height int
|
||||
// Window position.
|
||||
window_pos_x int
|
||||
window_pos_y int
|
||||
// Supported game modes.
|
||||
gamemodes map[string]string
|
||||
// Columns names for servers tabs.
|
||||
column_names map[string]string
|
||||
// Real columns positions on servers tabs.
|
||||
column_pos map[string]map[string]int
|
||||
//////////////////////////////////////////////////
|
||||
// Datas.
|
||||
//////////////////////////////////////////////////
|
||||
// Window size.
|
||||
window_width int
|
||||
window_height int
|
||||
// Window position.
|
||||
window_pos_x int
|
||||
window_pos_y int
|
||||
// Supported game modes.
|
||||
gamemodes map[string]string
|
||||
// Columns names for servers tabs.
|
||||
column_names map[string]string
|
||||
// Real columns positions on servers tabs.
|
||||
column_pos map[string]map[string]int
|
||||
}
|
||||
|
||||
func (m *MainWindow) close(a bool) {
|
||||
fmt.Println("Closing URTrator...")
|
||||
m.app.Quit()
|
||||
fmt.Println("Closing URTrator...")
|
||||
m.app.Quit()
|
||||
}
|
||||
|
||||
func (m *MainWindow) dropDatabasesData(bool) {
|
||||
fmt.Println("About to drop databases data...")
|
||||
fmt.Println("About to drop databases data...")
|
||||
}
|
||||
|
||||
func (m *MainWindow) showAboutDialog(a bool) {
|
||||
fmt.Println("Showing about dialog...")
|
||||
fmt.Println("Showing about dialog...")
|
||||
}
|
||||
|
||||
func (m *MainWindow) showAboutQtDialog(a bool) {
|
||||
fmt.Println("Showing about Qt dialog...")
|
||||
widgets.QMessageBox_AboutQt(m.window, "About Qt")
|
||||
fmt.Println("Showing about Qt dialog...")
|
||||
widgets.QMessageBox_AboutQt(m.window, "About Qt")
|
||||
}
|
||||
|
||||
|
||||
func (m *MainWindow) showOptionsDialog(a bool) {
|
||||
fmt.Println("Showing options dialog...")
|
||||
fmt.Println("Showing options dialog...")
|
||||
}
|
||||
|
||||
func (m *MainWindow) splitterMoved(pos int, index int) {
|
||||
fmt.Println("Splitter moved!")
|
||||
fmt.Println(index, pos)
|
||||
fmt.Println("Splitter moved!")
|
||||
fmt.Println(index, pos)
|
||||
}
|
||||
|
@ -10,336 +10,336 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
"fmt"
|
||||
"os"
|
||||
//"runtime"
|
||||
"sort"
|
||||
"strconv"
|
||||
// stdlib
|
||||
"fmt"
|
||||
"os"
|
||||
//"runtime"
|
||||
"sort"
|
||||
"strconv"
|
||||
|
||||
// local
|
||||
"github.com/pztrn/urtrator/common"
|
||||
// local
|
||||
"github.com/pztrn/urtrator/common"
|
||||
|
||||
// Qt5
|
||||
"github.com/therecipe/qt/core"
|
||||
"github.com/therecipe/qt/widgets"
|
||||
// Qt5
|
||||
"github.com/therecipe/qt/core"
|
||||
"github.com/therecipe/qt/widgets"
|
||||
)
|
||||
|
||||
func (m *MainWindow) Initialize() {
|
||||
fmt.Println("Initializing main window...")
|
||||
fmt.Println("Initializing main window...")
|
||||
|
||||
m.app = widgets.NewQApplication(len(os.Args), os.Args)
|
||||
m.app = widgets.NewQApplication(len(os.Args), os.Args)
|
||||
|
||||
m.initializeStorages()
|
||||
m.initializeStorages()
|
||||
|
||||
m.window = widgets.NewQMainWindow(nil, 0)
|
||||
m.window.SetWindowTitle("URTrator")
|
||||
m.window = widgets.NewQMainWindow(nil, 0)
|
||||
m.window.SetWindowTitle("URTrator")
|
||||
|
||||
// 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)
|
||||
// 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)
|
||||
|
||||
// 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.SetGeometry2(win_pos_x, win_pos_y, 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.SetGeometry2(win_pos_x, win_pos_y, m.window_width, m.window_height)
|
||||
|
||||
m.initializeMenu()
|
||||
m.initializeMenu()
|
||||
|
||||
// Central widget.
|
||||
cv := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
//cv_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__DefaultType)
|
||||
//cv.SetSizePolicy(cv_policy)
|
||||
m.window.SetCentralWidget(cv)
|
||||
// Central widget.
|
||||
cv := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
//cv_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__DefaultType)
|
||||
//cv.SetSizePolicy(cv_policy)
|
||||
m.window.SetCentralWidget(cv)
|
||||
|
||||
// Main vertical box.
|
||||
m.vbox = widgets.NewQVBoxLayout()
|
||||
m.vbox.SetContentsMargins(4, 4, 4, 4)
|
||||
cv.SetLayout(m.vbox)
|
||||
// Main vertical box.
|
||||
m.vbox = widgets.NewQVBoxLayout()
|
||||
m.vbox.SetContentsMargins(4, 4, 4, 4)
|
||||
cv.SetLayout(m.vbox)
|
||||
|
||||
m.initializeToolbar()
|
||||
m.initializeTabs()
|
||||
m.initializeSidebar()
|
||||
m.initializeToolbar()
|
||||
m.initializeTabs()
|
||||
m.initializeSidebar()
|
||||
|
||||
m.window.Show()
|
||||
m.window.Show()
|
||||
|
||||
// Restore splitter 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)
|
||||
new_splitter_pos := m.window_width - pane_negative_pos
|
||||
fmt.Println(new_splitter_pos)
|
||||
m.splitter.MoveSplitter(new_splitter_pos, 1)
|
||||
fmt.Println(m.splitter.ClosestLegalPosition(1, new_splitter_pos))
|
||||
} else {
|
||||
g := m.window.Geometry()
|
||||
w := g.Width()
|
||||
m.splitter.MoveSplitter(w - 150, 1)
|
||||
}
|
||||
// Restore splitter 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)
|
||||
new_splitter_pos := m.window_width - pane_negative_pos
|
||||
fmt.Println(new_splitter_pos)
|
||||
m.splitter.MoveSplitter(new_splitter_pos, 1)
|
||||
fmt.Println(m.splitter.ClosestLegalPosition(1, new_splitter_pos))
|
||||
} else {
|
||||
g := m.window.Geometry()
|
||||
w := g.Width()
|
||||
m.splitter.MoveSplitter(w-150, 1)
|
||||
}
|
||||
|
||||
m.splitter.ConnectSplitterMoved(m.splitterMoved)
|
||||
m.splitter.ConnectSplitterMoved(m.splitterMoved)
|
||||
|
||||
widgets.QApplication_Exec()
|
||||
widgets.QApplication_Exec()
|
||||
}
|
||||
|
||||
func (m *MainWindow) initializeSidebar() {
|
||||
sidebar_widget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
m.splitter.AddWidget(sidebar_widget)
|
||||
sidebar_widget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
m.splitter.AddWidget(sidebar_widget)
|
||||
|
||||
sidebar_layout := widgets.NewQVBoxLayout()
|
||||
sidebar_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
sidebar_widget.SetLayout(sidebar_layout)
|
||||
sidebar_layout := widgets.NewQVBoxLayout()
|
||||
sidebar_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
sidebar_widget.SetLayout(sidebar_layout)
|
||||
|
||||
// Server's information list.
|
||||
m.sidebar_server_info = widgets.NewQTreeView(nil)
|
||||
sidebar_layout.AddWidget(m.sidebar_server_info, 0, core.Qt__AlignHCenter & core.Qt__AlignTop)
|
||||
// Server's information list.
|
||||
m.sidebar_server_info = widgets.NewQTreeView(nil)
|
||||
sidebar_layout.AddWidget(m.sidebar_server_info, 0, core.Qt__AlignHCenter&core.Qt__AlignTop)
|
||||
|
||||
// Server's players widget.
|
||||
m.sidebar_server_players = widgets.NewQTreeView(nil)
|
||||
sidebar_layout.AddWidget(m.sidebar_server_players, 0, core.Qt__AlignHCenter & core.Qt__AlignTop)
|
||||
// Server's players widget.
|
||||
m.sidebar_server_players = widgets.NewQTreeView(nil)
|
||||
sidebar_layout.AddWidget(m.sidebar_server_players, 0, core.Qt__AlignHCenter&core.Qt__AlignTop)
|
||||
|
||||
// Add spacer.
|
||||
spacer := widgets.NewQSpacerItem(6, 6, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Expanding)
|
||||
sidebar_layout.AddSpacerItem(spacer)
|
||||
// Add spacer.
|
||||
spacer := widgets.NewQSpacerItem(6, 6, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Expanding)
|
||||
sidebar_layout.AddSpacerItem(spacer)
|
||||
}
|
||||
|
||||
func (m *MainWindow) initializeStorages() {
|
||||
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",
|
||||
}
|
||||
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": "Name",
|
||||
"3": "Mode",
|
||||
"4": "Map",
|
||||
"5": "Players",
|
||||
"6": "Ping",
|
||||
"7": "Version",
|
||||
"8": "IP",
|
||||
}
|
||||
// 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": "Name",
|
||||
"3": "Mode",
|
||||
"4": "Map",
|
||||
"5": "Players",
|
||||
"6": "Ping",
|
||||
"7": "Version",
|
||||
"8": "IP",
|
||||
}
|
||||
// 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)
|
||||
}
|
||||
|
||||
func (m *MainWindow) initializeTabs() {
|
||||
m.splitter = widgets.NewQSplitter(nil)
|
||||
m.splitter.SetOrientation(core.Qt__Horizontal)
|
||||
m.vbox.AddWidget(m.splitter, 0, core.Qt__AlignHCenter & core.Qt__AlignTop)
|
||||
m.splitter = widgets.NewQSplitter(nil)
|
||||
m.splitter.SetOrientation(core.Qt__Horizontal)
|
||||
m.vbox.AddWidget(m.splitter, 0, core.Qt__AlignHCenter&core.Qt__AlignTop)
|
||||
|
||||
m.tabs = widgets.NewQTabWidget(nil)
|
||||
m.splitter.AddWidget(m.tabs)
|
||||
m.tabs = widgets.NewQTabWidget(nil)
|
||||
m.splitter.AddWidget(m.tabs)
|
||||
|
||||
// Default size policy for filters widget.
|
||||
filters_size_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__DefaultType)
|
||||
// Default size policy for filters widget.
|
||||
filters_size_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__DefaultType)
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Servers page.
|
||||
//////////////////////////////////////////////////
|
||||
serverspagewidget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
serverspagewidget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__DefaultType)
|
||||
serverspagewidget.SetSizePolicy(serverspagewidget_policy)
|
||||
m.tabs.AddTab(serverspagewidget, ctx.Translator.Translate("Servers", nil))
|
||||
serverspagewidget_layout := widgets.NewQHBoxLayout()
|
||||
serverspagewidget_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
serverspagewidget.SetLayout(serverspagewidget_layout)
|
||||
//////////////////////////////////////////////////
|
||||
// Servers page.
|
||||
//////////////////////////////////////////////////
|
||||
serverspagewidget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
serverspagewidget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__DefaultType)
|
||||
serverspagewidget.SetSizePolicy(serverspagewidget_policy)
|
||||
m.tabs.AddTab(serverspagewidget, ctx.Translator.Translate("Servers", nil))
|
||||
serverspagewidget_layout := widgets.NewQHBoxLayout()
|
||||
serverspagewidget_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
serverspagewidget.SetLayout(serverspagewidget_layout)
|
||||
|
||||
// Servers list.
|
||||
m.all_servers = widgets.NewQTreeView(nil)
|
||||
serverspagewidget_layout.AddWidget(m.all_servers, 0, core.Qt__AlignLeft & core.Qt__AlignTop)
|
||||
// Servers list.
|
||||
m.all_servers = widgets.NewQTreeView(nil)
|
||||
serverspagewidget_layout.AddWidget(m.all_servers, 0, core.Qt__AlignLeft&core.Qt__AlignTop)
|
||||
|
||||
// Servers list filters widget.
|
||||
serverspagewidget_filters_widget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
serverspagewidget_filters_widget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__DefaultType)
|
||||
serverspagewidget_filters_widget.SetSizePolicy(serverspagewidget_filters_widget_policy)
|
||||
serverspagewidget_layout.AddWidget(serverspagewidget_filters_widget, 0, core.Qt__AlignRight & core.Qt__AlignTop)
|
||||
// Servers list filters widget.
|
||||
serverspagewidget_filters_widget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
serverspagewidget_filters_widget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__DefaultType)
|
||||
serverspagewidget_filters_widget.SetSizePolicy(serverspagewidget_filters_widget_policy)
|
||||
serverspagewidget_layout.AddWidget(serverspagewidget_filters_widget, 0, core.Qt__AlignRight&core.Qt__AlignTop)
|
||||
|
||||
// Servers list filters layout.
|
||||
serverspagewidget_filters_layout := widgets.NewQVBoxLayout()
|
||||
serverspagewidget_filters_widget.SetLayout(serverspagewidget_filters_layout)
|
||||
serverspagewidget_filters_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
// Servers list filters layout.
|
||||
serverspagewidget_filters_layout := widgets.NewQVBoxLayout()
|
||||
serverspagewidget_filters_widget.SetLayout(serverspagewidget_filters_layout)
|
||||
serverspagewidget_filters_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
|
||||
// Filters itself.
|
||||
// Filters itself.
|
||||
|
||||
// Hide offline servers checkbox.
|
||||
m.all_servers_hide_offline = widgets.NewQCheckBox(nil)
|
||||
m.all_servers_hide_offline.SetText(ctx.Translator.Translate("Hide offline servers", nil))
|
||||
m.all_servers_hide_offline.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_hide_offline, 0, core.Qt__AlignTop)
|
||||
// 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.SetCheckState(2)
|
||||
} else {
|
||||
if all_servers_hide_offline_cb_val == "1" {
|
||||
m.all_servers_hide_offline.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
// Hide offline servers checkbox.
|
||||
m.all_servers_hide_offline = widgets.NewQCheckBox(nil)
|
||||
m.all_servers_hide_offline.SetText(ctx.Translator.Translate("Hide offline servers", nil))
|
||||
m.all_servers_hide_offline.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_hide_offline, 0, core.Qt__AlignTop)
|
||||
// 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.SetCheckState(2)
|
||||
} else {
|
||||
if all_servers_hide_offline_cb_val == "1" {
|
||||
m.all_servers_hide_offline.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
|
||||
// Hide private servers.
|
||||
m.all_servers_hide_private = widgets.NewQCheckBox(nil)
|
||||
m.all_servers_hide_private.SetText(ctx.Translator.Translate("Hide private servers", nil))
|
||||
m.all_servers_hide_private.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_hide_private, 0, core.Qt__AlignTop)
|
||||
// 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.SetCheckState(2)
|
||||
} else {
|
||||
if all_servers_hide_private_cb_val == "1" {
|
||||
m.all_servers_hide_private.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
// Hide private servers.
|
||||
m.all_servers_hide_private = widgets.NewQCheckBox(nil)
|
||||
m.all_servers_hide_private.SetText(ctx.Translator.Translate("Hide private servers", nil))
|
||||
m.all_servers_hide_private.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_hide_private, 0, core.Qt__AlignTop)
|
||||
// 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.SetCheckState(2)
|
||||
} else {
|
||||
if all_servers_hide_private_cb_val == "1" {
|
||||
m.all_servers_hide_private.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
|
||||
// Game version.
|
||||
m.all_servers_version = widgets.NewQComboBox(nil)
|
||||
m.all_servers_version.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_version, 0, core.Qt__AlignTop)
|
||||
// Fill game version combobox with supported versions.
|
||||
m.all_servers_version.AddItems(common.SUPPORTED_URT_VERSIONS)
|
||||
// Game version.
|
||||
m.all_servers_version = widgets.NewQComboBox(nil)
|
||||
m.all_servers_version.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_version, 0, core.Qt__AlignTop)
|
||||
// Fill game version combobox with supported versions.
|
||||
m.all_servers_version.AddItems(common.SUPPORTED_URT_VERSIONS)
|
||||
|
||||
// Game mode.
|
||||
m.all_servers_gamemode = widgets.NewQComboBox(nil)
|
||||
m.all_servers_gamemode.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_gamemode, 0, core.Qt__AlignTop)
|
||||
// Fill game mode with supported gamemodes.
|
||||
// First - create sorted gamemodes keys slice.
|
||||
gm_keys := make([]int, 0, len(m.gamemodes))
|
||||
for k, _ := range m.gamemodes {
|
||||
ki, _ := strconv.Atoi(k)
|
||||
gm_keys = append(gm_keys, ki)
|
||||
}
|
||||
sort.Ints(gm_keys)
|
||||
// Create a strings slice with gamemodes, using sorted keys.
|
||||
gmodes := make([]string, 0, len(m.gamemodes))
|
||||
// Add "All gamemodes" as first gamemode :)
|
||||
gmodes = append(gmodes, ctx.Translator.Translate("All gamemodes", nil))
|
||||
for i := range gm_keys {
|
||||
ks := strconv.Itoa(gm_keys[i])
|
||||
gmodes = append(gmodes, m.gamemodes[ks])
|
||||
}
|
||||
m.all_servers_gamemode.AddItems(gmodes)
|
||||
// Game mode.
|
||||
m.all_servers_gamemode = widgets.NewQComboBox(nil)
|
||||
m.all_servers_gamemode.SetSizePolicy(filters_size_policy)
|
||||
serverspagewidget_filters_layout.AddWidget(m.all_servers_gamemode, 0, core.Qt__AlignTop)
|
||||
// Fill game mode with supported gamemodes.
|
||||
// First - create sorted gamemodes keys slice.
|
||||
gm_keys := make([]int, 0, len(m.gamemodes))
|
||||
for k, _ := range m.gamemodes {
|
||||
ki, _ := strconv.Atoi(k)
|
||||
gm_keys = append(gm_keys, ki)
|
||||
}
|
||||
sort.Ints(gm_keys)
|
||||
// Create a strings slice with gamemodes, using sorted keys.
|
||||
gmodes := make([]string, 0, len(m.gamemodes))
|
||||
// Add "All gamemodes" as first gamemode :)
|
||||
gmodes = append(gmodes, ctx.Translator.Translate("All gamemodes", nil))
|
||||
for i := range gm_keys {
|
||||
ks := strconv.Itoa(gm_keys[i])
|
||||
gmodes = append(gmodes, m.gamemodes[ks])
|
||||
}
|
||||
m.all_servers_gamemode.AddItems(gmodes)
|
||||
|
||||
// After creating filters - add spacer to move them on top of widget.
|
||||
all_servers_filters_spacer := widgets.NewQSpacerItem(6, 6, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Expanding)
|
||||
serverspagewidget_filters_layout.AddSpacerItem(all_servers_filters_spacer)
|
||||
// After creating filters - add spacer to move them on top of widget.
|
||||
all_servers_filters_spacer := widgets.NewQSpacerItem(6, 6, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Expanding)
|
||||
serverspagewidget_filters_layout.AddSpacerItem(all_servers_filters_spacer)
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Favorites page.
|
||||
//////////////////////////////////////////////////
|
||||
favoritespagewidget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
favoritespagewidget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__DefaultType)
|
||||
favoritespagewidget.SetSizePolicy(favoritespagewidget_policy)
|
||||
m.tabs.AddTab(favoritespagewidget, ctx.Translator.Translate("Favorites", nil))
|
||||
favoritespagewidget_layout := widgets.NewQHBoxLayout()
|
||||
favoritespagewidget_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
favoritespagewidget.SetLayout(favoritespagewidget_layout)
|
||||
//////////////////////////////////////////////////
|
||||
// Favorites page.
|
||||
//////////////////////////////////////////////////
|
||||
favoritespagewidget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
favoritespagewidget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Expanding, widgets.QSizePolicy__Expanding, widgets.QSizePolicy__DefaultType)
|
||||
favoritespagewidget.SetSizePolicy(favoritespagewidget_policy)
|
||||
m.tabs.AddTab(favoritespagewidget, ctx.Translator.Translate("Favorites", nil))
|
||||
favoritespagewidget_layout := widgets.NewQHBoxLayout()
|
||||
favoritespagewidget_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
favoritespagewidget.SetLayout(favoritespagewidget_layout)
|
||||
|
||||
// Favorites list.
|
||||
m.fav_servers = widgets.NewQTreeView(nil)
|
||||
favoritespagewidget_layout.AddWidget(m.fav_servers, 0, core.Qt__AlignHCenter & core.Qt__AlignTop)
|
||||
// Favorites list.
|
||||
m.fav_servers = widgets.NewQTreeView(nil)
|
||||
favoritespagewidget_layout.AddWidget(m.fav_servers, 0, core.Qt__AlignHCenter&core.Qt__AlignTop)
|
||||
|
||||
// Favorites list filters widget.
|
||||
favoritespagewidget_filters_widget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
favoritespagewidget_filters_widget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__DefaultType)
|
||||
favoritespagewidget_filters_widget.SetSizePolicy(favoritespagewidget_filters_widget_policy)
|
||||
favoritespagewidget_layout.AddWidget(favoritespagewidget_filters_widget, 0, core.Qt__AlignRight & core.Qt__AlignTop)
|
||||
// Favorites list filters widget.
|
||||
favoritespagewidget_filters_widget := widgets.NewQWidget(nil, core.Qt__Widget)
|
||||
favoritespagewidget_filters_widget_policy := widgets.NewQSizePolicy2(widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__DefaultType)
|
||||
favoritespagewidget_filters_widget.SetSizePolicy(favoritespagewidget_filters_widget_policy)
|
||||
favoritespagewidget_layout.AddWidget(favoritespagewidget_filters_widget, 0, core.Qt__AlignRight&core.Qt__AlignTop)
|
||||
|
||||
// Favorites list filters layout.
|
||||
favoritespagewidget_filters_layout := widgets.NewQVBoxLayout()
|
||||
favoritespagewidget_filters_widget.SetLayout(favoritespagewidget_filters_layout)
|
||||
favoritespagewidget_filters_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
// Favorites list filters layout.
|
||||
favoritespagewidget_filters_layout := widgets.NewQVBoxLayout()
|
||||
favoritespagewidget_filters_widget.SetLayout(favoritespagewidget_filters_layout)
|
||||
favoritespagewidget_filters_layout.SetContentsMargins(4, 4, 4, 4)
|
||||
|
||||
// Filters itself.
|
||||
// Filters itself.
|
||||
|
||||
// Hide offline servers checkbox.
|
||||
m.fav_servers_hide_offline = widgets.NewQCheckBox(nil)
|
||||
m.fav_servers_hide_offline.SetText(ctx.Translator.Translate("Hide offline servers", nil))
|
||||
m.fav_servers_hide_offline.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_hide_offline, 0, core.Qt__AlignTop)
|
||||
// Restore it's value.
|
||||
favorite_servers_hide_offline_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"]
|
||||
if !ok {
|
||||
m.fav_servers_hide_offline.SetCheckState(2)
|
||||
} else {
|
||||
if favorite_servers_hide_offline_cb_val == "1" {
|
||||
m.fav_servers_hide_offline.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
// Hide offline servers checkbox.
|
||||
m.fav_servers_hide_offline = widgets.NewQCheckBox(nil)
|
||||
m.fav_servers_hide_offline.SetText(ctx.Translator.Translate("Hide offline servers", nil))
|
||||
m.fav_servers_hide_offline.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_hide_offline, 0, core.Qt__AlignTop)
|
||||
// Restore it's value.
|
||||
favorite_servers_hide_offline_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_offline"]
|
||||
if !ok {
|
||||
m.fav_servers_hide_offline.SetCheckState(2)
|
||||
} else {
|
||||
if favorite_servers_hide_offline_cb_val == "1" {
|
||||
m.fav_servers_hide_offline.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
|
||||
// Hide private servers.
|
||||
m.fav_servers_hide_private = widgets.NewQCheckBox(nil)
|
||||
m.fav_servers_hide_private.SetText(ctx.Translator.Translate("Hide private servers", nil))
|
||||
m.fav_servers_hide_private.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_hide_private, 0, core.Qt__AlignTop)
|
||||
fav_servers_hide_private_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_private"]
|
||||
if !ok {
|
||||
m.fav_servers_hide_private.SetCheckState(2)
|
||||
} else {
|
||||
if fav_servers_hide_private_cb_val == "1" {
|
||||
m.fav_servers_hide_private.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
// Hide private servers.
|
||||
m.fav_servers_hide_private = widgets.NewQCheckBox(nil)
|
||||
m.fav_servers_hide_private.SetText(ctx.Translator.Translate("Hide private servers", nil))
|
||||
m.fav_servers_hide_private.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_hide_private, 0, core.Qt__AlignTop)
|
||||
fav_servers_hide_private_cb_val, ok := ctx.Cfg.Cfg["/serverslist/favorite/hide_private"]
|
||||
if !ok {
|
||||
m.fav_servers_hide_private.SetCheckState(2)
|
||||
} else {
|
||||
if fav_servers_hide_private_cb_val == "1" {
|
||||
m.fav_servers_hide_private.SetCheckState(2)
|
||||
}
|
||||
}
|
||||
|
||||
// Game version.
|
||||
m.fav_servers_version = widgets.NewQComboBox(nil)
|
||||
m.fav_servers_version.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_version, 0, core.Qt__AlignTop)
|
||||
// Fill game version combobox with supported versions.
|
||||
m.fav_servers_version.AddItems(common.SUPPORTED_URT_VERSIONS)
|
||||
// Game version.
|
||||
m.fav_servers_version = widgets.NewQComboBox(nil)
|
||||
m.fav_servers_version.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_version, 0, core.Qt__AlignTop)
|
||||
// Fill game version combobox with supported versions.
|
||||
m.fav_servers_version.AddItems(common.SUPPORTED_URT_VERSIONS)
|
||||
|
||||
// Game mode.
|
||||
m.fav_servers_gamemode = widgets.NewQComboBox(nil)
|
||||
m.fav_servers_gamemode.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_gamemode, 0, core.Qt__AlignTop)
|
||||
// Fill game mode with supported gamemodes.
|
||||
// As we have previously created this list - reuse it.
|
||||
m.fav_servers_gamemode.AddItems(gmodes)
|
||||
// Game mode.
|
||||
m.fav_servers_gamemode = widgets.NewQComboBox(nil)
|
||||
m.fav_servers_gamemode.SetSizePolicy(filters_size_policy)
|
||||
favoritespagewidget_filters_layout.AddWidget(m.fav_servers_gamemode, 0, core.Qt__AlignTop)
|
||||
// Fill game mode with supported gamemodes.
|
||||
// As we have previously created this list - reuse it.
|
||||
m.fav_servers_gamemode.AddItems(gmodes)
|
||||
|
||||
// After creating filters - add spacer to move them on top of widget.
|
||||
fav_servers_filters_spacer := widgets.NewQSpacerItem(6, 6, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Expanding)
|
||||
favoritespagewidget_filters_layout.AddSpacerItem(fav_servers_filters_spacer)
|
||||
// After creating filters - add spacer to move them on top of widget.
|
||||
fav_servers_filters_spacer := widgets.NewQSpacerItem(6, 6, widgets.QSizePolicy__Minimum, widgets.QSizePolicy__Expanding)
|
||||
favoritespagewidget_filters_layout.AddSpacerItem(fav_servers_filters_spacer)
|
||||
}
|
||||
|
||||
func (m *MainWindow) initializeToolbar() {
|
||||
m.toolbar = widgets.NewQToolBar("Main Toolbar", m.window)
|
||||
m.window.AddToolBar(core.Qt__TopToolBarArea, m.toolbar)
|
||||
m.toolbar = widgets.NewQToolBar("Main Toolbar", m.window)
|
||||
m.window.AddToolBar(core.Qt__TopToolBarArea, m.toolbar)
|
||||
}
|
||||
|
@ -12,61 +12,61 @@
|
||||
package ui
|
||||
|
||||
import (
|
||||
// stdlib
|
||||
//"fmt"
|
||||
//"os"
|
||||
//"runtime"
|
||||
// stdlib
|
||||
//"fmt"
|
||||
//"os"
|
||||
//"runtime"
|
||||
|
||||
// Qt5
|
||||
"github.com/therecipe/qt/widgets"
|
||||
// Qt5
|
||||
"github.com/therecipe/qt/widgets"
|
||||
)
|
||||
|
||||
func (m *MainWindow) initializeMenu() {
|
||||
m.mainmenu = widgets.NewQMenuBar(nil)
|
||||
m.mainmenu = widgets.NewQMenuBar(nil)
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// File menu.
|
||||
//////////////////////////////////////////////////
|
||||
filemenu := widgets.NewQMenu2("&File", nil)
|
||||
//////////////////////////////////////////////////
|
||||
// File menu.
|
||||
//////////////////////////////////////////////////
|
||||
filemenu := widgets.NewQMenu2("&File", nil)
|
||||
|
||||
// Options action.
|
||||
file_options := filemenu.AddAction("&Options")
|
||||
file_options.SetMenuRole(widgets.QAction__PreferencesRole)
|
||||
file_options.ConnectTriggered(m.showOptionsDialog)
|
||||
// Options action.
|
||||
file_options := filemenu.AddAction("&Options")
|
||||
file_options.SetMenuRole(widgets.QAction__PreferencesRole)
|
||||
file_options.ConnectTriggered(m.showOptionsDialog)
|
||||
|
||||
// Separator :)
|
||||
filemenu.AddSeparator()
|
||||
// Separator :)
|
||||
filemenu.AddSeparator()
|
||||
|
||||
// Exit URTrator.
|
||||
file_exit := filemenu.AddAction("&Exit")
|
||||
file_exit.SetMenuRole(widgets.QAction__QuitRole)
|
||||
file_exit.ConnectTriggered(m.close)
|
||||
// Exit URTrator.
|
||||
file_exit := filemenu.AddAction("&Exit")
|
||||
file_exit.SetMenuRole(widgets.QAction__QuitRole)
|
||||
file_exit.ConnectTriggered(m.close)
|
||||
|
||||
m.mainmenu.AddMenu(filemenu)
|
||||
//////////////////////////////////////////////////
|
||||
// About menu
|
||||
//////////////////////////////////////////////////
|
||||
aboutmenu := widgets.NewQMenu2("&Help", nil)
|
||||
m.mainmenu.AddMenu(filemenu)
|
||||
//////////////////////////////////////////////////
|
||||
// About menu
|
||||
//////////////////////////////////////////////////
|
||||
aboutmenu := widgets.NewQMenu2("&Help", nil)
|
||||
|
||||
// About URTrator.
|
||||
about_about := aboutmenu.AddAction("&About URTrator...")
|
||||
about_about.SetMenuRole(widgets.QAction__AboutRole)
|
||||
about_about.ConnectTriggered(m.showAboutDialog)
|
||||
// About URTrator.
|
||||
about_about := aboutmenu.AddAction("&About URTrator...")
|
||||
about_about.SetMenuRole(widgets.QAction__AboutRole)
|
||||
about_about.ConnectTriggered(m.showAboutDialog)
|
||||
|
||||
// About Qt.
|
||||
about_about_qt := aboutmenu.AddAction("About &Qt...")
|
||||
about_about_qt.SetMenuRole(widgets.QAction__AboutQtRole)
|
||||
about_about_qt.ConnectTriggered(m.showAboutQtDialog)
|
||||
// About Qt.
|
||||
about_about_qt := aboutmenu.AddAction("About &Qt...")
|
||||
about_about_qt.SetMenuRole(widgets.QAction__AboutQtRole)
|
||||
about_about_qt.ConnectTriggered(m.showAboutQtDialog)
|
||||
|
||||
// Separator :)
|
||||
aboutmenu.AddSeparator()
|
||||
// Separator :)
|
||||
aboutmenu.AddSeparator()
|
||||
|
||||
// Drop database data.
|
||||
about_drop_database := aboutmenu.AddAction("&Drop database...")
|
||||
//about_drop_database.SetMenuRole(widgets.QAction__ApplicationSpecificRole)
|
||||
about_drop_database.ConnectTriggered(m.dropDatabasesData)
|
||||
// Drop database data.
|
||||
about_drop_database := aboutmenu.AddAction("&Drop database...")
|
||||
//about_drop_database.SetMenuRole(widgets.QAction__ApplicationSpecificRole)
|
||||
about_drop_database.ConnectTriggered(m.dropDatabasesData)
|
||||
|
||||
m.mainmenu.AddMenu(aboutmenu)
|
||||
m.mainmenu.AddMenu(aboutmenu)
|
||||
|
||||
m.window.SetMenuBar(m.mainmenu)
|
||||
m.window.SetMenuBar(m.mainmenu)
|
||||
}
|
||||
|
Reference in New Issue
Block a user