From: Jean-Marc Lasgouttes Date: Tue, 22 Mar 2016 15:53:25 +0000 (+0100) Subject: Use new display() values to remove some inset hardcoding. X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=refs%2Fheads%2Fbetterbreak;p=features.git Use new display() values to remove some inset hardcoding. The enum is now made of flags that can be combined. This introduces several new values for Inset::DisplayType: BreakBefore, BreakAfter and Display=BreakBefore|BreakAfter. This last value replaces AlignCenter. Additionally the flags NoBoundary and CanBreakAfter are introduced for future use. Now a left aligned displayed inset will be defined as Display|LeftAlign. A newline inset is characterized as BreakAfter. This structure is used in breakRow to avoid explicit calls to isNewline() or isEnvSeparator(). More improvements will be built on top of this. Additionally several redundant display() methods (which returned Inline) have been removed. --- diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index c92af02184..c0556ee258 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -622,19 +622,13 @@ LyXAlignment TextMetrics::getAlign(Paragraph const & par, Row const & row) const // Display-style insets should always be on a centered row if (Inset const * inset = par.getInset(row.pos())) { - switch (inset->display()) { - case Inset::AlignLeft: - align = LYX_ALIGN_BLOCK; - break; - case Inset::AlignCenter: - align = LYX_ALIGN_CENTER; - break; - case Inset::Inline: - // unchanged (use align) - break; - case Inset::AlignRight: - align = LYX_ALIGN_RIGHT; - break; + if (inset->display() & Inset::Display) { + if (inset->display() & Inset::AlignLeft) + align = LYX_ALIGN_BLOCK; + else if (inset->display() & Inset::AlignRight) + align = LYX_ALIGN_RIGHT; + else + align = LYX_ALIGN_CENTER; } } @@ -976,15 +970,12 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const } // Handle some situations that abruptly terminate the row - // - A newline inset - // - Before a display inset - // - After a display inset - Inset const * inset = 0; - if (par.isNewline(i) || par.isEnvSeparator(i) - || (i + 1 < end && (inset = par.getInset(i + 1)) - && inset->display()) - || (!row.empty() && row.back().inset - && row.back().inset->display())) { + // - Before an inset with BreakBefore + // - After an inset with BreakAfter + Inset const * prevInset = !row.empty() ? row.back().inset : 0; + Inset const * nextInset = (i + 1 < end) ? par.getInset(i + 1) : 0; + if ((nextInset && nextInset->display() & Inset::BreakBefore) + || (prevInset && prevInset->display() & Inset::BreakAfter)) { row.flushed(true); // We will force a row creation after either // - a newline; @@ -1774,7 +1765,7 @@ int TextMetrics::leftMargin(pit_type const pit, pos_type const pos) const // display style insets are always centered, omit indentation && !(!par.empty() && par.isInset(pos) - && par.getInset(pos)->display()) + && par.getInset(pos)->display() & Inset::Display) && (!(tclass.isDefaultLayout(par.layout()) || tclass.isPlainLayout(par.layout())) || buffer.params().paragraph_separation diff --git a/src/insets/Inset.h b/src/insets/Inset.h index 457ff44cb9..c5acc6800c 100644 --- a/src/insets/Inset.h +++ b/src/insets/Inset.h @@ -487,12 +487,23 @@ public: enum DisplayType { Inline = 0, - AlignLeft, - AlignCenter, - AlignRight + // break row before this inset + BreakBefore = 1, + // break row after this inset + BreakAfter = 2, + // optionally break row after this inset (not used yet) + CanBreakAfter = 4, + // specify an alignment (left, right) for a display inset (default is center) + AlignLeft = 8, + AlignRight = 16, + // do not allow cursor to go at the end of the row before + // a display inset (not used yet) + NoBoundary = 32, + // A display inset breaks row at both ends + Display = BreakBefore | BreakAfter }; - /// should we have a non-filled line before this inset? + /// How should this inset be typeset? virtual DisplayType display() const { return Inline; } /// indentation before this inset (only needed for displayed hull insets with fleqn option) virtual int indent(BufferView const &) const { return 0; } @@ -652,6 +663,21 @@ protected: Buffer * buffer_; }; + +inline Inset::DisplayType operator|(Inset::DisplayType const d1, + Inset::DisplayType const d2) +{ + return static_cast(int(d1) | int(d2)); +} + + +inline Inset::DisplayType operator&(Inset::DisplayType const d1, + Inset::DisplayType const d2) +{ + return static_cast(int(d1) & int(d2)); +} + + } // namespace lyx #endif diff --git a/src/insets/InsetBibtex.h b/src/insets/InsetBibtex.h index a46619367b..70319c5ff3 100644 --- a/src/insets/InsetBibtex.h +++ b/src/insets/InsetBibtex.h @@ -48,7 +48,7 @@ public: /// InsetCode lyxCode() const { return BIBTEX_CODE; } /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } /// void latex(otexstream &, OutputParams const &) const; /// diff --git a/src/insets/InsetBox.h b/src/insets/InsetBox.h index 6dd671c9a4..50a8ea2568 100644 --- a/src/insets/InsetBox.h +++ b/src/insets/InsetBox.h @@ -111,8 +111,6 @@ public: /// void metrics(MetricsInfo &, Dimension &) const; /// - DisplayType display() const { return Inline; } - /// ColorCode backgroundColor(PainterInfo const &) const; /// LyXAlignment contentAlignment() const; diff --git a/src/insets/InsetCaption.h b/src/insets/InsetCaption.h index a651a71a56..faacadadf7 100644 --- a/src/insets/InsetCaption.h +++ b/src/insets/InsetCaption.h @@ -38,7 +38,7 @@ private: /// void write(std::ostream & os) const; /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } /// bool neverIndent() const { return true; } /// diff --git a/src/insets/InsetFloatList.h b/src/insets/InsetFloatList.h index 7d1df4765a..eabd7ceed4 100644 --- a/src/insets/InsetFloatList.h +++ b/src/insets/InsetFloatList.h @@ -32,7 +32,7 @@ public: /// InsetCode lyxCode() const { return FLOAT_LIST_CODE; } /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } /// void write(std::ostream &) const; /// diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 6dca350078..305927f28a 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -1228,7 +1228,7 @@ string InsetInclude::contextMenuName() const Inset::DisplayType InsetInclude::display() const { - return type(params()) == INPUT ? Inline : AlignCenter; + return type(params()) == INPUT ? Inline : Display; } diff --git a/src/insets/InsetIndex.h b/src/insets/InsetIndex.h index 504eb84720..93007e92a9 100644 --- a/src/insets/InsetIndex.h +++ b/src/insets/InsetIndex.h @@ -119,7 +119,7 @@ public: /// bool hasSettings() const; /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } //@} /// \name Static public methods obligated for InsetCommand derived classes diff --git a/src/insets/InsetListings.cpp b/src/insets/InsetListings.cpp index f2af5813bd..c421b467c9 100644 --- a/src/insets/InsetListings.cpp +++ b/src/insets/InsetListings.cpp @@ -68,7 +68,7 @@ InsetListings::~InsetListings() Inset::DisplayType InsetListings::display() const { - return params().isInline() || params().isFloat() ? Inline : AlignLeft; + return params().isInline() || params().isFloat() ? Inline : Display | AlignLeft; } diff --git a/src/insets/InsetNewline.h b/src/insets/InsetNewline.h index e0a13f38d4..472006322e 100644 --- a/src/insets/InsetNewline.h +++ b/src/insets/InsetNewline.h @@ -47,6 +47,8 @@ public: explicit InsetNewline(InsetNewlineParams par) : Inset(0) { params_.kind = par.kind; } /// + DisplayType display() const { return BreakAfter | NoBoundary; } + /// static void string2params(std::string const &, InsetNewlineParams &); /// static std::string params2string(InsetNewlineParams const &); diff --git a/src/insets/InsetNewpage.h b/src/insets/InsetNewpage.h index 4a7d60d010..2a2772405f 100644 --- a/src/insets/InsetNewpage.h +++ b/src/insets/InsetNewpage.h @@ -74,7 +74,7 @@ private: /// void write(std::ostream & os) const; /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } /// docstring insetLabel() const; /// diff --git a/src/insets/InsetNomencl.h b/src/insets/InsetNomencl.h index 4d11a47d79..b5a4e9315c 100644 --- a/src/insets/InsetNomencl.h +++ b/src/insets/InsetNomencl.h @@ -100,7 +100,7 @@ public: /// bool hasSettings() const { return true; } /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } /// void latex(otexstream &, OutputParams const &) const; /// diff --git a/src/insets/InsetNote.cpp b/src/insets/InsetNote.cpp index 9f4c5ed1d0..868ff83e2c 100644 --- a/src/insets/InsetNote.cpp +++ b/src/insets/InsetNote.cpp @@ -116,12 +116,6 @@ docstring InsetNote::layoutName() const } -Inset::DisplayType InsetNote::display() const -{ - return Inline; -} - - void InsetNote::write(ostream & os) const { params_.write(os); diff --git a/src/insets/InsetNote.h b/src/insets/InsetNote.h index 9df1a501a2..5c99df1909 100644 --- a/src/insets/InsetNote.h +++ b/src/insets/InsetNote.h @@ -61,8 +61,6 @@ private: InsetCode lyxCode() const { return NOTE_CODE; } /// docstring layoutName() const; - /// - DisplayType display() const; /** returns false if, when outputing LaTeX, font changes should be closed before generating this inset. This is needed for insets that may contain several paragraphs */ diff --git a/src/insets/InsetRef.h b/src/insets/InsetRef.h index 8683ecf989..b595e4130a 100644 --- a/src/insets/InsetRef.h +++ b/src/insets/InsetRef.h @@ -56,8 +56,6 @@ public: /// InsetCode lyxCode() const { return REF_CODE; } /// - DisplayType display() const { return Inline; } - /// void latex(otexstream &, OutputParams const &) const; /// int plaintext(odocstringstream & ods, OutputParams const & op, diff --git a/src/insets/InsetScript.cpp b/src/insets/InsetScript.cpp index f87f6c4747..13b67e16e1 100644 --- a/src/insets/InsetScript.cpp +++ b/src/insets/InsetScript.cpp @@ -151,12 +151,6 @@ docstring InsetScript::layoutName() const } -Inset::DisplayType InsetScript::display() const -{ - return Inline; -} - - void InsetScript::metrics(MetricsInfo & mi, Dimension & dim) const { int const shift = params_.shift(mi.base.font); diff --git a/src/insets/InsetSeparator.h b/src/insets/InsetSeparator.h index 2d256d6bee..e9701ad78b 100644 --- a/src/insets/InsetSeparator.h +++ b/src/insets/InsetSeparator.h @@ -64,6 +64,8 @@ public: // remove warning return docstring(); } + /// + DisplayType display() const { return BreakAfter | NoBoundary; } private: /// InsetCode lyxCode() const { return SEPARATOR_CODE; } diff --git a/src/insets/InsetTOC.h b/src/insets/InsetTOC.h index 4d48c3220f..29d5e91e76 100644 --- a/src/insets/InsetTOC.h +++ b/src/insets/InsetTOC.h @@ -37,7 +37,7 @@ public: /// docstring layoutName() const; /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } /// virtual void validate(LaTeXFeatures &) const; /// diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index dc8be284b2..e8de0705cd 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -5972,13 +5972,13 @@ Inset::DisplayType InsetTabular::display() const if (tabular.is_long_tabular) { switch (tabular.longtabular_alignment) { case Tabular::LYX_LONGTABULAR_ALIGN_LEFT: - return AlignLeft; + return Display | AlignLeft; case Tabular::LYX_LONGTABULAR_ALIGN_CENTER: - return AlignCenter; + return Display; case Tabular::LYX_LONGTABULAR_ALIGN_RIGHT: - return AlignRight; + return Display | AlignRight; default: - return AlignCenter; + return Display; } } else return Inline; diff --git a/src/insets/InsetVSpace.h b/src/insets/InsetVSpace.h index b2c8ac9780..aadffb0003 100644 --- a/src/insets/InsetVSpace.h +++ b/src/insets/InsetVSpace.h @@ -62,7 +62,7 @@ private: /// void write(std::ostream & os) const; /// - DisplayType display() const { return AlignCenter; } + DisplayType display() const { return Display; } /// void doDispatch(Cursor & cur, FuncRequest & cmd); /// diff --git a/src/mathed/InsetMathHull.cpp b/src/mathed/InsetMathHull.cpp index 7754e4dcd6..496a5414bb 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -536,7 +536,7 @@ void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const // insert a gap in front of the formula // value was hardcoded to 1 pixel dim.wid += mi.base.bv->zoomedPixels(1) ; - if (display()) { + if (display() != Inline) { dim.asc += display_margin; dim.des += display_margin; } @@ -546,7 +546,7 @@ void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const { Changer dummy1 = mi.base.changeFontSet(standardFont()); - Changer dummy2 = mi.base.font.changeStyle(display() ? DISPLAY_STYLE + Changer dummy2 = mi.base.font.changeStyle(display() != Inline ? DISPLAY_STYLE : TEXT_STYLE); // let the cells adjust themselves @@ -691,7 +691,7 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const // Then the equations Changer dummy1 = pi.base.changeFontSet(standardFont()); - Changer dummy2 = pi.base.font.changeStyle(display() ? DISPLAY_STYLE + Changer dummy2 = pi.base.font.changeStyle(display() != Inline ? DISPLAY_STYLE : TEXT_STYLE); InsetMathGrid::draw(pi, x + 1, y); drawMarkers(pi, x, y); @@ -699,7 +699,7 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const // drawing change line if (canPaintChange(*bv)) { // like in metrics() - int const display_margin = display() ? pi.base.inPixels(Length(12, Length::PT)) : 0; + int const display_margin = display() != Inline ? pi.base.inPixels(Length(12, Length::PT)) : 0; pi.change.paintCue(pi, x + 1, y + 1 - dim.asc + display_margin, x + dim.wid, y + dim.des - display_margin); } @@ -708,7 +708,7 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const void InsetMathHull::metricsT(TextMetricsInfo const & mi, Dimension & dim) const { - if (display()) { + if (display() != Inline) { InsetMathGrid::metricsT(mi, dim); } else { odocstringstream os; @@ -724,7 +724,7 @@ void InsetMathHull::metricsT(TextMetricsInfo const & mi, Dimension & dim) const void InsetMathHull::drawT(TextPainter & pain, int x, int y) const { - if (display()) { + if (display() != Inline) { InsetMathGrid::drawT(pain, x, y); } else { odocstringstream os; @@ -1035,12 +1035,12 @@ Inset::DisplayType InsetMathHull::display() const case hullMultline: case hullGather: if (buffer().params().is_math_indent) - return AlignLeft; + return Display | AlignLeft; else - return AlignCenter; + return Display; } // avoid warning - return AlignCenter; + return Display; } @@ -2368,7 +2368,7 @@ int InsetMathHull::plaintext(odocstringstream & os, OutputParams const & op, size_t max_length) const { // Try enabling this now that there is a flag as requested at #2275. - if (buffer().isExporting() && display()) { + if (buffer().isExporting() && display() != Inline) { Dimension dim; TextMetricsInfo mi; metricsT(mi, dim);