Changeset 42608 in vbox for trunk/src/VBox/Frontends/VirtualBox
- Timestamp:
- Aug 5, 2012 9:52:41 PM (13 years ago)
- Location:
- trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.cpp
r42593 r42608 94 94 int UIGDetailsElement::minimumWidthHint() const 95 95 { 96 /* First of all, we have to prepare fewvariables: */96 /* Prepare variables: */ 97 97 int iMargin = data(ElementData_Margin).toInt(); 98 98 int iHeaderWidth = data(ElementData_HeaderSize).toSize().width(); 99 int iTextWidth = data(ElementData_Text Size).toSize().width();99 int iTextWidth = data(ElementData_TextWidth).toInt(); 100 100 101 101 /* Calculating proposed width: */ … … 210 210 return QSize(iHeaderWidth, iHeaderHeight); 211 211 } 212 case ElementData_TextSize: 213 { 212 case ElementData_TextWidth: 213 { 214 /* Prepare variables: */ 214 215 int iSpacing = data(ElementData_Spacing).toInt(); 216 int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt(); 215 217 QFontMetrics fm(data(ElementData_TextFont).value<QFont>()); 216 int iLongestFirst = 0; 217 int iLongestSecond = 0; 218 foreach (const UITextTableLine &line, m_text) 218 219 /* Search for the maximum line widths: */ 220 int iMaximumFirstLineWidth = 0; 221 int iMaximumSecondLineWidth = 0; 222 foreach (const UITextTableLine line, m_text) 219 223 { 220 iLongestFirst = qMax(iLongestFirst, fm.width(line.first)); 221 iLongestSecond = qMax(iLongestSecond, fm.width(line.second)); 224 bool fKeyValueRow = !line.second.isEmpty(); 225 QString strFirstLine = fKeyValueRow ? line.first + ":" : line.first; 226 QString strSecondLine = line.second; 227 iMaximumFirstLineWidth = qMax(iMaximumFirstLineWidth, fm.width(strFirstLine)); 228 iMaximumSecondLineWidth = qMax(iMaximumSecondLineWidth, fm.width(strSecondLine)); 222 229 } 223 int iLongestLine = iLongestFirst + iSpacing + iLongestSecond; 224 int iSummaryHeight = fm.height() * m_text.size(); 225 return QSize(iLongestLine, iSummaryHeight); 226 } 230 231 /* Calculate minimum text width: */ 232 int iMinimumFirstLineWidth = qMin(iMaximumFirstLineWidth, iMinimumTextColumnWidth); 233 int iMinimumSecondLineWidth = qMin(iMaximumSecondLineWidth, iMinimumTextColumnWidth); 234 int iMinimumTextWidth = iMinimumFirstLineWidth + iSpacing + iMinimumSecondLineWidth; 235 236 /* Return result: */ 237 return iMinimumTextWidth; 238 } 239 case ElementData_TextHeight: 240 { 241 /* Prepare variables: */ 242 int iMargin = data(ElementData_Margin).toInt(); 243 int iSpacing = data(ElementData_Spacing).toInt(); 244 int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt(); 245 int iMaximumTextWidth = (int)geometry().width() - 3 * iMargin - iSpacing; 246 QFont textFont = data(ElementData_TextFont).value<QFont>(); 247 QFontMetrics fm(textFont); 248 249 /* Search for maximum line widths: */ 250 int iMaximumFirstLineWidth = 0; 251 int iMaximumSecondLineWidth = 0; 252 foreach (const UITextTableLine line, m_text) 253 { 254 bool fKeyValueRow = !line.second.isEmpty(); 255 QString strFirstLine = fKeyValueRow ? line.first + ":" : line.first; 256 QString strSecondLine = line.second; 257 iMaximumFirstLineWidth = qMax(iMaximumFirstLineWidth, fm.width(strFirstLine)); 258 iMaximumSecondLineWidth = qMax(iMaximumSecondLineWidth, fm.width(strSecondLine)); 259 } 260 261 /* Calculate column widths: */ 262 int iFirstColumnWidth = iMaximumTextWidth / 2; 263 int iSecondColumnWidth = iMaximumTextWidth / 2; 264 if (iMaximumFirstLineWidth < iMinimumTextColumnWidth) 265 { 266 iFirstColumnWidth = iMaximumFirstLineWidth; 267 iSecondColumnWidth = iMaximumTextWidth - iFirstColumnWidth; 268 } 269 else if (iMaximumSecondLineWidth < iMinimumTextColumnWidth) 270 { 271 iSecondColumnWidth = iMaximumSecondLineWidth; 272 iFirstColumnWidth = iMaximumTextWidth - iSecondColumnWidth; 273 } 274 275 /* For each the line: */ 276 int iSummaryTextHeight = 0; 277 foreach (const UITextTableLine line, m_text) 278 { 279 /* First layout: */ 280 int iFirstColumnHeight = 0; 281 if (!line.first.isEmpty()) 282 { 283 bool fKeyValueRow = !line.second.isEmpty(); 284 QTextLayout *pTextLayout = prepareTextLayout(textFont, 285 fKeyValueRow ? line.first + ":" : line.first, 286 iFirstColumnWidth, iFirstColumnHeight); 287 delete pTextLayout; 288 } 289 290 /* Second layout: */ 291 int iSecondColumnHeight = 0; 292 if (!line.second.isEmpty()) 293 { 294 QTextLayout *pTextLayout = prepareTextLayout(textFont, line.second, 295 iSecondColumnWidth, iSecondColumnHeight); 296 delete pTextLayout; 297 } 298 299 /* Append summary text height: */ 300 iSummaryTextHeight += qMax(iFirstColumnHeight, iSecondColumnHeight); 301 } 302 303 /* Return result: */ 304 return iSummaryTextHeight; 305 } 306 case ElementData_MinimumTextColumnWidth: return 100; 227 307 /* Default: */ 228 308 default: break; … … 301 381 } 302 382 303 void UIGDetailsElement::updateSizeHint()304 {305 updateGeometry();306 }307 308 383 void UIGDetailsElement::updateLayout() 309 384 { 385 /* Update size-hint: */ 386 updateSizeHint(); 387 310 388 /* Prepare variables: */ 311 389 QSize size = geometry().size().toSize(); … … 341 419 int UIGDetailsElement::minimumHeightHint(bool fClosed) const 342 420 { 343 /* First of all, we have to prepare fewvariables: */421 /* Prepare variables: */ 344 422 int iMargin = data(ElementData_Margin).toInt(); 345 423 int iHeaderHeight = data(ElementData_HeaderSize).toSize().height(); 346 int iTextHeight = data(ElementData_Text Size).toSize().height();424 int iTextHeight = data(ElementData_TextHeight).toInt(); 347 425 348 426 /* Calculating proposed height: */ … … 472 550 if (!m_fClosed && !m_text.isEmpty()) 473 551 { 552 /* Prepare variables: */ 553 int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt(); 554 int iMaximumTextWidth = geometry().width() - 3 * iMargin - iSpacing; 555 QFont textFont = data(ElementData_TextFont).value<QFont>(); 556 QFontMetrics fm(textFont); 557 558 /* Search for maximum line widths: */ 559 int iMaximumFirstLineWidth = 0; 560 int iMaximumSecondLineWidth = 0; 561 foreach (const UITextTableLine line, m_text) 562 { 563 bool fKeyValueRow = !line.second.isEmpty(); 564 QString strFirstLine = fKeyValueRow ? line.first + ":" : line.first; 565 QString strSecondLine = line.second; 566 iMaximumFirstLineWidth = qMax(iMaximumFirstLineWidth, fm.width(strFirstLine)); 567 iMaximumSecondLineWidth = qMax(iMaximumSecondLineWidth, fm.width(strSecondLine)); 568 } 569 570 /* Calculate column widths: */ 571 int iFirstColumnWidth = iMaximumTextWidth / 2; 572 int iSecondColumnWidth = iMaximumTextWidth / 2; 573 if (iMaximumFirstLineWidth < iMinimumTextColumnWidth) 574 { 575 iFirstColumnWidth = iMaximumFirstLineWidth; 576 iSecondColumnWidth = iMaximumTextWidth - iFirstColumnWidth; 577 } 578 else if (iMaximumSecondLineWidth < iMinimumTextColumnWidth) 579 { 580 iSecondColumnWidth = iMaximumSecondLineWidth; 581 iFirstColumnWidth = iMaximumTextWidth - iSecondColumnWidth; 582 } 583 474 584 /* Where to paint? */ 475 585 int iMachineTextX = iMachinePixmapX; 476 586 int iMachineTextY = iMachinePixmapY + iHeaderHeight + iMargin; 477 587 478 /* Font metrics: */479 QFontMetrics fm(data(ElementData_TextFont).value<QFont>());480 481 /* For each the line, get longest 'first': */482 int iLongestFirst = 0;483 foreach (const UITextTableLine line, m_text)484 iLongestFirst = qMax(iLongestFirst, fm.width(line.first));485 486 588 /* For each the line: */ 487 589 foreach (const UITextTableLine line, m_text) 488 590 { 489 /* Do we have a key-value pair? */490 bool fKeyValueRow = !line.second.isEmpty();491 492 591 /* First layout: */ 493 QTextLayout keyLayout(fKeyValueRow ? line.first + ":" : line.first); 494 keyLayout.beginLayout(); 495 keyLayout.createLine(); 496 keyLayout.endLayout(); 497 keyLayout.draw(pPainter, QPointF(iMachineTextX, iMachineTextY)); 592 int iFirstColumnHeight = 0; 593 if (!line.first.isEmpty()) 594 { 595 bool fKeyValueRow = !line.second.isEmpty(); 596 QTextLayout *pTextLayout = prepareTextLayout(textFont, 597 fKeyValueRow ? line.first + ":" : line.first, 598 iFirstColumnWidth, iFirstColumnHeight); 599 pTextLayout->draw(pPainter, QPointF(iMachineTextX, iMachineTextY)); 600 delete pTextLayout; 601 } 498 602 499 603 /* Second layout: */ 604 int iSecondColumnHeight = 0; 500 605 if (!line.second.isEmpty()) 501 606 { 502 QTextLayout valueLayout(line.second); 503 valueLayout.beginLayout(); 504 valueLayout.createLine(); 505 valueLayout.endLayout(); 506 valueLayout.draw(pPainter, QPointF(iMachineTextX + iLongestFirst + iSpacing, iMachineTextY)); 607 QTextLayout *pTextLayout = prepareTextLayout(textFont, line.second, 608 iSecondColumnWidth, iSecondColumnHeight); 609 pTextLayout->draw(pPainter, QPointF(iMachineTextX + iMaximumFirstLineWidth + iSpacing, iMachineTextY)); 610 delete pTextLayout; 507 611 } 508 612 509 /* Append theY: */510 iMachineTextY += fm.height();613 /* Indent Y: */ 614 iMachineTextY += qMax(iFirstColumnHeight, iSecondColumnHeight); 511 615 } 512 616 } … … 649 753 } 650 754 755 /* static */ 756 QTextLayout* UIGDetailsElement::prepareTextLayout(const QFont &font, const QString &strText, int iWidth, int &iHeight) 757 { 758 /* Prepare variables: */ 759 QFontMetrics fm(font); 760 int iLeading = fm.leading(); 761 762 /* Create layout; */ 763 QTextLayout *pTextLayout = new QTextLayout(strText, font); 764 765 /* Configure layout: */ 766 QTextOption textOption; 767 textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); 768 pTextLayout->setTextOption(textOption); 769 770 /* Build layout: */ 771 pTextLayout->beginLayout(); 772 while (1) 773 { 774 QTextLine line = pTextLayout->createLine(); 775 if (!line.isValid()) 776 break; 777 778 line.setLineWidth(iWidth); 779 iHeight += iLeading; 780 line.setPosition(QPointF(0, iHeight)); 781 iHeight += line.height(); 782 } 783 pTextLayout->endLayout(); 784 785 /* Return layout: */ 786 return pTextLayout; 787 } 788 651 789 void UIGDetailsElement::updateAnimationParameters() 652 790 { -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h
r42529 r42608 31 31 class CMachine; 32 32 class UIGraphicsRotatorButton; 33 class QTextLayout; 33 34 34 35 /* Typedefs: */ … … 99 100 ElementData_ButtonSize, 100 101 ElementData_HeaderSize, 101 ElementData_TextSize 102 ElementData_TextWidth, 103 ElementData_TextHeight, 104 ElementData_MinimumTextColumnWidth 102 105 }; 103 106 … … 118 121 119 122 /* Helpers: Layout stuff: */ 120 void updateSizeHint();121 123 void updateLayout(); 122 124 … … 170 172 void updateNameHoverRepresentation(QGraphicsSceneHoverEvent *pEvent); 171 173 174 /* Helper: Layout stuff: */ 175 static QTextLayout* prepareTextLayout(const QFont &font, const QString &strText, int iWidth, int &iHeight); 176 172 177 /* Helper: Animation stuff: */ 173 178 void updateAnimationParameters(); -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsGroup.cpp
r42600 r42608 130 130 } 131 131 132 void UIGDetailsGroup::update SizeHint()132 void UIGDetailsGroup::updateLayout() 133 133 { 134 134 /* Update size-hints for all the items: */ … … 136 136 pItem->updateSizeHint(); 137 137 /* Update size-hint for this item: */ 138 updateGeometry(); 139 } 140 141 void UIGDetailsGroup::updateLayout() 142 { 138 updateSizeHint(); 139 140 /* Update layout finally: */ 143 141 m_pMainLayout->activate(); 144 142 m_pLayout->activate(); -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsGroup.h
r42600 r42608 61 61 62 62 /* API: Layout stuff: */ 63 void updateSizeHint();64 63 void updateLayout(); 65 64 -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsItem.cpp
r42600 r42608 81 81 } 82 82 83 void UIGDetailsItem::updateSizeHint() 84 { 85 updateGeometry(); 86 } 87 83 88 #if 0 84 89 void UIGDetailsItem::hoverEnterEvent(QGraphicsSceneHoverEvent*) -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsItem.h
r42600 r42608 71 71 72 72 /* API: Layout stuff: */ 73 v irtual void updateSizeHint() = 0;73 void updateSizeHint(); 74 74 virtual void updateLayout() = 0; 75 75 -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.cpp
r42600 r42608 79 79 int iViewportWidth = viewportSize.width() - 2 * iSceneMargin; 80 80 int iViewportHeight = viewportSize.height() - 2 * iSceneMargin; 81 /* Update all the size-hints recursively: */82 m_pRoot->updateSizeHint();83 81 /* Set root item position: */ 84 82 m_pRoot->setPos(iSceneMargin, iSceneMargin); -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
r42600 r42608 207 207 } 208 208 209 void UIGDetailsSet::update SizeHint()209 void UIGDetailsSet::updateLayout() 210 210 { 211 211 /* Update size-hints for all the items: */ … … 213 213 pItem->updateSizeHint(); 214 214 /* Update size-hint for this item: */ 215 updateGeometry(); 216 } 217 218 void UIGDetailsSet::updateLayout() 219 { 215 updateSizeHint(); 216 220 217 /* Prepare variables: */ 221 218 int iMargin = data(SetData_Margin).toInt(); … … 242 239 int iWidth = iPreviewWidth == 0 ? iMaximumWidth - 2 * iMargin : 243 240 iMaximumWidth - 2 * iMargin - iSpacing - iPreviewWidth; 241 pElement->setPos(iMargin, iVerticalIndent); 242 /* Resize to required width: */ 244 243 int iHeight = pElement->minimumHeightHint(); 245 pElement->setPos(iMargin, iVerticalIndent); 244 pElement->resize(iWidth, iHeight); 245 /* Update minimum height hint: */ 246 pItem->updateSizeHint(); 247 /* Resize to required height: */ 248 iHeight = pElement->minimumHeightHint(); 246 249 pElement->resize(iWidth, iHeight); 247 250 pItem->updateLayout(); … … 272 275 { 273 276 int iWidth = iMaximumWidth - 2 * iMargin; 277 pElement->setPos(iMargin, iVerticalIndent); 278 /* Resize to required width: */ 274 279 int iHeight = pElement->minimumHeightHint(); 275 pElement->setPos(iMargin, iVerticalIndent);276 280 pElement->resize(iWidth, iHeight); 281 /* Update minimum height hint: */ 282 pItem->updateSizeHint(); 283 /* Resize to required height: */ 284 iHeight = pElement->minimumHeightHint(); 285 pElement->resize(iWidth, iHeight); 286 pItem->updateLayout(); 277 287 iVerticalIndent += (iHeight + iSpacing); 278 pItem->updateLayout();279 288 break; 280 289 } -
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.h
r42600 r42608 90 90 91 91 /* Helpers: Layout stuff: */ 92 void updateSizeHint();93 92 void updateLayout(); 94 93 int minimumWidthHint() const;
Note:
See TracChangeset
for help on using the changeset viewer.