[PATCH 2/2] profilewidget2: fix line width when printing on OSX and Linux

Lubomir I. Ivanov neolit123 at gmail.com
Sun Oct 11 04:21:14 PDT 2015


From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

On OSX and Linux only, the cosmetic width of the QPen
on profile axes does not work and is weirdly dependent on the
fact if a printer is installed or not. Possible Qt bugs at hand.

The same is not present on Win32.

To solve the issues we add setPrintMode() in DiveCartesianAxis
and call it for all instances of the class in ProfileWidget2.

This patch also moves gridPen() as a private member function
of PartialGasPressureAxis as it now needs to access member
variables.

Fixes #943

Reported-by: Willem Ferguson <willemferguson at zoology.up.ac.za>
Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
---

not sure if this is the best solution possible...
if anyone has objections after a review, please state them.
---
 qt-ui/profile/divecartesianaxis.cpp | 29 +++++++++++++++++++++--------
 qt-ui/profile/divecartesianaxis.h   |  4 ++++
 qt-ui/profile/profilewidget2.cpp    | 10 ++++++++++
 3 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/qt-ui/profile/divecartesianaxis.cpp b/qt-ui/profile/divecartesianaxis.cpp
index 46f1a96..bf5a538 100644
--- a/qt-ui/profile/divecartesianaxis.cpp
+++ b/qt-ui/profile/divecartesianaxis.cpp
@@ -8,11 +8,14 @@
 #include "divelineitem.h"
 #include "profilewidget2.h"
 
-static QPen gridPen()
+QPen DiveCartesianAxis::gridPen()
 {
 	QPen pen;
 	pen.setColor(getColor(TIME_GRID));
-	pen.setWidth(2);
+	/* cosmetic width() == 0 for lines in printMode
+	 * having setCosmetic(true) and width() > 0 does not work when
+	 * printing on OSX and Linux */
+	pen.setWidth(DiveCartesianAxis::printMode ? 0 : 2);
 	pen.setCosmetic(true);
 	return pen;
 }
@@ -33,6 +36,18 @@ void DiveCartesianAxis::setFontLabelScale(qreal scale)
 	changed = true;
 }
 
+void DiveCartesianAxis::setPrintMode(bool mode)
+{
+	printMode = mode;
+	// update the QPen of all lines depending on printMode
+	QPen newPen = gridPen();
+	QColor oldColor = pen().brush().color();
+	newPen.setBrush(oldColor);
+	setPen(newPen);
+	Q_FOREACH (DiveLineItem *item, lines)
+		item->setPen(pen());
+}
+
 void DiveCartesianAxis::setMaximum(double maximum)
 {
 	if (IS_FP_SAME(max, maximum))
@@ -57,6 +72,7 @@ void DiveCartesianAxis::setTextColor(const QColor &color)
 
 DiveCartesianAxis::DiveCartesianAxis() : QObject(),
 	QGraphicsLineItem(),
+	printMode(false),
 	unitSystem(0),
 	orientation(LeftToRight),
 	min(0),
@@ -220,10 +236,8 @@ void DiveCartesianAxis::updateTicks(color_indice_t color)
 			childPos = begin - i * stepSize;
 		}
 		DiveLineItem *line = new DiveLineItem(this);
-		QPen pen;
+		QPen pen = gridPen();
 		pen.setBrush(getColor(color));
-		pen.setCosmetic(true);
-		pen.setWidthF(2);
 		line->setPen(pen);
 		line->setZValue(0);
 		lines.push_back(line);
@@ -340,11 +354,10 @@ double DiveCartesianAxis::fontLabelScale() const
 
 void DiveCartesianAxis::setColor(const QColor &color)
 {
-	QPen defaultPen(color);
+	QPen defaultPen = gridPen();
+	defaultPen.setColor(color);
 	defaultPen.setJoinStyle(Qt::RoundJoin);
 	defaultPen.setCapStyle(Qt::RoundCap);
-	defaultPen.setWidth(2);
-	defaultPen.setCosmetic(true);
 	setPen(defaultPen);
 }
 
diff --git a/qt-ui/profile/divecartesianaxis.h b/qt-ui/profile/divecartesianaxis.h
index 1515569..27cfa62 100644
--- a/qt-ui/profile/divecartesianaxis.h
+++ b/qt-ui/profile/divecartesianaxis.h
@@ -16,6 +16,9 @@ class DiveCartesianAxis : public QObject, public QGraphicsLineItem {
 	Q_PROPERTY(QPointF pos WRITE setPos READ pos)
 	Q_PROPERTY(qreal x WRITE setX READ x)
 	Q_PROPERTY(qreal y WRITE setY READ y)
+private:
+	bool printMode;
+	QPen gridPen();
 public:
 	enum Orientation {
 		TopToBottom,
@@ -25,6 +28,7 @@ public:
 	};
 	DiveCartesianAxis();
 	virtual ~DiveCartesianAxis();
+	void setPrintMode(bool mode);
 	void setMinimum(double minimum);
 	void setMaximum(double maximum);
 	void setTickInterval(double interval);
diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp
index ab9ae2c..3ccd1bb 100644
--- a/qt-ui/profile/profilewidget2.cpp
+++ b/qt-ui/profile/profilewidget2.cpp
@@ -1479,6 +1479,16 @@ void ProfileWidget2::setPrintMode(bool mode, bool grayscale)
 {
 	printMode = mode;
 	resetZoom();
+
+	// set printMode for axes
+	profileYAxis->setPrintMode(mode);
+	gasYAxis->setPrintMode(mode);
+	temperatureAxis->setPrintMode(mode);
+	timeAxis->setPrintMode(mode);
+	cylinderPressureAxis->setPrintMode(mode);
+	heartBeatAxis->setPrintMode(mode);
+	percentageAxis->setPrintMode(mode);
+
 	isGrayscale = mode ? grayscale : false;
 	mouseFollowerHorizontal->setVisible(!mode);
 	mouseFollowerVertical->setVisible(!mode);
-- 
1.7.11.msysgit.0



More information about the subsurface mailing list