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 _playersControl; private BindableListControl _drinksControl; private void InitBaseDataPage() { NewPlayerButton.Clicked += NewPlayerButtonOnClicked; NewDrinkButton.Clicked += NewDrinkButtonOnClicked; var playerColumns = new List { 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(playerColumns, nameof(Player.PlayerId), PlayersTreeView); _playersControl.ItemActivated += PlayersControlActivated; var drinkColumns = new List { new DataColumnText(nameof(Drink.Name)), new DataColumnDouble(nameof(Drink.Vol)) {Title = "%"} }; _drinksControl = new BindableListControl(drinkColumns, nameof(Drink.DrinkId), DrinksTreeView); // TODO Only Load when navigated to Task _; _ = ReloadPlayers(); _ = ReloadDrinks(); } // Events private void PlayersControlActivated(Player player) { 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"); } } }