diff --git a/doc/dox/jkqtmathtext.dox b/doc/dox/jkqtmathtext.dox
index b4142e9b48..1156356275 100644
--- a/doc/dox/jkqtmathtext.dox
+++ b/doc/dox/jkqtmathtext.dox
@@ -12,8 +12,21 @@
- \ref JKQTMathTextSimpleExample
.
-\defgroup jkqtmathtext_items JKQTMathText Render-Tree Items
-\ingroup jkqtmathtext
+
+ \defgroup jkqtmathtext_render JKQTMathText Main (Render) Class
+ \ingroup jkqtmathtext
+
+ \defgroup jkqtmathtext_items JKQTMathText Render-Tree Items
+ \ingroup jkqtmathtext_render
+
+ \defgroup jkqtmathtext_widgets JKQTMathText widgets
+ \ingroup jkqtmathtext
+
+ \defgroup jkqtmathtext_tools JKQTMathText Tool Functions and Types
+ \ingroup jkqtmathtext
+
+ \defgroup jkqtmathtext_tools JKQTMathText Tool Functions and Types
+ \ingroup jkqtmathtext
*/
\ No newline at end of file
diff --git a/doc/dox/whatsnew.dox b/doc/dox/whatsnew.dox
index bfdfed6b96..1dd5563c6c 100644
--- a/doc/dox/whatsnew.dox
+++ b/doc/dox/whatsnew.dox
@@ -40,6 +40,7 @@ Changes, compared to \ref page_whatsnew_V4_0_0 "v4.0.0" include:
NEW: improved frac-rendering: font-scaling takes nesting-level into account, overall-rendering, sizes, if a brace surrounds a frac, the heights are equal above and below to center the brace , ...
NEW: shows strikeoutPos when drawing Debug-Boxes
NEW: LaTeX-Parser understands optional instruction parameters in [...] now
+ NEW: LaTeX-Parser simplifies parrse-tree to increase speed of execution
diff --git a/examples/jkqtmathtext_test/testform.cpp b/examples/jkqtmathtext_test/testform.cpp
index 08f334231b..17257b5886 100644
--- a/examples/jkqtmathtext_test/testform.cpp
+++ b/examples/jkqtmathtext_test/testform.cpp
@@ -368,16 +368,16 @@ QTreeWidgetItem *TestForm::createTree(JKQTMathTextNode *node, QTreeWidgetItem* p
if (inst1N->getChild()) ti->addChild(createTree(inst1N->getChild(), ti));
} else if (lstN) {
name=QString("MTlistNode");
- QList list=lstN->getNodes();
+ QList list=lstN->getChildren();
for (int i=0; iaddChild(createTree(list[i], ti));
}
} else if (symN) {
- name=QString("JKQTMathTextSymbolNode: \'%1\' (addWhite: %2)").arg(symN->getSymbolName()).arg(symN->getAddWhitespace());
+ name=QString("MTSymbolNode: \'%1\' (addWhite: %2)").arg(symN->getSymbolName()).arg(symN->getAddWhitespace());
} else if (spN) {
- name=QString("JKQTMathTextWhitespaceNode :\'%1\'").arg(txtN->getText());
+ name=QString("MTWhitespaceNode :\'%1\'").arg(txtN->getText());
} else if (txtN) {
- name=QString("JKQTMathTextTextNode: \'%1\'").arg(txtN->getText());
+ name=QString("MTTextNode: \'%1\'").arg(txtN->getText());
} else {
name=QString("unknown");
diff --git a/lib/jkqtmathtext/CMakeLists.txt b/lib/jkqtmathtext/CMakeLists.txt
index 98b338c0a0..a44ad2c133 100644
--- a/lib/jkqtmathtext/CMakeLists.txt
+++ b/lib/jkqtmathtext/CMakeLists.txt
@@ -35,6 +35,7 @@ set(SOURCES
${CMAKE_CURRENT_LIST_DIR}/nodes/jkqtmathtextsqrtnode.cpp
${CMAKE_CURRENT_LIST_DIR}/nodes/jkqtmathtextsubsupernode.cpp
${CMAKE_CURRENT_LIST_DIR}/nodes/jkqtmathtextsymbolnode.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/nodes/jkqtmathtextnodetools.cpp
)
set(HEADERS
@@ -66,6 +67,8 @@ set(HEADERS
$
$
$
+ $
+ $
$
$
)
diff --git a/lib/jkqtmathtext/jkqtmathtext.cpp b/lib/jkqtmathtext/jkqtmathtext.cpp
index 3750c7749d..ba7be4a7b7 100644
--- a/lib/jkqtmathtext/jkqtmathtext.cpp
+++ b/lib/jkqtmathtext/jkqtmathtext.cpp
@@ -33,6 +33,7 @@
#include "jkqtmathtext/nodes/jkqtmathtextsqrtnode.h"
#include "jkqtmathtext/nodes/jkqtmathtextsubsupernode.h"
#include "jkqtmathtext/nodes/jkqtmathtextsymbolnode.h"
+#include "jkqtmathtext/nodes/jkqtmathtextnodetools.h"
#include
#include
#include
@@ -979,12 +980,12 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
getNew=addWhite;
if (parsingMathEnvironment) {
if (mathEnvironmentSpecialText.contains(text.trimmed())) {
- nl->addNode(new JKQTMathTextSymbolNode(this, text, addWhite));
+ nl->addChild(new JKQTMathTextSymbolNode(this, text, addWhite));
} else {
- nl->addNode(new JKQTMathTextTextNode(this, text, addWhite, parsingMathEnvironment));
+ nl->addChild(new JKQTMathTextTextNode(this, text, addWhite, parsingMathEnvironment));
}
} else {
- nl->addNode(new JKQTMathTextTextNode(this, text, addWhite, parsingMathEnvironment));
+ nl->addChild(new JKQTMathTextTextNode(this, text, addWhite, parsingMathEnvironment));
}
} else if (currentToken==MTTinstruction) {
const QString currentInstructionName=currentTokenName;
@@ -993,9 +994,9 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
if (currentToken==MTTopenbrace) {
//std::cout<<"found '{' after '"<addNode(new JKQTMathTextSqrtNode(this, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextSqrtNode(this, parseLatexString(true)));
} else if (currentInstructionName=="cbrt") {
- nl->addNode(new JKQTMathTextSqrtNode(this, parseLatexString(true), 3));
+ nl->addChild(new JKQTMathTextSqrtNode(this, parseLatexString(true), 3));
} else if (currentInstructionName=="verb") {
QString text="";
currentTokenID++;
@@ -1007,73 +1008,73 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
if (currentTokenIDaddNode(new JKQTMathTextTextNode(this, text, false));
+ nl->addChild(new JKQTMathTextTextNode(this, text, false));
}
} else if (currentInstructionName=="frac") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMfrac));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMfrac));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="dfrac" || currentInstructionName=="cfrac") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMdfrac));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMdfrac));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="sfrac" || currentInstructionName=="slantfrac" || currentInstructionName=="xfrac") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMsfrac));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMsfrac));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="stfrac" || currentInstructionName=="nicefrac" || currentInstructionName=="slanttextfrac" || currentInstructionName=="xtfrac") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMstfrac));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMstfrac));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="tfrac") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMtfrac));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMtfrac));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="stackrel") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMstackrel));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMstackrel));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="binom") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextBraceNode(this, MTBTParenthesis, MTBTParenthesis, new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMstackrel)));
+ if (n1 && n2) nl->addChild(new JKQTMathTextBraceNode(this, MTBTParenthesis, MTBTParenthesis, new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMstackrel)));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="underbrace") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMunderbrace));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMunderbrace));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="underset") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMunderset));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMunderset));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="overbrace") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMoverbrace));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMoverbrace));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="overset") {
JKQTMathTextNode* n1=parseLatexString(true);
JKQTMathTextNode* n2=nullptr;
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
- if (n1 && n2) nl->addNode(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMoverset));
+ if (n1 && n2) nl->addChild(new JKQTMathTextFracNode(this, n1, n2, JKQTMathTextFracNode::MTFMoverset));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else if (currentInstructionName=="begin") {
if (getToken()==MTTtext) {
@@ -1100,13 +1101,13 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
first=false;
}
//std::cout<<" creating matrix-node with "<addNode(new JKQTMathTextBraceNode(this, MTBTParenthesis, MTBTParenthesis, new JKQTMathTextMatrixNode(this, items)));
- else if (envname=="cases") nl->addNode(new JKQTMathTextBraceNode(this, MTBTCurlyBracket, MTBTNone, new JKQTMathTextMatrixNode(this, items)));
- else if (envname=="bmatrix") nl->addNode(new JKQTMathTextBraceNode(this, MTBTSquareBracket, MTBTSquareBracket, new JKQTMathTextMatrixNode(this, items)));
- else if (envname=="Bmatrix") nl->addNode(new JKQTMathTextBraceNode(this, MTBTCurlyBracket, MTBTCurlyBracket, new JKQTMathTextMatrixNode(this, items)));
- else if (envname=="vmatrix") nl->addNode(new JKQTMathTextBraceNode(this, MTBTSingleLine, MTBTSingleLine, new JKQTMathTextMatrixNode(this, items)));
- else if (envname=="Vmatrix") nl->addNode(new JKQTMathTextBraceNode(this, MTBTDoubleLine, MTBTDoubleLine, new JKQTMathTextMatrixNode(this, items)));
- else nl->addNode(new JKQTMathTextMatrixNode(this, items));
+ if (envname=="pmatrix") nl->addChild(new JKQTMathTextBraceNode(this, MTBTParenthesis, MTBTParenthesis, new JKQTMathTextMatrixNode(this, items)));
+ else if (envname=="cases") nl->addChild(new JKQTMathTextBraceNode(this, MTBTCurlyBracket, MTBTNone, new JKQTMathTextMatrixNode(this, items)));
+ else if (envname=="bmatrix") nl->addChild(new JKQTMathTextBraceNode(this, MTBTSquareBracket, MTBTSquareBracket, new JKQTMathTextMatrixNode(this, items)));
+ else if (envname=="Bmatrix") nl->addChild(new JKQTMathTextBraceNode(this, MTBTCurlyBracket, MTBTCurlyBracket, new JKQTMathTextMatrixNode(this, items)));
+ else if (envname=="vmatrix") nl->addChild(new JKQTMathTextBraceNode(this, MTBTSingleLine, MTBTSingleLine, new JKQTMathTextMatrixNode(this, items)));
+ else if (envname=="Vmatrix") nl->addChild(new JKQTMathTextBraceNode(this, MTBTDoubleLine, MTBTDoubleLine, new JKQTMathTextMatrixNode(this, items)));
+ else nl->addChild(new JKQTMathTextMatrixNode(this, items));
//std::cout<<" creating matrix-node ... done!\n";
} else {
error_list.append(tr("error @ ch. %1: unknown environment '%2'").arg(currentTokenID).arg(envname));
@@ -1131,47 +1132,47 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
getNew=true;
}
} else if (currentInstructionName=="vec") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDvec, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDvec, parseLatexString(true)));
} else if (currentInstructionName=="overline"||currentInstructionName=="oline"||currentInstructionName=="ol") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDoverline, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDoverline, parseLatexString(true)));
} else if (currentInstructionName=="underline"||currentInstructionName=="uline"||currentInstructionName=="ul") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDunderline, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDunderline, parseLatexString(true)));
} else if (currentInstructionName=="uuline"||currentInstructionName=="uul") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDdoubleunderline, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDdoubleunderline, parseLatexString(true)));
} else if (currentInstructionName=="ooline"||currentInstructionName=="ool") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDdoubleoverline, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDdoubleoverline, parseLatexString(true)));
} else if (currentInstructionName=="arrow"||currentInstructionName=="overrightarrow"||currentInstructionName=="overarrow") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDarrow, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDarrow, parseLatexString(true)));
} else if (currentInstructionName=="hat" || currentInstructionName=="^") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDhat, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDhat, parseLatexString(true)));
} else if (currentInstructionName=="widehat") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDwidehat, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDwidehat, parseLatexString(true)));
} else if (currentInstructionName=="check" || currentInstructionName=="v") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDcheck, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDcheck, parseLatexString(true)));
} else if (currentInstructionName=="widecheck") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDwidecheck, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDwidecheck, parseLatexString(true)));
} else if (currentInstructionName=="bar") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDbar, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDbar, parseLatexString(true)));
} else if (currentInstructionName=="dot" || currentInstructionName==".") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDdot, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDdot, parseLatexString(true)));
} else if (currentInstructionName=="ocirc") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDocirc, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDocirc, parseLatexString(true)));
} else if (currentInstructionName=="tilde" || currentInstructionName=="~") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDtilde, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDtilde, parseLatexString(true)));
} else if (currentInstructionName=="breve" || currentInstructionName=="u") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDbreve, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDbreve, parseLatexString(true)));
} else if (currentInstructionName=="widetilde") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDwidetilde, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDwidetilde, parseLatexString(true)));
} else if (currentInstructionName=="ddot") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDddot, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDddot, parseLatexString(true)));
} else if (currentInstructionName=="cancel") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDcancel, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDcancel, parseLatexString(true)));
} else if (currentInstructionName=="xcancel") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDxcancel, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDxcancel, parseLatexString(true)));
} else if (currentInstructionName=="bcancel") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDbcancel, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDbcancel, parseLatexString(true)));
} else if (currentInstructionName=="strike" || currentInstructionName=="st" || currentInstructionName=="sout") {
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDstrike, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDstrike, parseLatexString(true)));
} else {
if (currentInstructionName=="textcolor" || currentInstructionName=="mathcolor" || currentInstructionName=="color" || currentInstructionName=="colorbox") {
bool foundError=true;
@@ -1185,11 +1186,11 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
}
}
if (foundError) error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
- else nl->addNode(new JKQTMathTextInstruction1Node(this, currentInstructionName, parseLatexString(true), QStringList(col)));
+ else nl->addChild(new JKQTMathTextInstruction1Node(this, currentInstructionName, parseLatexString(true), QStringList(col)));
} else {
- nl->addNode(new JKQTMathTextInstruction1Node(this, currentInstructionName, parseLatexString(true)));
+ nl->addChild(new JKQTMathTextInstruction1Node(this, currentInstructionName, parseLatexString(true)));
}
}
} else if (currentToken==MTTopenbracket && currentInstructionName!="left") {
@@ -1198,8 +1199,8 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
JKQTMathTextNode* n1=parseLatexString(true, MTBTAny, "", true);
JKQTMathTextListNode* n1lst=dynamic_cast(n1);
JKQTMathTextTextNode* n1txt=dynamic_cast(n1);
- if (n1lst && n1lst->count()==1) {
- n1txt=dynamic_cast(n1lst->child(0));
+ if (n1lst && n1lst->childCount()==1) {
+ n1txt=dynamic_cast(n1lst->getChild(0));
}
int degree=2;
bool ok=false;
@@ -1213,10 +1214,10 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
if (getToken()==MTTopenbrace) n2=parseLatexString(true);
else error_list.append(tr("error @ ch. %1: expected one argument in '{' braces after '%2' command with an optional argument in []").arg(currentTokenID).arg(currentInstructionName));
- if (n1 && n2) nl->addNode(new JKQTMathTextSqrtNode(this, n2, degree));
+ if (n1 && n2) nl->addChild(new JKQTMathTextSqrtNode(this, n2, degree));
else error_list.append(tr("error @ ch. %1: expected two arguments in '{' braces after '%2' command").arg(currentTokenID).arg(currentInstructionName));
} else {
- nl->addNode(new JKQTMathTextTextNode(this, "[", false));
+ nl->addChild(new JKQTMathTextTextNode(this, "[", false));
}
} else {
//std::cout<<"did not find '{' after '"<addNode(new JKQTMathTextBraceNode(this, MTBTNone, bracetype, cn));
+ nl->addChild(new JKQTMathTextBraceNode(this, MTBTNone, bracetype, cn));
} else if (isPrintableJKQTMathTextBraceType(bracetype)) {
currentTokenName=currentTokenName.right(currentTokenName.size()-1); // we already used the first character from the text token!
- nl->addNode(new JKQTMathTextBraceNode(this, bracetype, bracetype, parseLatexString(currentTokenName.size()<=0, bracetype)));
+ nl->addChild(new JKQTMathTextBraceNode(this, bracetype, bracetype, parseLatexString(currentTokenName.size()<=0, bracetype)));
} else {
getNew=false;
}
@@ -1266,12 +1267,12 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
} else if (currentToken==MTTinstruction) {
const JKQTMathTextBraceType bracetypeopening=InstructionName2OpeningJKQTMathTextBraceType(currentTokenName);
if (bracetypeopening!=MTBTUnknown) {
- nl->addNode(new JKQTMathTextBraceNode(this, bracetypeopening, bracetypeopening, parseLatexString(true, bracetypeopening)));
+ nl->addChild(new JKQTMathTextBraceNode(this, bracetypeopening, bracetypeopening, parseLatexString(true, bracetypeopening)));
} else if (currentToken==MTTinstruction && TokenNameMatchesJKQTMathTextBraceType(currentTokenName, quitOnClosingBrace, true)) {
break;
}
} else if (currentToken==MTTopenbracket) {
- nl->addNode(new JKQTMathTextBraceNode(this, MTBTSquareBracket, MTBTSquareBracket, parseLatexString(true, MTBTSquareBracket)));
+ nl->addChild(new JKQTMathTextBraceNode(this, MTBTSquareBracket, MTBTSquareBracket, parseLatexString(true, MTBTSquareBracket)));
} else {
error_list.append(tr("error @ ch. %1: unexpected token after \\left").arg(currentTokenID));
}
@@ -1287,11 +1288,11 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
if (n0=='v' && n1.isLetter()) {
done=true;
//std::cout<<"found \\v... command\n";
- nl->addNode(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDvec, new JKQTMathTextTextNode(this, QString(n1), false, parsingMathEnvironment)));
+ nl->addChild(new JKQTMathTextDecoratedNode(this, JKQTMathTextDecoratedNode::MTDvec, new JKQTMathTextTextNode(this, QString(n1), false, parsingMathEnvironment)));
} else if (n0=='c' && n1.isLetter()) {
done=true;
//std::cout<<"found \\v... command\n";
- nl->addNode(new JKQTMathTextInstruction1Node(this, "mathcal", new JKQTMathTextTextNode(this, QString(n1), false, parsingMathEnvironment)));
+ nl->addChild(new JKQTMathTextInstruction1Node(this, "mathcal", new JKQTMathTextTextNode(this, QString(n1), false, parsingMathEnvironment)));
}
} else if (currentInstructionName.size()==3) {
QString n0=currentInstructionName.left(2);
@@ -1299,15 +1300,15 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
if (n0=="bb" && n1.isLetter()) {
done=true;
//std::cout<<"found \\v... command\n";
- nl->addNode(new JKQTMathTextInstruction1Node(this, "mathbb", new JKQTMathTextTextNode(this, QString(n1), false, parsingMathEnvironment)));
+ nl->addChild(new JKQTMathTextInstruction1Node(this, "mathbb", new JKQTMathTextTextNode(this, QString(n1), false, parsingMathEnvironment)));
}
}
- if (!done) nl->addNode(new JKQTMathTextSymbolNode(this, currentInstructionName, false));//, addWhite));
+ if (!done) nl->addChild(new JKQTMathTextSymbolNode(this, currentInstructionName, false));//, addWhite));
}
}
} else if (currentToken==MTTwhitespace) {
- if (!parsingMathEnvironment) nl->addNode(new JKQTMathTextWhitespaceNode(this));
+ if (!parsingMathEnvironment) nl->addChild(new JKQTMathTextWhitespaceNode(this));
} else if (currentToken==MTTunderscore) {
getToken();
JKQTMathTextNode* child=nullptr;
@@ -1336,8 +1337,8 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
} else {
getNew=false;
}
- if (child!=nullptr) nl->addNode(new JKQTMathTextSubscriptNode(this, child));
- if (child2!=nullptr) nl->addNode(child2);
+ if (child!=nullptr) nl->addChild(new JKQTMathTextSubscriptNode(this, child));
+ if (child2!=nullptr) nl->addChild(child2);
} else if (currentToken==MTThat) {
getToken();
JKQTMathTextNode* child=nullptr;
@@ -1366,17 +1367,17 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
} else {
getNew=false;
}
- if (child!=nullptr) nl->addNode(new JKQTMathTextSuperscriptNode(this, child));
- if (child2!=nullptr) nl->addNode(child2);
+ if (child!=nullptr) nl->addChild(new JKQTMathTextSuperscriptNode(this, child));
+ if (child2!=nullptr) nl->addChild(child2);
} else if (currentToken==MTTopenbrace) {
- nl->addNode(parseLatexString(true));
+ nl->addChild(parseLatexString(true));
} else if (currentToken==MTTclosebrace) {
break;
} else if (currentToken==MTTopenbracket) {
- nl->addNode(new JKQTMathTextTextNode(this, "[", false));
+ nl->addChild(new JKQTMathTextTextNode(this, "[", false));
} else if (currentToken==MTTclosebracket) {
if (quitOnClosingBracket) break;
- else nl->addNode(new JKQTMathTextTextNode(this, "]", false));
+ else nl->addChild(new JKQTMathTextTextNode(this, "]", false));
} else if (currentToken==MTTampersand) {
break;
} else if (currentToken==MTTdollar) {
@@ -1385,13 +1386,13 @@ JKQTMathTextNode* JKQTMathText::parseLatexString(bool get, JKQTMathTextBraceType
break;
} else { // starting math environment
parsingMathEnvironment=true;
- nl->addNode(new JKQTMathTextInstruction1Node(this, "equation", parseLatexString(true)));
+ nl->addChild(new JKQTMathTextInstruction1Node(this, "equation", parseLatexString(true)));
}
}
if (getNew) getToken();
}
//std::cout<<" leaving parseLatexString()\n";
- return JKQTMathTextListNode::simplyfyListNode(nl);
+ return simplifyJKQTMathTextNode(nl);
}
diff --git a/lib/jkqtmathtext/jkqtmathtext.h b/lib/jkqtmathtext/jkqtmathtext.h
index 87519e6c95..26782583a8 100644
--- a/lib/jkqtmathtext/jkqtmathtext.h
+++ b/lib/jkqtmathtext/jkqtmathtext.h
@@ -42,7 +42,7 @@
class JKQTMathTextNode; // forward
/*! \brief this class parses a LaTeX string and can then draw the contained text/equation onto a QPainter
- \ingroup jkqtmathtext
+ \ingroup jkqtmathtext_render
JKQTMathText is a self-contained LaTeX-renderer for Qt. It is used to renderer
diff --git a/lib/jkqtmathtext/jkqtmathtextlabel.h b/lib/jkqtmathtext/jkqtmathtextlabel.h
index bc8dbfd69c..49af88ae1a 100644
--- a/lib/jkqtmathtext/jkqtmathtextlabel.h
+++ b/lib/jkqtmathtext/jkqtmathtextlabel.h
@@ -31,7 +31,7 @@
/*! \brief A QLabel-derived class that draws an equation with LaTeX markup using JKQTMathText
- \ingroup jkqtmathtext
+ \ingroup jkqtmathtext_widgets
\see JKQTMathText
*/
diff --git a/lib/jkqtmathtext/jkqtmathtexttools.h b/lib/jkqtmathtext/jkqtmathtexttools.h
index c311685efb..eff09ed409 100644
--- a/lib/jkqtmathtext/jkqtmathtexttools.h
+++ b/lib/jkqtmathtext/jkqtmathtexttools.h
@@ -47,13 +47,13 @@ class JKQTMathText; // forward
/** \brief initialized Qt-ressources necessary for JKQTMathText
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
JKQTMATHTEXT_LIB_EXPORT void initJKQTMathTextResources();
/*! \brief represents a font specifier for JKQTMathText. The font consists of two parts: the actual font and the font used for math output (which may be empty)
- \ingroup jkqtmathtext
+ \ingroup jkqtmathtext_tools
\section JKQTMathTextFontSpecifier_specialNames Special FOnt Names
This object also implements replacing special font names with actual fonts. Supported special font names are:
@@ -123,7 +123,7 @@ private:
/** \brief used to specify the font encoding used for drawing
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
enum JKQTMathTextFontEncoding {
MTFEwinSymbol, /*!< \brief This assumes that symbols shall be taken from a MS Windows style Symbol font */
@@ -133,12 +133,12 @@ enum JKQTMathTextFontEncoding {
};
/** \brief convert MTfontEncoding to a string
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
JKQTMATHTEXT_LIB_EXPORT QString JKQTMathTextFontEncoding2String(JKQTMathTextFontEncoding e);
/** \brief types of available braces
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
enum JKQTMathTextBraceType {
MTBTParenthesis=0, /*!< \brief parantheses () \image html jkqtmathtext/jkqtmathtext_brace_round.png */
@@ -154,22 +154,22 @@ enum JKQTMathTextBraceType {
MTBTUnknown /*!< \brief an unknown tokenName presented to TokenName2JKQTMathTextBraceType() */
};
/** \brief convert a JKQTMathTextBraceType into a string
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
JKQTMATHTEXT_LIB_EXPORT QString JKQTMathTextBraceType2String(JKQTMathTextBraceType type);
/** \brief convert a string \a tokenName describing a LaTeX Token or Instruction into an opening or closing JKQTMathTextBraceType
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
JKQTMATHTEXT_LIB_EXPORT JKQTMathTextBraceType TokenName2JKQTMathTextBraceType(const QString& tokenName);
/** \brief convert a string \a tokenName describing a LaTeX Instruction into an opening JKQTMathTextBraceType
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*
* This returns a JKQTMathTextBraceType for which isPrintableJKQTMathTextBraceType() is \c true, or MTBTUnknown,
* never MTBTNone or MTBTAny.
*/
JKQTMATHTEXT_LIB_EXPORT JKQTMathTextBraceType InstructionName2OpeningJKQTMathTextBraceType(const QString& tokenName);
/** \brief convert a string \a tokenName describing a LaTeX Instruction into an opening or closing JKQTMathTextBraceType
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*
* This returns a JKQTMathTextBraceType for which isPrintableJKQTMathTextBraceType() is \c true, or MTBTUnknown,
* never MTBTNone or MTBTAny.
@@ -177,11 +177,11 @@ JKQTMATHTEXT_LIB_EXPORT JKQTMathTextBraceType InstructionName2OpeningJKQTMathTex
JKQTMATHTEXT_LIB_EXPORT JKQTMathTextBraceType InstructionName2JKQTMathTextBraceType(const QString& tokenName);
/** \brief return \c true if \a type represents a printable type of brace (including MTBTNone), basically \c true
* for any JKQTMathTextBraceType that can be used as parameter to JKQTMathTextBraceNode
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
JKQTMATHTEXT_LIB_EXPORT bool isPrintableJKQTMathTextBraceType(JKQTMathTextBraceType type);
/** \brief returns true, if the given token/instruction-Name \a token ("{", "(", ..., "lceil", ".", ...) matches the given \a type (returns true, when \a type == MTBTAny )
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*
* This accepts TokenName2JKQTMathTextBraceType(toke)==MTBTNone for any \a type, iff \a acceptMTBTNone \a ==true.
*
@@ -189,7 +189,7 @@ JKQTMATHTEXT_LIB_EXPORT bool isPrintableJKQTMathTextBraceType(JKQTMathTextBraceT
*/
JKQTMATHTEXT_LIB_EXPORT bool TokenNameMatchesJKQTMathTextBraceType(const QString &token, JKQTMathTextBraceType type, bool acceptMTBTNone, bool *tokenEqualsNone=nullptr);
/** \brief returns true, if the given instruction-Name \a token ("|", "{", ..., "lceil", ".", ...) matches the given \a type (returns true, when \a type == MTBTAny )
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*
* This accepts TokenName2JKQTMathTextBraceType(toke)==MTBTNone for any \a type, iff \a acceptMTBTNone \a ==true.
*
@@ -198,7 +198,7 @@ JKQTMATHTEXT_LIB_EXPORT bool TokenNameMatchesJKQTMathTextBraceType(const QString
JKQTMATHTEXT_LIB_EXPORT bool InstructionNameMatchesJKQTMathTextBraceType(const QString &token, JKQTMathTextBraceType type, bool acceptMTBTNone, bool *tokenEqualsNone=nullptr);
/** \brief the available logical fonts (default is MTEroman)
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
enum JKQTMathTextEnvironmentFont {
MTEroman, /*!< \brief roman font, e.g. \\rm{}
*/
@@ -215,9 +215,8 @@ enum JKQTMathTextEnvironmentFont {
};
-
/** \brief describes the current drawing environment (base fontname ...)
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextEnvironment {
JKQTMathTextEnvironment();
@@ -260,7 +259,7 @@ struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextEnvironment {
};
/** \brief beschreibt die Größe eines Knotens
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextNodeSize {
JKQTMathTextNodeSize();
@@ -271,7 +270,7 @@ struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextNodeSize {
};
/** \brief summarizes all information available on a font for a specific MTenvironmentFont
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
* \see fontDefinitions
*/
struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextFontDefinition {
@@ -293,7 +292,7 @@ struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextFontDefinition {
/** \brief create a QPainterPath for drawing horizontal braces
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*
* \image html jkqtmathtext/JKQTMathTextMakeHBracePath.png
*/
@@ -301,7 +300,7 @@ JKQTMATHTEXT_LIB_EXPORT QPainterPath JKQTMathTextMakeHBracePath(double x, double
/** \brief create a QPainterPath for drawing horizontal arrows
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*
* \image html jkqtmathtext/JKQTMathTextMakeArrow.png
*/
@@ -309,7 +308,7 @@ JKQTMATHTEXT_LIB_EXPORT QPainterPath JKQTMathTextMakeArrow(double x, double y, d
/** \brief create a QPainterPath for drawing horizontal double arrows
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*
* \image html jkqtmathtext/JKQTMathTextMakeDArrow.png
*/
@@ -348,11 +347,11 @@ inline uint qHash(const JKQTMathTextTBRDataH& data) {
/** \brief calculates the tight bounding rectangle around \a text, uses internal hashing to not redo a calculation that has already been performed
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
JKQTMATHTEXT_LIB_EXPORT QRectF JKQTMathTextGetTightBoundingRect(const QFont &fm, const QString& text, QPaintDevice *pd);
/** \brief returns a copy of \a f, but with the italic-property set to \c false
- * \ingroup jkqtmathtext
+ * \ingroup jkqtmathtext_tools
*/
JKQTMATHTEXT_LIB_EXPORT QFont JKQTMathTextGetNonItalic(const QFont& f);
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextbracenode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextbracenode.cpp
index 8992983ec7..26198b4e3c 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextbracenode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextbracenode.cpp
@@ -56,7 +56,7 @@ void JKQTMathTextBraceNode::getSizeInternalAndBrace(QPainter &painter, JKQTMathT
{
const JKQTMathTextEnvironment ev=currentEv;
- child->getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
const double cAscentAboveStrike=baselineHeight-strikeoutPos;
const double cDescentBelowStrike=overallHeight-baselineHeight+strikeoutPos;
@@ -180,7 +180,7 @@ double JKQTMathTextBraceNode::draw(QPainter& painter, double x, double y, JKQTMa
painter.setPen(pold);
- xnew= child->draw(painter, xnew, y, currentEv);
+ xnew= getChild()->draw(painter, xnew, y, currentEv);
{
bool showClosingBrace=true;
@@ -283,7 +283,7 @@ bool JKQTMathTextBraceNode::toHtml(QString &html, JKQTMathTextEnvironment curren
html=html+ob;
- bool ok=child->toHtml(html, currentEv, defaultEv);
+ bool ok=getChild()->toHtml(html, currentEv, defaultEv);
html=html+cb;
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextdecoratednode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextdecoratednode.cpp
index ccfb85edda..d822aa31e1 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextdecoratednode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextdecoratednode.cpp
@@ -100,9 +100,9 @@ JKQTMathTextDecoratedNode::~JKQTMathTextDecoratedNode() {
void JKQTMathTextDecoratedNode::getSizeInternal(QPainter& painter, JKQTMathTextEnvironment currentEv, double& width, double& baselineHeight, double& overallHeight, double& strikeoutPos, const JKQTMathTextNodeSize* /*prevNodeSize*/) {
const QFontMetricsF fm(currentEv.getFont(parentMathText), painter.device());
- child->getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
- const double italic_xcorrection=getNonItalicXCorretion(painter, width, currentEv, child);
+ const double italic_xcorrection=getNonItalicXCorretion(painter, width, currentEv, getChild());
const double decoheightfactor=parentMathText->getDecorationHeightFactor();
const double deco_miniwidth=((decoration==MTDtilde||decoration==MTDbreve)?fm.boundingRect("~").width():fm.boundingRect("^").width())-italic_xcorrection;
@@ -123,7 +123,7 @@ double JKQTMathTextDecoratedNode::draw(QPainter& painter, double x, double y, JK
doDrawBoxes(painter, x, y, currentEv);
JKQTMathTextEnvironment ev=currentEv;
double width=0, baselineHeight=0, overallHeight=0, strikeoutPos=0;
- child->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
const QFont font=ev.getFont(parentMathText);
const QFontMetricsF fm(font, painter.device());
const double width_X=fm.boundingRect("X").width();
@@ -135,7 +135,7 @@ double JKQTMathTextDecoratedNode::draw(QPainter& painter, double x, double y, JK
const double strike_ypos=y-baselineHeight/2.0;
const double decobelow_ypos=y+qMax((overallHeight-baselineHeight)*(1.0+decoheightfactor), fm.xHeight()*decoheightfactor);
const double deco_height=decoheightfactor*baselineHeight;
- const double italic_xcorrection=getNonItalicXCorretion(painter, width, ev, child);
+ const double italic_xcorrection=getNonItalicXCorretion(painter, width, ev, getChild());
const double deco_xoffset=parentMathText->getDecorationWidthReductionXFactor()*width_X/2.0;
const double deco_width=std::max(width_x*0.5,width-2.0*deco_xoffset-italic_xcorrection);
const double deco_vecwidth=width_x*0.33;
@@ -154,7 +154,7 @@ double JKQTMathTextDecoratedNode::draw(QPainter& painter, double x, double y, JK
p.setColor(ev.color);
p.setWidthF(qMax(parentMathText->ABS_MIN_LINEWIDTH, fm.lineWidth()));//ceil(currentEv.fontSize/16.0));
- double xnew=child->draw(painter, x, y, ev);
+ double xnew=getChild()->draw(painter, x, y, ev);
if (decoration==MTDvec) {
painter.setPen(p);
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextinstructionnode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextinstructionnode.cpp
index 096b8d2628..a5c8b8da50 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextinstructionnode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextinstructionnode.cpp
@@ -61,7 +61,7 @@ void JKQTMathTextInstruction1Node::getSizeInternal(QPainter& painter, JKQTMathTe
setupMTenvironment(ev);
- child->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
if (name=="colorbox" || name=="fbox" || name=="boxed") {
QFontMetricsF fm(ev.getFont(parentMathText));
double xw=fm.boundingRect("x").width();
@@ -84,7 +84,7 @@ double JKQTMathTextInstruction1Node::draw(QPainter& painter, double x, double y,
if (name=="colorbox") fcol=QColor(parameters.value(0, ev.color.name()));
//qDebug()<<"COLOR="<getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
QPen p=painter.pen();
QFontMetricsF fm(currentEv.getFont(parentMathText));
double xw=fm.boundingRect("x").width();
@@ -94,7 +94,7 @@ double JKQTMathTextInstruction1Node::draw(QPainter& painter, double x, double y,
shiftX=xw/2.0;
}
- double xnew= child->draw(painter, x+shiftX, y, ev);
+ double xnew= getChild()->draw(painter, x+shiftX, y, ev);
painter.setPen(oldPen);
return xnew;
}
@@ -104,7 +104,7 @@ bool JKQTMathTextInstruction1Node::toHtml(QString &html, JKQTMathTextEnvironment
setupMTenvironment(ev);
- return child->toHtml(html, ev, defaultEv);
+ return getChild()->toHtml(html, ev, defaultEv);
}
QString JKQTMathTextInstruction1Node::getName() const {
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.cpp
index fbed241144..aa13744a73 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.cpp
@@ -43,7 +43,7 @@ QSet JKQTMathTextListNode::subsupOperations= (QSet()<<"sum"<<"
<<"liminf"<<"limsup"<<"lim"<<"max"<<"min");
JKQTMathTextListNode::JKQTMathTextListNode(JKQTMathText* _parent):
- JKQTMathTextNode(_parent)
+ JKQTMathTextMultiChildNode(_parent)
{
nodes.clear();
// these operations cause sub/sup script to be typeset over/under the operator, not right besides!
@@ -411,7 +411,7 @@ double JKQTMathTextListNode::draw(QPainter& painter, double x, double y, JKQTMat
return xnew;
}
-void JKQTMathTextListNode::addNode(JKQTMathTextNode *n) {
+void JKQTMathTextListNode::addChild(JKQTMathTextNode *n) {
n->setParentNode(this);
nodes.append(n);
}
@@ -426,27 +426,16 @@ bool JKQTMathTextListNode::toHtml(QString &html, JKQTMathTextEnvironment current
return ok;
}
-void JKQTMathTextListNode::setDrawBoxes(bool draw)
-{
- this->drawBoxes=draw;
- for (int i=0; isetDrawBoxes(draw);
- }
-}
-
-QList JKQTMathTextListNode::getNodes() const {
+QList JKQTMathTextListNode::getChildren() {
return this->nodes;
}
-int JKQTMathTextListNode::count() const
+
+int JKQTMathTextListNode::childCount() const
{
return nodes.size();
}
-int JKQTMathTextListNode::size() const
-{
- return nodes.size();
-}
void JKQTMathTextListNode::clearChildren(bool deleteChildren)
{
@@ -458,27 +447,21 @@ void JKQTMathTextListNode::clearChildren(bool deleteChildren)
nodes.clear();
}
-JKQTMathTextNode *JKQTMathTextListNode::child(int i)
+JKQTMathTextNode *JKQTMathTextListNode::getChild(int i)
{
return nodes[i];
}
-const JKQTMathTextNode *JKQTMathTextListNode::child(int i) const
+const JKQTMathTextNode *JKQTMathTextListNode::getChild(int i) const
{
return nodes[i];
}
-JKQTMathTextNode *JKQTMathTextListNode::simplyfyListNode(JKQTMathTextListNode *nl) {
- return nl;
- if (nl==nullptr) return nl;
- if (nl->count()==1) {
- // if there was only a single node: simplify the syntax tree, by removing the outer list node
- JKQTMathTextNode* ret= nl->child(0);
- nl->clearChildren(false);
- delete nl;
- return ret;
- }
- return nl;
+JKQTMathTextNode *JKQTMathTextListNode::replaceChild(int i, JKQTMathTextNode *newChild)
+{
+ JKQTMathTextNode* c=nodes[i];
+ nodes[i]=newChild;
+ newChild->setParentNode(this);
+ return c;
}
-
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h b/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h
index 57ffb00cc4..7fb1f61c33 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextlistnode.h
@@ -35,7 +35,7 @@ class JKQTMathText; // forward
/** \brief subclass representing a list of nodes in the syntax tree
* \ingroup jkqtmathtext_items
*/
-class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextListNode: public JKQTMathTextNode {
+class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextListNode: public JKQTMathTextMultiChildNode {
public:
explicit JKQTMathTextListNode(JKQTMathText* parent);
virtual ~JKQTMathTextListNode() override;
@@ -43,26 +43,22 @@ class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextListNode: public JKQTMathTextNode {
virtual QString getTypeName() const override;
/** \copydoc JKQTMathTextNode::draw() */
virtual double draw(QPainter& painter, double x, double y, JKQTMathTextEnvironment currentEv, const JKQTMathTextNodeSize* prevNodeSize=nullptr) override;
- /** \brief add a child node */
- void addNode(JKQTMathTextNode* n);
/** \copydoc JKQTMathTextNode::toHtml() */
virtual bool toHtml(QString& html, JKQTMathTextEnvironment currentEv, JKQTMathTextEnvironment defaultEv) override;
- /** \copydoc JKQTMathTextNode::setDrawBoxes() */
- virtual void setDrawBoxes(bool draw) override;
- /** \copydoc nodes */
- QList getNodes() const;
- /** \brief return number of children */
- int count() const;
- /** \brief return number of children */
- int size() const;
- /** \brief clear all children, deleting them if \a deleteChildren==true */
- void clearChildren(bool deleteChildren=true);
- /** \brief return i-th child node */
- JKQTMathTextNode* child(int i);
- /** \brief return i-th child node */
- const JKQTMathTextNode* child(int i) const;
- /** \brief simplifies the given list-node, i.e. if it contains one child only, the child is returned and the list node destroyed, otherwise the list node \a nl is returned */
- static JKQTMathTextNode* simplyfyListNode(JKQTMathTextListNode* nl);
+ /** \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;
protected:
/** \copydoc JKQTMathTextNode::getSizeInternal() */
virtual void getSizeInternal(QPainter& painter, JKQTMathTextEnvironment currentEv, double& width, double& baselineHeight, double& overallHeight, double& strikeoutPos, const JKQTMathTextNodeSize* prevNodeSize=nullptr) override;
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextnode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextnode.cpp
index be3e702e6c..8d5e478f8a 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextnode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextnode.cpp
@@ -149,7 +149,8 @@ JKQTMathTextSingleChildNode::JKQTMathTextSingleChildNode(JKQTMathTextNode *_chil
JKQTMathTextSingleChildNode::~JKQTMathTextSingleChildNode()
{
- if (child) delete child;
+ JKQTMathTextNode* c=child; child=nullptr;
+ if (c) delete c;
}
JKQTMathTextNode *JKQTMathTextSingleChildNode::getChild()
@@ -162,6 +163,28 @@ const JKQTMathTextNode *JKQTMathTextSingleChildNode::getChild() const
return child;
}
+JKQTMathTextNode *JKQTMathTextSingleChildNode::replaceChild(JKQTMathTextNode *newChild)
+{
+ JKQTMathTextNode* c=child;
+ child=newChild;
+ child->setParentNode(this);
+ return c;
+}
+
+void JKQTMathTextSingleChildNode::replaceAndDeleteChild(JKQTMathTextNode *newChild)
+{
+ JKQTMathTextNode* oldC=replaceChild(newChild);
+ if (newChild!=oldC) {
+ oldC->setParentNode(nullptr);
+ delete oldC;
+ }
+}
+
+bool JKQTMathTextSingleChildNode::hasChild() const
+{
+ return child!=nullptr;
+}
+
void JKQTMathTextSingleChildNode::setDrawBoxes(bool draw)
{
JKQTMathTextNode::setDrawBoxes(draw);
@@ -170,7 +193,7 @@ void JKQTMathTextSingleChildNode::setDrawBoxes(bool draw)
JKQTMathTextDualChildNode::JKQTMathTextDualChildNode(JKQTMathTextNode *_child1, JKQTMathTextNode *_child2, JKQTMathText *parentMathText):
- JKQTMathTextNode(parentMathText),
+ JKQTMathTextMultiChildNode(parentMathText),
child1(_child1),
child2(_child2)
{
@@ -180,8 +203,10 @@ JKQTMathTextDualChildNode::JKQTMathTextDualChildNode(JKQTMathTextNode *_child1,
JKQTMathTextDualChildNode::~JKQTMathTextDualChildNode()
{
- if (child1) delete child1;
- if (child2) delete child2;
+ JKQTMathTextNode* c1=child1; child1=nullptr;
+ JKQTMathTextNode* c2=child2; child2=nullptr;
+ if (c1) delete c1;
+ if (c2) delete c2;
}
JKQTMathTextNode *JKQTMathTextDualChildNode::getChild1()
@@ -204,9 +229,94 @@ const JKQTMathTextNode *JKQTMathTextDualChildNode::getChild2() const
return child2;
}
-void JKQTMathTextDualChildNode::setDrawBoxes(bool draw)
+JKQTMathTextNode *JKQTMathTextDualChildNode::getChild(int i)
+{
+ if (i==0) return child1;
+ if (i==1) return child2;
+ return nullptr;
+}
+
+
+const JKQTMathTextNode *JKQTMathTextDualChildNode::getChild(int i) const
+{
+ if (i==0) return child1;
+ if (i==1) return child2;
+ return nullptr;
+}
+
+JKQTMathTextNode *JKQTMathTextDualChildNode::replaceChild(int i, JKQTMathTextNode *newChild)
+{
+ if (i==0) {
+ JKQTMathTextNode* c=child1;
+ child1=newChild;
+ child1->setParentNode(this);
+ return c;
+ }
+ if (i==1) {
+ JKQTMathTextNode* c=child2;
+ child2=newChild;
+ child2->setParentNode(this);
+ return c;
+ }
+ return nullptr;
+}
+
+int JKQTMathTextDualChildNode::childCount() const
+{
+ return 2;
+}
+
+void JKQTMathTextDualChildNode::clearChildren(bool deleteChildren)
+{
+ JKQTMathTextNode* c1=child1; child1=nullptr;
+ if (c1) delete c1;
+ JKQTMathTextNode* c2=child2; child2=nullptr;
+ if (c2) delete c2;
+}
+
+JKQTMathTextMultiChildNode::JKQTMathTextMultiChildNode(JKQTMathText *parentMathText):
+ JKQTMathTextNode(parentMathText)
+{
+
+}
+
+JKQTMathTextMultiChildNode::~JKQTMathTextMultiChildNode()
+{
+}
+
+QList JKQTMathTextMultiChildNode::getChildren()
+{
+ QList l;
+ for (int i=0; i JKQTMathTextMultiChildNode::getChildren() const
+{
+ QList l;
+ for (int i=0; isetParentNode(nullptr);
+ delete oldC;
+ }
+}
+
+void JKQTMathTextMultiChildNode::setDrawBoxes(bool draw)
{
JKQTMathTextNode::setDrawBoxes(draw);
- if (child1) child1->setDrawBoxes(draw);
- if (child2) child2->setDrawBoxes(draw);
+ for (int i=0; isetDrawBoxes(draw);
+ }
+
}
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextnode.h b/lib/jkqtmathtext/nodes/jkqtmathtextnode.h
index 9dddf600d0..28662f8e91 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextnode.h
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextnode.h
@@ -156,6 +156,15 @@ class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextSingleChildNode: public JKQTMathTextNo
JKQTMathTextNode* getChild();
/** \copydoc child */
const JKQTMathTextNode* getChild() const;
+ /** \brief replaces the child node with the node \a newChild , returns the replaced old node */
+ JKQTMathTextNode* replaceChild(JKQTMathTextNode* newChild);
+
+ /** \brief replaces the child node with the node \a newChild , deletes the replaced old node */
+ void replaceAndDeleteChild(JKQTMathTextNode* newChild);
+
+ /** \brief returns \c true if the child is valie (\c !=nullptr ) */
+ bool hasChild() const;
+
/** \copydoc JKQTMathTextNode::setDrawBoxes() */
virtual void setDrawBoxes(bool draw) override;
protected:
@@ -166,7 +175,41 @@ class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextSingleChildNode: public JKQTMathTextNo
/** \brief subclass representing a node in the syntax tree, that has two children
* \ingroup jkqtmathtext_items
*/
-class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextDualChildNode: public JKQTMathTextNode {
+class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextMultiChildNode: public JKQTMathTextNode {
+ public:
+ explicit JKQTMathTextMultiChildNode(JKQTMathText* parentMathText);
+ virtual ~JKQTMathTextMultiChildNode() override;
+
+ /** \brief returns a list of all child node */
+ virtual QList getChildren();
+ /** \brief returns a list of all child node */
+ virtual QList getChildren() const;
+ /** \brief returns the i-th child node */
+ virtual JKQTMathTextNode* getChild(int i)=0;
+ /** \brief returns the i-th child node */
+ virtual const JKQTMathTextNode* getChild(int i) const=0;
+
+ /** \brief replaces the i-th child node with the node \a newChild , returns the replaced old node */
+ virtual JKQTMathTextNode* replaceChild(int i, JKQTMathTextNode* newChild) =0;
+
+ /** \brief replaces the i-th child node with the node \a newChild , deletes the replaced old node */
+ virtual void replaceAndDeleteChild(int i, JKQTMathTextNode* newChild);
+
+ /** \brief returns the number of child nodes */
+ virtual int childCount() const =0;
+
+ /** \brief clear all children, deleting them if \a deleteChildren==true */
+ virtual void clearChildren(bool deleteChildren=true) =0;
+
+ /** \copydoc JKQTMathTextNode::setDrawBoxes() */
+ virtual void setDrawBoxes(bool draw) override;
+ protected:
+};
+
+/** \brief subclass representing a node in the syntax tree, that has two children
+ * \ingroup jkqtmathtext_items
+ */
+class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextDualChildNode: public JKQTMathTextMultiChildNode {
public:
explicit JKQTMathTextDualChildNode(JKQTMathTextNode* _child1, JKQTMathTextNode* _child2, JKQTMathText* parentMathText);
virtual ~JKQTMathTextDualChildNode() override;
@@ -179,8 +222,19 @@ class JKQTMATHTEXT_LIB_EXPORT JKQTMathTextDualChildNode: public JKQTMathTextNode
JKQTMathTextNode* getChild2();
/** \copydoc child2 */
const JKQTMathTextNode* getChild2() const;
- /** \copydoc JKQTMathTextNode::setDrawBoxes() */
- virtual void setDrawBoxes(bool draw) 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 JKQTMathTextMultiChildNode::getChild() */
+ virtual int childCount() const override;
+ /** \copydoc JKQTMathTextMultiChildNode::getChild() */
+ virtual void clearChildren(bool deleteChildren=true) override;
+
protected:
/** \brief first child node of this node */
JKQTMathTextNode* child1;
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.cpp
new file mode 100644
index 0000000000..3aa71e4689
--- /dev/null
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.cpp
@@ -0,0 +1,67 @@
+/*
+ Copyright (c) 2008-2022 Jan W. Krieger ()
+
+
+
+ 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 .
+*/
+
+
+
+#include "jkqtmathtext/nodes/jkqtmathtextnodetools.h"
+#include "jkqtmathtext/nodes/jkqtmathtextlistnode.h"
+#include "jkqtmathtext/jkqtmathtexttools.h"
+#include "jkqtmathtext/jkqtmathtext.h"
+#include
+
+JKQTMathTextNode *simplifyJKQTMathTextNode(JKQTMathTextNode *node)
+{
+ JKQTMathTextListNode* nl=dynamic_cast(node);
+ JKQTMathTextMultiChildNode* nmc=dynamic_cast(node);
+ JKQTMathTextSingleChildNode* nsc=dynamic_cast(node);
+ if (nl) {
+ if (nl->childCount()==1) {
+ // if there was only a single node: simplify the syntax tree, by removing the outer list node
+ JKQTMathTextNode* ret= simplifyJKQTMathTextNode(nl->getChild(0));
+ nl->clearChildren(false);
+ ret->setParentNode(nullptr);
+ delete nl;
+ return ret;
+ } else if (nl->childCount()>1) {
+ // if there are several child nodes, apply this method recursively
+ for (int i=0; ichildCount(); i++) {
+ JKQTMathTextNode* c=nl->getChild(i);
+ JKQTMathTextNode* newc= simplifyJKQTMathTextNode(c);
+ if (c!=newc) nl->replaceAndDeleteChild(i, newc);
+ }
+ return nl;
+ }
+ return nl;
+ } else if (nmc) {
+ // apply this method recursively to any children
+ for (int i=0; ichildCount(); i++) {
+ JKQTMathTextNode* c=nmc->getChild(i);
+ JKQTMathTextNode* newc= simplifyJKQTMathTextNode(c);
+ if (c!=newc) nmc->replaceAndDeleteChild(i, newc);
+ }
+ return nmc;
+ } else if (nsc) {
+ // apply this method recursively to the child
+ JKQTMathTextNode* c=nsc->getChild();
+ JKQTMathTextNode* newc= simplifyJKQTMathTextNode(c);
+ if (c!=newc) nsc->replaceAndDeleteChild(newc);
+ return nsc;
+ }
+ return node;
+}
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.h b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.h
new file mode 100644
index 0000000000..981e5273c4
--- /dev/null
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextnodetools.h
@@ -0,0 +1,49 @@
+/*
+ Copyright (c) 2008-2022 Jan W. Krieger ()
+ 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 .
+*/
+
+
+
+
+#ifndef JKQTMATHTEXTNODETOOLS_H
+#define JKQTMATHTEXTNODETOOLS_H
+#include "jkqtmathtext/jkqtmathtext_imexport.h"
+
+class JKQTMathTextNode; // forward
+
+
+/** \brief simplifies the node \a node and the tree below it. You can put the return value in place of \a node after the call
+ * \ingroup jkqtmathtext_items
+ *
+ * Basically this takes does the following steps (recursively):
+ * - remove any JKQTMathTextListNode that has only one child
+ * .
+ */
+JKQTMATHTEXT_LIB_EXPORT JKQTMathTextNode* simplifyJKQTMathTextNode(JKQTMathTextNode* node);
+
+#endif // JKQTMATHTEXTNODETOOLS_H
+
+
+
+
+
+
+
+
+
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextsqrtnode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextsqrtnode.cpp
index 201f280414..0f00a79bfc 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextsqrtnode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextsqrtnode.cpp
@@ -47,7 +47,7 @@ JKQTMathTextSqrtNode::~JKQTMathTextSqrtNode() {
void JKQTMathTextSqrtNode::getSizeInternal(QPainter& painter, JKQTMathTextEnvironment currentEv, double& width, double& baselineHeight, double& overallHeight, double& strikeoutPos, const JKQTMathTextNodeSize* /*prevNodeSize*/) {
QFontMetricsF fm(currentEv.getFont(parentMathText), painter.device());
- child->getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos);
overallHeight=overallHeight*1.2;//+fm.ascent()*0.1;
baselineHeight=baselineHeight*1.2;//+fm.ascent()*0.1;
@@ -57,7 +57,7 @@ void JKQTMathTextSqrtNode::getSizeInternal(QPainter& painter, JKQTMathTextEnviro
double JKQTMathTextSqrtNode::draw(QPainter& painter, double x, double y, JKQTMathTextEnvironment currentEv, const JKQTMathTextNodeSize* /*prevNodeSize*/) {
doDrawBoxes(painter, x, y, currentEv);
double width=0, baselineHeight=0, overallHeight=0, sp=0;
- child->getSize(painter, currentEv, width, baselineHeight, overallHeight, sp);
+ getChild()->getSize(painter, currentEv, width, baselineHeight, overallHeight, sp);
QFont f=currentEv.getFont(parentMathText);
QFont fsmall=f;
QFontMetricsF fm(f, painter.device());
@@ -83,7 +83,7 @@ double JKQTMathTextSqrtNode::draw(QPainter& painter, double x, double y, JKQTMat
painter.drawText(QPointF(x+0.33*w, y-0.55*a), QLocale::c().toString(degree));
}
//painter.restore();
- double xnew=child->draw(painter, x+1.2*w, y, currentEv);
+ double xnew=getChild()->draw(painter, x+1.2*w, y, currentEv);
painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();});
painter.setPen(p);
if (w>0) {
@@ -97,7 +97,7 @@ double JKQTMathTextSqrtNode::draw(QPainter& painter, double x, double y, JKQTMat
bool JKQTMathTextSqrtNode::toHtml(QString &html, JKQTMathTextEnvironment currentEv, JKQTMathTextEnvironment defaultEv) {
html=html+"√";
- bool ok=child->toHtml(html, currentEv, defaultEv);
+ bool ok=getChild()->toHtml(html, currentEv, defaultEv);
html=html+" ";
return ok;
}
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextsubsupernode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextsubsupernode.cpp
index b01505ea40..0a55b1e914 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextsubsupernode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextsubsupernode.cpp
@@ -51,7 +51,7 @@ void JKQTMathTextSuperscriptNode::getSizeInternal(QPainter& painter, JKQTMathTex
const QFontMetricsF fm(currentEv.getFont(parentMathText), painter.device());
const QRectF tbr=JKQTMathTextGetTightBoundingRect(currentEv.getFont(parentMathText), "M", painter.device());
double cstrikeoutPos=0;
- child->getSize(painter, ev, width, baselineHeight, overallHeight, cstrikeoutPos);
+ getChild()->getSize(painter, ev, width, baselineHeight, overallHeight, cstrikeoutPos);
double shift=parentMathText->getSuperShiftFactor()*tbr.height();
if (prevNodeSize!=nullptr && prevNodeSize->baselineHeight>tbr.height()) {
@@ -70,7 +70,7 @@ double JKQTMathTextSuperscriptNode::draw(QPainter& painter, double x, double y,
ev.fontSize=ev.fontSize*parentMathText->getSubsuperSizeFactor();
double cWidth, cBaselineHeight, cOverallHeight, cStrikeoutPos;
- child->getSize(painter, ev, cWidth, cBaselineHeight, cOverallHeight, cStrikeoutPos);
+ getChild()->getSize(painter, ev, cWidth, cBaselineHeight, cOverallHeight, cStrikeoutPos);
QFontMetricsF fm(currentEv.getFont(parentMathText), painter.device());
QRectF tbr=JKQTMathTextGetTightBoundingRect(currentEv.getFont(parentMathText), "M", painter.device());
@@ -84,7 +84,7 @@ double JKQTMathTextSuperscriptNode::draw(QPainter& painter, double x, double y,
double xx=x;
if (currentEv.italic && prevNodeSize==nullptr) xx=xx+double(fm.boundingRect(' ').width())*parentMathText->getItalicCorrectionFactor();
- return child->draw(painter, xx, y-yshift, ev);//+0.5*fm.boundingRect("A").width();
+ return getChild()->draw(painter, xx, y-yshift, ev);//+0.5*fm.boundingRect("A").width();
}
@@ -97,7 +97,7 @@ QString JKQTMathTextSuperscriptNode::getTypeName() const
bool JKQTMathTextSuperscriptNode::toHtml(QString &html, JKQTMathTextEnvironment currentEv, JKQTMathTextEnvironment defaultEv)
{
html=html+"";
- bool ok=child->toHtml(html, currentEv, defaultEv);
+ bool ok=getChild()->toHtml(html, currentEv, defaultEv);
html=html+"";
return ok;
}
@@ -121,7 +121,7 @@ void JKQTMathTextSubscriptNode::getSizeInternal(QPainter& painter, JKQTMathTextE
JKQTMathTextEnvironment ev=currentEv;
ev.fontSize=ev.fontSize*parentMathText->getSubsuperSizeFactor();
- child->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
QFontMetricsF fm(ev.getFont(parentMathText), painter.device());
QRectF tbr=JKQTMathTextGetTightBoundingRect(currentEv.getFont(parentMathText), "M", painter.device());
@@ -145,7 +145,7 @@ double JKQTMathTextSubscriptNode::draw(QPainter& painter, double x, double y, JK
QRectF tbr=JKQTMathTextGetTightBoundingRect(currentEv.getFont(parentMathText), "M", painter.device());
double width=0, baselineHeight=0, overallHeight=0, strikeoutPos=0;
- child->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
+ getChild()->getSize(painter, ev, width, baselineHeight, overallHeight, strikeoutPos);
double shift=parentMathText->getSubShiftFactor()*tbr.height();
if (prevNodeSize!=nullptr && prevNodeSize->overallHeight-prevNodeSize->baselineHeight>shift) {
@@ -159,7 +159,7 @@ double JKQTMathTextSubscriptNode::draw(QPainter& painter, double x, double y, JK
//qDebug()<<"shift="<draw(painter, xx, y+yshift, ev);//+0.5*fm.boundingRect("A").width();
}
QString JKQTMathTextSubscriptNode::getTypeName() const
@@ -169,7 +169,7 @@ QString JKQTMathTextSubscriptNode::getTypeName() const
bool JKQTMathTextSubscriptNode::toHtml(QString &html, JKQTMathTextEnvironment currentEv, JKQTMathTextEnvironment defaultEv) {
html=html+"";
- bool ok=child->toHtml(html, currentEv, defaultEv);
+ bool ok=getChild()->toHtml(html, currentEv, defaultEv);
html=html+"";
return ok;
}
diff --git a/lib/jkqtmathtext/nodes/jkqtmathtextsymbolnode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtextsymbolnode.cpp
index bc4c1d22a5..6d2add60ce 100644
--- a/lib/jkqtmathtext/nodes/jkqtmathtextsymbolnode.cpp
+++ b/lib/jkqtmathtext/nodes/jkqtmathtextsymbolnode.cpp
@@ -947,13 +947,13 @@ double JKQTMathTextSymbolNode::draw(QPainter& painter, double x, double y, JKQTM
if (props.italic>0) f.setItalic(true);
if (props.bold<0) f.setBold(false);
if (props.bold>0) f.setBold(true);
- QFontMetricsF fm(f, painter.device());
- QFontMetricsF fm1(f1, painter.device());
+ const QFontMetricsF fm(f, painter.device());
+ const QFontMetricsF fm1(f1, painter.device());
painter.setFont(f);
double shift=0;
if (props.extendWidthInMathmode && currentEv.insideMath) {
- double origwidth=width/parentMathText->getMathoperatorWidthFactor();
+ const double origwidth=width/parentMathText->getMathoperatorWidthFactor();
shift=0.5*(width-origwidth);
//width=width*parent->getMathoperatorWidthFactor();
}
@@ -965,15 +965,17 @@ double JKQTMathTextSymbolNode::draw(QPainter& painter, double x, double y, JKQTM
p.setWidthF(fm.lineWidth());
p.setStyle(Qt::SolidLine);
painter.setPen(p);
- double xwi=fm.boundingRect("x").width();
+ const double xwi=fm.boundingRect("x").width();
if (!props.symbol.isEmpty()) {
// if the symbol has been recognized in the constructor: draw the symbol
painter.drawText(QPointF(x+shift, y+props.yfactor*overallHeight), props.symbol);
- double xx=x+shift;
- double yy=y-fm.xHeight()-(JKQTMathTextGetTightBoundingRect(f, "M", painter.device()).height()-fm.xHeight())/3.0;
- QLineF l(xx, yy, xx+xwi/3.0+((currentEv.italic)?(xwi/3.0):0), yy);
- if (props.drawBar&&l.length()>0) painter.drawLine(l);
+ if (props.drawBar) {
+ const double xx=x+shift;
+ const double yy=y-fm.xHeight()-(JKQTMathTextGetTightBoundingRect(f, "M", painter.device()).height()-fm.xHeight())/3.0;
+ const QLineF l(xx, yy, xx+xwi/3.0+((currentEv.italic)?(xwi/3.0):0), yy);
+ if (l.length()>0) painter.drawLine(l);
+ }
// try to draw some often used special symbols, by synthesizing them from
// standard characters in the current drawing font
} else if (symbolName=="infty") {