The existing code took an odd approach. It tried to change all selected dives whenever the user edited a field, and kept all this backup data in case the user rejected the edits. This code takes the opposite approach. Only edit a copy of the selected dive and then when the user accepts it, edit all the dives and when the user rejects the edit simply redraw the screen (as all the "real" data is still unchanged). This not only saves quite a bit of code, it should be much easier to get correct. Admitedly this code will need quite a bit more testing to make sure it works as intended, but as far as I can tell it already gets more scenarios right than the previous implementation. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
105 lines
2.6 KiB
C++
105 lines
2.6 KiB
C++
/*
|
|
* maintab.h
|
|
*
|
|
* header file for the main tab of Subsurface
|
|
*
|
|
*/
|
|
#ifndef MAINTAB_H
|
|
#define MAINTAB_H
|
|
|
|
#include <QTabWidget>
|
|
#include <QDialog>
|
|
#include <QMap>
|
|
|
|
#include "models.h"
|
|
#include "ui_maintab.h"
|
|
#include "completionmodels.h"
|
|
|
|
class QCompleter;
|
|
struct dive;
|
|
|
|
struct Completers {
|
|
QCompleter *location;
|
|
QCompleter *divemaster;
|
|
QCompleter *buddy;
|
|
QCompleter *suit;
|
|
QCompleter *tags;
|
|
};
|
|
|
|
class MainTab : public QTabWidget {
|
|
Q_OBJECT
|
|
public:
|
|
enum EditMode {
|
|
NONE,
|
|
DIVE,
|
|
TRIP,
|
|
ADD,
|
|
MANUALLY_ADDED_DIVE
|
|
};
|
|
|
|
MainTab(QWidget *parent);
|
|
~MainTab();
|
|
void clearStats();
|
|
void clearInfo();
|
|
void clearEquipment();
|
|
void reload();
|
|
bool eventFilter(QObject *, QEvent *);
|
|
void initialUiSetup();
|
|
bool isEditing();
|
|
void updateCoordinatesText(qreal lat, qreal lon);
|
|
void nextInputField(QKeyEvent *event);
|
|
signals:
|
|
void addDiveFinished();
|
|
|
|
public
|
|
slots:
|
|
void addCylinder_clicked();
|
|
void addWeight_clicked();
|
|
void updateDiveInfo(int dive = selected_dive);
|
|
void acceptChanges();
|
|
void rejectChanges();
|
|
void on_location_textChanged(const QString &text);
|
|
void on_coordinates_textChanged(const QString &text);
|
|
void on_divemaster_textChanged();
|
|
void on_buddy_textChanged();
|
|
void on_suit_textChanged(const QString &text);
|
|
void on_notes_textChanged();
|
|
void on_airtemp_textChanged(const QString &text);
|
|
void on_watertemp_textChanged(const QString &text);
|
|
void validate_temp_field(QLineEdit *tempField, const QString &text);
|
|
void on_dateTimeEdit_dateTimeChanged(const QDateTime &datetime);
|
|
void on_rating_valueChanged(int value);
|
|
void on_visibility_valueChanged(int value);
|
|
void on_tagWidget_textChanged();
|
|
void editCylinderWidget(const QModelIndex &index);
|
|
void editWeightWidget(const QModelIndex &index);
|
|
void addDiveStarted();
|
|
void addMessageAction(QAction *action);
|
|
void hideMessage();
|
|
void closeMessage();
|
|
void displayMessage(QString str);
|
|
void enableEdition(EditMode newEditMode = NONE);
|
|
void toggleTriggeredColumn();
|
|
void updateTextLabels(bool showUnits = true);
|
|
QString trHemisphere(const char *orig);
|
|
|
|
private:
|
|
Ui::MainTab ui;
|
|
WeightModel *weightModel;
|
|
CylindersModel *cylindersModel;
|
|
EditMode editMode;
|
|
BuddyCompletionModel buddyModel;
|
|
DiveMasterCompletionModel diveMasterModel;
|
|
LocationCompletionModel locationModel;
|
|
SuitCompletionModel suitModel;
|
|
TagCompletionModel tagModel;
|
|
struct dive editedDive; // when editing we do all changes on a copy of the real data and only apply when saved
|
|
Completers completers;
|
|
void resetPallete();
|
|
void saveTags();
|
|
bool tagsChanged(struct dive *a, struct dive *b);
|
|
void updateGpsCoordinates(const struct dive *dive);
|
|
};
|
|
|
|
#endif // MAINTAB_H
|