diff --git a/plus.png b/plus.png
new file mode 100644
index 000000000..1008f31ce
Binary files /dev/null and b/plus.png differ
diff --git a/qt-ui/kmessagewidget.cpp b/qt-ui/kmessagewidget.cpp
index dc200654e..5b37c7455 100644
--- a/qt-ui/kmessagewidget.cpp
+++ b/qt-ui/kmessagewidget.cpp
@@ -56,7 +56,7 @@ void KMessageWidgetPrivate::init(KMessageWidget* q_ptr)
QObject::connect(textLabel, SIGNAL(linkHovered(const QString&)), q, SIGNAL(linkHovered(const QString&)));
QAction* closeAction = new QAction(QObject::tr("Close"), q);
- q->connect(closeAction, SIGNAL(toggled(bool)), q, SLOT(animatedHide()));
+ q->connect(closeAction, SIGNAL(triggered(bool)), q, SLOT(animatedHide()));
closeButton = new QToolButton(content);
closeButton->setAutoRaise(true);
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
index 10645c12f..a52058816 100644
--- a/qt-ui/maintab.cpp
+++ b/qt-ui/maintab.cpp
@@ -61,8 +61,50 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
if (label)
label->setAlignment(Qt::AlignHCenter);
}
+
+ /*Thid couldn't be done on the ui file because element
+ is floating, instead of being fixed on the layout. */
+ QIcon plusIcon(":plus");
+ addCylinder = new QPushButton(plusIcon, QString(), ui->cylindersGroup);
+ addCylinder->setFlat(true);
+ addCylinder->setToolTip(tr("Add Cylinder"));
+ connect(addCylinder, SIGNAL(clicked(bool)), this, SLOT(addCylinder_clicked()));
+ addCylinder->setEnabled(false);
+ addWeight = new QPushButton(plusIcon, QString(), ui->weightGroup);
+ addWeight->setFlat(true);
+ addWeight->setToolTip(tr("Add Weight System"));
+ connect(addWeight, SIGNAL(clicked(bool)), this, SLOT(addWeight_clicked()));
+ addWeight->setEnabled(false);
+
+ connect(ui->cylinders, SIGNAL(clicked(QModelIndex)), ui->cylinders->model(), SLOT(remove(QModelIndex)));
+ connect(ui->weights, SIGNAL(clicked(QModelIndex)), ui->weights->model(), SLOT(remove(QModelIndex)));
+
+ ui->cylinders->setColumnWidth( CylindersModel::REMOVE, 24);
+ ui->cylinders->horizontalHeader()->setResizeMode (CylindersModel::REMOVE , QHeaderView::Fixed);
+ ui->weights->setColumnWidth( WeightModel::REMOVE, 24);
+ ui->cylinders->horizontalHeader()->setResizeMode (WeightModel::REMOVE , QHeaderView::Fixed);
}
+// We need to manually position the 'plus' on cylinder and weight.
+void MainTab::resizeEvent(QResizeEvent* event)
+{
+ if (ui->cylindersGroup->isVisible())
+ addCylinder->setGeometry( ui->cylindersGroup->contentsRect().width() - 30, 2, 24,24);
+
+ if (ui->weightGroup->isVisible())
+ addWeight->setGeometry( ui->weightGroup->contentsRect().width() - 30, 2, 24,24);
+
+ QTabWidget::resizeEvent(event);
+}
+
+void MainTab::showEvent(QShowEvent* event)
+{
+ QTabWidget::showEvent(event);
+ addCylinder->setGeometry( ui->cylindersGroup->contentsRect().width() - 30, 2, 24,24);
+ addWeight->setGeometry( ui->weightGroup->contentsRect().width() - 30, 2, 24,24);
+}
+
+
bool MainTab::eventFilter(QObject* object, QEvent* event)
{
if (event->type() == QEvent::FocusIn) {
@@ -204,6 +246,8 @@ void MainTab::updateDiveInfo(int dive)
ui->shortestAllText->setText(get_time_string(stats_selection.shortest_time.seconds, 0));
cylindersModel->setDive(d);
weightModel->setDive(d);
+ addCylinder->setEnabled(true);
+ addWeight->setEnabled(true);
} else {
/* make the fields read-only */
ui->location->setReadOnly(true);
@@ -230,6 +274,8 @@ void MainTab::updateDiveInfo(int dive)
ui->airPressureText->clear();
cylindersModel->clear();
weightModel->clear();
+ addCylinder->setEnabled(false);
+ addWeight->setEnabled(false);
}
/* statisticsTab*/
/* we can access the stats_selection struct, but how do we ensure the relevant dives are selected
@@ -240,7 +286,7 @@ void MainTab::updateDiveInfo(int dive)
// qDebug("min temp %u",stats_selection.min_temp);
}
-void MainTab::on_addCylinder_clicked()
+void MainTab::addCylinder_clicked()
{
if (cylindersModel->rowCount() >= MAX_CYLINDERS)
return;
@@ -267,7 +313,7 @@ void MainTab::on_delCylinder_clicked()
{
}
-void MainTab::on_addWeight_clicked()
+void MainTab::addWeight_clicked()
{
if (weightModel->rowCount() >= MAX_WEIGHTSYSTEMS)
return;
diff --git a/qt-ui/maintab.h b/qt-ui/maintab.h
index c571df086..4b10e7a6b 100644
--- a/qt-ui/maintab.h
+++ b/qt-ui/maintab.h
@@ -38,12 +38,14 @@ public:
void reload();
bool eventFilter(QObject* , QEvent*);
+ virtual void resizeEvent(QResizeEvent* );
+ virtual void showEvent(QShowEvent* );
public Q_SLOTS:
- void on_addCylinder_clicked();
+ void addCylinder_clicked();
void on_editCylinder_clicked();
void on_delCylinder_clicked();
- void on_addWeight_clicked();
+ void addWeight_clicked();
void on_editWeight_clicked();
void on_delWeight_clicked();
void updateDiveInfo(int dive);
@@ -63,6 +65,8 @@ private:
CylindersModel *cylindersModel;
NotesBackup notesBackup;
struct dive* currentDive;
+ QPushButton *addCylinder;
+ QPushButton *addWeight;
};
#endif
diff --git a/qt-ui/maintab.ui b/qt-ui/maintab.ui
index 0a31897a4..0784980eb 100644
--- a/qt-ui/maintab.ui
+++ b/qt-ui/maintab.ui
@@ -14,7 +14,7 @@
TabWidget
- 0
+ 1
@@ -78,22 +78,22 @@
-
-
-
-
-
-
- Rating
-
-
-
- -
-
-
- Visibility
-
-
-
-
+
+ -
+
+
+ Rating
+
+
+
+ -
+
+
+ Visibility
+
+
+
+
-
@@ -110,14 +110,14 @@
-
-
-
-
-
-
- -
-
-
-
+
+ -
+
+
+ -
+
+
+
-
@@ -151,55 +151,17 @@
Qt::Vertical
-
+
Cylinders
-
+
-
- -
-
-
-
-
-
- Edit
-
-
-
- -
-
-
- Add
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Delete
-
-
-
-
-
-
+
Weight
@@ -207,44 +169,6 @@
-
- -
-
-
-
-
-
- Edit
-
-
-
- -
-
-
- Add
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Delete
-
-
-
-
-
@@ -271,24 +195,15 @@
-
-
- 10
-
-
- 10
-
-
- 10
-
-
- 10
-
10
15
+
+ 10
+
-
@@ -386,16 +301,7 @@
-
-
- 10
-
-
- 10
-
-
- 10
-
-
+
10
@@ -598,16 +504,7 @@
-
-
- 10
-
-
- 10
-
-
- 10
-
-
+
10
@@ -750,16 +647,7 @@
-
-
- 10
-
-
- 10
-
-
- 10
-
-
+
10
diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp
index 466dcd2f9..360058dfd 100644
--- a/qt-ui/models.cpp
+++ b/qt-ui/models.cpp
@@ -11,6 +11,7 @@
#include
#include
#include
+#include
extern struct tank_info tank_info[100];
@@ -54,7 +55,7 @@ QVariant CylindersModel::headerData(int section, Qt::Orientation orientation, in
int CylindersModel::columnCount(const QModelIndex& parent) const
{
- return 7;
+ return COLUMNS;
}
QVariant CylindersModel::data(const QModelIndex& index, int role) const
@@ -102,9 +103,57 @@ QVariant CylindersModel::data(const QModelIndex& index, int role) const
break;
}
}
+
+ else if (role == Qt::DecorationRole){
+ if (index.column() == REMOVE){
+ ret = QIcon(":trash");
+ }
+ }
+
return ret;
}
+bool CylindersModel::setData(const QModelIndex& index, const QVariant& value, int role)
+{
+ cylinder_t *cyl = ¤t->cylinder[index.row()];
+ switch(index.column()){
+ case TYPE:{
+ QByteArray desc = value.toByteArray();
+ cyl->type.description = strdup(desc.data());
+ break;
+ }
+ case SIZE:
+ // we can't use get_volume_string because the idiotic imperial tank
+ // sizes take working pressure into account...
+ if (cyl->type.size.mliter) {
+ if (prefs.units.volume == prefs.units.CUFT) {
+ double liters = cuft_to_l(value.toDouble());
+ cyl->type.size.mliter = liters * 1000.0;
+ } else {
+ cyl->type.size.mliter = value.toDouble() * 1000.0;
+ }
+ }
+ break;
+ case MAXPRESS:
+ cyl->type.workingpressure.mbar = value.toInt();
+ break;
+ case START:
+ cyl->start.mbar = value.toInt();
+ break;
+ case END:
+ cyl->end.mbar = value.toInt();
+ break;
+ case O2:
+ cyl->gasmix.o2.permille = value.toInt() * 10 - 5;
+ break;
+ case HE:
+ cyl->gasmix.he.permille = value.toInt() * 10 - 5;
+ break;
+ }
+
+ return QAbstractItemModel::setData(index, value, role);
+}
+
int CylindersModel::rowCount(const QModelIndex& parent) const
{
return rows;
@@ -164,6 +213,33 @@ void CylindersModel::setDive(dive* d)
endInsertRows();
}
+Qt::ItemFlags CylindersModel::flags(const QModelIndex& index) const
+{
+ if (index.column() == REMOVE)
+ return Qt::ItemIsEnabled;
+ return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
+}
+
+void CylindersModel::remove(const QModelIndex& index)
+{
+ if (index.column() != REMOVE){
+ return;
+ }
+ beginRemoveRows(QModelIndex(), index.row(), index.row()); // yah, know, ugly.
+ // Remove code should be here.
+ endRemoveRows();
+}
+
+void WeightModel::remove(const QModelIndex& index)
+{
+ if (index.column() != REMOVE){
+ return;
+ }
+ beginRemoveRows(QModelIndex(), index.row(), index.row()); // yah, know, ugly.
+ // Remove code should be here.
+ endRemoveRows();
+}
+
void WeightModel::clear()
{
if (rows > 0) {
@@ -174,7 +250,7 @@ void WeightModel::clear()
int WeightModel::columnCount(const QModelIndex& parent) const
{
- return 2;
+ return COLUMNS;
}
QVariant WeightModel::data(const QModelIndex& index, int role) const
@@ -195,9 +271,37 @@ QVariant WeightModel::data(const QModelIndex& index, int role) const
break;
}
}
+
+ else if (role == Qt::DecorationRole){
+ if (index.column() == REMOVE){
+ ret = QIcon(":trash");
+ }
+ }
return ret;
}
+bool WeightModel::setData(const QModelIndex& index, const QVariant& value, int role)
+{
+ weightsystem_t *ws = ¤t_dive->weightsystem[index.row()];
+ switch(index.column()) {
+ case TYPE:{
+ QByteArray desc = value.toByteArray();
+ ws->description = strdup(desc.data());
+ break;
+ }
+ case WEIGHT:
+ ws->weight.grams = value.toInt() *1000;
+ break;
+ }
+}
+
+Qt::ItemFlags WeightModel::flags(const QModelIndex& index) const
+{
+ if (index.column() == REMOVE)
+ return Qt::ItemIsEnabled;
+ return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
+}
+
int WeightModel::rowCount(const QModelIndex& parent) const
{
return rows;
diff --git a/qt-ui/models.h b/qt-ui/models.h
index 62ae3913c..ded612bb9 100644
--- a/qt-ui/models.h
+++ b/qt-ui/models.h
@@ -38,18 +38,22 @@ private:
class CylindersModel : public QAbstractTableModel {
Q_OBJECT
public:
- enum Column {TYPE, SIZE, MAXPRESS, START, END, O2, HE};
+ enum Column {REMOVE, TYPE, SIZE, MAXPRESS, START, END, O2, HE, COLUMNS};
explicit CylindersModel(QObject* parent = 0);
/*reimp*/ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
/*reimp*/ int columnCount(const QModelIndex& parent = QModelIndex()) const;
/*reimp*/ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
/*reimp*/ int rowCount(const QModelIndex& parent = QModelIndex()) const;
+ /*reimp*/ Qt::ItemFlags flags(const QModelIndex& index) const;
+ /*reimp*/ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
void add(cylinder_t *cyl);
void clear();
void update();
void setDive(struct dive *d);
+public slots:
+ void remove(const QModelIndex& index);
private:
struct dive *current;
@@ -61,16 +65,20 @@ private:
class WeightModel : public QAbstractTableModel {
Q_OBJECT
public:
- enum Column {TYPE, WEIGHT};
+ enum Column {REMOVE, TYPE, WEIGHT, COLUMNS};
/*reimp*/ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
/*reimp*/ int columnCount(const QModelIndex& parent = QModelIndex()) const;
/*reimp*/ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
/*reimp*/ int rowCount(const QModelIndex& parent = QModelIndex()) const;
+ /*reimp*/ Qt::ItemFlags flags(const QModelIndex& index) const;
+ /*reimp*/ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
void add(weightsystem_t *weight);
void clear();
void update();
void setDive(struct dive *d);
+public slots:
+ void remove(const QModelIndex& index);
private:
struct dive *current;
diff --git a/subsurface.qrc b/subsurface.qrc
index e1939f28e..887390583 100644
--- a/subsurface.qrc
+++ b/subsurface.qrc
@@ -2,5 +2,7 @@
star.svg
subsurface-icon.png
+ plus.png
+ trash.png