In DiveListView, we have a very fundamental problem: When On the one hand, we get informed of user-selection in the DiveListView::selectionChanged() slot. This has to set the correct flags in the C-backend. On the other hand, sometimes we have to set the selection programatically, e.g. when selecting a trip. This is done by calling QItemSelectionModel::select(). But: this will *also* call into the above slot, in which we can't tell whether it was a user interaction or an internal call. This can lead to either infinite loops or very inefficient behavior, because the current dive is set numerous times. The current code is aware of that and disconnects the corresponding signal. This is scary, as these signals are set internally by the model and view. Replace this by a global "command executing" flag in DiveListNotifier. The flag is set using a "marker" class, which resets the flag once it goes out of scope (cf. RAII pattern). In DiveListView, only process a selection if the flag is not set. Otherwise simply call the QTreeView base class, to reflect the new selection in the UI. To have a common point for notifications of selection changes, add such a signal to DiveListNotifier. This signal will be used by the DiveListView as well as the Command-objects. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
91 lines
2.6 KiB
C++
91 lines
2.6 KiB
C++
// 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 ¤t, 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();
|
|
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
|