From 4ea12d2e1dabfe03afe7e9c1a2233e50d6db3f40 Mon Sep 17 00:00:00 2001 From: David Given Date: Mon, 15 Jan 2024 00:01:57 +0100 Subject: [PATCH] A fair chunk of the drive component now works. --- src/gui2/driveConfigurationForm.ui | 16 ++++ src/gui2/drivecomponent.cc | 129 ++++++++++++++++++++++++++--- src/gui2/drivecomponent.h | 2 +- src/gui2/fluxConfigurationForm.ui | 17 +++- src/gui2/formatcomponent.cc | 18 ++-- src/gui2/formatcomponent.h | 2 +- src/gui2/main.cc | 3 + src/gui2/mainwindow.cc | 4 +- src/gui2/userinterface.ui | 6 +- 9 files changed, 172 insertions(+), 25 deletions(-) diff --git a/src/gui2/driveConfigurationForm.ui b/src/gui2/driveConfigurationForm.ui index 97466a36..c1fea65c 100644 --- a/src/gui2/driveConfigurationForm.ui +++ b/src/gui2/driveConfigurationForm.ui @@ -38,6 +38,16 @@ 0 + + + 0 + + + + + 1 + + @@ -66,6 +76,9 @@ + + false + Default for format @@ -78,6 +91,9 @@ + + false + Custom: diff --git a/src/gui2/drivecomponent.cc b/src/gui2/drivecomponent.cc index 3397916e..2f988cee 100644 --- a/src/gui2/drivecomponent.cc +++ b/src/gui2/drivecomponent.cc @@ -7,13 +7,18 @@ #include "fluxConfigurationForm.h" #include +static const char* DRIVE = "drive/"; +static const char* SELECTED_DRIVE = "drive/drive"; + class DriveComponentImpl : public DriveComponent, public QObject { W_OBJECT(DriveComponentImpl) public: - class ConfigurationForm : public QStandardItem + class ConfigurationForm : public QStandardItem, public QObject { + W_OBJECT(ConfigurationForm) + public: ConfigurationForm( DriveComponentImpl* dci, QIcon icon, const std::string text): @@ -23,12 +28,24 @@ public: _widget = new QWidget(); } + public: + virtual std::string id() const = 0; + + virtual void updateSavedState() const = 0; + W_SLOT(updateSavedState) + public: QWidget* widget() const { return _widget; } + protected: + QString qid() const + { + return DRIVE + QString::fromStdString(id()); + } + protected: DriveComponentImpl* _dci; QWidget* _widget; @@ -44,6 +61,22 @@ public: dci, QIcon(":/ui/extras/fluxfile.png"), "Flux file") { setupUi(_widget); + + connect(filenameEdit, + &QLineEdit::editingFinished, + this, + &ConfigurationForm::updateSavedState); + } + + public: + std::string id() const override + { + return "flux"; + } + + void updateSavedState() const override + { + app->setValue(qid() + "/filename", filenameEdit->text()); } }; @@ -57,6 +90,30 @@ public: ConfigurationForm(dci, icon, label) { setupUi(_widget); + + connect(portLineEdit, + &QLineEdit::editingFinished, + this, + &ConfigurationForm::updateSavedState); + connect(driveComboBox, + QOverload::of(&QComboBox::activated), + this, + &ConfigurationForm::updateSavedState); + connect(driveTypeComboBox, + QOverload::of(&QComboBox::activated), + this, + &ConfigurationForm::updateSavedState); + connect(highDensityToggle, + &QCheckBox::stateChanged, + this, + &ConfigurationForm::updateSavedState); + } + + void updateSavedState() const override + { + app->setValue( + qid() + "/highDensity", highDensityToggle->isChecked()); + app->setValue(qid() + "/drive", driveComboBox->currentIndex()); } }; @@ -69,6 +126,18 @@ public: "Greaseweazle\n(configured manually)") { } + + public: + std::string id() const override + { + return "greaseweazle/manual"; + } + + void updateSavedState() const override + { + app->setValue(qid() + "/port", portLineEdit->text()); + DriveConfigurationForm::updateSavedState(); + } }; class DetectedDriveConfigurationForm : public DriveConfigurationForm @@ -81,24 +150,30 @@ public: DriveConfigurationForm(dci, QIcon(":/ui/extras/hardware.png"), fmt::format("{}\n{}", type, id)), + _type(type), + _id(id), _device(device) { portLineEdit->setEnabled(false); portLineEdit->setText(QString::fromStdString(_device->serialPort)); } + public: + std::string id() const override + { + return fmt::format("{}:{}", _type, _id); + } + private: std::shared_ptr& _device; + std::string _type; + std::string _id; }; public: DriveComponentImpl(MainWindow* mainWindow): _mainWindow(mainWindow) { - _mainWindow->connect(_mainWindow->deviceSelectionComboBox, - QOverload::of(&QComboBox::activated), - this, - &DriveComponentImpl::onDeviceIndexChanged); - + setParent(mainWindow); _devicesModel.setColumnCount(1); _mainWindow->deviceSelectionComboBox->setModel(&_devicesModel); @@ -110,7 +185,21 @@ public: addForm(new DetectedDriveConfigurationForm( this, getDeviceName(it->type), it->serial, it)); - onDeviceIndexChanged(0); + auto currentFormId = + app->value(SELECTED_DRIVE).toString().toStdString(); + int currentFormIndex = findFormById(currentFormId, 0); + _mainWindow->deviceSelectionComboBox->setCurrentIndex(currentFormIndex); + changeSelectedDevice(currentFormIndex); + + _mainWindow->connect(_mainWindow->deviceSelectionComboBox, + QOverload::of(&QComboBox::activated), + this, + &DriveComponentImpl::changeSelectedDevice); + _mainWindow->connect(_mainWindow->deviceSelectionComboBox, + QOverload::of(&QComboBox::activated), + this, + &DriveComponentImpl::updateSavedState); + container()->updateGeometry(); } @@ -124,13 +213,30 @@ private: form->widget()->hide(); } + int findFormById(const std::string& id, int def) + { + for (int i = 0; i < _forms.size(); i++) + if (_forms[i]->id() == id) + return i; + return def; + } + public: - void onDeviceIndexChanged(int index) + void changeSelectedDevice(int index) { for (int i = 0; i < _forms.size(); i++) _forms[i]->widget()->setVisible(i == index); } - W_SLOT(onDeviceIndexChanged) + W_SLOT(changeSelectedDevice) + + void updateSavedState() + { + int selectedForm = _mainWindow->deviceSelectionComboBox->currentIndex(); + ConfigurationForm* form = _forms[selectedForm]; + + app->setValue(SELECTED_DRIVE, QString::fromStdString(form->id())); + } + W_SLOT(updateSavedState) public: QWidget* container() const @@ -145,8 +251,9 @@ private: }; W_OBJECT_IMPL(DriveComponentImpl) +W_OBJECT_IMPL(DriveComponentImpl::ConfigurationForm) -std::unique_ptr DriveComponent::create(MainWindow* mainWindow) +DriveComponent* DriveComponent::create(MainWindow* mainWindow) { - return std::make_unique(mainWindow); + return new DriveComponentImpl(mainWindow); } diff --git a/src/gui2/drivecomponent.h b/src/gui2/drivecomponent.h index f227c1a5..b43b59bb 100644 --- a/src/gui2/drivecomponent.h +++ b/src/gui2/drivecomponent.h @@ -5,5 +5,5 @@ class MainWindow; class DriveComponent { public: - static std::unique_ptr create(MainWindow* mainWindow); + static DriveComponent* create(MainWindow* mainWindow); }; diff --git a/src/gui2/fluxConfigurationForm.ui b/src/gui2/fluxConfigurationForm.ui index 7eef251e..63fdf942 100644 --- a/src/gui2/fluxConfigurationForm.ui +++ b/src/gui2/fluxConfigurationForm.ui @@ -30,7 +30,7 @@ - + @@ -57,6 +57,9 @@ + + false + Use value in file @@ -67,6 +70,9 @@ + + false + 300 rpm / 200 ms @@ -77,6 +83,9 @@ + + false + 360 rpm / 166 ms @@ -89,6 +98,9 @@ + + false + Custom: @@ -105,6 +117,9 @@ 0 + + ms + diff --git a/src/gui2/formatcomponent.cc b/src/gui2/formatcomponent.cc index b2d2ae19..a69c3816 100644 --- a/src/gui2/formatcomponent.cc +++ b/src/gui2/formatcomponent.cc @@ -33,6 +33,8 @@ private: public: FormatComponentImpl(MainWindow* mainWindow): _mainWindow(mainWindow) { + setParent(mainWindow); + /* Configure the formats drop-down list. */ std::string defaultFormat = @@ -140,7 +142,8 @@ public: } qb->setCurrentIndex(selectedItem); - layout->addRow(QString::fromStdString(groupName), qb); + layout->addWidget(new QLabel(QString::fromStdString(groupName))); + layout->addWidget(qb); _mainWindow->connect(qb, QOverload::of(&QComboBox::activated), @@ -156,7 +159,7 @@ public: settings.contains(QString::fromStdString(option.name())) ? Qt::Checked : Qt::Unchecked); - layout->addRow(nullptr, rb); + layout->addWidget(rb); _mainWindow->connect(rb, &QCheckBox::stateChanged, @@ -165,7 +168,7 @@ public: } if (layout->count() == 0) - layout->addRow(new QLabel("No options for this format!")); + layout->addWidget(new QLabel("No options for this format!")); } W_SLOT(changeSelectedFormat) @@ -190,7 +193,10 @@ public: if (QComboBox* cb = dynamic_cast(w)) settings.append(cb->currentData().toString()); else if (OptionCheckBox* cb = dynamic_cast(w)) - settings.append(QString::fromStdString(cb->option->name())); + { + if (cb->isChecked()) + settings.append(QString::fromStdString(cb->option->name())); + } } app->setValue(QString(FORMAT_OPTIONS_PREFIX) + "/" + formatId, @@ -204,7 +210,7 @@ private: }; W_OBJECT_IMPL(FormatComponentImpl) -std::unique_ptr FormatComponent::create(MainWindow* mainWindow) +FormatComponent* FormatComponent::create(MainWindow* mainWindow) { - return std::make_unique(mainWindow); + return new FormatComponentImpl(mainWindow); } diff --git a/src/gui2/formatcomponent.h b/src/gui2/formatcomponent.h index aab16f41..f8315c60 100644 --- a/src/gui2/formatcomponent.h +++ b/src/gui2/formatcomponent.h @@ -5,5 +5,5 @@ class MainWindow; class FormatComponent { public: - static std::unique_ptr create(MainWindow* mainWindow); + static FormatComponent* create(MainWindow* mainWindow); }; diff --git a/src/gui2/main.cc b/src/gui2/main.cc index d3a11884..b8bd82a9 100644 --- a/src/gui2/main.cc +++ b/src/gui2/main.cc @@ -65,6 +65,9 @@ Application::Application(int& argc, char** argv): int main(int argc, char** argv) { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif Q_INIT_RESOURCE(resources); workerThreadPool.setMaxThreadCount(1); diff --git a/src/gui2/mainwindow.cc b/src/gui2/mainwindow.cc index e4dc6c49..45777d23 100644 --- a/src/gui2/mainwindow.cc +++ b/src/gui2/mainwindow.cc @@ -34,8 +34,8 @@ public: } private: - std::unique_ptr _driveComponent; - std::unique_ptr _formatComponent; + DriveComponent* _driveComponent; + FormatComponent* _formatComponent; }; std::unique_ptr MainWindow::create() diff --git a/src/gui2/userinterface.ui b/src/gui2/userinterface.ui index a16094ca..10dfc2cf 100644 --- a/src/gui2/userinterface.ui +++ b/src/gui2/userinterface.ui @@ -14,7 +14,7 @@ MainWindow - + :/ui/extras/icon.png:/ui/extras/icon.png @@ -112,7 +112,7 @@ - :/ui/extras/icon.png + :/ui/extras/icon.png false @@ -697,7 +697,7 @@ background: white; - +