#include "kivio_py_stencil.h" #include "kivio_view.h" KivioPage *page; KivioView *view; #ifdef HAVE_PYTHON #include "kivioglobal.h" #include "kivio_common.h" #include "kivio_connector_point.h" #include "kivio_connector_target.h" #include "kivio_fill_style.h" #include "kivio_intra_stencil_data.h" #include "kivio_line_style.h" #include "kivio_painter.h" #include "kivio_point.h" #include "kivio_screen_painter.h" #include "kivio_stencil_spawner.h" #include "kivio_stencil_spawner_info.h" #include "kivio_stencil_spawner_set.h" #include "kivio_py_stencil_spawner.h" #include "kivio_page.h" #include #include #include #include #include #include #include "py_kivio.h" extern "C" { void initkivioc(void); } KivioPyStencil::KivioPyStencil() : KivioStencil() { m_pConnectorTargets = new TQPtrList; m_pConnectorTargets->setAutoDelete(true); static bool first_time = true; if ( first_time ) { Py_Initialize(); // initialize python only once //kdDebug(43000) << "init kivioc" << endl; initkivioc(); first_time = false; } PyObject* mainmod = PyImport_AddModule("__main__"); globals = PyModule_GetDict(mainmod); m_x = old_x = 0.0; m_y = old_y = 0.0; m_w = old_w = 72.0; m_h = old_h = 72.0; double x2 = m_x+m_w; double y2 = m_y+m_h; vars = Py_BuildValue( "{s:d,s:d,s:d,s:d,s:d,s:d,s:{},s:[],s:[],s:{}}", "x", m_x, "y", m_y, "w", m_w, "h", m_h, "x2", x2, "y2", y2 , "style","connectors","connector_targets","shapes"); resizeCode = ""; } KivioPyStencil::~KivioPyStencil() { } int KivioPyStencil::init( TQString initCode ) { runPython(kivio_module); if ( !runPython( initCode ) ) return 1; m_w = getDoubleFromDict( vars, "w"); m_h = getDoubleFromDict( vars, "h"); m_x = getDoubleFromDict( vars, "x"); m_y = getDoubleFromDict( vars, "y"); old_x = m_x; old_y = m_y; old_w = m_w; old_h = m_h; return 1; } bool KivioPyStencil::loadXML( const TQDomElement &e ) { TQDomNode node; TQDomElement ele; node = e.firstChild(); while( !node.isNull() ) { TQString nodeName = node.nodeName(); ele = node.toElement(); if( nodeName == "PyData" ) { resizeCode = XmlReadString( ele, "resizeCode", "" ); TQString sVars = XmlReadString( ele, "vars", "" ); PyObject* mainmod = PyImport_AddModule("__main__"); PyObject* gdic = PyModule_GetDict(mainmod); PyObject *ldic = Py_BuildValue("{s:s,s:{}}", "ldic", sVars.latin1() ,"res"); if ( !PyRun_String("import pickle\nres = pickle.loads(ldic)", Py_file_input, gdic, ldic) ) { PyErr_Print(); return false; } vars = PyDict_GetItemString( ldic, "res" ); Py_INCREF(vars); runPython(kivio_module); m_w = getDoubleFromDict( vars, "w"); m_h = getDoubleFromDict( vars, "h"); m_x = getDoubleFromDict( vars, "x"); m_y = getDoubleFromDict( vars, "y"); old_x = m_x; old_y = m_y; old_w = m_w; old_h = m_h; } else if( nodeName == "KivioConnectorTargetList" ) { loadConnectorTargetListXML( ele ); } node = node.nextSibling(); } return true; } /** * Help function for loading from an XML node. */ void KivioPyStencil::loadConnectorTargetListXML( const TQDomElement &e ) { TQDomNode node; TQDomElement ele; TQString nodeName; KivioConnectorTarget *pTarget; pTarget = m_pConnectorTargets->first(); node = e.firstChild(); while( !node.isNull() && pTarget) { nodeName = node.nodeName(); ele = node.toElement(); if( nodeName == "KivioConnectorTarget" ) { pTarget->loadXML( ele ); } pTarget = m_pConnectorTargets->next(); node = node.nextSibling(); } } TQDomElement KivioPyStencil::saveXML( TQDomDocument &doc ) { TQDomElement e = doc.createElement("KivioPyStencil"); XmlWriteString( e, "id", m_pSpawner->info()->id() ); XmlWriteString( e, "setId", m_pSpawner->set()->id() ); TQDomElement dE = doc.createElement("PyData"); // The python variables PyObject* mainmod = PyImport_AddModule("__main__"); PyObject* gdic = PyModule_GetDict(mainmod); PyObject *ldic = Py_BuildValue("{s:O,s:{}}", "ldic", vars ,"res"); const char *dump_code = "import copy\n"\ "import pickle\n"\ "cres = {}\n"\ "for key in ldic.keys():\n"\ " try:\n"\ " cres[key] = copy.deepcopy(ldic[key])\n"\ " except:\n"\ " ii=0\n"\ "res = pickle.dumps(cres)\n"; if ( !PyRun_String(dump_code, Py_file_input, gdic, ldic) ) PyErr_Print(); TQString sVars = PyBytes_AS_STRING( PyDict_GetItemString( ldic, "res") ); XmlWriteString( dE, "vars", sVars ); XmlWriteString( dE, "resizeCode", resizeCode ); e.appendChild( dE ); // Save the target list TQDomElement clE = doc.createElement("KivioConnectorTargetList"); TQDomElement targetE; KivioConnectorTarget *pTarget = m_pConnectorTargets->first(); while( pTarget ) { targetE = pTarget->saveXML( doc ); clE.appendChild( targetE ); pTarget = m_pConnectorTargets->next(); } e.appendChild( clE ); return e; } void KivioPyStencil::updateGeometry() { //rescale items : rescaleShapes(vars); old_x = m_x; old_y = m_y; old_w = m_w; old_h = m_h; if ( !resizeCode.isEmpty() ) runPython(resizeCode); // stuff from KivioSMLStensil KivioConnectorTarget *pTarget, *pOriginal; TQPtrList *pOriginalTargets = ((KivioPyStencilSpawner*)m_pSpawner)->targets(); pTarget = m_pConnectorTargets->first(); pOriginal = pOriginalTargets->first(); PyObject *targets = PyDict_GetItemString(vars,"connector_targets"); int size = PyList_Size( targets ); int i=0; while( pTarget && pOriginal && isetPosition( x, y ); pOriginal->setPosition( x, y ); pTarget = m_pConnectorTargets->next(); pOriginal = pOriginalTargets->next(); i++; } } void KivioPyStencil::rescaleShapes( PyObject *o ) { if ( PyDict_Check(o) ) { PyObject *o_x = PyDict_GetItemString(o,"x"); if ( o_x ) { double x = getDoubleFromDict(o,"x"); x = m_x+(x-old_x)*m_w/old_w; PyDict_SetItemString( o, "x", Py_BuildValue( "d", x ) ); } PyObject *o_y = PyDict_GetItemString(o,"y"); if ( o_y ) { double y = getDoubleFromDict(o,"y"); y = m_y+(y-old_y)*m_h/old_h; PyDict_SetItemString( o, "y", Py_BuildValue( "d", y ) ); } PyObject *o_x2 = PyDict_GetItemString(o,"x2"); if ( o_x2 ) { double x = getDoubleFromDict(o,"x2"); x = m_x+(x-old_x)*m_w/old_w; PyDict_SetItemString( o, "x2", Py_BuildValue( "d", x ) ); } //PyObject *o_y2 = PyDict_GetItemString(o,"y2"); if ( o_y ) { double y = getDoubleFromDict(o,"y2"); y = m_y+(y-old_y)*m_h/old_h; PyDict_SetItemString( o, "y2", Py_BuildValue( "d", y ) ); } PyObject *o_w = PyDict_GetItemString(o,"w"); if ( o_w ) { double w = getDoubleFromDict(o,"w"); w = w*m_w/old_w; PyDict_SetItemString( o, "w", Py_BuildValue( "d", w ) ); } PyObject *o_h = PyDict_GetItemString(o,"h"); if ( o_h ) { double h = getDoubleFromDict(o,"h"); h = h*m_h/old_h; PyDict_SetItemString( o, "h", Py_BuildValue( "d", h ) ); } PyObject *childs = PyDict_Values( o ); int size = PyList_Size( childs ); for ( int i=0; im_x = m_x; pNewStencil->m_y = m_y; pNewStencil->m_w = m_w; pNewStencil->m_h = m_h; pNewStencil->old_x = old_x; pNewStencil->old_y = old_y; pNewStencil->old_w = old_w; pNewStencil->old_h = old_h; pNewStencil->m_pSpawner = m_pSpawner; pNewStencil->resizeCode = resizeCode; //make deep copy of vars: PyObject* mainmod = PyImport_AddModule("__main__"); PyObject* gdic = PyModule_GetDict(mainmod); PyObject *ldic = Py_BuildValue("{s:O,s:{}}", "ldic", vars ,"res"); const char *copy_code = "import copy\n"\ "for key in ldic.keys():\n"\ " try:\n"\ " res[key] = copy.deepcopy(ldic[key])\n"\ " except:\n"\ " i=0\n"; if ( !PyRun_String(copy_code, Py_file_input, gdic, ldic) ) PyErr_Print(); pNewStencil->vars = PyDict_GetItemString( ldic, "res"); pNewStencil->runPython(kivio_module); // Copy the Connector Targets KivioConnectorTarget *pTarget = m_pConnectorTargets->first(); while( pTarget ) { pNewStencil->m_pConnectorTargets->append( pTarget->duplicate() ); pTarget = m_pConnectorTargets->next(); } *(pNewStencil->protection()) = *m_pProtection; *(pNewStencil->canProtect()) = *m_pCanProtect; pReturn = pNewStencil; return pReturn; } void KivioPyStencil::paint( KivioIntraStencilData *d ) { paint(d,false); } void KivioPyStencil::paintOutline( KivioIntraStencilData *d ) { paint(d,true); } void KivioPyStencil::paint( KivioIntraStencilData *d, bool outlined ) { KoZoomHandler* zoomHandler = d->zoomHandler; PyObject *shapes = PyDict_Values( PyDict_GetItemString( vars, "shapes" ) ); if ( !shapes ) { return; } int size = PyList_Size( shapes ); for ( int i=0; izoomItX(getDoubleFromDict(shape,"x")); double y = zoomHandler->zoomItY(getDoubleFromDict(shape,"y")); double w = zoomHandler->zoomItX(getDoubleFromDict(shape,"w")); double h = zoomHandler->zoomItY(getDoubleFromDict(shape,"h")); //double x2 = zoomHandler->zoomItX(getDoubleFromDict(shape,"x2")); //double y2 = zoomHandler->zoomItY(getDoubleFromDict(shape,"y2")); // get points list TQPtrList points; points.setAutoDelete(true); PyObject *pyPoints = PyDict_GetItemString( shape, "points" ); if ( pyPoints && PyList_Check(pyPoints) ) { int size = PyList_Size(pyPoints); for ( int i=0; izoomItX(getDoubleFromDict(pyPoint,"x")); double y = zoomHandler->zoomItY(getDoubleFromDict(pyPoint,"y")); points.append( new KivioPoint( x, y, KivioPoint::kptNormal ) ); } } if ( stype == "rectangle" ) { if (fill) d->painter->fillRect( x, y, w, h ); else d->painter->drawRect( x, y, w, h ); } if ( stype == "textbox" ) { int tf = vTextAlign() | hTextAlign(); TQFont f = textFont(); f.setPointSizeFloat(f.pointSizeFloat() * (((float)zoomHandler->zoom()) / 100.0)); d->painter->setFont( f ); TQString text = getStringFromDict(shape,"text"); if ( !text.isEmpty() ) { d->painter->drawText( int( x ), int( y ), int( w ), int( h ), tf | TQt::WordBreak, text ); } } if ( stype == "arc" ) { double a1 = getDoubleFromDict(shape,"a1"); double a2 = getDoubleFromDict(shape,"a2"); d->painter->drawArc(x,y,w,h,a1,a2); } if ( stype == "roundrect" ) { double rx = zoomHandler->zoomItX(getDoubleFromDict(shape,"rx")); double ry = zoomHandler->zoomItY(getDoubleFromDict(shape,"ry")); if (fill) { d->painter->fillRoundRect( x, y, w, h, rx, ry ); } else { d->painter->drawRoundRect( x, y, w, h, rx, ry ); } } if ( stype == "linearray" ) { d->painter->drawLineArray(&points); } if ( stype == "ellipse" ) { if (fill) { d->painter->fillEllipse( x, y, w, h ); } else { d->painter->drawEllipse( x, y, w, h ); } } if(stype == "polygon") { d->painter->drawPolygon(&points); } if(stype == "polyline") { d->painter->drawPolyline(&points); } } KivioConnectorTarget *pTarget = m_pConnectorTargets->first(); while( pTarget ) { pTarget->paintOutline( d ); pTarget = m_pConnectorTargets->next(); } } int KivioPyStencil::runPython(TQString code) { view = dynamic_cast(KoDocument::documentList()->first()->views().getFirst()); if ( view ) { page = view->activePage(); } //const char *ccode = code.local8Bit().data(); const char *ccode = code.latin1(); //kdDebug(43000) << "code to run:" << endl << ccode << endl; PyObject *v = PyRun_String( const_cast(ccode) , Py_file_input, globals, vars ); if (v == NULL) { PyErr_Print(); return 0; } PyObject *f = PySys_GetObject("stdout"); int ret = 0; if (f) { ret = PyFile_WriteString("\n", f); } if (ret) PyErr_Clear(); Py_DECREF(v); return 1; } double KivioPyStencil::getDoubleFromDict( PyObject *dict, const char *key ) { if (!PyDict_Check(dict)) return 0.0; PyObject *val = PyDict_GetItemString(dict,const_cast(key)); if ( val ) { if ( PyFloat_Check(val) ) return PyFloat_AsDouble( val ); if ( PyLong_Check(val) ) return PyLong_AsLong( val ); if ( PyLong_Check(val) ) return PyLong_AsDouble( val ); } return 0.0; } TQString KivioPyStencil::getStringFromDict( PyObject *dict, const char *key ) { PyObject *val = PyDict_GetItemString(dict,const_cast(key)); if ( val && PyBytes_Check(val) ) return TQString( PyBytes_AS_STRING(val) ); return TQString(""); } KivioCollisionType KivioPyStencil::checkForCollision( KoPoint *pPoint, double ) { double px = pPoint->x(); double py = pPoint->y(); if( !(px < m_x + m_w && px >= m_x && py < m_y + m_h && py >= m_y ) ) { return kctNone; } return kctBody; } /** * Return a set of bits representing what resize handles are available. */ int KivioPyStencil::resizeHandlePositions() { // Calculate the resize handle positions int mask = KIVIO_RESIZE_HANDLE_POSITION_ALL; if( m_pProtection->at( kpWidth ) ) { mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpE | krhpW); } if( m_pProtection->at( kpHeight) ) { mask &= ~(krhpNE | krhpNW | krhpSW | krhpSE | krhpN | krhpS); } return mask; } /** * Paints the connector targets of this stencil. */ void KivioPyStencil::paintConnectorTargets( KivioIntraStencilData *pData ) { TQPixmap targetPic; KivioPainter *painter; double x, y; // We don't draw these if we are selected!!! if( isSelected() ) return; // Obtain the graphic used for KivioConnectorTargets targetPic = Kivio::connectorTargetPixmap(); KoZoomHandler* zoomHandler = pData->zoomHandler; painter = pData->painter; KivioConnectorTarget *pTarget; pTarget = m_pConnectorTargets->first(); while( pTarget ) { x = zoomHandler->zoomItX(pTarget->x()); y = zoomHandler->zoomItY(pTarget->y()); painter->drawPixmap( x-3, y-3, targetPic ); pTarget = m_pConnectorTargets->next(); } } /** * Attempts to connect a KivioConnectorPoint to this stencil. * * This function will attempt to locate a KivioConnectorTarget in this * stencil with-in a given threshold. If it finds it, it will connect * the point to it, and return the target of the connection. */ KivioConnectorTarget *KivioPyStencil::connectToTarget( KivioConnectorPoint *p, double threshHold ) { double px = p->x(); double py = p->y(); double tx, ty; KivioConnectorTarget *pTarget = m_pConnectorTargets->first(); while( pTarget ) { tx = pTarget->x(); ty = pTarget->y(); if( px >= tx - threshHold && px <= tx + threshHold && py >= ty - threshHold && py <= ty + threshHold ) { // setTarget calls pTarget->addConnectorPoint() and removes // any previous connections from p p->setTarget( pTarget ); return pTarget; } pTarget = m_pConnectorTargets->next(); } return NULL; } KivioConnectorTarget *KivioPyStencil::connectToTarget( KivioConnectorPoint *p, int /*targetID*/ ) { int id = p->targetId(); KivioConnectorTarget *pTarget = m_pConnectorTargets->first(); while( pTarget ) { if( pTarget->id() == id ) { p->setTarget(pTarget); return pTarget; } pTarget = m_pConnectorTargets->next(); } return NULL; } int KivioPyStencil::generateIds( int nextAvailable ) { KivioConnectorTarget *pTarget = m_pConnectorTargets->first(); // Iterate through all the targets while( pTarget ) { // If this target has something connected to it if( pTarget->hasConnections() ) { // Set it's id to the next available id pTarget->setId( nextAvailable ); // Increment the next available id nextAvailable++; } else { // Otherwise mark it as unused (-1) pTarget->setId( -1 ); } pTarget = m_pConnectorTargets->next(); } // Return the next availabe id return nextAvailable; } void KivioPyStencil::setStyle( KivioIntraStencilData *d, PyObject *s, int &fillStyle ) { if ( !s ) return; if ( !PyDict_Check(s) ) return; KivioPainter *p = d->painter; KoZoomHandler* zoomHandler = d->zoomHandler; PyObject *color = PyDict_GetItemString(s,"color"); if ( color ) { TQColor c = readColor(color); if ( c.isValid() ) { p->setFGColor(c); } } color = PyDict_GetItemString(s,"bgcolor"); if ( color ) { TQColor c = readColor(color); if ( c.isValid() ) { p->setBGColor(c); } } color = PyDict_GetItemString(s,"textcolor"); if ( color ) { TQColor c = readColor(color); if ( c.isValid() ) { p->setTextColor(c); } } PyObject *lineWidth = PyDict_GetItemString(s,"linewidth"); if ( lineWidth ) { double lw = getDoubleFromDict(s,"linewidth"); p->setLineWidth( zoomHandler->zoomItY(lw) ); } PyObject *o_fillStyle = PyDict_GetItemString(s,"fillstyle"); if ( o_fillStyle ) { TQString sfill = getStringFromDict(s,"fillstyle"); if ( sfill == "solid" ) { fillStyle = KivioFillStyle::kcsSolid; } if ( sfill == "none" ) { fillStyle = KivioFillStyle::kcsNone; } } TQString sfont = getStringFromDict(s,"font"); TQFont f; int fontSize = (int)getDoubleFromDict(s,"fontsize"); if(!fontSize) { fontSize = 12; // FIXME: Should use some kind of global setting!!! } f.setPointSize(fontSize); f.setPointSizeFloat(f.pointSizeFloat() * (((float)zoomHandler->zoom()) / 100.0)); if ( !sfont.isEmpty() ) { f.setFamily(sfont); } else { f.setFamily("times"); // FIXME: Should use some kind of global setting!!! } p->setFont(f); } TQColor KivioPyStencil::readColor( PyObject *color ) { if ( !color ) return TQColor(); if ( PyBytes_Check(color) ) { return TQColor( PyBytes_AsString(color) ); } if ( PyList_Check(color) ) { if ( PyList_Size(color) == 3 ) { PyObject *ro = PyList_GetItem(color,0); PyObject *go = PyList_GetItem(color,1); PyObject *bo = PyList_GetItem(color,2); int r=0, g=0, b=0; if ( PyNumber_Check(ro) ) r = PyLong_AsLong( PyNumber_Long(ro)); if ( PyNumber_Check(go) ) g = PyLong_AsLong( PyNumber_Long(go)); if ( PyNumber_Check(bo) ) b = PyLong_AsLong( PyNumber_Long(bo)); return TQColor(r,g,b); } } return TQColor(); } void KivioPyStencil::PyDebug( PyObject * o ) { kdDebug(43000) << "py_debug: " << PyBytes_AsString(PyObject_Str(o)) << endl; } TQColor KivioPyStencil::fgColor() { TQColor color = readColor( PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "color" ) ); if ( color.isValid() ) return color; else return TQColor(0,0,0); } void KivioPyStencil::setFGColor( TQColor c ) { PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "color" , Py_BuildValue("[i,i,i]", c.red(), c.green(), c.blue() ) ) ; } TQColor KivioPyStencil::bgColor() { TQColor color = readColor( PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "bgcolor" ) ); if ( color.isValid() ) return color; else return TQColor(0,0,0); } void KivioPyStencil::setBGColor( TQColor c ) { PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "bgcolor" , Py_BuildValue("[i,i,i]", c.red(), c.green(), c.blue() ) ) ; } TQColor KivioPyStencil::textColor() { TQColor color = readColor( PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "textcolor" ) ); if ( color.isValid() ) return color; else return TQColor(0,0,0); } void KivioPyStencil::setTextColor( TQColor c ) { PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "textcolor" , Py_BuildValue("[i,i,i]", c.red(), c.green(), c.blue() ) ) ; } double KivioPyStencil::lineWidth() { PyObject *lw = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "linewidth" ); if ( lw ) if ( PyNumber_Check(lw) ) return ( PyLong_AsLong( PyNumber_Long(lw)) ); return 1.0; } void KivioPyStencil::setLineWidth( double w ) { PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "linewidth" , Py_BuildValue("f",w ) ) ; } void KivioPyStencil::setText( const TQString &s ) { PyObject *to = PyDict_GetItemString( PyDict_GetItemString(vars,"shapes"), "text" ); if ( to ) PyDict_SetItemString(to, "text", Py_BuildValue("s", s.latin1() )); } TQString KivioPyStencil::text() { PyObject *to = PyDict_GetItemString( PyDict_GetItemString(vars,"shapes"), "text" ); if ( to ) { return getStringFromDict(to, "text"); } return TQString(""); } void KivioPyStencil::setTextFont( const TQFont &f ) { double fs = f.pointSizeFloat(); TQString family = f.family(); int bold = f.bold(); int italic = f.italic(); int underline= f.underline(); PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "fontsize" , Py_BuildValue("f",fs ) ) ; PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "font" , Py_BuildValue("s",family.latin1() ) ) ; PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "bold" , Py_BuildValue("i",bold ) ) ; PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "italic" , Py_BuildValue("i",italic ) ) ; PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "underline" , Py_BuildValue("i",underline ) ) ; } TQFont KivioPyStencil::textFont() { PyObject *fn = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "font" ); PyObject *fs = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "fontsize" ); PyObject *bd = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "bold" ); PyObject *it = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "italic" ); PyObject *ul = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "underline" ); TQFont f; if ( fs ) if ( PyNumber_Check(fs)) f.setPointSize( PyLong_AsLong( PyNumber_Long(fs))); if ( bd ) if ( PyNumber_Check(bd)) f.setBold( PyLong_AsLong( PyNumber_Long(bd))); if ( it ) if ( PyNumber_Check(it)) f.setItalic( PyLong_AsLong( PyNumber_Long(it))); if ( ul ) if ( PyNumber_Check(ul)) f.setUnderline( PyLong_AsLong( PyNumber_Long(ul))); if ( fn ) if ( PyBytes_Check(fn)) f.setFamily( PyBytes_AsString(fn)); return f; } int KivioPyStencil::hTextAlign() { PyObject *hta = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "htextalign" ); if ( hta ) if ( PyNumber_Check(hta) ) return ( PyLong_AsLong( PyNumber_Long(hta))); return TQt::AlignHCenter; } int KivioPyStencil::vTextAlign() { PyObject *vta = PyDict_GetItemString( PyDict_GetItemString(vars,"style"), "vtextalign" ); if ( vta ) if ( PyNumber_Check(vta) ) return ( PyLong_AsLong( PyNumber_Long(vta))); return TQt::AlignVCenter; } void KivioPyStencil::setHTextAlign(int hta) { PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "htextalign" , Py_BuildValue("i",hta)); } void KivioPyStencil::setVTextAlign(int vta) { PyDict_SetItemString( PyDict_GetItemString(vars,"style") , "vtextalign" , Py_BuildValue("i",vta)); } #endif // HAVE_PYTHON