ToolTip.cpp 9.2 KB

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