ToolTip.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. {
  25. members = new RCArray< Zeichnung >();
  26. bildschirm->addToolTip( ( ToolTip* )this->getThis() );
  27. }
  28. // Destruktor
  29. ToolTip::~ToolTip()
  30. {
  31. members->release();
  32. }
  33. // Fügt eine Zeichnung zum Tooltip hinzu
  34. // m: die neue Zeichnung
  35. void ToolTip::addMember( Zeichnung *m )
  36. {
  37. members->add( m );
  38. }
  39. void ToolTip::setWarten( double warten )
  40. {
  41. this->warten = warten;
  42. }
  43. void ToolTip::setAnimationSpeed( double speed )
  44. {
  45. animationSpeed = speed;
  46. }
  47. void ToolTip::setMausIn( bool mausIn )
  48. {
  49. if( this->mausIn != mausIn )
  50. rend = 1;
  51. this->mausIn = mausIn;
  52. if( !mausIn && !mausIn2 )
  53. sichtbar = 0;
  54. }
  55. void ToolTip::wartenReset()
  56. {
  57. wartenCount = 0;
  58. }
  59. void ToolTip::setZeichnen()
  60. {
  61. zeichnen = 1;
  62. }
  63. bool ToolTip::tick( double tickVal )
  64. {
  65. for( auto z = members->getIterator(); z; z++ )
  66. {
  67. size.x = max( size.x, z->getX() + z->getBreite() );
  68. size.y = max( size.y, z->getY() + z->getHeight() );
  69. }
  70. this->tval += tickVal * animationSpeed;
  71. int val = ( int )this->tval;
  72. if( val < 1 )
  73. {
  74. bool ret = rend;
  75. rend = 0;
  76. return ret;
  77. }
  78. this->tval -= val;
  79. if( !sichtbar )
  80. {
  81. if( alpha )
  82. {
  83. if( alpha - val < 0 )
  84. alpha = 0;
  85. else
  86. alpha = (unsigned char)( alpha - val );
  87. rend = 1;
  88. }
  89. if( mausIn )
  90. {
  91. wartenCount += tickVal;
  92. if( wartenCount >= warten )
  93. {
  94. sichtbar = 1;
  95. wartenCount = 0;
  96. alpha = 0xFF;
  97. ZeichnungHintergrund::setSize( 0, 0 );
  98. }
  99. }
  100. else
  101. wartenCount = 0;
  102. }
  103. else
  104. {
  105. if( getBreite() < size.x )
  106. {
  107. ZeichnungHintergrund::setSize( getBreite() + val, getHeight() );
  108. if( getBreite() > size.x )
  109. ZeichnungHintergrund::setSize( size.x, getHeight() );
  110. rend = 1;
  111. }
  112. if( getHeight() < size.y )
  113. {
  114. ZeichnungHintergrund::setSize( getBreite(), getHeight() + val );
  115. if( getHeight() > size.y )
  116. ZeichnungHintergrund::setSize( getBreite(), size.y );
  117. rend = 1;
  118. }
  119. }
  120. return ZeichnungHintergrund::tick( tickVal );
  121. }
  122. void ToolTip::doMausEreignis( MausEreignis &me )
  123. {
  124. if( mausIn && !sichtbar )
  125. pos.x = me.mx, pos.y = me.my + 15;
  126. mausIn2 = me.mx >= pos.x && me.my >= pos.y && me.mx <= pos.x + getBreite() && me.my <= pos.y + getHeight();
  127. if( !mausIn && !mausIn2 )
  128. sichtbar = 0;
  129. me.mx -= pos.x;
  130. me.my -= pos.y;
  131. for( auto z = members->getIterator(); z; z++ )
  132. z->doMausEreignis( me );
  133. me.mx += pos.x;
  134. me.my += pos.y;
  135. if( alpha )
  136. rend = 1;
  137. }
  138. void ToolTip::render( Bild &zRObj )
  139. {
  140. if( alpha && zeichnen )
  141. {
  142. zRObj.setAlpha( alpha );
  143. setPosition( pos );
  144. if( getX() + getBreite() > zRObj.getBreite() )
  145. setPosition( getX() - ( getX() + getBreite() - zRObj.getBreite() ), getY() );
  146. if( getY() + getHeight() > zRObj.getHeight() )
  147. setPosition( getX(), getY() - ( getY() + getHeight() - zRObj.getHeight() ) );
  148. ZeichnungHintergrund::render( zRObj );
  149. Punkt p = pos;
  150. Punkt s = size;
  151. if( hatStyle( ZeichnungHintergrund::Style::Rahmen ) )
  152. {
  153. p += Punkt( getRahmenBreite(), getRahmenBreite() );
  154. s -= Punkt( getRahmenBreite(), getRahmenBreite() ) * 2;
  155. }
  156. if( !zRObj.setDrawOptions( p, s ) )
  157. {
  158. zRObj.releaseAlpha();
  159. zeichnen = 0;
  160. }
  161. for( auto z = members->getIterator(); z; z++ )
  162. z->render( zRObj );
  163. zRObj.releaseDrawOptions();
  164. zRObj.releaseAlpha();
  165. zeichnen = 0;
  166. }
  167. }
  168. // constant
  169. Bildschirm *ToolTip::zBildschirm() const
  170. {
  171. return bildschirm;
  172. }
  173. // Erzeugt eine komplette kopie eines tooltip
  174. Zeichnung *ToolTip::dublizieren() const
  175. {
  176. ToolTip *ret = new ToolTip( bildschirm );
  177. ret->size = size;
  178. ret->animationSpeed = animationSpeed;
  179. ret->warten = warten;
  180. ret->wartenCount = wartenCount;
  181. ret->tval = tval;
  182. ret->mausIn = mausIn;
  183. ret->alpha = alpha;
  184. ret->sichtbar = sichtbar;
  185. ret->zeichnen = zeichnen;
  186. ret->mausIn2 = mausIn2;
  187. for( auto z = members->getIterator(); z; z++ )
  188. ret->addMember( z->getThis() );
  189. return ret;
  190. }
  191. // Reference Counting
  192. Zeichnung *ToolTip::release()
  193. {
  194. Zeichnung::release();
  195. if( ref == 1 )
  196. {
  197. if( !bildschirm->removeToolTip( this ) )
  198. delete this;
  199. }
  200. return 0;
  201. }