ToolTip.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #include "ToolTip.h"
  2. #include "TextFeld.h"
  3. #include "Text.h"
  4. #include "AlphaFeld.h"
  5. #include "Bild.h"
  6. #include "MausEreignis.h"
  7. #include "Schrift.h"
  8. #include "Bildschirm.h"
  9. #include "Rahmen.h"
  10. #include "Scroll.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 | Style::MEIgnoreSichtbar | Style::MEIgnoreVerarbeitet | Style::Erlaubt;
  31. members = new RCArray< Zeichnung >();
  32. bildschirm->addToolTip( dynamic_cast<ToolTip *>( this->getThis() ) );
  33. setMausEreignis( _ret1ME );
  34. }
  35. // Destruktor
  36. ToolTip::~ToolTip()
  37. {
  38. members->release();
  39. }
  40. void ToolTip::doMausEreignis( MausEreignis &me, bool userRet )
  41. {
  42. if( !sichtbar )
  43. pos.x += me.mx, pos.y += me.my + 15;
  44. if( hatStyleNicht( Style::Sichtbar ) || !me.insideParent || me.verarbeitet || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y || !userRet )
  45. {
  46. mausIn2 = 0;
  47. if( !mausIn && sichtbar )
  48. {
  49. if( onHide && sichtbar )
  50. onHide( this );
  51. sichtbar = 0;
  52. }
  53. bool verarbeitet = me.verarbeitet;
  54. me.verarbeitet |= hatStyleNicht( Style::Sichtbar );
  55. bool insideParent = me.insideParent;
  56. me.insideParent = 0;
  57. int rbr = 0;
  58. if( hatStyle( Style::Rahmen ) && rahmen )
  59. 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 ) )
  79. me.verarbeitet = verarbeitet;
  80. return;
  81. }
  82. mausIn2 = 1;
  83. if( sichtbar )
  84. {
  85. int rbr = 0;
  86. if( hatStyle( Style::Rahmen ) && rahmen )
  87. rbr = rahmen->getRBreite();
  88. me.mx -= rbr;
  89. me.my -= rbr;
  90. if( hatStyle( Style::VScroll ) && vertikalScrollBar )
  91. me.my += vertikalScrollBar->getScroll();
  92. if( hatStyle( Style::HScroll ) && horizontalScrollBar )
  93. me.mx += horizontalScrollBar->getScroll();
  94. for( auto z = members->getIterator(); z; z++ )
  95. z->doPublicMausEreignis( me );
  96. me.mx += rbr;
  97. me.my += rbr;
  98. if( hatStyle( Style::VScroll ) && vertikalScrollBar )
  99. me.my -= vertikalScrollBar->getScroll();
  100. if( hatStyle( Style::HScroll ) && horizontalScrollBar )
  101. me.mx -= horizontalScrollBar->getScroll();
  102. }
  103. if( sichtbar )
  104. me.verarbeitet = 1;
  105. if( alpha )
  106. rend = 1;
  107. }
  108. // Fügt eine Zeichnung zum Tooltip hinzu
  109. // m: die neue Zeichnung
  110. void ToolTip::addMember( Zeichnung *m )
  111. {
  112. members->add( m );
  113. }
  114. void ToolTip::removeMember( Zeichnung *zM )
  115. {
  116. int index = 0;
  117. for( auto i = members->getIterator(); i; i++, index++ )
  118. {
  119. if( i._ == zM )
  120. {
  121. members->remove( index );
  122. return;
  123. }
  124. }
  125. }
  126. // Entfernt eine Zeichnung vom Tooltip
  127. // i: der Index der Zeichnung
  128. void ToolTip::removeMember( int i )
  129. {
  130. members->remove( i );
  131. }
  132. // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip angezeigt wird
  133. // onShow: Die Funktion
  134. void ToolTip::setShowEvent( std::function< void( ToolTip * ) > onShow )
  135. {
  136. this->onShow = onShow;
  137. }
  138. // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip nicht mehr angezeigt wird
  139. // onShow: Die Funktion
  140. void ToolTip::setHideEvent( std::function< void( ToolTip * ) > onHide )
  141. {
  142. this->onHide = onHide;
  143. }
  144. void ToolTip::setWarten( double warten )
  145. {
  146. this->warten = warten;
  147. }
  148. void ToolTip::setAnimationSpeed( double speed )
  149. {
  150. animationSpeed = speed;
  151. }
  152. void ToolTip::setMausIn( bool mausIn )
  153. {
  154. if( this->mausIn != mausIn )
  155. rend = 1;
  156. this->mausIn = mausIn;
  157. if( !mausIn && !mausIn2 && sichtbar )
  158. {
  159. if( sichtbar && onHide )
  160. onHide( this );
  161. sichtbar = 0;
  162. }
  163. }
  164. void ToolTip::wartenReset()
  165. {
  166. wartenCount = 0;
  167. }
  168. void ToolTip::setZeichnen()
  169. {
  170. zeichnen = 1;
  171. }
  172. bool ToolTip::tick( double tickVal )
  173. {
  174. for( auto z = members->getIterator(); z; z++ )
  175. {
  176. size.x = MAX( size.x, z->getX() + z->getBreite() + 2 * getRahmenBreite() );
  177. size.y = MAX( size.y, z->getY() + z->getHeight() + 2 * getRahmenBreite() );
  178. }
  179. this->tval += tickVal * animationSpeed;
  180. int val = (int)this->tval;
  181. if( val < 1 )
  182. {
  183. bool ret = rend;
  184. rend = 0;
  185. return ret;
  186. }
  187. this->tval -= val;
  188. if( !sichtbar )
  189. {
  190. if( alpha )
  191. {
  192. if( alpha - val < 0 )
  193. alpha = 0;
  194. else
  195. alpha = (unsigned char)( alpha - val );
  196. rend = 1;
  197. }
  198. if( mausIn )
  199. {
  200. wartenCount += tickVal;
  201. if( wartenCount >= warten )
  202. {
  203. if( onShow )
  204. onShow( this );
  205. sichtbar = 1;
  206. wartenCount = 0;
  207. alpha = 0xFF;
  208. ZeichnungHintergrund::setSize( 0, 0 );
  209. }
  210. }
  211. else
  212. wartenCount = 0;
  213. }
  214. else
  215. {
  216. if( getBreite() < size.x )
  217. {
  218. ZeichnungHintergrund::setSize( getBreite() + val, getHeight() );
  219. if( getBreite() > size.x )
  220. ZeichnungHintergrund::setSize( size.x, getHeight() );
  221. rend = 1;
  222. }
  223. if( getHeight() < size.y )
  224. {
  225. ZeichnungHintergrund::setSize( getBreite(), getHeight() + val );
  226. if( getHeight() > size.y )
  227. ZeichnungHintergrund::setSize( getBreite(), size.y );
  228. rend = 1;
  229. }
  230. }
  231. return ZeichnungHintergrund::tick( tickVal );
  232. }
  233. void ToolTip::render( Bild &zRObj )
  234. {
  235. if( alpha && ( zeichnen || mausIn2 ) )
  236. {
  237. zRObj.setAlpha( alpha );
  238. setPosition( pos );
  239. if( getX() + getBreite() > zRObj.getBreite() )
  240. setPosition( getX() - ( getX() + getBreite() - zRObj.getBreite() ), getY() );
  241. if( getY() + getHeight() > zRObj.getHeight() )
  242. setPosition( getX(), getY() - ( getY() + getHeight() - zRObj.getHeight() ) );
  243. ZeichnungHintergrund::render( zRObj );
  244. Punkt p = pos;
  245. Punkt s = gr;
  246. if( hatStyle( ZeichnungHintergrund::Style::Rahmen ) )
  247. {
  248. p += Punkt( getRahmenBreite(), getRahmenBreite() );
  249. s -= Punkt( getRahmenBreite(), getRahmenBreite() ) * 2;
  250. }
  251. if( !zRObj.setDrawOptions( p, s ) )
  252. {
  253. zRObj.releaseAlpha();
  254. zeichnen = 0;
  255. return;
  256. }
  257. bool vSc = hatStyle( Style::VScroll ) && vertikalScrollBar;
  258. bool hSc = hatStyle( Style::HScroll ) && horizontalScrollBar;
  259. zRObj.addScrollOffset( hSc ? horizontalScrollBar->getScroll() : 0, vSc ? vertikalScrollBar->getScroll() : 0 );
  260. for( auto z = members->getIterator(); z; z++ )
  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->getIterator(); z; z++ )
  304. ret->addMember( dynamic_cast<Zeichnung *>( z->getThis() ) );
  305. return ret;
  306. }