mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Without this patch, the user effectively cannot change the dive mode as any change is overwritten by replot copying current_dive over displayed_dive. The way out is not to call replot but only update the deco ceiling directly. Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
		
			
				
	
	
		
			207 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef PROFILEWIDGET2_H
 | 
						|
#define PROFILEWIDGET2_H
 | 
						|
 | 
						|
#include <QGraphicsView>
 | 
						|
 | 
						|
// /* The idea of this widget is to display and edit the profile.
 | 
						|
//  * It has:
 | 
						|
//  * 1 - ToolTip / Legend item, displays every information of the current mouse position on it, plus the legends of the maps.
 | 
						|
//  * 2 - ToolBox, displays the QActions that are used to do special stuff on the profile ( like activating the plugins. )
 | 
						|
//  * 3 - Cartesian Axis for depth ( y )
 | 
						|
//  * 4 - Cartesian Axis for Gases ( y )
 | 
						|
//  * 5 - Cartesian Axis for Time  ( x )
 | 
						|
//  *
 | 
						|
//  * It needs to be dynamic, things should *flow* on it, not just appear / disappear.
 | 
						|
//  */
 | 
						|
#include "graphicsview-common.h"
 | 
						|
#include "divelineitem.h"
 | 
						|
#include "diveprofileitem.h"
 | 
						|
#include "display.h"
 | 
						|
 | 
						|
class RulerItem2;
 | 
						|
struct dive;
 | 
						|
struct plot_info;
 | 
						|
class ToolTipItem;
 | 
						|
class DiveMeanDepth;
 | 
						|
class DiveReportedCeiling;
 | 
						|
class DiveTextItem;
 | 
						|
class TemperatureAxis;
 | 
						|
class DiveEventItem;
 | 
						|
class DivePlotDataModel;
 | 
						|
class DivePixmapItem;
 | 
						|
class DiveRectItem;
 | 
						|
class DepthAxis;
 | 
						|
class DiveCartesianAxis;
 | 
						|
class DiveProfileItem;
 | 
						|
class TimeAxis;
 | 
						|
class DiveTemperatureItem;
 | 
						|
class DiveHeartrateItem;
 | 
						|
class PercentageItem;
 | 
						|
class DiveGasPressureItem;
 | 
						|
class DiveCalculatedCeiling;
 | 
						|
class DiveCalculatedTissue;
 | 
						|
class PartialPressureGasItem;
 | 
						|
class PartialGasPressureAxis;
 | 
						|
class AbstractProfilePolygonItem;
 | 
						|
class TankItem;
 | 
						|
class DiveHandler;
 | 
						|
class QGraphicsSimpleTextItem;
 | 
						|
class QModelIndex;
 | 
						|
class DivePictureItem;
 | 
						|
 | 
						|
class ProfileWidget2 : public QGraphicsView {
 | 
						|
	Q_OBJECT
 | 
						|
public:
 | 
						|
	enum State {
 | 
						|
		EMPTY,
 | 
						|
		PROFILE,
 | 
						|
		EDIT,
 | 
						|
		ADD,
 | 
						|
		PLAN,
 | 
						|
		INVALID
 | 
						|
	};
 | 
						|
	enum Items {
 | 
						|
		BACKGROUND,
 | 
						|
		PROFILE_Y_AXIS,
 | 
						|
		GAS_Y_AXIS,
 | 
						|
		TIME_AXIS,
 | 
						|
		DEPTH_CONTROLLER,
 | 
						|
		TIME_CONTROLLER,
 | 
						|
		COLUMNS
 | 
						|
	};
 | 
						|
 | 
						|
	ProfileWidget2(QWidget *parent = 0);
 | 
						|
	void plotDive(struct dive *d = 0, bool force = false);
 | 
						|
	virtual bool eventFilter(QObject *, QEvent *);
 | 
						|
	void setupItem(AbstractProfilePolygonItem *item, DiveCartesianAxis *hAxis, DiveCartesianAxis *vAxis, DivePlotDataModel *model, int vData, int hData, int zValue);
 | 
						|
	void setPrintMode(bool mode, bool grayscale = false);
 | 
						|
	bool getPrintMode();
 | 
						|
	bool isPointOutOfBoundaries(const QPointF &point) const;
 | 
						|
	bool isPlanner();
 | 
						|
	bool isAddOrPlanner();
 | 
						|
	double getFontPrintScale();
 | 
						|
	void setFontPrintScale(double scale);
 | 
						|
	void clearHandlers();
 | 
						|
	void recalcCeiling();
 | 
						|
	void setToolTipVisibile(bool visible);
 | 
						|
	State currentState;
 | 
						|
 | 
						|
public
 | 
						|
slots: // Necessary to call from QAction's signals.
 | 
						|
	void settingsChanged();
 | 
						|
	void setEmptyState();
 | 
						|
	void setProfileState();
 | 
						|
	void setPlanState();
 | 
						|
	void setAddState();
 | 
						|
	void changeGas();
 | 
						|
	void addSetpointChange();
 | 
						|
	void addBookmark();
 | 
						|
	void hideEvents();
 | 
						|
	void unhideEvents();
 | 
						|
	void removeEvent();
 | 
						|
	void editName();
 | 
						|
	void makeFirstDC();
 | 
						|
	void deleteCurrentDC();
 | 
						|
	void pointInserted(const QModelIndex &parent, int start, int end);
 | 
						|
	void pointsRemoved(const QModelIndex &, int start, int end);
 | 
						|
	void plotPictures();
 | 
						|
	void setReplot(bool state);
 | 
						|
	void replot();
 | 
						|
 | 
						|
	/* this is called for every move on the handlers. maybe we can speed up this a bit? */
 | 
						|
	void recreatePlannedDive();
 | 
						|
 | 
						|
	/* key press handlers */
 | 
						|
	void keyEscAction();
 | 
						|
	void keyDeleteAction();
 | 
						|
	void keyUpAction();
 | 
						|
	void keyDownAction();
 | 
						|
	void keyLeftAction();
 | 
						|
	void keyRightAction();
 | 
						|
 | 
						|
	void divePlannerHandlerClicked();
 | 
						|
	void divePlannerHandlerReleased();
 | 
						|
 | 
						|
protected:
 | 
						|
	virtual ~ProfileWidget2();
 | 
						|
	virtual void resizeEvent(QResizeEvent *event);
 | 
						|
	virtual void wheelEvent(QWheelEvent *event);
 | 
						|
	virtual void mouseMoveEvent(QMouseEvent *event);
 | 
						|
	virtual void contextMenuEvent(QContextMenuEvent *event);
 | 
						|
	virtual void mouseDoubleClickEvent(QMouseEvent *event);
 | 
						|
	virtual void mousePressEvent(QMouseEvent *event);
 | 
						|
	virtual void mouseReleaseEvent(QMouseEvent *event);
 | 
						|
 | 
						|
private: /*methods*/
 | 
						|
	void fixBackgroundPos();
 | 
						|
	void scrollViewTo(const QPoint &pos);
 | 
						|
	void setupSceneAndFlags();
 | 
						|
	void setupItemSizes();
 | 
						|
	void addItemsToScene();
 | 
						|
	void setupItemOnScene();
 | 
						|
	void disconnectTemporaryConnections();
 | 
						|
	struct plot_data *getEntryFromPos(QPointF pos);
 | 
						|
 | 
						|
private:
 | 
						|
	DivePlotDataModel *dataModel;
 | 
						|
	int zoomLevel;
 | 
						|
	qreal zoomFactor;
 | 
						|
	DivePixmapItem *background;
 | 
						|
	QString backgroundFile;
 | 
						|
	ToolTipItem *toolTipItem;
 | 
						|
	bool isPlotZoomed;
 | 
						|
	bool replotEnabled;
 | 
						|
	// All those here should probably be merged into one structure,
 | 
						|
	// So it's esyer to replicate for more dives later.
 | 
						|
	// In the meantime, keep it here.
 | 
						|
	struct plot_info plotInfo;
 | 
						|
	DepthAxis *profileYAxis;
 | 
						|
	PartialGasPressureAxis *gasYAxis;
 | 
						|
	TemperatureAxis *temperatureAxis;
 | 
						|
	TimeAxis *timeAxis;
 | 
						|
	DiveProfileItem *diveProfileItem;
 | 
						|
	DiveTemperatureItem *temperatureItem;
 | 
						|
	DiveMeanDepthItem *meanDepthItem;
 | 
						|
	DiveCartesianAxis *cylinderPressureAxis;
 | 
						|
	DiveGasPressureItem *gasPressureItem;
 | 
						|
	QList<DiveEventItem *> eventItems;
 | 
						|
	DiveTextItem *diveComputerText;
 | 
						|
	DiveCalculatedCeiling *diveCeiling;
 | 
						|
	QList<DiveCalculatedTissue *> allTissues;
 | 
						|
	DiveReportedCeiling *reportedCeiling;
 | 
						|
	PartialPressureGasItem *pn2GasItem;
 | 
						|
	PartialPressureGasItem *pheGasItem;
 | 
						|
	PartialPressureGasItem *po2GasItem;
 | 
						|
	PartialPressureGasItem *o2SetpointGasItem;
 | 
						|
	PartialPressureGasItem *ccrsensor1GasItem;
 | 
						|
	PartialPressureGasItem *ccrsensor2GasItem;
 | 
						|
	PartialPressureGasItem *ccrsensor3GasItem;
 | 
						|
	DiveCartesianAxis *heartBeatAxis;
 | 
						|
	DiveHeartrateItem *heartBeatItem;
 | 
						|
	DiveCartesianAxis *percentageAxis;
 | 
						|
	QList<DivePercentageItem *> allPercentages;
 | 
						|
	DiveAmbPressureItem *ambPressureItem;
 | 
						|
	DiveGFLineItem *gflineItem;
 | 
						|
	DiveLineItem *mouseFollowerVertical;
 | 
						|
	DiveLineItem *mouseFollowerHorizontal;
 | 
						|
	RulerItem2 *rulerItem;
 | 
						|
	TankItem *tankItem;
 | 
						|
	bool isGrayscale;
 | 
						|
	bool printMode;
 | 
						|
 | 
						|
	//specifics for ADD and PLAN
 | 
						|
	QList<DiveHandler *> handles;
 | 
						|
	QList<QGraphicsSimpleTextItem *> gases;
 | 
						|
	QList<DivePictureItem *> pictures;
 | 
						|
	void repositionDiveHandlers();
 | 
						|
	int fixHandlerIndex(DiveHandler *activeHandler);
 | 
						|
	friend class DiveHandler;
 | 
						|
	QHash<Qt::Key, QAction *> actionsForKeys;
 | 
						|
	bool shouldCalculateMaxTime;
 | 
						|
	bool shouldCalculateMaxDepth;
 | 
						|
	int maxtime;
 | 
						|
	int maxdepth;
 | 
						|
	double fontPrintScale;
 | 
						|
};
 | 
						|
 | 
						|
#endif // PROFILEWIDGET2_H
 |