UnshapedRecipie.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. bool UnshapedRecipieElement::updateElement(Framework::XML::Element& element,
  33. Framework::Zeichnung& z,
  34. Framework::UIMLContainer& generalFactory)
  35. {
  36. return false;
  37. }
  38. //! wendet die layout parameter zu einer Zeichnung an
  39. void UnshapedRecipieElement::layout(Framework::XML::Element& element,
  40. Framework::Zeichnung& z,
  41. int pWidth,
  42. int pHeight,
  43. Framework::UIMLContainer& generalLayouter)
  44. {
  45. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  46. element.selectChildren().selectChildren().forEach(
  47. [&z, &generalLayouter](Framework::XML::Element* zElement) {
  48. Framework::Zeichnung* child = 0;
  49. if (zElement->hasAttribute("id"))
  50. {
  51. child = generalLayouter.zZeichnungById(
  52. zElement->getAttributeValue("id"));
  53. }
  54. if (child)
  55. {
  56. generalLayouter.layout(*zElement,
  57. *child,
  58. z.getBreite(),
  59. z.getHeight(),
  60. generalLayouter);
  61. }
  62. });
  63. }
  64. UnshapedRecipie::UnshapedRecipie()
  65. : Framework::ZeichnungHintergrund()
  66. {
  67. setStyle(Framework::Zeichnung::Style::Erlaubt
  68. | Framework::Zeichnung::Style::Sichtbar);
  69. }
  70. void UnshapedRecipie::addIngredient(Zeichnung* ingredient)
  71. {
  72. ingredients.add(ingredient);
  73. }
  74. void UnshapedRecipie::addOutput(Zeichnung* output)
  75. {
  76. outputs.add(output);
  77. }
  78. bool UnshapedRecipie::tick(double tickVal)
  79. {
  80. bool ret = false;
  81. for (Zeichnung* ingredient : ingredients)
  82. {
  83. ret |= ingredient->tick(tickVal);
  84. }
  85. for (Zeichnung* output : outputs)
  86. {
  87. ret |= output->tick(tickVal);
  88. }
  89. return ret;
  90. }
  91. void UnshapedRecipie::render(Framework::Bild& rObj)
  92. {
  93. if (!hatStyle(Zeichnung::Style::Sichtbar)) return;
  94. ZeichnungHintergrund::render(rObj);
  95. if (!rObj.setDrawOptions(pos.x, pos.y, gr.x, gr.y)) return;
  96. int x = 0;
  97. int y = 0;
  98. int width = MIN(3, ingredients.getEintragAnzahl());
  99. for (Zeichnung* ingredient : ingredients)
  100. {
  101. ingredient->setX(x);
  102. ingredient->setY(y);
  103. ingredient->render(rObj);
  104. x += 60;
  105. if (x >= 3 * 60)
  106. {
  107. x = 0;
  108. y += 60;
  109. }
  110. }
  111. rObj.fillRegion(width * 60, gr.y / 2 - 5, 25, 10, 0xFF52525E);
  112. rObj.drawDreieck(Framework::Punkt(3 * 60 + 25, gr.y / 2 - 15),
  113. Framework::Punkt(width * 60 + 40, gr.y / 2),
  114. Framework::Punkt(width * 60 + 25, gr.y / 2 + 15),
  115. 0xFF52525E);
  116. x = width * 60 + 50;
  117. int oldy = y;
  118. y = 0;
  119. for (Zeichnung* output : outputs)
  120. {
  121. output->setX(x);
  122. output->setY(y);
  123. output->render(rObj);
  124. y += 60;
  125. }
  126. int height = MAX(3, outputs.getEintragAnzahl());
  127. if (getBreite() != width * 60 + 50 + 50 && getHeight() != height)
  128. {
  129. setSize(width * 60 + 50 + 50, MAX(oldy + 50, y + 50));
  130. }
  131. rObj.releaseDrawOptions();
  132. }
  133. void UnshapedRecipie::doMausEreignis(Framework::MausEreignis& me, bool userRet)
  134. {
  135. for (Zeichnung* ingredient : ingredients)
  136. {
  137. ingredient->doPublicMausEreignis(me);
  138. }
  139. for (Zeichnung* output : outputs)
  140. {
  141. output->doPublicMausEreignis(me);
  142. }
  143. }