VirtualBox

Changeset 32667 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 21, 2010 2:04:49 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66082
Message:

FE/Qt: Global/VM Settings cumulative refactoring (part 1).

Location:
trunk/src/VBox/Frontends/VirtualBox
Files:
4 edited
5 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/Makefile.kmk

    r32622 r32667  
    281281        src/extensions/QIWidgetValidator.h \
    282282        src/extensions/QIWizard.h \
    283         src/settings/VBoxSettingsDialog.h \
    284         src/settings/VBoxSettingsDialogSpecific.h \
     283        src/settings/UISettingsDialog.h \
     284        src/settings/UISettingsDialogSpecific.h \
    285285        src/settings/VBoxSettingsPage.h \
    286286        src/settings/VBoxSettingsSelector.h \
     
    437437        src/extensions/QIWidgetValidator.cpp \
    438438        src/extensions/QIWizard.cpp \
    439         src/settings/VBoxSettingsDialog.cpp \
    440         src/settings/VBoxSettingsDialogSpecific.cpp \
     439        src/settings/UISettingsDialog.cpp \
     440        src/settings/UISettingsDialogSpecific.cpp \
    441441        src/settings/VBoxSettingsSelector.cpp \
    442442        src/settings/global/VBoxGLSettingsGeneral.cpp \
  • trunk/src/VBox/Frontends/VirtualBox/VBoxUI.pro

    r32483 r32667  
    2828    src/VBoxUpdateDlg.ui \
    2929    src/VBoxVMLogViewer.ui \
    30     src/settings/VBoxSettingsDialog.ui \
     30    src/settings/UISettingsDialog.ui \
    3131    src/settings/vm/VBoxVMSettingsGeneral.ui \
    3232    src/settings/vm/VBoxVMSettingsSystem.ui \
  • trunk/src/VBox/Frontends/VirtualBox/src/precomp.h

    r32116 r32667  
    236236#include "VBoxRegistrationDlg.h"
    237237#include "VBoxSelectorWnd.h"
    238 #include "VBoxSettingsDialog.h"
    239 #include "VBoxSettingsDialogSpecific.h"
     238#include "UISettingsDialog.h"
     239#include "UISettingsDialogSpecific.h"
    240240#include "VBoxSettingsPage.h"
    241241#include "VBoxSettingsSelector.h"
  • trunk/src/VBox/Frontends/VirtualBox/src/selector/VBoxSelectorWnd.cpp

    r31574 r32667  
    3434#include "VBoxProblemReporter.h"
    3535#include "VBoxSelectorWnd.h"
    36 #include "VBoxSettingsDialogSpecific.h"
     36#include "UISettingsDialogSpecific.h"
    3737#include "VBoxToolBar.h"
    3838#include "VBoxVMLogViewer.h"
     
    520520    CSystemProperties props = vboxGlobal().virtualBox().GetSystemProperties();
    521521
    522     VBoxSettingsDialog *dlg = new VBoxGLSettingsDlg (this);
     522    UISettingsDialog *dlg = new UIGLSettingsDlg (this);
    523523    dlg->getFrom();
    524524
     
    603603    AssertMsgReturn (!m.isNull(), ("Machine must not be null"), (void) 0);
    604604
    605     VBoxSettingsDialog *dlg = new VBoxVMSettingsDlg (this, m, strCategory, strControl);
     605    UISettingsDialog *dlg = new UIVMSettingsDlg (this, m, strCategory, strControl);
    606606    dlg->getFrom();
    607607
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp

    r32472 r32667  
    33 *
    44 * VBox frontends: Qt GUI ("VirtualBox"):
    5  * VBoxSettingsDialog class implementation
     5 * UISettingsDialog class implementation
    66 */
    77
    88/*
    9  * Copyright (C) 2006-2008 Oracle Corporation
     9 * Copyright (C) 2006-2010 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1717 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
    1818 */
    19 #include "VBoxSettingsDialog.h"
     19
     20/* Global includes */
     21#include <QPushButton>
     22#include <QStackedWidget>
     23#include <QTimer>
     24
     25/* Local includes */
     26#include "UISettingsDialog.h"
    2027#include "VBoxWarningPane.h"
    2128#include "VBoxGlobal.h"
     
    2633#include "VBoxToolBar.h"
    2734#include "UIIconPool.h"
    28 
    2935#ifdef Q_WS_MAC
    3036# include "VBoxUtils.h"
     37# if MAC_LEOPARD_STYLE
     38#  define VBOX_GUI_WITH_TOOLBAR_SETTINGS
     39# endif /* MAC_LEOPARD_STYLE */
    3140#endif /* Q_WS_MAC */
    3241
    33 /* Qt includes */
    34 #include <QPushButton>
    35 #include <QStackedWidget>
    36 #include <QTimer>
    37 
    38 #if MAC_LEOPARD_STYLE
    39 # define VBOX_GUI_WITH_TOOLBAR_SETTINGS
    40 #endif /* MAC_LEOPARD_STYLE */
    41 
    42 VBoxSettingsDialog::VBoxSettingsDialog (QWidget *aParent /* = NULL */)
    43     : QIWithRetranslateUI <QIMainDialog> (aParent)
    44     , mPolished (false)
    45     , mValid (true)
    46     , mSilent (true)
    47     , mIconLabel (new VBoxWarningPane (this))
    48     , mWhatsThisTimer (new QTimer (this))
    49     , mWhatsThisCandidate (0)
    50 {
    51     /* Apply UI decorations */
    52     Ui::VBoxSettingsDialog::setupUi (this);
    53 
    54 //    setToolbar (new VBoxToolBar (this));
     42/* Settings Dialog Constructor: */
     43UISettingsDialog::UISettingsDialog(QWidget *pParent /* = 0 */)
     44    /* Parent class: */
     45    : QIWithRetranslateUI<QIMainDialog>(pParent)
     46    /* Protected variables: */
     47    , m_pSelector(0)
     48    , m_pStack(0)
     49    /* Common variables: */
     50    , m_fPolished(false)
     51    /* Error/Warning stuff: */
     52    , m_fValid(true)
     53    , m_fSilent(true)
     54    , m_pWarningPane(new VBoxWarningPane(this))
     55    /* Whats-this stuff: */
     56    , m_pWhatsThisTimer(new QTimer(this))
     57    , m_pWhatsThisCandidate(0)
     58{
     59    /* Apply UI decorations: */
     60    Ui::UISettingsDialog::setupUi(this);
     61
    5562#ifdef Q_WS_MAC
    56 //    VBoxGlobal::setLayoutMargin (centralWidget()->layout(), 0);
    57     /* No status bar on the mac */
    58     setSizeGripEnabled (false);
    59     setStatusBar (NULL);
     63    /* No status bar on the mac: */
     64    setSizeGripEnabled(false);
     65    setStatusBar(0);
     66#endif /* Q_WS_MAC */
     67
     68    /* Page-title font is derived from the system font: */
     69    QFont pageTitleFont = font();
     70    pageTitleFont.setBold(true);
     71    pageTitleFont.setPointSize(pageTitleFont.pointSize() + 2);
     72    m_pLbTitle->setFont(pageTitleFont);
     73
     74    /* Get main grid layout: */
     75    QGridLayout *pMainLayout = static_cast<QGridLayout*>(centralWidget()->layout());
     76#ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
     77    /* No page-title with tool-bar: */
     78    m_pLbTitle->hide();
     79    /* No whats-this with tool-bar: */
     80    m_pLbWhatsThis->hide();
     81    /* Create modern tool-bar selector: */
     82    m_pSelector = new VBoxSettingsToolBarSelector(this);
     83    static_cast<VBoxToolBar*>(m_pSelector->widget())->setMacToolbar();
     84    addToolBar(qobject_cast<QToolBar*>(m_pSelector->widget()));
     85    /* No title in this mode, we change the title of the window: */
     86    pMainLayout->setColumnMinimumWidth(0, 0);
     87    pMainLayout->setHorizontalSpacing(0);
     88#else
     89    /* Create classical tree-view selector: */
     90    m_pSelector = new VBoxSettingsTreeViewSelector(this);
     91    pMainLayout->addWidget(m_pSelector->widget(), 0, 0, 3, 1);
     92    m_pSelector->widget()->setFocus();
     93    pMainLayout->setSpacing(10);
     94#endif /* VBOX_GUI_WITH_TOOLBAR_SETTINGS */
     95
     96    /* Creating stack of pages: */
     97    m_pStack = new QStackedWidget(m_pWtStackHandler);
     98    QVBoxLayout *pStackLayout = new QVBoxLayout(m_pWtStackHandler);
     99    pStackLayout->setContentsMargins(0, 0, 0, 0);
     100    pStackLayout->addWidget(m_pStack);
     101
     102    /* Setup error & warning stuff: */
     103    m_pButtonBox->addExtraWidget(m_pWarningPane);
     104    m_errorIcon = UIIconPool::defaultIcon(UIIconPool::MessageBoxCriticalIcon, this).pixmap(16, 16);
     105    m_warningIcon = UIIconPool::defaultIcon(UIIconPool::MessageBoxWarningIcon, this).pixmap(16, 16);
     106
     107    /* Setup whatsthis stuff: */
     108    qApp->installEventFilter(this);
     109    m_pWhatsThisTimer->setSingleShot(true);
     110    connect(m_pWhatsThisTimer, SIGNAL(timeout()), this, SLOT(sltUpdateWhatsThis()));
     111    m_pLbWhatsThis->setAutoFillBackground(true);
     112    QPalette whatsThisPalette = m_pLbWhatsThis->palette();
     113    whatsThisPalette.setBrush(QPalette::Window, whatsThisPalette.brush(QPalette::Midlight));
     114    m_pLbWhatsThis->setPalette(whatsThisPalette);
     115    m_pLbWhatsThis->setFixedHeight(m_pLbWhatsThis->frameWidth() * 2 +
     116                                   m_pLbWhatsThis->margin() * 2 +
     117                                   m_pLbWhatsThis->fontMetrics().lineSpacing() * 4);
     118
     119    /* Set the default button: */
     120    m_pButtonBox->button(QDialogButtonBox::Ok)->setDefault(true);
     121
     122    /* Setup connections: */
     123    connect(m_pSelector, SIGNAL(categoryChanged(int)), this, SLOT(sltCategoryChanged(int)));
     124    connect(m_pButtonBox, SIGNAL(helpRequested()), &vboxProblem(), SLOT(showHelpHelpDialog()));
     125
     126    /* Translate UI: */
     127    retranslateUi();
     128}
     129
     130UISettingsDialog::~UISettingsDialog()
     131{
     132    /* Delete selector early! */
     133    delete m_pSelector;
     134}
     135
     136void UISettingsDialog::sltRevalidate(QIWidgetValidator *pValidator)
     137{
     138    /* Get related settings page: */
     139    VBoxSettingsPage *pSettingsPage = qobject_cast<VBoxSettingsPage*>(pValidator->widget());
     140    AssertMsg(pSettingsPage, ("Validator should corresponds a page!\n"));
     141
     142    /* Prepare empty warning & title: */
     143    QString strWarning;
     144    QString strTitle = m_pSelector->itemTextByPage(pSettingsPage);
     145
     146    /* Revalidate the page: */
     147    bool fValid = pSettingsPage->revalidate(strWarning, strTitle);
     148
     149    /* If revalidation is fully passed - recorrelate the pages: */
     150    if (fValid && strWarning.isEmpty())
     151        fValid = recorrelate(pSettingsPage, strWarning);
     152
     153    /* Compose a message: */
     154    strWarning = strWarning.isEmpty() ? QString() :
     155                 tr("On the <b>%1</b> page, %2").arg(strTitle, strWarning);
     156    pValidator->setLastWarning(strWarning);
     157    fValid ? setWarning(strWarning) : setError(strWarning);
     158
     159    /* Remember validation status: */
     160    pValidator->setOtherValid(fValid);
     161}
     162
     163void UISettingsDialog::retranslateUi()
     164{
     165    /* Translate generated stuff: */
     166    Ui::UISettingsDialog::retranslateUi(this);
     167
     168    /* Translate error/warning stuff: */
     169    m_strErrorHint = tr("Invalid settings detected");
     170    m_strWarningHint = tr("Non-optimal settings detected");
     171    if (!m_fValid)
     172        m_pWarningPane->setWarningText(m_strErrorHint);
     173    else if (!m_fSilent)
     174        m_pWarningPane->setWarningText(m_strWarningHint);
     175
     176    /* Get the list of validators: */
     177    QList<QIWidgetValidator*> validatorsList = findChildren<QIWidgetValidator*>();
     178    /* Retranslate all validators: */
     179    for (int i = 0; i < validatorsList.size(); ++i)
     180    {
     181        QIWidgetValidator *pValidator = validatorsList[i];
     182        pValidator->setCaption(m_pSelector->itemTextByPage(qobject_cast<VBoxSettingsPage*>(pValidator->widget())));
     183    }
     184    /* Revalidate all pages to retranslate the warning messages also: */
     185    for (int i = 0; i < validatorsList.size(); ++i)
     186    {
     187        QIWidgetValidator *pValidator = validatorsList[i];
     188        if (!pValidator->isValid())
     189            sltRevalidate(pValidator);
     190    }
     191}
     192
     193QString UISettingsDialog::titleExtension() const
     194{
     195#ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
     196    return m_pSelector->itemText(m_pSelector->currentId());
     197#else
     198    return tr("Settings");
    60199#endif
    61 
    62     /* Page title font is derived from the system font */
    63     QFont f = font();
    64     f.setBold (true);
    65     f.setPointSize (f.pointSize() + 2);
    66     mLbTitle->setFont (f);
    67 
    68     QGridLayout *mainLayout = static_cast <QGridLayout*> (mAllWidget->layout());
    69 #ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
    70     mLbTitle->hide();
    71     mLbWhatsThis->hide();
    72     mSelector = new VBoxSettingsToolBarSelector (this);
    73     static_cast <VBoxToolBar*> (mSelector->widget())->setMacToolbar();
    74     addToolBar (qobject_cast <QToolBar*> (mSelector->widget()));
    75     /* No title in this mode, we change the title of the window. */
    76     mainLayout->setColumnMinimumWidth (0, 0);
    77     mainLayout->setHorizontalSpacing (0);
    78 #else
    79     /* Create the classical tree view selector */
    80     mSelector = new VBoxSettingsTreeViewSelector (this);
    81     mainLayout->addWidget (mSelector->widget(), 0, 0, 3, 1);
    82     mSelector->widget()->setFocus();
    83     mainLayout->setSpacing (10);
    84 #endif
    85 
    86     /* Creating stack of pages */
    87     mStack = new QStackedWidget (mWtStackHandler);
    88     QVBoxLayout *layout = new QVBoxLayout (mWtStackHandler);
    89     layout->setContentsMargins (0, 0, 0, 0);
    90     layout->addWidget (mStack);
    91 
    92     /* Setup whatsthis stuff */
    93     setWhatsThis (tr ("<i>Select a settings category from the list on the left-hand side and move the mouse over a settings item to get more information</i>."));
    94     qApp->installEventFilter (this);
    95     mWhatsThisTimer->setSingleShot (true);
    96     connect (mWhatsThisTimer, SIGNAL (timeout()), this, SLOT (updateWhatsThis()));
    97     mLbWhatsThis->setAutoFillBackground (true);
    98     QPalette pal = mLbWhatsThis->palette();
    99     pal.setBrush (QPalette::Window, pal.brush (QPalette::Midlight));
    100     mLbWhatsThis->setPalette (pal);
    101     mLbWhatsThis->setFixedHeight (mLbWhatsThis->frameWidth() * 2 +
    102                                   mLbWhatsThis->margin() * 2 +
    103                                   mLbWhatsThis->fontMetrics().lineSpacing() * 4);
    104 
    105     /* Setup error & warning stuff */
    106     mButtonBox->addExtraWidget (mIconLabel);
    107     mErrorIcon = UIIconPool::defaultIcon(UIIconPool::MessageBoxCriticalIcon, this).pixmap (16, 16);
    108     mWarnIcon = UIIconPool::defaultIcon(UIIconPool::MessageBoxWarningIcon, this).pixmap (16, 16);
    109 
    110     /* Set the default button */
    111     mButtonBox->button (QDialogButtonBox::Ok)->setDefault (true);
    112 
    113     /* Setup connections */
    114     connect (mButtonBox, SIGNAL (accepted()), this, SLOT (accept()));
    115     connect (mButtonBox, SIGNAL (rejected()), this, SLOT (reject()));
    116     connect (mButtonBox, SIGNAL (helpRequested()), &vboxProblem(), SLOT (showHelpHelpDialog()));
    117     connect (mSelector, SIGNAL (categoryChanged (int)),
    118              this, SLOT (categoryChanged (int)));
    119 
    120     /* Applying language settings */
    121     retranslateUi();
    122 }
    123 
    124 VBoxSettingsDialog::~VBoxSettingsDialog()
    125 {
    126     delete mSelector;
    127 }
    128 
    129 void VBoxSettingsDialog::revalidate (QIWidgetValidator *aWval)
    130 {
    131     /* Perform validations for particular page */
    132     VBoxSettingsPage *page = qobject_cast <VBoxSettingsPage*> (aWval->widget());
    133     AssertMsg (page, ("Every validator should corresponds a page!\n"));
    134 
    135     QString warning;
    136     QString title = mSelector->itemTextByPage (page);
    137     bool valid = page->revalidate (warning, title);
    138     if (valid && warning.isEmpty())
    139         valid = correlate (page, warning);
    140     warning = warning.isEmpty() ? QString::null :
    141               tr ("On the <b>%1</b> page, %2").arg (title, warning);
    142     aWval->setLastWarning (warning);
    143     valid ? setWarning (warning) : setError (warning);
    144 
    145     aWval->setOtherValid (valid);
    146 }
    147 
    148 void VBoxSettingsDialog::categoryChanged (int aId)
    149 {
    150     QWidget *rootPage = mSelector->rootPage (aId);
    151 #ifndef Q_WS_MAC
    152     mLbTitle->setText (mSelector->itemText (aId));
    153     mStack->setCurrentIndex (mStack->indexOf (rootPage));
    154 #else /* Q_WS_MAC */
    155     QSize cs = size();
    156     /* First make all fully resizeable */
    157     setMinimumSize (QSize (minimumWidth(), 0));
    158     setMaximumSize (QSize (minimumWidth(), QWIDGETSIZE_MAX));
    159     for (int i = 0; i < mStack->count(); ++i)
    160         mStack->widget (i)->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Ignored);
    161     int a = mStack->indexOf (rootPage);
    162     if (a < mSizeList.count())
    163     {
    164         QSize ss = mSizeList.at (a);
    165         mStack->widget (a)->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Preferred);
    166         /* Switch to the new page first if we are shrinking */
    167         if (cs.height() > ss.height())
    168             mStack->setCurrentIndex (mStack->indexOf (rootPage));
    169         /* Do the animation */
    170         ::darwinWindowAnimateResize (this, QRect (x(), y(),
    171                                                   ss.width(), ss.height()));
    172         /* Switch to the new page last if we are zooming */
    173         if (cs.height() <= ss.height())
    174             mStack->setCurrentIndex (mStack->indexOf (rootPage));
    175         /* Make the widget fixed size */
    176         setFixedSize (ss);
    177     }
    178     ::darwinSetShowsResizeIndicator (this, false);
    179 #endif /* !Q_WS_MAC */
    180 # ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
    181     setWindowTitle (dialogTitle());
    182 # endif
    183 }
    184 
    185 void VBoxSettingsDialog::retranslateUi()
    186 {
    187     /* Translate uic generated strings */
    188     Ui::VBoxSettingsDialog::retranslateUi (this);
    189 
    190     mErrorHint = tr ("Invalid settings detected");
    191     mWarnHint = tr ("Non-optimal settings detected");
    192     if (!mValid)
    193         mIconLabel->setWarningText (mErrorHint);
    194     else if (!mSilent)
    195         mIconLabel->setWarningText (mWarnHint);
    196 
    197     QList <QIWidgetValidator*> vlist = findChildren <QIWidgetValidator*> ();
    198 
    199     /* Rename all validators to make them feat new language. */
    200     foreach (QIWidgetValidator *wval, vlist)
    201         wval->setCaption (mSelector->itemTextByPage (
    202             qobject_cast <VBoxSettingsPage*> (wval->widget())));
    203 
    204     /* Revalidate all pages to retranslate the warning messages also. */
    205     foreach (QIWidgetValidator *wval, vlist)
    206         if (!wval->isValid())
    207             revalidate (wval);
    208 }
    209 
    210 QString VBoxSettingsDialog::titleExtension() const
    211 {
    212 #ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
    213     return mSelector->itemText (mSelector->currentId());
    214 #else
    215     return tr ("Settings");
    216 #endif
    217 }
    218 
    219 void VBoxSettingsDialog::setError (const QString &aError)
    220 {
    221     mErrorString = aError.isEmpty() ? QString::null :
    222                    QString ("<font color=red>%1</font>").arg (aError);
    223 
    224     /* Not touching QILabel until dialog is polished otherwise
    225      * it can change its size to undefined */
    226     if (!mPolished)
    227         return;
    228 
    229     if (!mErrorString.isEmpty())
    230         mLbWhatsThis->setText (mErrorString);
    231     else
    232         updateWhatsThis (true);
    233 }
    234 
    235 void VBoxSettingsDialog::setWarning (const QString &aWarning)
    236 {
    237     mWarnString = aWarning.isEmpty() ? QString::null :
    238                   QString ("<font color=#ff5400>%1</font>").arg (aWarning);
    239 
    240     /* Not touching QILabel until dialog is polished otherwise
    241      * it can change its size to undefined */
    242     if (!mPolished)
    243         return;
    244 
    245     if (!mWarnString.isEmpty())
    246         mLbWhatsThis->setText (mWarnString);
    247     else
    248         updateWhatsThis (true);
    249 }
    250 
    251 void VBoxSettingsDialog::addItem (const QString &aBigIcon,
    252                                   const QString &aBigIconDisabled,
    253                                   const QString &aSmallIcon,
    254                                   const QString &aSmallIconDisabled,
    255                                   int aId,
    256                                   const QString &aLink,
    257                                   VBoxSettingsPage* aPrefPage /* = NULL*/,
    258                                   int aParentId /* = -1 */)
    259 {
    260     QWidget *page = mSelector->addItem (aBigIcon, aBigIconDisabled, aSmallIcon, aSmallIconDisabled,
    261                                         aId, aLink,
    262                                         aPrefPage, aParentId);
    263     if (page)
    264         mStack->addWidget (page);
    265     if (aPrefPage)
    266         attachValidator (aPrefPage);
    267 }
    268 
    269 bool VBoxSettingsDialog::correlate (QWidget*, QString&)
     200}
     201
     202void UISettingsDialog::setError(const QString &strError)
     203{
     204    m_strErrorString = strError.isEmpty() ? QString() :
     205                       QString("<font color=red>%1</font>").arg(strError);
     206
     207    /* Do not touching QILabel until dialog is polished
     208     * otherwise it can change its size to undefined: */
     209    if (m_fPolished)
     210    {
     211        if (!m_strErrorString.isEmpty())
     212            m_pLbWhatsThis->setText(m_strErrorString);
     213        else
     214            sltUpdateWhatsThis(true /* got focus? */);
     215    }
     216}
     217
     218void UISettingsDialog::setWarning(const QString &strWarning)
     219{
     220    m_strWarningString = strWarning.isEmpty() ? QString() :
     221                         QString("<font color=#ff5400>%1</font>").arg(strWarning);
     222
     223    /* Do not touching QILabel until dialog is polished
     224     * otherwise it can change its size to undefined: */
     225    if (m_fPolished)
     226    {
     227        if (!m_strWarningString.isEmpty())
     228            m_pLbWhatsThis->setText(m_strWarningString);
     229        else
     230            sltUpdateWhatsThis(true /* got focus? */);
     231    }
     232}
     233
     234void UISettingsDialog::addItem(const QString &strBigIcon,
     235                               const QString &strBigIconDisabled,
     236                               const QString &strSmallIcon,
     237                               const QString &strSmallIconDisabled,
     238                               int cId,
     239                               const QString &strLink,
     240                               VBoxSettingsPage *pSettingsPage /* = 0 */,
     241                               int iParentId /* = -1 */)
     242{
     243    QWidget *pPage = m_pSelector->addItem(strBigIcon, strBigIconDisabled,
     244                                          strSmallIcon, strSmallIconDisabled,
     245                                          cId, strLink, pSettingsPage, iParentId);
     246    if (pPage)
     247        m_pStack->addWidget(pPage);
     248    if (pSettingsPage)
     249        assignValidator(pSettingsPage);
     250}
     251
     252bool UISettingsDialog::recorrelate(QWidget * /* pPage */, QString & /* strWarning */)
    270253{
    271254    return true;
    272255}
    273256
    274 void VBoxSettingsDialog::enableOk (const QIWidgetValidator*)
    275 {
    276     QList <QIWidgetValidator*> vlist (findChildren <QIWidgetValidator*> ());
    277 
    278     /* Detect ERROR presence */
    279     {
    280         setError (QString::null);
    281         QString wvalError;
    282         bool newValid = true;
    283         foreach (QIWidgetValidator *wval, vlist)
     257void UISettingsDialog::sltHandleValidityChanged(const QIWidgetValidator * /* pValidator */)
     258{
     259    /* Get validators list: */
     260    QList<QIWidgetValidator*> validatorsList(findChildren<QIWidgetValidator*>());
     261
     262    /* Detect ERROR presence: */
     263    {
     264        setError(QString());
     265        QString strError;
     266        bool fNewValid = true;
     267        for (int i = 0; i < validatorsList.size(); ++i)
    284268        {
    285             newValid = wval->isValid();
    286             if (!newValid)
     269            QIWidgetValidator *pValidator = validatorsList[i];
     270            fNewValid = pValidator->isValid();
     271            if (!fNewValid)
    287272            {
    288                 wvalError = wval->warningText();
    289                 if (wvalError.isNull())
    290                     wvalError = wval->lastWarning();
     273                strError = pValidator->warningText();
     274                if (strError.isNull())
     275                    strError = pValidator->lastWarning();
    291276                break;
    292277            }
     
    294279
    295280        /* Try to set the generic error message when invalid
    296          * but no specific message is provided */
    297         if (mErrorString.isNull() && !wvalError.isNull())
    298             setError (wvalError);
    299 
    300         mValid = newValid;
    301         mIconLabel->setWarningPixmap (mErrorIcon);
    302         mIconLabel->setWarningText (mErrorHint);
     281         * but no specific message is provided: */
     282        if (m_strErrorString.isNull() && !strError.isNull())
     283            setError(strError);
     284
     285        m_fValid = fNewValid;
     286        m_pWarningPane->setWarningPixmap(m_errorIcon);
     287        m_pWarningPane->setWarningText(m_strErrorHint);
    303288#ifdef Q_WS_MAC
    304         mIconLabel->setToolTip (mErrorString);
     289        m_pWarningPane->setToolTip(m_strErrorString);
    305290#endif /* Q_WS_MAC */
    306         mIconLabel->setVisible (!mValid);
    307         mButtonBox->button (QDialogButtonBox::Ok)->setEnabled (mValid);
    308 
    309         if (!mValid) return;
    310     }
    311 
    312     /* Detect WARNING presence */
    313     {
    314         setWarning (QString::null);
    315         QString wvalWarning;
    316         bool newSilent = true;
    317         foreach (QIWidgetValidator *wval, vlist)
     291        m_pWarningPane->setVisible(!m_fValid);
     292        m_pButtonBox->button(QDialogButtonBox::Ok)->setEnabled(m_fValid);
     293
     294        if (!m_fValid)
     295            return;
     296    }
     297
     298    /* Detect WARNING presence: */
     299    {
     300        setWarning(QString());
     301        QString strWarning;
     302        bool fNewSilent = true;
     303        for (int i = 0; i < validatorsList.size(); ++i)
    318304        {
    319             if (!wval->warningText().isNull() ||
    320                 !wval->lastWarning().isNull())
     305            QIWidgetValidator *pValidator = validatorsList[i];
     306            if (!pValidator->warningText().isNull() || !pValidator->lastWarning().isNull())
    321307            {
    322                 newSilent = false;
    323                 wvalWarning = wval->warningText();
    324                 if (wvalWarning.isNull())
    325                     wvalWarning = wval->lastWarning();
     308                fNewSilent = false;
     309                strWarning = pValidator->warningText();
     310                if (strWarning.isNull())
     311                    strWarning = pValidator->lastWarning();
    326312                break;
    327313            }
     
    329315
    330316        /* Try to set the generic error message when invalid
    331          * but no specific message is provided */
    332         if (mWarnString.isNull() && !wvalWarning.isNull())
    333             setWarning (wvalWarning);
    334 
    335         mSilent = newSilent;
    336         mIconLabel->setWarningPixmap (mWarnIcon);
    337         mIconLabel->setWarningText (mWarnHint);
     317         * but no specific message is provided: */
     318        if (m_strWarningString.isNull() && !strWarning.isNull())
     319            setWarning(strWarning);
     320
     321        m_fSilent = fNewSilent;
     322        m_pWarningPane->setWarningPixmap(m_warningIcon);
     323        m_pWarningPane->setWarningText(m_strWarningHint);
    338324#ifdef Q_WS_MAC
    339         mIconLabel->setToolTip (mWarnString);
     325        m_pWarningPane->setToolTip(m_strWarningString);
    340326#endif /* Q_WS_MAC */
    341         mIconLabel->setVisible (!mSilent);
    342     }
    343 }
    344 
    345 void VBoxSettingsDialog::updateWhatsThis (bool aGotFocus /* = false */)
    346 {
    347     QString text;
    348 
    349     QWidget *widget = 0;
    350     if (!aGotFocus)
    351     {
    352         if (mWhatsThisCandidate && mWhatsThisCandidate != this)
    353             widget = mWhatsThisCandidate;
    354     }
     327        m_pWarningPane->setVisible(!m_fSilent);
     328    }
     329}
     330
     331void UISettingsDialog::sltUpdateWhatsThis(bool fGotFocus /* = false */)
     332{
     333    QString strWhatsThisText;
     334    QWidget *pWhatsThisWidget = 0;
     335
     336    /* If focus had NOT changed: */
     337    if (!fGotFocus)
     338    {
     339        /* We will use the recommended candidate: */
     340        if (m_pWhatsThisCandidate && m_pWhatsThisCandidate != this)
     341            pWhatsThisWidget = m_pWhatsThisCandidate;
     342    }
     343    /* If focus had changed: */
    355344    else
    356345    {
    357         widget = QApplication::focusWidget();
    358     }
    359 
    360     /* If the given widget lacks the whats'this text, look at its parent */
    361     while (widget && widget != this)
    362     {
    363         text = widget->whatsThis();
    364         if (!text.isEmpty())
     346        /* We will use the focused widget instead: */
     347        pWhatsThisWidget = QApplication::focusWidget();
     348    }
     349
     350    /* If the given widget lacks the whats-this text, look at its parent: */
     351    while (pWhatsThisWidget && pWhatsThisWidget != this)
     352    {
     353        strWhatsThisText = pWhatsThisWidget->whatsThis();
     354        if (!strWhatsThisText.isEmpty())
    365355            break;
    366         widget = widget->parentWidget();
     356        pWhatsThisWidget = pWhatsThisWidget->parentWidget();
    367357    }
    368358
    369359#ifndef Q_WS_MAC
    370     if (text.isEmpty() && !mErrorString.isEmpty())
    371         text = mErrorString;
    372     else if (text.isEmpty() && !mWarnString.isEmpty())
    373         text = mWarnString;
    374     if (text.isEmpty())
    375         text = whatsThis();
    376 
    377     mLbWhatsThis->setText (text);
    378 #else /* Q_WS_MAC */
    379     if (widget && !text.isEmpty())
    380         widget->setToolTip (QString("<qt>%1</qt>").arg(text));
    381 #endif /* Q_WS_MAC */
    382 }
    383 
    384 void VBoxSettingsDialog::whatsThisCandidateDestroyed (QObject *aObj /* = 0 */)
    385 {
    386     Assert (mWhatsThisCandidate == aObj);
    387 
    388     if (mWhatsThisCandidate == aObj)
    389         mWhatsThisCandidate = 0;
    390 }
    391 
    392 bool VBoxSettingsDialog::eventFilter (QObject *aObject, QEvent *aEvent)
    393 {
    394     if (!aObject->isWidgetType())
    395         return QIMainDialog::eventFilter (aObject, aEvent);
    396 
    397     QWidget *widget = static_cast <QWidget*> (aObject);
    398     if (widget->window() != this)
    399         return QIMainDialog::eventFilter (aObject, aEvent);
    400 
    401     switch (aEvent->type())
    402     {
     360    if (strWhatsThisText.isEmpty() && !m_strErrorString.isEmpty())
     361        strWhatsThisText = m_strErrorString;
     362    else if (strWhatsThisText.isEmpty() && !m_strWarningString.isEmpty())
     363        strWhatsThisText = m_strWarningString;
     364    if (strWhatsThisText.isEmpty())
     365        strWhatsThisText = whatsThis();
     366    m_pLbWhatsThis->setText(strWhatsThisText);
     367#else
     368    if (pWhatsThisWidget && !strWhatsThisText.isEmpty())
     369        pWhatsThisWidget->setToolTip(QString("<qt>%1</qt>").arg(strWhatsThisText));
     370#endif
     371}
     372
     373void UISettingsDialog::sltCategoryChanged(int cId)
     374{
     375    QWidget *pRootPage = m_pSelector->rootPage(cId);
     376#ifdef Q_WS_MAC
     377    QSize cs = size();
     378    /* First make all fully resizeable: */
     379    setMinimumSize(QSize(minimumWidth(), 0));
     380    setMaximumSize(QSize(minimumWidth(), QWIDGETSIZE_MAX));
     381    for (int i = 0; i < m_pStack->count(); ++i)
     382        m_pStack->widget(i)->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
     383    int a = m_pStack->indexOf(pRootPage);
     384    if (a < m_sizeList.count())
     385    {
     386        QSize ss = m_sizeList.at(a);
     387        m_pStack->widget(a)->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
     388        /* Switch to the new page first if we are shrinking: */
     389        if (cs.height() > ss.height())
     390            m_pStack->setCurrentIndex(m_pStack->indexOf(pRootPage));
     391        /* Do the animation: */
     392        ::darwinWindowAnimateResize(this, QRect (x(), y(), ss.width(), ss.height()));
     393        /* Switch to the new page last if we are zooming: */
     394        if (cs.height() <= ss.height())
     395            m_pStack->setCurrentIndex(m_pStack->indexOf(pRootPage));
     396        /* Make the widget fixed size: */
     397        setFixedSize(ss);
     398    }
     399    ::darwinSetShowsResizeIndicator(this, false);
     400#else
     401    m_pLbTitle->setText(m_pSelector->itemText(cId));
     402    m_pStack->setCurrentIndex(m_pStack->indexOf(pRootPage));
     403#endif
     404#ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
     405    setWindowTitle(title());
     406#endif /* VBOX_GUI_WITH_TOOLBAR_SETTINGS */
     407}
     408
     409bool UISettingsDialog::eventFilter(QObject *pObject, QEvent *pEvent)
     410{
     411    /* Ignore objects which are NOT widgets: */
     412    if (!pObject->isWidgetType())
     413        return QIMainDialog::eventFilter(pObject, pEvent);
     414
     415    /* Ignore widgets which window is NOT settings dialog: */
     416    QWidget *pWidget = static_cast<QWidget*>(pObject);
     417    if (pWidget->window() != this)
     418        return QIMainDialog::eventFilter(pObject, pEvent);
     419
     420    /* Process different event-types: */
     421    switch (pEvent->type())
     422    {
     423        /* Process enter/leave events to remember whats-this candidates: */
    403424        case QEvent::Enter:
    404425        case QEvent::Leave:
    405426        {
    406             if (aEvent->type() == QEvent::Enter)
    407             {
    408                 /* What if Qt sends Enter w/o Leave... */
    409                 if (mWhatsThisCandidate)
    410                     disconnect (mWhatsThisCandidate, SIGNAL (destroyed (QObject *)),
    411                                 this, SLOT (whatsThisCandidateDestroyed (QObject *)));
    412 
    413                 mWhatsThisCandidate = widget;
    414                 /* Make sure we don't reference a deleted object after the
    415                  * timer is shot */
    416                 connect (mWhatsThisCandidate, SIGNAL (destroyed (QObject *)),
    417                          this, SLOT (whatsThisCandidateDestroyed (QObject *)));
    418             }
     427            if (pEvent->type() == QEvent::Enter)
     428                m_pWhatsThisCandidate = pWidget;
    419429            else
    420             {
    421                 /* Cleanup */
    422                 if (mWhatsThisCandidate)
    423                     disconnect (mWhatsThisCandidate, SIGNAL (destroyed (QObject *)),
    424                                 this, SLOT (whatsThisCandidateDestroyed (QObject *)));
    425                 mWhatsThisCandidate = NULL;
    426             }
    427 
    428             mWhatsThisTimer->start (100);
     430                m_pWhatsThisCandidate = 0;
     431
     432            m_pWhatsThisTimer->start(100);
    429433            break;
    430434        }
     435        /* Process focus-in event to update whats-this pane: */
    431436        case QEvent::FocusIn:
    432437        {
    433             updateWhatsThis (true /* aGotFocus */);
     438            sltUpdateWhatsThis(true /* got focus? */);
    434439            break;
    435440        }
     
    438443    }
    439444
    440     return QIMainDialog::eventFilter (aObject, aEvent);
    441 }
    442 
    443 void VBoxSettingsDialog::showEvent (QShowEvent *aEvent)
    444 {
    445     QIMainDialog::showEvent (aEvent);
     445    /* Base-class proessing: */
     446    return QIMainDialog::eventFilter(pObject, pEvent);
     447}
     448
     449void UISettingsDialog::showEvent(QShowEvent *pEvent)
     450{
     451    /* Base-class processing: */
     452    QIMainDialog::showEvent(pEvent);
     453
    446454    /* One may think that QWidget::polish() is the right place to do things
    447455     * below, but apparently, by the time when QWidget::polish() is called,
     
    449457     * size hint is not properly calculated. Since this is sometimes necessary,
    450458     * we provide our own "polish" implementation. */
    451 
    452     if (mPolished)
     459    if (m_fPolished)
    453460        return;
    454461
    455     mPolished = true;
    456 
    457     int minWidth = mSelector->minWidth();
     462    m_fPolished = true;
     463
     464    int iMinWidth = m_pSelector->minWidth();
    458465#ifdef Q_WS_MAC
    459     /* Remove all title bar buttons (Buggy Qt) */
    460     ::darwinSetHidesAllTitleButtons (this);
    461 
    462     /* Set all size policies to ignored */
    463     for (int i = 0; i < mStack->count(); ++i)
    464         mStack->widget (i)->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Ignored);
    465     /* Activate every single page to get the optimal size */
    466     for (int i = mStack->count() - 1; i >= 0; --i)
    467     {
    468         mStack->widget (i)->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Preferred);
    469         mStack->setCurrentIndex (i);
     466    /* Remove all title bar buttons (Buggy Qt): */
     467    ::darwinSetHidesAllTitleButtons(this);
     468
     469    /* Set all size policies to ignored: */
     470    for (int i = 0; i < m_pStack->count(); ++i)
     471        m_pStack->widget(i)->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
     472    /* Activate every single page to get the optimal size: */
     473    for (int i = m_pStack->count() - 1; i >= 0; --i)
     474    {
     475        m_pStack->widget(i)->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
     476        m_pStack->setCurrentIndex(i);
    470477        layout()->activate();
    471478        QSize s = minimumSize();
    472         if (minWidth > s.width())
    473             s.setWidth (minWidth);
    474         mSizeList.insert (0, s);
    475         mStack->widget (i)->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Ignored);
    476     }
    477 
    478     categoryChanged (mSelector->currentId());
     479        if (iMinWidth > s.width())
     480            s.setWidth(iMinWidth);
     481        m_sizeList.insert(0, s);
     482        m_pStack->widget(i)->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
     483    }
     484
     485    sltCategoryChanged(m_pSelector->currentId());
    479486#else /* Q_WS_MAC */
    480     /* Resize to the minimum possible size */
     487    /* Resize to the minimum possible size: */
    481488    QSize s = minimumSize();
    482     if (minWidth > s.width())
    483         s.setWidth (minWidth);
    484     resize (s);
     489    if (iMinWidth > s.width())
     490        s.setWidth(iMinWidth);
     491    resize(s);
    485492#endif /* Q_WS_MAC */
    486 
    487     VBoxGlobal::centerWidget (this, parentWidget());
    488 }
    489 
    490 VBoxSettingsPage* VBoxSettingsDialog::attachValidator (VBoxSettingsPage *aPage)
    491 {
    492     QIWidgetValidator *wval = new QIWidgetValidator (mSelector->itemTextByPage (aPage),
    493                                                      aPage, this);
    494     connect (wval, SIGNAL (validityChanged (const QIWidgetValidator*)),
    495              this, SLOT (enableOk (const QIWidgetValidator*)));
    496     connect (wval, SIGNAL (isValidRequested (QIWidgetValidator*)),
    497              this, SLOT (revalidate (QIWidgetValidator*)));
    498 
    499     aPage->setValidator (wval);
    500     aPage->setOrderAfter (mSelector->widget());
    501 
    502     return aPage;
    503 }
    504 
     493}
     494
     495void UISettingsDialog::assignValidator(VBoxSettingsPage *pPage)
     496{
     497    QIWidgetValidator *pValidator = new QIWidgetValidator(m_pSelector->itemTextByPage(pPage), pPage, this);
     498    connect(pValidator, SIGNAL(validityChanged(const QIWidgetValidator*)), this, SLOT(sltHandleValidityChanged(const QIWidgetValidator*)));
     499    connect(pValidator, SIGNAL(isValidRequested(QIWidgetValidator*)), this, SLOT(sltRevalidate(QIWidgetValidator*)));
     500    pPage->setValidator(pValidator);
     501    pPage->setOrderAfter(m_pSelector->widget());
     502}
     503
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h

    r32472 r32667  
    22 *
    33 * VBox frontends: Qt4 GUI ("VirtualBox"):
    4  * VBoxSettingsDialog class declaration
     4 * UISettingsDialog class declaration
    55 */
    66
    77/*
    8  * Copyright (C) 2006-2008 Oracle Corporation
     8 * Copyright (C) 2006-2010 Oracle Corporation
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1717 */
    1818
    19 #ifndef __VBoxSettingsDialog_h__
    20 #define __VBoxSettingsDialog_h__
     19#ifndef __UISettingsDialog_h__
     20#define __UISettingsDialog_h__
    2121
    22 /* VBox includes */
     22/* Local includes */
    2323#include "QIMainDialog.h"
    2424#include "QIWithRetranslateUI.h"
    25 #include "VBoxSettingsDialog.gen.h"
     25#include "UISettingsDialog.gen.h"
    2626
    27 /* Qt forwards */
     27/* Forward declarations */
    2828class QIWidgetValidator;
    2929class QStackedWidget;
    3030class QTimer;
    31 
    32 /* VBox forwards*/
    3331class VBoxWarningPane;
    3432class VBoxSettingsSelector;
    3533class VBoxSettingsPage;
    3634
    37 /*
    38  * Base dialog class for both Global & VM settings which
    39  * encapsulates most of their similar functionalities.
    40  */
    41 class VBoxSettingsDialog : public QIWithRetranslateUI<QIMainDialog>,
    42                            public Ui::VBoxSettingsDialog
     35/* Base dialog class for both Global & VM settings which encapsulates most of their similar functionalities */
     36class UISettingsDialog : public QIWithRetranslateUI<QIMainDialog>, public Ui::UISettingsDialog
    4337{
    4438    Q_OBJECT;
     
    4640public:
    4741
    48     VBoxSettingsDialog (QWidget *aParent = NULL);
    49     ~VBoxSettingsDialog();
     42    /* Settings Dialog Constructor/Destructor: */
     43    UISettingsDialog(QWidget *pParent = 0);
     44   ~UISettingsDialog();
    5045
     46    /* Save/Load interface: */
    5147    virtual void getFrom() = 0;
    5248    virtual void putBackTo() = 0;
     
    5450protected slots:
    5551
    56     virtual void revalidate (QIWidgetValidator *aWval);
    57     void categoryChanged (int aId);
     52    /* Validation handler: */
     53    virtual void sltRevalidate(QIWidgetValidator *pValidator);
    5854
    5955protected:
    6056
     57    /* UI translator: */
    6158    virtual void retranslateUi();
    6259
    63     virtual QString dialogTitle() const = 0;
    64     QString titleExtension() const;
     60    /* Dialog title: */
     61    virtual QString title() const = 0;
     62    /* Dialog title extension: */
     63    virtual QString titleExtension() const;
    6564
    66     void setError (const QString &aError);
    67     void setWarning (const QString &aWarning);
     65    /* Setters for error/warning: */
     66    void setError(const QString &strError);
     67    void setWarning(const QString &strWarning);
    6868
    69     void addItem (const QString &aBigIcon, const QString &aBigIconDisabled,
    70                   const QString &aSmallIcon, const QString &aSmallIconDisabled,
    71                   int aId, const QString &aLink,
    72                   VBoxSettingsPage* aPrefPage = NULL, int aParentId = -1);
     69    /* Add settings page: */
     70    void addItem(const QString &strBigIcon, const QString &strBigIconDisabled,
     71                 const QString &strSmallIcon, const QString &strSmallIconDisabled,
     72                 int cId, const QString &strLink,
     73                 VBoxSettingsPage* pSettingsPage = 0, int iParentId = -1);
    7374
    74     virtual bool correlate (QWidget *aPage, QString &aWarning);
     75    /* Correlation handler: */
     76    virtual bool recorrelate(QWidget *pPage, QString &strWarning);
    7577
    76     VBoxSettingsSelector *mSelector;
    77     QStackedWidget *mStack;
     78    /* Protected variables: */
     79    VBoxSettingsSelector *m_pSelector;
     80    QStackedWidget *m_pStack;
    7881
    7982private slots:
    8083
    81     void enableOk (const QIWidgetValidator *aWval);
    82     void updateWhatsThis (bool aGotFocus = false);
    83     void whatsThisCandidateDestroyed (QObject *aObj = 0);
     84    /* Slot to handle validity-changes: */
     85    void sltHandleValidityChanged(const QIWidgetValidator *pValidator);
     86
     87    /* Slot to update whats-this: */
     88    void sltUpdateWhatsThis(bool fGotFocus = false);
     89
     90    /* Category-change slot: */
     91    void sltCategoryChanged(int cId);
    8492
    8593private:
    8694
    87     bool eventFilter (QObject *aObject, QEvent *aEvent);
    88     void showEvent (QShowEvent *aEvent);
     95    /* Event-handlers: */
     96    bool eventFilter(QObject *pObject, QEvent *pEvent);
     97    void showEvent(QShowEvent *pEvent);
    8998
    90     VBoxSettingsPage* attachValidator (VBoxSettingsPage *aPage);
     99    void assignValidator(VBoxSettingsPage *pPage);
    91100
    92     /* Flags */
    93     bool mPolished;
     101    /* Global Flags: */
     102    bool m_fPolished;
    94103
    95     /* Error & Warning stuff */
    96     bool mValid;
    97     bool mSilent;
    98     QString mErrorHint;
    99     QString mWarnHint;
    100     QString mErrorString;
    101     QString mWarnString;
    102     QPixmap mErrorIcon;
    103     QPixmap mWarnIcon;
    104     VBoxWarningPane *mIconLabel;
     104    /* Error & Warning stuff: */
     105    bool m_fValid;
     106    bool m_fSilent;
     107    QString m_strErrorHint;
     108    QString m_strWarningHint;
     109    QString m_strErrorString;
     110    QString m_strWarningString;
     111    QPixmap m_errorIcon;
     112    QPixmap m_warningIcon;
     113    VBoxWarningPane *m_pWarningPane;
    105114
    106     /* WhatsThis Stuff */
    107     QTimer *mWhatsThisTimer;
    108     QWidget *mWhatsThisCandidate;
     115    /* Whats-This stuff: */
     116    QTimer *m_pWhatsThisTimer;
     117    QPointer<QWidget> m_pWhatsThisCandidate;
    109118
    110119#ifdef Q_WS_MAC
    111     QList<QSize> mSizeList;
     120    QList<QSize> m_sizeList;
    112121#endif /* Q_WS_MAC */
    113122};
    114123
    115 #endif // __VBoxSettingsDialog_h__
     124#endif // __UISettingsDialog_h__
    116125
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.ui

    r32472 r32667  
    33 VBox frontends: Qt4 GUI ("VirtualBox"):
    44
    5      Copyright (C) 2008 Oracle Corporation
     5     Copyright (C) 2008-2010 Oracle Corporation
    66
    77     This file is part of VirtualBox Open Source Edition (OSE), as
     
    1313     hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
    1414 </comment>
    15  <class>VBoxSettingsDialog</class>
    16  <widget class="QMainWindow" name="VBoxSettingsDialog" >
     15 <class>UISettingsDialog</class>
     16 <widget class="QMainWindow" name="UISettingsDialog" >
    1717  <property name="geometry" >
    1818   <rect>
    1919    <x>0</x>
    2020    <y>0</y>
    21     <width>526</width>
    22     <height>424</height>
     21    <width>550</width>
     22    <height>450</height>
    2323   </rect>
    2424  </property>
     25  <property name="whatsThis" >
     26   <string>&lt;i>Select a settings category from the list on the left-hand side and move the mouse over a settings item to get more information.&lt;/i></string>
     27  </property>
    2528  <widget class="QWidget" name="centralwidget" >
    26    <layout class="QHBoxLayout" >
    27     <item>
    28      <widget class="QWidget" native="1" name="mAllWidget" >
    29       <layout class="QGridLayout" >
    30        <property name="leftMargin" >
    31         <number>0</number>
    32        </property>
    33        <property name="topMargin" >
    34         <number>0</number>
    35        </property>
    36        <property name="rightMargin" >
    37         <number>0</number>
    38        </property>
    39        <property name="bottomMargin" >
    40         <number>0</number>
    41        </property>
    42        <item row="0" column="1" >
    43         <widget class="QLabel" name="mLbTitle" >
    44          <property name="sizePolicy" >
    45           <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
    46            <horstretch>0</horstretch>
    47            <verstretch>0</verstretch>
    48           </sizepolicy>
    49          </property>
    50          <property name="palette" >
    51           <palette>
    52            <active>
    53             <colorrole role="Window" >
    54              <brush brushstyle="SolidPattern" >
    55               <color alpha="255" >
    56                <red>255</red>
    57                <green>255</green>
    58                <blue>255</blue>
    59               </color>
    60              </brush>
    61             </colorrole>
    62            </active>
    63            <inactive>
    64             <colorrole role="Window" >
    65              <brush brushstyle="SolidPattern" >
    66               <color alpha="255" >
    67                <red>255</red>
    68                <green>255</green>
    69                <blue>255</blue>
    70               </color>
    71              </brush>
    72             </colorrole>
    73            </inactive>
    74            <disabled>
    75             <colorrole role="Window" >
    76              <brush brushstyle="SolidPattern" >
    77               <color alpha="255" >
    78                <red>255</red>
    79                <green>255</green>
    80                <blue>255</blue>
    81               </color>
    82              </brush>
    83             </colorrole>
    84            </disabled>
    85           </palette>
    86          </property>
    87          <property name="font" >
    88           <font>
    89            <family>Sans Serif</family>
    90            <pointsize>11</pointsize>
    91            <weight>75</weight>
    92            <bold>true</bold>
    93           </font>
    94          </property>
    95          <property name="autoFillBackground" >
    96           <bool>true</bool>
    97          </property>
    98          <property name="frameShape" >
    99           <enum>QFrame::Box</enum>
    100          </property>
    101          <property name="frameShadow" >
    102           <enum>QFrame::Sunken</enum>
    103          </property>
    104          <property name="text" >
    105           <string/>
    106          </property>
    107          <property name="margin" >
    108           <number>7</number>
    109          </property>
    110         </widget>
    111        </item>
    112        <item row="1" column="1" >
    113         <widget class="QWidget" native="1" name="mWtStackHandler" >
    114          <property name="sizePolicy" >
    115           <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
    116            <horstretch>0</horstretch>
    117            <verstretch>0</verstretch>
    118           </sizepolicy>
    119          </property>
    120         </widget>
    121        </item>
    122        <item row="2" column="1" >
    123         <widget class="QILabel" name="mLbWhatsThis" >
    124          <property name="frameShape" >
    125           <enum>QFrame::Box</enum>
    126          </property>
    127          <property name="frameShadow" >
    128           <enum>QFrame::Sunken</enum>
    129          </property>
    130          <property name="alignment" >
    131           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
    132          </property>
    133          <property name="wordWrap" >
    134           <bool>true</bool>
    135          </property>
    136          <property name="margin" >
    137           <number>7</number>
    138          </property>
    139         </widget>
    140        </item>
    141        <item row="3" column="0" colspan="2" >
    142         <widget class="QIDialogButtonBox" name="mButtonBox" >
    143          <property name="standardButtons" >
    144           <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
    145          </property>
    146         </widget>
    147        </item>
    148       </layout>
     29   <layout class="QGridLayout" >
     30    <item row="0" column="1" >
     31     <widget class="QLabel" name="m_pLbTitle" >
     32      <property name="sizePolicy" >
     33       <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
     34        <horstretch>0</horstretch>
     35        <verstretch>0</verstretch>
     36       </sizepolicy>
     37      </property>
     38      <property name="palette" >
     39       <palette>
     40        <active>
     41         <colorrole role="Window" >
     42          <brush brushstyle="SolidPattern" >
     43           <color alpha="255" >
     44            <red>255</red>
     45            <green>255</green>
     46            <blue>255</blue>
     47           </color>
     48          </brush>
     49         </colorrole>
     50        </active>
     51        <inactive>
     52         <colorrole role="Window" >
     53          <brush brushstyle="SolidPattern" >
     54           <color alpha="255" >
     55            <red>255</red>
     56            <green>255</green>
     57            <blue>255</blue>
     58           </color>
     59          </brush>
     60         </colorrole>
     61        </inactive>
     62        <disabled>
     63         <colorrole role="Window" >
     64          <brush brushstyle="SolidPattern" >
     65           <color alpha="255" >
     66            <red>255</red>
     67            <green>255</green>
     68            <blue>255</blue>
     69           </color>
     70          </brush>
     71         </colorrole>
     72        </disabled>
     73       </palette>
     74      </property>
     75      <property name="font" >
     76       <font>
     77        <family>Sans Serif</family>
     78        <pointsize>11</pointsize>
     79        <weight>75</weight>
     80        <bold>true</bold>
     81       </font>
     82      </property>
     83      <property name="autoFillBackground" >
     84       <bool>true</bool>
     85      </property>
     86      <property name="frameShape" >
     87       <enum>QFrame::Box</enum>
     88      </property>
     89      <property name="frameShadow" >
     90       <enum>QFrame::Sunken</enum>
     91      </property>
     92      <property name="text" >
     93       <string/>
     94      </property>
     95      <property name="margin" >
     96       <number>7</number>
     97      </property>
     98     </widget>
     99    </item>
     100    <item row="1" column="1" >
     101     <widget class="QWidget" native="1" name="m_pWtStackHandler" >
     102      <property name="sizePolicy" >
     103       <sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
     104        <horstretch>0</horstretch>
     105        <verstretch>0</verstretch>
     106       </sizepolicy>
     107      </property>
     108     </widget>
     109    </item>
     110    <item row="2" column="1" >
     111     <widget class="QILabel" name="m_pLbWhatsThis" >
     112      <property name="frameShape" >
     113       <enum>QFrame::Box</enum>
     114      </property>
     115      <property name="frameShadow" >
     116       <enum>QFrame::Sunken</enum>
     117      </property>
     118      <property name="alignment" >
     119       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
     120      </property>
     121      <property name="wordWrap" >
     122       <bool>true</bool>
     123      </property>
     124      <property name="margin" >
     125       <number>7</number>
     126      </property>
     127     </widget>
     128    </item>
     129    <item row="3" column="0" colspan="2" >
     130     <widget class="QIDialogButtonBox" name="m_pButtonBox" >
     131      <property name="standardButtons" >
     132       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
     133      </property>
    149134     </widget>
    150135    </item>
     
    165150 </customwidgets>
    166151 <resources/>
    167  <connections/>
     152 <connections>
     153  <connection>
     154   <sender>m_pButtonBox</sender>
     155   <signal>rejected()</signal>
     156   <receiver>UISettingsDialog</receiver>
     157   <slot>reject()</slot>
     158   <hints>
     159    <hint type="sourcelabel" >
     160     <x>200</x>
     161     <y>300</y>
     162    </hint>
     163    <hint type="destinationlabel" >
     164     <x>200</x>
     165     <y>200</y>
     166    </hint>
     167   </hints>
     168  </connection>
     169  <connection>
     170   <sender>m_pButtonBox</sender>
     171   <signal>accepted()</signal>
     172   <receiver>UISettingsDialog</receiver>
     173   <slot>accept()</slot>
     174   <hints>
     175    <hint type="sourcelabel" >
     176     <x>300</x>
     177     <y>300</y>
     178    </hint>
     179    <hint type="destinationlabel" >
     180     <x>300</x>
     181     <y>200</y>
     182    </hint>
     183   </hints>
     184  </connection>
     185 </connections>
    168186</ui>
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp

    r32472 r32667  
    33 *
    44 * VBox frontends: Qt GUI ("VirtualBox"):
    5  * VBoxSettingsDialog class implementation
     5 * UISettingsDialog class implementation
    66 */
    77
    88/*
    9  * Copyright (C) 2006-2007 Oracle Corporation
     9 * Copyright (C) 2006-2010 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1818 */
    1919
    20 // #define ENABLE_GLOBAL_USB
    21 
    22 #include "VBoxSettingsDialogSpecific.h"
     20/* Global includes */
     21#include <QStackedWidget>
     22
     23/* Local includes */
     24#include "UISettingsDialogSpecific.h"
    2325#include "VBoxGlobal.h"
    2426#include "VBoxProblemReporter.h"
     
    4345#include "VBoxVMSettingsSF.h"
    4446
    45 /* Qt includes */
    46 #include <QStackedWidget>
    47 
    48 VBoxGLSettingsDlg::VBoxGLSettingsDlg (QWidget *aParent)
    49     : VBoxSettingsDialog (aParent)
    50 {
     47#if 0 /* Global USB filters are DISABLED now: */
     48# define ENABLE_GLOBAL_USB
     49#endif /* Global USB filters are DISABLED now: */
     50
     51UIGLSettingsDlg::UIGLSettingsDlg(QWidget *pParent)
     52    : UISettingsDialog(pParent)
     53{
     54    /* Window icon: */
    5155#ifndef Q_WS_MAC
    52     setWindowIcon (QIcon (":/global_settings_16px.png"));
    53 #endif /* Q_WS_MAC */
    54 
    55     /* Creating settings pages */
    56     VBoxSettingsPage *prefPage = NULL;
    57 
    58     /* General page */
    59     if (isAvailable (GeneralId))
    60     {
    61         prefPage = new VBoxGLSettingsGeneral();
    62         addItem (":/machine_32px.png", ":/machine_disabled_32px.png",
    63                  ":/machine_16px.png", ":/machine_disabled_16px.png",
    64                  GeneralId, "#general", prefPage);
    65     }
    66 
    67     /* Input page */
    68     if (isAvailable (InputId))
    69     {
    70         prefPage = new VBoxGLSettingsInput();
    71         addItem (":/hostkey_32px.png", ":/hostkey_disabled_32px.png",
    72                  ":/hostkey_16px.png", ":/hostkey_disabled_16px.png",
    73                  InputId, "#input", prefPage);
    74     }
    75 
    76     /* Update page */
    77     if (isAvailable (UpdateId))
    78     {
    79         prefPage = new VBoxGLSettingsUpdate();
    80         addItem (":/refresh_32px.png", ":/refresh_disabled_32px.png",
    81                  ":/refresh_16px.png", ":/refresh_disabled_16px.png",
    82                  UpdateId, "#update", prefPage);
    83     }
    84 
    85     /* Language page */
    86     if (isAvailable (LanguageId))
    87     {
    88         prefPage = new VBoxGLSettingsLanguage();
    89         addItem (":/site_32px.png", ":/site_disabled_32px.png",
    90                  ":/site_16px.png", ":/site_disabled_16px.png",
    91                  LanguageId, "#language", prefPage);
    92     }
    93 
    94 #ifdef ENABLE_GLOBAL_USB
    95     /* USB page */
    96     if (isAvailable (USBId))
    97     {
    98         prefPage = new VBoxVMSettingsUSB (VBoxVMSettingsUSB::HostType);
    99         addItem (":/usb_32px.png", ":/usb_disabled_32px.png",
    100                  ":/usb_16px.png", ":/usb_disabled_16px.png",
    101                  USBId, "#usb", prefPage);
    102     }
    103 #endif
    104 
    105 #ifdef VBOX_WITH_NETFLT
    106     /* Network page */
    107     if (isAvailable (NetworkId))
    108     {
    109         prefPage = new VBoxGLSettingsNetwork();
    110         addItem (":/nw_32px.png", ":/nw_disabled_32px.png",
    111                  ":/nw_16px.png", ":/nw_disabled_16px.png",
    112                  NetworkId, "#language", prefPage);
    113     }
    114 #endif
    115 
    116     /* Applying language settings */
     56    setWindowIcon(QIcon(":/global_settings_16px.png"));
     57#endif /* !Q_WS_MAC */
     58
     59    /* Creating settings pages: */
     60    for (int i = GLSettingsPage_General; i < GLSettingsPage_MAX; ++i)
     61    {
     62        if (isAvailable(i))
     63        {
     64            switch (i)
     65            {
     66                /* General page: */
     67                case GLSettingsPage_General:
     68                {
     69                    addItem(":/machine_32px.png", ":/machine_disabled_32px.png",
     70                            ":/machine_16px.png", ":/machine_disabled_16px.png",
     71                            i, "#general", new VBoxGLSettingsGeneral);
     72                    break;
     73                }
     74                /* Input page: */
     75                case GLSettingsPage_Input:
     76                {
     77                    addItem(":/hostkey_32px.png", ":/hostkey_disabled_32px.png",
     78                            ":/hostkey_16px.png", ":/hostkey_disabled_16px.png",
     79                            i, "#input", new VBoxGLSettingsInput);
     80                    break;
     81                }
     82                /* Update page: */
     83                case GLSettingsPage_Update:
     84                {
     85                    addItem(":/refresh_32px.png", ":/refresh_disabled_32px.png",
     86                            ":/refresh_16px.png", ":/refresh_disabled_16px.png",
     87                            i, "#update", new VBoxGLSettingsUpdate);
     88                    break;
     89                }
     90                /* Language page: */
     91                case GLSettingsPage_Language:
     92                {
     93                    addItem(":/site_32px.png", ":/site_disabled_32px.png",
     94                            ":/site_16px.png", ":/site_disabled_16px.png",
     95                            i, "#language", new VBoxGLSettingsLanguage);
     96                    break;
     97                }
     98                /* USB page: */
     99                case GLSettingsPage_USB:
     100                {
     101                    addItem(":/usb_32px.png", ":/usb_disabled_32px.png",
     102                            ":/usb_16px.png", ":/usb_disabled_16px.png",
     103                            i, "#usb", new VBoxVMSettingsUSB(VBoxVMSettingsUSB::HostType));
     104                    break;
     105                }
     106                /* Network page: */
     107                case GLSettingsPage_Network:
     108                {
     109                    addItem(":/nw_32px.png", ":/nw_disabled_32px.png",
     110                            ":/nw_16px.png", ":/nw_disabled_16px.png",
     111                            i, "#language", new VBoxGLSettingsNetwork);
     112                    break;
     113                }
     114                default:
     115                    break;
     116            }
     117        }
     118    }
     119
     120    /* Retranslate UI: */
    117121    retranslateUi();
    118122
    119     /* First item as default */
    120     mSelector->selectById (0);
    121 }
    122 
    123 void VBoxGLSettingsDlg::getFrom()
    124 {
    125     CSystemProperties prop = vboxGlobal().virtualBox().GetSystemProperties();
    126     VBoxGlobalSettings sett = vboxGlobal().settings();
    127 
    128     QList <VBoxSettingsPage*> pages = mSelector->settingPages();
    129     foreach (VBoxSettingsPage *page, pages)
    130         if (page->isEnabled())
    131             page->getFrom (prop, sett);
    132 }
    133 
    134 void VBoxGLSettingsDlg::putBackTo()
    135 {
    136     CSystemProperties prop = vboxGlobal().virtualBox().GetSystemProperties();
    137     VBoxGlobalSettings sett = vboxGlobal().settings();
    138     VBoxGlobalSettings newsett = sett;
    139 
    140     QList <VBoxSettingsPage*> pages = mSelector->settingPages();
    141     foreach (VBoxSettingsPage *page, pages)
    142         if (page->isEnabled())
    143             page->putBackTo (prop, newsett);
    144 
    145     if (!prop.isOk())
    146         vboxProblem().cannotSetSystemProperties (prop);
    147     else
    148     {
    149         if (!(newsett == sett))
    150             vboxGlobal().setSettings (newsett);
    151     }
    152 }
    153 
    154 void VBoxGLSettingsDlg::retranslateUi()
    155 {
    156     /* Set dialog's name */
    157     setWindowTitle (dialogTitle());
    158 
    159     /* General page */
    160     mSelector->setItemText (GeneralId, tr ("General"));
    161 
    162     /* Input page */
    163     mSelector->setItemText (InputId, tr ("Input"));
    164 
    165     /* Update page */
    166     mSelector->setItemText (UpdateId, tr ("Update"));
    167 
    168     /* Language page */
    169     mSelector->setItemText (LanguageId, tr ("Language"));
    170 
    171 #ifdef ENABLE_GLOBAL_USB
    172     /* USB page */
    173     mSelector->setItemText (USBId, tr ("USB"));
    174 #endif
    175 
    176     /* Network page */
    177     mSelector->setItemText (NetworkId, tr ("Network"));
    178 
    179     /* Translate the selector */
    180     mSelector->polish();
    181 
    182     VBoxSettingsDialog::retranslateUi();
    183 }
    184 
    185 QString VBoxGLSettingsDlg::dialogTitle() const
    186 {
    187     return tr ("VirtualBox - %1").arg (titleExtension());
    188 }
    189 
    190 bool VBoxGLSettingsDlg::isAvailable (GLSettingsPageIds aId)
     123    /* Choose first item by default: */
     124    m_pSelector->selectById(0);
     125}
     126
     127void UIGLSettingsDlg::getFrom()
     128{
     129    /* Get properties and settings: */
     130    CSystemProperties properties = vboxGlobal().virtualBox().GetSystemProperties();
     131    VBoxGlobalSettings settings = vboxGlobal().settings();
     132    /* Iterate over the settings pages: */
     133    QList<VBoxSettingsPage*> pages = m_pSelector->settingPages();
     134    for (int i = 0; i < pages.size(); ++i)
     135    {
     136        /* For every page => load the settings: */
     137        VBoxSettingsPage *pPage = pages[i];
     138        if (pPage->isEnabled())
     139            pPage->getFrom(properties, settings);
     140    }
     141}
     142
     143void UIGLSettingsDlg::putBackTo()
     144{
     145    /* Get properties and settings: */
     146    CSystemProperties properties = vboxGlobal().virtualBox().GetSystemProperties();
     147    VBoxGlobalSettings oldSettings = vboxGlobal().settings();
     148    VBoxGlobalSettings newSettings = oldSettings;
     149    /* Iterate over the settings pages: */
     150    QList<VBoxSettingsPage*> pages = m_pSelector->settingPages();
     151    for (int i = 0; i < pages.size(); ++i)
     152    {
     153        /* For every page => save the settings: */
     154        VBoxSettingsPage *pPage = pages[i];
     155        if (pPage->isEnabled())
     156            pPage->putBackTo(properties, newSettings);
     157    }
     158    /* If properties are not OK => show the error: */
     159    if (!properties.isOk())
     160        vboxProblem().cannotSetSystemProperties(properties);
     161    /* Else save the new settings if they were changed: */
     162    else if (!(newSettings == oldSettings))
     163        vboxGlobal().setSettings(newSettings);
     164}
     165
     166void UIGLSettingsDlg::retranslateUi()
     167{
     168    /* Set dialog's name: */
     169    setWindowTitle(title());
     170
     171    /* General page: */
     172    m_pSelector->setItemText(GLSettingsPage_General, tr("General"));
     173
     174    /* Input page: */
     175    m_pSelector->setItemText(GLSettingsPage_Input, tr("Input"));
     176
     177    /* Update page: */
     178    m_pSelector->setItemText(GLSettingsPage_Update, tr("Update"));
     179
     180    /* Language page: */
     181    m_pSelector->setItemText(GLSettingsPage_Language, tr("Language"));
     182
     183    /* USB page: */
     184    m_pSelector->setItemText(GLSettingsPage_USB, tr("USB"));
     185
     186    /* Network page: */
     187    m_pSelector->setItemText(GLSettingsPage_Network, tr("Network"));
     188
     189    /* Translate the selector: */
     190    m_pSelector->polish();
     191
     192    /* Base-class UI translation: */
     193    UISettingsDialog::retranslateUi();
     194}
     195
     196QString UIGLSettingsDlg::title() const
     197{
     198    return tr("VirtualBox - %1").arg(titleExtension());
     199}
     200
     201bool UIGLSettingsDlg::isAvailable(int id)
    191202{
    192203    /* Show the host error message for particular group if present.
    193204     * We don't use the generic cannotLoadGlobalConfig()
    194      * call here because we want this message to be suppressible. */
    195     switch (aId)
    196     {
    197         case USBId:
    198         {
    199             /* Show the host error message */
     205     * call here because we want this message to be suppressible: */
     206    switch (id)
     207    {
     208        case GLSettingsPage_USB:
     209        {
     210#ifdef ENABLE_GLOBAL_USB
     211            /* Get the host object: */
    200212            CHost host = vboxGlobal().virtualBox().GetHost();
     213            /* Show the host error message if any: */
    201214            if (!host.isReallyOk())
    202                 vboxProblem().cannotAccessUSB (host);
    203 
    204             /* Check if USB is implemented */
    205             CHostUSBDeviceFilterVector coll = host.GetUSBDeviceFilters();
     215                vboxProblem().cannotAccessUSB(host);
     216            /* Check if USB is implemented: */
     217            CHostUSBDeviceFilterVector filters = host.GetUSBDeviceFilters();
     218            Q_UNUSED(filters);
    206219            if (host.lastRC() == E_NOTIMPL)
    207220                return false;
    208 
    209             /* Break to common result */
     221#else
     222            return false;
     223#endif
     224            break;
     225        }
     226        case GLSettingsPage_Network:
     227        {
     228#ifndef VBOX_WITH_NETFLT
     229            return false;
     230#endif /* !VBOX_WITH_NETFLT */
    210231            break;
    211232        }
     
    216237}
    217238
    218 VBoxVMSettingsDlg::VBoxVMSettingsDlg (QWidget *aParent,
    219                                       const CMachine &aMachine,
    220                                       const QString &aCategory,
    221                                       const QString &aControl)
    222     : VBoxSettingsDialog (aParent)
    223     , mMachine (aMachine)
    224     , mAllowResetFirstRunFlag (false)
    225 {
     239UIVMSettingsDlg::UIVMSettingsDlg(QWidget *pParent,
     240                                 const CMachine &machine,
     241                                 const QString &strCategory,
     242                                 const QString &strControl)
     243    : UISettingsDialog(pParent)
     244    , m_machine(machine)
     245    , m_fAllowResetFirstRunFlag(false)
     246    , m_fResetFirstRunFlag(false)
     247{
     248    /* Window icon: */
    226249#ifndef Q_WS_MAC
    227     setWindowIcon (QIcon (":/settings_16px.png"));
     250    setWindowIcon(QIcon(":/settings_16px.png"));
    228251#endif /* Q_WS_MAC */
    229252
    230     /* Common */
    231     connect (&vboxGlobal(), SIGNAL (mediumEnumFinished (const VBoxMediaList &)),
    232              this, SLOT (onMediaEnumerationDone()));
    233 
    234     /* Creating settings pages */
    235     VBoxSettingsPage *prefPage = NULL;
    236 
    237     /* General page */
    238     if (isAvailable (GeneralId))
    239     {
    240         prefPage = new VBoxVMSettingsGeneral();
    241         addItem (":/machine_32px.png", ":/machine_disabled_32px.png",
    242                  ":/machine_16px.png", ":/machine_disabled_16px.png",
    243                  GeneralId, "#general", prefPage);
    244     }
    245 
    246     /* System page */
    247     if (isAvailable (SystemId))
    248     {
    249         prefPage = new VBoxVMSettingsSystem();
    250         connect (prefPage, SIGNAL (tableChanged()), this, SLOT (resetFirstRunFlag()));
    251         addItem (":/chipset_32px.png", ":/chipset_disabled_32px.png",
    252                  ":/chipset_16px.png", ":/chipset_disabled_16px.png",
    253                  SystemId, "#system", prefPage);
    254     }
    255 
    256     /* Display page */
    257     if (isAvailable (DisplayId))
    258     {
    259         prefPage = new VBoxVMSettingsDisplay();
    260         addItem (":/vrdp_32px.png", ":/vrdp_disabled_32px.png",
    261                  ":/vrdp_16px.png", ":/vrdp_disabled_16px.png",
    262                  DisplayId, "#display", prefPage);
    263     }
    264 
    265     /* Storage page */
    266     if (isAvailable (StorageId))
    267     {
    268         prefPage = new VBoxVMSettingsHD();
    269         connect (prefPage, SIGNAL (storageChanged()), this, SLOT (resetFirstRunFlag()));
    270         addItem (":/hd_32px.png", ":/hd_disabled_32px.png",
    271                  ":/attachment_16px.png", ":/attachment_disabled_16px.png",
    272                  StorageId, "#storage", prefPage);
    273     }
    274 
    275     /* Audio page */
    276     if (isAvailable (AudioId))
    277     {
    278         prefPage = new VBoxVMSettingsAudio();
    279         addItem (":/sound_32px.png", ":/sound_disabled_32px.png",
    280                  ":/sound_16px.png", ":/sound_disabled_16px.png",
    281                  AudioId, "#audio", prefPage);
    282     }
    283 
    284     /* Network page */
    285     if (isAvailable (NetworkId))
    286     {
    287         prefPage = new VBoxVMSettingsNetworkPage();
    288         addItem (":/nw_32px.png", ":/nw_disabled_32px.png",
    289                  ":/nw_16px.png", ":/nw_disabled_16px.png",
    290                  NetworkId, "#network", prefPage);
    291     }
    292 
    293     /* Ports page */
    294     if (isAvailable (PortsId))
    295     {
    296         addItem (":/serial_port_32px.png", ":/serial_port_disabled_32px.png",
    297                  ":/serial_port_16px.png", ":/serial_port_disabled_16px.png",
    298                  PortsId, "#ports");
    299 
    300         /* USB page */
    301         if (isAvailable (USBId))
    302         {
    303             prefPage = new VBoxVMSettingsUSB (VBoxVMSettingsUSB::MachineType);
    304             addItem (":/usb_32px.png", ":/usb_disabled_32px.png",
    305                      ":/usb_16px.png", ":/usb_disabled_16px.png",
    306                      USBId, "#usb", prefPage, PortsId);
    307         }
    308 
    309         /* Serial page */
    310         if (isAvailable (SerialId))
    311         {
    312             prefPage = new VBoxVMSettingsSerialPage();
    313             addItem (":/serial_port_32px.png", ":/serial_port_disabled_32px.png",
    314                      ":/serial_port_16px.png", ":/serial_port_disabled_16px.png",
    315                      SerialId, "#serialPorts", prefPage, PortsId);
    316         }
    317 
    318         /* Parallel page */
    319         if (isAvailable (ParallelId))
    320         {
    321             prefPage = new VBoxVMSettingsParallelPage();
    322             addItem (":/parallel_port_32px.png", ":/parallel_port_disabled_32px.png",
    323                      ":/parallel_port_16px.png", ":/parallel_port_disabled_16px.png",
    324                      ParallelId, "#parallelPorts", prefPage, PortsId);
    325         }
    326     }
    327 
    328     /* SFolders page */
    329     if (isAvailable (SFId))
    330     {
    331         prefPage = new VBoxVMSettingsSF (MachineType);
    332         addItem (":/shared_folder_32px.png", ":/shared_folder_disabled_32px.png", ":/shared_folder_16px.png", ":/shared_folder_disabled_16px.png",
    333                  SFId, "#sfolders",
    334                  prefPage);
    335     }
    336 
    337     /* Applying language settings */
     253    /* Allow to reset first-run flag just when medium enumeration was finished: */
     254    connect(&vboxGlobal(), SIGNAL(mediumEnumFinished(const VBoxMediaList &)), this, SLOT(sltAllowResetFirstRunFlag()));
     255
     256    /* Creating settings pages: */
     257    for (int i = VMSettingsPage_General; i < VMSettingsPage_MAX; ++i)
     258    {
     259        if (isAvailable(i))
     260        {
     261            switch (i)
     262            {
     263                /* General page: */
     264                case VMSettingsPage_General:
     265                {
     266                    addItem(":/machine_32px.png", ":/machine_disabled_32px.png",
     267                            ":/machine_16px.png", ":/machine_disabled_16px.png",
     268                            i, "#general", new VBoxVMSettingsGeneral);
     269                    break;
     270                }
     271                /* System page: */
     272                case VMSettingsPage_System:
     273                {
     274                    VBoxSettingsPage *pSystemPage = new VBoxVMSettingsSystem;
     275                    connect(pSystemPage, SIGNAL(tableChanged()), this, SLOT(sltResetFirstRunFlag()));
     276                    addItem(":/chipset_32px.png", ":/chipset_disabled_32px.png",
     277                            ":/chipset_16px.png", ":/chipset_disabled_16px.png",
     278                            i, "#system", pSystemPage);
     279                    break;
     280                }
     281                /* Display page: */
     282                case VMSettingsPage_Display:
     283                {
     284                    addItem(":/vrdp_32px.png", ":/vrdp_disabled_32px.png",
     285                            ":/vrdp_16px.png", ":/vrdp_disabled_16px.png",
     286                            i, "#display", new VBoxVMSettingsDisplay);
     287                    break;
     288                }
     289                /* Storage page: */
     290                case VMSettingsPage_Storage:
     291                {
     292                    VBoxSettingsPage *pStoragePage = new VBoxVMSettingsHD;
     293                    connect(pStoragePage, SIGNAL(storageChanged()), this, SLOT(sltResetFirstRunFlag()));
     294                    addItem(":/hd_32px.png", ":/hd_disabled_32px.png",
     295                            ":/attachment_16px.png", ":/attachment_disabled_16px.png",
     296                            i, "#storage", pStoragePage);
     297                    break;
     298                }
     299                /* Audio page: */
     300                case VMSettingsPage_Audio:
     301                {
     302                    addItem(":/sound_32px.png", ":/sound_disabled_32px.png",
     303                            ":/sound_16px.png", ":/sound_disabled_16px.png",
     304                            i, "#audio", new VBoxVMSettingsAudio);
     305                    break;
     306                }
     307                /* Network page: */
     308                case VMSettingsPage_Network:
     309                {
     310                    addItem(":/nw_32px.png", ":/nw_disabled_32px.png",
     311                            ":/nw_16px.png", ":/nw_disabled_16px.png",
     312                            i, "#network", new VBoxVMSettingsNetworkPage);
     313                    break;
     314                }
     315                /* Ports page: */
     316                case VMSettingsPage_Ports:
     317                {
     318                    addItem(":/serial_port_32px.png", ":/serial_port_disabled_32px.png",
     319                            ":/serial_port_16px.png", ":/serial_port_disabled_16px.png",
     320                            i, "#ports");
     321                    break;
     322                }
     323                /* Serial page: */
     324                case VMSettingsPage_Serial:
     325                {
     326                    addItem(":/serial_port_32px.png", ":/serial_port_disabled_32px.png",
     327                            ":/serial_port_16px.png", ":/serial_port_disabled_16px.png",
     328                            i, "#serialPorts", new VBoxVMSettingsSerialPage, VMSettingsPage_Ports);
     329                    break;
     330                }
     331                /* Parallel page: */
     332                case VMSettingsPage_Parallel:
     333                {
     334                    addItem(":/parallel_port_32px.png", ":/parallel_port_disabled_32px.png",
     335                            ":/parallel_port_16px.png", ":/parallel_port_disabled_16px.png",
     336                            i, "#parallelPorts", new VBoxVMSettingsParallelPage, VMSettingsPage_Ports);
     337                    break;
     338                }
     339                /* USB page: */
     340                case VMSettingsPage_USB:
     341                {
     342                    addItem(":/usb_32px.png", ":/usb_disabled_32px.png",
     343                            ":/usb_16px.png", ":/usb_disabled_16px.png",
     344                            i, "#usb", new VBoxVMSettingsUSB(VBoxVMSettingsUSB::MachineType), VMSettingsPage_Ports);
     345                    break;
     346                }
     347                /* Shared Folders page: */
     348                case VMSettingsPage_SF:
     349                {
     350                    addItem(":/shared_folder_32px.png", ":/shared_folder_disabled_32px.png",
     351                            ":/shared_folder_16px.png", ":/shared_folder_disabled_16px.png",
     352                            i, "#sfolders", new VBoxVMSettingsSF(MachineType));
     353                    break;
     354                }
     355            }
     356        }
     357    }
     358
     359    /* Retranslate UI: */
    338360    retranslateUi();
    339361
    340     /* Setup Settings Dialog */
    341     if (!aCategory.isNull())
    342     {
    343         mSelector->selectByLink (aCategory);
    344         /* Search for a widget with the given name */
    345         if (!aControl.isNull())
    346         {
    347             if (QWidget *w = mStack->currentWidget()->findChild <QWidget*> (aControl))
     362    /* Setup Settings Dialog: */
     363    if (!strCategory.isNull())
     364    {
     365        m_pSelector->selectByLink(strCategory);
     366        /* Search for a widget with the given name: */
     367        if (!strControl.isNull())
     368        {
     369            if (QWidget *pWidget = m_pStack->currentWidget()->findChild<QWidget*>(strControl))
    348370            {
    349                 QList <QWidget*> parents;
    350                 QWidget *p = w;
    351                 while ((p = p->parentWidget()) != NULL)
    352                 {
    353                     if (QTabWidget *tb = qobject_cast <QTabWidget*> (p))
     371                QList<QWidget*> parents;
     372                QWidget *pParentWidget = pWidget;
     373                while ((pParentWidget = pParentWidget->parentWidget()) != 0)
     374                {
     375                    if (QTabWidget *pTabWidget = qobject_cast<QTabWidget*>(pParentWidget))
    354376                    {
    355377                        /* The tab contents widget is two steps down
    356                          * (QTabWidget -> QStackedWidget -> QWidget) */
    357                         QWidget *c = parents [parents.count() - 1];
    358                         if (c)
    359                             c = parents [parents.count() - 2];
    360                         if (c)
    361                             tb->setCurrentWidget (c);
     378                         * (QTabWidget -> QStackedWidget -> QWidget): */
     379                        QWidget *pTabPage = parents[parents.count() - 1];
     380                        if (pTabPage)
     381                            pTabPage = parents[parents.count() - 2];
     382                        if (pTabPage)
     383                            pTabWidget->setCurrentWidget(pTabPage);
    362384                    }
    363                     parents.append (p);
    364                 }
    365 
    366                 w->setFocus();
     385                    parents.append(pParentWidget);
     386                }
     387                pWidget->setFocus();
    367388            }
    368389        }
    369390    }
    370     /* First item as default */
     391    /* First item as default: */
    371392    else
    372         mSelector->selectById (0);
    373 }
    374 
    375 void VBoxVMSettingsDlg::getFrom()
    376 {
    377     /* Load all the settings pages */
    378     QList <VBoxSettingsPage*> pages = mSelector->settingPages();
    379     foreach (VBoxSettingsPage *page, pages)
    380         page->getFrom (mMachine);
    381 
     393        m_pSelector->selectById(0);
     394}
     395
     396void UIVMSettingsDlg::getFrom()
     397{
     398    /* Iterate over the settings pages: */
     399    QList<VBoxSettingsPage*> pages = m_pSelector->settingPages();
     400    for (int i = 0; i < pages.size(); ++i)
     401    {
     402        /* For every page => load the settings: */
     403        VBoxSettingsPage *pPage = pages[i];
     404        if (pPage->isEnabled())
     405            pPage->getFrom(m_machine);
     406    }
    382407    /* Finally set the reset First Run Wizard flag to "false" to make sure
    383408     * user will see this dialog if he hasn't change the boot-order
    384      * and/or mounted images configuration */
    385     mResetFirstRunFlag = false;
    386 }
    387 
    388 void VBoxVMSettingsDlg::putBackTo()
    389 {
    390     /* Commit all the settings pages */
    391     QList <VBoxSettingsPage*> pages = mSelector->settingPages();
    392     foreach (VBoxSettingsPage *page, pages)
    393         page->putBackTo();
    394 
    395     /* Guest OS type & VT-x/AMD-V option correlation test */
    396     VBoxVMSettingsGeneral *generalPage =
    397         qobject_cast <VBoxVMSettingsGeneral*> (mSelector->idToPage (GeneralId));
    398     VBoxVMSettingsSystem *systemPage =
    399         qobject_cast <VBoxVMSettingsSystem*> (mSelector->idToPage (SystemId));
    400     if (generalPage && systemPage &&
    401         generalPage->is64BitOSTypeSelected() && !systemPage->isHWVirtExEnabled())
    402         mMachine.SetHWVirtExProperty(KHWVirtExPropertyType_Enabled, true);
     409     * and/or mounted images configuration: */
     410    m_fResetFirstRunFlag = false;
     411}
     412
     413void UIVMSettingsDlg::putBackTo()
     414{
     415    /* Iterate over the settings pages: */
     416    QList<VBoxSettingsPage*> pages = m_pSelector->settingPages();
     417    for (int i = 0; i < pages.size(); ++i)
     418    {
     419        /* For every page => save the settings: */
     420        VBoxSettingsPage *pPage = pages[i];
     421        if (pPage->isEnabled())
     422            pPage->putBackTo();
     423    }
     424
     425    /* Guest OS type & VT-x/AMD-V option correlation auto-fix: */
     426    VBoxVMSettingsGeneral *pGeneralPage =
     427        qobject_cast<VBoxVMSettingsGeneral*>(m_pSelector->idToPage(VMSettingsPage_General));
     428    VBoxVMSettingsSystem *pSystemPage =
     429        qobject_cast<VBoxVMSettingsSystem*>(m_pSelector->idToPage(VMSettingsPage_System));
     430    if (pGeneralPage && pSystemPage &&
     431        pGeneralPage->is64BitOSTypeSelected() && !pSystemPage->isHWVirtExEnabled())
     432        m_machine.SetHWVirtExProperty(KHWVirtExPropertyType_Enabled, true);
    403433
    404434#ifdef VBOX_WITH_VIDEOHWACCEL
    405     /* Disable 2D Video Acceleration for non-Windows guests */
    406     if (generalPage && !generalPage->isWindowsOSTypeSelected())
    407     {
    408         VBoxVMSettingsDisplay *displayPage =
    409             qobject_cast <VBoxVMSettingsDisplay*> (mSelector->idToPage (DisplayId));
    410         if (displayPage && displayPage->isAcceleration2DVideoSelected())
    411             mMachine.SetAccelerate2DVideoEnabled (false);
    412     }
    413 #endif
     435    /* Disable 2D Video Acceleration for non-Windows guests: */
     436    if (pGeneralPage && !pGeneralPage->isWindowsOSTypeSelected())
     437    {
     438        VBoxVMSettingsDisplay *pDisplayPage =
     439            qobject_cast<VBoxVMSettingsDisplay*>(m_pSelector->idToPage(VMSettingsPage_Display));
     440        if (pDisplayPage && pDisplayPage->isAcceleration2DVideoSelected())
     441            m_machine.SetAccelerate2DVideoEnabled(false);
     442    }
     443#endif /* VBOX_WITH_VIDEOHWACCEL */
    414444
    415445#ifndef VBOX_OSE
    416     /* Enable OHCI controller if HID is enabled */
    417     if (systemPage && systemPage->isHIDEnabled())
    418     {
    419         CUSBController ctl = mMachine.GetUSBController();
    420         if (!ctl.isNull())
    421             ctl.SetEnabled(true);
    422     }
    423 #endif /* VBOX_OSE */
    424 
    425     /* Clear the "GUI_FirstRun" extra data key in case if the boot order
    426      * and/or disk configuration were changed */
    427     if (mResetFirstRunFlag)
    428         mMachine.SetExtraData (VBoxDefs::GUI_FirstRun, QString::null);
    429 }
    430 
    431 void VBoxVMSettingsDlg::retranslateUi()
    432 {
    433     /* Set dialog's name */
    434     setWindowTitle (dialogTitle());
     446    /* Enable OHCI controller if HID is enabled: */
     447    if (pSystemPage && pSystemPage->isHIDEnabled())
     448    {
     449        CUSBController controller = m_machine.GetUSBController();
     450        if (!controller.isNull())
     451            controller.SetEnabled(true);
     452    }
     453#endif /* !VBOX_OSE */
     454
     455    /* Clear the "GUI_FirstRun" extra data key in case if
     456     * the boot order or disk configuration were changed: */
     457    if (m_fResetFirstRunFlag)
     458        m_machine.SetExtraData(VBoxDefs::GUI_FirstRun, QString::null);
     459}
     460
     461void UIVMSettingsDlg::retranslateUi()
     462{
     463    /* Set dialog's name: */
     464    setWindowTitle(title());
    435465
    436466    /* We have to make sure that the Serial & Network subpages are retranslated
    437467     * before they are revalidated. Cause: They do string comparing within
    438468     * vboxGlobal which is retranslated at that point already. */
    439     QEvent event (QEvent::LanguageChange);
    440     QWidget *page = NULL;
    441 
    442     /* General page */
    443     mSelector->setItemText (GeneralId, tr ("General"));
    444 
    445     /* System page */
    446     mSelector->setItemText (SystemId, tr ("System"));
    447 
    448     /* Display page */
    449     mSelector->setItemText (DisplayId, tr ("Display"));
    450 
    451     /* Storage page */
    452     mSelector->setItemText (StorageId, tr ("Storage"));
    453 
    454     /* HD page */
    455     mSelector->setItemText (HDId, tr ("Hard Disks"));
    456 
    457     /* CD page */
    458     mSelector->setItemText (CDId, tr ("CD/DVD-ROM"));
    459 
    460     /* FD page */
    461     mSelector->setItemText (FDId, tr ("Floppy"));
    462 
    463     /* Audio page */
    464     mSelector->setItemText (AudioId, tr ("Audio"));
    465 
    466     /* Network page */
    467     mSelector->setItemText (NetworkId, tr ("Network"));
    468     if ((page = mSelector->idToPage (NetworkId)))
    469         qApp->sendEvent (page, &event);
    470 
    471     /* Ports page */
    472     mSelector->setItemText (PortsId, tr ("Ports"));
    473 
    474     /* Serial page */
    475     mSelector->setItemText (SerialId, tr ("Serial Ports"));
    476     if ((page = mSelector->idToPage (SerialId)))
    477         qApp->sendEvent (page, &event);
    478 
    479     /* Parallel page */
    480     mSelector->setItemText (ParallelId, tr ("Parallel Ports"));
    481     if ((page = mSelector->idToPage (ParallelId)))
    482         qApp->sendEvent (page, &event);
    483 
    484     /* USB page */
    485     mSelector->setItemText (USBId, tr ("USB"));
    486 
    487     /* SFolders page */
    488     mSelector->setItemText (SFId, tr ("Shared Folders"));
    489 
    490     /* Translate the selector */
    491     mSelector->polish();
    492 
    493     VBoxSettingsDialog::retranslateUi();
    494 
    495     /* Revalidate all pages to retranslate the warning messages also. */
    496     QList <QIWidgetValidator*> l = this->findChildren <QIWidgetValidator*> ();
    497     foreach (QIWidgetValidator *wval, l)
    498         if (!wval->isValid())
    499             revalidate (wval);
    500 }
    501 
    502 QString VBoxVMSettingsDlg::dialogTitle() const
    503 {
    504     QString dialogTitle;
    505     if (!mMachine.isNull())
    506         dialogTitle = tr ("%1 - %2").arg (mMachine.GetName())
    507                                     .arg (titleExtension());
    508     return dialogTitle;
    509 }
    510 
    511 bool VBoxVMSettingsDlg::correlate (QWidget *aPage, QString &aWarning)
    512 {
    513     /* This method performs correlation option check between
    514      * different pages of VM Settings dialog */
    515 
    516     if (aPage == mSelector->idToPage (GeneralId) ||
    517         aPage == mSelector->idToPage (SystemId))
    518     {
    519         VBoxVMSettingsGeneral *generalPage =
    520             qobject_cast <VBoxVMSettingsGeneral*> (mSelector->idToPage (GeneralId));
    521         VBoxVMSettingsSystem *systemPage =
    522             qobject_cast <VBoxVMSettingsSystem*> (mSelector->idToPage (SystemId));
    523 
    524         /* Guest OS type & VT-x/AMD-V option correlation test */
    525         if (generalPage && systemPage &&
    526             generalPage->is64BitOSTypeSelected() && !systemPage->isHWVirtExEnabled())
    527         {
    528             aWarning = tr (
     469    QEvent event(QEvent::LanguageChange);
     470    QWidget *pPage = 0;
     471
     472    /* General page: */
     473    m_pSelector->setItemText(VMSettingsPage_General, tr("General"));
     474
     475    /* System page: */
     476    m_pSelector->setItemText(VMSettingsPage_System, tr("System"));
     477
     478    /* Display page: */
     479    m_pSelector->setItemText(VMSettingsPage_Display, tr("Display"));
     480
     481    /* Storage page: */
     482    m_pSelector->setItemText(VMSettingsPage_Storage, tr("Storage"));
     483
     484    /* Audio page: */
     485    m_pSelector->setItemText(VMSettingsPage_Audio, tr("Audio"));
     486
     487    /* Network page: */
     488    m_pSelector->setItemText(VMSettingsPage_Network, tr("Network"));
     489    if ((pPage = m_pSelector->idToPage(VMSettingsPage_Network)))
     490        qApp->sendEvent(pPage, &event);
     491
     492    /* Ports page: */
     493    m_pSelector->setItemText(VMSettingsPage_Ports, tr("Ports"));
     494
     495    /* Serial page: */
     496    m_pSelector->setItemText(VMSettingsPage_Serial, tr("Serial Ports"));
     497    if ((pPage = m_pSelector->idToPage(VMSettingsPage_Serial)))
     498        qApp->sendEvent(pPage, &event);
     499
     500    /* Parallel page: */
     501    m_pSelector->setItemText(VMSettingsPage_Parallel, tr("Parallel Ports"));
     502    if ((pPage = m_pSelector->idToPage(VMSettingsPage_Parallel)))
     503        qApp->sendEvent(pPage, &event);
     504
     505    /* USB page: */
     506    m_pSelector->setItemText(VMSettingsPage_USB, tr("USB"));
     507
     508    /* SFolders page: */
     509    m_pSelector->setItemText(VMSettingsPage_SF, tr("Shared Folders"));
     510
     511    /* Translate the selector: */
     512    m_pSelector->polish();
     513
     514    /* Base-class UI translation: */
     515    UISettingsDialog::retranslateUi();
     516
     517    /* Revalidate all pages to retranslate the warning messages also: */
     518    QList<QIWidgetValidator*> validators = findChildren<QIWidgetValidator*>();
     519    for (int i = 0; i < validators.size(); ++i)
     520    {
     521        QIWidgetValidator *pValidator = validators[i];
     522        if (!pValidator->isValid())
     523            sltRevalidate(pValidator);
     524    }
     525}
     526
     527QString UIVMSettingsDlg::title() const
     528{
     529    QString strDialogTitle;
     530    if (!m_machine.isNull())
     531        strDialogTitle = tr("%1 - %2").arg(m_machine.GetName()).arg(titleExtension());
     532    return strDialogTitle;
     533}
     534
     535bool UIVMSettingsDlg::recorrelate(QWidget *pPage, QString &strWarning)
     536{
     537    /* This method performs correlation option check
     538     * between different pages of VM Settings dialog: */
     539
     540    if (pPage == m_pSelector->idToPage(VMSettingsPage_General) ||
     541        pPage == m_pSelector->idToPage(VMSettingsPage_System))
     542    {
     543        /* Get General & System pages: */
     544        VBoxVMSettingsGeneral *pGeneralPage =
     545            qobject_cast<VBoxVMSettingsGeneral*>(m_pSelector->idToPage(VMSettingsPage_General));
     546        VBoxVMSettingsSystem *pSystemPage =
     547            qobject_cast<VBoxVMSettingsSystem*>(m_pSelector->idToPage(VMSettingsPage_System));
     548
     549        /* Guest OS type & VT-x/AMD-V option correlation test: */
     550        if (pGeneralPage && pSystemPage &&
     551            pGeneralPage->is64BitOSTypeSelected() && !pSystemPage->isHWVirtExEnabled())
     552        {
     553            strWarning = tr(
    529554                "you have selected a 64-bit guest OS type for this VM. As such guests "
    530555                "require hardware virtualization (VT-x/AMD-V), this feature will be enabled "
     
    535560
    536561#ifdef VBOX_WITH_VIDEOHWACCEL
    537     /* 2D Video Acceleration is available for Windows guests only */
    538     if (aPage == mSelector->idToPage (DisplayId))
    539     {
    540         VBoxVMSettingsGeneral *generalPage =
    541             qobject_cast <VBoxVMSettingsGeneral*> (mSelector->idToPage (GeneralId));
    542         VBoxVMSettingsDisplay *displayPage =
    543             qobject_cast <VBoxVMSettingsDisplay*> (mSelector->idToPage (DisplayId));
    544         if (generalPage && displayPage &&
    545             displayPage->isAcceleration2DVideoSelected() && !generalPage->isWindowsOSTypeSelected())
    546         {
    547             aWarning = tr (
     562    /* 2D Video Acceleration is available for Windows guests only: */
     563    if (pPage == m_pSelector->idToPage(VMSettingsPage_Display))
     564    {
     565        /* Get General & Display pages: */
     566        VBoxVMSettingsGeneral *pGeneralPage =
     567            qobject_cast<VBoxVMSettingsGeneral*>(m_pSelector->idToPage(VMSettingsPage_General));
     568        VBoxVMSettingsDisplay *pDisplayPage =
     569            qobject_cast<VBoxVMSettingsDisplay*>(m_pSelector->idToPage(VMSettingsPage_Display));
     570        if (pGeneralPage && pDisplayPage &&
     571            pDisplayPage->isAcceleration2DVideoSelected() && !pGeneralPage->isWindowsOSTypeSelected())
     572        {
     573            strWarning = tr(
    548574                "you have 2D Video Acceleration enabled. As 2D Video Acceleration "
    549575                "is supported for Windows guests only, this feature will be disabled.");
     
    551577        }
    552578    }
    553 #endif
     579#endif /* VBOX_WITH_VIDEOHWACCEL */
    554580
    555581#ifndef VBOX_OSE
    556     if (aPage == mSelector->idToPage (SystemId) ||
    557         aPage == mSelector->idToPage (USBId))
    558     {
    559         VBoxVMSettingsSystem *systemPage =
    560             qobject_cast <VBoxVMSettingsSystem*> (mSelector->idToPage (SystemId));
    561         VBoxVMSettingsUSB *usbPage =
    562             qobject_cast <VBoxVMSettingsUSB*> (mSelector->idToPage (USBId));
    563         if (systemPage && usbPage &&
    564             systemPage->isHIDEnabled() && !usbPage->isOHCIEnabled())
    565         {
    566             aWarning = tr (
     582    if (pPage == m_pSelector->idToPage(VMSettingsPage_System) ||
     583        pPage == m_pSelector->idToPage(VMSettingsPage_USB))
     584    {
     585        /* Get System & USB pages: */
     586        VBoxVMSettingsSystem *pSystemPage =
     587            qobject_cast<VBoxVMSettingsSystem*>(m_pSelector->idToPage(VMSettingsPage_System));
     588        VBoxVMSettingsUSB *pUsbPage =
     589            qobject_cast<VBoxVMSettingsUSB*>(m_pSelector->idToPage(VMSettingsPage_USB));
     590        if (pSystemPage && pUsbPage &&
     591            pSystemPage->isHIDEnabled() && !pUsbPage->isOHCIEnabled())
     592        {
     593            strWarning = tr(
    567594                "you have enabled a USB HID (Human Interface Device). "
    568595                "This will not work unless USB emulation is also enabled. "
     
    572599        }
    573600    }
    574 #endif /* VBOX_OSE */
     601#endif /* !VBOX_OSE */
    575602
    576603    return true;
    577604}
    578605
    579 void VBoxVMSettingsDlg::onMediaEnumerationDone()
    580 {
    581     mAllowResetFirstRunFlag = true;
    582 }
    583 
    584 void VBoxVMSettingsDlg::resetFirstRunFlag()
    585 {
    586     if (mAllowResetFirstRunFlag)
    587         mResetFirstRunFlag = true;
    588 }
    589 
    590 bool VBoxVMSettingsDlg::isAvailable (VMSettingsPageIds aId)
    591 {
    592     if (mMachine.isNull())
     606void UIVMSettingsDlg::sltAllowResetFirstRunFlag()
     607{
     608    m_fAllowResetFirstRunFlag = true;
     609}
     610
     611void UIVMSettingsDlg::sltResetFirstRunFlag()
     612{
     613    if (m_fAllowResetFirstRunFlag)
     614        m_fResetFirstRunFlag = true;
     615}
     616
     617bool UIVMSettingsDlg::isAvailable(int id)
     618{
     619    if (m_machine.isNull())
    593620        return false;
    594621
     
    596623     * We don't use the generic cannotLoadMachineSettings()
    597624     * call here because we want this message to be suppressible. */
    598     switch (aId)
    599     {
    600         case ParallelId:
    601         {
    602             /* This page is currently disabled */
     625    switch (id)
     626    {
     627        case VMSettingsPage_Serial:
     628        {
     629            /* Depends on ports availability: */
     630            if (!isAvailable(VMSettingsPage_Ports))
     631                return false;
     632            break;
     633        }
     634        case VMSettingsPage_Parallel:
     635        {
     636            /* Depends on ports availability: */
     637            if (!isAvailable(VMSettingsPage_Ports))
     638                return false;
     639            /* But for now this page is always disabled: */
    603640            return false;
    604641        }
    605         case USBId:
    606         {
    607             /* Show the host error message */
    608             CUSBController ctl = mMachine.GetUSBController();
    609             if (!mMachine.isReallyOk())
    610                 vboxProblem().cannotAccessUSB (mMachine);
    611 
    612             /* Check if USB is implemented */
    613             if (   ctl.isNull()
    614                 || !ctl.GetProxyAvailable())
     642        case VMSettingsPage_USB:
     643        {
     644            /* Depends on ports availability: */
     645            if (!isAvailable(VMSettingsPage_Ports))
    615646                return false;
    616 
    617             /* Break to common result */
     647            /* Get the USB controller object: */
     648            CUSBController controller = m_machine.GetUSBController();
     649            /* Show the machine error message if any: */
     650            if (!m_machine.isReallyOk())
     651                vboxProblem().cannotAccessUSB(m_machine);
     652            /* Check if USB is implemented: */
     653            if (controller.isNull() || !controller.GetProxyAvailable())
     654                return false;
    618655            break;
    619656        }
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h

    r32472 r32667  
    22 *
    33 * VBox frontends: Qt4 GUI ("VirtualBox"):
    4  * VBoxSettingsDialogSpecific class declaration
     4 * UISettingsDialogSpecific class declaration
    55 */
    66
    77/*
    8  * Copyright (C) 2006-2008 Oracle Corporation
     8 * Copyright (C) 2006-2010 Oracle Corporation
    99 *
    1010 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1717 */
    1818
    19 #ifndef __VBoxSettingsDialogSpecific_h__
    20 #define __VBoxSettingsDialogSpecific_h__
     19#ifndef __UISettingsDialogSpecific_h__
     20#define __UISettingsDialogSpecific_h__
    2121
     22/* Local includes */
    2223#include "COMDefs.h"
    23 #include "VBoxSettingsDialog.h"
     24#include "UISettingsDialog.h"
    2425
    25 /*
    26  * Dialog which encapsulate all the specific funtionalities of the
    27  * Global Settings.
    28  */
    29 class VBoxGLSettingsDlg : public VBoxSettingsDialog
     26/* Dialog which encapsulate all the specific funtionalities of the Global Settings */
     27class UIGLSettingsDlg : public UISettingsDialog
    3028{
    3129    Q_OBJECT;
     
    3331public:
    3432
    35     enum GLSettingsPageIds
     33    enum GLSettingsPage
    3634    {
    37         GeneralId = 0,
    38         InputId,
    39         UpdateId,
    40         LanguageId,
    41         USBId,
    42         NetworkId
     35        GLSettingsPage_General = 0,
     36        GLSettingsPage_Input,
     37        GLSettingsPage_Update,
     38        GLSettingsPage_Language,
     39        GLSettingsPage_USB,
     40        GLSettingsPage_Network,
     41        GLSettingsPage_MAX
    4342    };
    4443
    45     VBoxGLSettingsDlg (QWidget *aParent);
     44    UIGLSettingsDlg(QWidget *pParent);
    4645
    4746protected:
     
    5251    void retranslateUi();
    5352
    54     QString dialogTitle() const;
     53    QString title() const;
    5554
    5655private:
    5756
    58     bool isAvailable (GLSettingsPageIds aId);
     57    bool isAvailable(int id);
    5958};
    6059
    61 /*
    62  * Dialog which encapsulate all the specific funtionalities of the
    63  * Virtual Machine Settings.
    64  */
    65 class VBoxVMSettingsDlg : public VBoxSettingsDialog
     60/* Dialog which encapsulate all the specific funtionalities of the Virtual Machine Settings */
     61class UIVMSettingsDlg : public UISettingsDialog
    6662{
    6763    Q_OBJECT;
     
    6965public:
    7066
    71     enum VMSettingsPageIds
     67    enum VMSettingsPage
    7268    {
    73         GeneralId = 0,
    74         SystemId,
    75         DisplayId,
    76         StorageId,
    77         HDId,
    78         CDId,
    79         FDId,
    80         AudioId,
    81         NetworkId,
    82         PortsId,
    83         SerialId,
    84         ParallelId,
    85         USBId,
    86         SFId
     69        VMSettingsPage_General = 0,
     70        VMSettingsPage_System,
     71        VMSettingsPage_Display,
     72        VMSettingsPage_Storage,
     73        VMSettingsPage_Audio,
     74        VMSettingsPage_Network,
     75        VMSettingsPage_Ports,
     76        VMSettingsPage_Serial,
     77        VMSettingsPage_Parallel,
     78        VMSettingsPage_USB,
     79        VMSettingsPage_SF,
     80        VMSettingsPage_MAX
    8781    };
    8882
    89     VBoxVMSettingsDlg (QWidget *aParent, const CMachine &aMachine,
    90                        const QString &aCategory, const QString &aControl);
     83    UIVMSettingsDlg(QWidget *pParent, const CMachine &machine,
     84                    const QString &strCategory, const QString &strControl);
    9185
    9286protected:
     
    9791    void retranslateUi();
    9892
    99     QString dialogTitle() const;
     93    QString title() const;
    10094
    101     bool correlate (QWidget *aPage, QString &aWarning);
     95    bool recorrelate(QWidget *pPage, QString &strWarning);
    10296
    10397private slots:
    10498
    105     void onMediaEnumerationDone();
    106     void resetFirstRunFlag();
     99    void sltAllowResetFirstRunFlag();
     100    void sltResetFirstRunFlag();
    107101
    108102private:
    109103
    110     bool isAvailable (VMSettingsPageIds aId);
     104    bool isAvailable(int id);
    111105
    112     CMachine mMachine;
    113     bool mAllowResetFirstRunFlag;
    114     bool mResetFirstRunFlag;
     106    CMachine m_machine;
     107    bool m_fAllowResetFirstRunFlag;
     108    bool m_fResetFirstRunFlag;
    115109};
    116110
    117 #endif // __VBoxSettingsDialogSpecific_h__
     111#endif // __UISettingsDialogSpecific_h__
    118112
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