Ignore:
Timestamp:
May 10, 2017, 3:20:54 PM (7 years ago)
Author:
stoecker
Message:

update qwt and qwtpolar, many QT5 fixes (unfinished)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/qwt/qwt_dyngrid_layout.cpp

    r4271 r8127  
    1010#include "qwt_dyngrid_layout.h"
    1111#include "qwt_math.h"
    12 #include <qwidget.h>
     12#include <qvector.h>
    1313#include <qlist.h>
    1414
     
    2525    mutable QList<QLayoutItem*> itemList;
    2626
    27     uint maxCols;
     27    uint maxColumns;
    2828    uint numRows;
    29     uint numCols;
     29    uint numColumns;
    3030
    3131    Qt::Orientations expanding;
     
    8282{
    8383    d_data = new QwtDynGridLayout::PrivateData;
    84     d_data->maxCols = d_data->numRows = d_data->numCols = 0;
     84    d_data->maxColumns = d_data->numRows = d_data->numColumns = 0;
    8585    d_data->expanding = 0;
    8686}
     
    105105/*!
    106106  Limit the number of columns.
    107   \param maxCols upper limit, 0 means unlimited
    108   \sa maxCols()
    109 */
    110 void QwtDynGridLayout::setMaxCols( uint maxCols )
    111 {
    112     d_data->maxCols = maxCols;
    113 }
    114 
    115 /*!
    116   Return the upper limit for the number of columns.
     107  \param maxColumns upper limit, 0 means unlimited
     108  \sa maxColumns()
     109*/
     110void QwtDynGridLayout::setMaxColumns( uint maxColumns )
     111{
     112    d_data->maxColumns = maxColumns;
     113}
     114
     115/*!
     116  \brief Return the upper limit for the number of columns.
     117
    117118  0 means unlimited, what is the default.
    118   \sa setMaxCols()
    119 */
    120 
    121 uint QwtDynGridLayout::maxCols() const
    122 {
    123     return d_data->maxCols;
    124 }
    125 
    126 //! Adds item to the next free position.
    127 
     119
     120  \return Upper limit for the number of columns
     121  \sa setMaxColumns()
     122*/
     123uint QwtDynGridLayout::maxColumns() const
     124{
     125    return d_data->maxColumns;
     126}
     127
     128/*!
     129  \brief Add an item to the next free position.
     130  \param item Layout item
     131 */
    128132void QwtDynGridLayout::addItem( QLayoutItem *item )
    129133{
     
    135139  \return true if this layout is empty.
    136140*/
    137 
    138141bool QwtDynGridLayout::isEmpty() const
    139142{
     
    144147  \return number of layout items
    145148*/
    146 
    147149uint QwtDynGridLayout::itemCount() const
    148150{
     
    151153
    152154/*!
    153   Find the item at a spcific index
     155  Find the item at a specific index
    154156
    155157  \param index Index
     158  \return Item at a specific index
    156159  \sa takeAt()
    157160*/
     
    165168
    166169/*!
    167   Find the item at a spcific index and remove it from the layout
     170  Find the item at a specific index and remove it from the layout
    168171
    169172  \param index Index
     173  \return Layout item, removed from the layout
    170174  \sa itemAt()
    171175*/
     
    200204
    201205/*!
    202   Returns whether this layout can make use of more space than sizeHint().
     206  \brief Returns whether this layout can make use of more space than sizeHint().
     207
    203208  A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only
    204209  one dimension, while Qt::Vertical | Qt::Horizontal means that it wants
    205210  to grow in both dimensions.
     211
     212  \return Orientations, where the layout expands
    206213  \sa setExpandingDirections()
    207214*/
     
    212219
    213220/*!
    214   Reorganizes columns and rows and resizes managed widgets within
    215   the rectangle rect.
     221  Reorganizes columns and rows and resizes managed items within
     222  a rectangle.
    216223
    217224  \param rect Layout geometry
     
    224231        return;
    225232
    226     d_data->numCols = columnsForWidth( rect.width() );
    227     d_data->numRows = itemCount() / d_data->numCols;
    228     if ( itemCount() % d_data->numCols )
     233    d_data->numColumns = columnsForWidth( rect.width() );
     234    d_data->numRows = itemCount() / d_data->numColumns;
     235    if ( itemCount() % d_data->numColumns )
    229236        d_data->numRows++;
    230237
    231     QList<QRect> itemGeometries = layoutItems( rect, d_data->numCols );
     238    QList<QRect> itemGeometries = layoutItems( rect, d_data->numColumns );
    232239
    233240    int index = 0;
     
    235242        it != d_data->itemList.end(); ++it )
    236243    {
    237         QWidget *w = ( *it )->widget();
    238         if ( w )
    239         {
    240             w->setGeometry( itemGeometries[index] );
    241             index++;
    242         }
    243     }
    244 }
    245 
    246 /*!
    247   Calculate the number of columns for a given width. It tries to
    248   use as many columns as possible (limited by maxCols())
     244        ( *it )->setGeometry( itemGeometries[index] );
     245        index++;
     246    }
     247}
     248
     249/*!
     250  \brief Calculate the number of columns for a given width.
     251
     252  The calculation tries to use as many columns as possible
     253  ( limited by maxColumns() )
    249254
    250255  \param width Available width for all columns
    251   \sa maxCols(), setMaxCols()
    252 */
    253 
     256  \return Number of columns for a given width
     257
     258  \sa maxColumns(), setMaxColumns()
     259*/
    254260uint QwtDynGridLayout::columnsForWidth( int width ) const
    255261{
     
    257263        return 0;
    258264
    259     const int maxCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount();
    260     if ( maxRowWidth( maxCols ) <= width )
    261         return maxCols;
    262 
    263     for ( int numCols = 2; numCols <= maxCols; numCols++ )
    264     {
    265         const int rowWidth = maxRowWidth( numCols );
     265    uint maxColumns = itemCount();
     266    if ( d_data->maxColumns > 0 )
     267        maxColumns = qMin( d_data->maxColumns, maxColumns );
     268
     269    if ( maxRowWidth( maxColumns ) <= width )
     270        return maxColumns;
     271
     272    for ( uint numColumns = 2; numColumns <= maxColumns; numColumns++ )
     273    {
     274        const int rowWidth = maxRowWidth( numColumns );
    266275        if ( rowWidth > width )
    267             return numCols - 1;
     276            return numColumns - 1;
    268277    }
    269278
     
    275284  columns.
    276285
    277   \param numCols Given number of columns
     286  \param numColumns Given number of columns
    278287  \param itemWidth Array of the width hints for all items
    279288*/
    280 int QwtDynGridLayout::maxRowWidth( int numCols ) const
     289int QwtDynGridLayout::maxRowWidth( int numColumns ) const
    281290{
    282291    int col;
    283292
    284     QVector<int> colWidth( numCols );
    285     for ( col = 0; col < numCols; col++ )
     293    QVector<int> colWidth( numColumns );
     294    for ( col = 0; col < numColumns; col++ )
    286295        colWidth[col] = 0;
    287296
     
    292301        index < d_data->itemSizeHints.count(); index++ )
    293302    {
    294         col = index % numCols;
     303        col = index % numColumns;
    295304        colWidth[col] = qMax( colWidth[col],
    296305            d_data->itemSizeHints[int( index )].width() );
    297306    }
    298307
    299     int rowWidth = 2 * margin() + ( numCols - 1 ) * spacing();
    300     for ( col = 0; col < numCols; col++ )
     308    int rowWidth = 2 * margin() + ( numColumns - 1 ) * spacing();
     309    for ( col = 0; col < numColumns; col++ )
    301310        rowWidth += colWidth[col];
    302311
     
    328337/*!
    329338  Calculate the geometries of the layout items for a layout
    330   with numCols columns and a given rect.
     339  with numColumns columns and a given rectangle.
    331340
    332341  \param rect Rect where to place the items
    333   \param numCols Number of columns
     342  \param numColumns Number of columns
    334343  \return item geometries
    335344*/
    336345
    337346QList<QRect> QwtDynGridLayout::layoutItems( const QRect &rect,
    338     uint numCols ) const
     347    uint numColumns ) const
    339348{
    340349    QList<QRect> itemGeometries;
    341     if ( numCols == 0 || isEmpty() )
     350    if ( numColumns == 0 || isEmpty() )
    342351        return itemGeometries;
    343352
    344     uint numRows = itemCount() / numCols;
    345     if ( numRows % itemCount() )
     353    uint numRows = itemCount() / numColumns;
     354    if ( numColumns % itemCount() )
    346355        numRows++;
    347356
     357    if ( numRows == 0 )
     358        return itemGeometries;
     359
    348360    QVector<int> rowHeight( numRows );
    349     QVector<int> colWidth( numCols );
    350 
    351     layoutGrid( numCols, rowHeight, colWidth );
     361    QVector<int> colWidth( numColumns );
     362
     363    layoutGrid( numColumns, rowHeight, colWidth );
    352364
    353365    bool expandH, expandV;
     
    356368
    357369    if ( expandH || expandV )
    358         stretchGrid( rect, numCols, rowHeight, colWidth );
    359 
    360     const int maxCols = d_data->maxCols;
    361     d_data->maxCols = numCols;
     370        stretchGrid( rect, numColumns, rowHeight, colWidth );
     371
     372    const int maxColumns = d_data->maxColumns;
     373    d_data->maxColumns = numColumns;
    362374    const QRect alignedRect = alignmentRect( rect );
    363     d_data->maxCols = maxCols;
     375    d_data->maxColumns = maxColumns;
    364376
    365377    const int xOffset = expandH ? 0 : alignedRect.x();
    366378    const int yOffset = expandV ? 0 : alignedRect.y();
    367379
    368     QVector<int> colX( numCols );
     380    QVector<int> colX( numColumns );
    369381    QVector<int> rowY( numRows );
    370382
     
    372384
    373385    rowY[0] = yOffset + margin();
    374     for ( int r = 1; r < ( int )numRows; r++ )
     386    for ( uint r = 1; r < numRows; r++ )
    375387        rowY[r] = rowY[r-1] + rowHeight[r-1] + xySpace;
    376388
    377389    colX[0] = xOffset + margin();
    378     for ( int c = 1; c < ( int )numCols; c++ )
     390    for ( uint c = 1; c < numColumns; c++ )
    379391        colX[c] = colX[c-1] + colWidth[c-1] + xySpace;
    380392
     
    382394    for ( int i = 0; i < itemCount; i++ )
    383395    {
    384         const int row = i / numCols;
    385         const int col = i % numCols;
     396        const int row = i / numColumns;
     397        const int col = i % numColumns;
    386398
    387399        QRect itemGeometry( colX[col], rowY[row],
     
    396408/*!
    397409  Calculate the dimensions for the columns and rows for a grid
    398   of numCols columns.
    399 
    400   \param numCols Number of columns.
     410  of numColumns columns.
     411
     412  \param numColumns Number of columns.
    401413  \param rowHeight Array where to fill in the calculated row heights.
    402414  \param colWidth Array where to fill in the calculated column widths.
    403415*/
    404416
    405 void QwtDynGridLayout::layoutGrid( uint numCols,
     417void QwtDynGridLayout::layoutGrid( uint numColumns,
    406418    QVector<int>& rowHeight, QVector<int>& colWidth ) const
    407419{
    408     if ( numCols <= 0 )
     420    if ( numColumns <= 0 )
    409421        return;
    410422
     
    412424        d_data->updateLayoutCache();
    413425
    414     for ( uint index = 0;
    415         index < ( uint )d_data->itemSizeHints.count(); index++ )
    416     {
    417         const int row = index / numCols;
    418         const int col = index % numCols;
     426    for ( int index = 0; index < d_data->itemSizeHints.count(); index++ )
     427    {
     428        const int row = index / numColumns;
     429        const int col = index % numColumns;
    419430
    420431        const QSize &size = d_data->itemSizeHints[int( index )];
     
    428439
    429440/*!
    430   \return true: QwtDynGridLayout implements heightForWidth.
     441  \return true: QwtDynGridLayout implements heightForWidth().
    431442  \sa heightForWidth()
    432443*/
     
    437448
    438449/*!
    439   \return The preferred height for this layout, given the width w.
     450  \return The preferred height for this layout, given a width.
    440451  \sa hasHeightForWidth()
    441452*/
     
    445456        return 0;
    446457
    447     const uint numCols = columnsForWidth( width );
    448     uint numRows = itemCount() / numCols;
    449     if ( itemCount() % numCols )
     458    const uint numColumns = columnsForWidth( width );
     459    uint numRows = itemCount() / numColumns;
     460    if ( itemCount() % numColumns )
    450461        numRows++;
    451462
    452463    QVector<int> rowHeight( numRows );
    453     QVector<int> colWidth( numCols );
    454 
    455     layoutGrid( numCols, rowHeight, colWidth );
     464    QVector<int> colWidth( numColumns );
     465
     466    layoutGrid( numColumns, rowHeight, colWidth );
    456467
    457468    int h = 2 * margin() + ( numRows - 1 ) * spacing();
    458     for ( int row = 0; row < ( int )numRows; row++ )
     469    for ( uint row = 0; row < numRows; row++ )
    459470        h += rowHeight[row];
    460471
     
    467478  rect. Rows and columns are stretched with the same factor.
    468479
     480  \param rect Bounding rectangle
     481  \param numColumns Number of columns
     482  \param rowHeight Array to be filled with the calculated row heights
     483  \param colWidth Array to be filled with the calculated column widths
     484
    469485  \sa setExpanding(), expanding()
    470486*/
    471487void QwtDynGridLayout::stretchGrid( const QRect &rect,
    472     uint numCols, QVector<int>& rowHeight, QVector<int>& colWidth ) const
    473 {
    474     if ( numCols == 0 || isEmpty() )
     488    uint numColumns, QVector<int>& rowHeight, QVector<int>& colWidth ) const
     489{
     490    if ( numColumns == 0 || isEmpty() )
    475491        return;
    476492
     
    481497    if ( expandH )
    482498    {
    483         int xDelta = rect.width() - 2 * margin() - ( numCols - 1 ) * spacing();
    484         for ( int col = 0; col < ( int )numCols; col++ )
     499        int xDelta = rect.width() - 2 * margin() - ( numColumns - 1 ) * spacing();
     500        for ( uint col = 0; col < numColumns; col++ )
    485501            xDelta -= colWidth[col];
    486502
    487503        if ( xDelta > 0 )
    488504        {
    489             for ( int col = 0; col < ( int )numCols; col++ )
     505            for ( uint col = 0; col < numColumns; col++ )
    490506            {
    491                 const int space = xDelta / ( numCols - col );
     507                const int space = xDelta / ( numColumns - col );
    492508                colWidth[col] += space;
    493509                xDelta -= space;
     
    498514    if ( expandV )
    499515    {
    500         uint numRows = itemCount() / numCols;
    501         if ( itemCount() % numCols )
     516        uint numRows = itemCount() / numColumns;
     517        if ( itemCount() % numColumns )
    502518            numRows++;
    503519
    504520        int yDelta = rect.height() - 2 * margin() - ( numRows - 1 ) * spacing();
    505         for ( int row = 0; row < ( int )numRows; row++ )
     521        for ( uint row = 0; row < numRows; row++ )
    506522            yDelta -= rowHeight[row];
    507523
    508524        if ( yDelta > 0 )
    509525        {
    510             for ( int row = 0; row < ( int )numRows; row++ )
     526            for ( uint row = 0; row < numRows; row++ )
    511527            {
    512528                const int space = yDelta / ( numRows - row );
     
    519535
    520536/*!
    521    Return the size hint. If maxCols() > 0 it is the size for
    522    a grid with maxCols() columns, otherwise it is the size for
     537   Return the size hint. If maxColumns() > 0 it is the size for
     538   a grid with maxColumns() columns, otherwise it is the size for
    523539   a grid with only one row.
    524540
    525    \sa maxCols(), setMaxCols()
     541   \return Size hint
     542   \sa maxColumns(), setMaxColumns()
    526543*/
    527544QSize QwtDynGridLayout::sizeHint() const
     
    530547        return QSize();
    531548
    532     const uint numCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount();
    533     uint numRows = itemCount() / numCols;
    534     if ( itemCount() % numCols )
     549    uint numColumns = itemCount();
     550    if ( d_data->maxColumns > 0 )
     551        numColumns = qMin( d_data->maxColumns, numColumns );
     552
     553    uint numRows = itemCount() / numColumns;
     554    if ( itemCount() % numColumns )
    535555        numRows++;
    536556
    537557    QVector<int> rowHeight( numRows );
    538     QVector<int> colWidth( numCols );
    539 
    540     layoutGrid( numCols, rowHeight, colWidth );
     558    QVector<int> colWidth( numColumns );
     559
     560    layoutGrid( numColumns, rowHeight, colWidth );
    541561
    542562    int h = 2 * margin() + ( numRows - 1 ) * spacing();
    543     for ( int row = 0; row < ( int )numRows; row++ )
     563    for ( uint row = 0; row < numRows; row++ )
    544564        h += rowHeight[row];
    545565
    546     int w = 2 * margin() + ( numCols - 1 ) * spacing();
    547     for ( int col = 0; col < ( int )numCols; col++ )
     566    int w = 2 * margin() + ( numColumns - 1 ) * spacing();
     567    for ( uint col = 0; col < numColumns; col++ )
    548568        w += colWidth[col];
    549569
     
    553573/*!
    554574  \return Number of rows of the current layout.
    555   \sa numCols()
     575  \sa numColumns()
    556576  \warning The number of rows might change whenever the geometry changes
    557577*/
     
    566586  \warning The number of columns might change whenever the geometry changes
    567587*/
    568 uint QwtDynGridLayout::numCols() const
    569 {
    570     return d_data->numCols;
    571 }
     588uint QwtDynGridLayout::numColumns() const
     589{
     590    return d_data->numColumns;
     591}
Note: See TracChangeset for help on using the changeset viewer.