mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Qt: Implement trip merging logic
So during my Maui trip, I had a short hiatus in diving, causing subsurface to start a new trip for the last day of diving. I could have just started the old gtk branch to fix it up, but decided that I might as well try to implement the "merge trip" logic in the Qt branch instead. This is the end result of that. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
c7f8ada4ff
commit
5ce5b05521
4 changed files with 42 additions and 1 deletions
|
@ -298,6 +298,36 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
|
||||||
Q_EMIT currentDiveChanged(selected_dive);
|
Q_EMIT currentDiveChanged(selected_dive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DiveListView::merge_trip(const QModelIndex &a, int offset)
|
||||||
|
{
|
||||||
|
int i = a.row() + offset;
|
||||||
|
QModelIndex b = a.sibling(i,0);
|
||||||
|
|
||||||
|
dive_trip_t *trip_a = (dive_trip_t *) a.data(DiveTripModel::TRIP_ROLE).value<void*>();
|
||||||
|
dive_trip_t *trip_b = (dive_trip_t *) b.data(DiveTripModel::TRIP_ROLE).value<void*>();
|
||||||
|
|
||||||
|
if (trip_a == trip_b || !trip_a || !trip_b)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!trip_a->location)
|
||||||
|
trip_a->location = strdup(trip_b->location);
|
||||||
|
if (!trip_a->notes)
|
||||||
|
trip_a->notes = strdup(trip_b->notes);
|
||||||
|
while (trip_b->dives)
|
||||||
|
add_dive_to_trip(trip_b->dives, trip_a);
|
||||||
|
reload(currentLayout, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiveListView::mergeTripAbove()
|
||||||
|
{
|
||||||
|
merge_trip(contextMenuIndex, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiveListView::mergeTripBelow()
|
||||||
|
{
|
||||||
|
merge_trip(contextMenuIndex, +1);
|
||||||
|
}
|
||||||
|
|
||||||
void DiveListView::removeFromTrip()
|
void DiveListView::removeFromTrip()
|
||||||
{
|
{
|
||||||
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
|
@ -336,6 +366,7 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event)
|
||||||
// let's remember where we are
|
// let's remember where we are
|
||||||
contextMenuIndex = indexAt(event->pos());
|
contextMenuIndex = indexAt(event->pos());
|
||||||
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
|
dive_trip_t *trip = (dive_trip_t *) contextMenuIndex.data(DiveTripModel::TRIP_ROLE).value<void*>();
|
||||||
QMenu popup(this);
|
QMenu popup(this);
|
||||||
if (currentLayout == DiveTripModel::TREE) {
|
if (currentLayout == DiveTripModel::TREE) {
|
||||||
popup.addAction(tr("expand all"), this, SLOT(expandAll()));
|
popup.addAction(tr("expand all"), this, SLOT(expandAll()));
|
||||||
|
@ -344,6 +375,10 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event)
|
||||||
if (d) {
|
if (d) {
|
||||||
popup.addAction(tr("remove dive from trip"), this, SLOT(removeFromTrip()));
|
popup.addAction(tr("remove dive from trip"), this, SLOT(removeFromTrip()));
|
||||||
}
|
}
|
||||||
|
if (trip) {
|
||||||
|
popup.addAction(tr("Merge trip with trip above"), this, SLOT(mergeTripAbove()));
|
||||||
|
popup.addAction(tr("Merge trip with trip below"), this, SLOT(mergeTripBelow()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (d)
|
if (d)
|
||||||
popup.addAction(tr("delete dive"), this, SLOT(deleteDive()));
|
popup.addAction(tr("delete dive"), this, SLOT(deleteDive()));
|
||||||
|
|
|
@ -40,6 +40,8 @@ public slots:
|
||||||
void deleteDive();
|
void deleteDive();
|
||||||
void testSlot();
|
void testSlot();
|
||||||
void fixMessyQtModelBehaviour();
|
void fixMessyQtModelBehaviour();
|
||||||
|
void mergeTripAbove();
|
||||||
|
void mergeTripBelow();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void currentDiveChanged(int divenr);
|
void currentDiveChanged(int divenr);
|
||||||
|
@ -50,6 +52,7 @@ private:
|
||||||
DiveTripModel::Layout currentLayout;
|
DiveTripModel::Layout currentLayout;
|
||||||
QLineEdit *searchBox;
|
QLineEdit *searchBox;
|
||||||
QModelIndex contextMenuIndex;
|
QModelIndex contextMenuIndex;
|
||||||
|
void merge_trip(const QModelIndex &a, const int offset);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DIVELISTVIEW_H
|
#endif // DIVELISTVIEW_H
|
||||||
|
|
|
@ -909,6 +909,9 @@ QVariant TripItem::data(int column, int role) const
|
||||||
{
|
{
|
||||||
QVariant ret;
|
QVariant ret;
|
||||||
|
|
||||||
|
if (role == DiveTripModel::TRIP_ROLE)
|
||||||
|
return QVariant::fromValue<void*>(trip);
|
||||||
|
|
||||||
if (role == DiveTripModel::SORT_ROLE)
|
if (role == DiveTripModel::SORT_ROLE)
|
||||||
return (qulonglong)trip->when;
|
return (qulonglong)trip->when;
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,7 @@ public:
|
||||||
enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT,
|
enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT,
|
||||||
SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS };
|
SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS };
|
||||||
|
|
||||||
enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, SORT_ROLE};
|
enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, TRIP_ROLE, SORT_ROLE};
|
||||||
enum Layout{TREE, LIST, CURRENT};
|
enum Layout{TREE, LIST, CURRENT};
|
||||||
|
|
||||||
Qt::ItemFlags flags(const QModelIndex &index) const;
|
Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue