VirtualBox

Changeset 41255 in vbox


Ignore:
Timestamp:
May 11, 2012 1:55:40 PM (13 years ago)
Author:
vboxsync
Message:

FE/Qt: UIPopupBox stuff: Refactoring/cleanup.

Location:
trunk/src/VBox/Frontends/VirtualBox/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.cpp

    r40192 r41255  
    281281    CMachine m_machine;
    282282    QList<Section> m_sections;
     283    UIPopupBoxGroup *m_pPopupBoxGroup;
    283284    QMap<Section, UIPopupBox*> m_block;
    284285};
     
    631632    , m_cSectionCount(0)
    632633    , m_sections(sections)
     634    , m_pPopupBoxGroup(new UIPopupBoxGroup(this))
    633635{
    634636}
     
    13101312        /* Prepare new section (popup box): */
    13111313        UIPopupBox *pPopup = m_block[section] = new UIPopupBox(this);
     1314        m_pPopupBoxGroup->addPopupBox(pPopup);
    13121315        pPopup->hide();
    1313         connect(pPopup, SIGNAL(titleClicked(const QString &)), details()->detailsPage(), SIGNAL(linkClicked(const QString &)));
    1314         connect(pPopup, SIGNAL(toggled(bool)), parent(), SLOT(sltPopupToggled(bool)));
     1316        connect(pPopup, SIGNAL(sigTitleClicked(const QString &)), details()->detailsPage(), SIGNAL(linkClicked(const QString &)));
     1317        connect(pPopup, SIGNAL(sigToggled(bool)), parent(), SLOT(sltPopupToggled(bool)));
    13151318        pPopup->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
    13161319        pPopup->setProperty("section-type", static_cast<int>(section));
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupBox.cpp

    r41250 r41255  
    33 *
    44 * VBox frontends: Qt GUI ("VirtualBox"):
    5  * UIPopupBox class implementation
     5 * UIPopupBox/UIPopupBoxGroup classes implementation
    66 */
    77
    88/*
    9  * Copyright (C) 2010-2011 Oracle Corporation
     9 * Copyright (C) 2010-2012 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1818 */
    1919
    20 /* Local includes */
     20/* Global includes: */
     21#include <QLabel>
     22#include <QPaintEvent>
     23#include <QPainter>
     24#include <QVBoxLayout>
     25
     26/* Local includes: */
    2127#include "UIPopupBox.h"
    2228#ifdef Q_WS_MAC
     
    2430#endif /* Q_WS_MAC */
    2531
    26 /* Global includes */
    27 #include <QApplication>
    28 #include <QLabel>
    29 #include <QPaintEvent>
    30 #include <QPainter>
    31 #include <QVBoxLayout>
    32 
    3332UIPopupBox::UIPopupBox(QWidget *pParent)
    3433  : QWidget(pParent)
     34  , m_pTitleIcon(new QLabel(this))
     35  , m_pWarningIcon(new QLabel(this))
     36  , m_pTitleLabel(new QLabel(this))
    3537  , m_fLinkEnabled(false)
    3638  , m_pContentWidget(0)
    3739  , m_fOpen(true)
    3840  , m_pLabelPath(0)
    39   , m_aw(9)
     41  , m_iArrowWidth(9)
    4042  , m_fHeaderHover(false)
    4143{
    42     /* Placing content: */
     44    /* Setup main-layout: */
    4345    QVBoxLayout *pMainLayout = new QVBoxLayout(this);
    4446    pMainLayout->setContentsMargins(10, 5, 5, 5);
    45     QHBoxLayout *pTitleLayout = new QHBoxLayout();
    46     m_pTitleIcon = new QLabel(this);
    47     m_pWarningIcon = new QLabel(this);
    48     m_pTitleLabel = new QLabel(this);
     47    /* Setup title-layout: */
     48    QHBoxLayout *pTitleLayout = new QHBoxLayout;
    4949    pTitleLayout->addWidget(m_pTitleIcon);
    5050    pTitleLayout->addWidget(m_pWarningIcon);
    5151    pTitleLayout->addWidget(m_pTitleLabel, Qt::AlignLeft);
     52    /* Add title-layout into main-layout: */
    5253    pMainLayout->addLayout(pTitleLayout);
    5354
    5455    /* Configure widgets: */
    5556    m_pWarningIcon->setHidden(true);
    56     m_arrowPath.lineTo(m_aw / 2.0, m_aw / 2.0);
    57     m_arrowPath.lineTo(m_aw, 0);
     57    m_arrowPath.lineTo(m_iArrowWidth / 2.0, m_iArrowWidth / 2.0);
     58    m_arrowPath.lineTo(m_iArrowWidth, 0);
    5859
    5960    /* Setup connections: */
    60     connect(m_pTitleLabel, SIGNAL(linkActivated(const QString)), this, SIGNAL(titleClicked(const QString)));
     61    connect(m_pTitleLabel, SIGNAL(linkActivated(const QString)), this, SIGNAL(sigTitleClicked(const QString)));
    6162
    6263    /* Install local event-filters: */
     
    7374}
    7475
    75 void UIPopupBox::setTitle(const QString& strTitle)
    76 {
     76void UIPopupBox::setTitleIcon(const QIcon &icon)
     77{
     78    /* Remember new title-icon: */
     79    m_titleIcon = icon;
     80    /* Update title-icon: */
     81    updateTitleIcon();
     82}
     83
     84QIcon UIPopupBox::titleIcon() const
     85{
     86    return m_titleIcon;
     87}
     88
     89void UIPopupBox::setWarningIcon(const QIcon &icon)
     90{
     91    /* Remember new warning-icon: */
     92    m_warningIcon = icon;
     93    /* Update warning-icon: */
     94    updateWarningIcon();
     95}
     96
     97QIcon UIPopupBox::warningIcon() const
     98{
     99    return m_warningIcon;
     100}
     101
     102void UIPopupBox::setTitle(const QString &strTitle)
     103{
     104    /* Remember new title: */
    77105    m_strTitle = strTitle;
    78     updateHover(true);
    79     recalc();
     106    /* Update title: */
     107    updateTitle();
    80108}
    81109
     
    85113}
    86114
    87 void UIPopupBox::setTitleIcon(const QIcon& icon)
    88 {
    89     m_titleIcon = icon;
    90     updateHover(true);
    91     recalc();
    92 }
    93 
    94 QIcon UIPopupBox::titleIcon() const
    95 {
    96     return m_titleIcon;
    97 }
    98 
    99 void UIPopupBox::setWarningIcon(const QIcon& icon)
    100 {
    101     m_warningIcon = icon;
    102     m_pWarningIcon->setHidden(m_warningIcon.isNull());
    103     updateHover(true);
    104     recalc();
    105 }
    106 
    107 QIcon UIPopupBox::warningIcon() const
    108 {
    109     return m_warningIcon;
    110 }
    111 
    112 void UIPopupBox::setTitleLink(const QString& strLink)
    113 {
     115void UIPopupBox::setTitleLink(const QString &strLink)
     116{
     117    /* Remember new title-link: */
    114118    m_strLink = strLink;
     119    /* Update title: */
     120    updateTitle();
    115121}
    116122
     
    122128void UIPopupBox::setTitleLinkEnabled(bool fEnabled)
    123129{
     130    /* Remember new title-link availability flag: */
    124131    m_fLinkEnabled = fEnabled;
     132    /* Update title: */
     133    updateTitle();
    125134}
    126135
     
    132141void UIPopupBox::setContentWidget(QWidget *pWidget)
    133142{
     143    /* Cleanup old content-widget if any: */
    134144    if (m_pContentWidget)
    135145    {
     
    137147        layout()->removeWidget(m_pContentWidget);
    138148    }
     149    /* Prepare new content-wodget: */
    139150    m_pContentWidget = pWidget;
    140151    layout()->addWidget(m_pContentWidget);
     
    150161void UIPopupBox::setOpen(bool fOpen)
    151162{
    152     /* Do not do anything if already done: */
     163    /* Check if we should toggle popup-box: */
    153164    if (m_fOpen == fOpen)
    154165        return;
     
    157168    m_fOpen = fOpen;
    158169
    159     /* Update content widget if present or this itself: */
     170    /* Update content-widget if present or this itself: */
    160171    if (m_pContentWidget)
    161172        m_pContentWidget->setVisible(m_fOpen);
     
    163174        update();
    164175
    165     /* Notify listeners about content widget visibility: */
     176    /* Notify listeners about content-widget visibility: */
    166177    if (m_pContentWidget && m_pContentWidget->isVisible())
    167178        emit sigUpdateContentWidget();
     
    174185
    175186    /* Notify listeners about toggling: */
    176     emit toggled(m_fOpen);
     187    emit sigToggled(m_fOpen);
    177188}
    178189
     
    182193}
    183194
    184 bool UIPopupBox::eventFilter(QObject * /* pWatched */, QEvent *pEvent)
    185 {
     195bool UIPopupBox::eventFilter(QObject *pWatched, QEvent *pEvent)
     196{
     197    /* Handle all mouse-event to update hover: */
    186198    QEvent::Type type = pEvent->type();
    187199    if (type == QEvent::Enter ||
     
    190202        type == QEvent::Wheel)
    191203        updateHover();
    192     return false;
     204    /* Call to base-class: */
     205    return QWidget::eventFilter(pWatched, pEvent);
    193206}
    194207
    195208void UIPopupBox::resizeEvent(QResizeEvent *pEvent)
    196209{
    197     updateHover();
    198     recalc();
     210    /* Recalculate title-size: */
     211    recalc();
     212    /* Call to base-class: */
    199213    QWidget::resizeEvent(pEvent);
    200214}
     
    202216void UIPopupBox::mouseDoubleClickEvent(QMouseEvent * /* pEvent */)
    203217{
     218    /* Toggle popup-box: */
    204219    toggleOpen();
    205220}
     
    207222void UIPopupBox::paintEvent(QPaintEvent *pEvent)
    208223{
     224    /* Create painter: */
    209225    QPainter painter(this);
    210226    painter.setClipRect(pEvent->rect());
     
    247263}
    248264
    249 void UIPopupBox::updateHover(bool fForce /* = false */)
    250 {
    251     bool fOld = m_fHeaderHover;
    252 //    QPoint bl = mapFromGlobal(QCursor::pos());
    253 //    printf("%d %d\n", bl.x(), bl.y());
    254     if (   m_pLabelPath
    255         && m_pLabelPath->contains(mapFromGlobal(QCursor::pos())))
    256 //        if (underMouse())
    257         m_fHeaderHover = true;
     265void UIPopupBox::updateTitleIcon()
     266{
     267    /* Assign title-icon: */
     268    m_pTitleIcon->setPixmap(m_titleIcon.pixmap(16, 16));
     269    /* Recalculate title-size: */
     270    recalc();
     271}
     272
     273void UIPopupBox::updateWarningIcon()
     274{
     275    /* Hide warning-icon if its null: */
     276    m_pWarningIcon->setHidden(m_warningIcon.isNull());
     277    /* Assign warning-icon: */
     278    m_pWarningIcon->setPixmap(m_warningIcon.pixmap(16, 16));
     279    /* Recalculate title-size: */
     280    recalc();
     281}
     282
     283void UIPopupBox::updateTitle()
     284{
     285    /* Update title: */
     286    if (!m_fLinkEnabled || m_strLink.isEmpty())
     287        m_pTitleLabel->setText(QString("<b>%1</b>").arg(m_strTitle));
     288    /* Recalculate title-size: */
     289    recalc();
     290}
     291
     292void UIPopupBox::updateHover()
     293{
     294    /* Calculate new header-hover state: */
     295    bool fNewHeaderHover = m_fHeaderHover;
     296    if (m_pLabelPath && m_pLabelPath->contains(mapFromGlobal(QCursor::pos())))
     297        fNewHeaderHover = true;
    258298    else
    259         m_fHeaderHover = false;
    260 
    261     if (   !m_fLinkEnabled
    262         || m_strLink.isEmpty())
    263     {
    264         m_pTitleLabel->setText(QString("<b>%1</b>").arg(m_strTitle));
    265     }
    266     if (   fForce
    267         || fOld != m_fHeaderHover)
    268     {
    269         QPalette pal = m_pTitleLabel->palette();
    270         m_pTitleLabel->setText(QString("<b><a style=\"text-decoration: none; color: %1\" href=\"%2\">%3</a></b>")
    271                                .arg(m_fHeaderHover ? pal.color(QPalette::Link).name() : pal.color(QPalette::WindowText).name())
    272                                .arg(m_strLink)
    273                                .arg(m_strTitle));
    274 
    275         QPixmap titleIcon = m_titleIcon.pixmap(16, 16);
    276         QPixmap warningIcon = m_warningIcon.pixmap(16, 16);
    277 #ifdef Q_WS_MAC
    278         /* TODO: Fix this! */
    279 //        if (!m_fHeaderHover)
    280 //            titleIcon = QPixmap::fromImage(toGray(titleIcon.toImage()));
    281 //        if (!m_fHeaderHover)
    282 //            warningIcon = QPixmap::fromImage(toGray(warningIcon.toImage()));
    283 #endif /* Q_WS_MAC */
    284         m_pTitleIcon->setPixmap(titleIcon);
    285         m_pWarningIcon->setPixmap(warningIcon);
    286         update();
    287     }
     299        fNewHeaderHover = false;
     300
     301    /* Check if we should toggle hover: */
     302    if (m_fHeaderHover == fNewHeaderHover)
     303        return;
     304
     305    /* If header-hover state switched from disabled to enabled: */
     306    if (!m_fHeaderHover && fNewHeaderHover)
     307        /* Notify listeners: */
     308        emit sigGotHover();
     309
     310    /* Toggle hover: */
     311    toggleHover(fNewHeaderHover);
     312}
     313
     314void UIPopupBox::revokeHover()
     315{
     316    /* Check if we should toggle hover: */
     317    if (m_fHeaderHover == false)
     318        return;
     319
     320    /* Toggle hover off: */
     321    toggleHover(false);
     322}
     323
     324void UIPopupBox::toggleHover(bool fHeaderHover)
     325{
     326    /* Remember header-hover state: */
     327    m_fHeaderHover = fHeaderHover;
     328
     329    /* Update title: */
     330    QPalette pal = m_pTitleLabel->palette();
     331    m_pTitleLabel->setText(QString("<b><a style=\"text-decoration: none; color: %1\" href=\"%2\">%3</a></b>")
     332                           .arg(m_fHeaderHover ? pal.color(QPalette::Link).name() : pal.color(QPalette::WindowText).name())
     333                           .arg(m_strLink)
     334                           .arg(m_strTitle));
     335    update();
    288336}
    289337
     
    303351}
    304352
     353UIPopupBoxGroup::UIPopupBoxGroup(QObject *pParent)
     354    : QObject(pParent)
     355{
     356}
     357
     358UIPopupBoxGroup::~UIPopupBoxGroup()
     359{
     360    /* Clear the list early: */
     361    m_list.clear();
     362}
     363
     364void UIPopupBoxGroup::addPopupBox(UIPopupBox *pPopupBox)
     365{
     366    /* Add popup-box into list: */
     367    m_list << pPopupBox;
     368
     369    /* Connect got-hover signal of the popup-box to hover-change slot of the popup-box group: */
     370    connect(pPopupBox, SIGNAL(sigGotHover()), this, SLOT(sltHoverChanged()));
     371}
     372
     373void UIPopupBoxGroup::sltHoverChanged()
     374{
     375    /* Fetch the sender: */
     376    UIPopupBox *pPopupBox = qobject_cast<UIPopupBox*>(sender());
     377
     378    /* Check if sender popup-box exists/registered: */
     379    if (!pPopupBox || !m_list.contains(pPopupBox))
     380        return;
     381
     382    /* Filter the sender: */
     383    QList<UIPopupBox*> list(m_list);
     384    list.removeOne(pPopupBox);
     385
     386    /* Notify all other popup-boxes: */
     387    for (int i = 0; i < list.size(); ++i)
     388        list[i]->revokeHover();
     389}
     390
  • trunk/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupBox.h

    r41250 r41255  
    22 *
    33 * VBox frontends: Qt GUI ("VirtualBox"):
    4  * UIPopupBox class declaration
     4 * UIPopupBox/UIPopupBoxGroup classes declaration
    55 */
    66
    77/*
    8  * Copyright (C) 2010-2011 Oracle Corporation
     8 * Copyright (C) 2010-2012 Oracle Corporation
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1717 */
    1818
    19 #ifndef __UIPopupBox_h__
    20 #define __UIPopupBox_h__
     19#ifndef __UIPopupBoxStuff_h__
     20#define __UIPopupBoxStuff_h__
    2121
    22 /* Global includes */
     22/* Global includes: */
    2323#include <QIcon>
    2424#include <QWidget>
    2525
    26 /* Global forward declarations */
     26/* Forward declarations: */
    2727class QLabel;
    2828
     29/* QWidget reimplementation,
     30 * wraps content-widget with nice/collapsable frame: */
    2931class UIPopupBox : public QWidget
    3032{
    3133    Q_OBJECT;
    3234
     35signals:
     36
     37    /* Signals: */
     38    void sigTitleClicked(const QString &strLink);
     39    void sigToggled(bool fOpened);
     40    void sigUpdateContentWidget();
     41    void sigGotHover();
     42
    3343public:
    3444
     45    /* Constructor/destructor: */
    3546    UIPopupBox(QWidget *pParent);
    3647    ~UIPopupBox();
    3748
    38     void setTitle(const QString& strTitle);
     49    /* Title-icon stuff: */
     50    void setTitleIcon(const QIcon &icon);
     51    QIcon titleIcon() const;
     52
     53    /* Warning-icon stuff: */
     54    void setWarningIcon(const QIcon &icon);
     55    QIcon warningIcon() const;
     56
     57    /* Title stuff: */
     58    void setTitle(const QString &strTitle);
    3959    QString title() const;
    4060
    41     void setTitleIcon(const QIcon& icon);
    42     QIcon titleIcon() const;
    43 
    44     void setWarningIcon(const QIcon& icon);
    45     QIcon warningIcon() const;
    46 
    47     void setTitleLink(const QString& strLink);
     61    /* Link stuff: */
     62    void setTitleLink(const QString &strLink);
    4863    QString titleLink() const;
    49 
    5064    void setTitleLinkEnabled(bool fEnabled);
    5165    bool isTitleLinkEnabled() const;
    5266
     67    /* Content-widget stuff: */
    5368    void setContentWidget(QWidget *pWidget);
    5469    QWidget* contentWidget() const;
    5570
     71    /* Toggle stuff: */
    5672    void setOpen(bool fOpen);
    5773    void toggleOpen();
    5874    bool isOpen() const;
    5975
     76    /* Update stuff: */
    6077    void callForUpdateContentWidget() { emit sigUpdateContentWidget(); }
    61 
    62 signals:
    63 
    64     void titleClicked(const QString &);
    65     void toggled(bool fOpened);
    66     void sigUpdateContentWidget();
    6778
    6879protected:
    6980
     81    /* Event filter: */
    7082    bool eventFilter(QObject *pWatched, QEvent *pEvent);
    7183
     84    /* Event handlers: */
    7285    void resizeEvent(QResizeEvent *pEvent);
    7386    void mouseDoubleClickEvent(QMouseEvent *pEvent);
     
    7689private:
    7790
    78     void updateHover(bool fForce = false);
     91    /* Helpers: */
     92    void updateTitleIcon();
     93    void updateWarningIcon();
     94    void updateTitle();
     95    void updateHover();
     96    void revokeHover();
     97    void toggleHover(bool fHeaderHover);
    7998    void recalc();
    8099
    81     /* Private member vars */
    82     QLabel *m_pTitleLabel;
    83     QString m_strTitle;
     100    /* Widgets: */
    84101    QLabel *m_pTitleIcon;
    85102    QLabel *m_pWarningIcon;
     103    QLabel *m_pTitleLabel;
     104
     105    /* Variables: */
    86106    QIcon m_titleIcon;
    87107    QIcon m_warningIcon;
     108    QString m_strTitle;
    88109    QString m_strLink;
    89110    bool m_fLinkEnabled;
    90111    QWidget *m_pContentWidget;
    91112    bool m_fOpen;
    92 
    93113    QPainterPath *m_pLabelPath;
    94     const int m_aw;
     114    const int m_iArrowWidth;
    95115    QPainterPath m_arrowPath;
    96116    bool m_fHeaderHover;
     117
     118    /* Friend class: */
     119    friend class UIPopupBoxGroup;
    97120};
    98121
    99 #endif /* !__UIPopupBox_h__ */
     122/* QObject reimplementation,
     123 * provides a container to organize groups of popup-boxes: */
     124class UIPopupBoxGroup : public QObject
     125{
     126    Q_OBJECT;
    100127
     128public:
     129
     130    /* Constructor/destructor: */
     131    UIPopupBoxGroup(QObject *pParent);
     132    ~UIPopupBoxGroup();
     133
     134    /* Add popup-box: */
     135    void addPopupBox(UIPopupBox *pPopupBox);
     136
     137private slots:
     138
     139    /* Hover-change handler: */
     140    void sltHoverChanged();
     141
     142private:
     143
     144    /* Variables: */
     145    QList<UIPopupBox*> m_list;
     146};
     147
     148#endif /* !__UIPopupBoxStuff_h__ */
     149
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