2019-04-13 15:43:45 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include "TabDiveEquipment.h"
|
|
|
|
#include "maintab.h"
|
|
|
|
#include "desktop-widgets/modeldelegates.h"
|
2021-09-02 17:11:35 +00:00
|
|
|
#include "core/dive.h"
|
|
|
|
#include "core/selection.h"
|
2019-11-13 14:08:40 +00:00
|
|
|
#include "commands/command.h"
|
2019-04-13 15:43:45 +00:00
|
|
|
|
|
|
|
#include "qt-models/cylindermodel.h"
|
|
|
|
#include "qt-models/weightmodel.h"
|
|
|
|
|
2021-09-02 17:11:35 +00:00
|
|
|
#include <QMessageBox>
|
2019-04-13 15:43:45 +00:00
|
|
|
#include <QSettings>
|
2019-07-20 18:53:06 +00:00
|
|
|
#include <QCompleter>
|
|
|
|
|
2021-11-20 11:22:40 +00:00
|
|
|
static bool ignoreHiddenFlag(int i)
|
|
|
|
{
|
|
|
|
return i == CylindersModel::REMOVE || i == CylindersModel::TYPE ||
|
|
|
|
i == CylindersModel::WORKINGPRESS_INT || i == CylindersModel::SIZE_INT;
|
|
|
|
}
|
|
|
|
|
2022-02-19 17:47:25 +00:00
|
|
|
static bool hiddenByDefault(int i)
|
|
|
|
{
|
|
|
|
switch (i) {
|
|
|
|
case CylindersModel::SENSORS:
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-09-09 16:12:31 +00:00
|
|
|
TabDiveEquipment::TabDiveEquipment(MainTab *parent) : TabBase(parent),
|
2023-07-09 00:14:27 +00:00
|
|
|
cylindersModel(new CylindersModel(false, this)),
|
2019-04-13 15:43:45 +00:00
|
|
|
weightModel(new WeightModel(this))
|
|
|
|
{
|
2019-07-20 18:53:06 +00:00
|
|
|
QCompleter *suitCompleter;
|
2019-04-13 15:43:45 +00:00
|
|
|
ui.setupUi(this);
|
|
|
|
|
|
|
|
// This makes sure we only delete the models
|
|
|
|
// after the destructor of the tables,
|
|
|
|
// this is needed to save the column sizes.
|
|
|
|
cylindersModel->setParent(ui.cylinders);
|
|
|
|
weightModel->setParent(ui.weights);
|
|
|
|
|
|
|
|
ui.cylinders->setModel(cylindersModel);
|
|
|
|
ui.weights->setModel(weightModel);
|
|
|
|
|
2019-07-20 18:53:06 +00:00
|
|
|
connect(&diveListNotifier, &DiveListNotifier::divesChanged, this, &TabDiveEquipment::divesChanged);
|
2019-11-02 21:52:27 +00:00
|
|
|
connect(ui.cylinders, &TableView::itemClicked, this, &TabDiveEquipment::editCylinderWidget);
|
|
|
|
connect(ui.weights, &TableView::itemClicked, this, &TabDiveEquipment::editWeightWidget);
|
2021-11-20 08:37:28 +00:00
|
|
|
connect(cylindersModel, &CylindersModel::divesEdited, this, &TabDiveEquipment::divesEdited);
|
2020-03-27 20:49:19 +00:00
|
|
|
connect(weightModel, &WeightModel::divesEdited, this, &TabDiveEquipment::divesEdited);
|
2019-04-13 15:43:45 +00:00
|
|
|
|
2022-09-17 14:35:31 +00:00
|
|
|
ui.cylinders->view()->setItemDelegateForColumn(CylindersModel::TYPE, &tankInfoDelegate);
|
|
|
|
ui.cylinders->view()->setItemDelegateForColumn(CylindersModel::USE, &tankUseDelegate);
|
|
|
|
ui.cylinders->view()->setItemDelegateForColumn(CylindersModel::SENSORS, &sensorDelegate);
|
|
|
|
ui.weights->view()->setItemDelegateForColumn(WeightModel::TYPE, &wsInfoDelegate);
|
2019-04-13 15:43:45 +00:00
|
|
|
ui.cylinders->view()->setColumnHidden(CylindersModel::DEPTH, true);
|
2021-11-20 11:22:40 +00:00
|
|
|
ui.cylinders->view()->setColumnHidden(CylindersModel::WORKINGPRESS_INT, true);
|
|
|
|
ui.cylinders->view()->setColumnHidden(CylindersModel::SIZE_INT, true);
|
2019-04-13 15:43:45 +00:00
|
|
|
|
|
|
|
ui.cylinders->setTitle(tr("Cylinders"));
|
|
|
|
ui.cylinders->setBtnToolTip(tr("Add cylinder"));
|
|
|
|
connect(ui.cylinders, &TableView::addButtonClicked, this, &TabDiveEquipment::addCylinder_clicked);
|
|
|
|
|
|
|
|
ui.weights->setTitle(tr("Weights"));
|
|
|
|
ui.weights->setBtnToolTip(tr("Add weight system"));
|
|
|
|
connect(ui.weights, &TableView::addButtonClicked, this, &TabDiveEquipment::addWeight_clicked);
|
|
|
|
|
2019-07-20 18:53:06 +00:00
|
|
|
QAction *action = new QAction(tr("OK"), this);
|
|
|
|
connect(action, &QAction::triggered, this, &TabDiveEquipment::closeWarning);
|
|
|
|
ui.multiDiveWarningMessage->addAction(action);
|
|
|
|
|
|
|
|
action = new QAction(tr("Undo"), this);
|
|
|
|
connect(action, &QAction::triggered, Command::undoAction(this), &QAction::trigger);
|
|
|
|
connect(action, &QAction::triggered, this, &TabDiveEquipment::closeWarning);
|
|
|
|
ui.multiDiveWarningMessage->addAction(action);
|
|
|
|
|
|
|
|
ui.multiDiveWarningMessage->hide();
|
|
|
|
|
2019-04-13 15:43:45 +00:00
|
|
|
QSettings s;
|
|
|
|
s.beginGroup("cylinders_dialog");
|
|
|
|
for (int i = 0; i < CylindersModel::COLUMNS; i++) {
|
2021-11-20 11:22:40 +00:00
|
|
|
if (ignoreHiddenFlag(i))
|
2019-04-13 15:43:45 +00:00
|
|
|
continue;
|
2022-02-19 17:47:25 +00:00
|
|
|
auto setting = s.value(QString("column%1_hidden").arg(i));
|
|
|
|
bool checked = setting.isValid() ? setting.toBool() : hiddenByDefault(i) ;
|
2019-04-13 15:43:45 +00:00
|
|
|
QAction *action = new QAction(cylindersModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(), ui.cylinders->view());
|
|
|
|
action->setCheckable(true);
|
|
|
|
action->setData(i);
|
|
|
|
action->setChecked(!checked);
|
|
|
|
connect(action, &QAction::triggered, this, &TabDiveEquipment::toggleTriggeredColumn);
|
|
|
|
ui.cylinders->view()->setColumnHidden(i, checked);
|
|
|
|
ui.cylinders->view()->horizontalHeader()->addAction(action);
|
|
|
|
}
|
|
|
|
ui.cylinders->view()->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);
|
|
|
|
ui.weights->view()->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);
|
2019-07-20 18:53:06 +00:00
|
|
|
suitCompleter = new QCompleter(&suitModel, ui.suit);
|
|
|
|
suitCompleter->setCaseSensitivity(Qt::CaseInsensitive);
|
|
|
|
ui.suit->setCompleter(suitCompleter);
|
2019-04-13 15:43:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TabDiveEquipment::~TabDiveEquipment()
|
|
|
|
{
|
|
|
|
QSettings s;
|
|
|
|
s.beginGroup("cylinders_dialog");
|
|
|
|
for (int i = 0; i < CylindersModel::COLUMNS; i++) {
|
2021-11-20 11:22:40 +00:00
|
|
|
if (ignoreHiddenFlag(i))
|
2019-04-13 15:43:45 +00:00
|
|
|
continue;
|
|
|
|
s.setValue(QString("column%1_hidden").arg(i), ui.cylinders->view()->isColumnHidden(i));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-20 18:53:06 +00:00
|
|
|
// This function gets called if a field gets updated by an undo command.
|
|
|
|
// Refresh the corresponding UI field.
|
|
|
|
void TabDiveEquipment::divesChanged(const QVector<dive *> &dives, DiveField field)
|
|
|
|
{
|
2022-09-17 14:21:17 +00:00
|
|
|
if (!parent.includesCurrentDive(dives))
|
2019-07-20 18:53:06 +00:00
|
|
|
return;
|
|
|
|
|
2019-10-13 10:44:39 +00:00
|
|
|
if (field.suit)
|
2024-05-29 18:40:18 +00:00
|
|
|
ui.suit->setText(QString::fromStdString(parent.currentDive->suit));
|
2019-07-20 18:53:06 +00:00
|
|
|
}
|
|
|
|
|
2019-04-13 15:43:45 +00:00
|
|
|
void TabDiveEquipment::toggleTriggeredColumn()
|
|
|
|
{
|
|
|
|
QAction *action = qobject_cast<QAction *>(sender());
|
|
|
|
int col = action->data().toInt();
|
|
|
|
QTableView *view = ui.cylinders->view();
|
|
|
|
|
|
|
|
if (action->isChecked()) {
|
|
|
|
view->showColumn(col);
|
|
|
|
if (view->columnWidth(col) <= 15)
|
|
|
|
view->setColumnWidth(col, 80);
|
2021-11-20 11:22:40 +00:00
|
|
|
} else {
|
2019-04-13 15:43:45 +00:00
|
|
|
view->hideColumn(col);
|
2021-11-20 11:22:40 +00:00
|
|
|
}
|
2019-04-13 15:43:45 +00:00
|
|
|
}
|
|
|
|
|
2022-09-04 09:04:01 +00:00
|
|
|
void TabDiveEquipment::updateData(const std::vector<dive *> &, dive *currentDive, int currentDC)
|
2019-04-13 15:43:45 +00:00
|
|
|
{
|
2022-09-17 14:55:44 +00:00
|
|
|
divecomputer *dc = get_dive_dc(currentDive, currentDC);
|
|
|
|
|
2022-09-04 09:04:01 +00:00
|
|
|
cylindersModel->updateDive(currentDive, currentDC);
|
|
|
|
weightModel->updateDive(currentDive);
|
2022-09-17 14:55:44 +00:00
|
|
|
sensorDelegate.setCurrentDC(dc);
|
|
|
|
tankUseDelegate.setCurrentDC(dc);
|
2019-04-13 15:43:45 +00:00
|
|
|
|
2024-05-29 18:40:18 +00:00
|
|
|
if (currentDive && !currentDive->suit.empty())
|
|
|
|
ui.suit->setText(QString::fromStdString(currentDive->suit));
|
2019-07-20 18:53:06 +00:00
|
|
|
else
|
|
|
|
ui.suit->clear();
|
2019-04-13 15:43:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TabDiveEquipment::clear()
|
|
|
|
{
|
|
|
|
cylindersModel->clear();
|
|
|
|
weightModel->clear();
|
2019-07-20 18:53:06 +00:00
|
|
|
ui.suit->clear();
|
2019-04-13 15:43:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TabDiveEquipment::addCylinder_clicked()
|
|
|
|
{
|
2020-02-27 19:42:13 +00:00
|
|
|
divesEdited(Command::addCylinder(false));
|
2019-04-13 15:43:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TabDiveEquipment::addWeight_clicked()
|
|
|
|
{
|
2019-11-02 20:19:29 +00:00
|
|
|
divesEdited(Command::addWeight(false));
|
2019-04-13 15:43:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TabDiveEquipment::editCylinderWidget(const QModelIndex &index)
|
|
|
|
{
|
2020-02-24 10:14:55 +00:00
|
|
|
if (!index.isValid())
|
2019-04-13 15:43:45 +00:00
|
|
|
return;
|
2020-02-24 10:14:55 +00:00
|
|
|
|
2021-09-02 17:11:35 +00:00
|
|
|
if (index.column() == CylindersModel::REMOVE) {
|
|
|
|
for (dive *d: getDiveSelection()) {
|
2021-11-20 08:37:28 +00:00
|
|
|
if (cylinder_with_sensor_sample(d, index.row())) {
|
2021-09-02 17:11:35 +00:00
|
|
|
if (QMessageBox::warning(this, tr("Remove cylinder?"),
|
|
|
|
tr("The deleted cylinder has sensor readings, which will be lost.\n"
|
|
|
|
"Do you want to continue?"),
|
|
|
|
QMessageBox::Yes|QMessageBox::No) != QMessageBox::Yes)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2021-11-20 08:37:28 +00:00
|
|
|
divesEdited(Command::removeCylinder(index.row(), false));
|
2021-09-02 17:11:35 +00:00
|
|
|
} else {
|
2019-04-13 15:43:45 +00:00
|
|
|
ui.cylinders->edit(index);
|
2021-09-02 17:11:35 +00:00
|
|
|
}
|
2019-04-13 15:43:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void TabDiveEquipment::editWeightWidget(const QModelIndex &index)
|
|
|
|
{
|
2019-11-03 14:04:48 +00:00
|
|
|
if (!index.isValid())
|
|
|
|
return;
|
2019-04-13 15:43:45 +00:00
|
|
|
|
2019-11-08 21:47:38 +00:00
|
|
|
if (index.column() == WeightModel::REMOVE)
|
2019-11-03 14:04:48 +00:00
|
|
|
divesEdited(Command::removeWeight(index.row(), false));
|
2019-11-08 21:47:38 +00:00
|
|
|
else
|
2019-04-13 15:43:45 +00:00
|
|
|
ui.weights->edit(index);
|
|
|
|
}
|
|
|
|
|
2019-07-20 18:53:06 +00:00
|
|
|
void TabDiveEquipment::divesEdited(int i)
|
|
|
|
{
|
|
|
|
// No warning if only one dive was edited
|
|
|
|
if (i <= 1)
|
|
|
|
return;
|
|
|
|
ui.multiDiveWarningMessage->setCloseButtonVisible(false);
|
|
|
|
ui.multiDiveWarningMessage->setText(tr("Warning: edited %1 dives").arg(i));
|
|
|
|
ui.multiDiveWarningMessage->show();
|
|
|
|
}
|
|
|
|
|
|
|
|
void TabDiveEquipment::on_suit_editingFinished()
|
|
|
|
{
|
2022-09-17 14:21:17 +00:00
|
|
|
if (!parent.currentDive)
|
2019-07-20 18:53:06 +00:00
|
|
|
return;
|
|
|
|
divesEdited(Command::editSuit(ui.suit->text(), false));
|
|
|
|
}
|
|
|
|
|
|
|
|
void TabDiveEquipment::closeWarning()
|
|
|
|
{
|
|
|
|
ui.multiDiveWarningMessage->hide();
|
|
|
|
}
|