[LyX/master] Preview formatted references in the work area.

Richard Kimberly Heck rikiheck at lyx.org
Fri Aug 25 00:12:13 UTC 2023


commit 2ad57dcb6b9b54b6d0aa43b4729c3ea480f6d51c
Author: Richard Kimberly Heck <rikiheck at lyx.org>
Date:   Sat Jul 29 14:07:28 2023 -0400

    Preview formatted references in the work area.
    
    Patch from Daniel Ramoeller <d.lyx at web.de>, fixed up by RKH.
---
 lib/lyx2lyx/lyx_2_4.py           |   15 ++-
 src/Buffer.cpp                   |    4 +
 src/BufferParams.cpp             |    4 +
 src/BufferParams.h               |    2 +
 src/frontends/qt/GuiDocument.cpp |    4 +
 src/frontends/qt/ui/LaTeXUi.ui   |  227 +++++++++++++++++++-------------------
 src/insets/InsetRef.cpp          |   36 ++++--
 src/insets/InsetRef.h            |    4 +
 8 files changed, 166 insertions(+), 130 deletions(-)

diff --git a/lib/lyx2lyx/lyx_2_4.py b/lib/lyx2lyx/lyx_2_4.py
index ede6e4f..4cc5fe5 100644
--- a/lib/lyx2lyx/lyx_2_4.py
+++ b/lib/lyx2lyx/lyx_2_4.py
@@ -5548,6 +5548,12 @@ def revert_hequotes(document):
             document.body[i] = "\\begin_inset Quotes pld"
 
 
+def revert_formatted_refs(document):
+    i = find_token(document.header, "\\use_formatted_ref", 0)
+    if i != -1:
+        del document.header[i]
+
+
 ##
 # Conversion hub
 #
@@ -5627,11 +5633,14 @@ convert = [
            [615, [convert_acknowledgment,convert_ack_theorems]],
            [616, [convert_empty_macro]],
            [617, [convert_cov_options]],
-           [618, []]
+           [618, []],
+           [619, []]
           ]
 
-revert =  [[617, [revert_hequotes]],
-	   [616, [revert_expreambles,revert_exarg2,revert_linggloss2,revert_cov_options]],
+
+revert =  [[618, [revert_formatted_refs]],
+           [617, [revert_hequotes]],
+           [616, [revert_expreambles,revert_exarg2,revert_linggloss2,revert_cov_options]],
            [615, [revert_empty_macro]],
            [614, [revert_ack_theorems,revert_acknowledgment]],
            [613, [revert_hyper_other]],
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index e028fa9..732ca7e 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -5342,6 +5342,10 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const
 
 void Buffer::updateBuffer(ParIterator & parit, UpdateType utype, bool const deleted) const
 {
+	// if fomatted references are shown in workarea update buffer accordingly
+	if (params().use_formatted_ref)
+		utype = OutputUpdate;
+
 	pushIncludedBuffer(this);
 	// LASSERT: Is it safe to continue here, or should we just return?
 	LASSERT(parit.pit() == 0, /**/);
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 3dad8c6..4c2b615 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -488,6 +488,7 @@ BufferParams::BufferParams()
 	shell_escape = false;
 	output_sync = false;
 	use_refstyle = true;
+	use_formatted_ref = false;
 	use_minted = false;
 	use_lineno = false;
 
@@ -1205,6 +1206,8 @@ string BufferParams::readToken(Lexer & lex, string const & token,
 		lex >> output_sync_macro;
 	} else if (token == "\\use_refstyle") {
 		lex >> use_refstyle;
+	} else if (token == "\\use_formatted_ref") {
+		lex >> use_formatted_ref;
 	} else if (token == "\\use_minted") {
 		lex >> use_minted;
 	} else if (token == "\\use_lineno") {
@@ -1433,6 +1436,7 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
 	   << "\n\\suppress_date " << convert<string>(suppress_date)
 	   << "\n\\justification " << convert<string>(justification)
 	   << "\n\\use_refstyle " << use_refstyle
+	   << "\n\\use_formatted_ref " << use_formatted_ref
 	   << "\n\\use_minted " << use_minted
 	   << "\n\\use_lineno " << use_lineno
 	   << '\n';
diff --git a/src/BufferParams.h b/src/BufferParams.h
index 2a2e0f3..34b4447 100644
--- a/src/BufferParams.h
+++ b/src/BufferParams.h
@@ -606,6 +606,8 @@ public:
 	std::string output_sync_macro;
 	/// use refstyle? or prettyref?
 	bool use_refstyle;
+	/// use formatted references in the workarea?
+	bool use_formatted_ref;
 	/// use minted? or listings?
 	bool use_minted;
 	//output line numbering
diff --git a/src/frontends/qt/GuiDocument.cpp b/src/frontends/qt/GuiDocument.cpp
index f9fb19b..4d873bd 100644
--- a/src/frontends/qt/GuiDocument.cpp
+++ b/src/frontends/qt/GuiDocument.cpp
@@ -1626,6 +1626,8 @@ GuiDocument::GuiDocument(GuiView & lv)
 		this, SLOT(change_adaptor()));
 	connect(latexModule->refstyleCB, SIGNAL(clicked()),
 		this, SLOT(change_adaptor()));
+	connect(latexModule->refFormattedCB, SIGNAL(clicked()),
+		this, SLOT(change_adaptor()));
 
 	latexModule->optionsLE->setValidator(new NoNewLineValidator(
 		latexModule->optionsLE));
@@ -3563,6 +3565,7 @@ void GuiDocument::applyView()
 	// date
 	bp_.suppress_date = latexModule->suppressDateCB->isChecked();
 	bp_.use_refstyle  = latexModule->refstyleCB->isChecked();
+	bp_.use_formatted_ref  = latexModule->refFormattedCB->isChecked();
 
 	// biblio
 	string const engine =
@@ -4067,6 +4070,7 @@ void GuiDocument::paramsToDialog()
 	// date
 	latexModule->suppressDateCB->setChecked(bp_.suppress_date);
 	latexModule->refstyleCB->setChecked(bp_.use_refstyle);
+	latexModule->refFormattedCB->setChecked(bp_.use_formatted_ref);
 
 	// biblio
 	string const cite_engine = bp_.citeEngine();
diff --git a/src/frontends/qt/ui/LaTeXUi.ui b/src/frontends/qt/ui/LaTeXUi.ui
index e6f579a..61d376f 100644
--- a/src/frontends/qt/ui/LaTeXUi.ui
+++ b/src/frontends/qt/ui/LaTeXUi.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>341</width>
+    <width>332</width>
     <height>442</height>
    </rect>
   </property>
@@ -14,6 +14,72 @@
    <string/>
   </property>
   <layout class="QGridLayout" name="gridLayout_2">
+   <item row="2" column="0">
+    <widget class="QLabel" name="psdriverL">
+     <property name="text">
+      <string>&Graphics driver:</string>
+     </property>
+     <property name="buddy">
+      <cstring>psdriverCO</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QComboBox" name="psdriverCO">
+     <property name="duplicatesEnabled">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="5" column="0" colspan="4">
+    <widget class="QCheckBox" name="refstyleCB">
+     <property name="text">
+      <string>&Use refstyle (not prettyref) for cross-references</string>
+     </property>
+    </widget>
+   </item>
+   <item row="7" column="1">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>2</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="4" column="0" colspan="4">
+    <widget class="QCheckBox" name="suppressDateCB">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>&Suppress default date on front page</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3">
+    <spacer name="horizontalSpacer_1">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>261</width>
+       <height>22</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
    <item row="0" column="0" colspan="4">
     <widget class="QGroupBox" name="groupBox">
      <property name="title">
@@ -23,12 +89,6 @@
       <bool>true</bool>
      </property>
      <layout class="QGridLayout">
-      <property name="margin">
-       <number>9</number>
-      </property>
-      <property name="spacing">
-       <number>6</number>
-      </property>
       <item row="0" column="0">
        <widget class="lyx::frontend::CategorizedCombo" name="classCO">
         <property name="maxVisibleItems">
@@ -55,81 +115,6 @@
      </layout>
     </widget>
    </item>
-   <item row="1" column="0" colspan="4">
-    <widget class="QGroupBox" name="optionsGB">
-     <property name="title">
-      <string>Class Options</string>
-     </property>
-     <property name="flat">
-      <bool>true</bool>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_1">
-      <item row="0" column="0">
-       <widget class="QCheckBox" name="defaultOptionsCB">
-        <property name="toolTip">
-         <string>Enable to use the options that are predefined in the layout file</string>
-        </property>
-        <property name="text">
-         <string>&Predefined:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QLineEdit" name="defaultOptionsLE">
-        <property name="toolTip">
-         <string>The options that are predefined in the layout file. Click to the left to select/deselect.</string>
-        </property>
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="optionsL">
-        <property name="text">
-         <string>Cus&tom:</string>
-        </property>
-        <property name="buddy">
-         <cstring>optionsLE</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="optionsLE"/>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QLabel" name="psdriverL">
-     <property name="text">
-      <string>&Graphics driver:</string>
-     </property>
-     <property name="buddy">
-      <cstring>psdriverCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="2">
-    <widget class="QComboBox" name="psdriverCO">
-     <property name="duplicatesEnabled">
-      <bool>false</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="3">
-    <spacer name="horizontalSpacer_1">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>261</width>
-       <height>22</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
    <item row="3" column="0" colspan="4">
     <widget class="QGroupBox" name="childDocGB">
      <property name="toolTip">
@@ -148,12 +133,6 @@
       <bool>true</bool>
      </property>
      <layout class="QGridLayout">
-      <property name="margin">
-       <number>9</number>
-      </property>
-      <property name="spacing">
-       <number>6</number>
-      </property>
       <item row="0" column="0">
        <widget class="QLabel" name="childDocLA">
         <property name="text">
@@ -181,39 +160,55 @@
      </layout>
     </widget>
    </item>
-   <item row="4" column="0" colspan="4">
-    <widget class="QCheckBox" name="suppressDateCB">
-     <property name="enabled">
-      <bool>true</bool>
-     </property>
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
+   <item row="1" column="0" colspan="4">
+    <widget class="QGroupBox" name="optionsGB">
+     <property name="title">
+      <string>Class Options</string>
      </property>
-     <property name="text">
-      <string>&Suppress default date on front page</string>
+     <property name="flat">
+      <bool>true</bool>
      </property>
+     <layout class="QGridLayout" name="gridLayout_1">
+      <item row="0" column="0">
+       <widget class="QCheckBox" name="defaultOptionsCB">
+        <property name="toolTip">
+         <string>Enable to use the options that are predefined in the layout file</string>
+        </property>
+        <property name="text">
+         <string>&Predefined:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLineEdit" name="defaultOptionsLE">
+        <property name="toolTip">
+         <string>The options that are predefined in the layout file. Click to the left to select/deselect.</string>
+        </property>
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="optionsL">
+        <property name="text">
+         <string>Cus&tom:</string>
+        </property>
+        <property name="buddy">
+         <cstring>optionsLE</cstring>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QLineEdit" name="optionsLE"/>
+      </item>
+     </layout>
     </widget>
    </item>
-   <item row="6" column="1">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>2</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="5" column="0" colspan="4">
-    <widget class="QCheckBox" name="refstyleCB">
+   <item row="6" column="0" colspan="4">
+    <widget class="QCheckBox" name="refFormattedCB">
      <property name="text">
-      <string>&Use refstyle (not prettyref) for cross-references</string>
+      <string>Indicate cross-reference output in the work area</string>
      </property>
     </widget>
    </item>
diff --git a/src/insets/InsetRef.cpp b/src/insets/InsetRef.cpp
index 277f8e5..fcd28d2 100644
--- a/src/insets/InsetRef.cpp
+++ b/src/insets/InsetRef.cpp
@@ -382,11 +382,11 @@ void InsetRef::docbook(XMLStream & xs, OutputParams const &) const
 }
 
 
-docstring InsetRef::xhtml(XMLStream & xs, OutputParams const & op) const
+docstring InsetRef::displayString(docstring const & ref, string const & cmd,
+		string const & language) const
+
 {
-	docstring const & ref = getParam("reference");
 	InsetLabel const * il = buffer().insetLabel(ref, true);
-	string const & cmd = params().getCmdName();
 	docstring display_string;
 
 	if (il && !il->counterValue().empty()) {
@@ -397,11 +397,11 @@ docstring InsetRef::xhtml(XMLStream & xs, OutputParams const & op) const
 		else if (cmd == "vref")
 			// normally, would be "ref on page #", but we have no pages
 			display_string = value;
-		else if (cmd == "pageref" || cmd == "vpageref")
+		else if (cmd == "pageref" || cmd == "vpageref") {
 			// normally would be "on page #", but we have no pages.
-			display_string = translateIfPossible(from_ascii("elsewhere"),
-			        op.local_font->language()->lang());
-		else if (cmd == "eqref")
+			display_string =
+				translateIfPossible(from_ascii("elsewhere"), language);
+		} else if (cmd == "eqref")
 			display_string = '(' + value + ')';
 		else if (cmd == "formatted") {
 			display_string = il->formattedCounter();
@@ -418,14 +418,21 @@ docstring InsetRef::xhtml(XMLStream & xs, OutputParams const & op) const
 			// in that section. So this is not trivial.
 			display_string = il->prettyCounter();
 	} else
-			display_string = ref;
+		display_string = ref;
+	return display_string;
+}
 
+
+docstring InsetRef::xhtml(XMLStream & xs, OutputParams const & op) const
+	{
+	docstring const & ref = getParam("reference");
+	string const & cmd = params().getCmdName();
 	// FIXME What we'd really like to do is to be able to output some
 	// appropriate sort of text here. But to do that, we need to associate
 	// some sort of counter with the label, and we don't have that yet.
 	docstring const attr = "href=\"#" + xml::cleanAttr(ref) + '"';
 	xs << xml::StartTag("a", to_utf8(attr));
-	xs << display_string;
+	xs << displayString(ref, cmd, op.local_font->language()->lang());;
 	xs << xml::EndTag("a");
 	return docstring();
 }
@@ -520,14 +527,21 @@ void InsetRef::updateBuffer(ParIterator const & it, UpdateType, bool const /*del
 		label += getParam("name");
 	}
 
+	bool const use_formatted_ref = buffer().params().use_formatted_ref;
 	unsigned int const maxLabelChars = 24;
-	if (label.size() > maxLabelChars) {
+	// Show label in tooltip when formatted references are shown in the work
+	// area or it is too long
+	if (use_formatted_ref || label.size() > maxLabelChars) {
 		tooltip_ = label;
 		support::truncateWithEllipsis(label, maxLabelChars);
 	} else
 		tooltip_ = from_ascii("");
 
-	screen_label_ = label;
+	if (use_formatted_ref && cmd != "pageref" && cmd != "vpageref"
+			&& cmd != "vref" && cmd != "labelonly")
+		screen_label_ = displayString(ref, cmd);
+	else
+		screen_label_ = label;
 	broken_ = false;
 	setBroken(broken_);
 }
diff --git a/src/insets/InsetRef.h b/src/insets/InsetRef.h
index 6286652..09d5e18 100644
--- a/src/insets/InsetRef.h
+++ b/src/insets/InsetRef.h
@@ -117,6 +117,10 @@ private:
 	docstring screenLabel() const override;
 	//@}
 
+	///
+	docstring displayString(docstring const & ref, std::string const & cmd,
+			std::string const & language = std::string()) const;
+
 	/// \return the label with things that need to be escaped escaped
 	docstring getEscapedLabel(OutputParams const &) const;
 


More information about the lyx-cvs mailing list