#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 ) { 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::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 ) 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() ); size.y = max( size.y, z->getY() + z->getHeight() ); } 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 ) { 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( mausIn && !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 ) 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( alpha ) rend = 1; } void ToolTip::render( Bild &zRObj ) { if( alpha && zeichnen ) { 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 = size; if( hatStyle( ZeichnungHintergrund::Style::Rahmen ) ) { p += Punkt( getRahmenBreite(), getRahmenBreite() ); s -= Punkt( getRahmenBreite(), getRahmenBreite() ) * 2; } if( !zRObj.setDrawOptions( p, s ) ) { zRObj.releaseAlpha(); zeichnen = 0; } 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() { Zeichnung::release(); if( ref == 1 ) { if( !bildschirm->removeToolTip( this ) ) delete this; } return 0; }