VirtualBox

Changeset 101606 in vbox


Ignore:
Timestamp:
Oct 26, 2023 2:09:03 PM (19 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
159690
Message:

FE/Qt: bugref:10513: Machine settings / Serial page: Reworking editor embedding, it's more simple now and similar to other pages.

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

Legend:

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

    r101595 r101606  
    10811081        src/settings/editors/UIStorageSettingsEditor.cpp \
    10821082        src/settings/editors/UIUSBFiltersEditor.cpp \
    1083         src/settings/machine/UIMachineSettingsSerial.cpp \
    10841083        src/widgets/UIAddDiskEncryptionPasswordDialog.cpp \
    10851084        src/widgets/UIFileTableNavigationWidget.cpp \
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp

    r101604 r101606  
    105105
    106106
    107 /** Machine settings: Serial Port tab. */
    108 class UIMachineSettingsSerial : public UIEditor
    109 {
    110     Q_OBJECT;
    111 
    112 signals:
    113 
    114     /** Notifies about port changed. */
    115     void sigPortChanged();
    116 
    117     /** Notifies about path changed. */
    118     void sigPathChanged();
    119 
    120     /** Notifies about validity changed. */
    121     void sigValidityChanged();
    122 
    123 public:
    124 
    125     /** Constructs tab passing @a pParent to the base-class.
    126       * @param  pParentPage  Holds the parent page reference allowing to access some of API there. */
    127     UIMachineSettingsSerial(UIEditor *pParent, UIMachineSettingsSerialPage *pParentPage);
    128 
    129     /** Loads port data from @a portCache. */
    130     void getPortDataFromCache(const UISettingsCacheMachineSerialPort &portCache);
    131     /** Saves port data to @a portCache. */
    132     void putPortDataToCache(UISettingsCacheMachineSerialPort &portCache);
    133 
    134     /** Performs validation, updates @a messages list if something is wrong. */
    135     bool validate(QList<UIValidationMessage> &messages);
    136 
    137     /** Configures tab order according to passed @a pWidget. */
    138     QWidget *setOrderAfter(QWidget *pWidget);
    139 
    140     /** Returns tab title. */
    141     QString tabTitle() const;
    142     /** Returns whether port is enabled. */
    143     bool isPortEnabled() const;
    144     /** Returns IRQ. */
    145     QString irq() const;
    146     /** Returns IO address. */
    147     QString ioAddress() const;
    148     /** Returns path. */
    149     QString path() const;
    150 
    151     /** Performs tab polishing. */
    152     void polishTab();
    153 
    154 protected:
    155 
    156     /** Handles translation event. */
    157     void retranslateUi() {}
    158 
    159 private:
    160 
    161     /** Prepares all. */
    162     void prepare();
    163     /** Prepares widgets. */
    164     void prepareWidgets();
    165     /** Prepares connections. */
    166     void prepareConnections();
    167 
    168     /** Holds the parent page reference. */
    169     UIMachineSettingsSerialPage *m_pParentPage;
    170 
    171     /** Holds the port slot number. */
    172     int  m_iSlot;
    173 
    174     /** Holds the serial settings editor instance. */
    175     UISerialSettingsEditor *m_pEditorSerialSettings;
    176 };
    177 
    178 
    179 /*********************************************************************************************************************************
    180 *   Class UIMachineSettingsSerial implementation.                                                                                *
    181 *********************************************************************************************************************************/
    182 
    183 UIMachineSettingsSerial::UIMachineSettingsSerial(UIEditor *pParent, UIMachineSettingsSerialPage *pParentPage)
    184     : UIEditor(pParent)
    185     , m_pParentPage(pParentPage)
    186     , m_iSlot(-1)
    187     , m_pEditorSerialSettings(0)
    188 {
    189     prepare();
    190 }
    191 
    192 void UIMachineSettingsSerial::getPortDataFromCache(const UISettingsCacheMachineSerialPort &portCache)
    193 {
    194     /* Get old data: */
    195     const UIDataSettingsMachineSerialPort &oldPortData = portCache.base();
    196 
    197     /* Load port number: */
    198     m_iSlot = oldPortData.m_iSlot;
    199 
    200     if (m_pEditorSerialSettings)
    201     {
    202         /* Load port data: */
    203         m_pEditorSerialSettings->setPortByIRQAndIOAddress(oldPortData.m_uIRQ, oldPortData.m_uIOAddress);
    204         m_pEditorSerialSettings->setIRQ(oldPortData.m_uIRQ);
    205         m_pEditorSerialSettings->setIOAddress(oldPortData.m_uIOAddress);
    206         m_pEditorSerialSettings->setHostMode(oldPortData.m_hostMode);
    207         m_pEditorSerialSettings->setServerEnabled(oldPortData.m_fServer);
    208         m_pEditorSerialSettings->setPath(oldPortData.m_strPath);
    209         // Should be done in th end to finalize availability:
    210         m_pEditorSerialSettings->setPortEnabled(oldPortData.m_fPortEnabled);
    211     }
    212 }
    213 
    214 void UIMachineSettingsSerial::putPortDataToCache(UISettingsCacheMachineSerialPort &portCache)
    215 {
    216     /* Prepare new data: */
    217     UIDataSettingsMachineSerialPort newPortData;
    218 
    219     /* Save port number: */
    220     newPortData.m_iSlot = m_iSlot;
    221 
    222     if (m_pEditorSerialSettings)
    223     {
    224         /* Save port data: */
    225         newPortData.m_fPortEnabled = m_pEditorSerialSettings->isPortEnabled();
    226         newPortData.m_uIRQ = m_pEditorSerialSettings->irq();
    227         newPortData.m_uIOAddress = m_pEditorSerialSettings->ioAddress();
    228         newPortData.m_fServer = m_pEditorSerialSettings->isServerEnabled();
    229         newPortData.m_hostMode = m_pEditorSerialSettings->hostMode();
    230         newPortData.m_strPath = m_pEditorSerialSettings->path();
    231     }
    232 
    233     /* Cache new data: */
    234     portCache.cacheCurrentData(newPortData);
    235 }
    236 
    237 bool UIMachineSettingsSerial::validate(QList<UIValidationMessage> &messages)
    238 {
    239     /* Pass by default: */
    240     bool fPass = true;
    241 
    242     /* Prepare message: */
    243     UIValidationMessage message;
    244     message.first = UITranslator::removeAccelMark(tabTitle());
    245 
    246     /* Validate enabled port only: */
    247     if (   m_pEditorSerialSettings
    248         && m_pEditorSerialSettings->isPortEnabled())
    249     {
    250         /* Check the port attribute emptiness & uniqueness: */
    251         const QString strIRQ = irq();
    252         const QString strIOAddress = ioAddress();
    253         const QPair<QString, QString> port = qMakePair(strIRQ, strIOAddress);
    254 
    255         if (strIRQ.isEmpty())
    256         {
    257             message.second << UIMachineSettingsSerial::tr("No IRQ is currently specified.");
    258             fPass = false;
    259         }
    260         if (strIOAddress.isEmpty())
    261         {
    262             message.second << UIMachineSettingsSerial::tr("No I/O port is currently specified.");
    263             fPass = false;
    264         }
    265         if (   !strIRQ.isEmpty()
    266             && !strIOAddress.isEmpty())
    267         {
    268             QVector<QPair<QString, QString> > ports;
    269             if (m_pParentPage)
    270             {
    271                 ports = m_pParentPage->ports();
    272                 ports.removeAt(m_iSlot);
    273             }
    274             if (ports.contains(port))
    275             {
    276                 message.second << UIMachineSettingsSerial::tr("Two or more ports have the same settings.");
    277                 fPass = false;
    278             }
    279         }
    280 
    281         const KPortMode enmMode = m_pEditorSerialSettings->hostMode();
    282         if (enmMode != KPortMode_Disconnected)
    283         {
    284             const QString strPath = m_pEditorSerialSettings->path();
    285 
    286             if (strPath.isEmpty())
    287             {
    288                 message.second << UIMachineSettingsSerial::tr("No port path is currently specified.");
    289                 fPass = false;
    290             }
    291             else
    292             {
    293                 QVector<QString> paths;
    294                 if (m_pParentPage)
    295                 {
    296                     paths = m_pParentPage->paths();
    297                     paths.removeAt(m_iSlot);
    298                 }
    299                 if (paths.contains(strPath))
    300                 {
    301                     message.second << UIMachineSettingsSerial::tr("There are currently duplicate port paths specified.");
    302                     fPass = false;
    303                 }
    304             }
    305         }
    306     }
    307 
    308     /* Serialize message: */
    309     if (!message.second.isEmpty())
    310         messages << message;
    311 
    312     /* Return result: */
    313     return fPass;
    314 }
    315 
    316 QWidget *UIMachineSettingsSerial::setOrderAfter(QWidget *pWidget)
    317 {
    318     setTabOrder(pWidget, m_pEditorSerialSettings);
    319     return m_pEditorSerialSettings;
    320 }
    321 
    322 QString UIMachineSettingsSerial::tabTitle() const
    323 {
    324     return QString(tr("Port %1", "serial ports")).arg(QString("&%1").arg(m_iSlot + 1));
    325 }
    326 
    327 bool UIMachineSettingsSerial::isPortEnabled() const
    328 {
    329     return m_pEditorSerialSettings->isPortEnabled();
    330 }
    331 
    332 QString UIMachineSettingsSerial::irq() const
    333 {
    334     return QString::number(m_pEditorSerialSettings->irq());
    335 }
    336 
    337 QString UIMachineSettingsSerial::ioAddress() const
    338 {
    339     return QString::number(m_pEditorSerialSettings->ioAddress());
    340 }
    341 
    342 QString UIMachineSettingsSerial::path() const
    343 {
    344     return m_pEditorSerialSettings->path();
    345 }
    346 
    347 void UIMachineSettingsSerial::polishTab()
    348 {
    349     if (   m_pEditorSerialSettings
    350         && m_pParentPage)
    351     {
    352         /* Polish port page: */
    353         const bool fStd = m_pEditorSerialSettings->isPortStandardOne();
    354         const KPortMode enmMode = m_pEditorSerialSettings->hostMode();
    355         m_pEditorSerialSettings->setPortOptionsAvailable(m_pParentPage->isMachineOffline());
    356         m_pEditorSerialSettings->setIRQAndIOAddressOptionsAvailable(!fStd && m_pParentPage->isMachineOffline());
    357         m_pEditorSerialSettings->setHostModeOptionsAvailable(m_pParentPage->isMachineOffline());
    358         m_pEditorSerialSettings->setPipeOptionsAvailable(   (enmMode == KPortMode_HostPipe || enmMode == KPortMode_TCP)
    359                                                          && m_pParentPage->isMachineOffline());
    360         m_pEditorSerialSettings->setPathOptionsAvailable(   enmMode != KPortMode_Disconnected
    361                                                          && m_pParentPage->isMachineOffline());
    362     }
    363 }
    364 
    365 void UIMachineSettingsSerial::prepare()
    366 {
    367     /* Prepare everything: */
    368     prepareWidgets();
    369     prepareConnections();
    370 
    371     /* Apply language settings: */
    372     retranslateUi();
    373 }
    374 
    375 void UIMachineSettingsSerial::prepareWidgets()
    376 {
    377     /* Prepare main layout: */
    378     QVBoxLayout *pLayout = new QVBoxLayout(this);
    379     if (pLayout)
    380     {
    381         pLayout->setContentsMargins(0, 0, 0, 0);
    382 
    383         /* Prepare settings editor: */
    384         m_pEditorSerialSettings = new UISerialSettingsEditor(this);
    385         if (m_pEditorSerialSettings)
    386         {
    387             addEditor(m_pEditorSerialSettings);
    388             pLayout->addWidget(m_pEditorSerialSettings);
    389         }
    390 
    391         pLayout->addStretch();
    392     }
    393 }
    394 
    395 void UIMachineSettingsSerial::prepareConnections()
    396 {
    397     if (m_pEditorSerialSettings)
    398     {
    399         connect(m_pEditorSerialSettings, &UISerialSettingsEditor::sigPortAvailabilityChanged,
    400                 this, &UIMachineSettingsSerial::sigPortChanged);
    401         connect(m_pEditorSerialSettings, &UISerialSettingsEditor::sigPortAvailabilityChanged,
    402                 this, &UIMachineSettingsSerial::sigPathChanged);
    403         connect(m_pEditorSerialSettings, &UISerialSettingsEditor::sigStandardPortOptionChanged,
    404                 this, &UIMachineSettingsSerial::sigValidityChanged);
    405         connect(m_pEditorSerialSettings, &UISerialSettingsEditor::sigPortIRQChanged,
    406                 this, &UIMachineSettingsSerial::sigPortChanged);
    407         connect(m_pEditorSerialSettings, &UISerialSettingsEditor::sigPortIOAddressChanged,
    408                 this, &UIMachineSettingsSerial::sigPortChanged);
    409         connect(m_pEditorSerialSettings, &UISerialSettingsEditor::sigModeChanged,
    410                 this, &UIMachineSettingsSerial::sigValidityChanged);
    411         connect(m_pEditorSerialSettings, &UISerialSettingsEditor::sigPathChanged,
    412                 this, &UIMachineSettingsSerial::sigPathChanged);
    413     }
    414 }
    415 
    416 
    417107/*********************************************************************************************************************************
    418108*   Class UIMachineSettingsSerialPage implementation.                                                                            *
     
    494184        return;
    495185
    496     /* Setup tab order: */
    497     AssertPtrReturnVoid(firstWidget());
    498     setTabOrder(firstWidget(), m_pTabWidget->focusProxy());
    499     QWidget *pLastFocusWidget = m_pTabWidget->focusProxy();
    500 
    501     /* For each port: */
    502     for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
    503     {
    504         /* Get port page: */
    505         UIMachineSettingsSerial *pTabEditor = m_tabEditors.at(iSlot);
    506         AssertPtrReturnVoid(pTabEditor);
    507 
    508         /* Load old data from cache: */
    509         pTabEditor->getPortDataFromCache(m_pCache->child(iSlot));
    510 
    511         /* Setup tab order: */
    512         pLastFocusWidget = pTabEditor->setOrderAfter(pLastFocusWidget);
    513     }
     186    /* Load old data from cache: */
     187    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
     188        getFromCache(iSlot, m_pCache->child(iSlot));
    514189
    515190    /* Apply language settings: */
     
    533208    UIDataSettingsMachineSerial newSerialData;
    534209
    535     /* For each port: */
    536     for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
    537     {
    538         /* Getting port page: */
    539         UIMachineSettingsSerial *pTabEditor = m_tabEditors.at(iSlot);
    540         AssertPtrReturnVoid(pTabEditor);
    541 
    542         /* Gather new data: */
    543         pTabEditor->putPortDataToCache(m_pCache->child(iSlot));
    544     }
     210    /* Gather new data to cache: */
     211    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
     212        putToCache(iSlot, m_pCache->child(iSlot));
    545213
    546214    /* Cache new data: */
     
    571239    /* Delegate validation to adapter tabs: */
    572240    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
    573     {
    574         UIMachineSettingsSerial *pTabEditor = m_tabEditors.at(iSlot);
    575         AssertPtrReturn(pTabEditor, false);
    576         if (!pTabEditor->validate(messages))
     241        if (!validate(iSlot, messages))
    577242            fValid = false;
    578     }
    579243
    580244    /* Return result: */
     
    589253
    590254    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
    591     {
    592         UIMachineSettingsSerial *pTabEditor = m_tabEditors.at(iSlot);
    593         AssertPtrReturnVoid(pTabEditor);
    594         m_pTabWidget->setTabText(iSlot, pTabEditor->tabTitle());
    595     }
     255        m_pTabWidget->setTabText(iSlot, tabTitle(iSlot));
    596256}
    597257
     
    610270                                     m_pCache->childCount() > iSlot &&
    611271                                     m_pCache->child(iSlot).base().m_fPortEnabled));
    612         UIMachineSettingsSerial *pTabEditor = m_tabEditors.at(iSlot);
    613         AssertPtrReturnVoid(pTabEditor);
    614         pTabEditor->polishTab();
     272        polishTab(iSlot);
    615273    }
    616274}
     
    681339
    682340            /* Create port tab-editor: */
    683             UIMachineSettingsSerial *pEditor = new UIMachineSettingsSerial(pTab, this);
     341            UISerialSettingsEditor *pEditor = new UISerialSettingsEditor(this);
    684342            if (pEditor)
    685343            {
     
    698356}
    699357
    700 void UIMachineSettingsSerialPage::prepareConnections(UIMachineSettingsSerial *pTabEditor)
     358void UIMachineSettingsSerialPage::prepareConnections(UISerialSettingsEditor *pTabEditor)
    701359{
    702360    /* Tab connections: */
    703     connect(pTabEditor, &UIMachineSettingsSerial::sigPortChanged,
     361    connect(pTabEditor, &UISerialSettingsEditor::sigPortAvailabilityChanged,
    704362            this, &UIMachineSettingsSerialPage::sltHandlePortChange);
    705     connect(pTabEditor, &UIMachineSettingsSerial::sigPathChanged,
     363    connect(pTabEditor, &UISerialSettingsEditor::sigPortAvailabilityChanged,
    706364            this, &UIMachineSettingsSerialPage::sltHandlePathChange);
    707     connect(pTabEditor, &UIMachineSettingsSerial::sigValidityChanged,
     365    connect(pTabEditor, &UISerialSettingsEditor::sigStandardPortOptionChanged,
    708366            this, &UIMachineSettingsSerialPage::revalidate);
     367    connect(pTabEditor, &UISerialSettingsEditor::sigPortIRQChanged,
     368            this, &UIMachineSettingsSerialPage::sltHandlePortChange);
     369    connect(pTabEditor, &UISerialSettingsEditor::sigPortIOAddressChanged,
     370            this, &UIMachineSettingsSerialPage::sltHandlePortChange);
     371    connect(pTabEditor, &UISerialSettingsEditor::sigModeChanged,
     372            this, &UIMachineSettingsSerialPage::revalidate);
     373    connect(pTabEditor, &UISerialSettingsEditor::sigPathChanged,
     374            this, &UIMachineSettingsSerialPage::sltHandlePathChange);
    709375}
    710376
     
    714380    delete m_pCache;
    715381    m_pCache = 0;
     382}
     383
     384void UIMachineSettingsSerialPage::polishTab(int iSlot)
     385{
     386    /* Acquire tab-editor: */
     387    UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
     388    AssertPtrReturnVoid(pTabEditor);
     389
     390    /* Polish port page: */
     391    const bool fStd = pTabEditor->isPortStandardOne();
     392    const KPortMode enmMode = pTabEditor->hostMode();
     393    pTabEditor->setPortOptionsAvailable(isMachineOffline());
     394    pTabEditor->setIRQAndIOAddressOptionsAvailable(!fStd && isMachineOffline());
     395    pTabEditor->setHostModeOptionsAvailable(isMachineOffline());
     396    pTabEditor->setPipeOptionsAvailable(   (enmMode == KPortMode_HostPipe || enmMode == KPortMode_TCP)
     397                                        && isMachineOffline());
     398    pTabEditor->setPathOptionsAvailable(   enmMode != KPortMode_Disconnected
     399                                        && isMachineOffline());
     400}
     401
     402void UIMachineSettingsSerialPage::getFromCache(int iSlot, const UISettingsCacheMachineSerialPort &portCache)
     403{
     404    /* Acquire tab-editor: */
     405    UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
     406    AssertPtrReturnVoid(pTabEditor);
     407
     408    /* Get old data: */
     409    const UIDataSettingsMachineSerialPort &oldPortData = portCache.base();
     410
     411    /* Load port data: */
     412    pTabEditor->setPortByIRQAndIOAddress(oldPortData.m_uIRQ, oldPortData.m_uIOAddress);
     413    pTabEditor->setIRQ(oldPortData.m_uIRQ);
     414    pTabEditor->setIOAddress(oldPortData.m_uIOAddress);
     415    pTabEditor->setHostMode(oldPortData.m_hostMode);
     416    pTabEditor->setServerEnabled(oldPortData.m_fServer);
     417    pTabEditor->setPath(oldPortData.m_strPath);
     418    // Should be done in th end to finalize availability:
     419    pTabEditor->setPortEnabled(oldPortData.m_fPortEnabled);
     420}
     421
     422void UIMachineSettingsSerialPage::putToCache(int iSlot, UISettingsCacheMachineSerialPort &portCache)
     423{
     424    /* Acquire tab-editor: */
     425    UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
     426    AssertPtrReturnVoid(pTabEditor);
     427
     428    /* Prepare new data: */
     429    UIDataSettingsMachineSerialPort newPortData;
     430
     431    /* Save port number: */
     432    newPortData.m_iSlot = iSlot;
     433
     434    /* Save port data: */
     435    newPortData.m_fPortEnabled = pTabEditor->isPortEnabled();
     436    newPortData.m_uIRQ = pTabEditor->irq();
     437    newPortData.m_uIOAddress = pTabEditor->ioAddress();
     438    newPortData.m_fServer = pTabEditor->isServerEnabled();
     439    newPortData.m_hostMode = pTabEditor->hostMode();
     440    newPortData.m_strPath = pTabEditor->path();
     441
     442    /* Cache new data: */
     443    portCache.cacheCurrentData(newPortData);
     444}
     445
     446QString UIMachineSettingsSerialPage::irq(int iSlot) const
     447{
     448    /* Acquire tab-editor: */
     449    UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
     450    AssertPtrReturn(pTabEditor, QString());
     451    return QString::number(pTabEditor->irq());
     452}
     453
     454QString UIMachineSettingsSerialPage::ioAddress(int iSlot) const
     455{
     456    /* Acquire tab-editor: */
     457    UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
     458    AssertPtrReturn(pTabEditor, QString());
     459    return QString::number(pTabEditor->ioAddress());
     460}
     461
     462bool UIMachineSettingsSerialPage::validate(int iSlot, QList<UIValidationMessage> &messages)
     463{
     464    /* Acquire tab-editor: */
     465    UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
     466    AssertPtrReturn(pTabEditor, false);
     467
     468    /* Pass by default: */
     469    bool fPass = true;
     470
     471    /* Prepare message: */
     472    UIValidationMessage message;
     473    message.first = UITranslator::removeAccelMark(tabTitle(iSlot));
     474
     475    /* Validate enabled port only: */
     476    if (pTabEditor->isPortEnabled())
     477    {
     478        /* Check the port attribute emptiness & uniqueness: */
     479        const QString strIRQ = irq(iSlot);
     480        const QString strIOAddress = ioAddress(iSlot);
     481        const QPair<QString, QString> port = qMakePair(strIRQ, strIOAddress);
     482
     483        if (strIRQ.isEmpty())
     484        {
     485            message.second << tr("No IRQ is currently specified.");
     486            fPass = false;
     487        }
     488        if (strIOAddress.isEmpty())
     489        {
     490            message.second << tr("No I/O port is currently specified.");
     491            fPass = false;
     492        }
     493        if (   !strIRQ.isEmpty()
     494            && !strIOAddress.isEmpty())
     495        {
     496            QVector<QPair<QString, QString> > currentPorts;
     497            currentPorts = ports();
     498            currentPorts.removeAt(iSlot);
     499            if (currentPorts.contains(port))
     500            {
     501                message.second << tr("Two or more ports have the same settings.");
     502                fPass = false;
     503            }
     504        }
     505
     506        const KPortMode enmMode = pTabEditor->hostMode();
     507        if (enmMode != KPortMode_Disconnected)
     508        {
     509            const QString strPath = pTabEditor->path();
     510
     511            if (strPath.isEmpty())
     512            {
     513                message.second << tr("No port path is currently specified.");
     514                fPass = false;
     515            }
     516            else
     517            {
     518                QVector<QString> currentPaths;
     519                currentPaths = paths();
     520                currentPaths.removeAt(iSlot);
     521                if (currentPaths.contains(strPath))
     522                {
     523                    message.second << tr("There are currently duplicate port paths specified.");
     524                    fPass = false;
     525                }
     526            }
     527        }
     528    }
     529
     530    /* Serialize message: */
     531    if (!message.second.isEmpty())
     532        messages << message;
     533
     534    /* Return result: */
     535    return fPass;
    716536}
    717537
     
    728548    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
    729549    {
    730         UIMachineSettingsSerial *pTabEditor = m_tabEditors.at(iSlot);
     550        UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
    731551        AssertPtrReturnVoid(pTabEditor);
    732         m_ports[iSlot] = pTabEditor->isPortEnabled() ? qMakePair(pTabEditor->irq(), pTabEditor->ioAddress()) : qMakePair(QString(), QString());
     552        m_ports[iSlot] = pTabEditor->isPortEnabled() ? qMakePair(irq(iSlot), ioAddress(iSlot)) : qMakePair(QString(), QString());
    733553    }
    734554}
     
    746566    for (int iSlot = 0; iSlot < m_pTabWidget->count(); ++iSlot)
    747567    {
    748         UIMachineSettingsSerial *pTabEditor = m_tabEditors.at(iSlot);
     568        UISerialSettingsEditor *pTabEditor = m_tabEditors.at(iSlot);
    749569        AssertPtrReturnVoid(pTabEditor);
    750570        m_paths[iSlot] = pTabEditor->isPortEnabled() ? pTabEditor->path() : QString();
    751571    }
     572}
     573
     574/* static */
     575QString UIMachineSettingsSerialPage::tabTitle(int iSlot)
     576{
     577    return QString(tr("Port %1", "serial ports")).arg(QString("&%1").arg(iSlot + 1));
    752578}
    753579
     
    858684    return fSuccess;
    859685}
    860 
    861 # include "UIMachineSettingsSerial.moc"
  • trunk/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h

    r101604 r101606  
    3737/* Forward declarations: */
    3838class QITabWidget;
    39 class UIMachineSettingsSerial;
     39class UISerialSettingsEditor;
    4040struct UIDataSettingsMachineSerial;
    4141struct UIDataSettingsMachineSerialPort;
     
    104104    void prepareTab();
    105105    /** Prepares connections. */
    106     void prepareConnections(UIMachineSettingsSerial *pTabEditor);
     106    void prepareConnections(UISerialSettingsEditor *pTabEditor);
    107107    /** Cleanups all. */
    108108    void cleanup();
     109
     110    /** Performs tab polishing for specified @a iSlot. */
     111    void polishTab(int iSlot);
     112
     113    /** Loads port data for specified @a iSlot from @a portCache to corresponding widgets. */
     114    void getFromCache(int iSlot, const UISettingsCacheMachineSerialPort &portCache);
     115    /** Saves port data for specified @a iSlot from corresponding widgets to @a portCache. */
     116    void putToCache(int iSlot, UISettingsCacheMachineSerialPort &portCache);
     117
     118    /** Returns IRQ for specified @a iSlot. */
     119    QString irq(int iSlot) const;
     120    /** Returns IO address for specified @a iSlot. */
     121    QString ioAddress(int iSlot) const;
     122
     123    /** Performs validation for specified @a iSlot, updates @a messages list if something is wrong. */
     124    bool validate(int iSlot, QList<UIValidationMessage> &messages);
    109125
    110126    /** Repopulates ports. */
     
    112128    /** Repopulates paths. */
    113129    void refreshPaths();
     130
     131    /** Returns tab title for specified @a iSlot. */
     132    static QString tabTitle(int iSlot);
    114133
    115134    /** Saves existing data from cache. */
     
    130149
    131150    /** Holds the list of tab-editors. */
    132     QList<UIMachineSettingsSerial*>  m_tabEditors;
     151    QList<UISerialSettingsEditor*>  m_tabEditors;
    133152};
    134153
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