VirtualBox

Changeset 43841 in vbox


Ignore:
Timestamp:
Nov 8, 2012 2:05:46 PM (12 years ago)
Author:
vboxsync
Message:

FE/Qt: VM group UI: Caching almost all the variables used for machine-item painting (pixmaps, strings, dimensions).

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

    r43809 r43841  
    9191        m_pHighlightMachine->start();
    9292    }
     93
     94    /* Geometry-change handler: */
     95    connect(this, SIGNAL(geometryChanged()), this, SLOT(sltHandleGeometryChange()));
    9396}
    9497
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h

    r43809 r43841  
    132132    /* API: Toggle stuff: */
    133133    bool isTemporary() const;
     134
     135protected slots:
     136
     137    /* Handler: Geometry change stuff: */
     138    virtual void sltHandleGeometryChange() = 0;
    134139
    135140protected:
     
    150155    void dropEvent(QGraphicsSceneDragDropEvent *pEvent);
    151156
    152     /* Helper: Recache stuff: */
     157    /* Helper: Update stuff: */
    153158    virtual void handleRootStatusChange() {}
     159    void setPreviousGeometry(const QRectF &previousGeometry) { m_previousGeometry = previousGeometry; }
     160    const QRectF& previousGeometry() const { return m_previousGeometry; }
    154161
    155162    /* Static paint stuff: */
     
    187194    bool m_fTemporary;
    188195    UIGChooserItem *m_pParent;
     196    QRectF m_previousGeometry;
    189197    DragToken m_dragTokenPlace;
    190198
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.cpp

    r43829 r43841  
    257257
    258258    /* Should we update visible name? */
    259     if (m_previousGeometry.width() != newGeometry.width())
     259    if (previousGeometry().width() != newGeometry.width())
    260260        updateVisibleName();
    261261
    262262    /* Remember the new geometry: */
    263     m_previousGeometry = newGeometry;
     263    setPreviousGeometry(newGeometry);
    264264}
    265265
     
    413413    m_machinesPixmap = QPixmap(":/machine_16px.png");
    414414
    415     /* Geometry-change handler: */
    416     connect(this, SIGNAL(geometryChanged()), this, SLOT(sltHandleGeometryChange()));
    417 
    418415    /* Items except roots: */
    419416    if (!isRoot())
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h

    r43825 r43841  
    209209    int m_iBlackoutDarkness;
    210210    /* Cached values: */
    211     QRectF m_previousGeometry;
    212211    QString m_strVisibleName;
    213212    QSize m_headerSize;
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp

    r43830 r43841  
    5555    setZValue(parentItem()->zValue() + 1);
    5656
     57    /* Init: */
     58    updatePixmaps();
     59    updateName();
     60    updateSnapshotName();
     61
    5762    /* Translate finally: */
    5863    retranslateUi();
     
    7277    parentItem()->addItem(this, iPosition);
    7378    setZValue(parentItem()->zValue() + 1);
     79
     80    /* Init: */
     81    updatePixmaps();
     82    updateName();
     83    updateSnapshotName();
    7484
    7585    /* Translate finally: */
     
    168178}
    169179
     180void UIGChooserItemMachine::sltHandleGeometryChange()
     181{
     182    /* What is the new geometry? */
     183    QRectF newGeometry = geometry();
     184
     185    /* Should we update visible name? */
     186    if (previousGeometry().width() != newGeometry.width())
     187        updateFirstRowMaximumWidth();
     188
     189    /* Remember the new geometry: */
     190    setPreviousGeometry(newGeometry);
     191}
     192
    170193QVariant UIGChooserItemMachine::data(int iKey) const
    171194{
     
    185208        case MachineItemData_CloseButtonPixmap: return UIIconPool::iconSet(":/exit_16px.png");
    186209
    187         /* Texts: */
    188         case MachineItemData_Name:
    189         {
    190             return compressText(m_nameFont, model()->paintDevice(),
    191                                 name(), data(MachineItemData_MaximumNameWidth).toInt());
    192         }
    193         case MachineItemData_SnapshotName:
    194         {
    195             QPaintDevice *pPaintDevice = model()->paintDevice();
    196             int iBracketWidth = QFontMetrics(m_snapshotNameFont, pPaintDevice).width("()");
    197             QString strCompressedName = compressText(m_snapshotNameFont, pPaintDevice, snapshotName(),
    198                                                      data(MachineItemData_MaximumSnapshotNameWidth).toInt() - iBracketWidth);
    199             return QString("(%1)").arg(strCompressedName);
    200         }
    201         case MachineItemData_StateText: return machineStateName();
    202 
    203210        /* Sizes: */
    204         case MachineItemData_NameSize:
    205         {
    206             QFontMetrics fm(m_nameFont, model()->paintDevice());
    207             return QSize(fm.width(data(MachineItemData_Name).toString()) + 2, fm.height());
    208         }
    209         case MachineItemData_MinimumNameWidth:
    210         {
    211             QPaintDevice *pPaintDevice = model()->paintDevice();
    212             return QFontMetrics(m_nameFont, pPaintDevice).width(compressText(m_nameFont, pPaintDevice,
    213                                                                              name(), textWidth(m_nameFont, pPaintDevice, 15)));
    214         }
    215         case MachineItemData_MaximumNameWidth:
    216         {
    217             return data(MachineItemData_FirstRowMaximumWidth).toInt() -
    218                    data(MachineItemData_MinimumSnapshotNameWidth).toInt();
    219         }
    220 
    221         case MachineItemData_SnapshotNameSize:
    222         {
    223             QFontMetrics fm(m_snapshotNameFont, model()->paintDevice());
    224             return QSize(fm.width(data(MachineItemData_SnapshotName).toString()) + 2, fm.height());
    225         }
    226         case MachineItemData_MinimumSnapshotNameWidth:
    227         {
    228             if (snapshotName().isEmpty())
    229                 return 0;
    230             QFontMetrics fm(m_snapshotNameFont, model()->paintDevice());
    231             int iBracketWidth = fm.width("()");
    232             int iActualTextWidth = fm.width(snapshotName());
    233             int iMinimumTextWidth = fm.width("...");
    234             return iBracketWidth + qMin(iActualTextWidth, iMinimumTextWidth);
    235         }
    236         case MachineItemData_MaximumSnapshotNameWidth:
    237         {
    238             return data(MachineItemData_FirstRowMaximumWidth).toInt() -
    239                    data(MachineItemData_NameSize).toSize().width();
    240         }
    241 
    242         case MachineItemData_FirstRowMaximumWidth:
    243         {
    244             /* Prepare variables: */
    245             int iMargin = data(MachineItemData_Margin).toInt();
    246             int iPixmapWidth = m_pixmapSize.width();
    247             int iMachineItemMajorSpacing = data(MachineItemData_MajorSpacing).toInt();
    248             int iMachineItemMinorSpacing = data(MachineItemData_MinorSpacing).toInt();
    249             int iToolBarWidth = data(MachineItemData_ToolBarSize).toSize().width();
    250             int iMaximumWidth = (int)geometry().width() - 2 * iMargin -
    251                                                           iPixmapWidth -
    252                                                           iMachineItemMajorSpacing;
    253             if (!snapshotName().isEmpty())
    254                 iMaximumWidth -= iMachineItemMinorSpacing;
    255             if (m_pToolBar)
    256                 iMaximumWidth -= (iToolBarWidth + iMachineItemMajorSpacing);
    257             return iMaximumWidth;
    258         }
    259         case MachineItemData_StateTextSize:
    260         {
    261             QFontMetrics fm(m_stateTextFont, model()->paintDevice());
    262             return QSize(fm.width(data(MachineItemData_StateText).toString()) + 2, fm.height());
    263         }
    264         case MachineItemData_ToolBarSize:
    265         {
    266             return m_pToolBar ? m_pToolBar->minimumSizeHint().toSize() : QSize(0, 0);
    267         }
     211        case MachineItemData_ToolBarSize: return m_pToolBar ? m_pToolBar->minimumSizeHint().toSize() : QSize(0, 0);
     212
    268213        /* Default: */
    269214        default: break;
     
    274219void UIGChooserItemMachine::updatePixmaps()
    275220{
     221    /* First row update required? */
     222    bool fFirstRowUpdateRequired = false;
     223
    276224    /* Update pixmap: */
    277     const QIcon &icon = osIcon();
    278     m_pixmapSize = icon.availableSizes().first();
    279     m_pixmap = icon.pixmap(m_pixmapSize);
    280     /* Update state pixmap: */
    281     const QIcon &stateIcon = machineStateIcon();
    282     m_statePixmapSize = stateIcon.availableSizes().first();
    283     m_statePixmap = stateIcon.pixmap(m_statePixmapSize);
     225    QIcon icon = osIcon();
     226    QSize iconSize = icon.availableSizes().first();
     227    m_pixmap = icon.pixmap(iconSize);
     228    if (m_pixmapSize != iconSize)
     229    {
     230        m_pixmapSize = iconSize;
     231        fFirstRowUpdateRequired = true;
     232    }
     233
     234    /* Update state-pixmap: */
     235    QIcon stateIcon = machineStateIcon();
     236    QSize stateIconSize = stateIcon.availableSizes().first();
     237    m_statePixmap = stateIcon.pixmap(stateIconSize);
     238    if (m_statePixmapSize != stateIconSize)
     239    {
     240        m_statePixmapSize = stateIconSize;
     241    }
     242
     243    /* Update linked values: */
     244    if (fFirstRowUpdateRequired)
     245        updateFirstRowMaximumWidth();
     246}
     247
     248void UIGChooserItemMachine::updateName()
     249{
     250    /* Something changed? */
     251    QString strName = name();
     252    if (m_strName == strName)
     253        return;
     254
     255    /* Remember new name: */
     256    m_strName = strName;
     257
     258    /* Update linked values: */
     259    updateMinimumNameWidth();
     260    updateVisibleName();
     261}
     262
     263void UIGChooserItemMachine::updateSnapshotName()
     264{
     265    /* Something changed? */
     266    QString strSnapshotName = snapshotName();
     267    if (m_strSnapshotName == strSnapshotName)
     268        return;
     269
     270    /* Remember new snapshot name: */
     271    m_strSnapshotName = strSnapshotName;
     272
     273    /* Update linked values: */
     274    updateMinimumSnapshotNameWidth();
     275    updateVisibleSnapshotName();
     276}
     277
     278void UIGChooserItemMachine::updateFirstRowMaximumWidth()
     279{
     280    /* Prepare variables: */
     281    int iMargin = data(MachineItemData_Margin).toInt();
     282    int iPixmapWidth = m_pixmapSize.width();
     283    int iMachineItemMajorSpacing = data(MachineItemData_MajorSpacing).toInt();
     284    int iMachineItemMinorSpacing = data(MachineItemData_MinorSpacing).toInt();
     285    int iToolBarWidth = data(MachineItemData_ToolBarSize).toSize().width();
     286
     287    /* Calculate maximum width for the first row: */
     288    m_iFirstRowMaximumWidth = geometry().width();
     289    m_iFirstRowMaximumWidth -= iMargin; /* left margin */
     290    m_iFirstRowMaximumWidth -= iPixmapWidth; /* pixmap width */
     291    m_iFirstRowMaximumWidth -= iMachineItemMajorSpacing; /* spacing between pixmap and name */
     292    if (!snapshotName().isEmpty())
     293        m_iFirstRowMaximumWidth -= iMachineItemMinorSpacing; /* spacing between name and snapshot name */
     294    if (m_pToolBar)
     295    {
     296        m_iFirstRowMaximumWidth -= iMachineItemMajorSpacing; /* spacing before toolbar */
     297        m_iFirstRowMaximumWidth -= iToolBarWidth; /* toolbar width */
     298    }
     299    m_iFirstRowMaximumWidth -= iMargin; /* right margin */
     300
     301    /* Update linked values: */
     302    updateMaximumNameWidth();
     303    updateMaximumSnapshotNameWidth();
     304}
     305
     306void UIGChooserItemMachine::updateMinimumNameWidth()
     307{
     308    /* Calculate minimum name width: */
     309    QPaintDevice *pPaintDevice = model()->paintDevice();
     310    QFontMetrics fm(m_nameFont, pPaintDevice);
     311    m_iMinimumNameWidth = fm.width(compressText(m_nameFont, pPaintDevice, m_strName, textWidth(m_nameFont, pPaintDevice, 15)));
     312}
     313
     314void UIGChooserItemMachine::updateMinimumSnapshotNameWidth()
     315{
     316    /* Do we have a snapshot? */
     317    if (m_strSnapshotName.isEmpty())
     318    {
     319        /* Clear minimum snapshot name width: */
     320        m_iMinimumSnapshotNameWidth = 0;
     321    }
     322    else
     323    {
     324        /* Calculate minimum snapshot name width: */
     325        QFontMetrics fm(m_snapshotNameFont, model()->paintDevice());
     326        int iBracketWidth = fm.width("()"); /* bracket width */
     327        int iActualTextWidth = fm.width(m_strSnapshotName); /* snapshot name width */
     328        int iMinimumTextWidth = fm.width("..."); /* ellipsis width */
     329        m_iMinimumSnapshotNameWidth = iBracketWidth + qMin(iActualTextWidth, iMinimumTextWidth);
     330    }
     331
     332    /* Calculate linked values: */
     333    updateMaximumNameWidth();
     334}
     335
     336void UIGChooserItemMachine::updateMaximumNameWidth()
     337{
     338    /* Calculate maximum name width: */
     339    m_iMaximumNameWidth = m_iFirstRowMaximumWidth - m_iMinimumSnapshotNameWidth;
     340
     341    /* Calculate linked values: */
     342    updateVisibleName();
     343}
     344
     345void UIGChooserItemMachine::updateMaximumSnapshotNameWidth()
     346{
     347    /* Calculate maximum snapshot name width: */
     348    m_iMaximumSnapshotNameWidth = m_iFirstRowMaximumWidth - m_visibleNameSize.width();
     349
     350    /* Update linked values: */
     351    updateVisibleSnapshotName();
     352}
     353
     354void UIGChooserItemMachine::updateVisibleName()
     355{
     356    /* Prepare variables: */
     357    QPaintDevice *pPaintDevice = model()->paintDevice();
     358
     359    /* Calculate visible name: */
     360    m_strVisibleName = compressText(m_nameFont, pPaintDevice, m_strName, m_iMaximumNameWidth);
     361    m_visibleNameSize = textSize(m_nameFont, pPaintDevice, m_strVisibleName);
     362    update();
     363
     364    /* Update linked values: */
     365    updateMaximumSnapshotNameWidth();
     366}
     367
     368void UIGChooserItemMachine::updateVisibleSnapshotName()
     369{
     370    /* Prepare variables: */
     371    QPaintDevice *pPaintDevice = model()->paintDevice();
     372
     373    /* Calculate visible snapshot name: */
     374    int iBracketWidth = QFontMetrics(m_snapshotNameFont, pPaintDevice).width("()");
     375    QString strVisibleSnapshotName = compressText(m_snapshotNameFont, pPaintDevice, m_strSnapshotName,
     376                                                  m_iMaximumSnapshotNameWidth - iBracketWidth);
     377    m_strVisibleSnapshotName = QString("(%1)").arg(strVisibleSnapshotName);
     378    m_visibleSnapshotNameSize = textSize(m_snapshotNameFont, pPaintDevice, m_strVisibleSnapshotName);
     379    update();
     380}
     381
     382void UIGChooserItemMachine::updateStateText()
     383{
     384    /* Update state text: */
     385    m_strStateText = machineStateName();
     386    m_stateTextSize = textSize(m_stateTextFont, model()->paintDevice(), m_strStateText);
     387    update();
    284388}
    285389
    286390void UIGChooserItemMachine::retranslateUi()
    287391{
     392    /* Update state text: */
     393    updateStateText();
     394
    288395    /* Update machine tool-tip: */
    289396    updateToolTip();
     
    341448    recache();
    342449    updatePixmaps();
     450    updateName();
     451    updateSnapshotName();
     452    updateStateText();
    343453    updateToolTip();
    344454    update();
     
    433543    int iMachineItemMinorSpacing = data(MachineItemData_MinorSpacing).toInt();
    434544    int iMachinePixmapWidth = m_pixmapSize.width();
    435     int iMinimumNameWidth = data(MachineItemData_MinimumNameWidth).toInt();
    436     int iMinimumSnapshotNameWidth = data(MachineItemData_MinimumSnapshotNameWidth).toInt();
    437545    int iMachineStatePixmapWidth = m_statePixmapSize.width();
    438     int iMachineStateTextWidth = data(MachineItemData_StateTextSize).toSize().width();
     546    int iMachineStateTextWidth = m_stateTextSize.width();
    439547    int iToolBarWidth = data(MachineItemData_ToolBarSize).toSize().width();
    440548
     
    445553    iProposedWidth += 2 * iMachineItemMargin;
    446554    /* And machine-item content to take into account: */
    447     int iTopLineWidth = iMinimumNameWidth +
     555    int iTopLineWidth = m_iMinimumNameWidth +
    448556                        iMachineItemMinorSpacing +
    449                         iMinimumSnapshotNameWidth;
     557                        m_iMinimumSnapshotNameWidth;
    450558    int iBottomLineWidth = iMachineStatePixmapWidth +
    451559                           iMachineItemMinorSpacing +
     
    469577    int iMachineItemTextSpacing = data(MachineItemData_TextSpacing).toInt();
    470578    int iMachinePixmapHeight = m_pixmapSize.height();
    471     int iMachineNameHeight = data(MachineItemData_NameSize).toSize().height();
    472     int iSnapshotNameHeight = data(MachineItemData_SnapshotNameSize).toSize().height();
     579    int iMachineNameHeight = m_visibleNameSize.height();
     580    int iSnapshotNameHeight = m_visibleSnapshotNameSize.height();
    473581    int iMachineStatePixmapHeight = m_statePixmapSize.height();
    474     int iMachineStateTextHeight = data(MachineItemData_StateTextSize).toSize().height();
     582    int iMachineStateTextHeight = m_stateTextSize.height();
    475583    int iToolBarHeight = data(MachineItemData_ToolBarSize).toSize().height();
    476584
     
    739847    int iMachineItemMinorSpacing = data(MachineItemData_MinorSpacing).toInt();
    740848    int iMachineItemTextSpacing = data(MachineItemData_TextSpacing).toInt();
    741     QSize machineNameSize = data(MachineItemData_NameSize).toSize();
    742     QSize snapshotNameSize = data(MachineItemData_SnapshotNameSize).toSize();
    743     QSize machineStateTextSize = data(MachineItemData_StateTextSize).toSize();
    744849
    745850    /* Update palette: */
     
    775880    {
    776881        /* Calculate indents: */
    777         int iTopLineHeight = qMax(machineNameSize.height(), snapshotNameSize.height());
    778         int iBottomLineHeight = qMax(m_statePixmapSize.height(), machineStateTextSize.height());
     882        int iTopLineHeight = qMax(m_visibleNameSize.height(), m_visibleSnapshotNameSize.height());
     883        int iBottomLineHeight = qMax(m_statePixmapSize.height(), m_stateTextSize.height());
    779884        int iRightColumnHeight = iTopLineHeight + iMachineItemTextSpacing + iBottomLineHeight;
    780885        int iTopLineIndent = (iFullHeight - iRightColumnHeight) / 2;
     
    797902                          model()->paintDevice(),
    798903                          /* Text to paint: */
    799                           data(MachineItemData_Name).toString());
     904                          m_strVisibleName);
    800905            }
    801906
    802907            /* Calculate indents: */
    803908            int iSnapshotNameIndent = iRightColumnIndent +
    804                                       machineNameSize.width() +
     909                                      m_visibleNameSize.width() +
    805910                                      iMachineItemMinorSpacing;
    806911
     
    821926                          model()->paintDevice(),
    822927                          /* Text to paint: */
    823                           data(MachineItemData_SnapshotName).toString());
     928                          m_strVisibleSnapshotName);
    824929            }
    825930        }
     
    864969                          model()->paintDevice(),
    865970                          /* Text to paint: */
    866                           data(MachineItemData_StateText).toString());
     971                          m_strStateText);
    867972            }
    868973        }
     
    894999    m_pPauseButton = 0;
    8951000    m_pCloseButton = 0;
     1001
    8961002    /* Colors: */
    8971003#ifdef Q_WS_MAC
     
    9051011#endif /* !Q_WS_MAC */
    9061012
    907     /* Initialize: */
     1013    /* Fonts: */
    9081014    m_nameFont = font();
    9091015    m_nameFont.setWeight(QFont::Bold);
    9101016    m_snapshotNameFont = font();
    9111017    m_stateTextFont = font();
    912     updatePixmaps();
     1018
     1019    /* Sizes: */
     1020    m_iFirstRowMaximumWidth = 0;
     1021    m_iMinimumNameWidth = 0;
     1022    m_iMaximumNameWidth = 0;
     1023    m_iMinimumSnapshotNameWidth = 0;
     1024    m_iMaximumSnapshotNameWidth = 0;
    9131025
    9141026    /* Other things disabled for now: */
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h

    r43830 r43841  
    6969                                      int iEnumerationFlags = 0);
    7070
     71private slots:
     72
     73    /* Handler: Geometry change stuff: */
     74    void sltHandleGeometryChange();
     75
    7176private:
    7277
     
    8489        MachineItemData_PauseButtonPixmap,
    8590        MachineItemData_CloseButtonPixmap,
    86         /* Text: */
    87         MachineItemData_Name,
    88         MachineItemData_SnapshotName,
    89         MachineItemData_StateText,
    9091        /* Sizes: */
    91         MachineItemData_NameSize,
    92         MachineItemData_MinimumNameWidth,
    93         MachineItemData_MaximumNameWidth,
    94         MachineItemData_SnapshotNameSize,
    95         MachineItemData_MinimumSnapshotNameWidth,
    96         MachineItemData_MaximumSnapshotNameWidth,
    97         MachineItemData_FirstRowMaximumWidth,
    98         MachineItemData_StateTextSize,
    9992        MachineItemData_ToolBarSize
    10093    };
     
    10396    QVariant data(int iKey) const;
    10497
    105     /* Helper: Update stuff: */
     98    /* Helpers: Update stuff: */
    10699    void updatePixmaps();
     100    void updateName();
     101    void updateSnapshotName();
     102    void updateFirstRowMaximumWidth();
     103    void updateMinimumNameWidth();
     104    void updateMinimumSnapshotNameWidth();
     105    void updateMaximumNameWidth();
     106    void updateMaximumSnapshotNameWidth();
     107    void updateVisibleName();
     108    void updateVisibleSnapshotName();
     109    void updateStateText();
    107110
    108111    /* Helper: Translate stuff: */
     
    170173    QFont m_stateTextFont;
    171174    QPixmap m_pixmap;
     175    QPixmap m_statePixmap;
     176    QString m_strName;
     177    QString m_strVisibleName;
     178    QString m_strSnapshotName;
     179    QString m_strVisibleSnapshotName;
     180    QString m_strStateText;
    172181    QSize m_pixmapSize;
    173     QPixmap m_statePixmap;
    174182    QSize m_statePixmapSize;
     183    QSize m_visibleNameSize;
     184    QSize m_visibleSnapshotNameSize;
     185    QSize m_stateTextSize;
     186    int m_iFirstRowMaximumWidth;
     187    int m_iMinimumNameWidth;
     188    int m_iMaximumNameWidth;
     189    int m_iMinimumSnapshotNameWidth;
     190    int m_iMaximumSnapshotNameWidth;
    175191};
    176192
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