BaseEffect.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. namespace Terminal.Gui.TextEffects;
  2. public abstract class BaseEffectIterator<T> : IEnumerable<string> where T : EffectConfig
  3. {
  4. protected T Config { get; set; }
  5. protected Terminal Terminal { get; set; }
  6. protected List<EffectCharacter> ActiveCharacters { get; set; } = new List<EffectCharacter> ();
  7. public BaseEffectIterator (BaseEffect<T> effect)
  8. {
  9. Config = effect.EffectConfig;
  10. Terminal = new Terminal (effect.InputData, effect.TerminalConfig);
  11. }
  12. public string Frame => Terminal.GetFormattedOutputString ();
  13. public void Update ()
  14. {
  15. foreach (var character in ActiveCharacters)
  16. {
  17. character.Tick ();
  18. }
  19. ActiveCharacters.RemoveAll (character => !character.IsActive);
  20. }
  21. public IEnumerator<string> GetEnumerator ()
  22. {
  23. return this;
  24. }
  25. IEnumerator IEnumerable.GetEnumerator ()
  26. {
  27. return GetEnumerator ();
  28. }
  29. public abstract string Next ();
  30. }
  31. public abstract class BaseEffect<T> where T : EffectConfig, new()
  32. {
  33. public string InputData { get; set; }
  34. public T EffectConfig { get; set; }
  35. public TerminalConfig TerminalConfig { get; set; }
  36. protected BaseEffect (string inputData)
  37. {
  38. InputData = inputData;
  39. EffectConfig = new T ();
  40. TerminalConfig = new TerminalConfig ();
  41. }
  42. public abstract Type IteratorClass { get; }
  43. public IEnumerator<string> GetEnumerator ()
  44. {
  45. var iterator = (BaseEffectIterator<T>)Activator.CreateInstance (IteratorClass, this);
  46. return iterator;
  47. }
  48. public IDisposable TerminalOutput (string endSymbol = "\n")
  49. {
  50. var terminal = new Terminal (InputData, TerminalConfig);
  51. terminal.PrepCanvas ();
  52. try
  53. {
  54. return terminal;
  55. }
  56. finally
  57. {
  58. terminal.RestoreCursor (endSymbol);
  59. }
  60. }
  61. }