kformula/flake
FormulaRenderer.cppGo to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "FormulaRenderer.h"
00021 #include "AttributeManager.h"
00022 #include "BasicElement.h"
00023 #include <kdebug.h>
00024
00025 FormulaRenderer::FormulaRenderer()
00026 {
00027 m_dirtyElement = 0;
00028 m_attributeManager = new AttributeManager();
00029 }
00030
00031 FormulaRenderer::~FormulaRenderer()
00032 {
00033 delete m_attributeManager;
00034 }
00035
00036 void FormulaRenderer::paintElement( QPainter& p, BasicElement* element, bool hints )
00037 {
00038 p.save();
00039 p.setRenderHint( QPainter::Antialiasing );
00040 p.translate( element->origin() );
00041 if (!hints) {
00042 element->paint( p, m_attributeManager );
00043 } else {
00044 element->paintEditingHints( p, m_attributeManager );
00045 }
00046
00047
00048 if( !element->childElements().isEmpty() && element->elementType() != Phantom ) {
00049 foreach( BasicElement* tmpElement, element->childElements() ) {
00050 paintElement( p, tmpElement, hints );
00051 }
00052 }
00053
00054 p.restore();
00055 }
00056
00057
00058 void FormulaRenderer::layoutElement( BasicElement* element )
00059 {
00060 int i = 0;
00061 element->setDisplayStyle( m_attributeManager->boolOf("displaystyle", element));
00062 foreach( BasicElement* tmp, element->childElements() ) {
00063 int scale = m_attributeManager->scriptLevel( element, i++ );
00064 tmp->setScaleLevel( scale );
00065 layoutElement( tmp );
00066 }
00067 element->layout( m_attributeManager );
00068 element->stretch();
00069 }
00070
00071 void FormulaRenderer::update( QPainter& p, BasicElement* element )
00072 {
00073 updateElementLayout( element );
00074 paintElement( p, m_dirtyElement );
00075 }
00076
00077 void FormulaRenderer::updateElementLayout( BasicElement* element )
00078 {
00079 QRectF tmpBoundingRect;
00080 bool parentLayoutAffected = true;
00081 BasicElement* tmpElement = element;
00082 while( parentLayoutAffected )
00083 {
00084 tmpBoundingRect = tmpElement->boundingRect();
00085 tmpElement->layout( m_attributeManager );
00086
00087
00088 if( tmpBoundingRect == tmpElement->boundingRect() )
00089 {
00090 parentLayoutAffected = false;
00091 m_dirtyElement = tmpElement;
00092 }
00093 else
00094 tmpElement = tmpElement->parentElement();
00095 }
00096 }
00097
00098 double FormulaRenderer::elementScaleFactor( BasicElement* element ) const
00099 {
00100 Q_UNUSED(element)
00101 AttributeManager am;
00102 return -1;
00103 }
|