ToolTip.cpp 8.9 KB

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