summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/divelistview.h
blob: 5c9ac2f251deb5e2235e4f8ab2e207594e4c9216 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// SPDX-License-Identifier: GPL-2.0
/*
 * divelistview.h
 *
 * header file for the dive list of Subsurface
 *
 */
#ifndef DIVELISTVIEW_H
#define DIVELISTVIEW_H

/*! A view subclass for use with dives
  Note: calling this a list view might be misleading?
*/

#include <QTreeView>
#include <QLineEdit>
#include <QNetworkAccessManager>
#include "qt-models/divetripmodel.h"

class DiveListView : public QTreeView {
	Q_OBJECT
public:
	DiveListView(QWidget *parent = 0);
	~DiveListView();
	void mouseDoubleClickEvent(QMouseEvent * event);
	void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
	void currentChanged(const QModelIndex &current, const QModelIndex &previous);
	void reload(DiveTripModel::Layout layout, bool forceSort = true);
	bool eventFilter(QObject *, QEvent *);
	void unselectDives();
	void clearTripSelection();
	void selectDive(int dive_table_idx, bool scrollto = false, bool toggle = false);
	void selectDives(const QList<int> &newDiveSelection);
	void rememberSelection();
	void restoreSelection();
	void contextMenuEvent(QContextMenuEvent *event);
	QList<dive_trip_t *> selectedTrips();
	static QString lastUsedImageDir();
	static void updateLastUsedImageDir(const QString &s);
public
slots:
	void toggleColumnVisibilityByIndex();
	void reloadHeaderActions();
	void headerClicked(int);
	void removeFromTrip();
	void deleteDive();
	void markDiveInvalid();
	void rowsInserted(const QModelIndex &parent, int start, int end) override;
	void reset() override;
	void mergeTripAbove();
	void mergeTripBelow();
	void newTripAbove();
	void addToTripAbove();
	void addToTripBelow();
	void mergeDives();
	void splitDives();
	void renumberDives();
	void shiftTimes();
	void loadImages();
	void loadWebImages();
	void diveSelectionChanged(const QVector<QModelIndex> &indexes, bool select);
	void currentDiveChanged(QModelIndex index);
private:
	bool mouseClickSelection;
	QList<int> expandedRows;
	int sortColumn;
	Qt::SortOrder currentOrder;
	DiveTripModel::Layout currentLayout;
	QModelIndex contextMenuIndex;
	bool dontEmitDiveChangedSignal;
	bool selectionSaved;
	// Remember the initial column widths, to avoid writing unchanged widths to the settings
	QVector<int> initialColumnWidths;

	/* if dive_trip_t is null, there's no problem. */
	QMultiHash<dive_trip_t *, int> selectedDives;
	void merge_trip(const QModelIndex &a, const int offset);
	void setColumnWidths();
	void calculateInitialColumnWidth(int col);
	void backupExpandedRows();
	void restoreExpandedRows();
	int lastVisibleColumn();
	void selectTrip(dive_trip_t *trip);
	void updateLastImageTimeOffset(int offset);
	int lastImageTimeOffset();
	void addToTrip(int delta);
	void matchImagesToDives(QStringList fileNames);
	void loadImageFromURL(QUrl url);
	QNetworkAccessManager manager;
};

#endif // DIVELISTVIEW_H