RedDotData_SetDirty.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System;
  2. using UnityEngine;
  3. namespace YIUIFramework
  4. {
  5. public partial class RedDotData
  6. {
  7. //已改变的脏标记
  8. private bool m_ChangeDirty;
  9. //即将改变的值
  10. private int m_DirtyCount = -1;
  11. //脏数据堆栈
  12. private RedDotStack m_DirtyStack;
  13. //脏数据第一个改变的数据
  14. private FirstRedDotChangeData m_DirtyFirstRedDotChangeData;
  15. /// <summary>
  16. /// 脏数据设置数量
  17. /// </summary>
  18. internal bool TryDirtySetCount(int count)
  19. {
  20. if (ChildList.Count <= 0)
  21. {
  22. if (RealCount == count) //与现在真实数据相同 不需要改变
  23. {
  24. ResetDirty();
  25. return false;
  26. }
  27. m_ChangeDirty = true;
  28. m_DirtyCount = count;
  29. SetDirtyOS(count);
  30. return true;
  31. }
  32. Debug.LogError($"{Key} 配置 不是最后一级红点 请不要直接修改");
  33. return false;
  34. }
  35. //刷新脏数据
  36. internal void RefreshDirtyCount()
  37. {
  38. if (!m_ChangeDirty)
  39. {
  40. Debug.LogError($"{Key} 没有脏标 请勿调用此方法");
  41. return;
  42. }
  43. SetCount(m_DirtyCount, m_DirtyStack);
  44. ResetDirty();
  45. }
  46. private void SetDirtyOS(int count)
  47. {
  48. #if UNITY_EDITOR || YIUIMACRO_REDDOT_STACK
  49. m_DirtyFirstRedDotChangeData ??= new FirstRedDotChangeData();
  50. {
  51. m_DirtyFirstRedDotChangeData.ChangeData = this;
  52. m_DirtyFirstRedDotChangeData.OriginalCount = RealCount;
  53. m_DirtyFirstRedDotChangeData.ChangeCount = count;
  54. m_DirtyFirstRedDotChangeData.ChangeTips = Tips;
  55. }
  56. m_DirtyStack ??= new RedDotStack();
  57. {
  58. m_DirtyStack.Id = StackList.Count + 1;
  59. m_DirtyStack.DataTime = DateTime.Now;
  60. m_DirtyStack.StackTrace = new System.Diagnostics.StackTrace(true);
  61. m_DirtyStack.RedDotOSType = ERedDotOSType.Count;
  62. m_DirtyStack.OriginalCount = RealCount;
  63. m_DirtyStack.ChangeCount = count;
  64. m_DirtyStack.ChangeTips = Tips;
  65. m_DirtyStack.FirstData = m_DirtyFirstRedDotChangeData;
  66. }
  67. #endif
  68. }
  69. //初始化脏标数据
  70. private void ResetDirty()
  71. {
  72. m_ChangeDirty = false;
  73. m_DirtyCount = -1;
  74. m_DirtyStack = null;
  75. m_DirtyFirstRedDotChangeData = null;
  76. }
  77. }
  78. }