Make the drive configuration UI work again.

This commit is contained in:
David Given
2025-01-27 00:03:23 +01:00
parent 1a947ff9bf
commit cfae2a6bd3
6 changed files with 195 additions and 137 deletions

View File

@@ -45,6 +45,7 @@ cxxlibrary(
srcs=[
"./main.cc",
"./mainwindow.cc",
"./drivecomponent.cc",
".+resources_cc",
],
hdrs={

View File

@@ -4,8 +4,6 @@
#include "globals.h"
#include "drivecomponent.h"
#include "mainwindow.h"
#include "driveConfigurationForm.h"
#include "fluxConfigurationForm.h"
#include <QStandardItemModel>
#include <range/v3/all.hpp>
@@ -22,12 +20,15 @@ public:
W_OBJECT(ConfigurationForm)
public:
ConfigurationForm(
DriveComponentImpl* dci, QIcon icon, const std::string text):
ConfigurationForm(QWidget* widget,
DriveComponentImpl* dci,
QIcon icon,
const std::string text):
QStandardItem(icon, QString::fromStdString(text)),
_dci(dci)
_widget(widget),
_dci(dci),
_mw(dci->_mainWindow)
{
_widget = new QWidget();
}
public:
@@ -52,20 +53,20 @@ public:
}
protected:
DriveComponentImpl* _dci;
QWidget* _widget;
DriveComponentImpl* _dci;
MainWindow* _mw;
};
class FluxConfigurationForm :
public ConfigurationForm,
public Ui_fluxConfigurationForm
class FluxConfigurationForm : public ConfigurationForm
{
public:
FluxConfigurationForm(DriveComponentImpl* dci):
ConfigurationForm(
dci, QIcon(":/ui/extras/fluxfile.png"), "Flux file")
ConfigurationForm(dci->_mainWindow->fluxDevicePage,
dci,
QIcon(":/ui/extras/fluxfile.png"),
"Flux file")
{
setupUi(_widget);
}
public:
@@ -76,7 +77,7 @@ public:
void collectConfig() const override
{
auto fluxFile = filenameEdit->text().toStdString();
auto fluxFile = _mw->filenameEdit->text().toStdString();
const FluxConstructor* fc = &Config::getFluxFormats()[0];
if (fc->sink)
@@ -86,7 +87,8 @@ public:
fc->source(fluxFile,
globalConfig().overrides()->mutable_flux_source());
QString rpmOverride = rpmOverrideComboBox->currentData().toString();
QString rpmOverride =
_mw->rpmOverrideComboBox->currentData().toString();
if (rpmOverride == "300")
globalConfig()
.overrides()
@@ -99,7 +101,7 @@ public:
->set_rotational_period_ms(166);
else if (rpmOverride == "override")
{
float value = rpmOverrideValue->value();
float value = _mw->rpmOverrideValue->value();
globalConfig()
.overrides()
->mutable_drive()
@@ -107,7 +109,7 @@ public:
}
QString driveTypeOverride =
driveTypeOverrideComboBox->currentData().toString();
_mw->driveTypeOverrideComboBox->currentData().toString();
if (driveTypeOverride != "default")
globalConfig().overrides()->MergeFrom(
*drivetypes.at(driveTypeOverride.toStdString()));
@@ -115,52 +117,56 @@ public:
void loadSavedState() override
{
filenameEdit->setText(app->value(qid() + "/filename").toString());
_mw->filenameEdit->setText(
app->value(qid() + "/filename").toString());
rpmOverrideComboBox->addItem(
_mw->rpmOverrideComboBox->addItem(
"Use value in file", QVariant("default"));
rpmOverrideComboBox->addItem("300 rpm / 200 ms", QVariant("300"));
rpmOverrideComboBox->addItem("360 rpm / 166 ms", QVariant("360"));
rpmOverrideComboBox->addItem("Custom value", QVariant("custom"));
_mw->rpmOverrideComboBox->addItem(
"300 rpm / 200 ms", QVariant("300"));
_mw->rpmOverrideComboBox->addItem(
"360 rpm / 166 ms", QVariant("360"));
_mw->rpmOverrideComboBox->addItem(
"Custom value", QVariant("custom"));
QString rpmType = app->value(qid() + "/rpmType").toString();
setByString(rpmOverrideComboBox, rpmType);
rpmOverrideValue->setEnabled(rpmType == "custom");
setByString(_mw->rpmOverrideComboBox, rpmType);
_mw->rpmOverrideValue->setEnabled(rpmType == "custom");
driveTypeOverrideComboBox->addItem(
_mw->driveTypeOverrideComboBox->addItem(
"Use value in file", QVariant("default"));
for (auto& d : drivetypes)
{
driveTypeOverrideComboBox->addItem(
_mw->driveTypeOverrideComboBox->addItem(
QString::fromStdString(d.second->comment()),
QVariant(QString::fromStdString(d.first)));
}
setByString(driveTypeOverrideComboBox,
setByString(_mw->driveTypeOverrideComboBox,
app->value(qid() + "/driveType").toString());
rpmOverrideValue->setValue(
_mw->rpmOverrideValue->setValue(
app->value(qid() + "/customRpm").toInt());
}
void connectAll() override
{
connect(filenameEdit,
connect(_mw->filenameEdit,
&QLineEdit::editingFinished,
this,
&ConfigurationForm::updateSavedState);
connect(driveTypeOverrideComboBox,
connect(_mw->driveTypeOverrideComboBox,
QOverload<int>::of(&QComboBox::activated),
this,
&ConfigurationForm::updateSavedState);
connect(rpmOverrideComboBox,
connect(_mw->rpmOverrideComboBox,
QOverload<int>::of(&QComboBox::activated),
this,
&ConfigurationForm::updateSavedState);
connect(rpmOverrideValue,
connect(_mw->rpmOverrideValue,
QOverload<int>::of(&QSpinBox::valueChanged),
this,
&ConfigurationForm::updateSavedState);
connect(openButton,
connect(_mw->openButton,
&QPushButton::clicked,
[this]()
{
@@ -178,55 +184,55 @@ public:
ranges::views::intersperse(" ") |
ranges::views::join |
ranges::to<std::string>();
QFileDialog dialogue(_dci->container());
QFileDialog dialogue(_mw);
dialogue.setFileMode(QFileDialog::ExistingFile);
dialogue.setNameFilter(
QString::fromStdString("Flux files (" + formats + ")"));
QStringList fileNames;
if (dialogue.exec())
filenameEdit->setText(dialogue.selectedFiles().first());
_mw->filenameEdit->setText(
dialogue.selectedFiles().first());
});
}
void updateSavedState() const override
{
app->setValue(qid() + "/filename", filenameEdit->text());
app->setValue(qid() + "/filename", _mw->filenameEdit->text());
QString rpmType = rpmOverrideComboBox->currentData().toString();
QString rpmType =
_mw->rpmOverrideComboBox->currentData().toString();
app->setValue(qid() + "/rpmType", rpmType);
rpmOverrideValue->setEnabled(rpmType == "custom");
_mw->rpmOverrideValue->setEnabled(rpmType == "custom");
app->setValue(qid() + "/customRpm", rpmOverrideValue->value());
app->setValue(qid() + "/customRpm", _mw->rpmOverrideValue->value());
app->setValue(qid() + "/driveType",
driveTypeOverrideComboBox->currentData().toString());
_mw->driveTypeOverrideComboBox->currentData().toString());
}
};
class DriveConfigurationForm :
public ConfigurationForm,
public Ui_driveConfigurationForm
class DriveConfigurationForm : public ConfigurationForm
{
public:
DriveConfigurationForm(
DriveComponentImpl* dci, QIcon icon, const std::string& label):
ConfigurationForm(dci, icon, label)
ConfigurationForm(
dci->_mainWindow->hardwareDevicePage, dci, icon, label)
{
setupUi(_widget);
}
void collectConfig() const override
{
globalConfig().overrides()->mutable_drive()->set_high_density(
highDensityToggle->isChecked());
_mw->highDensityToggle->isChecked());
auto driveTypeId =
driveTypeComboBox->currentData().toString().toStdString();
_mw->driveTypeComboBox->currentData().toString().toStdString();
globalConfig().overrides()->MergeFrom(*drivetypes.at(driveTypeId));
auto filename =
fmt::format("drive:{}", driveComboBox->currentIndex());
fmt::format("drive:{}", _mw->driveComboBox->currentIndex());
globalConfig().setFluxSink(filename);
globalConfig().setFluxSource(filename);
globalConfig().setVerificationFluxSource(filename);
@@ -234,40 +240,40 @@ public:
void loadSavedState() override
{
driveComboBox->setCurrentIndex(
_mw->driveComboBox->setCurrentIndex(
app->value(qid() + "/drive").toInt());
QString driveType = app->value(qid() + "/driveType").toString();
for (auto& d : drivetypes)
{
driveTypeComboBox->addItem(
_mw->driveTypeComboBox->addItem(
QString::fromStdString(d.second->comment()),
QVariant(QString::fromStdString(d.first)));
if (QString::fromStdString(d.first) == driveType)
driveTypeComboBox->setCurrentIndex(
driveTypeComboBox->count() - 1);
_mw->driveTypeComboBox->setCurrentIndex(
_mw->driveTypeComboBox->count() - 1);
}
highDensityToggle->setCheckState(
_mw->highDensityToggle->setCheckState(
app->value(qid() + "/highDensity").toBool() ? Qt::Checked
: Qt::Unchecked);
}
void connectAll() override
{
connect(portLineEdit,
connect(_mw->portLineEdit,
&QLineEdit::editingFinished,
this,
&ConfigurationForm::updateSavedState);
connect(driveComboBox,
connect(_mw->driveComboBox,
QOverload<int>::of(&QComboBox::activated),
this,
&ConfigurationForm::updateSavedState);
connect(driveTypeComboBox,
connect(_mw->driveTypeComboBox,
QOverload<int>::of(&QComboBox::activated),
this,
&ConfigurationForm::updateSavedState);
connect(highDensityToggle,
connect(_mw->highDensityToggle,
&QCheckBox::stateChanged,
this,
&ConfigurationForm::updateSavedState);
@@ -275,13 +281,13 @@ public:
void updateSavedState() const override
{
app->setValue(qid() + "/drive", driveComboBox->currentIndex());
app->setValue(qid() + "/drive", _mw->driveComboBox->currentIndex());
app->setValue(qid() + "/driveType",
driveTypeComboBox->currentData().toString());
_mw->driveTypeComboBox->currentData().toString());
app->setValue(
qid() + "/highDensity", highDensityToggle->isChecked());
qid() + "/highDensity", _mw->highDensityToggle->isChecked());
}
};
@@ -308,18 +314,18 @@ public:
.overrides()
->mutable_usb()
->mutable_greaseweazle()
->set_port(portLineEdit->text().toStdString());
->set_port(_mw->portLineEdit->text().toStdString());
}
void loadSavedState() override
{
DriveConfigurationForm::loadSavedState();
portLineEdit->setText(app->value(qid() + "/port").toString());
_mw->portLineEdit->setText(app->value(qid() + "/port").toString());
}
void updateSavedState() const override
{
app->setValue(qid() + "/port", portLineEdit->text());
app->setValue(qid() + "/port", _mw->portLineEdit->text());
DriveConfigurationForm::updateSavedState();
}
};
@@ -338,12 +344,13 @@ public:
_id(id),
_device(device)
{
portLineEdit->setEnabled(false);
_mw->portLineEdit->setEnabled(false);
}
void loadSavedState() override
{
portLineEdit->setText(QString::fromStdString(_device->serialPort));
_mw->portLineEdit->setText(
QString::fromStdString(_device->serialPort));
}
public:
@@ -388,7 +395,7 @@ public:
this,
&DriveComponentImpl::updateSavedState);
container()->updateGeometry();
_mainWindow->updateGeometry();
}
private:
@@ -399,9 +406,6 @@ private:
_forms.append(form);
_devicesModel.appendRow(form);
container()->layout()->addWidget(form->widget());
form->widget()->hide();
}
int findFormById(const std::string& id, int def)
@@ -415,8 +419,7 @@ private:
public:
void changeSelectedDevice(int index)
{
for (int i = 0; i < _forms.size(); i++)
_forms[i]->widget()->setVisible(i == index);
_mainWindow->driveStackedWidget->setCurrentIndex(index);
}
W_SLOT(changeSelectedDevice)
@@ -437,12 +440,6 @@ public:
form->collectConfig();
}
public:
QWidget* container() const
{
return _mainWindow->driveConfigurationContainer;
}
private:
static void setByString(QComboBox* combobox, QString value)
{

View File

@@ -43,10 +43,16 @@
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="handleWidth">
<number>5</number>
</property>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="handleWidth">
<number>5</number>
</property>
<widget class="QGroupBox" name="groupBox_4">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
@@ -95,8 +101,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>875</width>
<height>444</height>
<width>873</width>
<height>462</height>
</rect>
</property>
<property name="sizePolicy">
@@ -127,7 +133,13 @@
</widget>
</item>
<item>
<widget class="QStackedWidget" name="stackedWidget">
<widget class="QStackedWidget" name="driveStackedWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="lineWidth">
<number>0</number>
</property>
@@ -135,6 +147,12 @@
<number>1</number>
</property>
<widget class="QWidget" name="hardwareDevicePage">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="leftMargin">
<number>0</number>
@@ -149,7 +167,14 @@
<number>0</number>
</property>
<item row="0" column="1">
<widget class="QLineEdit" name="portLineEdit"/>
<widget class="QLineEdit" name="portLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_61">
@@ -207,7 +232,7 @@
</property>
</widget>
</item>
<item row="6" column="0">
<item row="7" column="0">
<widget class="QLabel" name="label_15">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
@@ -220,7 +245,7 @@
</property>
</widget>
</item>
<item row="6" column="1">
<item row="7" column="1">
<widget class="QRadioButton" name="defaultSampleTimeCheckbox">
<property name="enabled">
<bool>false</bool>
@@ -230,7 +255,40 @@
</property>
</widget>
</item>
<item row="7" column="1">
<item row="6" column="1">
<widget class="QCheckBox" name="highDensityToggle">
<property name="text">
<string>High density disk inserted</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item row="9" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="8" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QRadioButton" name="customSampleTimeCheckBox">
@@ -245,7 +303,7 @@
<item>
<widget class="QSpinBox" name="customSampleTimeSpinbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -272,29 +330,15 @@
</item>
</layout>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="highDensityToggle">
<property name="text">
<string>High density disk inserted</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="fluxDevicePage">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout1">
<property name="leftMargin">
<number>0</number>
@@ -324,7 +368,14 @@
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="filenameEdit"/>
<widget class="QLineEdit" name="filenameEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="openButton">
@@ -357,7 +408,7 @@
<item row="1" column="1">
<widget class="QComboBox" name="rpmOverrideComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -383,7 +434,7 @@
<item row="3" column="1">
<widget class="QComboBox" name="driveTypeOverrideComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -402,7 +453,7 @@
<item>
<widget class="QSpinBox" name="rpmOverrideValue">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -414,23 +465,23 @@
</item>
</layout>
</item>
<item row="4" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
@@ -491,8 +542,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>875</width>
<height>343</height>
<width>873</width>
<height>321</height>
</rect>
</property>
<property name="sizePolicy">
@@ -627,6 +678,9 @@
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="handleWidth">
<number>5</number>
</property>
<widget class="QFrame" name="container">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">

View File

@@ -4,18 +4,19 @@
#include "lib/core/utils.h"
#include "globals.h"
#include "mainwindow.h"
#include "drivecomponent.h"
W_OBJECT_IMPL(MainWindow)
MainWindow::MainWindow():
_logStreamBuf(
[this](const std::string& s)
{
logViewerEdit->appendPlainText(QString::fromStdString(s));
logViewerEdit->ensureCursorVisible();
}),
_logStream(&_logStreamBuf),
_logRenderer(LogRenderer::create(_logStream))
_logStreamBuf(
[this](const std::string& s)
{
logViewerEdit->appendPlainText(QString::fromStdString(s));
logViewerEdit->ensureCursorVisible();
}),
_logStream(&_logStreamBuf),
_logRenderer(LogRenderer::create(_logStream))
{
setupUi(this);
@@ -37,6 +38,8 @@ MainWindow::MainWindow():
{
::emergencyStop = true;
});
_driveComponent = DriveComponent::create(this);
}
void MainWindow::runThen(
@@ -51,8 +54,8 @@ void MainWindow::runThen(
&QFutureWatcher<void>::deleteLater);
}
void MainWindow::logMessage(const AnyLogMessage& message)
{
void MainWindow::logMessage(const AnyLogMessage& message)
{
#if 0
std::visit(overloaded{/* Fallback --- do nothing */
[this](const auto& m)
@@ -92,6 +95,6 @@ void MainWindow::runThen(
*message);
#endif
_logRenderer->add(message);
_logStream.flush();
}
_logRenderer->add(message);
_logStream.flush();
}

View File

@@ -3,6 +3,8 @@
#include "lib/core/logger.h"
#include "globals.h"
class DriveComponent;
class CallbackOstream : public std::streambuf
{
public:
@@ -50,4 +52,5 @@ protected:
std::ostream _logStream;
CallbackOstream _logStreamBuf;
std::unique_ptr<LogRenderer> _logRenderer;
DriveComponent* _driveComponent;
};