[LyX/master] Restrict caption insertion in tables to where it makes sense (#13037)

Juergen Spitzmueller spitz at lyx.org
Sun Jan 28 09:47:10 UTC 2024


commit ad6aa8ba4b9525c07e30242dd66e79ec172a2b78
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sun Jan 28 12:13:27 2024 +0100

    Restrict caption insertion in tables to where it makes sense (#13037)
    
    This requires to move insetAllowed() to the cell level, as only cells
    in the caption row of a longtable actually can take a caption.
---
 src/insets/InsetTabular.cpp |   47 ++++++++++++++++++++++++------------------
 src/insets/InsetTabular.h   |   10 ++++++--
 2 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp
index 112e806..c98308c 100644
--- a/src/insets/InsetTabular.cpp
+++ b/src/insets/InsetTabular.cpp
@@ -1064,9 +1064,10 @@ void Tabular::updateIndexes()
 	rowofcell.resize(numberofcells);
 	columnofcell.resize(numberofcells);
 	idx_type i = 0;
-	// reset column and row of cells and update their width, alignment and ct status
+	// reset column and row of cells and update their width, alignment, caption, and ct status
 	for (row_type row = 0; row < nrows(); ++row) {
 		for (col_type column = 0; column < ncols(); ++column) {
+			cell_info[row][column].inset->toggleCaptionRow(is_long_tabular && ltCaption(row));
 			if (isPartOfMultiColumn(row, column)) {
 				cell_info[row][column].inset->toggleMultiCol(true);
 				continue;
@@ -2021,6 +2022,7 @@ void Tabular::read(Lexer & lex)
 				       << line << ')' << endl;
 				return;
 			}
+			cell_info[i][j].inset->toggleCaptionRow(is_long_tabular && row_info[i].caption);
 			getTokenValue(line, "multicolumn", cell_info[i][j].multicolumn);
 			getTokenValue(line, "multirow", cell_info[i][j].multirow);
 			getTokenValue(line, "mroffset", cell_info[i][j].mroffset);
@@ -4358,7 +4360,8 @@ bool Tabular::hasNewlines(idx_type cell) const
 
 InsetTableCell::InsetTableCell(Buffer * buf)
 	: InsetText(buf, InsetText::PlainLayout), isFixedWidth(false), isVarwidth(false),
-	  isMultiColumn(false), isMultiRow(false), contentAlign(LYX_ALIGN_CENTER)
+	  isMultiColumn(false), isMultiRow(false), isCaptionRow(false),
+	  contentAlign(LYX_ALIGN_CENTER)
 {}
 
 bool InsetTableCell::allowParagraphCustomization(idx_type) const
@@ -4463,6 +4466,24 @@ void InsetTableCell::metrics(MetricsInfo & mi, Dimension & dim) const
 }
 
 
+bool InsetTableCell::insetAllowed(InsetCode code) const
+{
+	switch (code) {
+	case FLOAT_CODE:
+	case MARGIN_CODE:
+	case MATHMACRO_CODE:
+	case WRAP_CODE:
+		return false;
+
+	case CAPTION_CODE:
+		return isCaptionRow;
+
+	default:
+		return true;
+	}
+}
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // InsetTabular
@@ -4497,24 +4518,6 @@ void InsetTabular::setBuffer(Buffer & buf)
 }
 
 
-bool InsetTabular::insetAllowed(InsetCode code) const
-{
-	switch (code) {
-	case FLOAT_CODE:
-	case MARGIN_CODE:
-	case MATHMACRO_CODE:
-	case WRAP_CODE:
-		return false;
-
-	case CAPTION_CODE:
-		return tabular.is_long_tabular;
-
-	default:
-		return true;
-	}
-}
-
-
 bool InsetTabular::allowMultiPar() const
 {
 	for (col_type c = 0; c < tabular.ncols(); ++c) {
@@ -7276,6 +7279,8 @@ void InsetTabular::tabularFeatures(Cursor & cur,
 		cur.pit() = 0;
 		cur.pos() = 0;
 		cur.selection(false);
+		// update the captionRow status of all cells
+		tabular.updateIndexes();
 		// If a row is set as caption, then also insert
 		// a caption. Otherwise the LaTeX output is broken.
 		// Select cell if it is non-empty
@@ -7295,6 +7300,8 @@ void InsetTabular::tabularFeatures(Cursor & cur,
 		FuncRequest fr(LFUN_INSET_DISSOLVE, "caption");
 		if (lyx::getStatus(fr).enabled())
 			lyx::dispatch(fr);
+		// update the captionRow status of all cells
+		tabular.updateIndexes();
 		break;
 	}
 
diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h
index 4dba557..7b8375f 100644
--- a/src/insets/InsetTabular.h
+++ b/src/insets/InsetTabular.h
@@ -77,6 +77,8 @@ public:
 	///
 	void toggleMultiRow(bool m) { isMultiRow = m; }
 	///
+	void toggleCaptionRow(bool m) { isCaptionRow = m; }
+	///
 	void setContentAlignment(LyXAlignment al) { contentAlign = al; }
 	/// writes the contents of the cell as a string, optionally
 	/// descending into insets
@@ -133,7 +135,9 @@ private:
 	bool isMultiColumn;
 	///
 	bool isMultiRow;
-	// FIXME: Here the thoughts from the comment above also apply.
+	// FIXME: For the next two items the thoughts from the comment above also apply.
+	///
+	bool isCaptionRow;
 	///
 	LyXAlignment contentAlign;
 	/// should paragraph indentation be omitted in any case?
@@ -148,6 +152,8 @@ private:
 	bool forceLocalFontSwitch() const override;
 	/// Is the width forced to some value?
 	bool hasFixedWidth() const override { return isFixedWidth; }
+	///
+	bool insetAllowed(InsetCode code) const override;
 };
 
 
@@ -1031,8 +1037,6 @@ public:
 	///
 	bool hasSettings() const override { return true; }
 	///
-	bool insetAllowed(InsetCode code) const override;
-	///
 	bool allowSpellCheck() const override { return true; }
 	///
 	bool canTrackChanges() const override { return true; }


More information about the lyx-cvs mailing list