ListView.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "ListView.h"
  2. #include <Bild.h>
  3. #include <Fenster.h>
  4. #include <Liste.h>
  5. #include <Schrift.h>
  6. #include <TextFeld.h>
  7. #include <XML.h>
  8. #include "World.h"
  9. ListViewElement::ListViewElement()
  10. : Framework::UIMLElement()
  11. {}
  12. bool ListViewElement::isApplicableFor(Framework::XML::Element& element)
  13. {
  14. return element.getName().istGleich("listView");
  15. }
  16. Framework::Zeichnung* ListViewElement::parseElement(
  17. Framework::XML::Element& element, Framework::UIMLContainer& generalFactory)
  18. {
  19. ListView* result = new ListView();
  20. result->list->setSchriftZ(dynamic_cast<Framework::Schrift*>(
  21. generalFactory.getFactory().initParam.schrift->getThis()));
  22. updateElement(element, *result, generalFactory);
  23. return result;
  24. }
  25. bool ListViewElement::updateElement(Framework::XML::Element& element,
  26. Framework::Zeichnung& z,
  27. Framework::UIMLContainer& generalFactory)
  28. {
  29. ListView* view = dynamic_cast<ListView*>(&z);
  30. if (!view) return false;
  31. for (int index = 0; index < view->list->getEintragAnzahl(); index++)
  32. {
  33. if (!element.selectChildsByName("listItem")
  34. .whereAttributeEquals("id", *view->ids.z(index))
  35. .exists())
  36. {
  37. view->list->removeEintrag(index);
  38. view->ids.remove(index);
  39. index--;
  40. }
  41. }
  42. int childIndex = 0;
  43. for (Framework::XML::Element* zChild :
  44. element.selectChildsByName("listItem"))
  45. {
  46. int index = view->ids.findIndex([zChild](const Framework::Text* zId) {
  47. return zId->istGleich(zChild->getAttributeValue("id"));
  48. });
  49. if (index < 0)
  50. {
  51. Framework::Text id = zChild->getAttributeValue("id");
  52. view->ids.add(new Framework::Text(id));
  53. view->list->addEintrag(zChild->getText());
  54. }
  55. else
  56. {
  57. view->list->setEintrag(index, zChild->getText());
  58. view->list->setEintragPos(index, childIndex);
  59. }
  60. childIndex++;
  61. };
  62. for (int i = 0; i < view->list->getEintragAnzahl(); i++)
  63. {
  64. view->list->zEintrag(i)->setSchriftSize(20);
  65. view->list->zEintrag(i)->setSchriftFarbe(0XFFFFFFFF);
  66. view->list->zEintrag(i)->setRahmenFarbe(0xFF52525E);
  67. }
  68. int auswahl
  69. = element.selectChildsByAttribute("selected")
  70. .getFirstElement()
  71. .map<int>(
  72. [](Framework::RCPointer<Framework::XML::Element> child) {
  73. return child->zParent()->getChildIndex(child);
  74. })
  75. .orElse(-1);
  76. view->list->setAuswahl(auswahl);
  77. view->lastSelection = auswahl;
  78. view->onSelected = element.getAttributeValue("onSelectMessage");
  79. return true;
  80. }
  81. void ListViewElement::layout(Framework::XML::Element& element,
  82. Framework::Zeichnung& z,
  83. int pWidth,
  84. int pHeight,
  85. Framework::UIMLContainer& generalLayouter)
  86. {
  87. UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
  88. ListView* view = dynamic_cast<ListView*>(&z);
  89. if (view)
  90. {
  91. Framework::Text height = element.getAttributeValue("member-height");
  92. if (height.istGleich(""))
  93. {
  94. height = 30;
  95. }
  96. for (int i = 0; i < view->list->getEintragAnzahl(); i++)
  97. {
  98. view->list->zEintrag(i)->setHeight((int)height);
  99. }
  100. view->list->setSize(view->getInnenBreite(), view->getInnenHeight());
  101. if ((int)height * view->list->getEintragAnzahl() > view->getHeight())
  102. {
  103. view->list->addStyle(Framework::AuswahlListe::Style::VScroll);
  104. view->list->setVertikalKlickScroll((int)height);
  105. view->list->updateVScroll();
  106. }
  107. auto children = element.selectChildsByName("listItem");
  108. for (auto item : children)
  109. {
  110. auto elements
  111. = item->selectChildsByName("itemContent").selectChildren();
  112. int elementIndex = 0;
  113. for (auto element : elements)
  114. {
  115. generalLayouter.layout(*element,
  116. *generalLayouter.zZeichnungById(
  117. element->getAttributeValue("id")),
  118. view->getBreite() - view->list->getBreite(),
  119. view->getHeight(),
  120. generalLayouter);
  121. elementIndex++;
  122. }
  123. }
  124. }
  125. }
  126. ListView::ListView()
  127. : Framework::Zeichnung(),
  128. list(new Framework::AuswahlListe())
  129. {
  130. addStyle(Framework::Zeichnung::Style::Sichtbar
  131. | Framework::Zeichnung::Style::Erlaubt);
  132. setMausEreignis(Framework::_ret1ME);
  133. list->setStyle(Framework::AuswahlListe::Style::Normal);
  134. list->setMausEreignis(Framework::_ret1ME);
  135. list->setRahmenFarbe(0xFF52525E);
  136. list->setRahmenBreite(1);
  137. list->setALRBreite(2);
  138. list->setALRFarbe(0xFF0018FF);
  139. list->setAAFFarbe(0xA0337AB7);
  140. list->setAAFStrength(5);
  141. lastSelection = list->getAuswahl();
  142. }
  143. bool ListView::tick(double tickVal)
  144. {
  145. rend |= list->tick(tickVal);
  146. int auswahl = list->getAuswahl();
  147. if (auswahl != lastSelection)
  148. {
  149. Framework::Text* dialogName
  150. = onSelected.getTeilText(0, onSelected.positionVon(";"));
  151. Framework::Text* messageId
  152. = onSelected.getTeilText(onSelected.positionVon(";") + 1);
  153. char msg[6];
  154. msg[0] = 0; // element message
  155. msg[1] = (char)(int)*messageId;
  156. *(int*)(msg + 2) = auswahl;
  157. World::INSTANCE->zClient()->uiRequest(*dialogName, msg, 6);
  158. dialogName->release();
  159. messageId->release();
  160. lastSelection = auswahl;
  161. }
  162. return Zeichnung::tick(tickVal);
  163. }
  164. void ListView::render(Framework::Bild& rObj)
  165. {
  166. Zeichnung::render(rObj);
  167. if (rObj.setDrawOptions(pos, gr))
  168. {
  169. list->render(rObj);
  170. rObj.releaseDrawOptions();
  171. }
  172. }
  173. void ListView::doMausEreignis(Framework::MausEreignis& me, bool userRet)
  174. {
  175. bool vera = me.verarbeitet;
  176. if (!userRet)
  177. {
  178. me.verarbeitet = 1;
  179. }
  180. list->doPublicMausEreignis(me);
  181. if (!userRet)
  182. {
  183. me.verarbeitet = vera;
  184. }
  185. }