We now allow the user to cancel the background process at any point
(via the red "x" in the status bar or Document > Cancel Export), so
we do not need to poll the user with the dialog.
The patch works by setting timeout to "-1" which is treated as a
special value to disable the poll.
Fix (by obviation) #12531 and #9953, which were about the dialog.
An export can be canceled by clicking on the status bar icon or by
executing export-cancel (e.g., via Document > Cancel Background
Process).
The centralized code kills the script and updates the status bar
icons.
No change in functionality intended.
Related commits: 70a71a82 and 01abab9a.
This is consistent with 70a71a82 (which is about the code path
through clicking on the 'x' status bar icon).
In the next commit I'll make a function to centralize this sequence
of killing a script and emitting the scriptKilled() signal.
Removing. M-c e has a different meaning nowadays
(tabular-feature delete-vline-left)
Please file a new report with an updated description if this is still
an issue.
LyX removes a single backslash when it is inserted in a
macro name by the keyboard. However if it is followed by
another character before moving the cursor, it is retained
causing an assertion (bug #12601).
Disable the arguments append-column and delete-column of tabular-features.
The code is taken from InsetMathCases, with some changes
* no need to record undo here
* in dispatch, return is prefered to break, since we do not want to invoke
InsetMathGrid::doDispatch.
Propagate these changes to InsetMathCases.
Cleanup of the InsetMathCases error messages to fit with other parts
of the code.
The handling of tabular-features in mathed needs to be unified somehow.
Based on a commit from lynx <lorenzobertini97@gmail.com>
Part of bug #12590.
Qt >= 5 refuses to display them. We work around this in lib/symbols
already, but make sure we do not try to display math glyphs at these
code points anyway.
Fixes bug #8493.
Backslashes are not allowed in macro names and LyX
enforces this by not allowing entering them by keyboard.
However, it was possible to paste them and this may cause
crashes (see bug #12596).
The previous code explicitly disabled it and this behaviour caused problems (like "A&A" being output as-is, which is wrong in HTML: it should be "A&A").
Qt4 code has been identidifed by
git grep -l 'QT_VERSION.*\(0x050000\|0x04\)' src
Uses of QT_VERSION_CHECK have been checked too.
been used to remember what places need further work.
Then remaining Qt4 references have been searched using
git grep -i qt4
git grep -i 'qt 4'
and relevant issues have been either fixed or noted in the new
TODO.killqt4 file.
It appears that gcc 4.9 does not implement the following part of C++11:
https://cplusplus.github.io/CWG/issues/1148.html
Therefore, we have to use a special case in C++11 mode that does an
explicit std:move.
With recent compilers (gcc >= 9), this leads in C++11 mode to a warning:
MetricsInfo.cpp: In member function ‘lyx::Changer lyx::MetricsBase::changeFontSet(const string&)’:
../../master/src/MetricsInfo.cpp:83:13: warning: redundant move in return statement [-Wredundant-move]
83 | return move(rc);
| ~~~~^~~~
MetricsInfo.cpp:83:13: note: remove ‘std::move’ call
Partly reverts commit fff28c57.
This branch improves handling of spaces on display (see #10117):
* caret is correctly shown in the middle of double spaces in justified rows;
* sequence spaces are correctly shown at the end of rows before
automatic row breaks.
Moreover, this branch:
* streamlines the code that handles spaces in row breaking
* improves display in Qt4 : although the improvements outlined above
are not present in Qt4 for monospaced fonts, some dsplay glitches
are resolved.
* improves performance for very long paragraphs (#12598).
When is it detected that our zero-width characters are not really
zero-width, avoid to use them altogether. Currently, this is known to
happen in Qt4 with monospace fonts.
This allow to remove the special Qt4 code in breaskString_helper.
Related to bug #10117.
This allows to create a new version that takes an already built
TextLayoutHelper struct as parameter.
No intended change.
See discussion in bug #10117.
In order to work around the Qt row breaking algorithm, which considers
multiple spaces as one at QTextLine break, we insert word_joiner unicode
characters beteween each pair of spaces.
The TextLayoutHelper class makes it easy to handle that.
Update Row::Element::rtrim() to only remove one space at row end.
Update support::countExpanders() to count all spaces, without special
handling for consecutive ones.
Fixes bug #10117.
This new code allows to get rid of some hardcoded stuff and will be a
foundation for handling of consecutive spaces.
This code can be used in the future for getTextLayout, x2pos, and
pos2x in order to streamline code. Actually some features as the naked
parameter are here to prepare for this second set of changes.
No change intended. The modified code is much clearer, though.
Related to bug #10117.
When there is no module, the old code would invoke tex2lyx with option
-m
instead of
-m ""
and an error would ensue.
This is because the QProcess command line parser used in Systemcall is
broken and does not recognize empty parameters as such. The solution
is to rewrite our parsecmd() parser to generate a list of parameters.
This is post-2.4.0 work.
The workaround used here is:
- set the list of modules to "," when it should be empty. In effect,
this is a list of two empty modules.
- change tex2lyx to accept empty module names and ignore them; this is
good in terms of robustness anyway.
Additionally, when there is no receiving buffer, set the defaults as
the BufferParams defaults instead of empty (this is cleaner, but
should not make a difference in practice).
In the long term, we should switch to use the QStringList-based API of
QProcess in Systemcall (see QTBUG-80640).
This is a convenience function for indexing. It adds a copy of the
index inset under cursor after any word in the buffer that is equal
(case-insensitively) to the word preceding the index inset.
The function can be easily used to generate bad indexes (and I warn
about that in the UserGuide), but if used with care, it can also be
extremely convenient.
Previously, only the suggestions starting with the current input were
shown.
Contains the following minor improvements:
- Add space to indicate when only one suggestion is found
- Select first item in suggestion-list in order to make selecting with
arrow keys more intuitive
- Fix selection with Shift+Up/Down in text-field
Fix for bug #12572.
The new function inset-insert-copy can only be invoked from the ToC.
It is currently only implemented for Index inset.
It is a special lfun because Inset::dispatch is called directly from
the ToC widget with cursor pointing to the inset, whereas the patch
happens in the workarea at caret position. This function cannot be
called directly.
Add an entry for this function in the toc context menu.
Fixes bug #4582.
The change ensures that the function is not seen by the compiler when
the debug mode is not enabled. The flag is not set by default, because
it might have a significant performance impact for large indices.
The reason for the flag is that the default configuration under Linux
forbids the definition of unused functions.
**WARNING; only compilation has been ested; even that does not work**
The goal of this commit is to use the list-based API to
QProcess::start, to avoid annoying syntax issues (see issues with
pasting from LaTeX).
* Create a new latexEnvironment() in filetools.h that returns a
map<string, string> containing the variables and their values.
* Rewrite parsecmd() so that it returns a QStringList of tokenized parameters.
* Use this in startProcess. This is the part is is not finished yet.
Obviously, this will not be possible to get right for 2.4.0.
This reverts commit 008a0825e8.
This commit was part of bug #12310. The goal was to remove the
selection when using "up" at the start of selection (so that the
cursor cannot move). Unfortunately, it creates navigation issues for
insets inside tabulars.
Since the fix was minor, the safest decision is to revert.
The part of ticket #12310 that resets selection with
char-forwars/backward when moving is not possible still works.
Fixes bug #12593.
This quashes a new warning in clang++ 15, when std::move() (the
one-parameter version) is used as simply move(). There is a strong
recommendation from WG21 to avoid that.
Details here: https://reviews.llvm.org/D119670
It might be that we should not use that many move()s. I am not
competent to decide on that.
I also used this occasion to get rid of a spacial casing for C++11
that does not seem necessary after all.
Being able to insert completion in a read-only document is definitely
a bad idea.
This patch acts both on indication of completion and on insertion
itself.
Fixes bug #12582.
I mathed, undo should record the underlying inset on completion,
whereas in test recording the paragraph is enough.
Therefore the recordUndo() in GuiCompleter::tab is removed, and the
relevant recordUndo/recordUndoInset are used at the right places.
As a further cleanup, the parameter `finished' of
Text::insertCompletion is removed as it is useless.
Fixes bug #12581.
This amends [4a7a1935/lyxgit]. Before 4a7a1935 it was assumed
that a labeled row was also numbered. Hence, when unnumbering
a row a label was also deleted. We now have to do this explicitly.
From Kornel:
> /usr2/src/lyx/lyx-git/src/Paragraph.cpp:1931:1: warning: control reaches end of non-void
> function [-Wreturn-type]
>
> This is with gcc-12, compiled in debug mode.
With a string like "abc def [inset]", it should be possible to break
between the "def" and the inset. A case of interest is when "abc def "
is too long, but "abc def" is not.
To this end, tweak the test that look whether breaking was successful:
the right width to look at is nscp_width, the width without the final
space.
The only goal is to improve code readability: this enum class is strictly equivalent to a Boolean, with the same meaning as the previous is_xhtml arguments (arbitrary choice).
In several range-based for loops, implicit copies are made. Remove
that when possible, and try to shut converity up otherwise.
Fixes issues found by coverity.
- Check the state of the synchronize TeX output option of the document to enable or disable the LFUN for forward-search.
- write synctex macro to TeX source not only for PdfLaTeX
When unbinding a shortcut, it may happen that the exact definition of
the request is not known. A typical example it Tab, which is bound to
a complex command sequence.
In this case it is convenient to use the syntax
\unbind "Tab" "*"
To make this word, the special "*" value is translated to the
FuncRequest::unknown lfun and this value is considered specially in
several places.
This code was triggering the following warnings:
src/mathed/InsetMathHull.cpp:234:15: error: variable 'counters_to_save' is not needed and will not be emitted [-Werror,-Wunneeded-internal-declaration]
const char * counters_to_save[] = {"section", "chapter"};
^
src/mathed/InsetMathHull.cpp:235:21: error: unused variable 'numcnts' [-Werror,-Wunused-const-variable]
unsigned int const numcnts = sizeof(counters_to_save)/sizeof(char *);
The original code was put in at 645f9fdf (and the comment at 8a226ec4).
This commit amends a65e12d6.
Time will tell whether this is too expensive (because most equations
after this on will change too, unless equations are numbered by
section).
Related to bug #11535.
This patch simplifies and fixes the generation of previews with
numbering. Instead of saving the counter values (which is complicated
and error prone), the \thequation macro is set to the numbers_ string
which has been computed by updateBuffer for screen display.
Harcoding the number in the formula means that two equations with
different numbers have different previews, which is the subject of the
bug.
The special code for saving counters in updateBuffer and outputing
them in preparePreview from 645f9fdf (ticket #6894) is removed and
replaced by this simpler approach.
This fixes ticket #11535.
The module subequation allows to number equations in the "Subfigure"
inset to be numbered (1a), (1b), (1c), etc.
To implement this on screen, we need to redefine temporarily the
"equation" counter to use this different numbering.
To this end, implement Counters::copy method that can be used to
backup full counter definitions.
Fixes bug #12567.
This patch simplifies and fixes the generation of previews with
numbering. Instead of saving the counter values (which is complicated
and error prone), the \thequation macro is set to the numbers_ string
which has been computed by updateBuffer for screen display.
Harcoding the number in the formula means that two equations with
different numbers have different previews, which is the subject of the
bug.
The special code for saving counters in updateBuffer and putputing
them in preparePreview from 645f9fdf (ticket #6894) is removed and
replaced by this simpler approach.
This fixes ticket #11535.
The module subequation allows to number equations in the "Subfigure"
inset to be numbered (1a), (1b), (1c), etc.
To implement this on screen, we need to redefine temporarily the
"equation" counter to use this different numbering.
To this end, implement Counters::copy method that can be used to
backup full counter definitions.
Fixes bug #12567.
The layout from the paste content is adopted only if
- the paragraph is empty (ie. empty after the selection has been
erased) and Standard or Plain Layout, or
- empty and multiple lines are pasted, or
- multiple lines are pasted at the beginning of a paragraph
As for what other applications do:
- MS Word decides the adoption of a layout depending on whether the end of line
character is copied
- Libre Writer adopts the paste content layout only if the paragraph is empty
(otherwise it makes *all* pasted paragraph the target layout)
In LyX, as in Libre Writer, one cannot copy the end of line character by
selecting a single line. However, the Libre Writer solution is problematic
because one always has to make sure that a paragraph is in Standard layout if
one wants to paste several lines with their source layout. The implemented
behaviour differs from Libre Writer in that the source format is kept when end
of line characters are pasted, i.e. several lines are pasted, and hence does
what MS Word does in that situation.
Fix for bug #11023: Copy and paste from one list into another often leads to
undesired result.
Introduce the new FileName method ensureExtension, which does the following:
* if the extension is already correct (in a case-insensitive way), do nothing.
* if it is not correct, add the extension to the file name.
This is different from changeExtension that will fail in a case where
the file contains dots, but not a real extension, like newfile2.1.
Use this new method in renameBuffer() and exportBufferAs().
Fixes bug #11008.
This requires to add a parameter to GuiToolbar::addItem so that it is
possble to make a difference between toolbar buttons and menu items.
The long-term solution is to rely on the menu backend for such things.
Fixes bug #12004.
There are several small parts that are needed here:
* Implement LayoutModuleList::asString() that returns a comma-separated
list of modules.
* in Converter::convert(), handle the new tokens $$c for the current
textclass and $$m for the list of modules.
* in Buffer::importFile(), pass the current buffer as parameter instead
of nullptr.
* in pasteClipboardText(), copy the parameters of the current buffer to
the internal one used for importation, so that the textclass and
modules information is available to convert().
* finally, modify configure.py to pass "-c $$c -m $$m" to tex2lyx for
the latexclipoard->lyx converter.
Fixes bug #11312.
In Advanced Find and Replace, Tab can be used to move the focus from
Search field to the replace field. This is inconvenient when Tab has
another use, like completion.
To fix this, check that the function bound to Tab is disabled before switching focus.
The same is done for BackTab.
Fixes bug #11114.
The removal of duplicates is done in LastCommandsSection::add and uses
the erase-remove idiom for performance.
Most of the patch is a cleanup of GuiCommandBuffer:
* remove history_ member, that was a copy of the session lastcommands
vector. Use instead a wrapper history() around it and a addHistory
wrapper for adding new entries.
* Make sure that there is only one place where commands are added to
history. The code used to maintain a list for interactive editing,
and a list for saving the session. They could be different in terms
of leading/trailing spaces.
* [unrelated] remove command_ member, which is just a copy of
LyXAction list of commmands. Use directly lyxaction instead.
In mathed it is assumed that a labeled line is also implicitly numbered.
However, latex allows to label an equation without numbering it.
The label is then assigned the value of a nearby numbered one.
This commit drops the above mathed assumption in order to allow to import
valid latex code with a labeled but not numbered equation line.
The screen representation omits the line number and encloses the label
in square brackets for further differentiation. However, it is still not
possible to label an equation without numbering it using the GUI.
The aliases are defined by a file in the (system or user) image
directory. The format is pretty simple: each line is like
<str1> <str2>
Where every instance of <str1> will be replaced with <str2>.
Fixes bug #12509.
Adding this particular line created bad redraw interactions. See
thread on lyx-devel here:
https://marc.info/?l=lyx-devel&m=165648365808777&w=2
The code is reorganized a bit:
- the part of updateGUI() that (en|dis)abled elements is not moved to
updateBottons ; the rest is renamed updateWorkAreas()
- only updateButtons is called now in eventFilter
- finally the recursion curse is fixed now in updateWorkAreas() by
setting the old_buffer value _before_ calling copy_params. This
avoid recursion if some bad update were to happen again.
When changing the document class, the message "Converting document to
new document class..." is shown in minibuffer. This message leads to
weird GUI update interactions with the FindAndReplace panel, and
ultimately infinite loops. It would only be useful if the conversion
took a long time.
See this thread for rreference:
https://marc.info/?l=lyx-devel&m=165648365808777&w=2
Therefore, just remove it.
This important part is the last point, the rest is what is needed to
make it happen.
* implement (FindAndReplace|FindAndReplaceWidget)::hasWorkArea, that
tell whether a work area is own by the advanced find & replace
widget.
* factor out method find() from GuiView::findOrBuild.
* implement GuiView::hasVisibleWorkArea, that tells whether a workarea
is visible in the view (current tab in a split or adv. f&r
workarea).
* Finally, in TocWidget::sendDispatch, change the current workarea
temporarily to the document workarea before dispatching the
function. The code tries to be as careful as possible to handle all
cases. The future will tell whether it is good enough.
When the commit string from the inputMethodEvent can be interpreted as
characters bound to some action, dispatch this action instead of
inserting the string.
This is useful on an international keyboard, when diaresis+space gives
a plain double quote. It is better in this case to enter a smart
quote.
Adapted from a patch from Daniel Ramoeller <d.lyx@web.de>.
Fixes bug #10377.
Fix for bug #12547.
- "Interword" becomes "Normal"
- "Protected" becomes "Non-Breaking"
Plus a minor fixes to the "Horizontal Space Settings" dialog:
- Indicate that when "Non-Breaking" is disabled, the space will be non-breaking
In FindAdv we use Qt to interpret regular expressions.
Regex uses for instance '\w', '\d' etc.
'\d' finds not just '0-9' but also e.g. '߂' (Nko Digit Two: U+07c2)
'\w' includes also such numbers.
ATM, only FindAdv uses this function.
In this case we skip the undesired word-characters before starting the search.
There are still some inconsistencies between LyX and Qt of 'what counts as a word-character',
but too hard to resolve.
Since the element 'match_len' in class MatchResult is an integer,
the check 'if (!match(...).match_len))' is changed to
'if (match(...).match_len) <= 0)'
1.) The type of variable at_begin changes from bool to enum matchType
true -> MatchStringAdv::MatchFromStart,
false -> MatchStringAdv::MatchAnyPlace
2.) discard default parameter-values of
MatchStringAdv::operator()
MatchStringAdv::findAux()
1.) Changed arrays dept and closes to vector-type because of runtime error in UserGuide.lyx
with a big paragraph (size > 8900 chars) contained too many opening parentheses
2.) Removed one creation 'textcyrillic'-key because it is later anyway created
3.) Most important (thanks to Scott who found the failure)
Move the check if the found string really is part of MATH to
the relevant place.
Without this change the search using 'Search only in maths' will fail miserably.
When implementing multi-row string breaking, an extra createLine()
statement, which made sense in the original code, was kept by mistake.
This basically made the mechanism ineffective, because it created one
row with the correct length, plus a second one with all the remaining
text, which would have to be itself broken. This went undetected
because the display is still correct.
Additionally, this issue polluted the break cache to the extent that
the hit rate could be 0%.
Together, these two effects created a major slowdown with a document
containing a single ~30000 characters paragraph.
Fixes bug #12534.
When toggleFree is called without a selection, the only result is to
change the cursor currentfont.
In the other cases (selection or implicit selection), we want to reset
the cursor font from the text font.
Fixes bug #12518.
To handle this case, we use '\lyxdollar' string instead.
Also try to handle '\n' in the docstring directly instead in the
string already converted to utf8.
(The utf8-version is still there, but commented out)
If the searched area contains deleted parts, there may be more closing
as opening parentheses in latex output. We have to remove them before
further processing.
Using the new inline statements
find_effective(), find_with_non_output(), find_with_deleted(),
find_set_feature(), find_add_feature() and find_clean_features()
makes the code a slightly better readable.
This lfun (like several others) does not work with multicell
selection. Disable the lfun in this this case for now, until a nice
solution is found.
Fixes bug #12530.
Also fix a thinko in interpreting the found values.
The match_len describes the length of the second regex field,
while matchend is the length of the search field 0.
This happens when the cursor goes into a deeper inset, since
selectWord() was called on the wrong Text object.
Additionally, fix the new word selection when cursor goes before
existing selection.
Fixes bug #12529.
DocBook comes in another commit, as the modifications are not required to keep the code compilable.
A semicolon is no more used between an index term and the places it appears, because some languages need a space before it and others not: this wasn't handled at all. With a dash, this problem disappears.
We are removing leading values from the start of string, so
the size of removed data was wrong because s.find() could find
a position inside the leading part.
Problem occured if
1.) not using regex and
2.) search without format and
3.) the search pattern ended with '}'.
then this last char '}' in the search pattern was discarded.
With the debug-level 'find' there are now less output.
The original output can be received now with debig-level 'findverbose'
Also constructions like
LYXERR(Debug::FIND|Debug::FINDVERBOSE, "...");
are now possible.
This adds native macros for subindexes (!level), |see and |seealso
as well as native support for ranges |( |) and pagination format
-- e.g., |textbf -- via the index dialog
Resolves#12478, #7232 and #5014
The feature is complete (incl. tex2lyx) except for
* file format change and lyx2lyx
* docbook/xhtml
* documentation
1/ put cusror in some display inset
2/ use shift-left until the cursor exits the inset
3/ see how the selection extends on the right.
This is not really a selection drawing bug, but rather the fact that
the anchor will be normalized to the first position after the inset,
which is in the next row.
This can be avoided by using the boundary property.
See discussion in bug #12520.
Difficult to decide, when to remove the sequence '%\n'.
The sequence is OK for latex output as a command separator,
but must be removed in searched string.
Alas, not all occurences are wrong. Sigh.
It is not a good idea to contruct a QChar from a char_type that is
really 32bits.
Use lyx::isSpace, which already catters for this case.
Since this code does not depend on qt anymore, move it to
support::countExpanders.
Get rid of Row::countSeparators, which is not used anymore.
Fixes bug #12519.
The functionality was mentioned, but it seems worth it to give the
command explicitly, so it is seen how "Branch:<branch name>" is used
to refer to the specific branch with name <branch name>.
Additionally, tweak a phrase in doc for buffer-forall.
In some situation the macros are not used with their unicode
representation. For instance all greek characters are used
as \alpha, \beta, ... in the latex output.
For the search it is more convenient to use the corresponding UTF-8 codes.
Wrong behaviour before this commit:
Open new lyx-file
insert
unicode-insert 0x025c 0x1d08
Open adv-find dialog
search for unicode 0x025c OK
search for unicode 0x1d08 OK
search with regex for unicode 0x025c OK
search with regex for unicode 0x1d08 ==> NOT OK (because we are searching for \textrevepsilon
and this was mapped to 0x025c
Fixes bug reported here:
https://www.mail-archive.com/lyx-devel@lists.lyx.org/msg217265.html
1. Start a new document.
2. Start a math inset and inside put "1+2".
3. Put the cursor to the right of "+".
4. Press <Shift> + L three times. This will select the entire math inset
(as expected).
5. Press <Shift> + R.
Before 503c7c16, the selection inside the math inset was preserved.
After 503c7c16, it is lost.
The problem is that InsetMathNest does too much for our needs and
resets the anchor (why, I do not know). Therefore, it is better to
duplicate the code.
These are just annoying. Note that the language mark cannot currently
be specified in a layout file, but it is not clear that there is a
need for that. Therefore I used the simple and hackish way.
This is actually a generic InsetInfo issue:
1/ the contents of the inset is computed in updateBuffer, so that it
is available for drawing but also for latex output (think batch
export). When it is called, it deletes the existing inner paragraph
and replaces it by a new one
2/ metrics build a new Row object that represents to paragraph
3/ draw() relies on this information
Now, imagine that updateBuffer() is called after metrics(). This can
happen for many reasons, and does happen here (display a shortcut info
and change the shortcut file from cua to emacs).
This problem has been here forever, but is only visible now that the
(experimental) bookmark display code needs to read the underlying
paragraph id.
The solution is to compute the inset contents at metrics time. This
is done by moving the relevant code to a new standalone build() method
that is called in metrics() but also in latex().
Except for dvi/ps output chain for which this trick was meant.
Also, issue an error message in this case. This is analogous to
the other output flavors now.
This is important for commands like !`, that are equivalent to \textexclamdown. However, ! is matched earlier, because the logic works with prefixes, hence the output doesn't make sense.
This avoid a crash when doing
command-sequence inset-forall Caption char-delete-forward; statistics; undo
in the user guide when a malformed selection is created.
The selection happens here because char-delete-forward will select the
caption instead of deleting it if the "force" parameter is not given.
This is a poor API IMO, it is the plain <del> action that should use a
special parameter.
Fix for bug #12456.
The labels are transmitted from Buffer to GuiRef by reference of refs_
in the getLabelList function. Previously, only one string was
transmitted. But I needed both the formatted string, e.g. "x enu:test"
or "Missing: enu:test", as well as the plain label, e.g. "enu:test".
The former is for the list of labels to choose from in GuiRef and the
latter for the label as shown in the line edit that contains the plain
label in order to create a new reference from it. Transmitting both is
what the pair achieves.
It does not make sense to issue the index processor before the
pagination is fixed. Particularly, if (classic) BibTeX is run,
we need one or more extra LaTeX runs after that before issuing
the index processor, since the citation labels and references are
only expanded then, which might change pagination. As a consequence,
we ended up in wrong index references.
This fixes a 16 year old bug report.
The minimal vamue is set to 10%, let's set the max to 1000%. This
avoids crashes when characters are too large.
The code is refactored to be more compact and the tests are more precise.
Fixes bug #12452.
Display manually set itemize symbols and their size in the work area.
Fix for bug #2277.
Also fixes a problem with document settings changed() not correctly emitted.
Before this patch, LyX would forcibly create an <abstract> tag even when there was no abstract in the document; this behaviour is sometimes desirable, but not when the abstract only contains comments (that's not valid DocBook: there must be a paragraph or assimilated within the abstract).
Inside a math inset when completing macro names, it could lead to crashes.
Note that this processUpdateFlags is present when outside of this if() branch.
When inserting inset over a selection, the layout is transferred if
the inset covers full paragraphs.
This is not the right policy in the case of environments. Until proper
code is written and tested, limit ourselves to command layouts.
Fixes bug #12251.
Typical example is a Labeling layout which label is an inline equation
larger than the screen. Before this commit, the row would not get
broken at all.
Two parts in the patch:
1/ when breaking the row in shortenIfNeeded, mark the last element as
AlwaysBreakAfter instead of BreakAfter, in case the next element is
NoBreakBefore.
2/ when nothing could be done, as last resort keep the first element
of the row only.
Prevent the return of impossible values for 'enum flags'.
For instance the result of '~Update::Force' at src/BufferView.cpp:3025 without this patch
is '4294967293'.
The string that Qt sees is not the original string, since we add
zero-width nonbreaking spaces around it, plus an override character to
force rendering direction. This means that translating positions
between these two representation can be a bit tricky.
We use a max(foo, 0) here to make sure that our intermediate
computation is postive.
Fixes part of bug #12452.
Setting sufficiently high value allows to use
ColorCode enums for new up to 32000 branch insets.
Previous setting printed messages if using more than 25 new branch insets.
"'ColorCode' ... src/Color.cpp:435:10: runtime error:
load of value 128, which is not a valid value for type"
It is not a good idea to take into account the horizontal scrolling
that may have happened. For example, this leads to display glitches
when a Description label is larger than text width.
This explains why SingleParUpdate strategy did not work with home/end
on a long row.
The spacing of Labeling, Description and friends shall be computed
when breaking the row, not when tokenizing it. Indeed, this is the
right place to determine its correct value.
To this end add a new MARGINSPACE row element type.
This allows to remove TextMetrics::labelEnd, which is not used anymore.
When a string is broken at the margin by the Qt algorithm, the space
at which breaking occurred is automatically skipped in width
computation. However, the ending space of the string is taken into
account and is visible for example at paragraph end.
When the trailing space is followed by a displayed inset, then the
space should be skipped too, which means that the width of the last
row element has to be recomputed. For the sake of performance, the
width of the element without trailing spaces is computed in advance in
FontMetrics::breakString.
This "no space" width will be used when trimming a row element of its trailing
spaces instead of the original one.
Additionally, do not trim trailing spaces when the row is flushed.
Fixes bug #12449.
The search widget triggers a showEvent() in updateTitle() leading to setting the focus to the default push button.
The check in updateTitle() for the need to restore the title avoids superfluous show events and avoids the unwanted focus change.
This ensures that we use a consistent Python interpreter in LyX.
$${python} is replaced by the Python version found.
Users can apply this in preferences and use the same version defined by
LyX.
An inset that resets its font (like Footnote) does not care at all
about enclosing font. Therefore the real starting point is the class
default font. This avoid cases where the footnote contents is forced
to \normalsize.
It turns out that the Greyedout note inset, did inherit font but was
declared as not doing it. This commmit changes the definition by
adding \normalfont\normalsize so that no inheritance happens.
Note that actually \normalfont resets everything but the font size.
This does not matter for footnote (which has its own font size) and
greyedout (which is fixed now), but may matter elsewhere. Also, I do
not know what the situation with HTML is.
We could not figure out the root issue, or at least not to the point
where we felt changing this code considering we could not trigger
any bug from a user perspective.
For now, we just add a comment in the code.
For more information, see our ML discussion here:
https://www.mail-archive.com/search?l=mid&q=20211227113249.53bf5a63%40admin1-desktop
This catches the case where the caption only contains a comment, as in export/export/latex/lyxbugs-resolved/cprotect/9313-comment-in-figure-float-caption. No duplicate work is performed to ensure the same level of performance as before.
The checkbox is hidden when backing store is enforced (wayland,
macOS). In practice, only X11 and Windows users will see it ; I only
have evidence of X11 people needing it, I can hide it for Windows
users too if necessary.
Fixes bug #12119.
LyX relies on a a backing store to draw when running under macOS or
Wayland, because Qt arbitrarily overwrites parts of the workarea
before we paint (and we paint only the parts that need to be painted).
However it seems that this is also necessary on X11 when the WM theme
is translucid. Since there is no way that I know of to detect this
situation, this patch adds a LyXRC setting to manually select this
drawing strategy.
Note that using a backing store is not always a good solution, since
this disables subpixel aliasing.
At this point there is no UI for the variable.
Fixes bug #12119
The default in the .ui is not considered in
GuiSearchWidget::restoreSession(), which sets a hard-coded default
if the stored setting is not found in the session file.
I'll start an ML discussion for whether the code in restoreSession()
should use the ui's default if the setting is not found in the
session.
For some reason, Qt can break strings before the first character
(although we try to prevent that). The code was not prepared to that,
now it is.
Remove a forgotten debug statement.
When a selection extends on more than a row, the space between the two
rows should always be painted in full. Otherwise, with layouts like
Chapter, the "Chapter" label may seem selected in part.
Increase the maximal size of the breakString cache (to compute where
to break lines) from 512kB to 10MB. This has a big impact of cache
hits on large file like the example in #12297, which is now 99%. On
this example the time taken by breakString decreases from 33.5us to
2.4us.
The string width cache has been increased fro 512kB to 1MB, but this
does not make such a big difference.
Additionally, comments and variable names have been improved.
Related to bug #12297.
Add new row flags Flush and FlushBefore to let insets indicate whether
they cause flushing of current row (eg. newline) or of previous row
(e.g. display insets).
Replace FontMetrics::breakAt, which returned the next break point,
with FontMetrics::breakString, which returns a vector of break points.
To this end, an additional parameter gives the available width for
next rows.
Rename various variables and methods accordingly. Factor the code in
breakString_helper to be more manageable.
Adapt Row::Element::splitAt to return a bool on sucess and provide
remaining row elements in a vector. The width noted above has been
added as parameters.
Rename the helper function splitFrom to moveElements and rewrite the
code to be more efficient.
Remove type of row element INVALID, which is not needed anymore.
The code in TextMetrics::breakParagraph is now much simpler.
In Row::finalize, remove the code that computed inconditionnally the
current element size, and make sure that this width will be computed
in all code paths of Row::Element::splitAt.
In TextMetrics::breakParagraph, get rid of the fragile `pos' local
variable, which was not correctly updated. Rely on the endpos of the
last element in row instead.
Rewrite cleanupRow to rely on the endpos of last the row element to
set row endpos, instead of a `pos' parameter.
Instead of having breakParagraph decide when breaking a row is
necessary, let Row::shortenIfNeeded set the row_flag of the last
element to request a row break. This was already done in splitAt.
This is in preparation of splitAt splitting in more than two elements.
Move to Row::Element::rtrim the code in Row::shortenIfNeeded that
removes trailing spaces from last element in row, so that it can be
called when actually breaking a row.
Fixes bug found by Kornel.
In this case, the extra element returned should empty but valid. The
row flag BreakAfter is set to indicate that we have a break there
(this principle will be used more generally in a forthcoming commit).
To detect that we cut at the trailing space, it is necessary to rely
on the difference between QTextLine::horizontalAdvance() and
QTextLine::naturalTextWidth() when the flag
QTextOption::IncludeTrailingSpaces is used: the trailing space is
taken into account in the later, but not in the former.
Somme comments have been added to make code intent clearer.
At least with Qt 4.8.7 on Ubuntu 16.04, QTextLine::lineWidth() can
return a bogus value, at least with Courier font. One hypothesis is
that the invisible characters that we use in breakAt_helper are given
a non-null width.
Work around it, although the exact bug has not been pinpointed.
Change semantics of Row::shortenIfNeeded: instead of breaking the row
and returning a boolean, it returns the list of row elements that have
been removed (or broken) from the row. The logic of the method remains
the same.
Use shortenIfNeeded in breakParagraph. This was the last missing block.
Remove Row::breakAt and the old breakRow. Only bugs remain now :)
To this end, add the helper function needsRowBreak which computes the
effect of two consecutive row flags. This function implements the
priorities described in RowFlags.h.
This function is called with the relevant flags, or NoBreak* when at
boundaries and updates need_new_row.
Some common code is factored in a new cleanupRow() helper.
Remove the code that computed the width every 30 characters (yay!).
Make sure that finalizeLast() is called after inserting a row element in
a row in breakParagraph.
Still many features missing:
- handle insets that break rows (display math, newline, ...)
- handle rows that are too long by replacing the single call to
breakAt with a call to a reworked Row::shortenIfNeeded.
- some easy things at the end of breakRow (bidi text, etc.).
Move the enum definition RowFlags in its own include file, to avoid
loading Inset.h. Document it more thoroughly.
Rename RowAfter to AlwaysBreakAfter.
Add CanBreakInside (rows that can be themselves broken). This allow to
differentiate elements before bodyPos() and allows to remove a
parameter to shortenIfNeeded().
Make the Inset::rowFlags() method return int instead of RowFlags, as
should be done for all the bitwise flags. Remove the hand-made bitwise
operators.
Set R::E::row_flags when creating elements.
* INSET elements use the inset's rowFLags();
* virtual element forbid breaking before them, and inherit the *After
flags from the previous element of the row;
* STRING elements usr CanBreakInside, except before bodyPos.
More stuff may be added later.
This contains large parts of breakRow, but creates a unique row for the paragraph.
The parts taken or not in redoParagraph are annotated.
The new method is not used yet.
Move declaration of RowList to Row.h
Move initialization of POD members of Row and Row::Element to declaration.
Make method isVirtual() depend on type.
Add new row element type INVALID and method isValid()
Make methods R::E::left/right_pos inline.
Add method R::E::splitAt() that returns an element containing the
remaining stuff, or an invalid element if nothing was split. breakAt
is now a simple wrapper around this function.
Add method R::push_back().
Since we intend to break the row element in two, it is not good to
truncate the string too early.
Moreover, the row element width is now set at this point, even if no
breaking occurs.
When inserting € in a math cell, it is put in a text inset and the
cursor leaves the inset. However, inserting ¤ then leads to
\text{€}\text{¤}.
Therefore, try to see if there is a previous \text inset that can be
recycled and insert the new inset there in this case, leading to
\text{€¤}.
Fixes bug #11979.
This allows to simplify the code in Lexer and to remove the dependency
on Formats class.
As a consequence, a pair of dummy definitions of isZippedFile can be removed.
Some new parskip possibilities had been added, but the check for
custom length index had not bee updated.
This code is very fragile.
Related to bug #10968.