Base data editing page in GTK client.
This commit is contained in:
141
EstusShots.Gtk/Pages/BaseDataPage.cs
Normal file
141
EstusShots.Gtk/Pages/BaseDataPage.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
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 BaseDataPage = null;
|
||||
[UI] public readonly TreeView PlayersTreeView = null;
|
||||
[UI] public readonly Button NewPlayerButton = null;
|
||||
[UI] public readonly Button NewDrinkButton = null;
|
||||
|
||||
[UI] public readonly TreeView DrinksTreeView = null;
|
||||
|
||||
private BindableListControl<Player> _playersControl;
|
||||
private BindableListControl<Drink> _drinksControl;
|
||||
|
||||
private void InitBaseDataPage()
|
||||
{
|
||||
NewPlayerButton.Clicked += NewPlayerButtonOnClicked;
|
||||
NewDrinkButton.Clicked += NewDrinkButtonOnClicked;
|
||||
|
||||
var playerColumns = new List<DataColumn>
|
||||
{
|
||||
new DataColumnText(nameof(Player.Name)),
|
||||
new DataColumnText(nameof(Player.Alias)),
|
||||
new DataColumnBool(nameof(Player.Anonymous)) {Title = "Is Anonymous?", FixedWidth = 120},
|
||||
new DataColumnText(nameof(Player.HexId)) {Title = "Hex ID"},
|
||||
};
|
||||
_playersControl = new BindableListControl<Player>(playerColumns, nameof(Player.PlayerId), PlayersTreeView);
|
||||
_playersControl.OnSelectionChanged += PlayersControlOnOnSelectionChanged;
|
||||
|
||||
|
||||
var drinkColumns = new List<DataColumn>
|
||||
{
|
||||
new DataColumnText(nameof(Drink.Name)),
|
||||
new DataColumnDouble(nameof(Drink.Vol)) {Title = "%"}
|
||||
};
|
||||
_drinksControl = new BindableListControl<Drink>(drinkColumns, nameof(Drink.DrinkId), DrinksTreeView);
|
||||
|
||||
// TODO Only Load when navigated to
|
||||
Task _;
|
||||
_ = ReloadPlayers();
|
||||
_ = ReloadDrinks();
|
||||
}
|
||||
|
||||
// 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 void NewDrinkButtonOnClicked(object sender, EventArgs e)
|
||||
{
|
||||
var dialog = new DrinkEditor(this, new Drink());
|
||||
dialog.OnDialogClosed += DialogOnOnDialogClosed;
|
||||
}
|
||||
|
||||
private async void DialogOnOnDialogClosed(object o, DialogClosedEventArgs args)
|
||||
{
|
||||
if (!args.Ok || !(args.Model is Drink drink)) return;
|
||||
|
||||
var res = await Task.Factory.StartNew(()
|
||||
=> Client.Drinks.SaveDrink(new SaveDrinkParameter(drink)).Result);
|
||||
|
||||
if (!res.OperationResult.Success)
|
||||
{
|
||||
Info($"Unable to save: {res.OperationResult.ShortMessage}");
|
||||
ErrorDialog.Show(res.OperationResult);
|
||||
return;
|
||||
}
|
||||
|
||||
await ReloadDrinks();
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
private async Task ReloadDrinks()
|
||||
{
|
||||
var res = await Task.Factory.StartNew(()
|
||||
=> Client.Drinks.GetDrinks(new GetDrinksParameter()).Result);
|
||||
if (!res.OperationResult.Success)
|
||||
{
|
||||
InfoLabel.Text = $"Refresh failed: {res.OperationResult.ShortMessage}";
|
||||
ErrorDialog.Show(res.OperationResult);
|
||||
return;
|
||||
}
|
||||
|
||||
_drinksControl.Items = res.Data.Drinks;
|
||||
_drinksControl.DataBind();
|
||||
Info("Drink list refreshed");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,16 +14,20 @@ namespace EstusShots.Gtk
|
||||
{
|
||||
[UI] public readonly Box EpisodesPage = null;
|
||||
[UI] public readonly Button AddEpisodeButton = null;
|
||||
[UI] public readonly Overlay EpisodesOverlay = null;
|
||||
[UI] public readonly TreeView EpisodesTreeView = null;
|
||||
|
||||
|
||||
private BindableListControl<Episode> EpisodesControl { get; set; }
|
||||
|
||||
|
||||
private void InitEpisodesPage()
|
||||
{
|
||||
AddEpisodeButton.Clicked += AddEpisodeButtonOnClicked;
|
||||
|
||||
CreateEpisodesControl();
|
||||
}
|
||||
|
||||
// Eevents
|
||||
|
||||
|
||||
// Events
|
||||
|
||||
private async void AddEpisodeButtonOnClicked(object sender, EventArgs e)
|
||||
{
|
||||
if (SeasonsControl.SelectedItem == null) return;
|
||||
@@ -64,9 +68,9 @@ namespace EstusShots.Gtk
|
||||
|
||||
await ReloadEpisodes();
|
||||
}
|
||||
|
||||
|
||||
// Private Methods
|
||||
|
||||
|
||||
private async Task ReloadEpisodes()
|
||||
{
|
||||
var seasonId = SeasonsControl.SelectedItem.SeasonId;
|
||||
@@ -82,27 +86,27 @@ namespace EstusShots.Gtk
|
||||
EpisodesControl.DataBind();
|
||||
Info("Episodes Refreshed");
|
||||
}
|
||||
|
||||
|
||||
private void CreateEpisodesControl()
|
||||
{
|
||||
var columns = new List<DataColumn>
|
||||
{
|
||||
new DataColumn(nameof(Episode.DisplayName)) {Title = "Name"},
|
||||
new DataColumn(nameof(Episode.Title)) {Title = "Title"},
|
||||
new DataColumn(nameof(Episode.Date))
|
||||
new DataColumnText(nameof(Episode.DisplayName)) {Title = "Name"},
|
||||
new DataColumnText(nameof(Episode.Title)) {Title = "Title"},
|
||||
new DataColumnText(nameof(Episode.Date))
|
||||
{
|
||||
Title = "Date",
|
||||
Format = d => (d as DateTime?)?.ToString("dd.MM.yyyy")
|
||||
DisplayConverter = d => (d as DateTime?)?.ToString("dd.MM.yyyy")
|
||||
},
|
||||
new DataColumn(nameof(Episode.Start))
|
||||
new DataColumnText(nameof(Episode.Start))
|
||||
{
|
||||
Title = "Start",
|
||||
Format = d => (d as DateTime?)?.ToString("HH:mm")
|
||||
DisplayConverter = d => (d as DateTime?)?.ToString("HH:mm")
|
||||
},
|
||||
new DataColumn(nameof(Episode.End))
|
||||
new DataColumnText(nameof(Episode.End))
|
||||
{
|
||||
Title = "End",
|
||||
Format = d => (d as DateTime?)?.ToString("HH:mm") ?? "Ongoing"
|
||||
DisplayConverter = d => (d as DateTime?)?.ToString("HH:mm") ?? "Ongoing"
|
||||
}
|
||||
};
|
||||
EpisodesControl = new BindableListControl<Episode>(columns, nameof(Episode.EpisodeId), EpisodesTreeView);
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -32,7 +32,7 @@ namespace EstusShots.Gtk
|
||||
}
|
||||
|
||||
// Events
|
||||
|
||||
|
||||
private async void LoadButtonClicked(object sender, EventArgs a)
|
||||
{
|
||||
using var _ = new LoadingMode(this);
|
||||
@@ -63,7 +63,7 @@ namespace EstusShots.Gtk
|
||||
await ReloadSeasons();
|
||||
Info("Created new Season");
|
||||
}
|
||||
|
||||
|
||||
private async void SeasonsControlOnSelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (!(e.Selection is Season season)) return;
|
||||
@@ -82,7 +82,7 @@ namespace EstusShots.Gtk
|
||||
}
|
||||
|
||||
// Private Methods
|
||||
|
||||
|
||||
private async Task ReloadSeasons()
|
||||
{
|
||||
var res = await Task.Factory.StartNew(
|
||||
@@ -103,22 +103,19 @@ namespace EstusShots.Gtk
|
||||
{
|
||||
var columns = new List<DataColumn>
|
||||
{
|
||||
new DataColumn(nameof(Season.DisplayName)) {Title = "Name"},
|
||||
new DataColumn(nameof(Season.Description)) {Title = "Description"},
|
||||
new DataColumn(nameof(Season.Start))
|
||||
new DataColumnText(nameof(Season.DisplayName)) {Title = "Name"},
|
||||
new DataColumnText(nameof(Season.Description)),
|
||||
new DataColumnText(nameof(Season.Start))
|
||||
{
|
||||
Title = "Start",
|
||||
Format = date => (date as DateTime?)?.ToString("dd.MM.yyyy")
|
||||
DisplayConverter = date => (date as DateTime?)?.ToString("dd.MM.yyyy")
|
||||
},
|
||||
new DataColumn(nameof(Season.End))
|
||||
new DataColumnText(nameof(Season.End))
|
||||
{
|
||||
Title = "End",
|
||||
Format = date => (date as DateTime?)?.ToString("dd.MM.yyyy") ?? "Ongoing"
|
||||
DisplayConverter = date => (date as DateTime?)?.ToString("dd.MM.yyyy") ?? "Ongoing"
|
||||
}
|
||||
};
|
||||
SeasonsControl = new BindableListControl<Season>(columns, nameof(Season.SeasonId), SeasonsView);
|
||||
SeasonsControl.OnSelectionChanged += SeasonsControlOnSelectionChanged;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user