Browse Source

Tooltip Update

Kolja Strohm 5 years ago
parent
commit
175c48e45a
5 changed files with 64 additions and 33 deletions
  1. 52 19
      ToolTip.cpp
  2. 2 10
      ToolTip.h
  3. 1 1
      UIMLView.cpp
  4. 6 2
      Zeichnung.cpp
  5. 3 1
      Zeichnung.h

+ 52 - 19
ToolTip.cpp

@@ -34,20 +34,6 @@ ToolTip::~ToolTip()
     members->release();
 }
 
-// nicht constant
-void ToolTip::setSize( int breite, int height )
-{
-    size.x = breite;
-    size.y = height;
-    rend = 1;
-}
-
-void ToolTip::setSize( Punkt &gr )
-{
-    size = gr;
-    rend = 1;
-}
-
 // Fügt eine Zeichnung zum Tooltip hinzu
 //  m: die neue Zeichnung
 void ToolTip::addMember( Zeichnung *m )
@@ -70,7 +56,7 @@ void ToolTip::setMausIn( bool mausIn )
     if( this->mausIn != mausIn )
         rend = 1;
     this->mausIn = mausIn;
-    if( !mausIn )
+    if( !mausIn && !mausIn2 )
         sichtbar = 0;
 }
 
@@ -86,6 +72,11 @@ void ToolTip::setZeichnen()
 
 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 )
@@ -121,14 +112,14 @@ bool ToolTip::tick( double tickVal )
     }
     else
     {
-        if( getBreite() != size.x )
+        if( getBreite() < size.x )
         {
             ZeichnungHintergrund::setSize( getBreite() + val, getHeight() );
             if( getBreite() > size.x )
                 ZeichnungHintergrund::setSize( size.x, getHeight() );
             rend = 1;
         }
-        if( getHeight() != size.y )
+        if( getHeight() < size.y )
         {
             ZeichnungHintergrund::setSize( getBreite(), getHeight() + val );
             if( getHeight() > size.y )
@@ -141,9 +132,17 @@ bool ToolTip::tick( double tickVal )
 
 void ToolTip::doMausEreignis( MausEreignis &me )
 {
-    if( mausIn )
+    if( mausIn && !sichtbar )
         pos.x = me.mx, pos.y = me.my + 15;
-    sichtbar = 0;
+    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;
 }
@@ -159,6 +158,21 @@ void ToolTip::render( Bild &zRObj )
         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;
     }
@@ -170,6 +184,25 @@ 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()
 {

+ 2 - 10
ToolTip.h

@@ -27,6 +27,7 @@ namespace Framework
         unsigned char alpha;
         bool sichtbar;
         bool zeichnen;
+        bool mausIn2;
         Bildschirm *bildschirm;
 
     public:
@@ -34,15 +35,6 @@ namespace Framework
         __declspec( dllexport ) ToolTip( Bildschirm *zSceen );
         // Destruktor
         __declspec( dllexport ) ~ToolTip();
-        // Setzt die ausgeklappte Größe.
-        //  breite: Die Breite in Pixeln
-        //  height: Die Höhe in Pixeln
-        // Die Größe wird beim rendern überschrieben
-        __declspec( dllexport ) void setSize( int breite, int height );
-        // Setzt die ausgeklappte Größe.
-        //  gr: Die Größe in Pixeln
-        // Die Größe wird beim rendern überschrieben
-        __declspec( dllexport ) void setSize( Punkt &gr );
         // Fügt eine Zeichnung zum Tooltip hinzu
         //  m: die neue Zeichnung
         __declspec( dllexport ) void addMember( Zeichnung *m );
@@ -71,7 +63,7 @@ namespace Framework
         __declspec( dllexport ) void render( Bild &zRObj ) override;
         // Gibt einen Zeiger auf den Bildschirm ohne erhöhten Reference Counter zurück, so dem der Tooltip gehört.
         __declspec( dllexport ) Bildschirm *zBildschirm() const;
-        // Erzeugt eine komplette kopie eines tooltips ohne gleiche referenzen
+        // Erzeugt eine komplette kopie eines tooltips
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
         // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
         //  return: 0.

+ 1 - 1
UIMLView.cpp

@@ -210,7 +210,7 @@ Zeichnung *UIMLView::parseElement( XML::Element *e )
         }
         // add general attributes
         if( z && e->hasAttribute( "tooltip" ) )
-            z->setToolTipText( e->getAttributeValue( "tooltip" ), init.initParam.bildschirm );
+            z->setToolTipText( e->getAttributeValue( "tooltip" ), init.initParam.bildschirm, init.initParam.schrift );
         if( z && e->hasAttribute( "style" ) )
             z->setStyle( (__int64)e->getAttributeValue( "style" ) );
         if( z && e->hasAttribute( "hidden" ) )

+ 6 - 2
Zeichnung.cpp

@@ -9,6 +9,8 @@
 #include "AlphaFeld.h"
 #include "Bild.h"
 #include "TextFeld.h"
+#include "UIInitialization.h"
+#include "Schrift.h"
 #ifdef WIN32
 #include <Windows.h>
 #endif
@@ -54,7 +56,7 @@ void Zeichnung::setRender()
     rend = 1;
 }
 
-void Zeichnung::setToolTipText( const char *txt, Bildschirm *zScreen )
+void Zeichnung::setToolTipText( const char *txt, Bildschirm *zScreen, Schrift *zSchrift )
 {
     if( !txt )
         toolTip = (ToolTip*)toolTip->release();
@@ -62,8 +64,10 @@ void Zeichnung::setToolTipText( const char *txt, Bildschirm *zScreen )
     {
         if( !toolTip )
             toolTip = new ToolTip( zScreen );
-        TextFeld *t = new TextFeld();
+        UIInit init = defaultUI( zSchrift, zScreen );
+        TextFeld *t = init.createTextFeld( init.initParam );
         t->setText( txt );
+        t->setSize( t->zTextRenderer()->getTextBreite( txt ), t->zTextRenderer()->getTextHeight( txt ) );
         toolTip->addMember( t );
     }
 }

+ 3 - 1
Zeichnung.h

@@ -20,6 +20,7 @@ namespace Framework
     class AlphaFeld; // AlphaFeld.h
     class VScrollBar; // Scroll.h
     class HScrollBar; // Scroll.h
+    class Schrift;
 
     // Eine Zeichnung für das 2D GUI Framework
     class Zeichnung
@@ -63,7 +64,8 @@ namespace Framework
         // Setzt den Text, der erscheint, wenn der Benutzer für längere Zeit mit der Maus in der Zeichnung verweilt
         //  txt: Der Text, der angezeigt werden soll
         //  zScreen: Ein Zeiger auf das Verwendete Bildschirm Objekt ohne erhöhten Reference Counter
-        __declspec( dllexport ) void setToolTipText( const char *txt, Bildschirm *zScreen );
+        //  zSchrift: Ein Zeiger auf die Schrift, die verwendet werden soll ohne erhöhten Reference Counter
+        __declspec( dllexport ) void setToolTipText( const char *txt, Bildschirm *zScreen, Schrift *zSchrift );
         // legt den tooltip fest
         // tt: der tooltip
         __declspec( dllexport ) void setToolTipZ( ToolTip *tt );