From: Juergen Spitzmueller Date: Sun, 28 Jan 2024 11:13:27 +0000 (+0100) Subject: Restrict caption insertion in tables to where it makes sense (#13037) X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=ad6aa8ba4b9525c07e30242dd66e79ec172a2b78;p=features.git 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. --- diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 112e80643c..c98308c8d4 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 4dba557a80..7b8375f0a5 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; }