UIObservable.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "UIObservable.h"
  2. #include "Entity.h"
  3. #include "Game.h"
  4. #include "NetworkMessage.h"
  5. void UIObservable::notifyObservers(NetworkMessage* msg)
  6. {
  7. cs.lock();
  8. int index = 0;
  9. Framework::Array<int> toDelete;
  10. for (auto observer : observers)
  11. {
  12. Entity* e = Game::INSTANCE->zEntity(observer.sourceEntiryId);
  13. if (e)
  14. {
  15. msg->addressUIElement(
  16. observer.uimlElementId, observer.networkApiProcessorId);
  17. Game::INSTANCE->sendMessage(msg->clone(), e);
  18. }
  19. else
  20. toDelete.add(index, 0);
  21. index++;
  22. }
  23. for (int i : toDelete)
  24. observers.remove(i);
  25. cs.unlock();
  26. msg->release();
  27. }
  28. void UIObservable::removeObserver(
  29. Entity* zSource, Framework::Text uimlElementId, int networkApiProcessorId)
  30. {
  31. cs.lock();
  32. int index = 0;
  33. for (auto observer : observers)
  34. {
  35. if (observer.sourceEntiryId == zSource->getId()
  36. && observer.uimlElementId.istGleich(uimlElementId)
  37. && observer.networkApiProcessorId == networkApiProcessorId)
  38. {
  39. observers.remove(index);
  40. break;
  41. }
  42. index++;
  43. }
  44. cs.unlock();
  45. }
  46. void UIObservable::addObserver(
  47. Entity* zSource, Framework::Text uimlElementId, int networkApiProcessorId)
  48. {
  49. cs.lock();
  50. for (auto observer : observers)
  51. {
  52. if (observer.sourceEntiryId == zSource->getId()
  53. && observer.uimlElementId.istGleich(uimlElementId)
  54. && observer.networkApiProcessorId == networkApiProcessorId)
  55. {
  56. cs.unlock();
  57. return;
  58. }
  59. }
  60. observers.add({zSource->getId(), uimlElementId, networkApiProcessorId});
  61. for (auto call : onObserverAdded)
  62. {
  63. cs.unlock();
  64. call(zSource, uimlElementId, networkApiProcessorId);
  65. cs.lock();
  66. }
  67. cs.unlock();
  68. }
  69. void UIObservable::registerOnObserverAddedCall(std::function<void(
  70. Entity* zSource, Framework::Text uimlElementId, int processor)> call)
  71. {
  72. cs.lock();
  73. onObserverAdded.add(call);
  74. cs.unlock();
  75. }