[KPhotoAlbum] [PATCH 2/3] SettingsData: Default window geometry calculated

Henner Zeller h.zeller at acm.org
Tue Sep 23 21:33:31 BST 2008


The constant calculation in the beginning to estimate a useful size is
probably ok but adds a lot of clutter with not much gain. How about
starting with

 const float ratioW = 0.6;
 const float ratioH = 0.6;

.. and go from there ?
Another thing: if you have really small screens and end up smaller
than say 600x400 you might want to boost the size again up to the
screensize - some pixels.

-h

On Tue, Sep 23, 2008 at 5:18 AM, Michael Witten <mfwitten at mit.edu> wrote:
> There should almost never be a problem now with window geometry;
> take a look at the code for a detail description (in comments)
> of what is going on; I admittedly went a little overboard, but
> it was fun and it works and it should be pretty efficient.
>
> One problem that I forsee is that the code forces the window to
> be completely within the primary screen.
>
> Perhaps I will remedy this situation in another patch.
>
> Another possible problem is that the geometry (without the frame)
> is saved and restored. I have some code in place to account for
> this, but it's a hardcoded hack.
>
> Qt 4.2 actually provides a mechanism for saving and restoring
> window state:
>
>    (1) QWidget::saveGeometry()
>    (2) QWidget::restoreGeometry()
>
> Maybe that's better to use, as it handles screens already and
> other state bits, such as whether the window is maximized.
> However, it doesn't provide centering and the implementation
> looks kind of messy.
>
> Signed-off-by: Michael Witten <mfwitten at mit.edu>
> ---
>  Settings/SettingsData.cpp |   96 ++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 95 insertions(+), 1 deletions(-)
>
> diff --git a/Settings/SettingsData.cpp b/Settings/SettingsData.cpp
> index 2aa9fe2..4a9ef80 100644
> --- a/Settings/SettingsData.cpp
> +++ b/Settings/SettingsData.cpp
> @@ -479,5 +479,99 @@ void SettingsData::setWindowGeometry( WindowType win, const QRect& geometry )
>
>  QRect SettingsData::windowGeometry( WindowType win ) const
>  {
> -    return value( "Window Geometry", win, QRect(0,0,800,600) );
> +    QRect r( 0,0,0,0 );
> +    r = value( "Window Geometry", win, r );
> +
> +    // If the setting does not exist or if the stored rectangle
> +    // is not within the available screen, assume there is a
> +    // problem and recalculate a new default geometry for the
> +    // window:
> +
> +        QDesktopWidget* d = QApplication::desktop();
> +        QRect available = d->availableGeometry( d->primaryScreen() );
> +
> +        if ( r.width() && available.contains(r,true) )
> +            return r;
> +
> +    // It must be necessary to calculate a default window size. Because
> +    // every cycle is more coal burned at the power plant, we have a
> +    // moral obligation to optimize this calculation. The following will
> +    // develop some ideas in terms of constants that compilers should
> +    // use during compilation time.
> +    //
> +    // A typical display might have the following dimensions:
> +
> +            const float screenW = 1440;
> +            const float screenH =  900;
> +
> +    // However, let's assume that the border around the screen has been
> +    // commandeered and is not available:
> +
> +            const float availableW = screenW - 100;
> +            const float availableH = screenH - 200;
> +
> +    // Also, because Qt is cross-platform, it is unknown how the frame
> +    // (window decorations) affect the window geometry.
> +    //
> +    // Let's assume that most frames look roughly the same:
> +    //
> +    //      (1) A title bar of appreciable size, say:
> +
> +                    const float titleSize = 20;
> +
> +    //      (2) Three other borders of less appreciable size:
> +
> +                    const float borderSize = 5;
> +
> +    // Eventually, it will be necessary to readjust the location of the
> +    // window, assuming titleSize >= borderSize:
> +
> +            const float adjustForTitle = (titleSize - borderSize) / 2;
> +
> +    // Now, a good default window size (without a frame) on a screen with
> +    // this usable space has the following:
> +
> +            const float defaultW = 800 - borderSize * 2;
> +            const float defaultH = 600 - titleSize - borderSize;
> +
> +    // Then, we must have the following ratios:
> +
> +            const float ratioW = defaultW/availableW;
> +            const float ratioH = defaultH/availableH;
> +
> +    // In this case, the actually available space is given as:
> +
> +            float actuallyAvailableW = available.width();
> +            float actuallyAvailableH = available.height();
> +
> +    // Thus, the dimensions of the window should be:
> +
> +        float w = ratioW * actuallyAvailableW;
> +        float h = ratioH * actuallyAvailableH;
> +
> +    // To center the window, we pretend the window is in the top left corner
> +    // of the the available space and then move the window halfway to the
> +    // right side of the screen and halfway to the bottom of the screen:
> +    //
> +    //      distToMoveRight = (actuallyAvailableW - w) / 2 = (1-ratioW)*actuallyAvailableW/2
> +    //      distToMoveDown  = (actuallyAvailableH - h) / 2 = (1-ratioH)*actuallyAvailableH/2
> +    //
> +    // Let's name those factors:
> +
> +        const float centeringFactorW = (1-ratioW)/2;
> +        const float centeringFactorH = (1-ratioH)/2;
> +
> +    // So, within the available space:
> +
> +        float distToMoveRight = centeringFactorW * actuallyAvailableW;                   // (availableW - w) / 2 = (1-ratioW)*availableW/2
> +        float distToMoveDown  = centeringFactorH * actuallyAvailableH + adjustForTitle;  // (availableH - h) / 2 = (1-ratioH)*availableH/2
> +
> +    // Within the screen space:
> +
> +        r = QRect( available.left() + distToMoveRight, available.top() + distToMoveDown, w, h );
> +
> +    // Set it and forget it! It's just that easy!
> +
> +        setValue( "Window Geometry", win, r );
> +        return r;
>  }
> --
> 1.6.0.2.302.ge6cbd1
>
> _______________________________________________
> KPhotoAlbum mailing list
> KPhotoAlbum at kdab.net
> http://mail.kdab.net/mailman/listinfo/kphotoalbum
>



More information about the Kphotoalbum mailing list