mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
desktop: unglobalize ComboBox-models
The combo-boxes (cylinder type, weightsystem, etc.) were controlled by global models. Keeping these models up-to-date was very combersome and buggy. Create a new model everytime a combobox is opened. Ultimately it might even be better to create a copy of the strings and switch to simple QStringListModel. Set data in the core directly and don't do this via the models. The result is much simpler and easier to handle. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
de313bd01a
commit
0d011231e6
16 changed files with 130 additions and 215 deletions
|
|
@ -32,8 +32,8 @@ DivePlannerWidget::DivePlannerWidget(dive &planned_dive, PlannerWidgets *parent)
|
|||
ui.tableWidget->setTitle(tr("Dive planner points"));
|
||||
ui.tableWidget->setModel(plannerModel);
|
||||
connect(ui.tableWidget, &TableView::itemClicked, plannerModel, &DivePlannerPointsModel::remove);
|
||||
ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::GAS, new AirTypesDelegate(parent->gasModel.get(), this));
|
||||
ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DIVEMODE, new DiveTypesDelegate(parent->diveTypeModel.get(), this));
|
||||
ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::GAS, new AirTypesDelegate(planned_dive, this));
|
||||
ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::DIVEMODE, new DiveTypesDelegate(this));
|
||||
ui.cylinderTableWidget->setTitle(tr("Available gases"));
|
||||
ui.cylinderTableWidget->setBtnToolTip(tr("Add cylinder"));
|
||||
ui.cylinderTableWidget->setModel(cylinders);
|
||||
|
|
@ -56,9 +56,6 @@ DivePlannerWidget::DivePlannerWidget(dive &planned_dive, PlannerWidgets *parent)
|
|||
view->setItemDelegateForColumn(CylindersModel::USE, tankUseDelegate);
|
||||
connect(ui.cylinderTableWidget, &TableView::addButtonClicked, plannerModel, &DivePlannerPointsModel::addCylinder_clicked);
|
||||
connect(ui.tableWidget, &TableView::addButtonClicked, plannerModel, &DivePlannerPointsModel::addDefaultStop);
|
||||
connect(cylinders, &CylindersModel::dataChanged, parent, &PlannerWidgets::repopulateGasModel);
|
||||
connect(cylinders, &CylindersModel::rowsInserted, parent, &PlannerWidgets::repopulateGasModel);
|
||||
connect(cylinders, &CylindersModel::rowsRemoved, parent, &PlannerWidgets::repopulateGasModel);
|
||||
connect(cylinders, &CylindersModel::dataChanged, plannerModel, &DivePlannerPointsModel::emitDataChanged);
|
||||
connect(cylinders, &CylindersModel::dataChanged, plannerModel, &DivePlannerPointsModel::cylinderModelEdited);
|
||||
connect(cylinders, &CylindersModel::rowsInserted, plannerModel, &DivePlannerPointsModel::cylinderModelEdited);
|
||||
|
|
@ -542,8 +539,6 @@ void PlannerDetails::setPlanNotes(QString plan)
|
|||
|
||||
PlannerWidgets::PlannerWidgets() :
|
||||
planned_dive(alloc_dive()),
|
||||
gasModel(std::make_unique<GasSelectionModel>()),
|
||||
diveTypeModel(std::make_unique<DiveTypeSelectionModel>()),
|
||||
plannerWidget(*planned_dive, this),
|
||||
plannerSettingsWidget(this)
|
||||
{
|
||||
|
|
@ -587,7 +582,6 @@ void PlannerWidgets::planDive()
|
|||
{
|
||||
DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN);
|
||||
|
||||
repopulateGasModel();
|
||||
plannerWidget.setReplanButton(false);
|
||||
plannerWidget.setupStartTime(timestampToDateTime(planned_dive->when)); // This will reload the profile!
|
||||
}
|
||||
|
|
@ -612,11 +606,6 @@ void PlannerWidgets::replanDive(int currentDC)
|
|||
DivePlannerPointsModel::instance()->cylindersModel()->updateDive(planned_dive.get(), currentDC);
|
||||
}
|
||||
|
||||
void PlannerWidgets::repopulateGasModel()
|
||||
{
|
||||
gasModel->repopulate(planned_dive.get());
|
||||
}
|
||||
|
||||
void PlannerWidgets::printDecoPlan()
|
||||
{
|
||||
#ifndef NO_PRINTING
|
||||
|
|
|
|||
|
|
@ -10,8 +10,6 @@
|
|||
#include <QDateTime>
|
||||
|
||||
class DivePlannerPointsModel;
|
||||
class GasSelectionModel;
|
||||
class DiveTypeSelectionModel;
|
||||
class PlannerWidgets;
|
||||
struct dive;
|
||||
|
||||
|
|
@ -92,10 +90,7 @@ public
|
|||
slots:
|
||||
void printDecoPlan();
|
||||
public:
|
||||
void repopulateGasModel();
|
||||
OwningDivePtr planned_dive;
|
||||
std::unique_ptr<GasSelectionModel> gasModel;
|
||||
std::unique_ptr<DiveTypeSelectionModel> diveTypeModel;
|
||||
DivePlannerWidget plannerWidget;
|
||||
PlannerSettingsWidget plannerSettingsWidget;
|
||||
PlannerDetails plannerDetails;
|
||||
|
|
|
|||
|
|
@ -84,9 +84,11 @@ const QSize &StarWidgetsDelegate::starSize() const
|
|||
return minStarSize;
|
||||
}
|
||||
|
||||
ComboBoxDelegate::ComboBoxDelegate(QAbstractItemModel *model, QObject *parent, bool allowEdit) : QStyledItemDelegate(parent), model(model)
|
||||
ComboBoxDelegate::ComboBoxDelegate(std::function<QAbstractItemModel *(QWidget *)> create_model_func,
|
||||
QObject *parent, bool allowEdit) : QStyledItemDelegate(parent),
|
||||
create_model_func(std::move(create_model_func)),
|
||||
editable(allowEdit)
|
||||
{
|
||||
editable = allowEdit;
|
||||
connect(this, &ComboBoxDelegate::closeEditor, this, &ComboBoxDelegate::editorClosed);
|
||||
}
|
||||
|
||||
|
|
@ -105,7 +107,7 @@ void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index)
|
|||
QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const
|
||||
{
|
||||
QComboBox *comboDelegate = new QComboBox(parent);
|
||||
comboDelegate->setModel(model);
|
||||
comboDelegate->setModel(create_model_func(comboDelegate));
|
||||
comboDelegate->setEditable(true);
|
||||
comboDelegate->completer()->setCaseSensitivity(Qt::CaseInsensitive);
|
||||
comboDelegate->completer()->setCompletionMode(QCompleter::PopupCompletion);
|
||||
|
|
@ -207,34 +209,34 @@ void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionV
|
|||
editor->setGeometry(defaultRect);
|
||||
}
|
||||
|
||||
void TankInfoDelegate::setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &) const
|
||||
void TankInfoDelegate::setModelData(QWidget *, QAbstractItemModel *model, const QModelIndex &index) const
|
||||
{
|
||||
QAbstractItemModel *mymodel = currCombo.model;
|
||||
TankInfoModel *tanks = TankInfoModel::instance();
|
||||
QString cylinderName = currCombo.activeText.trimmed();
|
||||
if (cylinderName.isEmpty()) {
|
||||
mymodel->setData(IDX(CylindersModel::TYPE), cylinderName, CylindersModel::TEMP_ROLE);
|
||||
return;
|
||||
}
|
||||
QModelIndexList matches = tanks->match(tanks->index(0, 0), Qt::DisplayRole, cylinderName, 1, Qt::MatchFixedString | Qt::MatchWrap);
|
||||
int row;
|
||||
if (matches.isEmpty()) {
|
||||
tanks->insertRows(tanks->rowCount(), 1);
|
||||
tanks->setData(tanks->index(tanks->rowCount() - 1, 0), currCombo.activeText);
|
||||
row = tanks->rowCount() - 1;
|
||||
} else {
|
||||
row = matches.first().row();
|
||||
cylinderName = matches.first().data().toString();
|
||||
int tankSize = 0;
|
||||
int tankPressure = 0;
|
||||
tank_info *info = get_tank_info(&tank_info_table, qPrintable(cylinderName));
|
||||
if (info) {
|
||||
// OMG, the units here are a mess.
|
||||
tankSize = info->ml != 0 ? info->ml : lrint(cuft_to_l(info->cuft) * 1000.0);
|
||||
tankPressure = info->bar != 0 ? info->bar * 1000 : psi_to_mbar(info->psi);
|
||||
}
|
||||
int tankSize = tanks->data(tanks->index(row, TankInfoModel::ML)).toInt();
|
||||
int tankPressure = tanks->data(tanks->index(row, TankInfoModel::BAR)).toInt();
|
||||
|
||||
mymodel->setData(IDX(CylindersModel::TYPE), cylinderName, CylindersModel::TEMP_ROLE);
|
||||
mymodel->setData(IDX(CylindersModel::WORKINGPRESS), tankPressure, CylindersModel::TEMP_ROLE);
|
||||
mymodel->setData(IDX(CylindersModel::SIZE), tankSize, CylindersModel::TEMP_ROLE);
|
||||
}
|
||||
|
||||
TankInfoDelegate::TankInfoDelegate(QObject *parent) : ComboBoxDelegate(TankInfoModel::instance(), parent, true)
|
||||
static QAbstractItemModel *createTankInfoModel(QWidget *parent)
|
||||
{
|
||||
return new TankInfoModel(parent);
|
||||
}
|
||||
|
||||
TankInfoDelegate::TankInfoDelegate(QObject *parent) : ComboBoxDelegate(&createTankInfoModel, parent, true)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -340,20 +342,19 @@ void WSInfoDelegate::editorClosed(QWidget *, QAbstractItemDelegate::EndEditHint
|
|||
void WSInfoDelegate::setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &) const
|
||||
{
|
||||
WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model);
|
||||
WSInfoModel *wsim = WSInfoModel::instance();
|
||||
QString weightName = currCombo.activeText;
|
||||
QModelIndexList matches = wsim->match(wsim->index(0, 0), Qt::DisplayRole, weightName, 1, Qt::MatchFixedString | Qt::MatchWrap);
|
||||
int grams = 0;
|
||||
if (!matches.isEmpty()) {
|
||||
int row = matches.first().row();
|
||||
weightName = matches.first().data().toString();
|
||||
grams = wsim->data(wsim->index(row, WSInfoModel::GR)).toInt();
|
||||
}
|
||||
ws_info_t *info = get_weightsystem_description(qPrintable(weightName));
|
||||
int grams = info ? info->grams : 0;
|
||||
|
||||
mymodel->setTempWS(currCombo.currRow, weightsystem_t{ { grams }, copy_qstring(weightName), false });
|
||||
}
|
||||
|
||||
WSInfoDelegate::WSInfoDelegate(QObject *parent) : ComboBoxDelegate(WSInfoModel::instance(), parent, true)
|
||||
static QAbstractItemModel *createWSInfoModel(QWidget *parent)
|
||||
{
|
||||
return new WSInfoModel(parent);
|
||||
}
|
||||
|
||||
WSInfoDelegate::WSInfoDelegate(QObject *parent) : ComboBoxDelegate(&createWSInfoModel, parent, true)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -369,7 +370,9 @@ void AirTypesDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
|
|||
model->setData(index, QVariant(combo->currentIndex()));
|
||||
}
|
||||
|
||||
AirTypesDelegate::AirTypesDelegate(QAbstractItemModel *model, QObject *parent) : ComboBoxDelegate(model, parent, false)
|
||||
AirTypesDelegate::AirTypesDelegate(const dive &d, QObject *parent) :
|
||||
ComboBoxDelegate([d] (QWidget *parent) { return new GasSelectionModel(d, parent); },
|
||||
parent, false)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -385,7 +388,12 @@ void DiveTypesDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
|
|||
model->setData(index, QVariant(combo->currentIndex()));
|
||||
}
|
||||
|
||||
DiveTypesDelegate::DiveTypesDelegate(QAbstractItemModel *model, QObject *parent) : ComboBoxDelegate(model, parent, false)
|
||||
static QAbstractItemModel *createDiveTypeSelectionModel(QWidget *parent)
|
||||
{
|
||||
return new DiveTypeSelectionModel(parent);
|
||||
}
|
||||
|
||||
DiveTypesDelegate::DiveTypesDelegate(QObject *parent) : ComboBoxDelegate(&createDiveTypeSelectionModel, parent, false)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,10 @@
|
|||
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QComboBox>
|
||||
#include <functional>
|
||||
|
||||
class QPainter;
|
||||
struct dive;
|
||||
struct divecomputer;
|
||||
|
||||
class DiveListDelegate : public QStyledItemDelegate {
|
||||
|
|
@ -32,7 +34,8 @@ private:
|
|||
class ComboBoxDelegate : public QStyledItemDelegate {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ComboBoxDelegate(QAbstractItemModel *model, QObject *parent = 0, bool allowEdit = true);
|
||||
// First parameter: function that creates a model and makes it a child of the passed-in widget.
|
||||
explicit ComboBoxDelegate(std::function<QAbstractItemModel *(QWidget *)> create_model_func, QObject *parent = 0, bool allowEdit = true);
|
||||
private
|
||||
slots:
|
||||
void testActivationString(const QString &currString);
|
||||
|
|
@ -43,13 +46,13 @@ protected
|
|||
slots:
|
||||
virtual void editorClosed(QWidget *widget, QAbstractItemDelegate::EndEditHint hint) = 0;
|
||||
private:
|
||||
std::function<QAbstractItemModel *(QWidget *)> create_model_func;
|
||||
bool editable;
|
||||
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
|
||||
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||
bool eventFilter(QObject *object, QEvent *event) override;
|
||||
protected:
|
||||
QAbstractItemModel *model;
|
||||
mutable struct CurrSelected {
|
||||
QComboBox *comboEditor;
|
||||
int currRow;
|
||||
|
|
@ -103,7 +106,7 @@ private:
|
|||
class AirTypesDelegate : public ComboBoxDelegate {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AirTypesDelegate(QAbstractItemModel *model, QObject *parent = 0);
|
||||
explicit AirTypesDelegate(const dive &d, QObject *parent = 0);
|
||||
private:
|
||||
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
|
||||
void editorClosed(QWidget *widget, QAbstractItemDelegate::EndEditHint hint) override;
|
||||
|
|
@ -112,7 +115,7 @@ private:
|
|||
class DiveTypesDelegate : public ComboBoxDelegate {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DiveTypesDelegate(QAbstractItemModel *model, QObject *parent = 0);
|
||||
explicit DiveTypesDelegate(QObject *parent = 0);
|
||||
private:
|
||||
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
|
||||
void editorClosed(QWidget *widget, QAbstractItemDelegate::EndEditHint hint) override;
|
||||
|
|
|
|||
|
|
@ -42,11 +42,8 @@ void PreferencesEquipment::syncSettings()
|
|||
equipment->set_default_cylinder(ui->default_cylinder->currentText());
|
||||
|
||||
// In case the user changed the tank info settings,
|
||||
// reset the tank_info_table and inform the TankInfoModel of
|
||||
// the changed table. It is somewhat questionable to do this here.
|
||||
// Moreover, it is a bit crude, as this will be called for *any*
|
||||
// preferences change. Perhaps, the model should listen to the
|
||||
// precise changed signal of the preferences system?
|
||||
// reset the tank_info_table. It is somewhat questionable
|
||||
// to do this here. Moreover, it is a bit crude, as this
|
||||
// will be called for *any* preferences change.
|
||||
reset_tank_info_table(&tank_info_table);
|
||||
TankInfoModel::instance()->update();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue