Changeset 8127 in ntrip for trunk/BNC/qwt/qwt_dyngrid_layout.cpp
- Timestamp:
- May 10, 2017, 3:20:54 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/qwt/qwt_dyngrid_layout.cpp
r4271 r8127 10 10 #include "qwt_dyngrid_layout.h" 11 11 #include "qwt_math.h" 12 #include <q widget.h>12 #include <qvector.h> 13 13 #include <qlist.h> 14 14 … … 25 25 mutable QList<QLayoutItem*> itemList; 26 26 27 uint maxCol s;27 uint maxColumns; 28 28 uint numRows; 29 uint numCol s;29 uint numColumns; 30 30 31 31 Qt::Orientations expanding; … … 82 82 { 83 83 d_data = new QwtDynGridLayout::PrivateData; 84 d_data->maxCol s = d_data->numRows = d_data->numCols = 0;84 d_data->maxColumns = d_data->numRows = d_data->numColumns = 0; 85 85 d_data->expanding = 0; 86 86 } … … 105 105 /*! 106 106 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 */ 110 void 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 117 118 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 */ 123 uint 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 */ 128 132 void QwtDynGridLayout::addItem( QLayoutItem *item ) 129 133 { … … 135 139 \return true if this layout is empty. 136 140 */ 137 138 141 bool QwtDynGridLayout::isEmpty() const 139 142 { … … 144 147 \return number of layout items 145 148 */ 146 147 149 uint QwtDynGridLayout::itemCount() const 148 150 { … … 151 153 152 154 /*! 153 Find the item at a sp cific index155 Find the item at a specific index 154 156 155 157 \param index Index 158 \return Item at a specific index 156 159 \sa takeAt() 157 160 */ … … 165 168 166 169 /*! 167 Find the item at a sp cific index and remove it from the layout170 Find the item at a specific index and remove it from the layout 168 171 169 172 \param index Index 173 \return Layout item, removed from the layout 170 174 \sa itemAt() 171 175 */ … … 200 204 201 205 /*! 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 203 208 A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only 204 209 one dimension, while Qt::Vertical | Qt::Horizontal means that it wants 205 210 to grow in both dimensions. 211 212 \return Orientations, where the layout expands 206 213 \sa setExpandingDirections() 207 214 */ … … 212 219 213 220 /*! 214 Reorganizes columns and rows and resizes managed widgets within215 the rectangle rect.221 Reorganizes columns and rows and resizes managed items within 222 a rectangle. 216 223 217 224 \param rect Layout geometry … … 224 231 return; 225 232 226 d_data->numCol s = columnsForWidth( rect.width() );227 d_data->numRows = itemCount() / d_data->numCol s;228 if ( itemCount() % d_data->numCol s )233 d_data->numColumns = columnsForWidth( rect.width() ); 234 d_data->numRows = itemCount() / d_data->numColumns; 235 if ( itemCount() % d_data->numColumns ) 229 236 d_data->numRows++; 230 237 231 QList<QRect> itemGeometries = layoutItems( rect, d_data->numCol s );238 QList<QRect> itemGeometries = layoutItems( rect, d_data->numColumns ); 232 239 233 240 int index = 0; … … 235 242 it != d_data->itemList.end(); ++it ) 236 243 { 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() ) 249 254 250 255 \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 */ 254 260 uint QwtDynGridLayout::columnsForWidth( int width ) const 255 261 { … … 257 263 return 0; 258 264 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 ); 266 275 if ( rowWidth > width ) 267 return numCol s - 1;276 return numColumns - 1; 268 277 } 269 278 … … 275 284 columns. 276 285 277 \param numCol s Given number of columns286 \param numColumns Given number of columns 278 287 \param itemWidth Array of the width hints for all items 279 288 */ 280 int QwtDynGridLayout::maxRowWidth( int numCol s ) const289 int QwtDynGridLayout::maxRowWidth( int numColumns ) const 281 290 { 282 291 int col; 283 292 284 QVector<int> colWidth( numCol s );285 for ( col = 0; col < numCol s; col++ )293 QVector<int> colWidth( numColumns ); 294 for ( col = 0; col < numColumns; col++ ) 286 295 colWidth[col] = 0; 287 296 … … 292 301 index < d_data->itemSizeHints.count(); index++ ) 293 302 { 294 col = index % numCol s;303 col = index % numColumns; 295 304 colWidth[col] = qMax( colWidth[col], 296 305 d_data->itemSizeHints[int( index )].width() ); 297 306 } 298 307 299 int rowWidth = 2 * margin() + ( numCol s - 1 ) * spacing();300 for ( col = 0; col < numCol s; col++ )308 int rowWidth = 2 * margin() + ( numColumns - 1 ) * spacing(); 309 for ( col = 0; col < numColumns; col++ ) 301 310 rowWidth += colWidth[col]; 302 311 … … 328 337 /*! 329 338 Calculate the geometries of the layout items for a layout 330 with numCol s columns and a given rect.339 with numColumns columns and a given rectangle. 331 340 332 341 \param rect Rect where to place the items 333 \param numCol s Number of columns342 \param numColumns Number of columns 334 343 \return item geometries 335 344 */ 336 345 337 346 QList<QRect> QwtDynGridLayout::layoutItems( const QRect &rect, 338 uint numCol s ) const347 uint numColumns ) const 339 348 { 340 349 QList<QRect> itemGeometries; 341 if ( numCol s == 0 || isEmpty() )350 if ( numColumns == 0 || isEmpty() ) 342 351 return itemGeometries; 343 352 344 uint numRows = itemCount() / numCol s;345 if ( num Rows % itemCount() )353 uint numRows = itemCount() / numColumns; 354 if ( numColumns % itemCount() ) 346 355 numRows++; 347 356 357 if ( numRows == 0 ) 358 return itemGeometries; 359 348 360 QVector<int> rowHeight( numRows ); 349 QVector<int> colWidth( numCol s );350 351 layoutGrid( numCol s, rowHeight, colWidth );361 QVector<int> colWidth( numColumns ); 362 363 layoutGrid( numColumns, rowHeight, colWidth ); 352 364 353 365 bool expandH, expandV; … … 356 368 357 369 if ( expandH || expandV ) 358 stretchGrid( rect, numCol s, rowHeight, colWidth );359 360 const int maxCol s = d_data->maxCols;361 d_data->maxCol s = numCols;370 stretchGrid( rect, numColumns, rowHeight, colWidth ); 371 372 const int maxColumns = d_data->maxColumns; 373 d_data->maxColumns = numColumns; 362 374 const QRect alignedRect = alignmentRect( rect ); 363 d_data->maxCol s = maxCols;375 d_data->maxColumns = maxColumns; 364 376 365 377 const int xOffset = expandH ? 0 : alignedRect.x(); 366 378 const int yOffset = expandV ? 0 : alignedRect.y(); 367 379 368 QVector<int> colX( numCol s );380 QVector<int> colX( numColumns ); 369 381 QVector<int> rowY( numRows ); 370 382 … … 372 384 373 385 rowY[0] = yOffset + margin(); 374 for ( int r = 1; r < ( int )numRows; r++ )386 for ( uint r = 1; r < numRows; r++ ) 375 387 rowY[r] = rowY[r-1] + rowHeight[r-1] + xySpace; 376 388 377 389 colX[0] = xOffset + margin(); 378 for ( int c = 1; c < ( int )numCols; c++ )390 for ( uint c = 1; c < numColumns; c++ ) 379 391 colX[c] = colX[c-1] + colWidth[c-1] + xySpace; 380 392 … … 382 394 for ( int i = 0; i < itemCount; i++ ) 383 395 { 384 const int row = i / numCol s;385 const int col = i % numCol s;396 const int row = i / numColumns; 397 const int col = i % numColumns; 386 398 387 399 QRect itemGeometry( colX[col], rowY[row], … … 396 408 /*! 397 409 Calculate the dimensions for the columns and rows for a grid 398 of numCol s columns.399 400 \param numCol s Number of columns.410 of numColumns columns. 411 412 \param numColumns Number of columns. 401 413 \param rowHeight Array where to fill in the calculated row heights. 402 414 \param colWidth Array where to fill in the calculated column widths. 403 415 */ 404 416 405 void QwtDynGridLayout::layoutGrid( uint numCol s,417 void QwtDynGridLayout::layoutGrid( uint numColumns, 406 418 QVector<int>& rowHeight, QVector<int>& colWidth ) const 407 419 { 408 if ( numCol s <= 0 )420 if ( numColumns <= 0 ) 409 421 return; 410 422 … … 412 424 d_data->updateLayoutCache(); 413 425 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; 419 430 420 431 const QSize &size = d_data->itemSizeHints[int( index )]; … … 428 439 429 440 /*! 430 \return true: QwtDynGridLayout implements heightForWidth .441 \return true: QwtDynGridLayout implements heightForWidth(). 431 442 \sa heightForWidth() 432 443 */ … … 437 448 438 449 /*! 439 \return The preferred height for this layout, given the width w.450 \return The preferred height for this layout, given a width. 440 451 \sa hasHeightForWidth() 441 452 */ … … 445 456 return 0; 446 457 447 const uint numCol s = columnsForWidth( width );448 uint numRows = itemCount() / numCol s;449 if ( itemCount() % numCol s )458 const uint numColumns = columnsForWidth( width ); 459 uint numRows = itemCount() / numColumns; 460 if ( itemCount() % numColumns ) 450 461 numRows++; 451 462 452 463 QVector<int> rowHeight( numRows ); 453 QVector<int> colWidth( numCol s );454 455 layoutGrid( numCol s, rowHeight, colWidth );464 QVector<int> colWidth( numColumns ); 465 466 layoutGrid( numColumns, rowHeight, colWidth ); 456 467 457 468 int h = 2 * margin() + ( numRows - 1 ) * spacing(); 458 for ( int row = 0; row < ( int )numRows; row++ )469 for ( uint row = 0; row < numRows; row++ ) 459 470 h += rowHeight[row]; 460 471 … … 467 478 rect. Rows and columns are stretched with the same factor. 468 479 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 469 485 \sa setExpanding(), expanding() 470 486 */ 471 487 void QwtDynGridLayout::stretchGrid( const QRect &rect, 472 uint numCol s, QVector<int>& rowHeight, QVector<int>& colWidth ) const473 { 474 if ( numCol s == 0 || isEmpty() )488 uint numColumns, QVector<int>& rowHeight, QVector<int>& colWidth ) const 489 { 490 if ( numColumns == 0 || isEmpty() ) 475 491 return; 476 492 … … 481 497 if ( expandH ) 482 498 { 483 int xDelta = rect.width() - 2 * margin() - ( numCol s - 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++ ) 485 501 xDelta -= colWidth[col]; 486 502 487 503 if ( xDelta > 0 ) 488 504 { 489 for ( int col = 0; col < ( int )numCols; col++ )505 for ( uint col = 0; col < numColumns; col++ ) 490 506 { 491 const int space = xDelta / ( numCol s - col );507 const int space = xDelta / ( numColumns - col ); 492 508 colWidth[col] += space; 493 509 xDelta -= space; … … 498 514 if ( expandV ) 499 515 { 500 uint numRows = itemCount() / numCol s;501 if ( itemCount() % numCol s )516 uint numRows = itemCount() / numColumns; 517 if ( itemCount() % numColumns ) 502 518 numRows++; 503 519 504 520 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++ ) 506 522 yDelta -= rowHeight[row]; 507 523 508 524 if ( yDelta > 0 ) 509 525 { 510 for ( int row = 0; row < ( int )numRows; row++ )526 for ( uint row = 0; row < numRows; row++ ) 511 527 { 512 528 const int space = yDelta / ( numRows - row ); … … 519 535 520 536 /*! 521 Return the size hint. If maxCol s() > 0 it is the size for522 a grid with maxCol s() columns, otherwise it is the size for537 Return the size hint. If maxColumns() > 0 it is the size for 538 a grid with maxColumns() columns, otherwise it is the size for 523 539 a grid with only one row. 524 540 525 \sa maxCols(), setMaxCols() 541 \return Size hint 542 \sa maxColumns(), setMaxColumns() 526 543 */ 527 544 QSize QwtDynGridLayout::sizeHint() const … … 530 547 return QSize(); 531 548 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 ) 535 555 numRows++; 536 556 537 557 QVector<int> rowHeight( numRows ); 538 QVector<int> colWidth( numCol s );539 540 layoutGrid( numCol s, rowHeight, colWidth );558 QVector<int> colWidth( numColumns ); 559 560 layoutGrid( numColumns, rowHeight, colWidth ); 541 561 542 562 int h = 2 * margin() + ( numRows - 1 ) * spacing(); 543 for ( int row = 0; row < ( int )numRows; row++ )563 for ( uint row = 0; row < numRows; row++ ) 544 564 h += rowHeight[row]; 545 565 546 int w = 2 * margin() + ( numCol s - 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++ ) 548 568 w += colWidth[col]; 549 569 … … 553 573 /*! 554 574 \return Number of rows of the current layout. 555 \sa numCol s()575 \sa numColumns() 556 576 \warning The number of rows might change whenever the geometry changes 557 577 */ … … 566 586 \warning The number of columns might change whenever the geometry changes 567 587 */ 568 uint QwtDynGridLayout::numCol s() const569 { 570 return d_data->numCol s;571 } 588 uint QwtDynGridLayout::numColumns() const 589 { 590 return d_data->numColumns; 591 }
Note:
See TracChangeset
for help on using the changeset viewer.