diff --git a/src/plugins/android/CMakeLists.txt b/src/plugins/android/CMakeLists.txt
index 90218c6c7c0..522ad3d394a 100644
--- a/src/plugins/android/CMakeLists.txt
+++ b/src/plugins/android/CMakeLists.txt
@@ -2,7 +2,6 @@ add_qtc_plugin(Android
DEPENDS QmlDebug Qt5::Xml LanguageServerProtocol
PLUGIN_DEPENDS Core Debugger ProjectExplorer QtSupport LanguageClient
SOURCES
- addnewavddialog.ui
android.qrc
android_global.h
androidtr.h
diff --git a/src/plugins/android/addnewavddialog.ui b/src/plugins/android/addnewavddialog.ui
deleted file mode 100644
index f0736429a0c..00000000000
--- a/src/plugins/android/addnewavddialog.ui
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
- Android::Internal::AddNewAVDDialog
-
-
-
- 0
- 0
- 800
-
-
-
- Create new AVD
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Name:
-
-
-
- -
-
-
- Architecture (ABI):
-
-
-
- -
-
-
- SD card size:
-
-
-
- -
-
-
- Target API:
-
-
-
- -
-
-
- Device definition:
-
-
-
- -
-
-
- -
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
- MiB
-
-
- 0
-
-
- 1000000
-
-
- 512
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
- Overwrite existing AVD name
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QDialogButtonBox::Cancel|QDialogButtonBox::Ok
-
-
-
-
-
-
-
- Utils::InfoLabel
- QLabel
-
-
-
-
-
-
- buttonBox
- accepted()
- Android::Internal::AddNewAVDDialog
- accept()
-
-
- 222
- 134
-
-
- 157
- 148
-
-
-
-
- buttonBox
- rejected()
- Android::Internal::AddNewAVDDialog
- reject()
-
-
- 245
- 140
-
-
- 249
- 148
-
-
-
-
-
diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs
index aaa29b2b329..4db566e9054 100644
--- a/src/plugins/android/android.qbs
+++ b/src/plugins/android/android.qbs
@@ -20,7 +20,6 @@ Project {
files: [
"android_global.h", "androidtr.h",
"android.qrc",
- "addnewavddialog.ui",
"androidavdmanager.cpp",
"androidavdmanager.h",
"androidconfigurations.cpp",
diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp
index c6cae9b4793..852fa8a7bc5 100644
--- a/src/plugins/android/avddialog.cpp
+++ b/src/plugins/android/avddialog.cpp
@@ -24,30 +24,39 @@
****************************************************************************/
#include "avddialog.h"
-#include "androidsdkmanager.h"
+
#include "androidavdmanager.h"
-#include "androiddevice.h"
#include "androidconstants.h"
+#include "androiddevice.h"
+#include "androidsdkmanager.h"
#include
+
#include
+#include
+#include
+#include
#include
#include
-#include
+#include
+#include
+#include
#include
#include
-#include
-#include
+#include
#include
+#include
#include
+#include
+#include
-using namespace Android;
-using namespace Android::Internal;
+using namespace Utils;
+
+namespace Android::Internal {
-namespace {
static Q_LOGGING_CATEGORY(avdDialogLog, "qtc.android.avdDialog", QtWarningMsg)
-}
+
AvdDialog::AvdDialog(const AndroidConfig &config, QWidget *parent)
: QDialog(parent),
@@ -55,38 +64,79 @@ AvdDialog::AvdDialog(const AndroidConfig &config, QWidget *parent)
m_androidConfig(config),
m_sdkManager(m_androidConfig)
{
- m_avdDialog.setupUi(this);
+ resize(800, 0);
+ setWindowTitle(tr("Create new AVD"));
+
+ m_abiComboBox = new QComboBox;
+ m_abiComboBox->addItems({
+ ProjectExplorer::Constants::ANDROID_ABI_X86,
+ ProjectExplorer::Constants::ANDROID_ABI_X86_64,
+ ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A,
+ ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A
+ });
+
+ m_sdcardSizeSpinBox = new QSpinBox;
+ m_sdcardSizeSpinBox->setSuffix(tr(" MiB"));
+ m_sdcardSizeSpinBox->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
+ m_sdcardSizeSpinBox->setRange(0, 1000000);
+ m_sdcardSizeSpinBox->setValue(512);
+
+ m_nameLineEdit = new QLineEdit;
+ m_nameLineEdit->setValidator(new QRegularExpressionValidator(m_allowedNameChars, this));
+ m_nameLineEdit->installEventFilter(this);
+
+ m_targetApiComboBox = new QComboBox;
+
+ m_deviceDefinitionComboBox = new QComboBox;
+
+ m_warningText = new InfoLabel;
+ m_warningText->setType(InfoLabel::Warning);
+ m_warningText->setElideMode(Qt::ElideNone);
+
+ m_deviceDefinitionTypeComboBox = new QComboBox;
+
+ m_overwriteCheckBox = new QCheckBox(tr("Overwrite existing AVD name"));
+
+ m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
+
m_hideTipTimer.setInterval(2000);
m_hideTipTimer.setSingleShot(true);
+ using namespace Layouting;
+ const Break nl;
+
+ Column {
+ Form {
+ tr("Name:"), m_nameLineEdit, nl,
+ tr("Device definition:"),
+ Row { m_deviceDefinitionTypeComboBox, m_deviceDefinitionComboBox }, nl,
+ tr("Architecture (ABI):"), m_abiComboBox, nl,
+ tr("Target API:"), m_targetApiComboBox, nl,
+ QString(), m_warningText, nl,
+ tr("SD card size:"), m_sdcardSizeSpinBox, nl,
+ QString(), m_overwriteCheckBox,
+ },
+ Stretch(),
+ m_buttonBox
+ }.attachTo(this);
+
connect(&m_hideTipTimer, &QTimer::timeout, this, &Utils::ToolTip::hide);
- connect(m_avdDialog.deviceDefinitionTypeComboBox, &QComboBox::currentIndexChanged,
+ connect(m_deviceDefinitionTypeComboBox, &QComboBox::currentIndexChanged,
this, &AvdDialog::updateDeviceDefinitionComboBox);
- connect(m_avdDialog.abiComboBox, &QComboBox::currentIndexChanged,
+ connect(m_abiComboBox, &QComboBox::currentIndexChanged,
this, &AvdDialog::updateApiLevelComboBox);
+ connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
+ connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
- deviceTypeToStringMap.insert(AvdDialog::Phone, "Phone");
- deviceTypeToStringMap.insert(AvdDialog::Tablet, "Tablet");
- deviceTypeToStringMap.insert(AvdDialog::Automotive, "Automotive");
- deviceTypeToStringMap.insert(AvdDialog::TV, "TV");
- deviceTypeToStringMap.insert(AvdDialog::Wear, "Wear");
-
- m_avdDialog.abiComboBox->addItems(QStringList({
- ProjectExplorer::Constants::ANDROID_ABI_X86,
- ProjectExplorer::Constants::ANDROID_ABI_X86_64,
- ProjectExplorer::Constants::ANDROID_ABI_ARMEABI_V7A,
- ProjectExplorer::Constants::ANDROID_ABI_ARM64_V8A}));
-
- auto v = new QRegularExpressionValidator(m_allowedNameChars, this);
- m_avdDialog.nameLineEdit->setValidator(v);
- m_avdDialog.nameLineEdit->installEventFilter(this);
-
- m_avdDialog.warningText->setType(Utils::InfoLabel::Warning);
- m_avdDialog.warningText->setElideMode(Qt::ElideNone);
+ m_deviceTypeToStringMap.insert(AvdDialog::Phone, "Phone");
+ m_deviceTypeToStringMap.insert(AvdDialog::Tablet, "Tablet");
+ m_deviceTypeToStringMap.insert(AvdDialog::Automotive, "Automotive");
+ m_deviceTypeToStringMap.insert(AvdDialog::TV, "TV");
+ m_deviceTypeToStringMap.insert(AvdDialog::Wear, "Wear");
parseDeviceDefinitionsList();
- for (const QString &type : deviceTypeToStringMap)
- m_avdDialog.deviceDefinitionTypeComboBox->addItem(type);
+ for (const QString &type : m_deviceTypeToStringMap)
+ m_deviceDefinitionTypeComboBox->addItem(type);
updateApiLevelComboBox();
}
@@ -101,7 +151,7 @@ int AvdDialog::exec()
result.abi = abi();
result.deviceDefinition = deviceDefinition();
result.sdcardSize = sdcardSize();
- result.overwrite = m_avdDialog.overwriteCheckBox->isChecked();
+ result.overwrite = m_overwriteCheckBox->isChecked();
const AndroidAvdManager avdManager = AndroidAvdManager(m_androidConfig);
QFutureWatcher createAvdFutureWatcher;
@@ -204,49 +254,49 @@ void AvdDialog::parseDeviceDefinitionsList()
void AvdDialog::updateDeviceDefinitionComboBox()
{
- DeviceType curDeviceType = deviceTypeToStringMap.key(
- m_avdDialog.deviceDefinitionTypeComboBox->currentText());
+ DeviceType curDeviceType = m_deviceTypeToStringMap.key(
+ m_deviceDefinitionTypeComboBox->currentText());
- m_avdDialog.deviceDefinitionComboBox->clear();
+ m_deviceDefinitionComboBox->clear();
for (const DeviceDefinitionStruct &item : qAsConst(m_deviceDefinitionsList)) {
if (item.deviceType == curDeviceType)
- m_avdDialog.deviceDefinitionComboBox->addItem(item.name_id);
+ m_deviceDefinitionComboBox->addItem(item.name_id);
}
- m_avdDialog.deviceDefinitionComboBox->addItem("Custom");
+ m_deviceDefinitionComboBox->addItem("Custom");
updateApiLevelComboBox();
}
const SystemImage* AvdDialog::systemImage() const
{
- return m_avdDialog.targetApiComboBox->currentData().value();
+ return m_targetApiComboBox->currentData().value();
}
QString AvdDialog::name() const
{
- return m_avdDialog.nameLineEdit->text();
+ return m_nameLineEdit->text();
}
QString AvdDialog::abi() const
{
- return m_avdDialog.abiComboBox->currentText();
+ return m_abiComboBox->currentText();
}
QString AvdDialog::deviceDefinition() const
{
- return m_avdDialog.deviceDefinitionComboBox->currentText();
+ return m_deviceDefinitionComboBox->currentText();
}
int AvdDialog::sdcardSize() const
{
- return m_avdDialog.sdcardSizeSpinBox->value();
+ return m_sdcardSizeSpinBox->value();
}
void AvdDialog::updateApiLevelComboBox()
{
SystemImageList installedSystemImages = m_sdkManager.installedSystemImages();
- DeviceType curDeviceType = deviceTypeToStringMap.key(
- m_avdDialog.deviceDefinitionTypeComboBox->currentText());
+ DeviceType curDeviceType = m_deviceTypeToStringMap.key(
+ m_deviceDefinitionTypeComboBox->currentText());
QString selectedAbi = abi();
auto hasAbi = [selectedAbi](const SystemImage *image) {
@@ -261,49 +311,49 @@ void AvdDialog::updateApiLevelComboBox()
return image && deviceType == curDeviceType && hasAbi(image);
});
- m_avdDialog.targetApiComboBox->clear();
+ m_targetApiComboBox->clear();
for (SystemImage *image : qAsConst(filteredList)) {
QString imageString = "android-" % QString::number(image->apiLevel());
const QStringList imageSplits = image->sdkStylePath().split(';');
if (imageSplits.size() == 4)
imageString += QStringLiteral(" (%1)").arg(imageSplits.at(2));
- m_avdDialog.targetApiComboBox->addItem(imageString,
+ m_targetApiComboBox->addItem(imageString,
QVariant::fromValue(image));
- m_avdDialog.targetApiComboBox->setItemData(m_avdDialog.targetApiComboBox->count() - 1,
+ m_targetApiComboBox->setItemData(m_targetApiComboBox->count() - 1,
image->descriptionText(),
Qt::ToolTipRole);
}
if (installedSystemImages.isEmpty()) {
- m_avdDialog.targetApiComboBox->setEnabled(false);
- m_avdDialog.warningText->setVisible(true);
- m_avdDialog.warningText->setText(
+ m_targetApiComboBox->setEnabled(false);
+ m_warningText->setVisible(true);
+ m_warningText->setText(
tr("Cannot create a new AVD. No suitable Android system image is installed.
"
"Install a system image for the intended Android version from the SDK Manager."));
- m_avdDialog.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
} else if (filteredList.isEmpty()) {
- m_avdDialog.targetApiComboBox->setEnabled(false);
- m_avdDialog.warningText->setVisible(true);
- m_avdDialog.warningText->setText(tr("Cannot create an AVD for ABI %1.
Install a system "
+ m_targetApiComboBox->setEnabled(false);
+ m_warningText->setVisible(true);
+ m_warningText->setText(tr("Cannot create an AVD for ABI %1.
Install a system "
"image for it from the SDK Manager tab first.")
.arg(abi()));
- m_avdDialog.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
} else {
- m_avdDialog.warningText->setVisible(false);
- m_avdDialog.targetApiComboBox->setEnabled(true);
- m_avdDialog.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
+ m_warningText->setVisible(false);
+ m_targetApiComboBox->setEnabled(true);
+ m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
}
}
bool AvdDialog::eventFilter(QObject *obj, QEvent *event)
{
- if (obj == m_avdDialog.nameLineEdit && event->type() == QEvent::KeyPress) {
+ if (obj == m_nameLineEdit && event->type() == QEvent::KeyPress) {
auto ke = static_cast(event);
const QString key = ke->text();
if (!key.isEmpty() && !m_allowedNameChars.match(key).hasMatch()) {
- QPoint position = m_avdDialog.nameLineEdit->parentWidget()->mapToGlobal(m_avdDialog.nameLineEdit->geometry().bottomLeft());
+ QPoint position = m_nameLineEdit->parentWidget()->mapToGlobal(m_nameLineEdit->geometry().bottomLeft());
position -= Utils::ToolTip::offsetFromPosition();
- Utils::ToolTip::show(position, tr("Allowed characters are: a-z A-Z 0-9 and . _ -"), m_avdDialog.nameLineEdit);
+ Utils::ToolTip::show(position, tr("Allowed characters are: a-z A-Z 0-9 and . _ -"), m_nameLineEdit);
m_hideTipTimer.start();
} else {
m_hideTipTimer.stop();
@@ -312,3 +362,5 @@ bool AvdDialog::eventFilter(QObject *obj, QEvent *event)
}
return QDialog::eventFilter(obj, event);
}
+
+} // Android::Internal
diff --git a/src/plugins/android/avddialog.h b/src/plugins/android/avddialog.h
index 45169bd79f4..8732eb48ef2 100644
--- a/src/plugins/android/avddialog.h
+++ b/src/plugins/android/avddialog.h
@@ -25,12 +25,21 @@
#pragma once
#include "androidconfigurations.h"
-#include "ui_addnewavddialog.h"
#include "androidconfigurations.h"
#include
#include
+QT_BEGIN_NAMESPACE
+class QComboBox;
+class QCheckBox;
+class QDialogButtonBox;
+class QLineEdit;
+class QSpinBox;
+QT_END_NAMESPACE
+
+namespace Utils { class InfoLabel; }
+
namespace Android {
class AndroidConfig;
class SdkPlatform;
@@ -70,14 +79,24 @@ private:
DeviceType deviceType;
};
- Ui::AddNewAVDDialog m_avdDialog;
CreateAvdInfo m_createdAvdInfo;
QTimer m_hideTipTimer;
QRegularExpression m_allowedNameChars;
QList m_deviceDefinitionsList;
const AndroidConfig &m_androidConfig;
AndroidSdkManager m_sdkManager;
- QMap deviceTypeToStringMap;
+ QMap m_deviceTypeToStringMap;
+
+ QComboBox *m_abiComboBox;
+ QSpinBox *m_sdcardSizeSpinBox;
+ QLineEdit *m_nameLineEdit;
+ QComboBox *m_targetApiComboBox;
+ QComboBox *m_deviceDefinitionComboBox;
+ Utils::InfoLabel *m_warningText;
+ QComboBox *m_deviceDefinitionTypeComboBox;
+ QCheckBox *m_overwriteCheckBox;
+ QDialogButtonBox *m_buttonBox;
};
-}
-}
+
+} // Internal
+} // Android