PostableSettingsGrid.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using InABox.Core;
  2. using InABox.DynamicGrid;
  3. using InABox.Wpf.Grids;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace InABox.Wpf
  10. {
  11. public class PostableSettingsGrid : DynamicItemsListGrid<PostableSettings>
  12. {
  13. public PostableSettingsGrid()
  14. {
  15. OnCustomiseEditor += PostableSettingsGrid_OnCustomiseEditor;
  16. OnEditorValueChanged += PostableSettingsGrid_OnEditorValueChanged;
  17. }
  18. private Dictionary<string, object?> PostableSettingsGrid_OnEditorValueChanged(object sender, string name, object value)
  19. {
  20. var editorForm = (IDynamicEditorForm)sender;
  21. if (name == nameof(PostableSettings.PosterType))
  22. {
  23. var editor = (editorForm.FindEditor(name) as LookupEditorControl)!;
  24. (editor.EditorDefinition as ComboLookupEditor)!.Buttons![0].SetEnabled(!string.IsNullOrWhiteSpace(value as string));
  25. (editor.EditorDefinition as ComboLookupEditor)!.Buttons![1].SetVisible(
  26. CoreUtils.GetEntityOrNull(value as string)?.IsAssignableTo(typeof(IGlobalSettingsPoster)) == true);
  27. }
  28. return new();
  29. }
  30. private void PostableSettingsGrid_OnCustomiseEditor(IDynamicEditorForm sender, PostableSettings[]? items, DynamicGridColumn column, BaseEditor editor)
  31. {
  32. var settings = items?.FirstOrDefault();
  33. if (settings is null) return;
  34. if(column.ColumnName == nameof(PostableSettings.PosterType) && editor is ComboLookupEditor combo)
  35. {
  36. var settingsButton = new EditorButton(settings, "Settings", 60, ViewSettings, false);
  37. settingsButton.SetEnabled(!string.IsNullOrWhiteSpace(settings.PosterType));
  38. var globalSettingsButton = new EditorButton(settings, "Global Settings", 100, ViewGlobalSettings, false);
  39. globalSettingsButton.SetVisible(CoreUtils.GetEntityOrNull(settings.PosterType)?.IsAssignableTo(typeof(IGlobalSettingsPoster)) == true);
  40. combo.Buttons = [settingsButton, globalSettingsButton];
  41. }
  42. }
  43. private void ViewGlobalSettings(object editor, object? item)
  44. {
  45. if (item is not PostableSettings settings) return;
  46. var posterType = CoreUtils.GetEntityOrNull(settings.PosterType);
  47. var globalSettingsType = posterType?.GetInterfaceDefinition(typeof(IGlobalSettingsPoster<>))?.GenericTypeArguments[0];
  48. if (globalSettingsType is null) return;
  49. var globalPosterSettings = PosterUtils.LoadGlobalPosterSettings(globalSettingsType);
  50. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicItemsListGrid<>), globalSettingsType);
  51. if(grid.EditItems(new object[] { globalPosterSettings }))
  52. {
  53. PosterUtils.SaveGlobalPosterSettings(globalSettingsType, globalPosterSettings);
  54. }
  55. }
  56. private void ViewSettings(object editor, object? item)
  57. {
  58. if (item is not PostableSettings settings) return;
  59. var entityType = CoreUtils.GetEntityOrNull(settings.PostableType);
  60. if (entityType is null) return;
  61. var posterType = CoreUtils.GetEntityOrNull(settings.PosterType);
  62. var settingsType = posterType?.GetInterfaceDefinition(typeof(IPoster<,>))!.GenericTypeArguments[1];
  63. var posterSettings = PosterUtils.LoadPosterSettings(entityType, settingsType);
  64. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(PosterSettingsGrid<>), settingsType);
  65. if(grid.EditItems(new object[] { posterSettings }))
  66. {
  67. PosterUtils.SavePosterSettings(entityType, settingsType, posterSettings);
  68. }
  69. }
  70. }
  71. }