forked from qt-creator/qt-creator
ProjectExplorer: Allow applying/cancelling removing and adding devices
Change-Id: I81400c68835a4f7ad48114f57d64260a41781ec3 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -11,6 +11,8 @@
|
|||||||
#include "idevice.h"
|
#include "idevice.h"
|
||||||
#include "idevicefactory.h"
|
#include "idevicefactory.h"
|
||||||
#include "idevicewidget.h"
|
#include "idevicewidget.h"
|
||||||
|
|
||||||
|
#include "../kitaspect.h"
|
||||||
#include "../projectexplorerconstants.h"
|
#include "../projectexplorerconstants.h"
|
||||||
#include "../projectexplorertr.h"
|
#include "../projectexplorertr.h"
|
||||||
|
|
||||||
@@ -41,6 +43,72 @@ namespace ProjectExplorer::Internal {
|
|||||||
|
|
||||||
const char LastDeviceIndexKey[] = "LastDisplayedMaemoDeviceConfig";
|
const char LastDeviceIndexKey[] = "LastDisplayedMaemoDeviceConfig";
|
||||||
|
|
||||||
|
class DeviceProxyModel : public QIdentityProxyModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QVariant data(const QModelIndex &index, int role) const override
|
||||||
|
{
|
||||||
|
if (role == Qt::FontRole) {
|
||||||
|
const Id id = Id::fromSetting(index.data(KitAspect::IdRole));
|
||||||
|
|
||||||
|
const bool isMarkedForDeletion = m_markedForDeletion.contains(id);
|
||||||
|
const bool isNewDevice = m_newDevices.contains(id);
|
||||||
|
|
||||||
|
QFont font;
|
||||||
|
font.setItalic(isNewDevice);
|
||||||
|
font.setStrikeOut(isMarkedForDeletion);
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QIdentityProxyModel::data(index, role);
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggleMarkForDeletion(const Id &id)
|
||||||
|
{
|
||||||
|
if (m_markedForDeletion.contains(id))
|
||||||
|
m_markedForDeletion.remove(id);
|
||||||
|
else
|
||||||
|
m_markedForDeletion.insert(id);
|
||||||
|
|
||||||
|
emitDataChanged(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void markAsNew(const Id &id)
|
||||||
|
{
|
||||||
|
m_newDevices.insert(id);
|
||||||
|
emitDataChanged(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void commitNewDevices()
|
||||||
|
{
|
||||||
|
m_newDevices.clear();
|
||||||
|
emit dataChanged(index(0, 0), index(rowCount() - 1, 0), {Qt::FontRole});
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isMarkedForDeletion(const Id &id) const { return m_markedForDeletion.contains(id); }
|
||||||
|
bool isNewDevice(const Id &id) const { return m_newDevices.contains(id); }
|
||||||
|
|
||||||
|
QSet<Id> markedForDeletion() const { return m_markedForDeletion; }
|
||||||
|
QSet<Id> newDevices() const { return m_newDevices; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void emitDataChanged(const Id &id)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < rowCount(); ++i) {
|
||||||
|
const Id deviceId = Id::fromSetting(data(index(i, 0), KitAspect::IdRole));
|
||||||
|
if (deviceId == id) {
|
||||||
|
QModelIndex modelIndex = index(i, 0);
|
||||||
|
emit dataChanged(modelIndex, modelIndex, {Qt::FontRole});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QSet<Id> m_markedForDeletion;
|
||||||
|
QSet<Id> m_newDevices;
|
||||||
|
};
|
||||||
|
|
||||||
class DeviceSettingsWidget final : public Core::IOptionsPageWidget
|
class DeviceSettingsWidget final : public Core::IOptionsPageWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -48,12 +116,12 @@ public:
|
|||||||
~DeviceSettingsWidget() final { delete m_configWidget; }
|
~DeviceSettingsWidget() final { delete m_configWidget; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void apply() final { saveSettings(); }
|
void apply() final;
|
||||||
void cancel() final;
|
void cancel() final;
|
||||||
|
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
|
|
||||||
void handleDeviceUpdated(Utils::Id id);
|
void handleDeviceUpdated(Id id);
|
||||||
void currentDeviceChanged(int index);
|
void currentDeviceChanged(int index);
|
||||||
void addDevice();
|
void addDevice();
|
||||||
void removeDevice();
|
void removeDevice();
|
||||||
@@ -70,7 +138,10 @@ private:
|
|||||||
QString parseTestOutput();
|
QString parseTestOutput();
|
||||||
void updateDeviceFromUi();
|
void updateDeviceFromUi();
|
||||||
|
|
||||||
|
void updateButtons();
|
||||||
|
|
||||||
DeviceManagerModel * const m_deviceManagerModel;
|
DeviceManagerModel * const m_deviceManagerModel;
|
||||||
|
DeviceProxyModel m_deviceProxyModel;
|
||||||
QList<QPushButton *> m_additionalActionButtons;
|
QList<QPushButton *> m_additionalActionButtons;
|
||||||
IDeviceWidget *m_configWidget = nullptr;
|
IDeviceWidget *m_configWidget = nullptr;
|
||||||
|
|
||||||
@@ -89,8 +160,22 @@ private:
|
|||||||
QLayout *m_generalFormLayout;
|
QLayout *m_generalFormLayout;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void DeviceSettingsWidget::apply()
|
||||||
|
{
|
||||||
|
for (const Id &id : m_deviceProxyModel.markedForDeletion())
|
||||||
|
DeviceManager::instance()->removeDevice(id);
|
||||||
|
|
||||||
|
m_deviceProxyModel.commitNewDevices();
|
||||||
|
updateButtons();
|
||||||
|
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
void DeviceSettingsWidget::cancel()
|
void DeviceSettingsWidget::cancel()
|
||||||
{
|
{
|
||||||
|
for (const Id &id : m_deviceProxyModel.newDevices())
|
||||||
|
DeviceManager::instance()->removeDevice(id);
|
||||||
|
|
||||||
for (int i = 0; i < m_deviceManagerModel->rowCount(); i++)
|
for (int i = 0; i < m_deviceManagerModel->rowCount(); i++)
|
||||||
m_deviceManagerModel->device(i)->cancel();
|
m_deviceManagerModel->device(i)->cancel();
|
||||||
IOptionsPageWidget::cancel();
|
IOptionsPageWidget::cancel();
|
||||||
@@ -99,9 +184,11 @@ void DeviceSettingsWidget::cancel()
|
|||||||
DeviceSettingsWidget::DeviceSettingsWidget()
|
DeviceSettingsWidget::DeviceSettingsWidget()
|
||||||
: m_deviceManagerModel(new DeviceManagerModel(DeviceManager::instance(), this))
|
: m_deviceManagerModel(new DeviceManagerModel(DeviceManager::instance(), this))
|
||||||
{
|
{
|
||||||
|
m_deviceProxyModel.setSourceModel(m_deviceManagerModel);
|
||||||
|
|
||||||
m_configurationLabel = new QLabel(Tr::tr("&Device:"));
|
m_configurationLabel = new QLabel(Tr::tr("&Device:"));
|
||||||
m_configurationComboBox = new QComboBox;
|
m_configurationComboBox = new QComboBox;
|
||||||
m_configurationComboBox->setModel(m_deviceManagerModel);
|
m_configurationComboBox->setModel(&m_deviceProxyModel);
|
||||||
m_generalGroupBox = new QGroupBox(Tr::tr("General"));
|
m_generalGroupBox = new QGroupBox(Tr::tr("General"));
|
||||||
m_osTypeValueLabel = new QLabel;
|
m_osTypeValueLabel = new QLabel;
|
||||||
m_autoDetectionLabel = new QLabel;
|
m_autoDetectionLabel = new QLabel;
|
||||||
@@ -135,7 +222,8 @@ DeviceSettingsWidget::DeviceSettingsWidget()
|
|||||||
IDevice::Ptr device = factory->construct();
|
IDevice::Ptr device = factory->construct();
|
||||||
QTC_ASSERT(device, return);
|
QTC_ASSERT(device, return);
|
||||||
DeviceManager::instance()->addDevice(device);
|
DeviceManager::instance()->addDevice(device);
|
||||||
m_removeConfigButton->setEnabled(true);
|
m_deviceProxyModel.markAsNew(device->id());
|
||||||
|
updateButtons();
|
||||||
m_configurationComboBox->setCurrentIndex(m_deviceManagerModel->indexOf(device));
|
m_configurationComboBox->setCurrentIndex(m_deviceManagerModel->indexOf(device));
|
||||||
saveSettings();
|
saveSettings();
|
||||||
});
|
});
|
||||||
@@ -231,7 +319,9 @@ void DeviceSettingsWidget::addDevice()
|
|||||||
Utils::asyncRun([device] { device->checkOsType(); });
|
Utils::asyncRun([device] { device->checkOsType(); });
|
||||||
|
|
||||||
DeviceManager::instance()->addDevice(device);
|
DeviceManager::instance()->addDevice(device);
|
||||||
m_removeConfigButton->setEnabled(true);
|
m_deviceProxyModel.markAsNew(device->id());
|
||||||
|
|
||||||
|
updateButtons();
|
||||||
m_configurationComboBox->setCurrentIndex(m_deviceManagerModel->indexOf(device));
|
m_configurationComboBox->setCurrentIndex(m_deviceManagerModel->indexOf(device));
|
||||||
saveSettings();
|
saveSettings();
|
||||||
if (device->hasDeviceTester())
|
if (device->hasDeviceTester())
|
||||||
@@ -240,9 +330,30 @@ void DeviceSettingsWidget::addDevice()
|
|||||||
|
|
||||||
void DeviceSettingsWidget::removeDevice()
|
void DeviceSettingsWidget::removeDevice()
|
||||||
{
|
{
|
||||||
DeviceManager::instance()->removeDevice(currentDevice()->id());
|
m_deviceProxyModel.toggleMarkForDeletion(currentDevice()->id());
|
||||||
if (DeviceManager::instance()->deviceCount() == 0)
|
updateButtons();
|
||||||
currentDeviceChanged(-1);
|
}
|
||||||
|
|
||||||
|
void DeviceSettingsWidget::updateButtons()
|
||||||
|
{
|
||||||
|
const IDevice::ConstPtr ¤t = currentDevice();
|
||||||
|
|
||||||
|
const bool isMarkedForDeletion = m_deviceProxyModel.isMarkedForDeletion(current->id());
|
||||||
|
const bool isNewDevice = m_deviceProxyModel.isNewDevice(current->id());
|
||||||
|
|
||||||
|
m_removeConfigButton->setEnabled(
|
||||||
|
(!current->isAutoDetected() || current->deviceState() == IDevice::DeviceDisconnected)
|
||||||
|
&& !isNewDevice);
|
||||||
|
|
||||||
|
if (isMarkedForDeletion)
|
||||||
|
m_removeConfigButton->setText(Tr::tr("&Restore"));
|
||||||
|
else
|
||||||
|
m_removeConfigButton->setText(Tr::tr("&Remove"));
|
||||||
|
|
||||||
|
QFont f = m_configurationComboBox->font();
|
||||||
|
f.setStrikeOut(isMarkedForDeletion);
|
||||||
|
f.setItalic(isNewDevice);
|
||||||
|
m_configurationComboBox->setFont(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceSettingsWidget::displayCurrent()
|
void DeviceSettingsWidget::displayCurrent()
|
||||||
@@ -260,8 +371,7 @@ void DeviceSettingsWidget::displayCurrent()
|
|||||||
m_deviceStateIconLabel->hide();
|
m_deviceStateIconLabel->hide();
|
||||||
m_deviceStateTextLabel->setText(current->deviceStateToString());
|
m_deviceStateTextLabel->setText(current->deviceStateToString());
|
||||||
|
|
||||||
m_removeConfigButton->setEnabled(!current->isAutoDetected()
|
updateButtons();
|
||||||
|| current->deviceState() == IDevice::DeviceDisconnected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceSettingsWidget::setDeviceInfoWidgetsEnabled(bool enable)
|
void DeviceSettingsWidget::setDeviceInfoWidgetsEnabled(bool enable)
|
||||||
@@ -332,7 +442,7 @@ void DeviceSettingsWidget::currentDeviceChanged(int index)
|
|||||||
const IDevice::ConstPtr device = m_deviceManagerModel->device(index);
|
const IDevice::ConstPtr device = m_deviceManagerModel->device(index);
|
||||||
if (!device) {
|
if (!device) {
|
||||||
setDeviceInfoWidgetsEnabled(false);
|
setDeviceInfoWidgetsEnabled(false);
|
||||||
m_removeConfigButton->setEnabled(false);
|
updateButtons();
|
||||||
clearDetails();
|
clearDetails();
|
||||||
m_defaultDeviceButton->setEnabled(false);
|
m_defaultDeviceButton->setEnabled(false);
|
||||||
return;
|
return;
|
||||||
@@ -348,7 +458,7 @@ void DeviceSettingsWidget::currentDeviceChanged(int index)
|
|||||||
m_deviceNameEditWidget = newEdit;
|
m_deviceNameEditWidget = newEdit;
|
||||||
|
|
||||||
setDeviceInfoWidgetsEnabled(true);
|
setDeviceInfoWidgetsEnabled(true);
|
||||||
m_removeConfigButton->setEnabled(true);
|
updateButtons();
|
||||||
|
|
||||||
if (device->hasDeviceTester()) {
|
if (device->hasDeviceTester()) {
|
||||||
QPushButton * const button = new QPushButton(Tr::tr("Test"));
|
QPushButton * const button = new QPushButton(Tr::tr("Test"));
|
||||||
|
Reference in New Issue
Block a user