[LyX/master] Introduce default box frame color (#12921)

Juergen Spitzmueller spitz at lyx.org
Sat Sep 30 06:38:19 UTC 2023


commit 087f6bce71dc6d164bccaa49461d17338e7d6c4e
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sat Sep 30 09:56:27 2023 +0200

    Introduce default box frame color (#12921)
    
    This better aligns with dark mode
---
 development/FORMAT          |    4 ++++
 lib/lyx2lyx/lyx_2_4.py      |   21 +++++++++++++++++++--
 src/frontends/qt/GuiBox.cpp |   38 ++++++++------------------------------
 src/frontends/qt/GuiBox.h   |    3 +--
 src/insets/InsetBox.cpp     |   32 ++++++++++++++++++++++++--------
 src/insets/InsetBox.h       |    4 ++++
 src/version.h               |    4 ++--
 7 files changed, 62 insertions(+), 44 deletions(-)

diff --git a/development/FORMAT b/development/FORMAT
index 1711f88..2834dd5 100644
--- a/development/FORMAT
+++ b/development/FORMAT
@@ -7,6 +7,10 @@ changes happened in particular if possible. A good example would be
 
 -----------------------
 
+2023-09-29 Jürgen Spitzmüller <spitz at lyx.org> 
+	* Format incremented to 620: Add InsetBox "default" framecolor ("foreground"
+	  rather than "black" in GUI). This aligns better with dark mode.
+
 2023-09-06 Richard Kimberly Heck <rikiheck at lyx.org>
 	* Format incremented to 619: New document header \use_formatted_ref
 	  for workarea display purposes only.
diff --git a/lib/lyx2lyx/lyx_2_4.py b/lib/lyx2lyx/lyx_2_4.py
index 4cc5fe5..ca81759 100644
--- a/lib/lyx2lyx/lyx_2_4.py
+++ b/lib/lyx2lyx/lyx_2_4.py
@@ -5554,6 +5554,21 @@ def revert_formatted_refs(document):
         del document.header[i]
 
 
+def revert_box_fcolor(document):
+    i = 0
+    while True:
+        i = find_token(document.body, '\\begin_inset Box Boxed', i+1)
+        if i == -1:
+            break
+        j = find_end_of_inset(document.body, i)
+        if j == -1:
+            document.warning("Malformed LyX document: Can't find end of framed box inset at line %d" % i)
+            continue
+        k = find_token(document.body, 'framecolor "default"', i, j)
+        if k != -1:
+            document.body[k] = 'framecolor "black"'
+
+
 ##
 # Conversion hub
 #
@@ -5634,11 +5649,13 @@ convert = [
            [616, [convert_empty_macro]],
            [617, [convert_cov_options]],
            [618, []],
-           [619, []]
+           [619, []],
+           [620, []]
           ]
 
 
-revert =  [[618, [revert_formatted_refs]],
+revert =  [[619, [revert_box_fcolor]],
+           [618, [revert_formatted_refs]],
            [617, [revert_hequotes]],
            [616, [revert_expreambles,revert_exarg2,revert_linggloss2,revert_cov_options]],
            [615, [revert_empty_macro]],
diff --git a/src/frontends/qt/GuiBox.cpp b/src/frontends/qt/GuiBox.cpp
index bda71a6..c7c8dc9 100644
--- a/src/frontends/qt/GuiBox.cpp
+++ b/src/frontends/qt/GuiBox.cpp
@@ -133,6 +133,8 @@ GuiBox::GuiBox(QWidget * parent) : InsetParamsWidget(parent)
 	connect(shadowsizeED, SIGNAL(textChanged(QString)), this, SIGNAL(changed()));
 	connect(shadowsizeUnitsLC, SIGNAL(selectionChanged(lyx::Length::UNIT)),
 		this, SIGNAL(changed()));
+	connect(frameColorCO, SIGNAL(currentIndexChanged(int)),
+		this, SIGNAL(changed()));
 	connect(backgroundColorCO, SIGNAL(currentIndexChanged(int)),
 		this, SIGNAL(changed()));
 
@@ -159,15 +161,17 @@ GuiBox::GuiBox(QWidget * parent) : InsetParamsWidget(parent)
 }
 
 
-void GuiBox::fillComboColor(QComboBox * combo, bool const is_none)
+void GuiBox::fillComboColor(QComboBox * combo, bool const is_background)
 {
 	combo->clear();
 	QPixmap coloritem(32, 32);
 	QColor color;
-	// frameColorCO cannot be uncolored
-	if (is_none)
+	// condition on the two possible types
+	if (is_background)
 		combo->addItem(toqstr(translateIfPossible(lcolor.getGUIName(Color_none))),
 			       toqstr(lcolor.getLaTeXName(Color_none)));
+	else
+		combo->addItem(qt_("Default"), toqstr("default"));
 	QList<ColorCode>::const_iterator cit = color_codes_.begin();
 	for (; cit != color_codes_.end(); ++cit) {
 		QString const latexname = toqstr(lcolor.getLaTeXName(*cit));
@@ -215,32 +219,6 @@ void GuiBox::on_typeCO_activated(int index)
 			widthCB->setChecked(itype != "none");
 		pagebreakCB->setChecked(false);
 	}
-	// assure that the frame color is black for frameless boxes to
-	// provide the color "none"
-	int const b = frameColorCO->findData("black");
-	if (frameless && frameColorCO->currentIndex() != b)
-		frameColorCO->setCurrentIndex(b);
-	changed();
-}
-
-
-void GuiBox::on_frameColorCO_currentIndexChanged(int index)
-{
-	// if there is a non-black frame color the background cannot be uncolored
-	// therefore remove the entry "none" in this case
-	int const n = backgroundColorCO->findData("none");
-	if (index != frameColorCO->findData("black")) {
-		if (n != -1) {
-			if (backgroundColorCO->currentIndex() == n)
-				backgroundColorCO->setCurrentIndex(
-					    backgroundColorCO->findData("white"));
-			backgroundColorCO->removeItem(n);
-		}
-	} else {
-		if (n == -1)
-			backgroundColorCO->insertItem(0, toqstr(translateIfPossible((lcolor.getGUIName(Color_none)))),
-						      toqstr(lcolor.getLaTeXName(Color_none)));
-	}
 	changed();
 }
 
@@ -486,7 +464,7 @@ docstring GuiBox::dialogToParams() const
 		params.framecolor =
 			fromqstr(frameColorCO->itemData(frameColorCO->currentIndex()).toString());
 	else
-		params.framecolor = "black";
+		params.framecolor = "foreground";
 	if (backgroundColorCO->isEnabled())
 		params.backgroundcolor =
 			fromqstr(backgroundColorCO->itemData(backgroundColorCO->currentIndex()).toString());
diff --git a/src/frontends/qt/GuiBox.h b/src/frontends/qt/GuiBox.h
index 86bfe05..79a9b91 100644
--- a/src/frontends/qt/GuiBox.h
+++ b/src/frontends/qt/GuiBox.h
@@ -30,7 +30,6 @@ public:
 private Q_SLOTS:
 	void on_innerBoxCO_activated(int);
 	void on_typeCO_activated(int);
-	void on_frameColorCO_currentIndexChanged(int);
 	void initDialog();
 	void on_widthCB_stateChanged(int state);
 	void on_heightCB_stateChanged(int state);
@@ -48,7 +47,7 @@ private:
 	//@}
 
 	/// Fill the color combos
-	void fillComboColor(QComboBox * combo, bool const is_none);
+	void fillComboColor(QComboBox * combo, bool const is_background);
 	/// add and remove special lengths
 	void setSpecial(bool ibox);
 	/// only show valid inner box items
diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp
index c04bd1e..9ff8cea 100644
--- a/src/insets/InsetBox.cpp
+++ b/src/insets/InsetBox.cpp
@@ -165,7 +165,7 @@ void InsetBox::setButtonLabel()
 
 	// set the frame color for the inset if the type is Boxed
 	if (btype == Boxed)
-		setFrameColor(lcolor.getFromLaTeXName(params_.framecolor));
+		setFrameColor(lcolor.getFromLaTeXName(getFrameColor(true)));
 	else
 		setFrameColor(Color_collapsibleframe);
 }
@@ -429,8 +429,8 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const
 		if (separation_string != defaultSep && thickness_string == defaultThick)
 			os << "{\\fboxsep " << from_ascii(separation_string);
 		if (!params_.inner_box && !width_string.empty()) {
-			if (params_.framecolor != "black" || params_.backgroundcolor != "none") {
-				os << maybeBeginL << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}{";
+			if (params_.framecolor != "default" || params_.backgroundcolor != "none") {
+				os << maybeBeginL << "\\fcolorbox{" << getFrameColor() << "}{" << getBackgroundColor() << "}{";
 				os << "\\makebox";
 				needEndL = !maybeBeginL.empty();
 			} else
@@ -448,8 +448,8 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const
 			if (params_.hor_pos != 'c')
 				os << "[" << params_.hor_pos << "]";
 		} else {
-			if (params_.framecolor != "black" || params_.backgroundcolor != "none") {
-				os << maybeBeginL << "\\fcolorbox{" << params_.framecolor << "}{" << params_.backgroundcolor << "}";
+			if (params_.framecolor != "default" || params_.backgroundcolor != "none") {
+				os << maybeBeginL << "\\fcolorbox{" << getFrameColor() << "}{" << getBackgroundColor() << "}";
 				needEndL = !maybeBeginL.empty();
 			} else {
 				if (!cprotect.empty() && contains(runparams.active_chars, '^')) {
@@ -616,7 +616,7 @@ void InsetBox::latex(otexstream & os, OutputParams const & runparams) const
 	case Boxed:
 		os << "}";
 		if (!params_.inner_box && !width_string.empty()
-			&& (params_.framecolor != "black" || params_.backgroundcolor != "none"))
+			&& (params_.framecolor != "default" || params_.backgroundcolor != "none"))
 			os << "}";
 		if (separation_string != defaultSep || thickness_string != defaultThick)
 			os << "}";
@@ -809,7 +809,7 @@ void InsetBox::validate(LaTeXFeatures & features) const
 		break;
 	case Boxed:
 		features.require("calc");
-		if (params_.framecolor != "black" || params_.backgroundcolor != "none")
+		if (getFrameColor() != "black" || getBackgroundColor() != "white")
 			features.require("xcolor");
 		break;
 	case ovalbox:
@@ -874,6 +874,22 @@ void InsetBox::string2params(string const & in, InsetBoxParams & params)
 }
 
 
+string const InsetBox::getFrameColor(bool const gui) const
+{
+	if (params_.framecolor == "default")
+		return gui ? "foreground" : "black";
+	return params_.framecolor;
+}
+
+
+string const InsetBox::getBackgroundColor() const
+{
+	if (params_.backgroundcolor == "none")
+		return "white";
+	return params_.backgroundcolor;
+}
+
+
 /////////////////////////////////////////////////////////////////////////
 //
 // InsetBoxParams
@@ -895,7 +911,7 @@ InsetBoxParams::InsetBoxParams(string const & label)
 	  thickness(Length(defaultThick)),
 	  separation(Length(defaultSep)),
 	  shadowsize(Length(defaultShadow)),
-	  framecolor("black"),
+	  framecolor("default"),
 	  backgroundcolor("none")
 {}
 
diff --git a/src/insets/InsetBox.h b/src/insets/InsetBox.h
index f15896c..97c2a27 100644
--- a/src/insets/InsetBox.h
+++ b/src/insets/InsetBox.h
@@ -163,6 +163,10 @@ protected:
 private:
 	/// used by the constructors
 	void init();
+	///
+	std::string const getFrameColor(bool const gui = false) const;
+	///
+	std::string const getBackgroundColor() const;
 
 	///
 	friend class InsetBoxParams;
diff --git a/src/version.h b/src/version.h
index adbd763..3c139d5 100644
--- a/src/version.h
+++ b/src/version.h
@@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-#define LYX_FORMAT_LYX 619 // rikiheck: formatted ref
-#define LYX_FORMAT_TEX2LYX 619
+#define LYX_FORMAT_LYX 620 // spitz: default box frame color
+#define LYX_FORMAT_TEX2LYX 620
 
 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
 #ifndef _MSC_VER


More information about the lyx-cvs mailing list