[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/3.5/kdetoys/kweather
From:       Martin Koller <m.koller () surfeu ! at>
Date:       2006-12-28 0:06:06
Message-ID: 1167264366.165547.10617.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 617101 by mkoller:

BUG: 81098
BUG: 73202
BUG: 134387

Fix layouting in all different display modes and kicker orientation modes
Always use a sane font size and limit overall size of applet


 M  +209 -68   dockwidget.cpp  
 M  +2 -2      weatherbutton.h  


--- branches/KDE/3.5/kdetoys/kweather/dockwidget.cpp #617100:617101
@@ -21,7 +21,7 @@
 #include "weatherservice_stub.h"
 
 #include <qtooltip.h>
-#include <qvbox.h>
+#include <qlayout.h>
 #include <qlabel.h>
 #include <qtimer.h>
 
@@ -32,11 +32,11 @@
 dockwidget::dockwidget(const QString &location, QWidget *parent,
         const char *name) : QWidget(parent,name), m_locationCode( location ), \
m_orientation( Horizontal )  {
+    m_font = KGlobalSettings::generalFont();
     initDock();
     connect(m_button, SIGNAL( clicked() ), SIGNAL( buttonClicked() ));
 
     m_weatherService = new WeatherService_stub( "KWeatherService", "WeatherService" \
                );
-    m_font = KGlobalSettings::generalFont();
 
     setBackgroundOrigin( AncestorOrigin );
 }
@@ -176,6 +176,18 @@
     m_lblWind->setMargin(0);
     m_lblPres->setMargin(0);
 
+    QBoxLayout *mainLayout = new QBoxLayout(this, QBoxLayout::TopToBottom);
+    mainLayout->setSpacing(0);
+    mainLayout->setMargin(0);
+    mainLayout->addWidget(m_button, 0, Qt::AlignCenter);
+
+    QBoxLayout *layout = new QBoxLayout(mainLayout, QBoxLayout::TopToBottom);
+    layout->setSpacing(0);
+    layout->setMargin(0);
+    layout->addWidget(m_lblTemp);
+    layout->addWidget(m_lblWind);
+    layout->addWidget(m_lblPres);
+
     updateFont();
 
     QTimer::singleShot( 0, this, SLOT( showWeather() ) );
@@ -187,86 +199,168 @@
     kdDebug(12004) << "Changing to size " << size << endl;
     resize(size);
 
-    int w = size.width();
-    int h = size.height();
-
-    if (m_orientation == Horizontal)
+    if ( m_orientation == Horizontal ) // Kicker in horizontal mode
     {
-        // in case we previously set this to hcenter previously
-        // and now change the layout
-        m_lblTemp->setAlignment(AlignVCenter);
+        int h = size.height();
 
-        // Kicker in horizontal mode
-        if( m_mode == ShowAll)
+        if ( m_mode == ShowAll )
         {
-            m_lblTemp->setGeometry(h+1, 0, w-h, h/3);
-            m_lblWind->setGeometry(h+1, h/3, w-h, h/3);
-            m_lblPres->setGeometry(h+1, 2*h/3, w-h, h/3);
-            m_button->setGeometry(0, 0, h, h);
+            if ( h <= 128 )  // left to right layout
+            {
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
 +                m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+                m_lblWind->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+                m_lblPres->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+            }
+            else  // top to bottom
+            {
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
 +                QFontMetrics fm(m_font);
+                h = 128 - (3 * fm.height());  // 3 lines of text below the button
+                m_lblTemp->setAlignment(Qt::AlignCenter);
+                m_lblWind->setAlignment(Qt::AlignCenter);
+                m_lblPres->setAlignment(Qt::AlignCenter);
+            }
+            m_button->setFixedSize(h, h);
         }
-        else if ( m_mode == ShowTempOnly)
+        else if ( m_mode == ShowTempOnly )
         {
-            if (h > 32)
+            if ( h <= 32 )  // left to right
             {
-                m_lblTemp->setAlignment(AlignVCenter | AlignHCenter);
-                m_lblTemp->setGeometry(1, h - h/5, w - 2, h/5);
-                m_button->setGeometry(0, 0, 4*h/5, 4*h/5);
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
 +                m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
             }
-            else
+            else  // top to bottom
             {
-                m_lblTemp->setGeometry(h+1, 0, w-h, h);
-                m_button->setGeometry(0, 0, h, h );
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
 +                QFontMetrics fm(m_font);
+                h = QMIN(128, h) - fm.height();
+                m_lblTemp->setAlignment(Qt::AlignCenter);
             }
+            m_button->setFixedSize(h, h);
         }
         else
         {
-            m_button->setGeometry(0, 0, h, h );
+            h = QMIN(h, 128);
+            m_button->setFixedSize(h, h);
         }
     }
-    else
+    else // Kicker in vertical mode
     {
-        // Kicker in vertical mode
-        if( m_mode == ShowAll)
+        int w = size.width();
+        int h = size.height();
+
+        if ( m_mode == ShowAll )
         {
-            m_lblTemp->setGeometry(0, w, w, w/3);
-            m_lblWind->setGeometry(0, 4*w/3, w, w/3);
-            m_lblPres->setGeometry(0, 5*w/3, w, w/3);
+            if ( w <= 128 )  // top to bottom
+            {
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
 +                m_lblTemp->setAlignment(Qt::AlignCenter);
+                m_lblWind->setAlignment(Qt::AlignCenter);
+                m_lblPres->setAlignment(Qt::AlignCenter);
+
+                QFontMetrics fm(m_font);
+                h = h - (3 * fm.height());  // 3 lines of text below the button
+                h = QMIN(w, h);
+            }
+            else  // left to right layout
+            {
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
 +                m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+                m_lblWind->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+                m_lblPres->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+            }
+            m_button->setFixedSize(h, h);
         }
-        else if ( m_mode == ShowTempOnly)
+        else if ( m_mode == ShowTempOnly )
         {
-            m_lblTemp->setGeometry(1, w, w, h-(w+1) );
+            if ( w <= 128 )  // top to bottom
+            {
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::TopToBottom);
 +                m_lblTemp->setAlignment(Qt::AlignCenter);
+
+                h = w;
+            }
+            else  // left to right layout
+            {
+                static_cast<QBoxLayout*>(layout())->setDirection(QBoxLayout::LeftToRight);
 +                m_lblTemp->setAlignment(Qt::AlignAuto | Qt::AlignVCenter);
+
+                h = static_cast<int>(w * 0.33);
+            }
+            m_button->setFixedSize(h, h);
         }
-        m_button->setGeometry(0, 0, w, w );
+        else
+        {
+            w = QMIN(w, 128);
+            m_button->setFixedSize(w, w);
+        }
     }
-    updateFont();
 }
 
 int dockwidget::widthForHeight(int h)
 {
-    int w=h;
-    QFontMetrics fm(m_font);
+    int w;
+    QFontInfo fi(KGlobalSettings::generalFont());
 
-    if( m_mode == ShowAll)
+    if ( m_mode == ShowAll )
     {
-        m_font.setPixelSize( h/3-2 );
-        w = h + QMAX(fm.width(m_lblWind->text()),
-        fm.width(m_lblPres->text())) + 1;
+        if ( h <= 128 )  // left to right layout
+        {
+            int pixelSize = h/3 - 3;
+            pixelSize = QMIN(pixelSize, fi.pixelSize());  // don't make it too large
+            m_font.setPixelSize(pixelSize);
+            QFontMetrics fm(m_font);
+            w = h + QMAX(fm.width(m_lblWind->text()), fm.width(m_lblPres->text())) + \
1; +        }
+        else  // top to bottom
+        {
+            if ( fi.pixelSize() * 3 <= (h/2) )  // half icon, half text
+            {
+                m_font = KGlobalSettings::generalFont();
+            }
+            else
+            {
+                m_font.setPixelSize(h/2/3);
+            }
+            QFontMetrics fm(m_font);
+            // size of icon
+            h = 128 - (3 * fm.height());  // 3 lines of text below the button
+            w = QMAX(fm.width(m_lblWind->text()), fm.width(m_lblPres->text())) + 1;
+            w = QMAX(h, w);  // at least width of square icon
+        }
     }
-    else if ( m_mode == ShowTempOnly)
+    else if ( m_mode == ShowTempOnly )
     {
-        QFontInfo fi( KGlobalSettings::generalFont() );
-        int pixelSize = QMIN( h, fi.pixelSize() );
-        m_font.setPixelSize( pixelSize );
-
-        if (h > 32)
+        if ( h <= 32 )  // left to right layout
         {
-            w = 4*h/5;
+            int pixelSize = h - 3;
+            pixelSize = QMIN(pixelSize, fi.pixelSize());  // don't make it too large
+            m_font.setPixelSize(pixelSize);
+            QFontMetrics fm(m_font);
+            w = h + fm.width(m_lblTemp->text()) + 1;
         }
-        else
+        else  // top to bottom
         {
-            w = h + fm.width(m_lblTemp->text()) + 1;
+            if ( fi.pixelSize() <= (h/2) )  // half icon, half text
+            {
+                m_font = KGlobalSettings::generalFont();
+            }
+            else
+            {
+                m_font.setPixelSize(h/2);
+            }
+            QFontMetrics fm(m_font);
+            // size of icon
+            h = QMIN(128, h) - fm.height();
+            w = fm.width(m_lblTemp->text()) + 1;
+            w = QMAX(h, w);  // at least width of square icon
         }
     }
+    else
+    {
+        w = QMIN(128, h);  // don't make it too large
+    }
 
     updateFont();
     return w;
@@ -275,33 +369,80 @@
 int dockwidget::heightForWidth( int w )
 {
     int h;
-    // Adjust the height of the font to compensate for width
-    int startSize = w;
-    int width = w + 1;
 
     if ( m_mode == ShowAll )
     {
-       while( (width > w)  && (startSize > 0))
-       {
-           m_font.setPixelSize( --startSize );
-           QFontMetrics fm(m_font);
-           width = QMAX(fm.width(m_lblWind->text()),
-                        fm.width(m_lblPres->text()));
-       }
-       h = ( w * 2 );
+        QFontMetrics fmg(KGlobalSettings::generalFont());
+        int maxWidth = fmg.width("888 km/h NNWW");  // a good approximation
+
+        if ( w <= 128 )  // top to bottom
+        {
+            if ( maxWidth <= w )  // enough space to use global font
+            {
+                m_font = KGlobalSettings::generalFont();
+            }
+            else  // we have to reduce the fontsize
+            {
+                m_font.setPixelSize(static_cast<int>(fmg.height() * double(w) / \
maxWidth)); +            }
+
+            QFontMetrics fm(m_font);
+            h = w + (3 * fm.height());  // 3 lines of text below the button
+        }
+        else
+        {
+            if ( w >= (maxWidth * 1.5) )  // half of text width shall be icon
+            {
+                m_font = KGlobalSettings::generalFont();
+            }
+            else
+            {
+                m_font.setPixelSize(static_cast<int>(fmg.height() * (w*0.66) / \
maxWidth)); +            }
+
+            QFontMetrics fm(m_font);
+            h = 3 * fm.height();  // 3 lines of text
+
+        }
     }
     else if ( m_mode == ShowTempOnly )
     {
-       while( (width > w)  && (startSize > 0))
-       {
-           m_font.setPixelSize( --startSize );
-           QFontMetrics fm(m_font);
-           width = fm.width(m_lblTemp->text());
-       }
-       h = w + startSize + 2;
+        QFontMetrics fmg(KGlobalSettings::generalFont());
+        int maxWidth = fmg.width("888.88 CC");  // a good approximation
+
+        if ( w <= 128 )  // top to bottom
+        {
+            if ( maxWidth <= w )  // enough space to use global font
+            {
+                m_font = KGlobalSettings::generalFont();
+            }
+            else  // we have to reduce the fontsize
+            {
+                m_font.setPixelSize(static_cast<int>(fmg.height() * double(w) / \
maxWidth)); +            }
+
+            QFontMetrics fm(m_font);
+            h = w + fm.height();  // text below the button
+        }
+        else
+        {
+            if ( w >= (maxWidth * 1.5) )  // half of text width shall be icon
+            {
+                m_font = KGlobalSettings::generalFont();
+            }
+            else
+            {
+                m_font.setPixelSize(static_cast<int>(fmg.height() * (w*0.66) / \
maxWidth)); +            }
+
+            QFontMetrics fm(m_font);
+            h = QMAX(fm.height(), static_cast<int>(w * 0.33));
+        }
     }
     else
-        h = w;
+    {
+        h = QMIN(128, w);  // don't make it too large
+    }
 
     updateFont();
     return h;
--- branches/KDE/3.5/kdetoys/kweather/weatherbutton.h #617100:617101
@@ -34,8 +34,8 @@
   protected:
     void drawButton( QPainter *p );
     void drawButtonLabel( QPainter *p );
-    QSize margin() const { return QSize( 5, 5 ); }
-    QSize pixmapSize() const { return size() - margin(); }
+    QSize margin() const { return QSize( 3, 3 ); }
+    QSize pixmapSize() const { return size() - margin()*2; }
     QPoint pixmapOrigin() const;
     void generateIcons();
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic