From 148748b0c2f7d24471ee9beb54c4a6c6b3d20f31 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sun, 13 Dec 2020 09:51:32 +0100 Subject: [PATCH 1/1] 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 4a4b5941b7..8f7efff2ec 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 e2796d97d9..6deeda608d 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 79bbf5603e..a143b2b053 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(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 bffcd9ae5a..bdf3e462e7 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 d8fabd6f4d..7daa40d9aa 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 a8c2a26239..13b57c0775 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 315f4c7082..1aa0b23d5b 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 96c3062ebf..819d8ff62e 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 4fb3f84bb6..b522978ef6 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 a00a4c5a73..c5bc4af87b 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 69513f09ad..ab68de2947 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 280a657ceb..318f8aab0d 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 8b17bd8824..fc631a0c7a 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 0b17d2f83c..2ed69bb61f 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 ca85c04e95..97725d862d 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); /// -- 2.39.2