Allow pasting references to mathed

A reference can be directly inserted into mathed but cannot be pasted
because the pasted material is returned in plain text format. This patch
allows getting a string from the cut stack in a suitable format allowing
the math parser to actually create an InsetRef.

Fixes #11539

(cherry picked from commit 22ee249c3e)
This commit is contained in:
Enrico Forestieri 2021-01-30 01:32:40 +01:00
parent 706db1ff2e
commit 12f67ef154
6 changed files with 24 additions and 6 deletions

View File

@ -1140,7 +1140,7 @@ void clearCutStack()
} }
docstring selection(size_t sel_index, DocumentClassConstPtr docclass) docstring selection(size_t sel_index, DocumentClassConstPtr docclass, bool for_math)
{ {
if (sel_index >= theCuts.size()) if (sel_index >= theCuts.size())
return docstring(); return docstring();
@ -1150,7 +1150,11 @@ docstring selection(size_t sel_index, DocumentClassConstPtr docclass)
if (!buffer) if (!buffer)
return docstring(); return docstring();
return buffer->paragraphs().back().asString(AS_STR_INSETS | AS_STR_NEWLINES); int options = AS_STR_INSETS | AS_STR_NEWLINES;
if (for_math)
options |= AS_STR_MATHED;
return buffer->paragraphs().back().asString(options);
} }

View File

@ -37,8 +37,11 @@ namespace cap {
std::vector<docstring> availableSelections(Buffer const *); std::vector<docstring> availableSelections(Buffer const *);
/// Get the number of available elements in the cut buffer. /// Get the number of available elements in the cut buffer.
size_type numberOfSelections(); size_type numberOfSelections();
/// Get the sel_index-th element of the cut buffer in plain text format. /**
docstring selection(size_t sel_index, DocumentClassConstPtr docclass); * Get the sel_index-th element of the cut buffer in plain text format
* or, if \param for_math is true, in a format suitable for mathed.
*/
docstring selection(size_t sel_index, DocumentClassConstPtr docclass, bool for_math = false);
/** /**
* Replace using the font of the first selected character and select * Replace using the font of the first selected character and select

View File

@ -3570,6 +3570,14 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options, const Out
if (c == META_INSET && (options & AS_STR_PLAINTEXT)) { if (c == META_INSET && (options & AS_STR_PLAINTEXT)) {
LASSERT(runparams != 0, return docstring()); LASSERT(runparams != 0, return docstring());
getInset(i)->plaintext(os, *runparams); getInset(i)->plaintext(os, *runparams);
} else if (c == META_INSET && (options & AS_STR_MATHED)
&& getInset(i)->lyxCode() == REF_CODE) {
Buffer const & buf = getInset(i)->buffer();
OutputParams rp(&buf.params().encoding());
Font const font(inherit_font, buf.params().language);
rp.local_font = &font;
otexstream ots(os);
getInset(i)->latex(ots, rp);
} else { } else {
getInset(i)->toString(os); getInset(i)->toString(os);
} }

View File

@ -126,7 +126,8 @@ enum AsStringParameter
AS_STR_INSETS = 2, ///< Go into insets. AS_STR_INSETS = 2, ///< Go into insets.
AS_STR_NEWLINES = 4, ///< Get also newline characters. AS_STR_NEWLINES = 4, ///< Get also newline characters.
AS_STR_SKIPDELETE = 8, ///< Skip deleted text in change tracking. AS_STR_SKIPDELETE = 8, ///< Skip deleted text in change tracking.
AS_STR_PLAINTEXT = 16 ///< Don't export formatting when descending into insets. AS_STR_PLAINTEXT = 16, ///< Don't export formatting when descending into insets.
AS_STR_MATHED = 32 ///< Use a format suitable for mathed (eg. for InsetRef).
}; };

View File

@ -1606,7 +1606,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd)
idocstringstream is(cmd.argument()); idocstringstream is(cmd.argument());
int n = 0; int n = 0;
is >> n; is >> n;
topaste = cap::selection(n, buffer().params().documentClassPtr()); topaste = cap::selection(n, buffer().params().documentClassPtr(), true);
} }
InsetMathGrid grid(buffer_, 1, 1); InsetMathGrid grid(buffer_, 1, 1);
if (!topaste.empty()) if (!topaste.empty())

View File

@ -31,6 +31,8 @@ What's new
does not move the cursor out of the whole equation anymore and is now does not move the cursor out of the whole equation anymore and is now
equivalent to hitting the left arrow key (bug 11678). equivalent to hitting the left arrow key (bug 11678).
- Other than directly inserted, now references can also be pasted as insets
into an equation, instead of simply as text (bug 11539).
* DOCUMENTATION AND LOCALIZATION * DOCUMENTATION AND LOCALIZATION