VirtualBox

Changeset 74482 in vbox for trunk


Ignore:
Timestamp:
Sep 26, 2018 4:10:40 PM (6 years ago)
Author:
vboxsync
Message:

FE/Qt: VirtualBox Manager: Chooser pane: Adding tools button to machine/global items.

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
7 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/VirtualBox2.qrc

    r73871 r74482  
    209209        <file alias="tools_global_32px.png">images/tools_global_32px.png</file>
    210210        <file alias="tools_machine_32px.png">images/tools_machine_32px.png</file>
     211        <file alias="tools_menu_24px.png">images/tools_menu_24px.png</file>
    211212        <file alias="usb_16px.png">images/usb_16px.png</file>
    212213        <file alias="usb_24px.png">images/usb_24px.png</file>
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserItem.cpp

    r74246 r74482  
    445445        m_fHovered = true;
    446446        emit sigHoverEnter();
    447         update();
    448     }
     447    }
     448    update();
    449449}
    450450
     
    629629}
    630630
     631/* static */
     632void UIChooserItem::paintFlatButton(QPainter *pPainter, const QRect &rectangle, const QPoint &cursorPosition)
     633{
     634    /* Save painter: */
     635    pPainter->save();
     636
     637    /* Prepare colors: */
     638    const QPalette pal = QApplication::palette();
     639    const QColor color = pal.color(QPalette::Active, QPalette::Mid);
     640
     641    /* Prepare pen: */
     642    QPen pen;
     643    pen.setColor(color.darker(110));
     644    pen.setWidth(0);
     645    pPainter->setPen(pen);
     646
     647    /* Apply clipping path: */
     648    QPainterPath path;
     649    path.addRect(rectangle);
     650    pPainter->setClipPath(path);
     651
     652    /* Paint active background: */
     653    QRadialGradient grad(rectangle.center(), rectangle.width(), cursorPosition);
     654    grad.setColorAt(0, color.lighter(150));
     655    grad.setColorAt(1, color.lighter(110));
     656    pPainter->fillRect(rectangle, grad);
     657
     658    /* Paint frame: */
     659    const QRect frameRectangle = rectangle.adjusted(0, 0, -1, -1);
     660    pPainter->drawRect(frameRectangle);
     661
     662    /* Restore painter: */
     663    pPainter->restore();
     664}
     665
    631666
    632667/*********************************************************************************************************************************
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserItem.h

    r74084 r74482  
    311311                              const QFont &font, QPaintDevice *pPaintDevice,
    312312                              const QString &strText);
     313        /** Paints flat button @a rectangle using passed @a pPainter moving light focus according to passed @a cursorPosition. */
     314        static void paintFlatButton(QPainter *pPainter, const QRect &rectangle, const QPoint &cursorPosition);
    313315    /** @} */
    314316
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserItemGlobal.cpp

    r74481 r74482  
    2121
    2222/* Qt includes: */
     23# include <QGraphicsScene>
    2324# include <QGraphicsSceneMouseEvent>
     25# include <QGraphicsView>
    2426# include <QPainter>
    2527# include <QStyleOptionGraphicsItem>
     
    6163
    6264    /* Init: */
    63     updatePixmap();
     65    updatePixmaps();
    6466
    6567    /* Apply language settings: */
     
    9092
    9193    /* Init: */
    92     updatePixmap();
     94    updatePixmaps();
    9395
    9496    /* Apply language settings: */
     
    122124}
    123125
     126bool UIChooserItemGlobal::isToolsButtonArea(const QPoint &position) const
     127{
     128    const int iFullWidth = geometry().width();
     129    const int iFullHeight = geometry().height();
     130    const int iMargin = data(GlobalItemData_Margin).toInt();
     131    const int iButtonMargin = data(GlobalItemData_ButtonMargin).toInt();
     132    const int iToolsPixmapX = iFullWidth - iMargin - 1 - m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio();
     133    const int iToolsPixmapY = (iFullHeight - m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio()) / 2;
     134    QRect rect = QRect(iToolsPixmapX,
     135                       iToolsPixmapY,
     136                       m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio(),
     137                       m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio());
     138    rect.adjust(- iButtonMargin, -iButtonMargin, iButtonMargin, iButtonMargin);
     139    return rect.contains(position);
     140}
     141
    124142void UIChooserItemGlobal::setHeightHint(int iHint)
    125143{
     
    152170
    153171    /* Update pixmaps: */
    154     updatePixmap();
     172    updatePixmaps();
    155173}
    156174
     
    255273{
    256274    /* Update this global-item: */
    257     updatePixmap();
     275    updatePixmaps();
    258276    updateToolTip();
    259277
     
    316334    iProposedWidth += (m_pixmapSize.width() +
    317335                       iSpacing +
    318                        m_iMinimumNameWidth);
     336                       m_iMinimumNameWidth +
     337                       iSpacing +
     338                       m_toolsPixmapSize.width());
    319339
    320340    /* Return result: */
     
    331351
    332352    /* Global-item content height: */
    333     const int iContentHeight = qMax(m_pixmapSize.height(), m_visibleNameSize.height());
     353    int iContentHeight = qMax(m_pixmapSize.height(), m_visibleNameSize.height());
     354    iContentHeight = qMax(iContentHeight, m_toolsPixmapSize.height());
    334355
    335356    /* If we have height hint: */
     
    388409void UIChooserItemGlobal::sltHandleWindowRemapped()
    389410{
    390     updatePixmap();
     411    updatePixmaps();
    391412}
    392413
     
    419440    {
    420441        /* Layout hints: */
    421         case GlobalItemData_Margin:  return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) / 3 * 2;
    422         case GlobalItemData_Spacing: return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) / 2;
     442        case GlobalItemData_Margin:       return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) / 3 * 2;
     443        case GlobalItemData_Spacing:      return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) / 2;
     444        case GlobalItemData_ButtonMargin: return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) / 4;
    423445
    424446        /* Default: */
     
    426448    }
    427449    return QVariant();
     450}
     451
     452void UIChooserItemGlobal::updatePixmaps()
     453{
     454    /* Update pixmap: */
     455    updatePixmap();
     456    /* Update tools-pixmap: */
     457    updateToolsPixmap();
    428458}
    429459
     
    448478    {
    449479        m_pixmap = pixmap;
     480        update();
     481    }
     482}
     483
     484void UIChooserItemGlobal::updateToolsPixmap()
     485{
     486    /* Determine icon metric: */
     487    const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize) * .75;
     488    /* Create new tools-pixmap and tools-pixmap size: */
     489    const QIcon toolsIcon = UIIconPool::iconSet(":/tools_menu_24px.png");
     490    AssertReturnVoid(!toolsIcon.isNull());
     491    const QSize toolsPixmapSize = QSize(iIconMetric, iIconMetric);
     492    const QPixmap toolsPixmap = toolsIcon.pixmap(gpManager->windowHandle(), toolsPixmapSize);
     493    /* Update linked values: */
     494    if (m_toolsPixmapSize != toolsPixmapSize)
     495    {
     496        m_toolsPixmapSize = toolsPixmapSize;
     497        updateGeometry();
     498    }
     499    if (m_toolsPixmap.toImage() != toolsPixmap.toImage())
     500    {
     501        m_toolsPixmap = toolsPixmap;
    450502        update();
    451503    }
     
    577629{
    578630    /* Prepare variables: */
     631    const int iFullWidth = rectangle.width();
    579632    const int iFullHeight = rectangle.height();
    580633    const int iMargin = data(GlobalItemData_Margin).toInt();
    581634    const int iSpacing = data(GlobalItemData_Spacing).toInt();
     635    const int iButtonMargin = data(GlobalItemData_ButtonMargin).toInt();
    582636
    583637    /* Selected item foreground: */
     
    619673
    620674    /* Calculate indents: */
    621     const int iRightColumnIndent = iLeftColumnIndent +
    622                                    m_pixmapSize.width() +
    623                                    iSpacing;
    624 
    625     /* Paint right column: */
     675    const int iMiddleColumnIndent = iLeftColumnIndent +
     676                                    m_pixmapSize.width() +
     677                                    iSpacing;
     678
     679    /* Paint middle column: */
    626680    {
    627681        /* Prepare variables: */
    628         const int iNameX = iRightColumnIndent;
     682        const int iNameX = iMiddleColumnIndent;
    629683        const int iNameY = (iFullHeight - m_visibleNameSize.height()) / 2;
    630684
     
    641695                  m_strVisibleName);
    642696    }
    643 }
     697
     698    /* Calculate indents: */
     699    int iRightColumnIndent = iFullWidth - iMargin - 1 - m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio();
     700
     701    /* Paint right column: */
     702    if (model()->currentItem() == this)
     703    {
     704        /* Prepare variables: */
     705        int iToolsPixmapX = iRightColumnIndent;
     706        int iToolsPixmapY = (iFullHeight - m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio()) / 2;
     707        QRect buttonRectangle = QRect(iToolsPixmapX,
     708                                      iToolsPixmapY,
     709                                      m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio(),
     710                                      m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio());
     711        buttonRectangle.adjust(- iButtonMargin, -iButtonMargin, iButtonMargin, iButtonMargin);
     712        const QPoint sceneCursorPosition = model()->scene()->views().first()->mapFromGlobal(QCursor::pos());
     713        const QPoint itemCursorPosition = mapFromScene(sceneCursorPosition).toPoint();
     714
     715        /* Paint flat button: */
     716        paintFlatButton(/* Painter: */
     717                        pPainter,
     718                        /* Button rectangle: */
     719                        buttonRectangle,
     720                        /* Cursor position: */
     721                        itemCursorPosition);
     722
     723        /* Paint pixmap: */
     724        paintPixmap(/* Painter: */
     725                    pPainter,
     726                    /* Point to paint in: */
     727                    QPoint(iToolsPixmapX, iToolsPixmapY),
     728                    /* Pixmap to paint: */
     729                    m_toolsPixmap);
     730    }
     731}
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserItemGlobal.h

    r74481 r74482  
    4646    virtual ~UIChooserItemGlobal() /* override */;
    4747
     48    /** @name Item stuff.
     49      * @{ */
     50        /** Returns whether passed @a position belongs to tools button area. */
     51        bool isToolsButtonArea(const QPoint &position) const;
     52    /** @} */
     53
    4854    /** @name Layout stuff.
    4955      * @{ */
     
    177183        GlobalItemData_Margin,
    178184        GlobalItemData_Spacing,
     185        GlobalItemData_ButtonMargin,
    179186    };
    180187
     
    193200    /** @name Layout stuff.
    194201      * @{ */
     202        /** Updates pixmaps. */
     203        void updatePixmaps();
    195204        /** Updates pixmap. */
    196205        void updatePixmap();
     206        /** Updates tools pixmap. */
     207        void updateToolsPixmap();
    197208        /** Updates minimum name width. */
    198209        void updateMinimumNameWidth();
     
    224235        /** Holds item pixmap. */
    225236        QPixmap  m_pixmap;
     237        /** Holds item tools pixmap. */
     238        QPixmap  m_toolsPixmap;
    226239
    227240        /** Holds item name. */
     
    240253        /** Holds pixmap size. */
    241254        QSize  m_pixmapSize;
     255        /** Holds tools pixmap size. */
     256        QSize  m_toolsPixmapSize;
    242257        /** Holds visible name size. */
    243258        QSize  m_visibleNameSize;
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserItemMachine.cpp

    r74467 r74482  
    2121
    2222/* Qt includes: */
     23# include <QGraphicsScene>
     24# include <QGraphicsView>
    2325# include <QPainter>
    2426# include <QStyleOptionGraphicsItem>
     
    155157           state != KMachineState_Teleported &&
    156158           state != KMachineState_Aborted;
     159}
     160
     161bool UIChooserItemMachine::isToolsButtonArea(const QPoint &position) const
     162{
     163    const int iFullWidth = geometry().width();
     164    const int iFullHeight = geometry().height();
     165    const int iMargin = data(MachineItemData_Margin).toInt();
     166    const int iButtonMargin = data(MachineItemData_ButtonMargin).toInt();
     167    const int iToolsPixmapX = iFullWidth - iMargin - 1 - m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio();
     168    const int iToolsPixmapY = (iFullHeight - m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio()) / 2;
     169    QRect rect = QRect(iToolsPixmapX,
     170                       iToolsPixmapY,
     171                       m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio(),
     172                       m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio());
     173    rect.adjust(- iButtonMargin, -iButtonMargin, iButtonMargin, iButtonMargin);
     174    return rect.contains(position);
    157175}
    158176
     
    421439                           iMinorSpacing +
    422440                           m_stateTextSize.width();
    423     int iRightColumnWidth = qMax(iTopLineWidth, iBottomLineWidth);
     441    int iMiddleColumnWidth = qMax(iTopLineWidth, iBottomLineWidth);
    424442    int iMachineItemWidth = m_pixmapSize.width() +
    425443                            iMajorSpacing +
    426                             iRightColumnWidth;
     444                            iMiddleColumnWidth +
     445                            iMajorSpacing +
     446                            m_toolsPixmapSize.width();
    427447    iProposedWidth += iMachineItemWidth;
    428448
     
    445465    int iTopLineHeight = qMax(m_visibleNameSize.height(), m_visibleSnapshotNameSize.height());
    446466    int iBottomLineHeight = qMax(m_statePixmapSize.height(), m_stateTextSize.height());
    447     int iRightColumnHeight = iTopLineHeight +
    448                              iMachineItemTextSpacing +
    449                              iBottomLineHeight;
     467    int iMiddleColumnHeight = iTopLineHeight +
     468                              iMachineItemTextSpacing +
     469                              iBottomLineHeight;
    450470    QList<int> heights;
    451     heights << m_pixmapSize.height() << iRightColumnHeight;
     471    heights << m_pixmapSize.height() << iMiddleColumnHeight << m_toolsPixmapSize.height();
    452472    int iMaxHeight = 0;
    453473    foreach (int iHeight, heights)
     
    628648        case MachineItemData_TextSpacing:  return 0;
    629649        case MachineItemData_ParentIndent: return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) / 3;
     650        case MachineItemData_ButtonMargin: return QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize) / 4;
    630651
    631652        /* Pixmaps: */
     
    645666    /* Update pixmap: */
    646667    updatePixmap();
    647 
    648668    /* Update state-pixmap: */
    649669    updateStatePixmap();
     670    /* Update tools-pixmap: */
     671    updateToolsPixmap();
    650672}
    651673
     
    687709    {
    688710        m_statePixmap = statePixmap;
     711        update();
     712    }
     713}
     714
     715void UIChooserItemMachine::updateToolsPixmap()
     716{
     717    /* Determine icon metric: */
     718    const int iIconMetric = QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize) * .75;
     719    /* Create new tools-pixmap and tools-pixmap size: */
     720    const QIcon toolsIcon = UIIconPool::iconSet(":/tools_menu_24px.png");
     721    AssertReturnVoid(!toolsIcon.isNull());
     722    const QSize toolsPixmapSize = QSize(iIconMetric, iIconMetric);
     723    const QPixmap toolsPixmap = toolsIcon.pixmap(gpManager->windowHandle(), toolsPixmapSize);
     724    /* Update linked values: */
     725    if (m_toolsPixmapSize != toolsPixmapSize)
     726    {
     727        m_toolsPixmapSize = toolsPixmapSize;
     728        updateGeometry();
     729    }
     730    if (m_toolsPixmap.toImage() != toolsPixmap.toImage())
     731    {
     732        m_toolsPixmap = toolsPixmap;
    689733        update();
    690734    }
     
    9981042{
    9991043    /* Prepare variables: */
     1044    const int iFullWidth = rectangle.width();
    10001045    const int iFullHeight = rectangle.height();
    10011046    const int iMargin = data(MachineItemData_Margin).toInt();
     
    10041049    const int iMachineItemTextSpacing = data(MachineItemData_TextSpacing).toInt();
    10051050    const int iParentIndent = data(MachineItemData_ParentIndent).toInt();
     1051    const int iButtonMargin = data(MachineItemData_ButtonMargin).toInt();
    10061052
    10071053    /* Selected item foreground: */
     
    10421088
    10431089    /* Calculate indents: */
    1044     int iRightColumnIndent = iLeftColumnIndent +
    1045                              m_pixmapSize.width() +
    1046                              iMajorSpacing;
    1047 
    1048     /* Paint right column: */
     1090    int iMiddleColumnIndent = iLeftColumnIndent +
     1091                              m_pixmapSize.width() +
     1092                              iMajorSpacing;
     1093
     1094    /* Paint middle column: */
    10491095    {
    10501096        /* Calculate indents: */
     
    10591105            {
    10601106                /* Prepare variables: */
    1061                 int iNameX = iRightColumnIndent;
     1107                int iNameX = iMiddleColumnIndent;
    10621108                int iNameY = iTopLineIndent;
    10631109                /* Paint name: */
     
    10751121
    10761122            /* Calculate indents: */
    1077             int iSnapshotNameIndent = iRightColumnIndent +
     1123            int iSnapshotNameIndent = iMiddleColumnIndent +
    10781124                                      m_visibleNameSize.width() +
    10791125                                      iMinorSpacing;
    10801126
    1081             /* Paint right element: */
     1127            /* Paint middle element: */
    10821128            if (!snapshotName().isEmpty())
    10831129            {
     
    11071153            {
    11081154                /* Prepare variables: */
    1109                 int iMachineStatePixmapX = iRightColumnIndent;
     1155                int iMachineStatePixmapX = iMiddleColumnIndent;
    11101156                int iMachineStatePixmapY = iBottomLineIndent;
    11111157                /* Paint state pixmap: */
     
    11191165
    11201166            /* Calculate indents: */
    1121             int iMachineStateTextIndent = iRightColumnIndent +
     1167            int iMachineStateTextIndent = iMiddleColumnIndent +
    11221168                                          m_statePixmapSize.width() +
    11231169                                          iMinorSpacing;
     
    11421188        }
    11431189    }
     1190
     1191    /* Calculate indents: */
     1192    int iRightColumnIndent = iFullWidth - iMargin - 1 - m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio();
     1193
     1194    /* Paint right column: */
     1195    if (model()->currentItem() == this)
     1196    {
     1197        /* Prepare variables: */
     1198        int iToolsPixmapX = iRightColumnIndent;
     1199        int iToolsPixmapY = (iFullHeight - m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio()) / 2;
     1200        QRect buttonRectangle = QRect(iToolsPixmapX,
     1201                                      iToolsPixmapY,
     1202                                      m_toolsPixmap.width() / m_toolsPixmap.devicePixelRatio(),
     1203                                      m_toolsPixmap.height() / m_toolsPixmap.devicePixelRatio());
     1204        buttonRectangle.adjust(- iButtonMargin, -iButtonMargin, iButtonMargin, iButtonMargin);
     1205        const QPoint sceneCursorPosition = model()->scene()->views().first()->mapFromGlobal(QCursor::pos());
     1206        const QPoint itemCursorPosition = mapFromScene(sceneCursorPosition).toPoint();
     1207
     1208        /* Paint flat button: */
     1209        paintFlatButton(/* Painter: */
     1210                        pPainter,
     1211                        /* Button rectangle: */
     1212                        buttonRectangle,
     1213                        /* Cursor position: */
     1214                        itemCursorPosition);
     1215
     1216        /* Paint pixmap: */
     1217        paintPixmap(/* Painter: */
     1218                    pPainter,
     1219                    /* Point to paint in: */
     1220                    QPoint(iToolsPixmapX, iToolsPixmapY),
     1221                    /* Pixmap to paint: */
     1222                    m_toolsPixmap);
     1223    }
    11441224}
    11451225
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/chooser/UIChooserItemMachine.h

    r74467 r74482  
    5757        /** Returns whether VM is locked. */
    5858        bool isLockedMachine() const;
     59
     60        /** Returns whether passed @a position belongs to tools button area. */
     61        bool isToolsButtonArea(const QPoint &position) const;
    5962    /** @} */
    6063
     
    196199        MachineItemData_TextSpacing,
    197200        MachineItemData_ParentIndent,
     201        MachineItemData_ButtonMargin,
    198202        /* Pixmaps: */
    199203        MachineItemData_SettingsButtonPixmap,
     
    223227        /** Updates state pixmap. */
    224228        void updateStatePixmap();
     229        /** Updates tools pixmap. */
     230        void updateToolsPixmap();
    225231        /** Updates name. */
    226232        void updateName();
     
    277283        /** Holds item state pixmap. */
    278284        QPixmap  m_statePixmap;
     285        /** Holds item tools pixmap. */
     286        QPixmap  m_toolsPixmap;
    279287
    280288        /** Holds item name. */
     
    305313        /** Holds state pixmap size. */
    306314        QSize  m_statePixmapSize;
     315        /** Holds tools pixmap size. */
     316        QSize  m_toolsPixmapSize;
    307317        /** Holds visible name size. */
    308318        QSize  m_visibleNameSize;
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