2022-06-08 21:38:26 +08:00
/*
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 JKQTMATHTEXTBRACENODE_H
# define JKQTMATHTEXTBRACENODE_H
# include "jkqtmathtext/jkqtmathtext_imexport.h"
# include "jkqtmathtext/jkqtmathtexttools.h"
# include "jkqtmathtext/nodes/jkqtmathtextnode.h"
# include <QPainter>
class JKQTMathText ; // forward
// JKQTMATHTEXT_LIB_EXPORT
/** \brief subclass representing a brace node
* \ ingroup jkqtmathtext_items
2022-06-09 20:30:15 +08:00
*
2022-06-09 20:42:25 +08:00
* \ image html jkqtmathtext / jkqtmathtext_bracenode_geo . png
2022-06-19 21:11:06 +08:00
*
* This node supports the brace - types encoded by JKQTMathTextBraceType :
* \ copydetails JKQTMathTextBraceType
*
* In addition it is possible to switch the opening and the closing braces independently on and off .
*/
2022-06-09 05:52:22 +08:00
class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextBraceNode : public JKQTMathTextSingleChildNode {
2022-06-08 21:38:26 +08:00
public :
2022-06-19 21:11:06 +08:00
JKQTMathTextBraceNode ( JKQTMathText * parent , JKQTMathTextBraceType openbrace , JKQTMathTextBraceType closebrace , JKQTMathTextNode * child ) ;
2022-06-08 21:38:26 +08:00
virtual ~ JKQTMathTextBraceNode ( ) override ;
/** \copydoc JKQTMathTextNode::draw() */
2022-08-17 05:05:04 +08:00
virtual double draw ( QPainter & painter , double x , double y , JKQTMathTextEnvironment currentEv ) const override ;
2022-06-08 21:38:26 +08:00
/** \copydoc JKQTMathTextNode::toHtml() */
2022-08-17 05:05:04 +08:00
virtual bool toHtml ( QString & html , JKQTMathTextEnvironment currentEv , JKQTMathTextEnvironment defaultEv ) const override ;
2022-06-08 21:38:26 +08:00
/** \copydoc JKQTMathTextNode::getTypeName() */
virtual QString getTypeName ( ) const override ;
2022-06-09 05:52:22 +08:00
/** \copydoc openbrace */
2022-06-19 21:11:06 +08:00
JKQTMathTextBraceType getOpenbrace ( ) const ;
2022-06-08 21:38:26 +08:00
/** \copydoc closebrace */
2022-06-19 21:11:06 +08:00
JKQTMathTextBraceType getClosebrace ( ) const ;
2022-06-08 21:38:26 +08:00
protected :
2022-08-17 05:05:04 +08:00
/** \brief defines the size of the node (JKQTMathTextNodeSize) and additional information */
struct NodeSize : public JKQTMathTextNodeSize {
NodeSize ( ) ;
NodeSize ( const NodeSize & other ) ;
NodeSize ( const JKQTMathTextNodeSize & other ) ;
NodeSize & operator = ( const NodeSize & other ) ;
NodeSize & operator = ( const JKQTMathTextNodeSize & other ) ;
/** \brief width of the opening brace */
double openBraceWidth ;
/** \brief height of the opening brace */
double openBraceHeight ;
/** \brief width of the closing brace */
double closeBraceWidth ;
/** \brief height of the closing brace */
double closeBraceHeight ;
} ;
2022-06-09 20:30:15 +08:00
/** \copydoc JKQTMathTextNode::getSizeInternal()
*
* \ note This function internally calls getSizeInternalAndBrace ( ) and returns part of its results .
*/
2022-08-17 05:05:04 +08:00
virtual JKQTMathTextNodeSize getSizeInternal ( QPainter & painter , JKQTMathTextEnvironment currentEv ) const override ;
2022-06-09 20:30:15 +08:00
/** calculates the size of this node (also returned by getSizeInternal() ) and of the brace */
2022-08-17 05:05:04 +08:00
NodeSize getSizeInternalAndBrace ( QPainter & painter , JKQTMathTextEnvironment currentEv ) const ;
2022-06-09 05:52:22 +08:00
/**\brief opening brace */
2022-06-19 21:11:06 +08:00
JKQTMathTextBraceType openbrace ;
2022-06-09 05:52:22 +08:00
/**\brief closing brace */
2022-06-19 21:11:06 +08:00
JKQTMathTextBraceType closebrace ;
2022-09-20 03:53:53 +08:00
/** \brief calculate the width of the braces, fills JKQTMathTextBraceNode::NodeSize::openBraceWidth/JKQTMathTextBraceNode::NodeSize::closeBraceWidth and JKQTMathTextBraceNode::NodeSize::openBraceHeight/JKQTMathTextBraceNode::NodeSize::closeBraceHeight in \a out, based on \a childSize
2022-08-17 05:05:04 +08:00
*
2022-09-20 03:53:53 +08:00
* \ param [ out ] out this function fills JKQTMathTextBraceNode : : NodeSize : : openBraceWidth / JKQTMathTextBraceNode : : NodeSize : : closeBraceWidth and JKQTMathTextBraceNode : : NodeSize : : openBraceHeight / JKQTMathTextBraceNode : : NodeSize : : closeBraceHeight in \ a out
2022-08-17 05:05:04 +08:00
* \ param painter a QPainter used for size - calculation / drawing
* \ param currentEv font environment
* \ param childSize size of the child node surrounded by the node
*/
void calcBraceSizes ( NodeSize & out , QPainter & painter , const JKQTMathTextEnvironment & currentEv , const JKQTMathTextNodeSize & childSize ) const ;
/** \brief calculate the width and height of a brace, based on \a childSize
*
* \ param fm QFontMetricsF object describing the font of the current environment
* \ param bracetype brace type
* \ param childSize size of the child node surrounded by the node
*
* \ return width and hieght of the brace
*/
2024-01-09 00:16:31 +08:00
QSizeF calcBraceSize ( const QFont & fm , QPaintDevice * pd , JKQTMathTextBraceType bracetype , const JKQTMathTextNodeSize & childSize ) const ;
2022-06-08 21:38:26 +08:00
} ;
# endif // JKQTMATHTEXTBRACENODE_H