FluentSukiDialogBuilder.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System;
  2. using Avalonia.Controls.Notifications;
  3. namespace SukiUI.Dialogs
  4. {
  5. public static class FluentSukiDialogBuilder
  6. {
  7. #region Content
  8. /// <summary>
  9. /// Creates a <see cref="SukiDialogBuilder"/> instance that can be used to construct a <see cref="ISukiDialog"/>
  10. /// </summary>
  11. public static SukiDialogBuilder CreateDialog(this ISukiDialogManager mgr) => new(mgr);
  12. /// <summary>
  13. /// Gives the dialog a "type" which will display an icon representing it.
  14. /// This can be used for MessageBox style dialogs.
  15. /// </summary>
  16. public static SukiDialogBuilder OfType(this SukiDialogBuilder builder, NotificationType type)
  17. {
  18. builder.SetType(type);
  19. return builder;
  20. }
  21. /// <summary>
  22. /// Gives the dialog a title.
  23. /// </summary>
  24. public static SukiDialogBuilder WithTitle(this SukiDialogBuilder builder, string title)
  25. {
  26. builder.SetTitle(title);
  27. return builder;
  28. }
  29. /// <summary>
  30. /// Gives the dialog content. This content can be a ViewModel if desired.
  31. /// </summary>
  32. public static SukiDialogBuilder WithContent(this SukiDialogBuilder builder, object content)
  33. {
  34. builder.SetContent(content);
  35. return builder;
  36. }
  37. /// <summary>
  38. /// Hide Card background.
  39. /// </summary>
  40. public static SukiDialogBuilder ShowCardBackground(this SukiDialogBuilder builder, bool show)
  41. {
  42. builder.SetShowCardBackground(show);
  43. return builder;
  44. }
  45. /// <summary>
  46. /// Gives the dialog a ViewModel. If this is used, Title/Content are ignored and only the ViewModel is rendered - the View being located by the usual strategy.
  47. /// This is useful for custom dialogs.
  48. /// </summary>
  49. public static SukiDialogBuilder WithViewModel(this SukiDialogBuilder builder, Func<ISukiDialog,object> viewModel)
  50. {
  51. builder.SetViewModel(viewModel);
  52. return builder;
  53. }
  54. #endregion
  55. #region Dismissing
  56. /// <summary>
  57. /// Begins a dismiss chain.
  58. /// </summary>
  59. public static SukiDialogBuilder.DismissDialog Dismiss(this SukiDialogBuilder builder) => new(builder);
  60. /// <summary>
  61. /// Allows the dialog to be dismissed simply by clicking the background
  62. /// </summary>
  63. public static SukiDialogBuilder ByClickingBackground(this SukiDialogBuilder.DismissDialog dismissBuilder)
  64. {
  65. dismissBuilder.Builder.SetCanDismissWithBackgroundClick(true);
  66. return dismissBuilder.Builder;
  67. }
  68. #endregion
  69. #region Actions
  70. /// <summary>
  71. /// Adds a button to the bottom of the dialog which will call the supplied callback when clicked.
  72. /// Any number of buttons can be added to the dialog.
  73. /// </summary>
  74. public static SukiDialogBuilder WithActionButton(this SukiDialogBuilder builder, object? content, Action<ISukiDialog> onClicked,
  75. bool dismissOnClick = false, params string[] classes)
  76. {
  77. builder.AddActionButton(content, onClicked, dismissOnClick, classes);
  78. return builder;
  79. }
  80. /// <summary>
  81. /// Provides a callback that will be called when this dialog is dismissed for any reason.
  82. /// </summary>
  83. public static SukiDialogBuilder OnDismissed(this SukiDialogBuilder builder, Action<ISukiDialog> onDismissed)
  84. {
  85. builder.SetOnDismissed(onDismissed);
  86. return builder;
  87. }
  88. #endregion
  89. }
  90. }