Get and save player
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user