2016-10-04 15:42:36 +05:00
// URTator - Urban Terror server browser and game launcher, written in
// Go.
//
// Copyright (c) 2016, Stanslav N. a.k.a pztrn (or p0z1tr0n)
// All rights reserved.
//
// Licensed under Terms and Conditions of GNU General Public License
// version 3 or any higher.
// ToDo: put full text of license here.
package ui
import (
// stdlib
"fmt"
2016-10-11 00:14:00 +05:00
"runtime"
2016-10-04 15:42:36 +05:00
"strconv"
2016-10-04 23:39:32 +05:00
"strings"
2016-10-04 15:42:36 +05:00
// Local
"github.com/pztrn/urtrator/datamodels"
2016-10-06 20:48:35 +05:00
"github.com/pztrn/urtrator/ioq3dataparser"
2016-10-04 15:42:36 +05:00
// Other
2016-10-07 22:21:19 +05:00
"github.com/mattn/go-gtk/gdkpixbuf"
2016-10-04 15:42:36 +05:00
"github.com/mattn/go-gtk/glib"
"github.com/mattn/go-gtk/gtk"
)
type MainWindow struct {
// Gamemodes.
gamemodes map [ string ] string
2016-10-10 19:16:51 +05:00
text string
2016-10-04 15:42:36 +05:00
// Widgets.
// The window itself.
window * gtk . Window
// Vertical Box.
vbox * gtk . VBox
// Main menu.
menubar * gtk . MenuBar
// Toolbar
toolbar * gtk . Toolbar
// Horizontal box for main window.
hpane * gtk . HPaned
// Tab widget.
tab_widget * gtk . Notebook
// Tabs list.
tabs map [ string ] * gtk . Frame
// All servers widget.
all_servers * gtk . TreeView
// Favorite servers widget.
fav_servers * gtk . TreeView
// Statusbar.
statusbar * gtk . Statusbar
// Statusbar context ID.
statusbar_context_id uint
// Profiles combobox.
profiles * gtk . ComboBoxText
// Checkbox for hiding/showing offline servers in 'Servers' tab list.
all_servers_hide_offline * gtk . CheckButton
// Checkbox for hiding/showing offline servers in 'Favorites' tab list.
fav_servers_hide_offline * gtk . CheckButton
// Game launch button.
launch_button * gtk . Button
2016-10-06 20:48:35 +05:00
// Server's information.
server_info * gtk . TreeView
2016-10-04 23:39:32 +05:00
// Quick connect: server address
qc_server_address * gtk . Entry
// Quick connect: password
qc_password * gtk . Entry
2016-10-08 19:57:33 +05:00
// Quick connect: nickname
qc_nickname * gtk . Entry
2016-10-05 01:03:46 +05:00
// Tray icon.
tray_icon * gtk . StatusIcon
// Tray menu.
tray_menu * gtk . Menu
2016-10-06 17:50:08 +05:00
// Toolbar's label.
toolbar_label * gtk . Label
2016-10-04 15:42:36 +05:00
// Storages.
// All servers store.
all_servers_store * gtk . ListStore
// All servers sortable store.
all_servers_store_sortable * gtk . TreeSortable
// Favorites
fav_servers_store * gtk . ListStore
2016-10-06 20:48:35 +05:00
// Server's information store.
server_info_store * gtk . ListStore
2016-10-04 15:42:36 +05:00
// Dialogs.
options_dialog * OptionsDialog
// Other
// Old profiles count.
old_profiles_count int
2016-10-05 02:16:02 +05:00
// Window size.
window_width int
window_height int
// Window position.
window_pos_x int
window_pos_y int
// Main pane delimiter position. It is calculated like:
//
// window_width - pane_position
//
// so we will get same right pane width even if we will resize
// main window. On resize and restore it will be set like:
//
// window_width - m.pane_negative_position
pane_negative_position int
2016-10-07 21:14:48 +05:00
// Columns names for servers tabs.
column_names map [ string ] string
// Real columns positions on servers tabs.
column_pos map [ string ] map [ string ] int
2016-10-05 02:16:02 +05:00
2016-10-07 22:21:19 +05:00
// Resources.
// Pixbufs.
// For unavailable (e.g. offline) server.
server_offline_pic * gdkpixbuf . Pixbuf
// For online server.
server_online_pic * gdkpixbuf . Pixbuf
// For private (passworded) server.
2016-11-22 02:15:07 +05:00
server_private_pic * gdkpixbuf . Pixbuf
2016-10-07 22:21:19 +05:00
// For public server
server_public_pic * gdkpixbuf . Pixbuf
2016-10-05 01:03:46 +05:00
// Flags.
// Window is hidden?
hidden bool
2016-10-04 15:42:36 +05:00
}
func ( m * MainWindow ) addToFavorites ( ) {
fmt . Println ( "Adding server to favorites..." )
2016-10-04 23:39:32 +05:00
current_tab := m . tab_widget . GetTabLabelText ( m . tab_widget . GetNthPage ( m . tab_widget . GetCurrentPage ( ) ) )
2016-10-09 01:23:38 +05:00
server_address := ""
if ! strings . Contains ( current_tab , "Favorites" ) {
server_address = m . getIpFromServersList ( current_tab )
}
2016-10-04 23:39:32 +05:00
// Getting server from database.
2016-10-09 01:29:46 +05:00
fd := & FavoriteDialog { }
2016-10-04 23:39:32 +05:00
if len ( server_address ) > 0 {
servers := [ ] datamodels . Server { }
address := strings . Split ( server_address , ":" ) [ 0 ]
port := strings . Split ( server_address , ":" ) [ 1 ]
err1 := ctx . Database . Db . Select ( & servers , ctx . Database . Db . Rebind ( "SELECT * FROM servers WHERE ip=? AND port=?" ) , address , port )
if err1 != nil {
fmt . Println ( err1 . Error ( ) )
}
2016-10-09 01:29:46 +05:00
fd . InitializeUpdate ( & servers [ 0 ] )
2016-10-04 23:39:32 +05:00
} else {
2016-10-09 01:29:46 +05:00
fd . InitializeNew ( )
2016-10-04 23:39:32 +05:00
}
2016-10-04 15:42:36 +05:00
}
2016-10-06 13:55:03 +05:00
// Executes when delimiter for two panes is moved, to calculate VALID
// position.
2016-10-05 02:16:02 +05:00
func ( m * MainWindow ) checkMainPanePosition ( ) {
2016-11-21 02:52:26 +05:00
glib . IdleAdd ( func ( ) bool {
2016-11-21 02:49:05 +05:00
m . pane_negative_position = m . window_width - m . hpane . GetPosition ( )
return false
} )
2016-10-05 02:16:02 +05:00
}
2016-10-06 13:55:03 +05:00
// Executes when main window is moved or resized.
// Also calculating pane delimiter position and set it to avoid
// widgets hell :).
2016-10-05 02:16:02 +05:00
func ( m * MainWindow ) checkPositionAndSize ( ) {
2016-11-21 02:52:26 +05:00
glib . IdleAdd ( func ( ) bool {
2016-11-21 02:49:05 +05:00
m . window . GetPosition ( & m . window_pos_x , & m . window_pos_y )
m . window . GetSize ( & m . window_width , & m . window_height )
2016-10-05 02:16:02 +05:00
2016-11-21 02:49:05 +05:00
m . hpane . SetPosition ( m . window_width - m . pane_negative_position )
return false
} )
2016-10-05 02:16:02 +05:00
}
2016-10-06 13:55:03 +05:00
// Executes on URTrator shutdown.
2016-10-04 15:42:36 +05:00
func ( m * MainWindow ) Close ( ) {
2016-10-05 02:16:02 +05:00
// Save window parameters.
ctx . Cfg . Cfg [ "/mainwindow/width" ] = strconv . Itoa ( m . window_width )
ctx . Cfg . Cfg [ "/mainwindow/height" ] = strconv . Itoa ( m . window_height )
ctx . Cfg . Cfg [ "/mainwindow/position_x" ] = strconv . Itoa ( m . window_pos_x )
ctx . Cfg . Cfg [ "/mainwindow/position_y" ] = strconv . Itoa ( m . window_pos_y )
ctx . Cfg . Cfg [ "/mainwindow/pane_negative_position" ] = strconv . Itoa ( m . pane_negative_position )
2016-10-07 21:14:48 +05:00
// Saving columns sizes and positions.
all_servers_columns := m . all_servers . GetColumns ( )
for i := range all_servers_columns {
ctx . Cfg . Cfg [ "/mainwindow/all_servers/" + all_servers_columns [ i ] . GetTitle ( ) + "_position" ] = strconv . Itoa ( i )
ctx . Cfg . Cfg [ "/mainwindow/all_servers/" + all_servers_columns [ i ] . GetTitle ( ) + "_width" ] = strconv . Itoa ( all_servers_columns [ i ] . GetWidth ( ) )
}
fav_servers_columns := m . fav_servers . GetColumns ( )
for i := range fav_servers_columns {
ctx . Cfg . Cfg [ "/mainwindow/fav_servers/" + fav_servers_columns [ i ] . GetTitle ( ) + "_position" ] = strconv . Itoa ( i )
ctx . Cfg . Cfg [ "/mainwindow/fav_servers/" + fav_servers_columns [ i ] . GetTitle ( ) + "_width" ] = strconv . Itoa ( fav_servers_columns [ i ] . GetWidth ( ) )
}
2016-10-11 00:14:00 +05:00
// Additional actions should be taken on Windows.
if runtime . GOOS == "windows" {
m . closeWin ( )
}
2016-10-04 15:42:36 +05:00
ctx . Close ( )
}
2016-10-12 19:23:10 +05:00
func ( m * MainWindow ) copyServerCredentialsToClipboard ( ) {
fmt . Println ( "Copying server's credentials to clipboard..." )
current_tab := m . tab_widget . GetTabLabelText ( m . tab_widget . GetNthPage ( m . tab_widget . GetCurrentPage ( ) ) )
server_address := m . getIpFromServersList ( current_tab )
ctx . Clipboard . CopyServerData ( server_address )
}
2016-10-06 13:55:03 +05:00
// Deleting server from favorites.
2016-10-04 23:39:32 +05:00
func ( m * MainWindow ) deleteFromFavorites ( ) {
fmt . Println ( "Removing server from favorites..." )
current_tab := m . tab_widget . GetTabLabelText ( m . tab_widget . GetNthPage ( m . tab_widget . GetCurrentPage ( ) ) )
2016-10-07 21:14:48 +05:00
server_address := m . getIpFromServersList ( current_tab )
2016-10-04 23:39:32 +05:00
var not_favorited bool = false
if len ( server_address ) > 0 {
2016-10-07 14:28:44 +05:00
if ctx . Cache . Servers [ server_address ] . Server . Favorite == "1" {
ctx . Cache . Servers [ server_address ] . Server . Favorite = "0"
2016-10-04 23:39:32 +05:00
} else {
not_favorited = true
}
} else {
not_favorited = true
}
if not_favorited {
2016-11-22 01:10:31 +05:00
// Temporary disable all these modals on Linux.
// See https://github.com/mattn/go-gtk/issues/289.
if runtime . GOOS != "linux" {
mbox_string := "Cannot delete server from favorites.\n\nServer isn't favorited."
d := gtk . NewMessageDialog ( m . window , gtk . DIALOG_MODAL , gtk . MESSAGE_INFO , gtk . BUTTONS_OK , mbox_string )
d . Response ( func ( ) {
d . Destroy ( )
} )
d . Run ( )
} else {
ctx . Eventer . LaunchEvent ( "setToolbarLabelText" , map [ string ] string { "text" : "<markup><span foreground=\"red\" font_weight=\"bold\">Server isn't favorited</span></markup>" } )
}
2016-10-04 23:39:32 +05:00
}
2016-10-07 14:28:44 +05:00
2016-10-08 19:57:33 +05:00
ctx . Eventer . LaunchEvent ( "loadFavoriteServers" , map [ string ] string { } )
2016-10-04 23:39:32 +05:00
}
2016-10-06 13:55:03 +05:00
// Drop database data.
// ToDo: extend so we should have an ability to decide what to drop.
2016-10-04 23:39:32 +05:00
func ( m * MainWindow ) dropDatabasesData ( ) {
fmt . Println ( "Dropping database data..." )
var will_continue bool = false
2016-11-22 01:10:31 +05:00
// Temporary disable all these modals on Linux.
// See https://github.com/mattn/go-gtk/issues/289.
if runtime . GOOS != "linux" {
mbox_string := "You are about to drop whole database data.\n\nAfter clicking \"YES\" ALL data in database (servers, profiles, settings, etc.)\nwill be lost FOREVER. Are you sure?"
d := gtk . NewMessageDialog ( m . window , gtk . DIALOG_MODAL , gtk . MESSAGE_WARNING , gtk . BUTTONS_YES_NO , mbox_string )
d . Connect ( "response" , func ( resp * glib . CallbackContext ) {
if resp . Args ( 0 ) == 4294967287 {
will_continue = false
} else {
will_continue = true
}
d . Destroy ( )
} )
d . Run ( )
} else {
ctx . Eventer . LaunchEvent ( "setToolbarLabelText" , map [ string ] string { "text" : "<markup><span foreground=\"red\" font_weight=\"bold\">Remove ~/.config/urtrator/database.sqlite3 manually!</span></markup>" } )
}
2016-10-04 23:39:32 +05:00
if will_continue {
ctx . Database . Db . MustExec ( "DELETE FROM servers" )
ctx . Database . Db . MustExec ( "DELETE FROM settings" )
ctx . Database . Db . MustExec ( "DELETE FROM urt_profiles" )
2016-10-08 19:57:33 +05:00
ctx . Eventer . LaunchEvent ( "loadProfiles" , map [ string ] string { } )
ctx . Eventer . LaunchEvent ( "loadAllServers" , map [ string ] string { } )
ctx . Eventer . LaunchEvent ( "loadFavoriteServers" , map [ string ] string { } )
2016-10-04 23:39:32 +05:00
}
}
2016-10-06 13:55:03 +05:00
// Executes on "Edit favorite server" click.
2016-10-05 00:04:24 +05:00
func ( m * MainWindow ) editFavorite ( ) {
fmt . Println ( "Editing favorite server..." )
2016-10-07 21:14:48 +05:00
server_address := m . getIpFromServersList ( "Favorites" )
2016-10-05 00:04:24 +05:00
if len ( server_address ) > 0 {
2016-10-07 14:28:44 +05:00
srv := ctx . Cache . Servers [ server_address ] . Server
2016-10-09 01:29:46 +05:00
fd := FavoriteDialog { }
fd . InitializeUpdate ( srv )
2016-10-05 00:04:24 +05:00
}
}
2016-10-06 13:55:03 +05:00
// Executes when "Hide offline servers" checkbox changed it's state on
// "Servers" tab.
2016-10-04 15:42:36 +05:00
func ( m * MainWindow ) hideOfflineAllServers ( ) {
fmt . Println ( "(Un)Hiding offline servers in 'Servers' tab..." )
2016-10-05 20:46:02 +05:00
if m . all_servers_hide_offline . GetActive ( ) {
ctx . Cfg . Cfg [ "/serverslist/all_servers/hide_offline" ] = "1"
} else {
ctx . Cfg . Cfg [ "/serverslist/all_servers/hide_offline" ] = "0"
}
2016-10-08 19:57:33 +05:00
ctx . Eventer . LaunchEvent ( "loadAllServers" , map [ string ] string { } )
2016-10-04 15:42:36 +05:00
}
2016-10-06 13:55:03 +05:00
// Executes when "Hide offline servers" checkbox changed it's state on
// "Favorites" tab.
2016-10-04 15:42:36 +05:00
func ( m * MainWindow ) hideOfflineFavoriteServers ( ) {
fmt . Println ( "(Un)Hiding offline servers in 'Favorite' tab..." )
2016-10-05 20:46:02 +05:00
if m . fav_servers_hide_offline . GetActive ( ) {
ctx . Cfg . Cfg [ "/serverslist/favorite/hide_offline" ] = "1"
} else {
ctx . Cfg . Cfg [ "/serverslist/favorite/hide_offline" ] = "0"
}
2016-10-08 19:57:33 +05:00
ctx . Eventer . LaunchEvent ( "loadFavoriteServers" , map [ string ] string { } )
2016-10-04 15:42:36 +05:00
}
2016-10-08 19:57:33 +05:00
func ( m * MainWindow ) loadAllServers ( data map [ string ] string ) {
2016-10-06 13:55:03 +05:00
fmt . Println ( "Loading all servers..." )
for _ , server := range ctx . Cache . Servers {
2016-10-06 22:43:45 +05:00
iter := new ( gtk . TreeIter )
2016-10-08 12:24:03 +05:00
ping , _ := strconv . Atoi ( server . Server . Ping )
2016-10-06 22:43:45 +05:00
2016-10-06 17:11:36 +05:00
if ! server . AllServersIterSet {
server . AllServersIter = iter
server . AllServersIterSet = true
2016-10-06 13:55:03 +05:00
} else {
2016-10-06 17:11:36 +05:00
iter = server . AllServersIter
2016-10-06 13:55:03 +05:00
}
2016-10-06 22:43:45 +05:00
2016-10-08 12:24:03 +05:00
if m . all_servers_hide_offline . GetActive ( ) && ( server . Server . Players == "" && server . Server . Maxplayers == "" || ping > 9000 ) {
2016-11-02 22:28:15 +05:00
if server . AllServersIterInList && server . AllServersIterSet {
2016-10-08 00:01:20 +05:00
m . all_servers_store . Remove ( iter )
server . AllServersIterInList = false
}
continue
2016-10-06 22:43:45 +05:00
}
2016-10-08 00:01:20 +05:00
if ! server . AllServersIterInList && server . AllServersIterSet {
m . all_servers_store . Append ( iter )
server . AllServersIterInList = true
2016-10-06 22:43:45 +05:00
}
2016-10-08 12:24:03 +05:00
if server . Server . Name == "" && server . Server . Players == "" {
2016-10-07 22:21:19 +05:00
m . all_servers_store . SetValue ( iter , 0 , m . server_offline_pic . GPixbuf )
2016-10-07 21:14:48 +05:00
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "IP" ] , server . Server . Ip + ":" + server . Server . Port )
2016-10-04 15:42:36 +05:00
} else {
2016-10-08 12:24:03 +05:00
if ping > 9000 {
m . all_servers_store . SetValue ( iter , 0 , m . server_offline_pic . GPixbuf )
} else {
m . all_servers_store . SetValue ( iter , 0 , m . server_online_pic . GPixbuf )
}
2016-10-07 14:28:44 +05:00
if server . Server . IsPrivate == "1" {
2016-11-22 02:15:07 +05:00
m . all_servers_store . SetValue ( iter , 1 , m . server_private_pic . GPixbuf )
2016-10-07 14:28:44 +05:00
} else {
2016-10-07 22:21:19 +05:00
m . all_servers_store . SetValue ( iter , 1 , m . server_public_pic . GPixbuf )
2016-10-07 14:28:44 +05:00
}
2016-10-06 22:43:45 +05:00
server_name := ctx . Colorizer . Fix ( server . Server . Name )
2016-10-07 21:14:48 +05:00
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "Name" ] , server_name )
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "Mode" ] , m . getGameModeName ( server . Server . Gamemode ) )
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "Map" ] , server . Server . Map )
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "Players" ] , server . Server . Players + "/" + server . Server . Maxplayers )
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "Ping" ] , server . Server . Ping )
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "Version" ] , server . Server . Version )
m . all_servers_store . SetValue ( iter , m . column_pos [ "Servers" ] [ "IP" ] , server . Server . Ip + ":" + server . Server . Port )
2016-10-04 15:42:36 +05:00
}
}
}
2016-10-08 19:57:33 +05:00
func ( m * MainWindow ) loadFavoriteServers ( data map [ string ] string ) {
2016-10-04 23:39:32 +05:00
fmt . Println ( "Loading favorite servers..." )
2016-10-06 13:55:03 +05:00
for _ , server := range ctx . Cache . Servers {
2016-10-06 17:11:36 +05:00
iter := new ( gtk . TreeIter )
2016-10-08 12:24:03 +05:00
ping , _ := strconv . Atoi ( server . Server . Ping )
2016-10-06 22:43:45 +05:00
2016-10-06 17:11:36 +05:00
if ! server . FavServersIterSet {
server . FavServersIter = iter
server . FavServersIterSet = true
2016-10-06 13:55:03 +05:00
} else {
2016-10-06 17:11:36 +05:00
iter = server . FavServersIter
2016-10-06 13:55:03 +05:00
}
2016-10-06 22:43:45 +05:00
2016-10-08 12:24:03 +05:00
if m . fav_servers_hide_offline . GetActive ( ) && ( server . Server . Players == "" && server . Server . Maxplayers == "" || ping > 9000 ) {
2016-10-08 00:01:20 +05:00
if server . FavServersIterInList {
m . fav_servers_store . Remove ( iter )
server . FavServersIterInList = false
}
continue
2016-10-06 22:43:45 +05:00
}
2016-10-08 00:01:20 +05:00
// If server on favorites widget, but not favorited (e.g. just
// removed from favorites) - remove it from list.
if server . Server . Favorite != "1" && server . FavServersIterSet && server . FavServersIterInList {
m . fav_servers_store . Remove ( server . FavServersIter )
2016-10-06 22:43:45 +05:00
server . FavServersIterInList = false
2016-10-08 00:01:20 +05:00
server . FavServersIterSet = false
}
// Server isn't in favorites and wasn't previously added to widget.
if server . Server . Favorite != "1" {
2016-10-06 22:43:45 +05:00
continue
}
2016-10-08 00:01:20 +05:00
if ! server . FavServersIterInList && server . FavServersIterSet {
m . fav_servers_store . Append ( iter )
server . FavServersIterInList = true
}
2016-10-06 22:43:45 +05:00
if server . Server . Name == "" && server . Server . Players == "" {
2016-10-07 22:21:19 +05:00
m . fav_servers_store . SetValue ( iter , 0 , m . server_offline_pic . GPixbuf )
2016-10-07 21:14:48 +05:00
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "IP" ] , server . Server . Ip + ":" + server . Server . Port )
2016-10-06 22:43:45 +05:00
} else {
2016-10-08 12:24:03 +05:00
if ping > 9000 {
m . fav_servers_store . SetValue ( iter , 0 , m . server_offline_pic . GPixbuf )
} else {
m . fav_servers_store . SetValue ( iter , 0 , m . server_online_pic . GPixbuf )
}
2016-10-07 14:28:44 +05:00
if server . Server . IsPrivate == "1" {
2016-11-22 02:15:07 +05:00
m . fav_servers_store . SetValue ( iter , 1 , m . server_private_pic . GPixbuf )
2016-10-07 14:28:44 +05:00
} else {
2016-10-07 22:21:19 +05:00
m . fav_servers_store . SetValue ( iter , 1 , m . server_public_pic . GPixbuf )
2016-10-07 14:28:44 +05:00
}
2016-10-06 17:11:36 +05:00
server_name := ctx . Colorizer . Fix ( server . Server . Name )
2016-10-07 21:14:48 +05:00
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "Name" ] , server_name )
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "Mode" ] , m . getGameModeName ( server . Server . Gamemode ) )
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "Map" ] , server . Server . Map )
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "Players" ] , server . Server . Players + "/" + server . Server . Maxplayers )
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "Ping" ] , server . Server . Ping )
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "Version" ] , server . Server . Version )
m . fav_servers_store . SetValue ( iter , m . column_pos [ "Favorites" ] [ "IP" ] , server . Server . Ip + ":" + server . Server . Port )
2016-10-04 23:39:32 +05:00
}
}
}
2016-10-08 19:57:33 +05:00
func ( m * MainWindow ) loadProfiles ( data map [ string ] string ) {
2016-10-04 23:39:32 +05:00
fmt . Println ( "Loading profiles into combobox on MainWindow" )
for i := 0 ; i < m . old_profiles_count ; i ++ {
// ComboBox indexes are shifting on element deletion, so we should
// detele very first element every time.
m . profiles . Remove ( 0 )
}
2016-10-08 19:57:33 +05:00
for _ , profile := range ctx . Cache . Profiles {
m . profiles . AppendText ( profile . Profile . Name )
2016-10-04 23:39:32 +05:00
}
2016-10-08 19:57:33 +05:00
m . old_profiles_count = len ( ctx . Cache . Profiles )
2016-10-04 23:39:32 +05:00
fmt . Println ( "Added " + strconv . Itoa ( m . old_profiles_count ) + " profiles" )
2016-11-22 18:33:53 +05:00
m . profiles . SetActive ( 0 )
2016-10-04 23:39:32 +05:00
}
2016-10-08 19:57:33 +05:00
func ( m * MainWindow ) serversUpdateCompleted ( data map [ string ] string ) {
ctx . Eventer . LaunchEvent ( "setToolbarLabelText" , map [ string ] string { "text" : "Servers updated." } )
}
2016-10-11 13:14:08 +05:00
func ( m * MainWindow ) setQuickConnectDetails ( data map [ string ] string ) {
fmt . Println ( "Setting quick connect data..." )
m . qc_server_address . SetText ( data [ "server" ] )
m . qc_password . SetText ( data [ "password" ] )
}
2016-10-08 19:57:33 +05:00
func ( m * MainWindow ) setToolbarLabelText ( data map [ string ] string ) {
fmt . Println ( "Setting toolbar's label text..." )
if strings . Contains ( data [ "text" ] , "<markup>" ) {
m . toolbar_label . SetMarkup ( data [ "text" ] )
} else {
m . toolbar_label . SetLabel ( data [ "text" ] )
}
2016-10-06 13:55:03 +05:00
}
2016-10-05 01:03:46 +05:00
func ( m * MainWindow ) showHide ( ) {
if m . hidden {
m . window . Show ( )
m . hidden = false
2016-10-05 02:16:02 +05:00
// Set window position on restore. Window loosing it on
// multimonitor configurations.
m . window . Move ( m . window_pos_x , m . window_pos_y )
2016-10-05 01:03:46 +05:00
} else {
m . window . Hide ( )
m . hidden = true
}
}
2016-10-06 20:48:35 +05:00
func ( m * MainWindow ) showServerInformation ( ) {
fmt . Println ( "Showing server's information..." )
}
func ( m * MainWindow ) showShortServerInformation ( ) {
fmt . Println ( "Server selection changed, updating server's information widget..." )
m . server_info_store . Clear ( )
current_tab := m . tab_widget . GetTabLabelText ( m . tab_widget . GetNthPage ( m . tab_widget . GetCurrentPage ( ) ) )
2016-10-07 21:14:48 +05:00
srv_address := m . getIpFromServersList ( current_tab )
2016-10-06 20:48:35 +05:00
// Getting server information from cache.
2016-10-06 23:05:02 +05:00
if len ( srv_address ) > 0 && ctx . Cache . Servers [ srv_address ] . Server . Players != "" {
2016-10-06 20:48:35 +05:00
server_info := ctx . Cache . Servers [ srv_address ] . Server
2016-10-06 21:34:14 +05:00
parsed_general_data := ioq3dataparser . ParseInfoToMap ( server_info . ExtendedConfig )
parsed_players_info := ioq3dataparser . ParsePlayersInfoToMap ( server_info . PlayersInfo )
2016-10-06 20:48:35 +05:00
// Append to treeview generic info first. After appending it
// will be deleted from map.
2016-10-07 21:14:48 +05:00
iter := new ( gtk . TreeIter )
2016-10-06 21:34:14 +05:00
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "<markup><span font_weight=\"bold\">GENERAL INFO</span></markup>" )
2016-10-06 20:48:35 +05:00
// Server's name.
2016-10-07 21:14:48 +05:00
iter = new ( gtk . TreeIter )
2016-10-06 20:48:35 +05:00
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "Server's name" )
2016-10-06 21:34:14 +05:00
m . server_info_store . SetValue ( iter , 1 , ctx . Colorizer . Fix ( parsed_general_data [ "sv_hostname" ] ) )
delete ( parsed_general_data , "sv_hostname" )
// Game version.
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "Game version" )
m . server_info_store . SetValue ( iter , 1 , parsed_general_data [ "g_modversion" ] )
delete ( parsed_general_data , "g_modversion" )
2016-10-06 20:48:35 +05:00
// Players.
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "Players" )
2016-10-06 21:34:14 +05:00
m . server_info_store . SetValue ( iter , 1 , server_info . Players + " of " + parsed_general_data [ "sv_maxclients" ] )
delete ( parsed_general_data , "sv_maxclients" )
2016-10-06 20:48:35 +05:00
// Ping
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "Ping" )
m . server_info_store . SetValue ( iter , 1 , server_info . Ping + " ms" )
// Game mode
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "Game mode" )
m . server_info_store . SetValue ( iter , 1 , m . gamemodes [ server_info . Gamemode ] )
// Map name
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "Current map" )
m . server_info_store . SetValue ( iter , 1 , server_info . Map )
// Private or public?
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "Passworded" )
passworded_status := "<markup><span foreground=\"green\">No</span></markup>"
2016-10-07 14:28:44 +05:00
if server_info . IsPrivate == "1" {
2016-10-06 20:48:35 +05:00
passworded_status = "<markup><span foreground=\"red\">Yes</span></markup>"
}
m . server_info_store . SetValue ( iter , 1 , passworded_status )
2016-10-06 21:34:14 +05:00
// Just a separator.
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
// Players information
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "<markup><span font_weight=\"bold\">PLAYERS</span></markup>" )
for _ , value := range parsed_players_info {
iter = new ( gtk . TreeIter )
2016-10-07 02:50:52 +05:00
nick := ctx . Colorizer . Fix ( value [ "nick" ] )
2016-10-06 21:34:14 +05:00
m . server_info_store . Append ( iter )
2016-10-07 02:50:52 +05:00
m . server_info_store . SetValue ( iter , 0 , nick )
2016-10-06 21:34:14 +05:00
m . server_info_store . SetValue ( iter , 1 , "(frags: " + value [ "frags" ] + " | ping: " + value [ "ping" ] + ")" )
}
2016-10-06 20:48:35 +05:00
// Just a separator.
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
// Other parameters :).
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , "<markup><span font_weight=\"bold\">OTHER PARAMETERS</span></markup>" )
2016-10-06 21:34:14 +05:00
for key , value := range parsed_general_data {
2016-10-06 20:48:35 +05:00
iter = new ( gtk . TreeIter )
m . server_info_store . Append ( iter )
m . server_info_store . SetValue ( iter , 0 , key )
m . server_info_store . SetValue ( iter , 1 , value )
}
}
}
2016-10-06 17:11:36 +05:00
// Show tray menu on right-click on tray icon.
2016-10-05 01:03:46 +05:00
func ( m * MainWindow ) showTrayMenu ( cbx * glib . CallbackContext ) {
m . tray_menu . Popup ( nil , nil , gtk . StatusIconPositionMenu , m . tray_icon , uint ( cbx . Args ( 0 ) ) , uint32 ( cbx . Args ( 1 ) ) )
}
2016-10-06 17:11:36 +05:00
// Unlocking interface after game shut down.
2016-10-04 15:42:36 +05:00
func ( m * MainWindow ) unlockInterface ( ) {
m . launch_button . SetSensitive ( true )
2016-10-08 19:57:33 +05:00
ctx . Eventer . LaunchEvent ( "setToolbarLabelText" , map [ string ] string { "text" : "URTrator is ready." } )
2016-10-04 15:42:36 +05:00
}
2016-10-07 14:28:44 +05:00
func ( m * MainWindow ) updateOneServer ( ) {
current_tab := m . tab_widget . GetTabLabelText ( m . tab_widget . GetNthPage ( m . tab_widget . GetCurrentPage ( ) ) )
2016-10-07 22:21:19 +05:00
srv_address := m . getIpFromServersList ( current_tab )
2016-10-07 14:28:44 +05:00
if len ( srv_address ) > 0 {
go ctx . Requester . UpdateOneServer ( srv_address )
}
}
2016-10-06 13:55:03 +05:00
// Triggered when "Update all servers" button is clicked.
2016-10-04 15:42:36 +05:00
func ( m * MainWindow ) UpdateServers ( ) {
2016-10-08 19:57:33 +05:00
ctx . Eventer . LaunchEvent ( "setToolbarLabelText" , map [ string ] string { "text" : "<markup><span foreground=\"red\" font_weight=\"bold\">Updating servers...</span></markup>" } )
2016-10-04 15:42:36 +05:00
current_tab := m . tab_widget . GetTabLabelText ( m . tab_widget . GetNthPage ( m . tab_widget . GetCurrentPage ( ) ) )
fmt . Println ( "Updating servers on tab '" + current_tab + "'..." )
2016-10-06 13:55:03 +05:00
2016-10-04 23:39:32 +05:00
if strings . Contains ( current_tab , "Servers" ) {
2016-10-06 13:55:03 +05:00
go ctx . Requester . UpdateAllServers ( )
2016-10-04 23:39:32 +05:00
} else if strings . Contains ( current_tab , "Favorites" ) {
2016-10-06 13:55:03 +05:00
go ctx . Requester . UpdateFavoriteServers ( )
2016-10-04 15:42:36 +05:00
}
}