The branch, betterpaint, has been updated. - Log -----------------------------------------------------------------
commit 9b9b4c6c86bd0c7a49299f9b667cf8069f37b08d Author: Jean-Marc Lasgouttes <[email protected]> Date: Tue Mar 22 16:53:25 2016 +0100 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 3d7251c..0541f48 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -514,19 +514,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; } } @@ -862,15 +856,12 @@ bool TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit } // 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.right_boundary(true); need_new_row = par.isNewline(i); ++i; @@ -1751,23 +1742,23 @@ int TextMetrics::leftMargin(int max_width, // set the correct parindent if (pos == 0 && (layout.labeltype == LABEL_NO_LABEL - || layout.labeltype == LABEL_ABOVE - || layout.labeltype == LABEL_CENTERED - || (layout.labeltype == LABEL_STATIC - && layout.latextype == LATEX_ENVIRONMENT - && !text_->isFirstInSequence(pit))) + || layout.labeltype == LABEL_ABOVE + || layout.labeltype == LABEL_CENTERED + || (layout.labeltype == LABEL_STATIC + && layout.latextype == LATEX_ENVIRONMENT + && !text_->isFirstInSequence(pit))) && (align == LYX_ALIGN_BLOCK || align == LYX_ALIGN_LEFT) && !par.params().noindent() // in some insets, paragraphs are never indented && !text_->inset().neverIndent() // display style insets are always centered, omit indentation && !(!par.empty() - && par.isInset(pos) - && par.getInset(pos)->display()) + && par.isInset(pos) + && par.getInset(pos)->display() & Inset::Display) && (!(tclass.isDefaultLayout(par.layout()) - || tclass.isPlainLayout(par.layout())) + || tclass.isPlainLayout(par.layout())) || buffer.params().paragraph_separation - == BufferParams::ParagraphIndentSeparation)) { + == BufferParams::ParagraphIndentSeparation)) { // use the parindent of the layout when the // default indentation is used otherwise use // the indentation set in the document diff --git a/src/insets/Inset.h b/src/insets/Inset.h index 96071fa..4221b1c 100644 --- a/src/insets/Inset.h +++ b/src/insets/Inset.h @@ -438,14 +438,26 @@ public: /// does this inset try to use all available space (like \\hfill does)? virtual bool isHfill() const { return false; } + // Describe how the inset should be typeset 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; } /// virtual LyXAlignment contentAlignment() const { return LYX_ALIGN_NONE; } @@ -595,6 +607,21 @@ protected: Buffer * buffer_; }; + +inline Inset::DisplayType operator|(Inset::DisplayType const d1, + Inset::DisplayType const d2) +{ + return static_cast<Inset::DisplayType>(int(d1) | int(d2)); +} + + +inline Inset::DisplayType operator&(Inset::DisplayType const d1, + Inset::DisplayType const d2) +{ + return static_cast<Inset::DisplayType>(int(d1) & int(d2)); +} + + } // namespace lyx #endif diff --git a/src/insets/InsetBibtex.h b/src/insets/InsetBibtex.h index a4310ad..21d744a 100644 --- a/src/insets/InsetBibtex.h +++ b/src/insets/InsetBibtex.h @@ -50,7 +50,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 151d622..fe964c9 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 1d8775e..a1d6004 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 58a7e23..55153a8 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 e9b9600..52fc338 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -1044,7 +1044,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 b1aa9b4..3ee741e 100644 --- a/src/insets/InsetIndex.h +++ b/src/insets/InsetIndex.h @@ -115,7 +115,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 91125d8..55f4b66 100644 --- a/src/insets/InsetListings.cpp +++ b/src/insets/InsetListings.cpp @@ -65,7 +65,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 2dc9c55..a2848a1 100644 --- a/src/insets/InsetNewline.h +++ b/src/insets/InsetNewline.h @@ -47,6 +47,8 @@ public: 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 51f640a..51142d0 100644 --- a/src/insets/InsetNewpage.h +++ b/src/insets/InsetNewpage.h @@ -76,7 +76,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 14507b6..65c6da6 100644 --- a/src/insets/InsetNomencl.h +++ b/src/insets/InsetNomencl.h @@ -97,7 +97,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 e483cf2..d189bca 100644 --- a/src/insets/InsetNote.cpp +++ b/src/insets/InsetNote.cpp @@ -118,12 +118,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 c80d61b..d0dd4b7 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 f885423..6f09dfd 100644 --- a/src/insets/InsetRef.h +++ b/src/insets/InsetRef.h @@ -45,14 +45,12 @@ public: docstring toolTip(BufferView const &, int, int) const { return tooltip_; } /// - docstring getTOCString() const; + docstring getTOCString() const; /// bool hasSettings() const { return true; } /// 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 f8aae1e..e1eb5fc 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/InsetScript.h b/src/insets/InsetScript.h index decfee3..421b593 100644 --- a/src/insets/InsetScript.h +++ b/src/insets/InsetScript.h @@ -67,8 +67,6 @@ public: /// docstring layoutName() const; /// - DisplayType display() const; - /// void metrics(MetricsInfo &, Dimension &) const; /// void draw(PainterInfo & pi, int x, int y) const; diff --git a/src/insets/InsetSeparator.h b/src/insets/InsetSeparator.h index 2049c22..e57bd91 100644 --- a/src/insets/InsetSeparator.h +++ b/src/insets/InsetSeparator.h @@ -49,6 +49,8 @@ public: static void string2params(std::string const &, InsetSeparatorParams &); /// static std::string params2string(InsetSeparatorParams const &); + /// + DisplayType display() const { return BreakAfter | NoBoundary; } private: /// InsetSeparatorParams params() const { return params_; } diff --git a/src/insets/InsetTOC.h b/src/insets/InsetTOC.h index 074ad53..458c3ce 100644 --- a/src/insets/InsetTOC.h +++ b/src/insets/InsetTOC.h @@ -36,7 +36,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 fd35c11..48bccb5 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -5028,13 +5028,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 e94ebcd..4a2bb9c 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 a782751..ef94ecf 100644 --- a/src/mathed/InsetMathHull.cpp +++ b/src/mathed/InsetMathHull.cpp @@ -448,7 +448,7 @@ void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const } else { // insert a one pixel gap in front of the formula dim.wid += 1; - if (display()) + if (display() != Inline) dim.des += displayMargin(); } // Cache the inset dimension. @@ -457,12 +457,12 @@ void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const } FontSetChanger dummy1(mi.base, standardFont()); - StyleChanger dummy2(mi.base, display() ? LM_ST_DISPLAY : LM_ST_TEXT); + StyleChanger dummy2(mi.base, display() != Inline ? LM_ST_DISPLAY : LM_ST_TEXT); // let the cells adjust themselves InsetMathGrid::metrics(mi, dim); - if (display()) { + if (display() != Inline) { dim.asc += displayMargin(); dim.des += displayMargin(); } @@ -551,7 +551,7 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const bool const really_change_color = pi.base.font.color() == Color_none; ColorChanger dummy0(pi.base.font, color, really_change_color); FontSetChanger dummy1(pi.base, standardFont()); - StyleChanger dummy2(pi.base, display() ? LM_ST_DISPLAY : LM_ST_TEXT); + StyleChanger dummy2(pi.base, display() != Inline ? LM_ST_DISPLAY : LM_ST_TEXT); InsetMathGrid::draw(pi, x + 1, y); @@ -570,7 +570,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; @@ -587,7 +587,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; @@ -865,7 +865,7 @@ Inset::DisplayType InsetMathHull::display() const { if (type_ == hullSimple || type_ == hullNone || type_ == hullRegexp) return Inline; - return AlignCenter; + return Display; } bool InsetMathHull::numberedType() const @@ -2074,7 +2074,7 @@ int InsetMathHull::plaintext(odocstringstream & os, OutputParams const & op, size_t max_length) const { // disables ASCII-art for export of equations. See #2275. - if (0 && display()) { + if (0 && display() != Inline) { Dimension dim; TextMetricsInfo mi; metricsT(mi, dim); ----------------------------------------------------------------------- Summary of changes: src/TextMetrics.cpp | 53 +++++++++++++++++------------------------ src/insets/Inset.h | 35 ++++++++++++++++++++++++--- src/insets/InsetBibtex.h | 2 +- src/insets/InsetBox.h | 2 - src/insets/InsetCaption.h | 2 +- src/insets/InsetFloatList.h | 2 +- src/insets/InsetInclude.cpp | 2 +- src/insets/InsetIndex.h | 2 +- src/insets/InsetListings.cpp | 2 +- src/insets/InsetNewline.h | 2 + src/insets/InsetNewpage.h | 2 +- src/insets/InsetNomencl.h | 2 +- src/insets/InsetNote.cpp | 6 ---- src/insets/InsetNote.h | 2 - src/insets/InsetRef.h | 4 +-- src/insets/InsetScript.cpp | 6 ---- src/insets/InsetScript.h | 2 - src/insets/InsetSeparator.h | 2 + src/insets/InsetTOC.h | 2 +- src/insets/InsetTabular.cpp | 8 +++--- src/insets/InsetVSpace.h | 2 +- src/mathed/InsetMathHull.cpp | 16 ++++++------ 22 files changed, 80 insertions(+), 78 deletions(-) hooks/post-receive -- Repository for new features
