VirtualBox

Changeset 80139 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Aug 5, 2019 6:21:53 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132580
Message:

FE/Qt: bugref:7720: VirtualBox Manager: Details pane: Possibility to edit VM USB controller type on-the-fly.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIDetailsGenerator.cpp

    r80129 r80139  
    726726    if (!comFilterObject.isNull() && comMachine.GetUSBProxyAvailable())
    727727    {
     728        const QString strAnchorType = QString("usb_controller_type");
    728729        const CUSBControllerVector controllers = comMachine.GetUSBControllers();
    729730        if (!controllers.isEmpty())
     
    732733            if (fOptions & UIExtraDataMetaDefs::DetailsElementOptionTypeUsb_Controller)
    733734            {
     735                QStringList controllerInternal;
    734736                QStringList controllersReadable;
    735737                foreach (const CUSBController &comController, controllers)
    736                     controllersReadable << gpConverter->toString(comController.GetType());
     738                {
     739                    const KUSBControllerType enmType = comController.GetType();
     740                    controllerInternal << QString::number((int)enmType);
     741                    controllersReadable << gpConverter->toString(enmType);
     742                }
    737743                table << UITextTableLine(QApplication::translate("UIDetails", "USB Controller", "details (usb)"),
    738                                          controllersReadable.join(", "));
     744                                         QString("<a href=#%1,%2>%3</a>")
     745                                             .arg(strAnchorType)
     746                                             .arg(controllerInternal.join(';'))
     747                                             .arg(controllersReadable.join(", ")));
    739748            }
    740749
     
    752761        }
    753762        else
    754             table << UITextTableLine(QApplication::translate("UIDetails", "Disabled", "details (usb)"), QString());
     763            table << UITextTableLine(QString("<a href=#%1,%2>%3</a>")
     764                                         .arg(strAnchorType)
     765                                         .arg(QString::number((int)KUSBControllerType_Null))
     766                                         .arg(QApplication::translate("UIDetails", "Disabled", "details (usb)")),
     767                                     QString());
    755768    }
    756769    else
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMachineAttributeSetter.cpp

    r80083 r80139  
    2727/* COM includes: */
    2828#include "CAudioAdapter.h"
    29 
     29#include "CUSBController.h"
     30
     31
     32void removeUSBControllers(CMachine &comMachine, const UIUSBControllerTypeSet &controllerSet = UIUSBControllerTypeSet())
     33{
     34    /* Get controllers for further activities: */
     35    const CUSBControllerVector &controllers = comMachine.GetUSBControllers();
     36    if (!comMachine.isOk())
     37        return;
     38
     39    /* For each controller: */
     40    foreach (const CUSBController &comController, controllers)
     41    {
     42        /* Get controller type&name for further activities: */
     43        const KUSBControllerType enmType = comController.GetType();
     44        const QString strName = comController.GetName();
     45
     46        /* Pass only if requested types were not defined or contains the one we found: */
     47        if (!controllerSet.isEmpty() && !controllerSet.contains(enmType))
     48            continue;
     49
     50        /* Remove controller: */
     51        comMachine.RemoveUSBController(strName);
     52        if (!comMachine.isOk())
     53            break;
     54    }
     55}
     56
     57void createUSBControllers(CMachine &comMachine, const UIUSBControllerTypeSet &controllerSet)
     58{
     59    /* For each requested USB controller type: */
     60    foreach (const KUSBControllerType &enmType, controllerSet)
     61    {
     62        switch (enmType)
     63        {
     64            case KUSBControllerType_OHCI: comMachine.AddUSBController("OHCI", KUSBControllerType_OHCI); break;
     65            case KUSBControllerType_EHCI: comMachine.AddUSBController("EHCI", KUSBControllerType_EHCI); break;
     66            case KUSBControllerType_XHCI: comMachine.AddUSBController("xHCI", KUSBControllerType_XHCI); break;
     67            default: break;
     68        }
     69    }
     70}
    3071
    3172void UIMachineAttributeSetter::setMachineAttribute(const CMachine &comConstMachine,
     
    174215                break;
    175216            }
     217            case MachineAttribute_USBControllerType:
     218            {
     219                /* Remove all existing controller first of all: */
     220                removeUSBControllers(comMachine);
     221                if (!comMachine.isOk())
     222                {
     223                    msgCenter().cannotChangeMachineAttribute(comMachine);
     224                    fErrorHappened = true;
     225                    break;
     226                }
     227                /* Add new controllers afterwards: */
     228                const UIUSBControllerTypeSet controllerSet = guiAttribute.value<UIUSBControllerTypeSet>();
     229                if (!controllerSet.contains(KUSBControllerType_Null))
     230                {
     231                    createUSBControllers(comMachine, controllerSet);
     232                    if (!comMachine.isOk())
     233                    {
     234                        msgCenter().cannotChangeMachineAttribute(comMachine);
     235                        fErrorHappened = true;
     236                    }
     237                }
     238                break;
     239            }
    176240            default:
    177241                break;
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMachineAttributeSetter.h

    r80083 r80139  
    3939    MachineAttribute_AudioHostDriverType,
    4040    MachineAttribute_AudioControllerType,
     41    MachineAttribute_USBControllerType,
    4142};
     43
     44/** A set of USB controller types. */
     45typedef QSet<KUSBControllerType> UIUSBControllerTypeSet;
     46Q_DECLARE_METATYPE(UIUSBControllerTypeSet);
    4247
    4348/** Namespace used to assign CMachine attributes on more convenient basis. */
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/details/UIDetailsElement.cpp

    r80131 r80139  
    6262    AnchorRole_AudioHostDriverType,
    6363    AnchorRole_AudioControllerType,
     64    AnchorRole_USBControllerType,
    6465#ifndef VBOX_WS_MAC
    6566    AnchorRole_MenuBar,
     
    178179    m_pTextPane->setAnchorRoleRestricted("#audio_host_driver_type", cal != ConfigurationAccessLevel_Full);
    179180    m_pTextPane->setAnchorRoleRestricted("#audio_controller_type", cal != ConfigurationAccessLevel_Full);
     181    m_pTextPane->setAnchorRoleRestricted("#usb_controller_type", cal != ConfigurationAccessLevel_Full);
    180182#ifndef VBOX_WS_MAC
    181183    m_pTextPane->setAnchorRoleRestricted("#menu_bar", cal == ConfigurationAccessLevel_Null);
     
    473475    roles["#audio_host_driver_type"] = AnchorRole_AudioHostDriverType;
    474476    roles["#audio_controller_type"] = AnchorRole_AudioControllerType;
     477    roles["#usb_controller_type"] = AnchorRole_USBControllerType;
    475478#ifndef VBOX_WS_MAC
    476479    roles["#menu_bar"] = AnchorRole_MenuBar;
     
    758761            break;
    759762        }
     763        case AnchorRole_USBControllerType:
     764        {
     765            /* Parse controller type list: */
     766            UIUSBControllerTypeSet controllerSet;
     767            const QStringList controllerInternals = strData.section(',', 0, 0).split(';');
     768            foreach (const QString &strControllerType, controllerInternals)
     769            {
     770                /* Parse each internal controller description: */
     771                bool fParsed = false;
     772                KUSBControllerType enmType = static_cast<KUSBControllerType>(strControllerType.toInt(&fParsed));
     773                if (!fParsed)
     774                    enmType = KUSBControllerType_Null;
     775                controllerSet << enmType;
     776            }
     777
     778            /* Prepare existing controller sets: */
     779            QMap<int, UIUSBControllerTypeSet> controllerSets;
     780            controllerSets[0] = UIUSBControllerTypeSet();
     781            controllerSets[1] = UIUSBControllerTypeSet() << KUSBControllerType_OHCI;
     782            controllerSets[2] = UIUSBControllerTypeSet() << KUSBControllerType_OHCI << KUSBControllerType_EHCI;
     783            controllerSets[3] = UIUSBControllerTypeSet() << KUSBControllerType_XHCI;
     784
     785            /* Fill menu with actions: */
     786            UIMenu menu;
     787            QActionGroup group(&menu);
     788            QMap<int, QAction*> actions;
     789            actions[0] = menu.addAction(QApplication::translate("UIDetails", "Disabled", "details (usb)"));
     790            group.addAction(actions.value(0));
     791            actions.value(0)->setCheckable(true);
     792            actions[1] = menu.addAction(QApplication::translate("UIDetails", "USB 1.1 (OHCI) Controller", "details (usb)"));
     793            group.addAction(actions.value(1));
     794            actions.value(1)->setCheckable(true);
     795            actions[2] = menu.addAction(QApplication::translate("UIDetails", "USB 2.0 (OHCI + EHCI) Controller", "details (usb)"));
     796            group.addAction(actions.value(2));
     797            actions.value(2)->setCheckable(true);
     798            actions[3] = menu.addAction(QApplication::translate("UIDetails", "USB 3.0 (xHCI) Controller", "details (usb)"));
     799            group.addAction(actions.value(3));
     800            actions.value(3)->setCheckable(true);
     801
     802            /* Mark current one: */
     803            for (int i = 0; i <= 3; ++i)
     804                actions.value(i)->setChecked(controllerSets.key(controllerSet) == i);
     805
     806            /* Execute menu, look for result: */
     807            QAction *pTriggeredAction = menu.exec(QCursor::pos());
     808            if (pTriggeredAction)
     809            {
     810                const int iTriggeredIndex = actions.key(pTriggeredAction);
     811                if (controllerSets.key(controllerSet) != iTriggeredIndex)
     812                    setMachineAttribute(machine(), MachineAttribute_USBControllerType, QVariant::fromValue(controllerSets.value(iTriggeredIndex)));
     813            }
     814            break;
     815        }
    760816#ifndef VBOX_WS_MAC
    761817        case AnchorRole_MenuBar:
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