Get and save player

This commit is contained in:
2020-03-02 19:40:46 +01:00
parent df5a9d3976
commit 3e72acf71a
6 changed files with 96 additions and 33 deletions

View File

@@ -128,19 +128,35 @@ namespace EstusShots.Gtk.Controls
foreach (var dataColumn in Columns) foreach (var dataColumn in Columns)
{ {
// Offset by one, because the first column in the data store is fixed to the key value of the row // Offset by one, because the first column in the data store is fixed to the key value of the row
var index = Columns.IndexOf(dataColumn) + 1; var valueIndex = Columns.IndexOf(dataColumn) + 1;
var column = new TreeViewColumn( var cell = GetRenderer(dataColumn);
dataColumn.Title, var attr = GetAttribute(dataColumn);
new CellRendererText(), dataColumn.PackStart(cell, true);
"text", index) dataColumn.AddAttribute(cell, attr, valueIndex);
{ TreeView.AppendColumn(dataColumn);
Resizable = true,
Reorderable = true
};
TreeView.AppendColumn(column);
} }
} }
private CellRenderer GetRenderer(DataColumn column)
{
var property = typeof(T).GetProperty(column.PropertyName);
return property?.PropertyType.Name switch
{
nameof(Boolean) => new CellRendererToggle(),
_ => new CellRendererText()
};
}
private string GetAttribute(DataColumn column)
{
var property = typeof(T).GetProperty(column.PropertyName);
return property?.PropertyType.Name switch
{
nameof(Boolean) => "active",
_ => "text"
};
}
private void InitListStore() private void InitListStore()
{ {
var types = Columns var types = Columns

View File

@@ -1,16 +1,20 @@
using System; using System;
using Gtk;
namespace EstusShots.Gtk.Controls namespace EstusShots.Gtk.Controls
{ {
public class DataColumn public class DataColumn : TreeViewColumn
{ {
public DataColumn() public DataColumn()
{ {
Resizable = true;
Reorderable = true;
} }
public DataColumn(string propertyName) public DataColumn(string propertyName)
{ {
PropertyName = propertyName; PropertyName = propertyName;
Title = propertyName;
} }
/// <summary> /// <summary>
@@ -18,11 +22,6 @@ namespace EstusShots.Gtk.Controls
/// </summary> /// </summary>
public string PropertyName { get; } public string PropertyName { get; }
/// <summary>
/// The column header.
/// </summary>
public string Title { get; set; }
/// <summary> /// <summary>
/// Applies the given transformation on each item in the column. /// Applies the given transformation on each item in the column.
/// This changes only the display of the value. /// This changes only the display of the value.

View File

@@ -42,6 +42,11 @@ namespace EstusShots.Gtk.Dialogs
_builder.Autoconnect(this); _builder.Autoconnect(this);
SavePlayerButton.Clicked += SavePlayerButtonOnClicked; SavePlayerButton.Clicked += SavePlayerButtonOnClicked;
CancelPlayerEditorButton.Clicked += (sender, args) =>
{
OnDialogClosed?.Invoke(this, new DialogClosedEventArgs(false, null));
PlayerEditorDialog.Dispose();
};
PlayerEditorDialog.TransientFor = parent; PlayerEditorDialog.TransientFor = parent;
PlayerEditorDialog.Show(); PlayerEditorDialog.Show();

View File

@@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using EstusShots.Gtk.Controls;
using EstusShots.Gtk.Dialogs; using EstusShots.Gtk.Dialogs;
using EstusShots.Shared.Dto; using EstusShots.Shared.Dto;
using EstusShots.Shared.Models.Parameters; using EstusShots.Shared.Models.Parameters;
@@ -16,14 +18,34 @@ namespace EstusShots.Gtk
[UI] public readonly Button NewPlayerButton = null; [UI] public readonly Button NewPlayerButton = null;
[UI] public readonly Box PlayerEditorContainer = null; [UI] public readonly Box PlayerEditorContainer = null;
private BindableListControl<Player> PlayersControl;
private void InitPlayersPage() private void InitPlayersPage()
{ {
NewPlayerButton.Clicked += NewPlayerButtonOnClicked; NewPlayerButton.Clicked += NewPlayerButtonOnClicked;
var columns = new List<DataColumn>
{
new DataColumn(nameof(Player.Name)),
new DataColumn(nameof(Player.Alias)),
new DataColumn(nameof(Player.HexId)) {Title = "Hex ID"},
new DataColumn(nameof(Player.Anonymous)) {Title = "Is Anonymous?", FixedWidth = 30}
};
PlayersControl = new BindableListControl<Player>(columns, nameof(Player.PlayerId), PlayersTreeView);
PlayersControl.OnSelectionChanged += PlayersControlOnOnSelectionChanged;
Task.Factory.StartNew(ReloadPlayers);
} }
// Events // 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) private void NewPlayerButtonOnClicked(object sender, EventArgs e)
{ {
var dialog = new PlayerEditor(this, new Player()); var dialog = new PlayerEditor(this, new Player());
@@ -42,12 +64,12 @@ namespace EstusShots.Gtk
return; return;
} }
// ReloadPlayers(); await ReloadPlayers();
} }
// Private Methods // Private Methods
private async void ReloadPlayers() private async Task ReloadPlayers()
{ {
var res = await Task.Factory.StartNew(() var res = await Task.Factory.StartNew(()
=> Client.Players.GetPlayers(new GetPlayersParameter()).Result); => Client.Players.GetPlayers(new GetPlayersParameter()).Result);
@@ -58,10 +80,9 @@ namespace EstusShots.Gtk
return; return;
} }
// TODO PlayersControl.Items = res.Data.Players;
// SeasonsControl.Items = res.Data.Seasons; PlayersControl.DataBind();
// SeasonsControl.DataBind(); Info("Player list refreshed");
// Info("Player list refreshed");
} }
} }
} }

View File

@@ -12,6 +12,9 @@ namespace EstusShots.Server.Mapping
CreateMap<Episode, Shared.Dto.Episode>(); CreateMap<Episode, Shared.Dto.Episode>();
CreateMap<Shared.Dto.Episode, Episode>(); CreateMap<Shared.Dto.Episode, Episode>();
CreateMap<Player, Shared.Dto.Player>();
CreateMap<Shared.Dto.Player, Player>();
} }
} }
} }

View File

@@ -1,10 +1,13 @@
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using AutoMapper; using AutoMapper;
using EstusShots.Server.Models; using EstusShots.Server.Models;
using EstusShots.Shared.Interfaces; using EstusShots.Shared.Interfaces;
using EstusShots.Shared.Models; using EstusShots.Shared.Models;
using EstusShots.Shared.Models.Parameters; using EstusShots.Shared.Models.Parameters;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Dto = EstusShots.Shared.Dto;
namespace EstusShots.Server.Services namespace EstusShots.Server.Services
{ {
@@ -23,26 +26,42 @@ namespace EstusShots.Server.Services
public async Task<ApiResponse<GetPlayersResponse>> GetPlayers(GetPlayersParameter parameter) public async Task<ApiResponse<GetPlayersResponse>> GetPlayers(GetPlayersParameter parameter)
{ {
throw new System.NotImplementedException(); var players = await _context.Players.ToListAsync();
var dtos = _mapper.Map<List<Dto.Player>>(players);
return new ApiResponse<GetPlayersResponse>(new GetPlayersResponse(dtos));
} }
public async Task<ApiResponse<GetPlayerDetailsResponse>> GetPlayerDetails(GetPlayerDetailsParameter parameter) public async Task<ApiResponse<GetPlayerDetailsResponse>> GetPlayerDetails(GetPlayerDetailsParameter parameter)
{ {
throw new System.NotImplementedException(); var player = await _context.Players.FindAsync(parameter.PlayerId);
if (player == null)
{
_logger.LogWarning($"Player '{parameter.PlayerId}' not found in database");
return new ApiResponse<GetPlayerDetailsResponse>(new OperationResult(false, "Player not found"));
}
var dto = _mapper.Map<Dto.Player>(player);
return new ApiResponse<GetPlayerDetailsResponse>(new GetPlayerDetailsResponse(dto));
} }
public async Task<ApiResponse<SavePlayerResponse>> SavePlayer(SavePlayerParameter parameter) public async Task<ApiResponse<SavePlayerResponse>> SavePlayer(SavePlayerParameter parameter)
{ {
var player = _mapper.Map<Player>(parameter.Player); if (parameter.Player.PlayerId.IsEmpty())
if (player.PlayerId.IsEmpty())
{ {
_context.Players.Add(player); _context.Players.Add(_mapper.Map<Player>(parameter.Player));
var count = await _context.SaveChangesAsync(); var count = await _context.SaveChangesAsync();
_logger.LogInformation($"Created {count} rows"); _logger.LogInformation($"Created {count} rows");
return new ApiResponse<SavePlayerResponse>(new SavePlayerResponse(parameter.Player.PlayerId));
}
else
{
var player = await _context.Players.FindAsync(parameter.Player.PlayerId);
_context.Players.Update(player);
_mapper.Map(parameter.Player, player);
var count = await _context.SaveChangesAsync();
_logger.LogInformation($"Updated player '{player.PlayerId}'");
return new ApiResponse<SavePlayerResponse>(new SavePlayerResponse(player.PlayerId)); return new ApiResponse<SavePlayerResponse>(new SavePlayerResponse(player.PlayerId));
} }
// TODO Update Player
return new ApiResponse<SavePlayerResponse>(new OperationResult(false, "NotImplemented"));
} }
public async Task<ApiResponse<DeletePlayerResponse>> DeletePlayers(DeletePlayerParameter parameter) public async Task<ApiResponse<DeletePlayerResponse>> DeletePlayers(DeletePlayerParameter parameter)