diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp index 93de6c28406b2597a2afe6c0250928f8abe2feaa..4dd60110a31c52df62c9bf4a8b282244d05d5df7 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp @@ -54,7 +54,7 @@ namespace { }; MaemoDeviceConfigurations::DeviceConfig::DeviceConfig(const QString &name) - : name(name), type(Physical) + : name(name), type(Physical), port(22), timeout(30) { } @@ -97,8 +97,10 @@ void MaemoDeviceConfigurations::save() QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(SettingsGroup); settings->beginWriteArray(ConfigListKey, m_devConfigs.count()); - foreach (const DeviceConfig &devConfig, m_devConfigs) - devConfig.save(*settings); + for (int i = 0; i < m_devConfigs.count(); ++i) { + settings->setArrayIndex(i); + m_devConfigs.at(i).save(*settings); + } settings->endArray(); settings->endGroup(); } @@ -114,8 +116,10 @@ void MaemoDeviceConfigurations::load() QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(SettingsGroup); int count = settings->beginReadArray(ConfigListKey); - for (int i = 0; i < count; ++i) + for (int i = 0; i < count; ++i) { + settings->setArrayIndex(i); m_devConfigs.append(DeviceConfig(*settings)); + } settings->endArray(); settings->endGroup(); } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h index cccd166222f82c2047c3c938e364d89ea571d7c7..41227e44daf30abbb8647392ad1505cdc29a80e9 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h @@ -65,6 +65,18 @@ public: int timeout; }; + class DevConfMatcher + { + public: + DevConfMatcher(const QString &name) : m_name(name) {} + bool operator()(const MaemoDeviceConfigurations::DeviceConfig &devConfig) + { + return devConfig.name == m_name; + } + private: + const QString m_name; + }; + static MaemoDeviceConfigurations &instance(); QList<DeviceConfig> devConfigs() const { return m_devConfigs; } void setDevConfigs(const QList<DeviceConfig> &devConfigs); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp index bade7e554a73a718c3ed29384166250e80e33e40..bea7ad0aefdf6b08170cd810eed1238f66cc012c 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp @@ -46,6 +46,8 @@ #include "ui_maemosettingswidget.h" #include "maemosettingspage.h" +#include <QtGui/QIntValidator> + #include <algorithm> namespace Qt4ProjectManager { @@ -54,16 +56,61 @@ namespace Internal { #define PAGE_ID "ZZ.Maemo Device Configurations" #define PAGE_ID_TR "Maemo Device Configurations" -class DevConfMatcher +bool configNameExists(const QList<MaemoDeviceConfigurations::DeviceConfig> &devConfs, + const QString &name) +{ + return std::find_if(devConfs.constBegin(), devConfs.constEnd(), + MaemoDeviceConfigurations::DevConfMatcher(name)) != devConfs.constEnd(); +} + +class PortAndTimeoutValidator : public QIntValidator { public: - DevConfMatcher(const QString &name) : m_name(name) {} - bool operator()(const MaemoDeviceConfigurations::DeviceConfig &devConfig) + PortAndTimeoutValidator() : QIntValidator(0, SHRT_MAX, 0) { - return devConfig.name == m_name; } + + void setValue(int oldValue) { m_oldValue = oldValue; } + + virtual void fixup(QString &input) const + { + int dummy = 0; + if (validate(input, dummy) != Acceptable) + input = QString::number(m_oldValue); + } + private: - const QString m_name; + int m_oldValue; +}; + +class NameValidator : public QValidator +{ +public: + NameValidator(const QList<MaemoDeviceConfigurations::DeviceConfig> &devConfs) + : m_devConfs(devConfs) + { + } + + void setName(const QString &name) { m_oldName = name; } + + virtual State validate(QString &input, int & /* pos */) const + { + if (input.trimmed().isEmpty() + || (input != m_oldName && configNameExists(m_devConfs, input))) + return Intermediate; + return Acceptable; + } + + virtual void fixup(QString &input) const + { + int dummy = 0; + if (validate(input, dummy) != Acceptable) + input = m_oldName; + } + +private: + QString m_oldName; + const QList<MaemoDeviceConfigurations::DeviceConfig> &m_devConfs; }; @@ -72,24 +119,44 @@ class MaemoSettingsWidget : public QWidget Q_OBJECT public: MaemoSettingsWidget(QWidget *parent); + ~MaemoSettingsWidget(); void saveSettings(); +private slots: + void selectionChanged(); + void addConfig(); + void deleteConfig(); + void configNameEditingFinished(); + void deviceTypeChanged(); + void hostNameEditingFinished(); + void portEditingFinished(); + void timeoutEditingFinished(); + void userNameEditingFinished(); + void passwordEditingFinished(); + private: void initGui(); - void addConfig(); void display(const MaemoDeviceConfigurations::DeviceConfig &devConfig); + MaemoDeviceConfigurations::DeviceConfig ¤tConfig(); + void setPortOrTimeout(const QLineEdit *lineEdit, int &confVal, + PortAndTimeoutValidator &validator); + void clearDetails(); Ui_maemoSettingsWidget *m_ui; QList<MaemoDeviceConfigurations::DeviceConfig> m_devConfs; + PortAndTimeoutValidator m_portValidator; + PortAndTimeoutValidator m_timeoutValidator; + NameValidator m_nameValidator; }; MaemoSettingsPage::MaemoSettingsPage(QObject *parent) - : Core::IOptionsPage(parent), m_widget(0) + : Core::IOptionsPage(parent) { - + qDebug("Creating maemo settings page"); } MaemoSettingsPage::~MaemoSettingsPage() { + qDebug("deleting maemo settings page"); } QString MaemoSettingsPage::id() const @@ -115,8 +182,6 @@ QString MaemoSettingsPage::trCategory() const QWidget *MaemoSettingsPage::createPage(QWidget *parent) { - if (m_widget != 0) - delete m_widget; m_widget = new MaemoSettingsWidget(parent); return m_widget; } @@ -134,15 +199,25 @@ void MaemoSettingsPage::finish() MaemoSettingsWidget::MaemoSettingsWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui_maemoSettingsWidget), - m_devConfs(MaemoDeviceConfigurations::instance().devConfigs()) + m_devConfs(MaemoDeviceConfigurations::instance().devConfigs()), + m_nameValidator(m_devConfs) { + qDebug("creating maemo settings widget"); initGui(); } +MaemoSettingsWidget::~MaemoSettingsWidget() +{ + qDebug("Deleting maemo settings widget"); +} + void MaemoSettingsWidget::initGui() { m_ui->setupUi(this); + m_ui->nameLineEdit->setValidator(&m_nameValidator); + m_ui->portLineEdit->setValidator(&m_portValidator); + m_ui->timeoutLineEdit->setValidator(&m_timeoutValidator); foreach(const MaemoDeviceConfigurations::DeviceConfig &devConf, m_devConfs) m_ui->configListWidget->addItem(devConf.name); } @@ -155,14 +230,32 @@ void MaemoSettingsWidget::addConfig() bool isUnique = false; do { newName = prefix + QString::number(suffix++); - isUnique = std::find_if(m_devConfs.constBegin(), m_devConfs.constEnd(), - DevConfMatcher(newName)) == m_devConfs.constEnd(); + isUnique = !configNameExists(m_devConfs, newName); } while (!isUnique); m_devConfs.append(MaemoDeviceConfigurations::DeviceConfig(newName)); m_ui->configListWidget->addItem(newName); - // TODO: select and display new item (selection should automatically lead to display) - // also mark configuration name to suggest overwriting + m_ui->configListWidget->setCurrentRow(m_ui->configListWidget->count() - 1); + m_ui->nameLineEdit->selectAll(); + m_ui->removeConfigButton->setEnabled(true); + m_ui->nameLineEdit->setFocus(); +} + +void MaemoSettingsWidget::deleteConfig() +{ + const QList<QListWidgetItem *> &selectedItems = + m_ui->configListWidget->selectedItems(); + if (selectedItems.isEmpty()) + return; + QListWidgetItem *item = selectedItems.first(); + const int selectedRow = m_ui->configListWidget->row(item); + m_devConfs.removeAt(selectedRow); + disconnect(m_ui->configListWidget, SIGNAL(itemSelectionChanged()), 0, 0); + delete m_ui->configListWidget->takeItem(selectedRow); + connect(m_ui->configListWidget, SIGNAL(itemSelectionChanged()), + this, SLOT(selectionChanged())); + Q_ASSERT(m_ui->configListWidget->count() == m_devConfs.count()); + selectionChanged(); } void MaemoSettingsWidget::display(const MaemoDeviceConfigurations::DeviceConfig &devConfig) @@ -178,6 +271,10 @@ void MaemoSettingsWidget::display(const MaemoDeviceConfigurations::DeviceConfig m_ui->userLineEdit->setText(devConfig.uname); m_ui->pwdLineEdit->setText(devConfig.pwd); m_ui->detailsWidget->setEnabled(true); + m_nameValidator.setName(devConfig.name); + m_portValidator.setValue(devConfig.port); + m_timeoutValidator.setValue(devConfig.timeout); + m_ui->detailsWidget->setEnabled(true); } void MaemoSettingsWidget::saveSettings() @@ -185,6 +282,95 @@ void MaemoSettingsWidget::saveSettings() MaemoDeviceConfigurations::instance().setDevConfigs(m_devConfs); } +MaemoDeviceConfigurations::DeviceConfig &MaemoSettingsWidget::currentConfig() +{ + qDebug("%d/%d", m_ui->configListWidget->count(), m_devConfs.count()); + Q_ASSERT(m_ui->configListWidget->count() == m_devConfs.count()); + const QList<QListWidgetItem *> &selectedItems = + m_ui->configListWidget->selectedItems(); + Q_ASSERT(selectedItems.count() == 1); + const int selectedRow = m_ui->configListWidget->row(selectedItems.first()); + qDebug("selected row = %d", selectedRow); + Q_ASSERT(selectedRow < m_devConfs.count()); + return m_devConfs[selectedRow]; +} + +void MaemoSettingsWidget::configNameEditingFinished() +{ + const QString &newName = m_ui->nameLineEdit->text(); + currentConfig().name = newName; + m_nameValidator.setName(newName); + m_ui->configListWidget->currentItem()->setText(newName); +} + +void MaemoSettingsWidget::deviceTypeChanged() +{ + currentConfig().type = + m_ui->deviceButton->isChecked() + ? MaemoDeviceConfigurations::DeviceConfig::Physical + : MaemoDeviceConfigurations::DeviceConfig::Simulator; +} + +void MaemoSettingsWidget::hostNameEditingFinished() +{ + currentConfig().host = m_ui->hostLineEdit->text(); +} + +void MaemoSettingsWidget::portEditingFinished() +{ + setPortOrTimeout(m_ui->portLineEdit, currentConfig().port, m_portValidator); +} + +void MaemoSettingsWidget::timeoutEditingFinished() +{ + setPortOrTimeout(m_ui->timeoutLineEdit, currentConfig().timeout, + m_timeoutValidator); +} + +void MaemoSettingsWidget::setPortOrTimeout(const QLineEdit *lineEdit, + int &confVal, PortAndTimeoutValidator &validator) +{ + bool ok; + confVal = lineEdit->text().toInt(&ok); + Q_ASSERT(ok); + validator.setValue(confVal); +} + +void MaemoSettingsWidget::userNameEditingFinished() +{ + currentConfig().uname = m_ui->userLineEdit->text(); +} + +void MaemoSettingsWidget::passwordEditingFinished() +{ + currentConfig().pwd = m_ui->pwdLineEdit->text(); +} + +void MaemoSettingsWidget::selectionChanged() +{ + const QList<QListWidgetItem *> &selectedItems = + m_ui->configListWidget->selectedItems(); + Q_ASSERT(selectedItems.count() <= 1); + if (selectedItems.isEmpty()) { + m_ui->removeConfigButton->setEnabled(false); + clearDetails(); + m_ui->detailsWidget->setEnabled(false); + } else { + m_ui->removeConfigButton->setEnabled(true); + display(currentConfig()); + } +} + +void MaemoSettingsWidget::clearDetails() +{ + m_ui->nameLineEdit->clear(); + m_ui->hostLineEdit->clear(); + m_ui->portLineEdit->clear(); + m_ui->timeoutLineEdit->clear(); + m_ui->userLineEdit->clear(); + m_ui->pwdLineEdit->clear(); +} + } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui index d073cd856612658a470339c93140b7421da1043c..29c19cc803c7aff905d15c75d589aa3a81d275b4 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui @@ -146,6 +146,9 @@ </item> <item> <widget class="QPushButton" name="removeConfigButton"> + <property name="enabled"> + <bool>false</bool> + </property> <property name="text"> <string>Remove</string> </property> @@ -169,5 +172,194 @@ </layout> </widget> <resources/> - <connections/> + <connections> + <connection> + <sender>nameLineEdit</sender> + <signal>editingFinished()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>configNameEditingFinished()</slot> + <hints> + <hint type="sourcelabel"> + <x>221</x> + <y>166</y> + </hint> + <hint type="destinationlabel"> + <x>514</x> + <y>321</y> + </hint> + </hints> + </connection> + <connection> + <sender>deviceButton</sender> + <signal>toggled(bool)</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>deviceTypeChanged()</slot> + <hints> + <hint type="sourcelabel"> + <x>164</x> + <y>197</y> + </hint> + <hint type="destinationlabel"> + <x>511</x> + <y>279</y> + </hint> + </hints> + </connection> + <connection> + <sender>hostLineEdit</sender> + <signal>editingFinished()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>hostNameEditingFinished()</slot> + <hints> + <hint type="sourcelabel"> + <x>289</x> + <y>222</y> + </hint> + <hint type="destinationlabel"> + <x>424</x> + <y>231</y> + </hint> + </hints> + </connection> + <connection> + <sender>portLineEdit</sender> + <signal>editingFinished()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>portEditingFinished()</slot> + <hints> + <hint type="sourcelabel"> + <x>320</x> + <y>248</y> + </hint> + <hint type="destinationlabel"> + <x>514</x> + <y>352</y> + </hint> + </hints> + </connection> + <connection> + <sender>timeoutLineEdit</sender> + <signal>editingFinished()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>timeoutEditingFinished()</slot> + <hints> + <hint type="sourcelabel"> + <x>371</x> + <y>276</y> + </hint> + <hint type="destinationlabel"> + <x>425</x> + <y>187</y> + </hint> + </hints> + </connection> + <connection> + <sender>userLineEdit</sender> + <signal>editingFinished()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>userNameEditingFinished()</slot> + <hints> + <hint type="sourcelabel"> + <x>340</x> + <y>302</y> + </hint> + <hint type="destinationlabel"> + <x>422</x> + <y>301</y> + </hint> + </hints> + </connection> + <connection> + <sender>pwdLineEdit</sender> + <signal>editingFinished()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>passwordEditingFinished()</slot> + <hints> + <hint type="sourcelabel"> + <x>243</x> + <y>333</y> + </hint> + <hint type="destinationlabel"> + <x>423</x> + <y>336</y> + </hint> + </hints> + </connection> + <connection> + <sender>simulatorButton</sender> + <signal>toggled(bool)</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>deviceTypeChanged()</slot> + <hints> + <hint type="sourcelabel"> + <x>291</x> + <y>198</y> + </hint> + <hint type="destinationlabel"> + <x>426</x> + <y>87</y> + </hint> + </hints> + </connection> + <connection> + <sender>addConfigButton</sender> + <signal>clicked()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>addConfig()</slot> + <hints> + <hint type="sourcelabel"> + <x>465</x> + <y>27</y> + </hint> + <hint type="destinationlabel"> + <x>516</x> + <y>118</y> + </hint> + </hints> + </connection> + <connection> + <sender>configListWidget</sender> + <signal>itemSelectionChanged()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>selectionChanged()</slot> + <hints> + <hint type="sourcelabel"> + <x>365</x> + <y>56</y> + </hint> + <hint type="destinationlabel"> + <x>420</x> + <y>151</y> + </hint> + </hints> + </connection> + <connection> + <sender>removeConfigButton</sender> + <signal>clicked()</signal> + <receiver>maemoSettingsWidget</receiver> + <slot>deleteConfig()</slot> + <hints> + <hint type="sourcelabel"> + <x>454</x> + <y>56</y> + </hint> + <hint type="destinationlabel"> + <x>513</x> + <y>101</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <slot>configNameEditingFinished()</slot> + <slot>deviceTypeChanged()</slot> + <slot>hostNameEditingFinished()</slot> + <slot>portEditingFinished()</slot> + <slot>timeoutEditingFinished()</slot> + <slot>userNameEditingFinished()</slot> + <slot>passwordEditingFinished()</slot> + <slot>addConfig()</slot> + <slot>selectionChanged()</slot> + <slot>deleteConfig()</slot> + </slots> </ui>