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