Files
EstusShots-Net/EstusShots.Gtk/Pages/PlayersPage.cs
luxick 9735a0d5a0 Gtk improvements
Squashed commit of the following:

commit 724c487ff5feca1e5ed1e0f006dd1c8e0112954b
Author: luxick <git@luxick.de>
Date:   Thu Mar 5 17:56:01 2020 +0100

    Reorder player columns

commit 5f56f73912122a42c3ee8fc64ed9760d18b9e706
Author: luxick <git@luxick.de>
Date:   Thu Mar 5 17:52:17 2020 +0100

    Data column constructor fix

commit fae314804b5bbe1be58ebdcb64690544bae76d1b
Author: luxick <git@luxick.de>
Date:   Thu Mar 5 17:51:39 2020 +0100

    Do not cast values in liststore to string
2020-03-05 17:56:16 +01:00

88 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using EstusShots.Gtk.Controls;
using EstusShots.Gtk.Dialogs;
using EstusShots.Shared.Dto;
using EstusShots.Shared.Models.Parameters;
using Gtk;
using UI = Gtk.Builder.ObjectAttribute;
namespace EstusShots.Gtk
{
internal partial class MainWindow
{
[UI] public readonly Box PlayersPage = null;
[UI] public readonly Overlay PlayersOverlay = null;
[UI] public readonly TreeView PlayersTreeView = null;
[UI] public readonly Button NewPlayerButton = null;
[UI] public readonly Box PlayerEditorContainer = null;
private BindableListControl<Player> PlayersControl;
private void InitPlayersPage()
{
NewPlayerButton.Clicked += NewPlayerButtonOnClicked;
var columns = new List<DataColumn>
{
new DataColumn(nameof(Player.Name)),
new DataColumn(nameof(Player.Alias)),
new DataColumn(nameof(Player.Anonymous)) {Title = "Is Anonymous?", FixedWidth = 120},
new DataColumn(nameof(Player.HexId)) {Title = "Hex ID"},
};
PlayersControl = new BindableListControl<Player>(columns, nameof(Player.PlayerId), PlayersTreeView);
PlayersControl.OnSelectionChanged += PlayersControlOnOnSelectionChanged;
Task.Factory.StartNew(ReloadPlayers);
}
// Events
private void PlayersControlOnOnSelectionChanged(object o, SelectionChangedEventArgs args)
{
if (!(args.Selection is Player player)) return;
var dialog = new PlayerEditor(this, player);
dialog.OnDialogClosed += PlayerEditorClosed;
}
private void NewPlayerButtonOnClicked(object sender, EventArgs e)
{
var dialog = new PlayerEditor(this, new Player());
dialog.OnDialogClosed += PlayerEditorClosed;
}
private async void PlayerEditorClosed(object o, DialogClosedEventArgs args)
{
if (!args.Ok || !(args.Model is Player player)) return;
var res = await Task.Factory.StartNew(()
=> Client.Players.SavePlayer(new SavePlayerParameter(player)).Result);
if (!res.OperationResult.Success)
{
Info($"Unable to save: {res.OperationResult.ShortMessage}");
ErrorDialog.Show(res.OperationResult);
return;
}
await ReloadPlayers();
}
// Private Methods
private async Task ReloadPlayers()
{
var res = await Task.Factory.StartNew(()
=> Client.Players.GetPlayers(new GetPlayersParameter()).Result);
if (!res.OperationResult.Success)
{
InfoLabel.Text = $"Refresh failed: {res.OperationResult.ShortMessage}";
ErrorDialog.Show(res.OperationResult);
return;
}
PlayersControl.Items = res.Data.Players;
PlayersControl.DataBind();
Info("Player list refreshed");
}
}
}