PostableSettingsGrid.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. public class PostableSettingsGrid : DynamicItemsListGrid<PostableSettings>
  11. {
  12. public PostableSettingsGrid()
  13. {
  14. OnCustomiseEditor += PostableSettingsGrid_OnCustomiseEditor;
  15. OnEditorValueChanged += PostableSettingsGrid_OnEditorValueChanged;
  16. }
  17. private Dictionary<string, object?> PostableSettingsGrid_OnEditorValueChanged(object sender, string name, object value)
  18. {
  19. var editorForm = (IDynamicEditorForm)sender;
  20. if (name == nameof(PostableSettings.PosterType))
  21. {
  22. var editor = (editorForm.FindEditor(name) as LookupEditorControl)!;
  23. (editor.EditorDefinition as ComboLookupEditor)!.Buttons![0].SetEnabled(!string.IsNullOrWhiteSpace(value as string));
  24. (editor.EditorDefinition as ComboLookupEditor)!.Buttons![1].SetVisible(
  25. CoreUtils.GetEntityOrNull(value as string)?.IsAssignableTo(typeof(IGlobalSettingsPoster)) == true);
  26. }
  27. return new();
  28. }
  29. private void PostableSettingsGrid_OnCustomiseEditor(IDynamicEditorForm sender, PostableSettings[]? items, DynamicGridColumn column, BaseEditor editor)
  30. {
  31. var settings = items?.FirstOrDefault();
  32. if (settings is null) return;
  33. if(column.ColumnName == nameof(PostableSettings.PosterType) && editor is ComboLookupEditor combo)
  34. {
  35. var settingsButton = new EditorButton(settings, "Settings", 60, ViewSettings, false);
  36. settingsButton.SetEnabled(!string.IsNullOrWhiteSpace(settings.PosterType));
  37. var globalSettingsButton = new EditorButton(settings, "Global Settings", 100, ViewGlobalSettings, false);
  38. globalSettingsButton.SetVisible(CoreUtils.GetEntityOrNull(settings.PosterType)?.IsAssignableTo(typeof(IGlobalSettingsPoster)) == true);
  39. combo.Buttons = [settingsButton, globalSettingsButton];
  40. }
  41. else if(column.ColumnName == nameof(PostableSettings.ShowPullButton))
  42. {
  43. var entityType = CoreUtils.GetEntityOrNull(settings.PostableType);
  44. var visible = false;
  45. if (entityType is not null)
  46. {
  47. var engine = PosterUtils.GetEngine(entityType);
  48. if(engine.Get(out var eType, out var _error))
  49. {
  50. visible = eType.HasInterface(typeof(IPullerEngine<>));
  51. }
  52. }
  53. editor.Editable = visible ? Editable.Enabled : Editable.Hidden;
  54. }
  55. }
  56. private void ViewGlobalSettings(object editor, object? item)
  57. {
  58. if (item is not PostableSettings settings) return;
  59. var posterType = CoreUtils.GetEntityOrNull(settings.PosterType);
  60. var globalSettingsType = posterType?.GetInterfaceDefinition(typeof(IGlobalSettingsPoster<>))?.GenericTypeArguments[0];
  61. if (globalSettingsType is null) return;
  62. ConfigureGlobalPosterSettings(globalSettingsType);
  63. }
  64. private void ViewSettings(object editor, object? item)
  65. {
  66. if (item is not PostableSettings settings) return;
  67. var entityType = CoreUtils.GetEntityOrNull(settings.PostableType);
  68. if (entityType is null) return;
  69. var posterType = CoreUtils.GetEntityOrNull(settings.PosterType);
  70. var settingsType = posterType?.GetInterfaceDefinition(typeof(IPoster<,>))!.GenericTypeArguments[1];
  71. ConfigurePosterSettings(entityType, settingsType);
  72. }
  73. public static bool ConfigureGlobalPosterSettings(Type globalSettingsType)
  74. {
  75. var globalPosterSettings = PosterUtils.LoadGlobalPosterSettings(globalSettingsType);
  76. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicItemsListGrid<>), globalSettingsType);
  77. if(grid.EditItems(new object[] { globalPosterSettings }))
  78. {
  79. PosterUtils.SaveGlobalPosterSettings(globalSettingsType, globalPosterSettings);
  80. return true;
  81. }
  82. return false;
  83. }
  84. public static bool ConfigurePosterSettings(Type entityType, Type settingsType)
  85. {
  86. var posterSettings = PosterUtils.LoadPosterSettings(entityType, settingsType);
  87. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(PosterSettingsGrid<>), settingsType);
  88. if(grid.EditItems(new object[] { posterSettings }))
  89. {
  90. PosterUtils.SavePosterSettings(entityType, settingsType, posterSettings);
  91. return true;
  92. }
  93. return false;
  94. }
  95. public static bool ConfigurePosterSettings<T>(Type settingsType)
  96. where T : Entity, IPostable, IRemotable, IPersistent, new() => ConfigurePosterSettings(typeof(T), settingsType);
  97. }