UnshapedRecipie.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "UnshapedRecipie.h"
  2. #include <Bild.h>
  3. #include <XML.h>
  4. UnshapedRecipieElement::UnshapedRecipieElement()
  5. : Framework::UIMLElement()
  6. {}
  7. //! prüft, ob dieses UIML Element für ein bestimmtes xml Element zuständig
  8. //! ist
  9. bool UnshapedRecipieElement::isApplicableFor(Framework::XML::Element& element)
  10. {
  11. return element.getName().istGleich("recipie")
  12. && element.getAttributeValue("type").istGleich("unshaped");
  13. }
  14. //! erstellt eine neue Zeichnung zu einem gegebenen xml Element
  15. Framework::Zeichnung* UnshapedRecipieElement::parseElement(
  16. Framework::XML::Element& element, Framework::UIMLContainer& generalFactory)
  17. {
  18. UnshapedRecipie* recipie = new UnshapedRecipie();
  19. element.selectChildsByName("ingredients")
  20. .selectChildren()
  21. .forEach([recipie, &generalFactory](Framework::XML::Element* zElement) {
  22. recipie->addIngredient(
  23. generalFactory.parseElement(*zElement, generalFactory));
  24. });
  25. element.selectChildsByName("outputs").selectChildren().forEach(
  26. [recipie, &generalFactory](Framework::XML::Element* zElement) {
  27. recipie->addOutput(
  28. generalFactory.parseElement(*zElement, generalFactory));
  29. });
  30. return recipie;
  31. }
  32. //! wendet die layout parameter zu einer Zeichnung an
  33. void UnshapedRecipieElement::layout(Framework::XML::Element& element,
  34. Framework::Zeichnung& z,
  35. int pWidth,
  36. int pHeight,
  37. Framework::UIMLContainer& generalLayouter)
  38. {
  39. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  40. element.selectChildren().selectChildren().forEach(
  41. [&z, &generalLayouter](Framework::XML::Element* zElement) {
  42. Framework::Zeichnung* child = 0;
  43. if (zElement->hasAttribute("id"))
  44. {
  45. child = generalLayouter.zZeichnungById(
  46. zElement->getAttributeValue("id"));
  47. }
  48. if (child)
  49. {
  50. generalLayouter.layout(*zElement,
  51. *child,
  52. z.getBreite(),
  53. z.getHeight(),
  54. generalLayouter);
  55. }
  56. });
  57. }
  58. UnshapedRecipie::UnshapedRecipie()
  59. : Framework::ZeichnungHintergrund()
  60. {
  61. setStyle(Framework::Zeichnung::Style::Erlaubt
  62. | Framework::Zeichnung::Style::Sichtbar);
  63. }
  64. void UnshapedRecipie::addIngredient(Zeichnung* ingredient)
  65. {
  66. ingredients.add(ingredient);
  67. }
  68. void UnshapedRecipie::addOutput(Zeichnung* output)
  69. {
  70. outputs.add(output);
  71. }
  72. bool UnshapedRecipie::tick(double tickVal)
  73. {
  74. bool ret = false;
  75. for (Zeichnung* ingredient : ingredients)
  76. {
  77. ret |= ingredient->tick(tickVal);
  78. }
  79. for (Zeichnung* output : outputs)
  80. {
  81. ret |= output->tick(tickVal);
  82. }
  83. return ret;
  84. }
  85. void UnshapedRecipie::render(Framework::Bild& rObj)
  86. {
  87. if (!hatStyle(Zeichnung::Style::Sichtbar)) return;
  88. ZeichnungHintergrund::render(rObj);
  89. if (!rObj.setDrawOptions(pos.x, pos.y, gr.x, gr.y)) return;
  90. int x = 0;
  91. int y = 0;
  92. int width = MIN(3, ingredients.getEintragAnzahl());
  93. for (Zeichnung* ingredient : ingredients)
  94. {
  95. ingredient->setX(x);
  96. ingredient->setY(y);
  97. ingredient->render(rObj);
  98. x += 60;
  99. if (x >= 3 * 60)
  100. {
  101. x = 0;
  102. y += 60;
  103. }
  104. }
  105. rObj.fillRegion(width * 60, gr.y / 2 - 5, 25, 10, 0xFF52525E);
  106. rObj.drawDreieck(Framework::Punkt(3 * 60 + 25, gr.y / 2 - 15),
  107. Framework::Punkt(width * 60 + 40, gr.y / 2),
  108. Framework::Punkt(width * 60 + 25, gr.y / 2 + 15),
  109. 0xFF52525E);
  110. x = width * 60 + 50;
  111. int oldy = y;
  112. y = 0;
  113. for (Zeichnung* output : outputs)
  114. {
  115. output->setX(x);
  116. output->setY(y);
  117. output->render(rObj);
  118. y += 60;
  119. }
  120. int height = MAX(3, outputs.getEintragAnzahl());
  121. if (getBreite() != width * 60 + 50 + 50 && getHeight() != height)
  122. {
  123. setSize(width * 60 + 50 + 50, MAX(oldy + 50, y + 50));
  124. }
  125. rObj.releaseDrawOptions();
  126. }
  127. void UnshapedRecipie::doMausEreignis(Framework::MausEreignis& me, bool userRet)
  128. {
  129. for (Zeichnung* ingredient : ingredients)
  130. {
  131. ingredient->doPublicMausEreignis(me);
  132. }
  133. for (Zeichnung* output : outputs)
  134. {
  135. output->doPublicMausEreignis(me);
  136. }
  137. }