";
+ } else if (alignment==MTHARight) {
+ html+="
";
+ }
+ for (int i=0; itoHtml(h, currentEv, defaultEv);
+ if (i==0) html=html+h;
+ else html=html+"
"+h;
+ }
+ html+="
";
+ return ok;
+}
+
+QList
JKQTMathTextVerticalListNode::getChildren() {
+ return this->nodes;
+}
+
+
+int JKQTMathTextVerticalListNode::childCount() const
+{
+ return nodes.size();
+}
+
+
+void JKQTMathTextVerticalListNode::clearChildrenImpl(bool deleteChildren)
+{
+ if (deleteChildren) {
+ for (int i=0; isetParentNode(this);
+ return c;
+}
+
+JKQTMathTextHorizontalAlignment JKQTMathTextVerticalListNode::getAlignment() const
+{
+ return alignment;
+}
+
+JKQTMathTextVerticalOrientation JKQTMathTextVerticalListNode::getVerticalOrientation() const
+{
+ return verticalOrientation;
+}
+
+double JKQTMathTextVerticalListNode::getLineSpacingFactor() const
+{
+ return lineSpacingFactor;
+}
+
+JKQTMathTextVerticalListNode::SpacingMode JKQTMathTextVerticalListNode::getSpacingMode() const
+{
+ return spacingMode;
+}
+
+JKQTMathTextVerticalListNode::LayoutInfo::LayoutInfo():
+ width(0),
+ baselineHeight(0),
+ overallHeight(0),
+ strikeoutPos(0)
+{}
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h b/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h
index 4928eb8900..b03fe524c3 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h
@@ -27,22 +27,25 @@
#include "jkqtmathtext/jkqtmathtexttools.h"
#include "jkqtmathtext/nodes/jkqtmathtextnode.h"
#include
+#include
class JKQTMathText; // forward
// JKQTMATHTEXT_LIB_EXPORT
-/** \brief subclass representing a list of nodes in the syntax tree
+/** \brief subclass representing a list of nodes in the syntax tree, layed out horizontally
* \ingroup jkqtmathtext_items
*
* \note This type of node also implements typesetting sub-/superscript above/below the previous node (if
* JKQTMathTextNode::is() is \c true for that previus node. The drawing is done as defined in the
* following image \image html jkqtmathtext_subsuper_with_limits.png
+ *
+ * \see JKQTMathTextVerticalListNode
*/
-class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextListNode: public JKQTMathTextMultiChildNode {
+class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextHorizontalListNode: public JKQTMathTextMultiChildNode {
public:
- explicit JKQTMathTextListNode(JKQTMathText* parent);
- virtual ~JKQTMathTextListNode() override;
+ explicit JKQTMathTextHorizontalListNode(JKQTMathText* parent);
+ virtual ~JKQTMathTextHorizontalListNode() override;
/** \copydoc JKQTMathTextNode::getTypeName() */
virtual QString getTypeName() const override;
/** \copydoc JKQTMathTextNode::draw() */
@@ -72,6 +75,119 @@ class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextListNode: public JKQTMathTextMultiChil
void clearChildrenImpl(bool deleteChildren);
};
+
+
+/** \brief subclass representing a list of nodes in the syntax tree, layed out vertically
+ * \ingroup jkqtmathtext_items
+ *
+ * Each child can be thought of as a line, so this node represents a list of lines.
+ * The layout of the lines can left-aligned, right-aligned or centered.
+ *
+ * \image html jkqtmathtext_verticallist.png
+ *
+ * \image html jkqtmathtext_verticalalignment.png
+ *
+ * \image html jkqtmathtext_horizontalalignment.png
+ *
+ * \see JKQTMathTextHorizontalListNode
+ */
+class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextVerticalListNode: public JKQTMathTextMultiChildNode {
+ public:
+ /** \brief defines, how lines are beeing spaced by the node
+ *
+ * \image html jkqtmathtext_verticallist.png
+ */
+ enum SpacingMode {
+ SMDefault, /*!< space the lines with equilibrated spacing, i.e. the baselines are at least \c QFontMetricsF::lineSpacing()*JKQTMathTextVerticalListNode::lineSpacingFactor apart, but even more, if the height of the text bloxk is larger than the the font's ascent+descent */
+ SMMinimal /*!< space the lines as tight as possible, i.e. each line is separated by \c QFontMetricsF::leading()*JKQTMathTextVerticalListNode::lineSpacingFactor from the next line. This is a s compact as possible */
+ };
+ /** \brief convert a SpacingMode to a String */
+ static QString SpacingMode2String(SpacingMode mode);
+ /** \brief convert a String to a SpacingMode */
+ static SpacingMode String2SpacingMode(QString mode);
+
+ explicit JKQTMathTextVerticalListNode(JKQTMathText* parent, JKQTMathTextHorizontalAlignment _alignment=MTHACentered, double _linespacingFactor=1.0, SpacingMode spacingMode_=SMDefault, JKQTMathTextVerticalOrientation _verticalOrientation=MTVOFirstLine);
+ virtual ~JKQTMathTextVerticalListNode() override;
+ /** \copydoc JKQTMathTextNode::getTypeName() */
+ virtual QString getTypeName() const override;
+ /** \copydoc JKQTMathTextNode::draw() */
+ virtual double draw(QPainter& painter, double x, double y, JKQTMathTextEnvironment currentEv, const JKQTMathTextNodeSize* prevNodeSize=nullptr) override;
+ /** \copydoc JKQTMathTextNode::toHtml() */
+ virtual bool toHtml(QString& html, JKQTMathTextEnvironment currentEv, JKQTMathTextEnvironment defaultEv) override;
+ /** \brief add a child node */
+ void addChild(JKQTMathTextNode* n);
+ /** \copydoc JKQTMathTextMultiChildNode::getChildren() */
+ virtual QList getChildren() override;
+ /** \copydoc JKQTMathTextMultiChildNode::childCount() */
+ virtual int childCount() const override;
+ /** \copydoc JKQTMathTextMultiChildNode::clearChildren() */
+ virtual void clearChildren(bool deleteChildren=true) override;
+ /** \copydoc JKQTMathTextMultiChildNode::getChild() */
+ virtual JKQTMathTextNode* getChild(int i) override;
+ /** \copydoc JKQTMathTextMultiChildNode::getChild() */
+ virtual const JKQTMathTextNode* getChild(int i) const override;
+ /** \copydoc JKQTMathTextMultiChildNode::getChild() */
+ virtual JKQTMathTextNode* replaceChild(int i, JKQTMathTextNode* newChild) override;
+ /** \copydoc alignment */
+ JKQTMathTextHorizontalAlignment getAlignment() const;
+ /** \copydoc verticalOrientation */
+ JKQTMathTextVerticalOrientation getVerticalOrientation() const;
+ /** \copydoc lineSpacingFactor */
+ double getLineSpacingFactor() const;
+ /** \copydoc spacingMode */
+ SpacingMode getSpacingMode() const;
+ protected:
+ /** \copydoc JKQTMathTextNode::getSizeInternal() */
+ virtual void getSizeInternal(QPainter& painter, JKQTMathTextEnvironment currentEv, double& width, double& baselineHeight, double& overallHeight, double& strikeoutPos, const JKQTMathTextNodeSize* prevNodeSize=nullptr) override;
+
+ /** \brief describes the layout of the whole node */
+ struct LayoutInfo {
+ LayoutInfo();
+ /** \brief drawing position for each line */
+ QList X;
+ /** \brief width of whole block */
+ double width;
+ /** \brief baselineHeight of whole block */
+ double baselineHeight;
+ /** \brief overallHeight of whole block */
+ double overallHeight;
+ /** \brief strikeoutPos of whole block */
+ double strikeoutPos;
+ };
+ /** \brief calclates the layout of the whole block/node */
+ LayoutInfo calcLayout(QPainter& painter, JKQTMathTextEnvironment currentEv);
+
+ /** \brief list of child nodes, each representing one line */
+ QList nodes;
+ /** \brief alignment scheme used to lay out all lines
+ *
+ * \image html jkqtmathtext_horizontalalignment.png
+ */
+ JKQTMathTextHorizontalAlignment alignment;
+ /** \brief spacing of the separate lines, as factor of the default line-spacing [Default: 1].
+ *
+ * This property can be used to move the lines closer together or farther apart.
+ *
+ * \image html jkqtmathtext_verticallist.png
+ */
+ double lineSpacingFactor;
+ /** \brief vertical orientation of the baseline of the whole block (with respect to the single lines)
+ *
+ * \image html jkqtmathtext_verticalorientation.png
+ */
+ JKQTMathTextVerticalOrientation verticalOrientation;
+ /** \brief defines how the layout algorithm (see calcLayout() ) lays out the single lines */
+ SpacingMode spacingMode;
+
+
+
+ private:
+ /** \brief internal implementation of clearChildren() that is non-virtual, so can be used in the destructor */
+ void clearChildrenImpl(bool deleteChildren);
+};
+
+
+
#endif // JKQTMATHTEXTLISTNODE_H
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.cpp
index 3aa71e4689..9bc5d6f0a8 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.cpp
@@ -27,7 +27,7 @@
JKQTMathTextNode *simplifyJKQTMathTextNode(JKQTMathTextNode *node)
{
- JKQTMathTextListNode* nl=dynamic_cast(node);
+ JKQTMathTextHorizontalListNode* nl=dynamic_cast(node);
JKQTMathTextMultiChildNode* nmc=dynamic_cast(node);
JKQTMathTextSingleChildNode* nsc=dynamic_cast(node);
if (nl) {
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.h b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.h
index 981e5273c4..eafc409cb1 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.h
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.h
@@ -32,7 +32,7 @@ class JKQTMathTextNode; // forward
* \ingroup jkqtmathtext_items
*
* Basically this takes does the following steps (recursively):
- * - remove any JKQTMathTextListNode that has only one child
+ * - remove any JKQTMathTextHorizontalListNode that has only one child
* .
*/
JKQTMATHTEXT_LIB_EXPORT JKQTMathTextNode* simplifyJKQTMathTextNode(JKQTMathTextNode* node);