All mapped control widgets (plus labels) are dynamically generated from meta data.

This commit is contained in:
2026-03-02 17:11:31 +01:00
parent 0e7f803d42
commit 560cadb2c0
2 changed files with 93 additions and 74 deletions

View File

@ -58,7 +58,7 @@ void ItemDetailMapper::rowsInserted(const QModelIndex& parent, int start, int en
void ItemDetailMapper::rowsRemoved(const QModelIndex& parent, int start, int end) {
if (m_model->rowCount() == 0) {
clearEditWidgets();
clearControlWidgets();
}
updateButtons(m_mapper->currentIndex());
@ -116,34 +116,9 @@ void ItemDetailMapper::setupNavigationButtons() {
void ItemDetailMapper::setupWidgets() {
m_layout = new QGridLayout();
addWidgetsWithMapping(0);
addWidgetsWithMapping(1);
addWidgetsWithMapping(2);
m_typeLabel = new QLabel(GET_HEADER_FOR_COLUMN(3));
m_typeBox = new QComboBox();
m_typeLabel->setBuddy(m_typeBox);
m_typeModel = new QStringListModel(TYPES, this);
m_typeBox->setModel(m_typeModel);
m_layout->addWidget(m_typeLabel, 3, 0);
m_layout->addWidget(m_typeBox, 3, 1);
m_mapper->addMapping(m_typeBox, 3, "currentText");
m_amountLabel = new QLabel("&Amount");
m_amountBox = new QSpinBox();
m_amountBox->setMaximum(1000);
m_amountLabel->setBuddy(m_amountBox);
m_layout->addWidget(m_amountLabel, 4, 0);
m_layout->addWidget(m_amountBox, 4, 1);
m_mapper->addMapping(m_amountBox, 4);
m_factorLabel = new QLabel("&Factor");
m_factorBox = new QDoubleSpinBox();
m_factorBox->setMaximum(1000);
m_factorLabel->setBuddy(m_factorBox);
m_layout->addWidget(m_factorLabel, 5, 0);
m_layout->addWidget(m_factorBox, 5, 1);
m_mapper->addMapping(m_factorBox, 5);
for (int i = 0; i < USER_FACING_ROLES.size(); ++i) {
setupWidgetPairForColumn(i);
}
const int nRows = m_layout->rowCount();
m_layout->addWidget(m_previousButton, nRows, 0);
@ -152,49 +127,98 @@ void ItemDetailMapper::setupWidgets() {
setLayout(m_layout);
}
void ItemDetailMapper::addWidgetsWithMapping(const int column) {
QPair<QWidget*, QWidget*> widgetPair0 = createWidgetPairForColumn(column);
QWidget* control = widgetPair0.second;
m_layout->addWidget(widgetPair0.first, column, 0);
m_layout->addWidget(control, column, 1);
m_mapper->addMapping(control, column);
editControls.append(control);
}
QPair<QWidget*, QWidget*> ItemDetailMapper::createWidgetPairForColumn(const int column) {
void ItemDetailMapper::setupWidgetPairForColumn(const int column) {
const UserRoles role = GET_ROLE_FOR_COLUMN(column);
QWidget* edit;
if (STRING_ROLES.contains(role)) {
edit = new QLineEdit();
} else {
qCritical()
<< QString("Only string roles are supported yet. But tried with role %1!!!").arg(role);
qDebug() << "Using line edit as well and pretend it's a string role...";
edit = new QLineEdit();
}
QWidget* control = createControlWidget(role);
const QString string = QString("&%1").arg(GET_HEADER_FOR_COLUMN(column));
QLabel* label = new QLabel(string);
label->setBuddy(edit);
return QPair<QWidget*, QWidget*>(label, edit);
label->setBuddy(control);
m_layout->addWidget(label, column, 0);
m_layout->addWidget(control, column, 1);
m_controlWidgets.append(control);
if (TYPE_ROLES.contains(role)) {
m_mapper->addMapping(control, column, "currentText");
} else {
m_mapper->addMapping(control, column);
}
}
void ItemDetailMapper::clearEditWidgets() {
QWidget* ItemDetailMapper::createControlWidget(const int role) {
QWidget* control;
if (STRING_ROLES.contains(role)) {
control = new QLineEdit();
} else if (TYPE_ROLES.contains(role)) {
control = createComboBox(role);
} else if (INT_ROLES.contains(role)) {
QSpinBox* spinBox = new QSpinBox();
spinBox->setMaximum(1000);
control = spinBox;
} else if (DOUBLE_ROLES.contains(role)) {
QDoubleSpinBox* spinBox = new QDoubleSpinBox();
spinBox->setMaximum(1000);
control = spinBox;
} else {
qCritical() << QString("Unsupported role %1!!!").arg(role);
qDebug() << "Using line edit as well and pretend it's a string role...";
control = new QLineEdit();
}
return control;
}
QWidget* ItemDetailMapper::createComboBox(const int role) {
QStringListModel* typeModel;
if (role == TypeRole) {
typeModel = new QStringListModel(TYPES, this);
} else {
qCritical() << "Unsupported type with role:" << role
<< "- Using string list model with only one empty string!";
typeModel = new QStringListModel({""}, this);
}
QComboBox* comboBox = new QComboBox();
comboBox->setModel(typeModel);
return comboBox;
}
void ItemDetailMapper::clearControlWidgets() {
setEnabled(false);
clearLineEdit(0);
clearLineEdit(1);
clearLineEdit(2);
m_typeBox->setCurrentIndex(m_typeBox->count() - 1);
m_amountBox->clear();
m_factorBox->clear();
for (int i = 0; i < m_controlWidgets.size(); ++i) {
const UserRoles role = GET_ROLE_FOR_COLUMN(i);
if (STRING_ROLES.contains(role)) {
clearLineEdit(i);
} else if (TYPE_ROLES.contains(role)) {
clearComboBox(i);
} else if (INT_ROLES.contains(role)) {
clearSpinBox(i);
} else if (DOUBLE_ROLES.contains(role)) {
clearSpinBox(i);
} else {
qCritical() << "Could not reset content for control widget in column:" << i << "!";
}
}
}
void ItemDetailMapper::clearLineEdit(const int column) {
QLineEdit* lineEdit = dynamic_cast<QLineEdit*>(editControls[column]);
QLineEdit* lineEdit = dynamic_cast<QLineEdit*>(m_controlWidgets[column]);
if (lineEdit) {
lineEdit->clear();
}
}
void ItemDetailMapper::clearComboBox(const int column) {
QComboBox* comboBox = dynamic_cast<QComboBox*>(m_controlWidgets[column]);
if (comboBox) {
comboBox->setCurrentText("");
}
}
void ItemDetailMapper::clearSpinBox(const int column) {
QAbstractSpinBox* spinBox = dynamic_cast<QAbstractSpinBox*>(m_controlWidgets[column]);
if (spinBox) {
spinBox->clear();
}
}

View File

@ -47,28 +47,23 @@ class ItemDetailMapper : public QWidget {
/// GUI elements
QGridLayout* m_layout;
QList<QWidget*> editControls;
QLabel* m_typeLabel;
QComboBox* m_typeBox;
QStringListModel* m_typeModel = nullptr;
QLabel* m_amountLabel = nullptr;
QSpinBox* m_amountBox = nullptr;
QLabel* m_factorLabel = nullptr;
QDoubleSpinBox* m_factorBox = nullptr;
QList<QWidget*> m_controlWidgets;
QPushButton* m_nextButton;
QPushButton* m_previousButton;
void setupConnections();
void setupLayout();
void setupNavigationButtons();
void setupWidgets();
void addWidgetsWithMapping(const int row);
QPair<QWidget*, QWidget*> createWidgetPairForColumn(const int column);
void clearEditWidgets();
void setupWidgetPairForColumn(const int column);
QWidget* createControlWidget(const int column);
QWidget* createComboBox(const int role);
void clearControlWidgets();
void clearLineEdit(const int column);
void clearComboBox(const int column);
void clearSpinBox(const int column);
};
#endif // ITEMDETAILMAPPER_H