CraftingRecipies.cpp 7.7 KB

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