[LyX/master] Make InsetInfo math/IPA icons visible in dark mode

Juergen Spitzmueller spitz at lyx.org
Sun Dec 13 08:23:16 UTC 2020


commit 148748b0c2f7d24471ee9beb54c4a6c6b3d20f31
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sun Dec 13 09:51:32 2020 +0100

    Make InsetInfo math/IPA icons visible in dark mode
    
    This does not show the real colors, but the icons are at least readable.
---
 src/frontends/NullPainter.h        |    2 +-
 src/frontends/Painter.h            |    2 +-
 src/frontends/qt/GuiPainter.cpp    |   14 ++++++++++++--
 src/frontends/qt/GuiPainter.h      |    2 +-
 src/insets/InsetGraphics.cpp       |    2 +-
 src/insets/InsetGraphicsParams.cpp |    3 +++
 src/insets/InsetGraphicsParams.h   |    4 ++++
 src/insets/InsetInfo.cpp           |    4 ++++
 src/insets/RenderBase.h            |    2 +-
 src/insets/RenderButton.cpp        |    2 +-
 src/insets/RenderButton.h          |    2 +-
 src/insets/RenderGraphic.cpp       |    4 ++--
 src/insets/RenderGraphic.h         |    2 +-
 src/insets/RenderPreview.cpp       |    4 ++--
 src/insets/RenderPreview.h         |    4 ++--
 15 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/src/frontends/NullPainter.h b/src/frontends/NullPainter.h
index 4a4b594..8f7efff 100644
--- a/src/frontends/NullPainter.h
+++ b/src/frontends/NullPainter.h
@@ -57,7 +57,7 @@ public:
 	void point(int, int, Color) override {}
 
 	/// draw an image from the image cache
-	void image(int, int, int, int, graphics::Image const &) override {}
+	void image(int, int, int, int, graphics::Image const &, bool) override {}
 
 	/// draw a string
 	void text(int, int, docstring const &, FontInfo const &) override {}
diff --git a/src/frontends/Painter.h b/src/frontends/Painter.h
index e2796d9..6deeda6 100644
--- a/src/frontends/Painter.h
+++ b/src/frontends/Painter.h
@@ -127,7 +127,7 @@ public:
 
 	/// draw an image from the image cache
 	virtual void image(int x, int y, int w, int h,
-		graphics::Image const & image) = 0;
+		graphics::Image const & image, bool const darkmode = false) = 0;
 
 	/// draw a string at position x, y (y is the baseline).
 	virtual void text(int x, int y, docstring const & str, FontInfo const & f) = 0;
diff --git a/src/frontends/qt/GuiPainter.cpp b/src/frontends/qt/GuiPainter.cpp
index 79bbf56..a143b2b 100644
--- a/src/frontends/qt/GuiPainter.cpp
+++ b/src/frontends/qt/GuiPainter.cpp
@@ -233,14 +233,24 @@ void GuiPainter::arc(int x, int y, unsigned int w, unsigned int h,
 }
 
 
-void GuiPainter::image(int x, int y, int w, int h, graphics::Image const & i)
+void GuiPainter::image(int x, int y, int w, int h, graphics::Image const & i, bool const darkmode)
 {
 	graphics::GuiImage const & qlimage =
 		static_cast<graphics::GuiImage const &>(i);
 
 	fillRectangle(x, y, w, h, Color_graphicsbg);
 
-	QImage const & image = qlimage.image();
+	QImage image = qlimage.image();
+	
+	QPalette palette = QPalette();
+	QColor text_color = palette.color(QPalette::Active, QPalette::WindowText);
+	QColor bg_color = palette.color(QPalette::Active, QPalette::Window);
+	// guess whether we are in dark mode
+	if (darkmode && text_color.black() < bg_color.black())
+		// FIXME this is only a cheap approximation
+		// Ideally, replace colors as in GuiApplication::prepareForDarkmode()
+		image.invertPixels();
+
 	QRectF const drect = QRectF(x, y, w, h);
 	QRectF const srect = QRectF(0, 0, image.width(), image.height());
 	// Bilinear filtering is needed on a rare occasion for instant previews when
diff --git a/src/frontends/qt/GuiPainter.h b/src/frontends/qt/GuiPainter.h
index bffcd9a..bdf3e46 100644
--- a/src/frontends/qt/GuiPainter.h
+++ b/src/frontends/qt/GuiPainter.h
@@ -104,7 +104,7 @@ public:
 
 	/// draw an image from the image cache
 	void image(int x, int y, int w, int h,
-		lyx::graphics::Image const & image) override;
+		lyx::graphics::Image const & image, bool const darkmode = false) override;
 
 	/// draw a string at position x, y (y is the baseline).
 	void text(int x, int y, docstring const & str, FontInfo const & f) override;
diff --git a/src/insets/InsetGraphics.cpp b/src/insets/InsetGraphics.cpp
index d8fabd6..7daa40d 100644
--- a/src/insets/InsetGraphics.cpp
+++ b/src/insets/InsetGraphics.cpp
@@ -293,7 +293,7 @@ void InsetGraphics::metrics(MetricsInfo & mi, Dimension & dim) const
 
 void InsetGraphics::draw(PainterInfo & pi, int x, int y) const
 {
-	graphic_->draw(pi, x, y);
+	graphic_->draw(pi, x, y, params_.darkModeSensitive);
 }
 
 
diff --git a/src/insets/InsetGraphicsParams.cpp b/src/insets/InsetGraphicsParams.cpp
index a8c2a26..13b57c0 100644
--- a/src/insets/InsetGraphicsParams.cpp
+++ b/src/insets/InsetGraphicsParams.cpp
@@ -74,6 +74,7 @@ void InsetGraphicsParams::init()
 
 	bbox = graphics::BoundingBox();	// bounding box
 	clip = false;			// clip image
+	darkModeSensitive = false;	// dark mode dependency (InsetInfo)
 
 	rotateAngle = "0";		// angle of rotation in degrees
 	rotateOrigin.erase();		// Origin of rotation
@@ -96,6 +97,7 @@ void InsetGraphicsParams::copy(InsetGraphicsParams const & params)
 
 	bbox = params.bbox;
 	clip = params.clip;
+	darkModeSensitive = params.darkModeSensitive;
 
 	rotateAngle = params.rotateAngle;
 	rotateOrigin = params.rotateOrigin;
@@ -119,6 +121,7 @@ bool operator==(InsetGraphicsParams const & left,
 
 	    left.bbox == right.bbox &&
 	    left.clip == right.clip &&
+	    left.darkModeSensitive == right.darkModeSensitive &&
 
 	    left.rotateAngle == right.rotateAngle &&
 	    left.rotateOrigin == right.rotateOrigin &&
diff --git a/src/insets/InsetGraphicsParams.h b/src/insets/InsetGraphicsParams.h
index 315f4c7..1aa0b23 100644
--- a/src/insets/InsetGraphicsParams.h
+++ b/src/insets/InsetGraphicsParams.h
@@ -63,6 +63,10 @@ public:
 	/// any userdefined special command
 	std::string special;
 
+	/// Does this need to be handled specifically
+	/// in dark mode? (use by InsetInfo)
+	bool darkModeSensitive;
+
 	///
 	InsetGraphicsParams();
 	///
diff --git a/src/insets/InsetInfo.cpp b/src/insets/InsetInfo.cpp
index 96c3062..819d8ff 100644
--- a/src/insets/InsetInfo.cpp
+++ b/src/insets/InsetInfo.cpp
@@ -1078,6 +1078,10 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype, bool cons
 		igp.lyxscale = percent_scale;
 		igp.scale = string();
 		igp.width = Length(1, Length::EM);
+		if (contains(file.absoluteFilePath(), from_ascii("math"))
+		    || contains(file.absoluteFilePath(), from_ascii("ert-insert"))
+		    || suffixIs(file.onlyPath().absoluteFilePath(), from_ascii("ipa")))
+			igp.darkModeSensitive = true;
 		inset->setParams(igp);
 		clear();
 		Font const f(inherit_font, params_.lang);
diff --git a/src/insets/RenderBase.h b/src/insets/RenderBase.h
index 4fb3f84..b522978 100644
--- a/src/insets/RenderBase.h
+++ b/src/insets/RenderBase.h
@@ -36,7 +36,7 @@ public:
 	/// \retval true if the metrics has changed.
 	virtual void metrics(MetricsInfo & mi, Dimension & dim) const = 0;
 	/// draw inset and update (xo, yo)-cache
-	virtual void draw(PainterInfo & pi, int x, int y) const = 0;
+	virtual void draw(PainterInfo & pi, int x, int y, bool const darkmode = false) const = 0;
 
 	/// render state, exact meaning of state is render-specific
 	void setRenderState(bool state) { state_ = state; }
diff --git a/src/insets/RenderButton.cpp b/src/insets/RenderButton.cpp
index a00a4c5..c5bc4af 100644
--- a/src/insets/RenderButton.cpp
+++ b/src/insets/RenderButton.cpp
@@ -54,7 +54,7 @@ void RenderButton::metrics(MetricsInfo & mi, Dimension & dim) const
 }
 
 
-void RenderButton::draw(PainterInfo & pi, int x, int y) const
+void RenderButton::draw(PainterInfo & pi, int x, int y, bool) const
 {
 	// Draw it as a box with the LaTeX text
 	FontInfo font = inherit_font_ ? pi.base.font : sane_font;
diff --git a/src/insets/RenderButton.h b/src/insets/RenderButton.h
index 69513f0..ab68de2 100644
--- a/src/insets/RenderButton.h
+++ b/src/insets/RenderButton.h
@@ -30,7 +30,7 @@ public:
 	/// compute the size of the object returned in dim
 	void metrics(MetricsInfo & mi, Dimension & dim) const override;
 	/// draw inset and update (xo, yo)-cache
-	void draw(PainterInfo & pi, int x, int y) const override;
+	void draw(PainterInfo & pi, int x, int y, bool const darkmode = false) const override;
 
 	/// Provide the text for the button
 	void update(docstring const &, bool editable,
diff --git a/src/insets/RenderGraphic.cpp b/src/insets/RenderGraphic.cpp
index 280a657..318f8aa 100644
--- a/src/insets/RenderGraphic.cpp
+++ b/src/insets/RenderGraphic.cpp
@@ -187,7 +187,7 @@ void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const
 }
 
 
-void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
+void RenderGraphic::draw(PainterInfo & pi, int x, int y, bool const darkmode) const
 {
 	// This will draw the graphics. If the graphics has not been
 	// loaded yet, we draw just a rectangle.
@@ -197,7 +197,7 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
 	int const h = dim_.height();
 
 	if (displayGraphic(params_) && readyToDisplay(loader_))
-		pi.pain.image(x1, y1, w, h, *loader_.image());
+		pi.pain.image(x1, y1, w, h, *loader_.image(), darkmode);
 
 	else {
 		Color c = pi.change.changed() ? pi.change.color() : Color_foreground;
diff --git a/src/insets/RenderGraphic.h b/src/insets/RenderGraphic.h
index 8b17bd8..fc631a0 100644
--- a/src/insets/RenderGraphic.h
+++ b/src/insets/RenderGraphic.h
@@ -31,7 +31,7 @@ public:
 	/// compute the size of the object returned in dim
 	void metrics(MetricsInfo & mi, Dimension & dim) const override;
 	/// draw inset
-	void draw(PainterInfo & pi, int x, int y) const override;
+	void draw(PainterInfo & pi, int x, int y, bool const darkmode = false) const override;
 
 	/// Refresh the info about which file to display and how to display it.
 	void update(graphics::Params const & params);
diff --git a/src/insets/RenderPreview.cpp b/src/insets/RenderPreview.cpp
index 0b17d2f..2ed69bb 100644
--- a/src/insets/RenderPreview.cpp
+++ b/src/insets/RenderPreview.cpp
@@ -154,7 +154,7 @@ void RenderPreview::metrics(MetricsInfo & mi, Dimension & dim) const
 }
 
 
-void RenderPreview::draw(PainterInfo & pi, int x, int y) const
+void RenderPreview::draw(PainterInfo & pi, int x, int y, bool const) const
 {
 	LBUFERR(pi.base.bv);
 
@@ -280,7 +280,7 @@ void RenderMonitoredPreview::setAbsFile(FileName const & file)
 }
 
 
-void RenderMonitoredPreview::draw(PainterInfo & pi, int x, int y) const
+void RenderMonitoredPreview::draw(PainterInfo & pi, int x, int y, bool const) const
 {
 	RenderPreview::draw(pi, x, y);
 	startMonitoring();
diff --git a/src/insets/RenderPreview.h b/src/insets/RenderPreview.h
index ca85c04..97725d8 100644
--- a/src/insets/RenderPreview.h
+++ b/src/insets/RenderPreview.h
@@ -52,7 +52,7 @@ public:
 	/// Compute the size of the object, returned in dim
 	void metrics(MetricsInfo &, Dimension & dim) const override;
 	///
-	void draw(PainterInfo & pi, int x, int y) const override;
+	void draw(PainterInfo & pi, int x, int y, bool const darkmode = false) const override;
 
 	/** Find the PreviewLoader and add a LaTeX snippet to it.
 	 *  Do not start the loading process.
@@ -112,7 +112,7 @@ class RenderMonitoredPreview : public RenderPreview {
 public:
 	explicit RenderMonitoredPreview(Inset const *);
 	///
-	void draw(PainterInfo & pi, int x, int y) const override;
+	void draw(PainterInfo & pi, int x, int y, bool const darkmode = false) const override;
 	///
 	void setAbsFile(support::FileName const & file);
 	///


More information about the lyx-cvs mailing list