VirtualBox

Ignore:
Timestamp:
Aug 2, 2012 8:55:58 PM (13 years ago)
Author:
vboxsync
Message:

FE/Qt: 6234: Support for VM groups: Ellipsis name compression for group, machine, snapshot names.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.cpp

    r42529 r42558  
    316316}
    317317
     318/* static */
     319int UIGChooserItem::textWidth(const QFont &font, int iCount)
     320{
     321    /* Return text width: */
     322    QFontMetrics fm(font);
     323    QString strString;
     324    strString.fill('_', iCount);
     325    return fm.width(strString);
     326}
     327
     328/* static */
     329QString UIGChooserItem::compressText(const QFont &font, QString strText, int iWidth)
     330{
     331    /* Check if passed text feats maximum width: */
     332    QFontMetrics fm(font);
     333    if (fm.width(strText) <= iWidth)
     334        return strText;
     335
     336    /* Truncate otherwise: */
     337    QString strEllipsis = QString("...");
     338    int iEllipsisWidth = fm.width(strEllipsis + " ");
     339    while (!strText.isEmpty() && fm.width(strText) + iEllipsisWidth > iWidth)
     340        strText.truncate(strText.size() - 1);
     341    return strText + strEllipsis;
     342}
     343
    318344UIGChooserItemMimeData::UIGChooserItemMimeData(UIGChooserItem *pItem)
    319345    : m_pItem(pItem)
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h

    r42529 r42558  
    138138    void setGradient(int iGradient) { m_iGradient = iGradient; update(); }
    139139
     140    /* Helpers: Text compression stuff: */
     141    static int textWidth(const QFont &font, int iCount);
     142    static QString compressText(const QFont &font, QString strText, int iWidth);
     143
    140144private:
    141145
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.cpp

    r42529 r42558  
    271271        }
    272272        /* Texts: */
    273         case GroupItemData_Name: return m_strName;
     273        case GroupItemData_Name:
     274        {
     275            /* Prepare variables: */
     276            int iHorizontalMargin = data(GroupItemData_HorizonalMargin).toInt();
     277            int iButtonWidth = data(GroupItemData_ButtonSize).toSize().width();
     278            int iMinorSpacing = data(GroupItemData_MinorSpacing).toInt();
     279            int iGroupPixmapWidth = data(GroupItemData_GroupPixmapSize).toSize().width();
     280            int iMachinePixmapWidth = data(GroupItemData_MachinePixmapSize).toSize().width();
     281            int iGroupCountTextWidth = data(GroupItemData_GroupCountTextSize).toSize().width();
     282            int iMachineCountTextWidth = data(GroupItemData_MachineCountTextSize).toSize().width();
     283            int iMaximumWidth = (int)geometry().width() - iHorizontalMargin -
     284                                                          iButtonWidth - iMinorSpacing -
     285                                                          iHorizontalMargin -
     286                                                          iGroupPixmapWidth - iMinorSpacing -
     287                                                          iMachinePixmapWidth - iMinorSpacing -
     288                                                          iGroupCountTextWidth - iMinorSpacing -
     289                                                          iMachineCountTextWidth;
     290            QString strCompressedName = compressText(data(GroupItemData_NameFont).value<QFont>(),
     291                                                     m_strName, iMaximumWidth);
     292            return strCompressedName;
     293        }
    274294        case GroupItemData_GroupCountText: return QString::number(m_groupItems.size());
    275295        case GroupItemData_MachineCountText: return QString::number(m_machineItems.size());
    276296        /* Sizes: */
    277297        case GroupItemData_ButtonSize: return m_pButton ? m_pButton->minimumSizeHint() : QSizeF(0, 0);
     298        case GroupItemData_MinimumNameSize:
     299        {
     300            if (isRoot())
     301                return QSizeF(0, 0);
     302            QFont font = data(GroupItemData_NameFont).value<QFont>();
     303            QFontMetrics fm(font);
     304            int iMaximumTextWidth = textWidth(font, 20);
     305            QString strCompressedName = compressText(font, m_strName, iMaximumTextWidth);
     306            return QSize(fm.width(strCompressedName), fm.height());
     307        }
    278308        case GroupItemData_NameSize:
    279309        {
     
    313343            int iMinorSpacing = data(GroupItemData_MinorSpacing).toInt();
    314344            QSize buttonSize = data(GroupItemData_ButtonSize).toSize();
    315             QSize nameSize = data(GroupItemData_NameSize).toSize();
     345            QSize minimumNameSize = data(GroupItemData_MinimumNameSize).toSize();
    316346            QSize groupPixmapSize = data(GroupItemData_GroupPixmapSize).toSize();
    317347            QSize machinePixmapSize = data(GroupItemData_MachinePixmapSize).toSize();
     
    328358                                        2 /* internal QLineEdit margin from Qt sources */ +
    329359                                        1 /* internal QLineEdit align shifting from Qt sources */ +
    330                                         /* Name width: */
    331                                         nameSize.width() +
     360                                        /* Minimum name width: */
     361                                        minimumNameSize.width() +
    332362                                        /* Spacing between name and info: */
    333363                                        iMajorSpacing +
     
    342372            QList<int> heights;
    343373            heights << buttonSize.height()
    344                     << nameSize.height()
     374                    << minimumNameSize.height()
    345375                    << groupPixmapSize.height() << machinePixmapSize.height()
    346376                    << groupCountTextSize.height() << machineCountTextSize.height();
     
    10581088        /* Prepare variables: */
    10591089        QRect fullRect = pOption->rect;
    1060         int iMinorSpacing = data(GroupItemData_MinorSpacing).toInt();
    10611090        QSize groupPixmapSize = data(GroupItemData_GroupPixmapSize).toSize();
    10621091        QSize machinePixmapSize = data(GroupItemData_MachinePixmapSize).toSize();
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h

    r42529 r42558  
    9696        /* Sizes: */
    9797        GroupItemData_ButtonSize,
     98        GroupItemData_MinimumNameSize,
    9899        GroupItemData_NameSize,
    99100        GroupItemData_NameEditorSize,
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp

    r42529 r42558  
    148148        }
    149149        /* Texts: */
    150         case MachineItemData_Name: return name();
    151         case MachineItemData_SnapshotName: return snapshotName();
     150        case MachineItemData_Name:
     151        {
     152            /* Prepare variables: */
     153            int iMaximumWidth = data(MachineItemData_FirstRowMaximumWidth).toInt();
     154            /* Calculate name width part: */
     155            QFont nameFont = data(MachineItemData_NameFont).value<QFont>();
     156            QFont snapshotNameFont = data(MachineItemData_SnapshotNameFont).value<QFont>();
     157            QFontMetrics nameMetrics(nameFont);
     158            QFontMetrics snapshotNameMetrics(snapshotNameFont);
     159            qreal dNameWidth = nameMetrics.width(name());
     160            qreal dSnapshotNameWidth = snapshotNameMetrics.width(snapshotName());
     161            qreal dNameRatio = dNameWidth / (dNameWidth + dSnapshotNameWidth);
     162            int iNamePart = iMaximumWidth * dNameRatio;
     163            /* Compress name to part width: */
     164            QString strCompressedName = compressText(nameFont, name(), iNamePart);
     165            return strCompressedName;
     166        }
     167        case MachineItemData_SnapshotName:
     168        {
     169            /* Prepare variables: */
     170            int iMaximumWidth = data(MachineItemData_FirstRowMaximumWidth).toInt();
     171            /* Calculate name width part: */
     172            QFont nameFont = data(MachineItemData_NameFont).value<QFont>();
     173            QFont snapshotNameFont = data(MachineItemData_SnapshotNameFont).value<QFont>();
     174            QFontMetrics nameMetrics(nameFont);
     175            QFontMetrics snapshotNameMetrics(snapshotNameFont);
     176            qreal dNameWidth = nameMetrics.width(name());
     177            qreal dSnapshotNameWidth = snapshotNameMetrics.width(snapshotName());
     178            qreal dSnapshotNameRatio = dSnapshotNameWidth / (dNameWidth + dSnapshotNameWidth);
     179            int iSnapshotNamePart = iMaximumWidth * dSnapshotNameRatio;
     180            /* Compress name to part width: */
     181            QString strCompressedName = compressText(snapshotNameFont, snapshotName(), iSnapshotNamePart);
     182            return strCompressedName;
     183        }
    152184        case MachineItemData_StateText: return gpConverter->toString(machineState());
    153185        /* Sizes: */
    154186        case MachineItemData_PixmapSize: return osIcon().availableSizes().at(0);
    155187        case MachineItemData_StatePixmapSize: return machineStateIcon().availableSizes().at(0);
     188        case MachineItemData_MinimumNameSize:
     189        {
     190            QFont font = data(MachineItemData_NameFont).value<QFont>();
     191            QFontMetrics fm(font);
     192            int iMaximumTextWidth = textWidth(font, 15);
     193            QString strCompressedName = compressText(font, name(), iMaximumTextWidth);
     194            return QSize(fm.width(strCompressedName), fm.height());
     195        }
    156196        case MachineItemData_NameSize:
    157197        {
     
    159199            return QSize(fm.width(data(MachineItemData_Name).toString()), fm.height());
    160200        }
     201        case MachineItemData_MinimumSnapshotNameSize:
     202        {
     203            QFont font = data(MachineItemData_SnapshotNameFont).value<QFont>();
     204            QFontMetrics fm(font);
     205            int iMaximumTextWidth = textWidth(font, 15);
     206            QString strCompressedName = compressText(font, snapshotName(), iMaximumTextWidth);
     207            return QSize(fm.width(strCompressedName), fm.height());
     208        }
    161209        case MachineItemData_SnapshotNameSize:
    162210        {
    163211            QFontMetrics fm(data(MachineItemData_SnapshotNameFont).value<QFont>());
    164212            return QSize(fm.width(QString("(%1)").arg(data(MachineItemData_SnapshotName).toString())), fm.height());
     213        }
     214        case MachineItemData_FirstRowMaximumWidth:
     215        {
     216            /* Prepare variables: */
     217            int iMargin = data(MachineItemData_Margin).toInt();
     218            int iPixmapWidth = data(MachineItemData_PixmapSize).toSize().width();
     219            int iMachineItemMajorSpacing = data(MachineItemData_MajorSpacing).toInt();
     220            int iToolBarWidth = data(MachineItemData_ToolBarSize).toSize().width();
     221            int iMaximumWidth = (int)geometry().width() - iMargin -
     222                                                          iPixmapWidth - iMachineItemMajorSpacing -
     223                                                          iToolBarWidth - iMachineItemMajorSpacing;
     224            return iMaximumWidth;
    165225        }
    166226        case MachineItemData_StateTextSize:
     
    244304    int iMachineItemMajorSpacing = data(MachineItemData_MajorSpacing).toInt();
    245305    int iMachineItemMinorSpacing = data(MachineItemData_MinorSpacing).toInt();
    246     QSize machinePixmapSize = data(MachineItemData_PixmapSize).toSize();
    247     QSize machineNameSize = data(MachineItemData_NameSize).toSize();
    248     QSize snapshotNameSize = data(MachineItemData_SnapshotNameSize).toSize();
    249     QSize machineStatePixmapSize = data(MachineItemData_StatePixmapSize).toSize();
    250     QSize machineStateTextSize = data(MachineItemData_StateTextSize).toSize();
    251     QSize toolBarSize = data(MachineItemData_ToolBarSize).toSize();
     306    int iMachinePixmapWidth = data(MachineItemData_PixmapSize).toSize().width();
     307    int iMinimumMachineNameWidth = data(MachineItemData_MinimumNameSize).toSize().width();
     308    int iMinimumSnapshotNameWidth = data(MachineItemData_MinimumSnapshotNameSize).toSize().width();
     309    int iMachineStatePixmapWidth = data(MachineItemData_StatePixmapSize).toSize().width();
     310    int iMachineStateTextWidth = data(MachineItemData_StateTextSize).toSize().width();
     311    int iToolBarWidth = data(MachineItemData_ToolBarSize).toSize().width();
    252312
    253313    /* Calculating proposed width: */
     
    258318    iProposedWidth += iMachineItemMargin;
    259319    /* And machine item content to take into account: */
    260     int iFirstLineWidth = machineNameSize.width() +
     320    int iFirstLineWidth = iMinimumMachineNameWidth +
    261321                          iMachineItemMinorSpacing +
    262                           snapshotNameSize.width();
    263     int iSecondLineWidth = machineStatePixmapSize.width() +
     322                          iMinimumSnapshotNameWidth;
     323    int iSecondLineWidth = iMachineStatePixmapWidth +
    264324                           iMachineItemMinorSpacing +
    265                            machineStateTextSize.width();
     325                           iMachineStateTextWidth;
    266326    int iSecondColumnWidth = qMax(iFirstLineWidth, iSecondLineWidth);
    267     int iMachineItemWidth = machinePixmapSize.width() +
     327    int iMachineItemWidth = iMachinePixmapWidth +
    268328                            iMachineItemMajorSpacing +
    269329                            iSecondColumnWidth +
    270330                            iMachineItemMajorSpacing +
    271                             toolBarSize.width() + 1;
     331                            iToolBarWidth + 1;
    272332    iProposedWidth += iMachineItemWidth;
    273333
     
    281341    int iMachineItemMargin = data(MachineItemData_Margin).toInt();
    282342    int iMachineItemTextSpacing = data(MachineItemData_TextSpacing).toInt();
    283     QSize machinePixmapSize = data(MachineItemData_PixmapSize).toSize();
    284     QSize machineNameSize = data(MachineItemData_NameSize).toSize();
    285     QSize snapshotNameSize = data(MachineItemData_SnapshotNameSize).toSize();
    286     QSize machineStatePixmapSize = data(MachineItemData_StatePixmapSize).toSize();
    287     QSize machineStateTextSize = data(MachineItemData_StateTextSize).toSize();
    288     QSize toolBarSize = data(MachineItemData_ToolBarSize).toSize();
     343    int iMachinePixmapHeight = data(MachineItemData_PixmapSize).toSize().height();
     344    int iMachineNameHeight = data(MachineItemData_NameSize).toSize().height();
     345    int iSnapshotNameHeight = data(MachineItemData_SnapshotNameSize).toSize().height();
     346    int iMachineStatePixmapHeight = data(MachineItemData_StatePixmapSize).toSize().height();
     347    int iMachineStateTextHeight = data(MachineItemData_StateTextSize).toSize().height();
     348    int iToolBarHeight = data(MachineItemData_ToolBarSize).toSize().height();
    289349
    290350    /* Calculating proposed height: */
     
    294354    iProposedHeight += 2 * iMachineItemMargin;
    295355    /* And machine item content to take into account: */
    296     int iFirstLineHeight = qMax(machineNameSize.height(), snapshotNameSize.height());
    297     int iSecondLineHeight = qMax(machineStatePixmapSize.height(), machineStateTextSize.height());
     356    int iFirstLineHeight = qMax(iMachineNameHeight, iSnapshotNameHeight);
     357    int iSecondLineHeight = qMax(iMachineStatePixmapHeight, iMachineStateTextHeight);
    298358    int iSecondColumnHeight = iFirstLineHeight +
    299359                              iMachineItemTextSpacing +
    300360                              iSecondLineHeight;
    301361    QList<int> heights;
    302     heights << machinePixmapSize.height() << iSecondColumnHeight
    303             << (toolBarSize.height() - 2 * iMachineItemMargin + 2);
     362    heights << iMachinePixmapHeight << iSecondColumnHeight
     363            << (iToolBarHeight - 2 * iMachineItemMargin + 2);
    304364    int iMaxHeight = 0;
    305365    foreach (int iHeight, heights)
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h

    r42529 r42558  
    8080        MachineItemData_PixmapSize,
    8181        MachineItemData_StatePixmapSize,
     82        MachineItemData_MinimumNameSize,
    8283        MachineItemData_NameSize,
     84        MachineItemData_MinimumSnapshotNameSize,
    8385        MachineItemData_SnapshotNameSize,
     86        MachineItemData_FirstRowMaximumWidth,
    8487        MachineItemData_StateTextSize,
    8588        MachineItemData_ToolBarSize
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