VirtualBox

source: vbox/trunk/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.cpp@ 100347

Last change on this file since 100347 was 99406, checked in by vboxsync, 2 years ago

FE/Qt: bugref:6669: VirtualBox Manager: A bit of fixes for New VD wizard modal case, s.a. r156827.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1/* $Id: UIWizardNewVD.cpp 99406 2023-04-14 17:04:14Z vboxsync $ */
2/** @file
3 * VBox Qt GUI - UIWizardNewVD class implementation.
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28/* GUI includes: */
29#include "UICommon.h"
30#include "UIModalWindowManager.h"
31#include "UINotificationCenter.h"
32#include "UIWizardNewVD.h"
33#include "UIWizardNewVDFileTypePage.h"
34#include "UIWizardNewVDVariantPage.h"
35#include "UIWizardNewVDSizeLocationPage.h"
36#include "UIWizardNewVDExpertPage.h"
37
38UIWizardNewVD::UIWizardNewVD(QWidget *pParent,
39 const QString &strDefaultName,
40 const QString &strDefaultPath,
41 qulonglong uDefaultSize)
42 : UINativeWizard(pParent, WizardType_NewVD, WizardMode_Auto, "create-virtual-hard-disk-image" /* help keyword */)
43 , m_strDefaultName(strDefaultName)
44 , m_strDefaultPath(strDefaultPath)
45 , m_uDefaultSize(uDefaultSize)
46 , m_iMediumVariantPageIndex(-1)
47{
48#ifndef VBOX_WS_MAC
49 /* Assign watermark: */
50 setPixmapName(":/wizard_new_harddisk.png");
51#else /* VBOX_WS_MAC */
52 /* Assign background image: */
53 setPixmapName(":/wizard_new_harddisk_bg.png");
54#endif /* VBOX_WS_MAC */
55}
56
57qulonglong UIWizardNewVD::mediumVariant() const
58{
59 return m_uMediumVariant;
60}
61
62void UIWizardNewVD::setMediumVariant(qulonglong uMediumVariant)
63{
64 m_uMediumVariant = uMediumVariant;
65}
66
67const CMediumFormat &UIWizardNewVD::mediumFormat()
68{
69 return m_comMediumFormat;
70}
71
72void UIWizardNewVD::setMediumFormat(const CMediumFormat &mediumFormat)
73{
74 m_comMediumFormat = mediumFormat;
75 if (mode() == WizardMode_Basic)
76 setMediumVariantPageVisibility();
77}
78
79const QString &UIWizardNewVD::mediumPath() const
80{
81 return m_strMediumPath;
82}
83
84void UIWizardNewVD::setMediumPath(const QString &strMediumPath)
85{
86 m_strMediumPath = strMediumPath;
87}
88
89qulonglong UIWizardNewVD::mediumSize() const
90{
91 return m_uMediumSize;
92}
93
94void UIWizardNewVD::setMediumSize(qulonglong uMediumSize)
95{
96 m_uMediumSize = uMediumSize;
97}
98
99QUuid UIWizardNewVD::mediumId() const
100{
101 return m_uMediumId;
102}
103
104void UIWizardNewVD::populatePages()
105{
106 switch (mode())
107 {
108 case WizardMode_Basic:
109 {
110 addPage(new UIWizardNewVDFileTypePage);
111 m_iMediumVariantPageIndex = addPage(new UIWizardNewVDVariantPage);
112 addPage(new UIWizardNewVDSizeLocationPage(m_strDefaultName, m_strDefaultPath, m_uDefaultSize));
113 break;
114 }
115 case WizardMode_Expert:
116 {
117 addPage(new UIWizardNewVDExpertPage(m_strDefaultName, m_strDefaultPath, m_uDefaultSize));
118 break;
119 }
120 default:
121 {
122 AssertMsgFailed(("Invalid mode: %d", mode()));
123 break;
124 }
125 }
126}
127
128bool UIWizardNewVD::createVirtualDisk()
129{
130 AssertReturn(!m_strMediumPath.isNull(), false);
131 AssertReturn(m_uMediumSize > 0, false);
132
133 /* Get VBox object: */
134 CVirtualBox comVBox = uiCommon().virtualBox();
135
136 /* Create new virtual disk image: */
137 CMedium comVirtualDisk = comVBox.CreateMedium(m_comMediumFormat.GetName(),
138 m_strMediumPath, KAccessMode_ReadWrite, KDeviceType_HardDisk);
139 if (!comVBox.isOk())
140 {
141 UINotificationMessage::cannotCreateMediumStorage(comVBox, m_strMediumPath, notificationCenter());
142 return false;
143 }
144
145 /* Compose medium-variant: */
146 QVector<KMediumVariant> variants(sizeof(qulonglong) * 8);
147 for (int i = 0; i < variants.size(); ++i)
148 {
149 qulonglong temp = m_uMediumVariant;
150 temp &= Q_UINT64_C(1) << i;
151 variants[i] = (KMediumVariant)temp;
152 }
153
154 UINotificationProgressMediumCreate *pNotification = new UINotificationProgressMediumCreate(comVirtualDisk,
155 m_uMediumSize,
156 variants);
157 connect(pNotification, &UINotificationProgressMediumCreate::sigMediumCreated,
158 &uiCommon(), &UICommon::sltHandleMediumCreated);
159
160 m_uMediumId = comVirtualDisk.GetId();
161
162 gpNotificationCenter->append(pNotification);
163
164 /* Positive: */
165 return true;
166}
167
168/* static */
169QUuid UIWizardNewVD::createVDWithWizard(QWidget *pParent,
170 const QString &strMachineFolder /* = QString() */,
171 const QString &strMachineName /* = QString() */,
172 const QString &strMachineGuestOSTypeId /* = QString() */)
173{
174 /* Default path: */
175 const QString strDefaultPath = !strMachineFolder.isEmpty()
176 ? strMachineFolder
177 : uiCommon().defaultFolderPathForType(UIMediumDeviceType_HardDisk);
178
179 /* Default name: */
180 const QString strDiskName = uiCommon().findUniqueFileName(strDefaultPath,
181 !strMachineName.isEmpty()
182 ? strMachineName
183 : "NewVirtualDisk");
184
185 /* Default size: */
186 const CGuestOSType comGuestOSType = uiCommon().virtualBox().GetGuestOSType( !strMachineGuestOSTypeId.isEmpty()
187 ? strMachineGuestOSTypeId
188 : "Other");
189 const qulonglong uDefaultSize = comGuestOSType.GetRecommendedHDD();
190
191 /* Show New VD wizard the safe way: */
192 QWidget *pRealParent = windowManager().realParentWindow(pParent);
193 UISafePointerWizardNewVD pWizard = new UIWizardNewVD(pRealParent,
194 strDiskName,
195 strDefaultPath,
196 uDefaultSize);
197 if (!pWizard)
198 return QUuid();
199 windowManager().registerNewParent(pWizard, pRealParent);
200 pWizard->exec();
201 const QUuid uMediumId = pWizard->mediumId();
202 delete pWizard;
203 return uMediumId;
204}
205
206void UIWizardNewVD::retranslateUi()
207{
208 UINativeWizard::retranslateUi();
209 setWindowTitle(tr("Create Virtual Hard Disk"));
210}
211
212void UIWizardNewVD::setMediumVariantPageVisibility()
213{
214 AssertReturnVoid(!m_comMediumFormat.isNull());
215 ULONG uCapabilities = 0;
216 QVector<KMediumFormatCapabilities> capabilities;
217 capabilities = m_comMediumFormat.GetCapabilities();
218 for (int i = 0; i < capabilities.size(); i++)
219 uCapabilities |= capabilities[i];
220
221 int cTest = 0;
222 if (uCapabilities & KMediumFormatCapabilities_CreateDynamic)
223 ++cTest;
224 if (uCapabilities & KMediumFormatCapabilities_CreateFixed)
225 ++cTest;
226 if (uCapabilities & KMediumFormatCapabilities_CreateSplit2G)
227 ++cTest;
228 setPageVisible(m_iMediumVariantPageIndex, cTest > 1);
229}
Note: See TracBrowser for help on using the repository browser.

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