PostableSettingsGrid.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 : DynamicGrid<PostableSettings>
  11. {
  12. protected override void Init()
  13. {
  14. OnCustomiseEditor += PostableSettingsGrid_OnCustomiseEditor;
  15. OnEditorValueChanged += PostableSettingsGrid_OnEditorValueChanged;
  16. DataComponent = new DynamicGridItemsListDataComponent<PostableSettings>(this);
  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. else if(column.ColumnName == nameof(PostableSettings.ShowPullButton))
  43. {
  44. var entityType = CoreUtils.GetEntityOrNull(settings.PostableType);
  45. var visible = false;
  46. if (entityType is not null)
  47. {
  48. var engine = PosterUtils.GetEngine(entityType);
  49. if(engine.Get(out var eType, out var _error))
  50. {
  51. visible = eType.HasInterface(typeof(IPullerEngine<>));
  52. }
  53. }
  54. editor.Editable = visible ? Editable.Enabled : Editable.Hidden;
  55. }
  56. }
  57. private void ViewGlobalSettings(object editor, object? item)
  58. {
  59. if (item is not PostableSettings settings) return;
  60. var posterType = CoreUtils.GetEntityOrNull(settings.PosterType);
  61. var globalSettingsType = posterType?.GetInterfaceDefinition(typeof(IGlobalSettingsPoster<>))?.GenericTypeArguments[0];
  62. if (globalSettingsType is null) return;
  63. ConfigureGlobalPosterSettings(globalSettingsType);
  64. }
  65. private void ViewSettings(object editor, object? item)
  66. {
  67. if (item is not PostableSettings settings) return;
  68. var entityType = CoreUtils.GetEntityOrNull(settings.PostableType);
  69. if (entityType is null) return;
  70. var posterType = CoreUtils.GetEntityOrNull(settings.PosterType);
  71. var settingsType = posterType?.GetInterfaceDefinition(typeof(IPoster<,>))!.GenericTypeArguments[1];
  72. ConfigurePosterSettings(entityType, settingsType);
  73. }
  74. public static bool ConfigureGlobalPosterSettings(Type globalSettingsType)
  75. {
  76. var globalPosterSettings = PosterUtils.LoadGlobalPosterSettings(globalSettingsType);
  77. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicGrid<>), globalSettingsType);
  78. if(grid.EditItems(new object[] { globalPosterSettings }))
  79. {
  80. PosterUtils.SaveGlobalPosterSettings(globalSettingsType, globalPosterSettings);
  81. return true;
  82. }
  83. return false;
  84. }
  85. public static bool ConfigurePosterSettings(Type entityType, Type settingsType)
  86. {
  87. var posterSettings = PosterUtils.LoadPosterSettings(entityType, settingsType);
  88. var grid = DynamicGridUtils.CreateDynamicGrid(typeof(PosterSettingsGrid<>), settingsType);
  89. if(grid.EditItems(new object[] { posterSettings }))
  90. {
  91. PosterUtils.SavePosterSettings(entityType, settingsType, posterSettings);
  92. return true;
  93. }
  94. return false;
  95. }
  96. public static bool ConfigurePosterSettings<T>(Type settingsType)
  97. where T : Entity, IPostable, IRemotable, IPersistent, new() => ConfigurePosterSettings(typeof(T), settingsType);
  98. }