JKQtPlotter/lib/jkqtmathtext/nodes/jkqtmathtextwhitespacenode.h

116 lines
5.8 KiB
C++

/*
Copyright (c) 2008-2022 Jan W. Krieger (<jan@jkrieger.de>)
with contributions from: Razi Alavizadeh
This software is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License (LGPL) as published by
the Free Software Foundation, either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License (LGPL) for more details.
You should have received a copy of the GNU Lesser General Public License (LGPL)
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef JKQTMATHTEXTWHITESPACENODE_H
#define JKQTMATHTEXTWHITESPACENODE_H
#include "jkqtmathtext/jkqtmathtext_imexport.h"
#include "jkqtmathtext/jkqtmathtexttools.h"
#include "jkqtmathtext/nodes/jkqtmathtextnode.h"
#include <QPainter>
class JKQTMathText; // forward
/** \brief subclass representing one whitepsace node in the syntax tree
* \ingroup jkqtmathtext_items
*
* It can represent different types of spaces, see Types and different multiples of that space.
* so \c JKQTMathTextWhitespaceNode(WST1em,2,parent) will represent two 1em wide spaces, i.e. a 2em space.
*/
class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextWhitespaceNode: public JKQTMathTextNode {
public:
enum Types {
WSTNormal, /*!< \brief a normal-width whitespace */
WSTNonbreaking, /*!< \brief a normal-width, non-breaking whitespace */
WST1en, /*!< \brief 1en (= 0.5 * pointsize of the font) whitespace */
WST1em, /*!< \brief 1em (= pointsize of the font) whitespace */
WSTQuad=WST1em, /*!< \copydoc WST1em */
WSThair, /*!< \brief hair (thinner than thin) whitespace (1/12 em = pointsize/12) */
WSTthin, /*!< \brief thin whitespace (1/6 em = pointsize/6) */
WSTnegthin, /*!< \brief negative thin whitespace (-1/6 em = -pointsize/6) */
WSTmedium, /*!< \brief medium whitespace (2/9 em = pointsize*2/9) */
WSTnegmedium, /*!< \brief negative medium whitespace (-2/9 em = -pointsize*2/9) */
WSTthick, /*!< \brief thick whitespace (5/18 em = pointsize*5/18) */
WSTnegthick, /*!< \brief negative thick whitespace (-5/18 em = -pointsize*5/18) */
WSTthicker, /*!< \brief thicker whitespace (1/3 em = pointsize/3) */
};
/** \brief converts Types \a type into a string */
static QString Type2String(Types type);
/** \brief converts Types \a type into its width in pixels, based on \a currentEv and \a pd */
double Type2PixelWidth(Types type, JKQTMathTextEnvironment currentEv, QPaintDevice *pd) const;
/** \brief checks whether a given LaTeX instruction name is supported by this node class type */
static bool supportsInstructionName(const QString& instruction);
/** \brief constructs a node with count=1 and type=WSTNormal */
explicit JKQTMathTextWhitespaceNode(JKQTMathText* parent);
/** \brief constructs a node with count=1 and the width derived from the instruction name \a type */
explicit JKQTMathTextWhitespaceNode(const QString& type, JKQTMathText* parent);
/** \brief constructs a node with the specified \a count and the width derived from the instruction name \a type */
explicit JKQTMathTextWhitespaceNode(const QString& type, size_t count, JKQTMathText* parent);
/** \brief constructs a node with count=1 and the given \a type */
explicit JKQTMathTextWhitespaceNode(Types type, JKQTMathText* parent);
/** \brief constructs a node with the given \a type and \a count */
explicit JKQTMathTextWhitespaceNode(Types type, size_t cound, JKQTMathText* parent);
virtual ~JKQTMathTextWhitespaceNode() override;
/** \copydoc JKQTMathTextNode::getTypeName() */
virtual QString getTypeName() const override;
/** \copydoc JKQTMathTextNode::toHtml() */
virtual bool toHtml(QString& html, JKQTMathTextEnvironment currentEv, JKQTMathTextEnvironment defaultEv) override;
/** \brief copydoc WhitespaceProps::type */
Types getWhitespaceType() const;
/** \brief copydoc WhitespaceProps::count */
size_t getWhitespaceCount() const;
/** \copydoc JKQTMathTextNode::draw() */
virtual double draw(QPainter& painter, double x, double y, JKQTMathTextEnvironment currentEv, const JKQTMathTextNodeSize* prevNodeSize=nullptr) override;
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 a whitespace */
struct WhitespaceProps {
WhitespaceProps(Types type=WSTNormal, size_t count=1);
/** \brief type of the whitespace represented by this node */
Types type;
/** \brief number of whitespaces of the given type, represented by this node (default: 1) */
size_t count;
};
/** \brief properties of the whitespace represented by this node */
WhitespaceProps whitespace;
/** \brief converts Types \a type into its HTML representation */
static QString Type2HTML(Types type);
/** \brief translation table between latex instruction and WhitespaceProps */
static QHash<QString, WhitespaceProps> supportedInstructions;
/** \brief initializes supportedInstructions */
static void fillSupportedInstructions();
};
#endif // JKQTMATHTEXTWHITESPACENODE_H