VirtualBox

Ignore:
Timestamp:
Nov 28, 2012 2:43:17 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
82359
Message:

FE/Qt: VM group UI: Details-view: Caching element text size.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details
Files:
3 edited

Legend:

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

    r43984 r43985  
    4242    , m_iMinimumHeaderWidth(0)
    4343    , m_iMinimumHeaderHeight(0)
     44    , m_iMinimumTextWidth(0)
     45    , m_iMinimumTextHeight(0)
    4446    , m_fClosed(!fOpened)
    4547    , m_pButton(0)
     
    9496    /* Prepare variables: */
    9597    int iMargin = data(ElementData_Margin).toInt();
    96     int iTextWidth = data(ElementData_TextWidth).toInt();
    9798    int iProposedWidth = 0;
    9899
    99100    /* Maximum width: */
    100     iProposedWidth = qMax(m_iMinimumHeaderWidth, iTextWidth);
     101    iProposedWidth = qMax(m_iMinimumHeaderWidth, m_iMinimumTextWidth);
    101102
    102103    /* And 4 margins: 2 left and 2 right: */
     
    159160        case ElementData_Margin: return 5;
    160161        case ElementData_Spacing: return 10;
    161         case ElementData_TextWidth:
    162         {
    163             /* Prepare variables: */
    164             int iSpacing = data(ElementData_Spacing).toInt();
    165             int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt();
    166             QFontMetrics fm(m_textFont, model()->paintDevice());
    167 
    168             /* Search for the maximum line widths: */
    169             int iMaximumLeftLineWidth = 0;
    170             int iMaximumRightLineWidth = 0;
    171             bool fSingleColumnText = true;
    172             foreach (const UITextTableLine line, m_text)
    173             {
    174                 bool fRightColumnPresent = !line.second.isEmpty();
    175                 if (fRightColumnPresent)
    176                     fSingleColumnText = false;
    177                 QString strLeftLine = fRightColumnPresent ? line.first + ":" : line.first;
    178                 QString strRightLine = line.second;
    179                 iMaximumLeftLineWidth = qMax(iMaximumLeftLineWidth, fm.width(strLeftLine));
    180                 iMaximumRightLineWidth = qMax(iMaximumRightLineWidth, fm.width(strRightLine));
    181             }
    182             iMaximumLeftLineWidth += 1;
    183             iMaximumRightLineWidth += 1;
    184 
    185             /* Calculate minimum text width: */
    186             int iMinimumTextWidth = 0;
    187             if (fSingleColumnText)
    188             {
    189                 /* Take into account only left column: */
    190                 int iMinimumLeftColumnWidth = qMin(iMaximumLeftLineWidth, iMinimumTextColumnWidth);
    191                 iMinimumTextWidth = iMinimumLeftColumnWidth;
    192             }
    193             else
    194             {
    195                 /* Take into account both columns, but wrap only right one: */
    196                 int iMinimumLeftColumnWidth = iMaximumLeftLineWidth;
    197                 int iMinimumRightColumnWidth = qMin(iMaximumRightLineWidth, iMinimumTextColumnWidth);
    198                 iMinimumTextWidth = iMinimumLeftColumnWidth + iSpacing + iMinimumRightColumnWidth;
    199             }
    200 
    201             /* Return result: */
    202             return iMinimumTextWidth;
    203         }
    204         case ElementData_TextHeight:
    205         {
    206             /* Prepare variables: */
    207             int iMargin = data(ElementData_Margin).toInt();
    208             int iSpacing = data(ElementData_Spacing).toInt();
    209             int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt();
    210             int iMaximumTextWidth = (int)geometry().width() - 3 * iMargin - iSpacing;
    211             QPaintDevice *pPaintDevice = model()->paintDevice();
    212             QFontMetrics fm(m_textFont, pPaintDevice);
    213 
    214             /* Search for the maximum line widths: */
    215             int iMaximumLeftLineWidth = 0;
    216             int iMaximumRightLineWidth = 0;
    217             bool fSingleColumnText = true;
    218             foreach (const UITextTableLine line, m_text)
    219             {
    220                 bool fRightColumnPresent = !line.second.isEmpty();
    221                 if (fRightColumnPresent)
    222                     fSingleColumnText = false;
    223                 QString strFirstLine = fRightColumnPresent ? line.first + ":" : line.first;
    224                 QString strSecondLine = line.second;
    225                 iMaximumLeftLineWidth = qMax(iMaximumLeftLineWidth, fm.width(strFirstLine));
    226                 iMaximumRightLineWidth = qMax(iMaximumRightLineWidth, fm.width(strSecondLine));
    227             }
    228             iMaximumLeftLineWidth += 1;
    229             iMaximumRightLineWidth += 1;
    230 
    231             /* Calculate column widths: */
    232             int iLeftColumnWidth = 0;
    233             int iRightColumnWidth = 0;
    234             if (fSingleColumnText)
    235             {
    236                 /* Take into account only left column: */
    237                 iLeftColumnWidth = qMax(iMinimumTextColumnWidth, iMaximumTextWidth);
    238             }
    239             else
    240             {
    241                 /* Take into account both columns, but wrap only right one: */
    242                 iLeftColumnWidth = iMaximumLeftLineWidth;
    243                 iRightColumnWidth = iMaximumTextWidth - iLeftColumnWidth;
    244             }
    245 
    246             /* For each the line: */
    247             int iSummaryTextHeight = 0;
    248             foreach (const UITextTableLine line, m_text)
    249             {
    250                 /* First layout: */
    251                 int iLeftColumnHeight = 0;
    252                 if (!line.first.isEmpty())
    253                 {
    254                     bool fRightColumnPresent = !line.second.isEmpty();
    255                     QTextLayout *pTextLayout = prepareTextLayout(m_textFont, pPaintDevice,
    256                                                                  fRightColumnPresent ? line.first + ":" : line.first,
    257                                                                  iLeftColumnWidth, iLeftColumnHeight);
    258                     delete pTextLayout;
    259                 }
    260 
    261                 /* Second layout: */
    262                 int iRightColumnHeight = 0;
    263                 if (!line.second.isEmpty())
    264                 {
    265                     QTextLayout *pTextLayout = prepareTextLayout(m_textFont, pPaintDevice, line.second,
    266                                                                  iRightColumnWidth, iRightColumnHeight);
    267                     delete pTextLayout;
    268                 }
    269 
    270                 /* Append summary text height: */
    271                 iSummaryTextHeight += qMax(iLeftColumnHeight, iRightColumnHeight);
    272             }
    273 
    274             /* Return result: */
    275             return iSummaryTextHeight;
    276         }
    277162        case ElementData_MinimumTextColumnWidth: return 100;
    278163        /* Default: */
     
    298183    m_iMinimumHeaderHeight = qMax(m_pixmapSize.height(), m_nameSize.height());
    299184    m_iMinimumHeaderHeight = qMax(m_iMinimumHeaderHeight, m_buttonSize.height());
     185}
     186
     187void UIGDetailsElement::updateMinimumTextWidth()
     188{
     189    /* Prepare variables: */
     190    int iSpacing = data(ElementData_Spacing).toInt();
     191    int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt();
     192    QFontMetrics fm(m_textFont, model()->paintDevice());
     193
     194    /* Search for the maximum line widths: */
     195    int iMaximumLeftLineWidth = 0;
     196    int iMaximumRightLineWidth = 0;
     197    bool fSingleColumnText = true;
     198    foreach (const UITextTableLine line, m_text)
     199    {
     200        bool fRightColumnPresent = !line.second.isEmpty();
     201        if (fRightColumnPresent)
     202            fSingleColumnText = false;
     203        QString strLeftLine = fRightColumnPresent ? line.first + ":" : line.first;
     204        QString strRightLine = line.second;
     205        iMaximumLeftLineWidth = qMax(iMaximumLeftLineWidth, fm.width(strLeftLine));
     206        iMaximumRightLineWidth = qMax(iMaximumRightLineWidth, fm.width(strRightLine));
     207    }
     208    iMaximumLeftLineWidth += 1;
     209    iMaximumRightLineWidth += 1;
     210
     211    /* Calculate minimum-text-width: */
     212    m_iMinimumTextWidth = 0;
     213    if (fSingleColumnText)
     214    {
     215        /* Take into account only left column: */
     216        int iMinimumLeftColumnWidth = qMin(iMaximumLeftLineWidth, iMinimumTextColumnWidth);
     217        m_iMinimumTextWidth = iMinimumLeftColumnWidth;
     218    }
     219    else
     220    {
     221        /* Take into account both columns, but wrap only right one: */
     222        int iMinimumLeftColumnWidth = iMaximumLeftLineWidth;
     223        int iMinimumRightColumnWidth = qMin(iMaximumRightLineWidth, iMinimumTextColumnWidth);
     224        m_iMinimumTextWidth = iMinimumLeftColumnWidth + iSpacing + iMinimumRightColumnWidth;
     225    }
     226}
     227
     228void UIGDetailsElement::updateMinimumTextHeight()
     229{
     230    /* Prepare variables: */
     231    int iMargin = data(ElementData_Margin).toInt();
     232    int iSpacing = data(ElementData_Spacing).toInt();
     233    int iMinimumTextColumnWidth = data(ElementData_MinimumTextColumnWidth).toInt();
     234    int iMaximumTextWidth = (int)geometry().width() - 3 * iMargin - iSpacing;
     235    QPaintDevice *pPaintDevice = model()->paintDevice();
     236    QFontMetrics fm(m_textFont, pPaintDevice);
     237
     238    /* Search for the maximum line widths: */
     239    int iMaximumLeftLineWidth = 0;
     240    int iMaximumRightLineWidth = 0;
     241    bool fSingleColumnText = true;
     242    foreach (const UITextTableLine line, m_text)
     243    {
     244        bool fRightColumnPresent = !line.second.isEmpty();
     245        if (fRightColumnPresent)
     246            fSingleColumnText = false;
     247        QString strFirstLine = fRightColumnPresent ? line.first + ":" : line.first;
     248        QString strSecondLine = line.second;
     249        iMaximumLeftLineWidth = qMax(iMaximumLeftLineWidth, fm.width(strFirstLine));
     250        iMaximumRightLineWidth = qMax(iMaximumRightLineWidth, fm.width(strSecondLine));
     251    }
     252    iMaximumLeftLineWidth += 1;
     253    iMaximumRightLineWidth += 1;
     254
     255    /* Calculate column widths: */
     256    int iLeftColumnWidth = 0;
     257    int iRightColumnWidth = 0;
     258    if (fSingleColumnText)
     259    {
     260        /* Take into account only left column: */
     261        iLeftColumnWidth = qMax(iMinimumTextColumnWidth, iMaximumTextWidth);
     262    }
     263    else
     264    {
     265        /* Take into account both columns, but wrap only right one: */
     266        iLeftColumnWidth = iMaximumLeftLineWidth;
     267        iRightColumnWidth = iMaximumTextWidth - iLeftColumnWidth;
     268    }
     269
     270    /* Calculate minimum-text-height: */
     271    m_iMinimumTextHeight = 0;
     272    foreach (const UITextTableLine line, m_text)
     273    {
     274        /* First layout: */
     275        int iLeftColumnHeight = 0;
     276        if (!line.first.isEmpty())
     277        {
     278            bool fRightColumnPresent = !line.second.isEmpty();
     279            QTextLayout *pTextLayout = prepareTextLayout(m_textFont, pPaintDevice,
     280                                                         fRightColumnPresent ? line.first + ":" : line.first,
     281                                                         iLeftColumnWidth, iLeftColumnHeight);
     282            delete pTextLayout;
     283        }
     284
     285        /* Second layout: */
     286        int iRightColumnHeight = 0;
     287        if (!line.second.isEmpty())
     288        {
     289            QTextLayout *pTextLayout = prepareTextLayout(m_textFont, pPaintDevice, line.second,
     290                                                         iRightColumnWidth, iRightColumnHeight);
     291            delete pTextLayout;
     292        }
     293
     294        /* Append summary text height: */
     295        m_iMinimumTextHeight += qMax(iLeftColumnHeight, iRightColumnHeight);
     296    }
    300297}
    301298
     
    344341            m_text << UITextTableLine(strLeftLine, strRightLine);
    345342    }
     343
     344    /* Update linked values: */
     345    updateMinimumTextWidth();
     346    updateMinimumTextHeight();
    346347}
    347348
     
    463464    /* Prepare variables: */
    464465    int iMargin = data(ElementData_Margin).toInt();
    465     int iTextHeight = data(ElementData_TextHeight).toInt();
    466466    int iProposedHeight = 0;
    467467
     
    477477        /* Add text height: */
    478478        if (!m_text.isEmpty())
    479             iProposedHeight += 2 * iMargin + iTextHeight;
     479            iProposedHeight += 2 * iMargin + m_iMinimumTextHeight;
    480480    }
    481481
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h

    r43984 r43985  
    109109        ElementData_Margin,
    110110        ElementData_Spacing,
    111         /* Sizes: */
    112         ElementData_TextWidth,
    113         ElementData_TextHeight,
    114111        ElementData_MinimumTextColumnWidth
    115112    };
     
    121118    void updateMinimumHeaderWidth();
    122119    void updateMinimumHeaderHeight();
     120    void updateMinimumTextWidth();
     121    void updateMinimumTextHeight();
    123122
    124123    /* API: Icon stuff: */
     
    204203    int m_iMinimumHeaderWidth;
    205204    int m_iMinimumHeaderHeight;
     205    int m_iMinimumTextWidth;
     206    int m_iMinimumTextHeight;
    206207
    207208    /* Variables: Toggle stuff: */
     
    222223    int m_iHighlightDarkness;
    223224    int m_iAnimationDarkness;
     225
     226    /* Friends: */
     227    friend class UIGDetailsSet;
    224228};
    225229
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp

    r43983 r43985  
    292292                pElement->resize(iWidth, iHeight);
    293293                /* Update minimum height hint: */
     294                pElement->updateMinimumTextHeight();
    294295                pItem->updateSizeHint();
    295296                /* Resize to required height: */
Note: See TracChangeset for help on using the changeset viewer.

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