ToolTip.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #include "ToolTip.h"
  2. #include "AlphaFeld.h"
  3. #include "Bild.h"
  4. #include "Bildschirm.h"
  5. #include "MausEreignis.h"
  6. #include "Rahmen.h"
  7. #include "Schrift.h"
  8. #include "Scroll.h"
  9. #include "Text.h"
  10. #include "TextFeld.h"
  11. using namespace Framework;
  12. // Inhalt der ToolTip Klasse aus ToolTip.h
  13. // Konstruktor
  14. ToolTip::ToolTip(Bildschirm* zScreen)
  15. : ZeichnungHintergrund(),
  16. size(0, 0),
  17. animationSpeed(250),
  18. warten(1),
  19. wartenCount(0),
  20. tval(0),
  21. mausIn(0),
  22. alpha(0),
  23. sichtbar(0),
  24. zeichnen(0),
  25. mausIn2(0),
  26. bildschirm(zScreen),
  27. onShow(0),
  28. onHide(0)
  29. {
  30. style = Style::MEIgnoreInside | Style::MEIgnoreParentInside
  31. | Style::MEIgnoreSichtbar | Style::MEIgnoreVerarbeitet
  32. | Style::Erlaubt;
  33. members = new RCArray<Zeichnung>();
  34. bildschirm->addToolTip(dynamic_cast<ToolTip*>(this->getThis()));
  35. setMausEreignis(_ret1ME);
  36. }
  37. // Destruktor
  38. ToolTip::~ToolTip()
  39. {
  40. members->release();
  41. }
  42. void ToolTip::doMausEreignis(MausEreignis& me, bool userRet)
  43. {
  44. if (!sichtbar) pos.x += me.mx, pos.y += me.my + 15;
  45. if (hatStyleNicht(Style::Sichtbar) || !me.insideParent || me.verarbeitet
  46. || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y || !userRet)
  47. {
  48. mausIn2 = 0;
  49. if (!mausIn && sichtbar)
  50. {
  51. if (onHide && sichtbar) onHide(this);
  52. sichtbar = 0;
  53. }
  54. bool verarbeitet = me.verarbeitet;
  55. me.verarbeitet |= hatStyleNicht(Style::Sichtbar);
  56. bool insideParent = me.insideParent;
  57. me.insideParent = 0;
  58. int rbr = 0;
  59. if (hatStyle(Style::Rahmen) && rahmen) rbr = rahmen->getRBreite();
  60. me.mx -= rbr;
  61. me.my -= rbr;
  62. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  63. me.my += vertikalScrollBar->getScroll();
  64. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  65. me.mx += horizontalScrollBar->getScroll();
  66. if (me.id != ME_Betritt && me.id != ME_Leaves)
  67. {
  68. for (int i = members->getEintragAnzahl() - 1; i >= 0; i--)
  69. members->z(i)->doPublicMausEreignis(me);
  70. }
  71. me.mx += rbr;
  72. me.my += rbr;
  73. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  74. me.my -= vertikalScrollBar->getScroll();
  75. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  76. me.mx -= horizontalScrollBar->getScroll();
  77. me.insideParent = insideParent;
  78. if (hatStyleNicht(Style::Sichtbar)) me.verarbeitet = verarbeitet;
  79. return;
  80. }
  81. mausIn2 = 1;
  82. if (sichtbar)
  83. {
  84. int rbr = 0;
  85. if (hatStyle(Style::Rahmen) && rahmen) rbr = rahmen->getRBreite();
  86. me.mx -= rbr;
  87. me.my -= rbr;
  88. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  89. me.my += vertikalScrollBar->getScroll();
  90. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  91. me.mx += horizontalScrollBar->getScroll();
  92. for (auto z : *members)
  93. z->doPublicMausEreignis(me);
  94. me.mx += rbr;
  95. me.my += rbr;
  96. if (hatStyle(Style::VScroll) && vertikalScrollBar)
  97. me.my -= vertikalScrollBar->getScroll();
  98. if (hatStyle(Style::HScroll) && horizontalScrollBar)
  99. me.mx -= horizontalScrollBar->getScroll();
  100. }
  101. if (sichtbar) me.verarbeitet = 1;
  102. if (alpha) rend = 1;
  103. }
  104. // Fügt eine Zeichnung zum Tooltip hinzu
  105. // m: die neue Zeichnung
  106. void ToolTip::addMember(Zeichnung* m)
  107. {
  108. members->add(m);
  109. }
  110. void ToolTip::removeMember(Zeichnung* zM)
  111. {
  112. int index = 0;
  113. for (auto i : *members)
  114. {
  115. if (i == zM)
  116. {
  117. members->remove(index);
  118. return;
  119. }
  120. index++;
  121. }
  122. }
  123. // Entfernt eine Zeichnung vom Tooltip
  124. // i: der Index der Zeichnung
  125. void ToolTip::removeMember(int i)
  126. {
  127. members->remove(i);
  128. }
  129. // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip angezeigt wird
  130. // onShow: Die Funktion
  131. void ToolTip::setShowEvent(std::function<void(ToolTip*)> onShow)
  132. {
  133. this->onShow = onShow;
  134. }
  135. // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip nicht mehr
  136. // angezeigt wird
  137. // onShow: Die Funktion
  138. void ToolTip::setHideEvent(std::function<void(ToolTip*)> onHide)
  139. {
  140. this->onHide = onHide;
  141. }
  142. void ToolTip::setWarten(double warten)
  143. {
  144. this->warten = warten;
  145. }
  146. void ToolTip::setAnimationSpeed(double speed)
  147. {
  148. animationSpeed = speed;
  149. }
  150. void ToolTip::setMausIn(bool mausIn)
  151. {
  152. if (this->mausIn != mausIn) rend = 1;
  153. this->mausIn = mausIn;
  154. if (!mausIn && !mausIn2 && sichtbar)
  155. {
  156. if (sichtbar && onHide) onHide(this);
  157. sichtbar = 0;
  158. }
  159. }
  160. void ToolTip::wartenReset()
  161. {
  162. wartenCount = 0;
  163. }
  164. void ToolTip::setZeichnen()
  165. {
  166. zeichnen = 1;
  167. }
  168. bool ToolTip::tick(double tickVal)
  169. {
  170. for (auto z : *members)
  171. {
  172. size.x
  173. = MAX(size.x, z->getX() + z->getBreite() + 2 * getRahmenBreite());
  174. size.y
  175. = MAX(size.y, z->getY() + z->getHeight() + 2 * getRahmenBreite());
  176. }
  177. this->tval += tickVal * animationSpeed;
  178. int val = (int)this->tval;
  179. if (val < 1)
  180. {
  181. bool ret = rend;
  182. rend = 0;
  183. return ret;
  184. }
  185. this->tval -= val;
  186. if (!sichtbar)
  187. {
  188. if (alpha)
  189. {
  190. if (alpha - val < 0)
  191. alpha = 0;
  192. else
  193. alpha = (unsigned char)(alpha - val);
  194. rend = 1;
  195. }
  196. if (mausIn)
  197. {
  198. wartenCount += tickVal;
  199. if (wartenCount >= warten)
  200. {
  201. if (onShow) onShow(this);
  202. sichtbar = 1;
  203. wartenCount = 0;
  204. alpha = 0xFF;
  205. ZeichnungHintergrund::setSize(0, 0);
  206. }
  207. }
  208. else
  209. wartenCount = 0;
  210. }
  211. else
  212. {
  213. if (getBreite() < size.x)
  214. {
  215. ZeichnungHintergrund::setSize(getBreite() + val, getHeight());
  216. if (getBreite() > size.x)
  217. ZeichnungHintergrund::setSize(size.x, getHeight());
  218. rend = 1;
  219. }
  220. if (getHeight() < size.y)
  221. {
  222. ZeichnungHintergrund::setSize(getBreite(), getHeight() + val);
  223. if (getHeight() > size.y)
  224. ZeichnungHintergrund::setSize(getBreite(), size.y);
  225. rend = 1;
  226. }
  227. }
  228. return ZeichnungHintergrund::tick(tickVal);
  229. }
  230. void ToolTip::render(Bild& zRObj)
  231. {
  232. if (alpha && (zeichnen || mausIn2))
  233. {
  234. zRObj.setAlpha(alpha);
  235. setPosition(pos);
  236. if (getX() + getBreite() > zRObj.getBreite())
  237. setPosition(
  238. getX() - (getX() + getBreite() - zRObj.getBreite()), getY());
  239. if (getY() + getHeight() > zRObj.getHeight())
  240. setPosition(
  241. getX(), getY() - (getY() + getHeight() - zRObj.getHeight()));
  242. ZeichnungHintergrund::render(zRObj);
  243. Punkt p = pos;
  244. Punkt s = gr;
  245. if (hatStyle(ZeichnungHintergrund::Style::Rahmen))
  246. {
  247. p += Punkt(getRahmenBreite(), getRahmenBreite());
  248. s -= Punkt(getRahmenBreite(), getRahmenBreite()) * 2;
  249. }
  250. if (!zRObj.setDrawOptions(p, s))
  251. {
  252. zRObj.releaseAlpha();
  253. zeichnen = 0;
  254. return;
  255. }
  256. bool vSc = hatStyle(Style::VScroll) && vertikalScrollBar;
  257. bool hSc = hatStyle(Style::HScroll) && horizontalScrollBar;
  258. zRObj.addScrollOffset(hSc ? horizontalScrollBar->getScroll() : 0,
  259. vSc ? vertikalScrollBar->getScroll() : 0);
  260. for (auto z : *members)
  261. z->render(zRObj);
  262. zRObj.releaseDrawOptions();
  263. zRObj.releaseAlpha();
  264. zeichnen = 0;
  265. }
  266. }
  267. // constant
  268. Bildschirm* ToolTip::zBildschirm() const
  269. {
  270. return bildschirm;
  271. }
  272. // Gibt ein bestimmten member zurück (ohne erhöhten Reference Counter)
  273. // i: der Index des Members
  274. Zeichnung* ToolTip::zMember(int i) const
  275. {
  276. return members->z(i);
  277. }
  278. // Gibt ein bestimmten member zurück
  279. // i: der Index des Members
  280. Zeichnung* ToolTip::getMember(int i) const
  281. {
  282. return members->get(i);
  283. }
  284. // Gibt die Anzahl an Zeichnungen zurück, die zum Tooltip gehören
  285. int ToolTip::getMemberAnzahl() const
  286. {
  287. return members->getEintragAnzahl();
  288. }
  289. // Erzeugt eine komplette kopie eines tooltip
  290. Zeichnung* ToolTip::dublizieren() const
  291. {
  292. ToolTip* ret = new ToolTip(bildschirm);
  293. ret->size = size;
  294. ret->animationSpeed = animationSpeed;
  295. ret->warten = warten;
  296. ret->wartenCount = wartenCount;
  297. ret->tval = tval;
  298. ret->mausIn = mausIn;
  299. ret->alpha = alpha;
  300. ret->sichtbar = sichtbar;
  301. ret->zeichnen = zeichnen;
  302. ret->mausIn2 = mausIn2;
  303. for (auto z : *members)
  304. ret->addMember(dynamic_cast<Zeichnung*>(z->getThis()));
  305. return ret;
  306. }
  307. //! Prüft ob der Tooltip im moment angezeigt wird
  308. DLLEXPORT bool ToolTip::isVisible() const
  309. {
  310. return sichtbar;
  311. }