VirtualBox

Changeset 84217 in vbox


Ignore:
Timestamp:
May 8, 2020 2:49:50 PM (4 years ago)
Author:
vboxsync
Message:

FE/Qt: bugref:9653: VirtualBox Manager: Make it possible to terminate stopped cloud VM instance.

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

Legend:

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

    r83859 r84217  
    10901090};
    10911091
    1092 /** Simple action extension, used as 'Perform Discard' action class. */
    1093 class UIActionSimpleSelectorCommonPerformDiscard : public UIActionSimple
     1092/** Polymorphic menu action extension, used as 'Perform Discard' action class. */
     1093class UIActionSimpleSelectorCommonPerformDiscard : public UIActionPolymorphicMenu
    10941094{
    10951095    Q_OBJECT;
     
    10991099    /** Constructs action passing @a pParent to the base-class. */
    11001100    UIActionSimpleSelectorCommonPerformDiscard(UIActionPool *pParent)
    1101         : UIActionSimple(pParent,
    1102                          ":/vm_discard_32px.png", ":/vm_discard_16px.png",
    1103                          ":/vm_discard_disabled_32px.png", ":/vm_discard_disabled_16px.png")
    1104     {}
     1101        : UIActionPolymorphicMenu(pParent,
     1102                                  ":/vm_discard_32px.png", ":/vm_discard_16px.png",
     1103                                  ":/vm_discard_disabled_32px.png", ":/vm_discard_disabled_16px.png")
     1104    {
     1105        /* Hide menu always: */
     1106        hideMenu();
     1107    }
    11051108
    11061109protected:
     
    11151118    virtual void retranslateUi() /* override */
    11161119    {
    1117         setIconText(QApplication::translate("UIActionPool", "Discard"));
    1118         setName(QApplication::translate("UIActionPool", "D&iscard Saved State..."));
    1119         setStatusTip(QApplication::translate("UIActionPool", "Discard saved state of selected virtual machines"));
    1120         setToolTip(simplifyText(text()) + (shortcut().isEmpty() ? QString() : QString(" (%1)").arg(shortcut().toString())));
     1120        switch (state())
     1121        {
     1122            case 0:
     1123            {
     1124                setIconText(QApplication::translate("UIActionPool", "Discard"));
     1125                setName(QApplication::translate("UIActionPool", "D&iscard Saved State..."));
     1126                setStatusTip(QApplication::translate("UIActionPool", "Discard saved state of selected virtual machines"));
     1127                setToolTip(simplifyText(text()) + (shortcut().isEmpty() ? QString() : QString(" (%1)").arg(shortcut().toString())));
     1128                break;
     1129            }
     1130            case 1:
     1131            {
     1132                setIconText(QApplication::translate("UIActionPool", "Terminate"));
     1133                setName(QApplication::translate("UIActionPool", "&Terminate Cloud Instance..."));
     1134                setStatusTip(QApplication::translate("UIActionPool", "Terminate cloud instance of selected virtual machines"));
     1135                setToolTip(simplifyText(text()) + (shortcut().isEmpty() ? QString() : QString(" (%1)").arg(shortcut().toString())));
     1136                break;
     1137            }
     1138            default:
     1139                break;
     1140        }
    11211141    }
    11221142};
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp

    r84184 r84217  
    838838}
    839839
     840bool UIMessageCenter::confirmTerminateCloudInstance(const QString &strNames) const
     841{
     842    return questionBinary(0, MessageType_Question,
     843                          tr("<p>Are you sure you want to terminate the cloud instance "
     844                             "of the following virtual machines?</p><p><b>%1</b></p>")
     845                             .arg(strNames),
     846                          0 /* auto-confirm id */,
     847                          tr("Terminate", "cloud instance"));
     848}
     849
    840850bool UIMessageCenter::confirmResetMachine(const QString &strNames) const
    841851{
     
    892902             .arg(CMachine(machine).GetName()),
    893903          UIErrorString::formatErrorInfo(machine));
     904}
     905
     906void UIMessageCenter::cannotTerminateCloudInstance(const CCloudMachine &comMachine) const
     907{
     908    error(0, MessageType_Error,
     909          tr("Failed to terminate the cloud instance of the virtual machine <b>%1</b>.")
     910             .arg(CCloudMachine(comMachine).GetName()),
     911          UIErrorString::formatErrorInfo(comMachine));
     912}
     913
     914void UIMessageCenter::cannotTerminateCloudInstance(const CProgress &comProgress, const QString &strMachineName) const
     915{
     916    error(0, MessageType_Error,
     917          tr("Failed to terminate the cloud instance of the virtual machine <b>%1</b>.")
     918             .arg(strMachineName),
     919          UIErrorString::formatErrorInfo(comProgress));
    894920}
    895921
  • trunk/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h

    r84184 r84217  
    281281    bool warnAboutInaccessibleMedia() const;
    282282    bool confirmDiscardSavedState(const QString &strNames) const;
     283    bool confirmTerminateCloudInstance(const QString &strNames) const;
    283284    bool confirmResetMachine(const QString &strNames) const;
    284285    bool confirmACPIShutdownMachine(const QString &strNames) const;
     
    287288    void cannotResumeMachine(const CConsole &console) const;
    288289    void cannotDiscardSavedState(const CMachine &machine) const;
     290    void cannotTerminateCloudInstance(const CCloudMachine &comMachine) const;
     291    void cannotTerminateCloudInstance(const CProgress &comProgress, const QString &strMachineName) const;
    289292    void cannotSaveMachineState(const CMachine &machine);
    290293    void cannotSaveMachineState(const CProgress &progress, const QString &strMachineName);
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualBoxManager.cpp

    r84189 r84217  
    2626#include "UIActionPoolManager.h"
    2727#include "UICloudMachineSettingsDialog.h"
     28#include "UICloudNetworkingStuff.h"
    2829#include "UICloudProfileManager.h"
    2930#include "UIDesktopServices.h"
     
    760761    AssertMsgReturnVoid(!items.isEmpty(), ("At least one item should be selected!\n"));
    761762
    762     /* Prepare the list of the machines to be discarded: */
    763     QStringList machineNames;
     763    /* Prepare the list of the machines to be discarded/terminated: */
     764    QStringList machinesToDiscard;
     765    QStringList machinesToTerminate;
    764766    QList<UIVirtualMachineItem*> itemsToDiscard;
     767    QList<UIVirtualMachineItem*> itemsToTerminate;
    765768    foreach (UIVirtualMachineItem *pItem, items)
    766769    {
    767770        if (isActionEnabled(UIActionIndexST_M_Group_S_Discard, QList<UIVirtualMachineItem*>() << pItem))
    768771        {
    769             machineNames << pItem->name();
    770             itemsToDiscard << pItem;
    771         }
    772     }
    773     AssertMsg(!machineNames.isEmpty(), ("This action should not be allowed!"));
    774 
    775     /* Confirm discarding saved VM state: */
    776     if (!msgCenter().confirmDiscardSavedState(machineNames.join(", ")))
     772            if (pItem->itemType() == UIVirtualMachineItemType_Local)
     773            {
     774                machinesToDiscard << pItem->name();
     775                itemsToDiscard << pItem;
     776            }
     777            else if (pItem->itemType() == UIVirtualMachineItemType_CloudReal)
     778            {
     779                machinesToTerminate << pItem->name();
     780                itemsToTerminate << pItem;
     781            }
     782        }
     783    }
     784    AssertMsg(!machinesToDiscard.isEmpty() || !machinesToTerminate.isEmpty(), ("This action should not be allowed!"));
     785
     786    /* Confirm discarding/terminating: */
     787    if (   (machinesToDiscard.isEmpty() || !msgCenter().confirmDiscardSavedState(machinesToDiscard.join(", ")))
     788        && (machinesToTerminate.isEmpty() || !msgCenter().confirmTerminateCloudInstance(machinesToTerminate.join(", "))))
    777789        return;
    778790
    779     /* For every confirmed item: */
     791    /* For every confirmed item to discard: */
    780792    foreach (UIVirtualMachineItem *pItem, itemsToDiscard)
    781793    {
    782794        /* Open a session to modify VM: */
     795        AssertPtrReturnVoid(pItem);
    783796        CSession comSession = uiCommon().openSession(pItem->id());
    784797        if (comSession.isNull())
     
    793806        /* Unlock machine finally: */
    794807        comSession.UnlockMachine();
     808    }
     809
     810    /* For every confirmed item to terminate: */
     811    foreach (UIVirtualMachineItem *pItem, itemsToTerminate)
     812    {
     813        /* Get cloud machine: */
     814        AssertPtrReturnVoid(pItem);
     815        UIVirtualMachineItemCloud *pCloudItem = pItem->toCloud();
     816        AssertPtrReturnVoid(pCloudItem);
     817        CCloudMachine comMachine = pCloudItem->machine();
     818
     819        /* Acquire machine name: */
     820        QString strName;
     821        if (!cloudMachineName(comMachine, strName))
     822            continue;
     823
     824        /* Prepare terminate cloud instance progress: */
     825        CProgress comProgress = comMachine.Terminate();
     826        if (!comMachine.isOk())
     827        {
     828            msgCenter().cannotTerminateCloudInstance(comMachine);
     829            continue;
     830        }
     831
     832        /* Show terminate cloud instance progress: */
     833        msgCenter().showModalProgressDialog(comProgress, strName, ":/progress_media_delete_90px.png"); /// @todo use proper icon
     834        if (!comProgress.isOk() || comProgress.GetResultCode() != 0)
     835            msgCenter().cannotTerminateCloudInstance(comProgress, strName);
    795836    }
    796837}
     
    18871928    UIVirtualMachineItem *pItem = currentItem();
    18881929
     1930    /* Discard/Terminate action is deremined by 1st item: */
     1931    if (   pItem
     1932        && (   pItem->itemType() == UIVirtualMachineItemType_CloudFake
     1933            || pItem->itemType() == UIVirtualMachineItemType_CloudReal))
     1934    {
     1935        actionPool()->action(UIActionIndexST_M_Group_S_Discard)->toActionPolymorphicMenu()->setState(1);
     1936        actionPool()->action(UIActionIndexST_M_Machine_S_Discard)->toActionPolymorphicMenu()->setState(1);
     1937    }
     1938    else
     1939    {
     1940        actionPool()->action(UIActionIndexST_M_Group_S_Discard)->toActionPolymorphicMenu()->setState(0);
     1941        actionPool()->action(UIActionIndexST_M_Machine_S_Discard)->toActionPolymorphicMenu()->setState(0);
     1942    }
     1943
    18891944    /* Start/Show action is deremined by 1st item: */
    18901945    if (pItem && pItem->accessible())
  • trunk/src/VBox/Frontends/VirtualBox/src/manager/UIVirtualMachineItemCloud.cpp

    r84201 r84217  
    185185bool UIVirtualMachineItemCloud::isItemSaved() const
    186186{
    187     return false;
     187    return    accessible()
     188           && machineState() == KCloudMachineState_Stopped;
    188189}
    189190
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette