ToolTip.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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. using namespace Framework;
  10. // Inhalt der ToolTip Klasse aus ToolTip.h
  11. // Konstruktor
  12. ToolTip::ToolTip( Bildschirm *zScreen )
  13. : ZeichnungHintergrund(),
  14. size( 0, 0 ),
  15. animationSpeed( 250 ),
  16. warten( 1 ),
  17. wartenCount( 0 ),
  18. tval( 0 ),
  19. mausIn( 0 ),
  20. alpha( 0 ),
  21. sichtbar( 0 ),
  22. zeichnen( 0 ),
  23. bildschirm( zScreen ),
  24. onShow( 0 ),
  25. onHide( 0 )
  26. {
  27. members = new RCArray< Zeichnung >();
  28. bildschirm->addToolTip( (ToolTip*)this->getThis() );
  29. }
  30. // Destruktor
  31. ToolTip::~ToolTip()
  32. {
  33. members->release();
  34. }
  35. // Fügt eine Zeichnung zum Tooltip hinzu
  36. // m: die neue Zeichnung
  37. void ToolTip::addMember( Zeichnung *m )
  38. {
  39. members->add( m );
  40. }
  41. void ToolTip::removeMember( Zeichnung *zM )
  42. {
  43. int index = 0;
  44. for( auto i = members->getIterator(); i; i++, index++ )
  45. {
  46. if( i._ == zM )
  47. {
  48. members->remove( index );
  49. return;
  50. }
  51. }
  52. }
  53. // Entfernt eine Zeichnung vom Tooltip
  54. // i: der Index der Zeichnung
  55. void ToolTip::removeMember( int i )
  56. {
  57. members->remove( i );
  58. }
  59. // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip angezeigt wird
  60. // onShow: Die Funktion
  61. void ToolTip::setShowEvent( std::function< void( ToolTip * ) > onShow )
  62. {
  63. this->onShow = onShow;
  64. }
  65. // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip nicht mehr angezeigt wird
  66. // onShow: Die Funktion
  67. void ToolTip::setHideEvent( std::function< void( ToolTip * ) > onHide )
  68. {
  69. this->onHide = onHide;
  70. }
  71. void ToolTip::setWarten( double warten )
  72. {
  73. this->warten = warten;
  74. }
  75. void ToolTip::setAnimationSpeed( double speed )
  76. {
  77. animationSpeed = speed;
  78. }
  79. void ToolTip::setMausIn( bool mausIn )
  80. {
  81. if( this->mausIn != mausIn )
  82. rend = 1;
  83. this->mausIn = mausIn;
  84. if( !mausIn && !mausIn2 )
  85. {
  86. if( sichtbar && onHide )
  87. onHide( this );
  88. sichtbar = 0;
  89. }
  90. }
  91. void ToolTip::wartenReset()
  92. {
  93. wartenCount = 0;
  94. }
  95. void ToolTip::setZeichnen()
  96. {
  97. zeichnen = 1;
  98. }
  99. bool ToolTip::tick( double tickVal )
  100. {
  101. for( auto z = members->getIterator(); z; z++ )
  102. {
  103. size.x = MAX( size.x, z->getX() + z->getBreite() + 2 * getRahmenBreite() );
  104. size.y = MAX( size.y, z->getY() + z->getHeight() + 2 * getRahmenBreite() );
  105. }
  106. this->tval += tickVal * animationSpeed;
  107. int val = (int)this->tval;
  108. if( val < 1 )
  109. {
  110. bool ret = rend;
  111. rend = 0;
  112. return ret;
  113. }
  114. this->tval -= val;
  115. if( !sichtbar )
  116. {
  117. if( alpha )
  118. {
  119. if( alpha - val < 0 )
  120. alpha = 0;
  121. else
  122. alpha = (unsigned char)( alpha - val );
  123. rend = 1;
  124. }
  125. if( mausIn )
  126. {
  127. wartenCount += tickVal;
  128. if( wartenCount >= warten )
  129. {
  130. if( onShow )
  131. onShow( this );
  132. sichtbar = 1;
  133. wartenCount = 0;
  134. alpha = 0xFF;
  135. ZeichnungHintergrund::setSize( 0, 0 );
  136. }
  137. }
  138. else
  139. wartenCount = 0;
  140. }
  141. else
  142. {
  143. if( getBreite() < size.x )
  144. {
  145. ZeichnungHintergrund::setSize( getBreite() + val, getHeight() );
  146. if( getBreite() > size.x )
  147. ZeichnungHintergrund::setSize( size.x, getHeight() );
  148. rend = 1;
  149. }
  150. if( getHeight() < size.y )
  151. {
  152. ZeichnungHintergrund::setSize( getBreite(), getHeight() + val );
  153. if( getHeight() > size.y )
  154. ZeichnungHintergrund::setSize( getBreite(), size.y );
  155. rend = 1;
  156. }
  157. }
  158. return ZeichnungHintergrund::tick( tickVal );
  159. }
  160. void ToolTip::doMausEreignis( MausEreignis &me )
  161. {
  162. if( !sichtbar )
  163. pos.x = me.mx, pos.y = me.my + 15;
  164. mausIn2 = me.mx >= pos.x && me.my >= pos.y && me.mx <= pos.x + getBreite() && me.my <= pos.y + getHeight();
  165. if( !mausIn && !mausIn2 )
  166. {
  167. if( onHide && sichtbar )
  168. onHide( this );
  169. sichtbar = 0;
  170. }
  171. me.mx -= pos.x;
  172. me.my -= pos.y;
  173. for( auto z = members->getIterator(); z; z++ )
  174. z->doMausEreignis( me );
  175. me.mx += pos.x;
  176. me.my += pos.y;
  177. if( mausIn2 && sichtbar )
  178. me.verarbeitet = 1;
  179. if( alpha )
  180. rend = 1;
  181. }
  182. void ToolTip::render( Bild &zRObj )
  183. {
  184. if( alpha && ( zeichnen || mausIn2 ) )
  185. {
  186. zRObj.setAlpha( alpha );
  187. setPosition( pos );
  188. if( getX() + getBreite() > zRObj.getBreite() )
  189. setPosition( getX() - ( getX() + getBreite() - zRObj.getBreite() ), getY() );
  190. if( getY() + getHeight() > zRObj.getHeight() )
  191. setPosition( getX(), getY() - ( getY() + getHeight() - zRObj.getHeight() ) );
  192. ZeichnungHintergrund::render( zRObj );
  193. Punkt p = pos;
  194. Punkt s = gr;
  195. if( hatStyle( ZeichnungHintergrund::Style::Rahmen ) )
  196. {
  197. p += Punkt( getRahmenBreite(), getRahmenBreite() );
  198. s -= Punkt( getRahmenBreite(), getRahmenBreite() ) * 2;
  199. }
  200. if( !zRObj.setDrawOptions( p, s ) )
  201. {
  202. zRObj.releaseAlpha();
  203. zeichnen = 0;
  204. return;
  205. }
  206. for( auto z = members->getIterator(); z; z++ )
  207. z->render( zRObj );
  208. zRObj.releaseDrawOptions();
  209. zRObj.releaseAlpha();
  210. zeichnen = 0;
  211. }
  212. }
  213. // constant
  214. Bildschirm *ToolTip::zBildschirm() const
  215. {
  216. return bildschirm;
  217. }
  218. // Erzeugt eine komplette kopie eines tooltip
  219. Zeichnung *ToolTip::dublizieren() const
  220. {
  221. ToolTip *ret = new ToolTip( bildschirm );
  222. ret->size = size;
  223. ret->animationSpeed = animationSpeed;
  224. ret->warten = warten;
  225. ret->wartenCount = wartenCount;
  226. ret->tval = tval;
  227. ret->mausIn = mausIn;
  228. ret->alpha = alpha;
  229. ret->sichtbar = sichtbar;
  230. ret->zeichnen = zeichnen;
  231. ret->mausIn2 = mausIn2;
  232. for( auto z = members->getIterator(); z; z++ )
  233. ret->addMember( z->getThis() );
  234. return ret;
  235. }
  236. // Reference Counting
  237. Zeichnung *ToolTip::release()
  238. {
  239. if( ref == 1 )
  240. {
  241. Zeichnung::release();
  242. return 0;
  243. }
  244. else
  245. Zeichnung::release();
  246. if( ref == 1 )
  247. {
  248. members->leeren();
  249. if( !bildschirm->removeToolTip( this ) )
  250. delete this;
  251. }
  252. return 0;
  253. }