ListView.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. }
  108. }
  109. ListView::ListView()
  110. : Framework::Zeichnung(),
  111. list(new Framework::AuswahlListe())
  112. {
  113. addStyle(Framework::Zeichnung::Style::Sichtbar
  114. | Framework::Zeichnung::Style::Erlaubt);
  115. setMausEreignis(Framework::_ret1ME);
  116. list->setStyle(Framework::AuswahlListe::Style::Normal);
  117. list->setMausEreignis(Framework::_ret1ME);
  118. list->setRahmenFarbe(0xFF52525E);
  119. list->setRahmenBreite(1);
  120. list->setALRBreite(2);
  121. list->setALRFarbe(0xFF0018FF);
  122. list->setAAFFarbe(0xA0337AB7);
  123. list->setAAFStrength(5);
  124. lastSelection = list->getAuswahl();
  125. }
  126. bool ListView::tick(double tickVal)
  127. {
  128. rend |= list->tick(tickVal);
  129. int auswahl = list->getAuswahl();
  130. if (auswahl != lastSelection)
  131. {
  132. Framework::Text* dialogName
  133. = onSelected.getTeilText(0, onSelected.positionVon(";"));
  134. Framework::Text* messageId
  135. = onSelected.getTeilText(onSelected.positionVon(";") + 1);
  136. char msg[6];
  137. msg[0] = 0; // element message
  138. msg[1] = (char)(int)*messageId;
  139. *(int*)(msg + 2) = auswahl;
  140. World::INSTANCE->zClient()->uiRequest(*dialogName, msg, 6);
  141. dialogName->release();
  142. messageId->release();
  143. lastSelection = auswahl;
  144. }
  145. return Zeichnung::tick(tickVal);
  146. }
  147. void ListView::render(Framework::Bild& rObj)
  148. {
  149. Zeichnung::render(rObj);
  150. if (rObj.setDrawOptions(pos, gr))
  151. {
  152. list->render(rObj);
  153. rObj.releaseDrawOptions();
  154. }
  155. }
  156. void ListView::doMausEreignis(Framework::MausEreignis& me, bool userRet)
  157. {
  158. bool vera = me.verarbeitet;
  159. if (!userRet)
  160. {
  161. me.verarbeitet = 1;
  162. }
  163. list->doPublicMausEreignis(me);
  164. if (!userRet)
  165. {
  166. me.verarbeitet = vera;
  167. }
  168. }