CraftingRecipies.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "CraftingRecipies.h"
  2. #include <Bild.h>
  3. #include <XML.h>
  4. #include "Globals.h"
  5. #include "RecipieGroup.h"
  6. CraftingRecipiesElement::CraftingRecipiesElement()
  7. : Framework::UIMLElement()
  8. {}
  9. //! prüft, ob dieses UIML Element für ein bestimmtes xml Element zuständig
  10. //! ist
  11. bool CraftingRecipiesElement::isApplicableFor(Framework::XML::Element& element)
  12. {
  13. return element.getName().istGleich("craftingRecipies");
  14. }
  15. //! erstellt eine neue Zeichnung zu einem gegebenen xml Element
  16. Framework::Zeichnung* CraftingRecipiesElement::parseElement(
  17. Framework::XML::Element& element, Framework::UIMLContainer& generalFactory)
  18. {
  19. CraftingRecipies* recipies = new CraftingRecipies();
  20. element.selectChildsByName("craftingRecipieGroup")
  21. .forEach([recipies, &generalFactory](
  22. Framework::XML::Element* zElement) {
  23. RecipieGroup* group = new RecipieGroup();
  24. group->setToolTip(zElement->getAttributeValue("name"));
  25. if (zElement->hasAttribute("itemIcon"))
  26. {
  27. int type = (int)zElement->getAttributeValue("itemIcon");
  28. group->setIcon(dynamic_cast<Framework::Bild*>(
  29. zItemType(type)->zIcon()->getThis()));
  30. }
  31. zElement->selectChildren().forEach(
  32. [group, &generalFactory](Framework::XML::Element* zRecipie) {
  33. group->addRecipie(
  34. generalFactory.parseElement(*zRecipie, generalFactory));
  35. });
  36. recipies->addRecipieGroup(group);
  37. });
  38. return recipies;
  39. }
  40. bool CraftingRecipiesElement::updateElement(Framework::XML::Element& element,
  41. Framework::Zeichnung& z,
  42. Framework::UIMLContainer& generalFactory)
  43. {
  44. return false;
  45. }
  46. //! wendet die layout parameter zu einer Zeichnung an
  47. void CraftingRecipiesElement::layout(Framework::XML::Element& element,
  48. Framework::Zeichnung& z,
  49. int pWidth,
  50. int pHeight,
  51. Framework::UIMLContainer& generalLayouter)
  52. {
  53. z.setSize(500, 500); // TODO: calculate size
  54. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  55. element.selectChildsByName("craftingRecipieGroup")
  56. .selectChildren()
  57. .forEach([&z, &generalLayouter](Framework::XML::Element* zElement) {
  58. Framework::Zeichnung* child = 0;
  59. if (zElement->hasAttribute("id"))
  60. {
  61. child = generalLayouter.zZeichnungById(
  62. zElement->getAttributeValue("id"));
  63. }
  64. if (child)
  65. {
  66. generalLayouter.layout(*zElement,
  67. *child,
  68. z.getBreite(),
  69. z.getHeight(),
  70. generalLayouter);
  71. }
  72. });
  73. }
  74. CraftingRecipies::CraftingRecipies()
  75. : Framework::ZeichnungHintergrund()
  76. {
  77. setStyle(Framework::Zeichnung::Style::Erlaubt
  78. | Framework::Zeichnung::Style::Sichtbar);
  79. previousPage = uiFactory.createKnopf(uiFactory.initParam);
  80. previousPage->setText("<");
  81. previousPage->setToolTipText("Previous Page",
  82. uiFactory.initParam.bildschirm,
  83. uiFactory.initParam.schrift);
  84. previousPage->setSize(20, 20);
  85. previousPage->setPosition(0, 35);
  86. previousPage->setStyle(
  87. Framework::Knopf::Style::Normal & ~Framework::Knopf::Style::Sichtbar);
  88. previousPage->setMausEreignis([this](void* p, void* z, MausEreignis me) {
  89. if (me.id == ME_RLinks)
  90. {
  91. RecipieGroup* previous = 0;
  92. for (RecipieGroup* group : recipieGroups)
  93. {
  94. if (group->hatStyle(Zeichnung::Style::Sichtbar) && previous)
  95. {
  96. group->removeStyle(Zeichnung::Style::Sichtbar);
  97. previous->addStyle(Zeichnung::Style::Sichtbar);
  98. }
  99. previous = group;
  100. }
  101. }
  102. return 1;
  103. });
  104. nextPage = uiFactory.createKnopf(uiFactory.initParam);
  105. nextPage->setText(">");
  106. nextPage->setToolTipText("Next Page",
  107. uiFactory.initParam.bildschirm,
  108. uiFactory.initParam.schrift);
  109. nextPage->setSize(20, 20);
  110. nextPage->setPosition(0, 35);
  111. nextPage->setStyle(
  112. Framework::Knopf::Style::Normal & ~Framework::Knopf::Style::Sichtbar);
  113. nextPage->setMausEreignis([this](void* p, void* z, MausEreignis me) {
  114. if (me.id == ME_RLinks)
  115. {
  116. bool next = 0;
  117. int index = 0;
  118. for (RecipieGroup* group : recipieGroups)
  119. {
  120. if (next)
  121. {
  122. group->addStyle(Zeichnung::Style::Sichtbar);
  123. break;
  124. }
  125. if (group->hatStyle(Zeichnung::Style::Sichtbar)
  126. && recipieGroups.getEintragAnzahl() > index + 1)
  127. {
  128. group->removeStyle(Zeichnung::Style::Sichtbar);
  129. next = 1;
  130. }
  131. index++;
  132. }
  133. }
  134. return 1;
  135. });
  136. }
  137. void CraftingRecipies::addRecipieGroup(RecipieGroup* recipieGroup)
  138. {
  139. recipieGroups.add(recipieGroup);
  140. }
  141. bool CraftingRecipies::tick(double tickVal)
  142. {
  143. int visibleGroupIndex = -1;
  144. int index = 0;
  145. for (RecipieGroup* group : recipieGroups)
  146. {
  147. if (group->hatStyle(Zeichnung::Style::Sichtbar))
  148. {
  149. visibleGroupIndex = index;
  150. }
  151. rend |= group->tick(tickVal);
  152. index++;
  153. }
  154. nextPage->setX(getBreite() - 20);
  155. previousPage->setStyle(Knopf::Style::Sichtbar, visibleGroupIndex > 0);
  156. nextPage->setStyle(Knopf::Style::Sichtbar,
  157. visibleGroupIndex < recipieGroups.getEintragAnzahl() - 1);
  158. rend |= previousPage->tick(tickVal);
  159. rend |= nextPage->tick(tickVal);
  160. return ZeichnungHintergrund::tick(tickVal);
  161. }
  162. void CraftingRecipies::render(Framework::Bild& rObj)
  163. {
  164. if (!hatStyle(Zeichnung::Style::Sichtbar)) return;
  165. ZeichnungHintergrund::render(rObj);
  166. if (!rObj.setDrawOptions(pos.x, pos.y, gr.x, gr.y)) return;
  167. int visibleGroupIndex = -1;
  168. int index = 0;
  169. for (RecipieGroup* group : recipieGroups)
  170. {
  171. if (group->hatStyle(Zeichnung::Style::Sichtbar))
  172. {
  173. visibleGroupIndex = index;
  174. }
  175. group->setPosition(0, 60);
  176. group->setSize(getBreite(), getHeight() - 60);
  177. group->render(rObj);
  178. index++;
  179. }
  180. int totalWidth = recipieGroups.getEintragAnzahl() * 31 + 1;
  181. int possibleDisplayedIcons = getBreite() / 31;
  182. int x = 0;
  183. if (possibleDisplayedIcons < recipieGroups.getEintragAnzahl()
  184. && visibleGroupIndex > possibleDisplayedIcons / 2)
  185. {
  186. x = (visibleGroupIndex - possibleDisplayedIcons / 2) * -31;
  187. if (recipieGroups.getEintragAnzahl() * 31 + 1 + x < getBreite())
  188. {
  189. x += getBreite() - (recipieGroups.getEintragAnzahl() * 31 + 1 + x);
  190. }
  191. }
  192. index = 0;
  193. for (RecipieGroup* group : recipieGroups)
  194. {
  195. rObj.fillRegion(x, 0, 30, 30, 0xFF000000);
  196. rObj.alphaBildSkall(x, 0, 30, 30, *group->zIcon());
  197. rObj.drawLinieH(x - 1, 0, 32, 0xFFFFFFFF);
  198. if (index != visibleGroupIndex)
  199. {
  200. rObj.drawLinieH(x - 1, 30, 32, 0xFFFFFFFF);
  201. }
  202. rObj.drawLinieV(x + 30, 0, 30, 0xFFFFFFFF);
  203. }
  204. Framework::TextRenderer tr(dynamic_cast<Framework::Schrift*>(
  205. uiFactory.initParam.schrift->getThis()));
  206. tr.setSchriftSize(12);
  207. Text t = Text("Machine page ") + Text(visibleGroupIndex + 1) + Text(" of ")
  208. + Text(recipieGroups.getEintragAnzahl());
  209. int tbr = tr.getTextBreite(t);
  210. tr.renderText(getBreite() / 2 - tbr / 2, 34, t, rObj, 0xFFFFFFFF);
  211. previousPage->render(rObj);
  212. nextPage->render(rObj);
  213. rObj.releaseDrawOptions();
  214. }
  215. void CraftingRecipies::doMausEreignis(Framework::MausEreignis& me, bool userRet)
  216. {
  217. previousPage->doPublicMausEreignis(me);
  218. nextPage->doPublicMausEreignis(me);
  219. for (RecipieGroup* group : recipieGroups)
  220. {
  221. group->doPublicMausEreignis(me);
  222. }
  223. }