ShapedRecipie.cpp 4.7 KB

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