Browse Source

UIML Fenster layout verbessert

Kolja Strohm 5 years ago
parent
commit
38be601891
7 changed files with 81 additions and 23 deletions
  1. 16 1
      Fenster.cpp
  2. 4 0
      Fenster.h
  3. 2 2
      Framework.vcxproj
  4. 26 19
      UIMLView.cpp
  5. 1 1
      UIMLView.h
  6. 24 0
      Zeichnung.cpp
  7. 8 0
      Zeichnung.h

+ 16 - 1
Fenster.cpp

@@ -2078,6 +2078,21 @@ void Fenster::render( Bild &zRObj ) // zeichent nach zRObj
 }
 
 // constant 
+// Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
+int Fenster::getInnenBreite() const
+{
+    return getBreite() - 2 * getRBreite();
+}
+
+// Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
+int Fenster::getInnenHeight() const
+{
+    int th = 0;
+    if( hatStyle( Style::Titel ) && titel )
+        th += titel->getHeight();
+    return getHeight() - 2 * getRBreite() - th;
+}
+
 // -- Rahmen -- 
 Rahmen *Fenster::getRahmen() const // gibt den Rahmen zurück
 {
@@ -2100,7 +2115,7 @@ int Fenster::getRFarbe() const // gibt die Farbe des Rahmens zur
 
 int Fenster::getRBreite() const // gibt die breite des Rahmens zurück
 {
-    if( !rahmen )
+    if( !rahmen || hatStyleNicht( Style::Rahmen ) )
         return 0;
     return rahmen->getRBreite();
 }

+ 4 - 0
Fenster.h

@@ -477,6 +477,10 @@ namespace Framework
         // Zeichnet das Fentster nach zRObj, falls es sichtbar ist
         //  zRObj: Das Bild, in welches gezeichnet werden soll
         __declspec( dllexport ) void render( Bild &zRObj ) override;
+        // Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
+        __declspec( dllexport ) int getInnenBreite() const override;
+        // Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
+        __declspec( dllexport ) int getInnenHeight() const override;
         // Gibt den Rahmen des Fensters zurück
         __declspec( dllexport ) Rahmen *getRahmen() const;
         // Gibt den Rahmen des Fensters ohne erhöhen Reference Counter zurück

+ 2 - 2
Framework.vcxproj

@@ -132,8 +132,8 @@
 copy "x64\Debug\Framework.dll" "..\..\Spiele Platform\Klient\patcher\patcher\framework.dll"
 copy "x64\Debug\Framework.dll" "..\..\Spiele Platform\Klient\Icon\Icon\framework.dll"
 copy "x64\Debug\Framework.dll" "..\..\Spiele Platform\SMP\SMP\framework.dll"
-copy "x64\Debug\Framework.dll" "..\LTDB Konverter\LTDB Konverter\framework.dll"
-copy "x64\Debug\Framework.dll" "..\GSL Konverter\GSL Konverter\framework.dll"
+copy "x64\Debug\Framework.dll" "..\LTDBKonverter\LTDB Konverter\framework.dll"
+copy "x64\Debug\Framework.dll" "..\GSLKonverter\GSL Konverter\framework.dll"
 copy "x64\Debug\Framework.dll" "..\..\Spiele Platform\Klient\Fertig\Debug\x64\framework.dll"</Command>
       <Outputs>kopiere Dateien...;%(Outputs)</Outputs>
     </CustomBuildStep>

+ 26 - 19
UIMLView.cpp

@@ -195,6 +195,8 @@ Zeichnung *UIMLView::parseElement( XML::Element *e )
             parseFrame( e->getChilds(), f );
             if( e->hasAttribute( "title" ) )
                 f->setTitel( e->getAttributeValue( "title" ) );
+            if( e->hasAttribute( "title-height" ) )
+                f->zTTextFeld()->setSize( f->zTTextFeld()->getBreite(), e->getAttributeValue( "title-height" ) );
             z = f;
         }
         // add general attributes
@@ -212,7 +214,7 @@ Zeichnung *UIMLView::parseElement( XML::Element *e )
     return z;
 }
 
-void UIMLView::layout( XML::Element *e, Zeichnung *parent )
+void UIMLView::layout( XML::Element *e, int pWidth, int pHeight )
 {
     Text id = e->getAttributeValue( "id" );
     Zeichnung *z = members->z( id );
@@ -225,14 +227,14 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
             Text w = e->getAttributeValue( "width" );
             width = w;
             if( w.getText()[ w.getLength() - 1 ] == '%' )
-                width = (int)( ( parent->getBreite() / 100.0 ) * width );
+                width = (int)( ( pWidth / 100.0 ) * width );
         }
         if( e->hasAttribute( "height" ) )
         {
             Text h = e->getAttributeValue( "height" );
             height = h;
             if( h.getText()[ h.getLength() - 1 ] == '%' )
-                height = (int)( ( parent->getHeight() / 100.0 ) * height );
+                height = (int)( ( pHeight / 100.0 ) * height );
         }
         z->setSize( width, height );
         if( e->hasAttribute( "align-left" ) )
@@ -242,12 +244,12 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
             if( la.istGleich( "start" ) )
                 x = 0;
             else if( la.istGleich( "end" ) )
-                x = parent->getBreite();
+                x = pWidth;
             else
             {
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", la );
                 for( auto i = ed.getIterator(); i; i++ )
-                    layout( i, parent );
+                    layout( i, pWidth, pHeight );
                 Zeichnung *laz = members->z( la );
                 if( laz )
                     x = laz->getX() + laz->getBreite();
@@ -257,7 +259,7 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
                 Text mt = e->getAttributeValue( "margin-left" );
                 int m = mt;
                 if( mt.getText()[ mt.getLength() - 1 ] == '%' )
-                    m = (int)( ( parent->getBreite() / 100.0 ) * m );
+                    m = (int)( ( pWidth / 100.0 ) * m );
                 x += m;
             }
             z->setX( x );
@@ -269,12 +271,12 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
             if( ra.istGleich( "start" ) )
                 x = -z->getBreite();
             else if( ra.istGleich( "end" ) )
-                x = parent->getBreite() - z->getBreite();
+                x = pWidth - z->getBreite();
             else
             {
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", ra );
                 for( auto i = ed.getIterator(); i; i++ )
-                    layout( i, parent );
+                    layout( i, pWidth, pHeight );
                 Zeichnung *raz = members->z( ra );
                 if( raz )
                     x = raz->getX() - z->getBreite();
@@ -284,7 +286,7 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
                 Text mt = e->getAttributeValue( "margin-right" );
                 int m = mt;
                 if( mt.getText()[ mt.getLength() - 1 ] == '%' )
-                    m = (int)( ( parent->getBreite() / 100.0 ) * m );
+                    m = (int)( ( pWidth / 100.0 ) * m );
                 x -= m;
             }
             z->setX( x );
@@ -296,12 +298,12 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
             if( ta.istGleich( "start" ) )
                 y = 0;
             else if( ta.istGleich( "end" ) )
-                y = parent->getHeight();
+                y = pHeight;
             else
             {
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", ta );
                 for( auto i = ed.getIterator(); i; i++ )
-                    layout( i, parent );
+                    layout( i, pWidth, pHeight );
                 Zeichnung *taz = members->z( ta );
                 if( taz )
                     y = taz->getY() + taz->getHeight();
@@ -311,7 +313,7 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
                 Text mt = e->getAttributeValue( "margin-top" );
                 int m = mt;
                 if( mt.getText()[ mt.getLength() - 1 ] == '%' )
-                    m = (int)( ( parent->getHeight() / 100.0 ) * m );
+                    m = (int)( ( pHeight / 100.0 ) * m );
                 y += m;
             }
             z->setY( y );
@@ -323,12 +325,12 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
             if( ba.istGleich( "start" ) )
                 y = -z->getHeight();
             else if( ba.istGleich( "end" ) )
-                y = parent->getHeight() - z->getHeight();
+                y = pHeight - z->getHeight();
             else
             {
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", ba );
                 for( auto i = ed.getIterator(); i; i++ )
-                    layout( i, parent );
+                    layout( i, pWidth, pHeight );
                 Zeichnung *baz = members->z( ba );
                 if( baz )
                     y = baz->getY() - z->getHeight();
@@ -338,7 +340,7 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
                 Text mt = e->getAttributeValue( "margin-bottom" );
                 int m = mt;
                 if( mt.getText()[ mt.getLength() - 1 ] == '%' )
-                    m = (int)( ( parent->getHeight() / 100.0 ) * m );
+                    m = (int)( ( pHeight / 100.0 ) * m );
                 y -= m;
             }
             z->setY( y );
@@ -350,20 +352,25 @@ void UIMLView::layout( XML::Element *e, Zeichnung *parent )
             Text xt = e->getAttributeValue( "x" );
             x = xt;
             if( xt.getText()[ xt.getLength() - 1 ] == '%' )
-                x = (int)( ( parent->getBreite() / 100.0 ) * x );
+                x = (int)( ( pWidth / 100.0 ) * x );
         }
         if( e->hasAttribute( "y" ) )
         {
             Text yt = e->getAttributeValue( "y" );
             y = yt;
             if( yt.getText()[ yt.getLength() - 1 ] == '%' )
-                y = (int)( ( parent->getHeight() / 100.0 ) * y );
+                y = (int)( ( pHeight / 100.0 ) * y );
         }
         z->setPosition( x, y );
     }
+    if( z )
+    {
+        pWidth = z->getInnenBreite();
+        pHeight = z->getInnenHeight();
+    }
     // recursive layout
     for( auto i = e->getChilds(); i; i++ )
-        layout( i, z ? z : parent );
+        layout( i, pWidth, pHeight );
     if( z )
     {
         if( e->getName().istGleich( "table" ) )
@@ -420,7 +427,7 @@ void UIMLView::layout()
     {
         for( auto i = dom->getChilds(); i; i++ )
         {
-            layout( i._, this );
+            layout( i._, this->getInnenBreite(), this->getInnenHeight() );
         }
     }
 }

+ 1 - 1
UIMLView.h

@@ -80,7 +80,7 @@ namespace Framework
         void parseTable( Iterator<XML::Element*> childs, ObjTabelle *table );
         void parseFrame( Iterator<XML::Element*> childs, Fenster *frame );
         Zeichnung *parseElement( XML::Element *e );
-        void layout( XML::Element *e, Zeichnung *parent );
+        void layout( XML::Element *e, int pWidth, int pHeight );
 
     public:
         // Erstellt eine UIML View

+ 24 - 0
Zeichnung.cpp

@@ -307,6 +307,18 @@ int Zeichnung::getHeight() const // gibt die H
     return gr.y;
 }
 
+// Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
+int Zeichnung::getInnenBreite() const
+{
+    return gr.x;
+}
+
+// Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
+int Zeichnung::getInnenHeight() const
+{
+    return gr.y;
+}
+
 int Zeichnung::getX() const // gibt X zurück
 {
     return pos.x;
@@ -704,6 +716,18 @@ void ZeichnungHintergrund::render( Bild &rObj )
     unlockZeichnung();
 }
 
+// Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
+int ZeichnungHintergrund::getInnenBreite() const
+{
+    return getBreite() - 2 * getRahmenBreite();
+}
+
+// Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
+int ZeichnungHintergrund::getInnenHeight() const
+{
+    return getHeight() - 2 * getRahmenBreite();
+}
+
 Bild *ZeichnungHintergrund::getHintergrundBild() const // gibt getThis vom Hintergrund Bild zurück
 {
     if( !hintergrundBild )

+ 8 - 0
Zeichnung.h

@@ -161,6 +161,10 @@ namespace Framework
         __declspec( dllexport ) int getBreite() const;
         // Gibt die Höhe der Zeichnung in Pixeln zurück
         __declspec( dllexport ) int getHeight() const;
+        // Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
+        __declspec( dllexport ) virtual int getInnenBreite() const;
+        // Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
+        __declspec( dllexport ) virtual int getInnenHeight() const;
         // Gibt die X Position der Zeichnung in Pixeln zurück
         __declspec( dllexport ) int getX() const;
         // Gibt die Y Position der Zeichnung in Pixeln zurück
@@ -272,6 +276,10 @@ namespace Framework
         // Zeichnet den Hintergrund eines Zeichnunges nach rObj
         __declspec( dllexport ) void render( Bild &rObj ) override;
 
+        // Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
+        __declspec( dllexport ) virtual int getInnenBreite() const override;
+        // Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
+        __declspec( dllexport ) virtual int getInnenHeight() const override;
         // Gibt das Hintergrundbild zurück.
         //  return: 0, falls kein Hintergrundbild verwendet wird
         __declspec( dllexport ) Bild *getHintergrundBild() const;