VirtualBox

Changeset 42812 in vbox for trunk


Ignore:
Timestamp:
Aug 14, 2012 4:06:44 PM (12 years ago)
Author:
vboxsync
Message:

FE/Qt: 6234: Support for VM groups: Details-view description multi-line text support, text word-wrapping support.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.cpp

    r42795 r42812  
    217217
    218218            /* Search for the maximum line widths: */
    219             int iMaximumFirstLineWidth = 0;
    220             int iMaximumSecondLineWidth = 0;
     219            int iMaximumLeftLineWidth = 0;
     220            int iMaximumRightLineWidth = 0;
     221            bool fSingleColumnText = true;
    221222            foreach (const UITextTableLine line, m_text)
    222223            {
    223                 bool fKeyValueRow = !line.second.isEmpty();
    224                 QString strFirstLine = fKeyValueRow ? line.first + ":" : line.first;
    225                 QString strSecondLine = line.second;
    226                 iMaximumFirstLineWidth = qMax(iMaximumFirstLineWidth, fm.width(strFirstLine));
    227                 iMaximumSecondLineWidth = qMax(iMaximumSecondLineWidth, fm.width(strSecondLine));
     224                bool fRightColumnPresent = !line.second.isEmpty();
     225                if (fRightColumnPresent)
     226                    fSingleColumnText = false;
     227                QString strLeftLine = fRightColumnPresent ? line.first + ":" : line.first;
     228                QString strRightLine = line.second;
     229                iMaximumLeftLineWidth = qMax(iMaximumLeftLineWidth, fm.width(strLeftLine));
     230                iMaximumRightLineWidth = qMax(iMaximumRightLineWidth, fm.width(strRightLine));
    228231            }
     232            iMaximumLeftLineWidth += 1;
     233            iMaximumRightLineWidth += 1;
    229234
    230235            /* Calculate minimum text width: */
    231             int iMinimumSecondLineWidth = qMin(iMaximumSecondLineWidth, iMinimumTextColumnWidth);
    232             int iMinimumTextWidth = iMaximumFirstLineWidth + iSpacing + iMinimumSecondLineWidth;
     236            int iMinimumTextWidth = 0;
     237            if (fSingleColumnText)
     238            {
     239                /* Take into account only left column: */
     240                int iMinimumLeftColumnWidth = qMin(iMaximumLeftLineWidth, iMinimumTextColumnWidth);
     241                iMinimumTextWidth = iMinimumLeftColumnWidth;
     242            }
     243            else
     244            {
     245                /* Take into account both columns, but wrap only right one: */
     246                int iMinimumLeftColumnWidth = iMaximumLeftLineWidth;
     247                int iMinimumRightColumnWidth = qMin(iMaximumRightLineWidth, iMinimumTextColumnWidth);
     248                iMinimumTextWidth = iMinimumLeftColumnWidth + iSpacing + iMinimumRightColumnWidth;
     249            }
    233250
    234251            /* Return result: */
     
    240257            int iMargin = data(ElementData_Margin).toInt();
    241258            int iSpacing = data(ElementData_Spacing).toInt();
     259            int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt();
    242260            int iMaximumTextWidth = (int)geometry().width() - 3 * iMargin - iSpacing;
    243261            QFont textFont = data(ElementData_TextFont).value<QFont>();
    244262            QFontMetrics fm(textFont);
    245263
    246             /* Search for maximum line widths: */
    247             int iMaximumFirstLineWidth = 0;
    248             int iMaximumSecondLineWidth = 0;
     264            /* Search for the maximum line widths: */
     265            int iMaximumLeftLineWidth = 0;
     266            int iMaximumRightLineWidth = 0;
     267            bool fSingleColumnText = true;
    249268            foreach (const UITextTableLine line, m_text)
    250269            {
    251                 bool fKeyValueRow = !line.second.isEmpty();
    252                 QString strFirstLine = fKeyValueRow ? line.first + ":" : line.first;
     270                bool fRightColumnPresent = !line.second.isEmpty();
     271                if (fRightColumnPresent)
     272                    fSingleColumnText = false;
     273                QString strFirstLine = fRightColumnPresent ? line.first + ":" : line.first;
    253274                QString strSecondLine = line.second;
    254                 iMaximumFirstLineWidth = qMax(iMaximumFirstLineWidth, fm.width(strFirstLine));
    255                 iMaximumSecondLineWidth = qMax(iMaximumSecondLineWidth, fm.width(strSecondLine));
     275                iMaximumLeftLineWidth = qMax(iMaximumLeftLineWidth, fm.width(strFirstLine));
     276                iMaximumRightLineWidth = qMax(iMaximumRightLineWidth, fm.width(strSecondLine));
    256277            }
    257             iMaximumFirstLineWidth += 1;
    258             iMaximumSecondLineWidth += 1;
     278            iMaximumLeftLineWidth += 1;
     279            iMaximumRightLineWidth += 1;
    259280
    260281            /* Calculate column widths: */
    261             int iFirstColumnWidth = iMaximumFirstLineWidth;
    262             int iSecondColumnWidth = iMaximumTextWidth - iFirstColumnWidth;
     282            int iLeftColumnWidth = 0;
     283            int iRightColumnWidth = 0;
     284            if (fSingleColumnText)
     285            {
     286                /* Take into account only left column: */
     287                iLeftColumnWidth = qMax(iMinimumTextColumnWidth, iMaximumTextWidth);
     288            }
     289            else
     290            {
     291                /* Take into account both columns, but wrap only right one: */
     292                iLeftColumnWidth = iMaximumLeftLineWidth;
     293                iRightColumnWidth = iMaximumTextWidth - iLeftColumnWidth;
     294            }
    263295
    264296            /* For each the line: */
     
    267299            {
    268300                /* First layout: */
    269                 int iFirstColumnHeight = 0;
     301                int iLeftColumnHeight = 0;
    270302                if (!line.first.isEmpty())
    271303                {
    272                     bool fKeyValueRow = !line.second.isEmpty();
     304                    bool fRightColumnPresent = !line.second.isEmpty();
    273305                    QTextLayout *pTextLayout = prepareTextLayout(textFont,
    274                                                                  fKeyValueRow ? line.first + ":" : line.first,
    275                                                                  iFirstColumnWidth, iFirstColumnHeight);
     306                                                                 fRightColumnPresent ? line.first + ":" : line.first,
     307                                                                 iLeftColumnWidth, iLeftColumnHeight);
    276308                    delete pTextLayout;
    277309                }
    278310
    279311                /* Second layout: */
    280                 int iSecondColumnHeight = 0;
     312                int iRightColumnHeight = 0;
    281313                if (!line.second.isEmpty())
    282314                {
    283315                    QTextLayout *pTextLayout = prepareTextLayout(textFont, line.second,
    284                                                                  iSecondColumnWidth, iSecondColumnHeight);
     316                                                                 iRightColumnWidth, iRightColumnHeight);
    285317                    delete pTextLayout;
    286318                }
    287319
    288320                /* Append summary text height: */
    289                 iSummaryTextHeight += qMax(iFirstColumnHeight, iSecondColumnHeight);
     321                iSummaryTextHeight += qMax(iLeftColumnHeight, iRightColumnHeight);
    290322            }
    291323
     
    317349void UIGDetailsElement::setText(const UITextTable &text)
    318350{
    319     m_text = text;
     351    /* Clear first: */
     352    m_text.clear();
     353    /* For each the line of the passed table: */
     354    foreach (const UITextTableLine &line, text)
     355    {
     356        /* Get lines: */
     357        QString strLeftLine = line.first;
     358        QString strRightLine = line.second;
     359        /* If 2nd line is empty: */
     360        if (strRightLine.isEmpty())
     361        {
     362            /* Parse the 1st one: */
     363            QStringList subLines = strLeftLine.split(QRegExp("\\n"));
     364            foreach (const QString &strSubLine, subLines)
     365                m_text << UITextTableLine(strSubLine, QString());
     366        }
     367        else
     368            m_text << UITextTableLine(strLeftLine, strRightLine);
     369    }
    320370}
    321371
     
    557607    {
    558608        /* Prepare variables: */
     609        int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt();
    559610        int iMaximumTextWidth = geometry().width() - 3 * iMargin - iSpacing;
    560611        QFont textFont = data(ElementData_TextFont).value<QFont>();
    561612        QFontMetrics fm(textFont);
    562613
    563         /* Search for maximum line widths: */
    564         int iMaximumFirstLineWidth = 0;
    565         int iMaximumSecondLineWidth = 0;
     614        /* Search for the maximum line widths: */
     615        int iMaximumLeftLineWidth = 0;
     616        int iMaximumRightLineWidth = 0;
     617        bool fSingleColumnText = true;
    566618        foreach (const UITextTableLine line, m_text)
    567619        {
    568             bool fKeyValueRow = !line.second.isEmpty();
    569             QString strFirstLine = fKeyValueRow ? line.first + ":" : line.first;
     620            bool fRightColumnPresent = !line.second.isEmpty();
     621            if (fRightColumnPresent)
     622                fSingleColumnText = false;
     623            QString strFirstLine = fRightColumnPresent ? line.first + ":" : line.first;
    570624            QString strSecondLine = line.second;
    571             iMaximumFirstLineWidth = qMax(iMaximumFirstLineWidth, fm.width(strFirstLine));
    572             iMaximumSecondLineWidth = qMax(iMaximumSecondLineWidth, fm.width(strSecondLine));
    573         }
    574         iMaximumFirstLineWidth += 1;
    575         iMaximumSecondLineWidth += 1;
     625            iMaximumLeftLineWidth = qMax(iMaximumLeftLineWidth, fm.width(strFirstLine));
     626            iMaximumRightLineWidth = qMax(iMaximumRightLineWidth, fm.width(strSecondLine));
     627        }
     628        iMaximumLeftLineWidth += 1;
     629        iMaximumRightLineWidth += 1;
    576630
    577631        /* Calculate column widths: */
    578         int iFirstColumnWidth = iMaximumFirstLineWidth;
    579         int iSecondColumnWidth = iMaximumTextWidth - iFirstColumnWidth;
     632        int iLeftColumnWidth = 0;
     633        int iRightColumnWidth = 0;
     634        if (fSingleColumnText)
     635        {
     636            /* Take into account only left column: */
     637            iLeftColumnWidth = qMax(iMinimumTextColumnWidth, iMaximumTextWidth);
     638        }
     639        else
     640        {
     641            /* Take into account both columns, but wrap only right one: */
     642            iLeftColumnWidth = iMaximumLeftLineWidth;
     643            iRightColumnWidth = iMaximumTextWidth - iLeftColumnWidth;
     644        }
    580645
    581646        /* Where to paint? */
     
    587652        {
    588653            /* First layout: */
    589             int iFirstColumnHeight = 0;
     654            int iLeftColumnHeight = 0;
    590655            if (!line.first.isEmpty())
    591656            {
    592                 bool fKeyValueRow = !line.second.isEmpty();
     657                bool fRightColumnPresent = !line.second.isEmpty();
    593658                QTextLayout *pTextLayout = prepareTextLayout(textFont,
    594                                                              fKeyValueRow ? line.first + ":" : line.first,
    595                                                              iFirstColumnWidth, iFirstColumnHeight);
     659                                                             fRightColumnPresent ? line.first + ":" : line.first,
     660                                                             iLeftColumnWidth, iLeftColumnHeight);
    596661                pTextLayout->draw(pPainter, QPointF(iMachineTextX, iMachineTextY));
    597662                delete pTextLayout;
     
    599664
    600665            /* Second layout: */
    601             int iSecondColumnHeight = 0;
     666            int iRightColumnHeight = 0;
    602667            if (!line.second.isEmpty())
    603668            {
    604669                QTextLayout *pTextLayout = prepareTextLayout(textFont, line.second,
    605                                                              iSecondColumnWidth, iSecondColumnHeight);
    606                 pTextLayout->draw(pPainter, QPointF(iMachineTextX + iFirstColumnWidth + iSpacing, iMachineTextY));
     670                                                             iRightColumnWidth, iRightColumnHeight);
     671                pTextLayout->draw(pPainter, QPointF(iMachineTextX + iLeftColumnWidth + iSpacing, iMachineTextY));
    607672                delete pTextLayout;
    608673            }
    609674
    610675            /* Indent Y: */
    611             iMachineTextY += qMax(iFirstColumnHeight, iSecondColumnHeight);
     676            iMachineTextY += qMax(iLeftColumnHeight, iRightColumnHeight);
    612677        }
    613678    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette