123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- #include "ToolTip.h"
- #include "TextFeld.h"
- #include "Text.h"
- #include "AlphaFeld.h"
- #include "Bild.h"
- #include "MausEreignis.h"
- #include "Schrift.h"
- #include "Bildschirm.h"
- using namespace Framework;
- // Inhalt der ToolTip Klasse aus ToolTip.h
- // Konstruktor
- ToolTip::ToolTip( Bildschirm *zScreen )
- : ZeichnungHintergrund(),
- size( 0, 0 ),
- animationSpeed( 250 ),
- warten( 1 ),
- wartenCount( 0 ),
- tval( 0 ),
- mausIn( 0 ),
- alpha( 0 ),
- sichtbar( 0 ),
- zeichnen( 0 ),
- bildschirm( zScreen ),
- onShow( 0 ),
- onHide( 0 )
- {
- members = new RCArray< Zeichnung >();
- bildschirm->addToolTip( (ToolTip*)this->getThis() );
- }
- // Destruktor
- ToolTip::~ToolTip()
- {
- members->release();
- }
- // Fügt eine Zeichnung zum Tooltip hinzu
- // m: die neue Zeichnung
- void ToolTip::addMember( Zeichnung *m )
- {
- members->add( m );
- }
- void ToolTip::removeMember( Zeichnung *zM )
- {
- int index = 0;
- for( auto i = members->getIterator(); i; i++, index++ )
- {
- if( i._ == zM )
- {
- members->remove( index );
- return;
- }
- }
- }
- // Entfernt eine Zeichnung vom Tooltip
- // i: der Index der Zeichnung
- void ToolTip::removeMember( int i )
- {
- members->remove( i );
- }
- // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip angezeigt wird
- // onShow: Die Funktion
- void ToolTip::setShowEvent( std::function< void( ToolTip * ) > onShow )
- {
- this->onShow = onShow;
- }
- // setzt eine Funktion, die aufgerufen wird, sobald der Tooltip nicht mehr angezeigt wird
- // onShow: Die Funktion
- void ToolTip::setHideEvent( std::function< void( ToolTip * ) > onHide )
- {
- this->onHide = onHide;
- }
- void ToolTip::setWarten( double warten )
- {
- this->warten = warten;
- }
- void ToolTip::setAnimationSpeed( double speed )
- {
- animationSpeed = speed;
- }
- void ToolTip::setMausIn( bool mausIn )
- {
- if( this->mausIn != mausIn )
- rend = 1;
- this->mausIn = mausIn;
- if( !mausIn && !mausIn2 )
- {
- if( sichtbar && onHide )
- onHide( this );
- sichtbar = 0;
- }
- }
- void ToolTip::wartenReset()
- {
- wartenCount = 0;
- }
- void ToolTip::setZeichnen()
- {
- zeichnen = 1;
- }
- bool ToolTip::tick( double tickVal )
- {
- for( auto z = members->getIterator(); z; z++ )
- {
- size.x = MAX( size.x, z->getX() + z->getBreite() + 2 * getRahmenBreite() );
- size.y = MAX( size.y, z->getY() + z->getHeight() + 2 * getRahmenBreite() );
- }
- this->tval += tickVal * animationSpeed;
- int val = (int)this->tval;
- if( val < 1 )
- {
- bool ret = rend;
- rend = 0;
- return ret;
- }
- this->tval -= val;
- if( !sichtbar )
- {
- if( alpha )
- {
- if( alpha - val < 0 )
- alpha = 0;
- else
- alpha = (unsigned char)( alpha - val );
- rend = 1;
- }
- if( mausIn )
- {
- wartenCount += tickVal;
- if( wartenCount >= warten )
- {
- if( onShow )
- onShow( this );
- sichtbar = 1;
- wartenCount = 0;
- alpha = 0xFF;
- ZeichnungHintergrund::setSize( 0, 0 );
- }
- }
- else
- wartenCount = 0;
- }
- else
- {
- if( getBreite() < size.x )
- {
- ZeichnungHintergrund::setSize( getBreite() + val, getHeight() );
- if( getBreite() > size.x )
- ZeichnungHintergrund::setSize( size.x, getHeight() );
- rend = 1;
- }
- if( getHeight() < size.y )
- {
- ZeichnungHintergrund::setSize( getBreite(), getHeight() + val );
- if( getHeight() > size.y )
- ZeichnungHintergrund::setSize( getBreite(), size.y );
- rend = 1;
- }
- }
- return ZeichnungHintergrund::tick( tickVal );
- }
- void ToolTip::doMausEreignis( MausEreignis &me )
- {
- if( !sichtbar )
- pos.x = me.mx, pos.y = me.my + 15;
- mausIn2 = me.mx >= pos.x && me.my >= pos.y && me.mx <= pos.x + getBreite() && me.my <= pos.y + getHeight();
- if( !mausIn && !mausIn2 )
- {
- if( onHide && sichtbar )
- onHide( this );
- sichtbar = 0;
- }
- me.mx -= pos.x;
- me.my -= pos.y;
- for( auto z = members->getIterator(); z; z++ )
- z->doMausEreignis( me );
- me.mx += pos.x;
- me.my += pos.y;
- if( mausIn2 && sichtbar )
- me.verarbeitet = 1;
- if( alpha )
- rend = 1;
- }
- void ToolTip::render( Bild &zRObj )
- {
- if( alpha && ( zeichnen || mausIn2 ) )
- {
- zRObj.setAlpha( alpha );
- setPosition( pos );
- if( getX() + getBreite() > zRObj.getBreite() )
- setPosition( getX() - ( getX() + getBreite() - zRObj.getBreite() ), getY() );
- if( getY() + getHeight() > zRObj.getHeight() )
- setPosition( getX(), getY() - ( getY() + getHeight() - zRObj.getHeight() ) );
- ZeichnungHintergrund::render( zRObj );
- Punkt p = pos;
- Punkt s = gr;
- if( hatStyle( ZeichnungHintergrund::Style::Rahmen ) )
- {
- p += Punkt( getRahmenBreite(), getRahmenBreite() );
- s -= Punkt( getRahmenBreite(), getRahmenBreite() ) * 2;
- }
- if( !zRObj.setDrawOptions( p, s ) )
- {
- zRObj.releaseAlpha();
- zeichnen = 0;
- return;
- }
- for( auto z = members->getIterator(); z; z++ )
- z->render( zRObj );
- zRObj.releaseDrawOptions();
- zRObj.releaseAlpha();
- zeichnen = 0;
- }
- }
- // constant
- Bildschirm *ToolTip::zBildschirm() const
- {
- return bildschirm;
- }
- // Erzeugt eine komplette kopie eines tooltip
- Zeichnung *ToolTip::dublizieren() const
- {
- ToolTip *ret = new ToolTip( bildschirm );
- ret->size = size;
- ret->animationSpeed = animationSpeed;
- ret->warten = warten;
- ret->wartenCount = wartenCount;
- ret->tval = tval;
- ret->mausIn = mausIn;
- ret->alpha = alpha;
- ret->sichtbar = sichtbar;
- ret->zeichnen = zeichnen;
- ret->mausIn2 = mausIn2;
- for( auto z = members->getIterator(); z; z++ )
- ret->addMember( z->getThis() );
- return ret;
- }
- // Reference Counting
- Zeichnung *ToolTip::release()
- {
- if( ref == 1 )
- {
- Zeichnung::release();
- return 0;
- }
- else
- Zeichnung::release();
- if( ref == 1 )
- {
- members->leeren();
- if( !bildschirm->removeToolTip( this ) )
- delete this;
- }
- return 0;
- }
|