[LyX/master] Warn user when OUTLINE_IN/OUT is about to flatten the structure (#11178)

Juergen Spitzmueller spitz at lyx.org
Wed Feb 22 15:30:28 UTC 2023


commit c5e4043fa3553987f34f32819471ff8b00f5932a
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Wed Feb 22 17:31:32 2023 +0100

    Warn user when OUTLINE_IN/OUT is about to flatten the structure (#11178)
---
 src/Text3.cpp |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/src/Text3.cpp b/src/Text3.cpp
index d077dde..a45eb39 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -560,6 +560,45 @@ static void outline(OutlineOp mode, Cursor & cur, Text * text)
 		}
 		case OutlineIn:
 		case OutlineOut: {
+			// We first iterate without actually doing something
+			// in order to check whether the action flattens the structure.
+			// If so, warn (#11178).
+			ParagraphList::iterator cstart = start;
+			bool strucchange = false;
+			for (; cstart != finish; ++cstart) {
+				toclevel = buf.text().getTocLevel(distance(bgn, cstart));
+				if (toclevel == Layout::NOT_IN_TOC)
+					continue;
+	
+				DocumentClass const & tc = buf.params().documentClass();
+				int const newtoclevel =
+					(mode == OutlineIn ? toclevel + 1 : toclevel - 1);
+	
+				bool found = false;
+				for (auto const & lay : tc) {
+					if (lay.toclevel == newtoclevel
+					    && lay.isNumHeadingLabelType()
+					    && cstart->layout().isNumHeadingLabelType()) {
+						found = true;
+						break;
+					}
+				}
+				if (!found) {
+					strucchange = true;
+					break;
+				}
+			}
+			if (strucchange
+			    && frontend::Alert::prompt(_("Action flattens document structure"),
+						       _("This action will cause some headings that have been "
+							 "on different level before to be on the same level "
+							 "since there is no more lower or higher heading level. "
+							 "Continue still?"),
+						       1, 1,
+						       _("&Yes, continue nonetheless"),
+						       _("&No, quit operation")) == 1)
+				break;
+
 			pit_type const len = distance(start, finish);
 			buf.undo().recordUndo(cur, pit, pit + len - 1);
 			for (; start != finish; ++start) {


More information about the lyx-cvs mailing list