X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOME_PYQT%2FSALOME_PYQT_GUILight%2FSALOME_PYQT_PyModule.cxx;h=787d8d5fd7ddac32cc8ade196663c42ece540f68;hb=331294345d3e1716fbf79ae25a2851011729be79;hp=3bf337a9661429cd4c2e715b96ef7c2aab94f2a3;hpb=26ac7ca874ce9a796ff7ad43685f42afca635df9;p=modules%2Fgui.git diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx index 3bf337a96..787d8d5fd 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx @@ -65,6 +65,9 @@ const int DEFAULT_GROUP = 40; */ QMutex myInitMutex; +/*! DEBUG mode */ +const bool DEBUG = false; + /*! \var IsCallOldMethods \brief Allow calling obsolete callback methods. @@ -165,15 +168,18 @@ public: FuncMsg( const QString& funcName ) { myName = funcName; - MESSAGE( qPrintable( myName ) << " [ begin ]" ); + if ( DEBUG ) + MESSAGE( qPrintable( myName ) << " [ begin ]" ); } ~FuncMsg() { - MESSAGE( qPrintable( myName ) << " [ end ]" ); + if ( DEBUG ) + MESSAGE( qPrintable( myName ) << " [ end ]" ); } void message( const QString& msg ) { - MESSAGE( qPrintable( myName ) << " : " << qPrintable( msg ) ); + if ( DEBUG ) + MESSAGE( qPrintable( myName ) << " : " << qPrintable( msg ) ); } private: QString myName; @@ -365,7 +371,7 @@ QIcon PyModuleHelper::XmlHandler::loadIcon( const QString& fileName ) SUIT_ResourceMgr* resMgr = module()->getApp()->resourceMgr(); QPixmap pixmap = resMgr->loadPixmap( module()->name(), QApplication::translate( module()->name().toLatin1().data(), - fileName.toLatin1().data() ) ); + fileName.toUtf8().data() ) ); if ( !pixmap.isNull() ) icon = QIcon( pixmap ); } @@ -603,7 +609,6 @@ void PyModuleHelper::XmlHandler::insertPopupItems( QDomNode& parentNode, QMenu* SALOME GUI modules. */ -PyModuleHelper::InterpMap PyModuleHelper::myInterpMap; LightApp_Module* PyModuleHelper::myInitModule = 0; /*! @@ -1156,6 +1161,44 @@ void PyModuleHelper::actionActivated() PyInterp_Dispatcher::Get()->Exec( new ActionReq( myInterp, this, myModule->actionId( action ) ) ); } +/*! + \brief update selection from other views or modules. + + Called when selection is modified outside. +*/ +void PyModuleHelper::selectionUpdated(const QStringList& entries) +{ + FuncMsg fmsg( "PyModuleHelper::selectionUpdated()" ); + MESSAGE("selectionUpdated"); + + // perform synchronous request to Python event dispatcher + class SelectionReq : public PyInterp_LockRequest + { + public: + SelectionReq( PyInterp_Interp* _py_interp, + PyModuleHelper* _helper, + const QStringList& _entries ) + : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true) + myHelper( _helper ), + myEntries( _entries ) + { + MESSAGE("SelectionReq"); + } + protected: + virtual void execute() + { + MESSAGE("execute"); + myHelper->internalSelectionUpdated( myEntries ); + } + private: + PyModuleHelper* myHelper; + const QStringList& myEntries; + }; + + // post request + PyInterp_Dispatcher::Get()->Exec( new SelectionReq( myInterp, this, entries ) ); +} + /*! \brief Process context popup menu request. @@ -1368,8 +1411,9 @@ void PyModuleHelper::cloneView( SUIT_ViewWindow* view ) /*! \brief Save module data. Called when user saves study. \param files output list of files where module stores data + \param url study URL */ -void PyModuleHelper::save( QStringList& files ) +void PyModuleHelper::save( QStringList& files, const QString& url ) { FuncMsg fmsg( "PyModuleHelper::save()" ); @@ -1385,33 +1429,38 @@ void PyModuleHelper::save( QStringList& files ) public: SaveReq( PyInterp_Interp* _py_interp, PyModuleHelper* _helper, - QStringList& _files ) + QStringList& _files, + const QString& _url ) : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true) myHelper( _helper ) , - myFiles( _files ) + myFiles( _files ), + myUrl( _url ) {} protected: virtual void execute() { - myHelper->internalSave( myFiles ); + myHelper->internalSave( myFiles, myUrl ); } private: PyModuleHelper* myHelper; QStringList& myFiles; + QString myUrl; }; // Posting the request only if dispatcher is not busy! // Executing the request synchronously if ( !PyInterp_Dispatcher::Get()->IsBusy() ) - PyInterp_Dispatcher::Get()->Exec( new SaveReq( myInterp, this, files ) ); + PyInterp_Dispatcher::Get()->Exec( new SaveReq( myInterp, this, files, url ) ); } /* - \brief Load module data. Called when user opens study - and activates module. - \param files list of files where module data is stored + \brief Load module data. Called when user opens study + and activates module. + \param files list of files where module data is stored + \param url study URL + \return \c true if loading has been finished successfully or \c false otherwise */ -bool PyModuleHelper::load( const QStringList& files ) +bool PyModuleHelper::load( const QStringList& files, const QString& url ) { FuncMsg fmsg( "PyModuleHelper::load()" ); @@ -1423,27 +1472,30 @@ bool PyModuleHelper::load( const QStringList& files ) LoadReq( PyInterp_Interp* _py_interp, PyModuleHelper* _helper, QStringList _files, + const QString& _url, bool& _loaded ) : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true) myHelper( _helper ) , myFiles( _files ), + myUrl( _url ), myLoaded( _loaded ) {} protected: virtual void execute() { - myHelper->internalLoad( myFiles, myLoaded ); + myHelper->internalLoad( myFiles, myUrl, myLoaded ); } private: PyModuleHelper* myHelper; QStringList myFiles; + QString myUrl; bool& myLoaded; }; // Posting the request only if dispatcher is not busy! // Executing the request synchronously if ( !PyInterp_Dispatcher::Get()->IsBusy() ) - PyInterp_Dispatcher::Get()->Exec( new LoadReq( myInterp, this, files, loaded ) ); + PyInterp_Dispatcher::Get()->Exec( new LoadReq( myInterp, this, files, url, loaded ) ); return loaded; } @@ -1678,31 +1730,15 @@ QString PyModuleHelper::engineIOR() const /*! \brief Initialize python subinterpreter (one per study). \internal - \param studyId study ID */ -void PyModuleHelper::initInterp( int studyId ) +void PyModuleHelper::initInterp() { FuncMsg fmsg( "--- PyModuleHelper::initInterp()" ); - // check study Id - if ( !studyId ) { - // Error! Study Id must not be 0! - myInterp = 0; - return; - } - QMutexLocker ml( &myInitMutex ); - // try to find the subinterpreter - if ( myInterpMap.contains( studyId ) ) { - // found! - myInterp = myInterpMap[ studyId ]; - return; - } - myInterp = new SALOME_PYQT_PyInterp(); myInterp->initialize(); - myInterpMap[ studyId ] = myInterp; #ifndef GUI_DISABLE_CORBA if ( !SUIT_PYTHON::initialized ) { @@ -1719,7 +1755,7 @@ void PyModuleHelper::initInterp( int studyId ) } // ... then call a method int embedded = 1; - PyObjWrapper aRes( PyObject_CallMethod( aMod, (char*)"salome_init", (char*)"ii", studyId, embedded ) ); + PyObjWrapper aRes( PyObject_CallMethod( aMod, (char*)"salome_init", (char*)"i", embedded ) ); if ( !aRes ) { // Error! PyErr_Print(); @@ -1810,11 +1846,12 @@ void PyModuleHelper::setWorkSpace() if ( d ) aWorkspace = d->workstack(); } -#if SIP_VERSION < 0x040800 - PyObjWrapper pyws( sipBuildResult( 0, "M", aWorkspace, sipClass_QWidget) ); -#else - PyObjWrapper pyws( sipBuildResult( 0, "D", aWorkspace, sipType_QWidget , NULL) ); +#if SIP_VERSION >= 0x041300 + static const sipTypeDef *sipType_QWidget = 0; + if (!sipType_QWidget) + sipType_QWidget = sipFindType("QWidget"); #endif + PyObjWrapper pyws( sipBuildResult( 0, "D", aWorkspace, sipType_QWidget , NULL) ); // ... and finally call Python module's setWorkSpace() method (obsolete) if ( PyObject_HasAttrString( myPyModule, (char*)"setWorkSpace" ) ) { PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"setWorkSpace", (char*)"O", pyws.get() ) ); @@ -1852,10 +1889,9 @@ void PyModuleHelper::internalInitialize( CAM_Application* app ) LightApp_Study* aStudy = dynamic_cast( app->activeStudy() ); if ( !aStudy ) return; - int aStudyId = aStudy ? aStudy->id() : 0; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( aStudyId ); + initInterp(); if ( !myInterp ) return; // Error @@ -1899,9 +1935,9 @@ void PyModuleHelper::internalInitialize( CAM_Application* app ) // parse the return value // it should be a map: {integer:integer} int aKey, aValue; - if( key && PyInt_Check( key ) && value && PyInt_Check( value ) ) { - aKey = PyInt_AsLong( key ); - aValue = PyInt_AsLong( value ); + if( key && PyLong_Check( key ) && value && PyLong_Check( value ) ) { + aKey = PyLong_AsLong( key ); + aValue = PyLong_AsLong( value ); myWindowsMap[ aKey ] = aValue; } } @@ -1919,16 +1955,16 @@ void PyModuleHelper::internalInitialize( CAM_Application* app ) else { // parse the return value // result can be one string... - if ( PyString_Check( res2 ) ) { - myViewMgrList.append( PyString_AsString( res2 ) ); + if ( PyUnicode_Check( res2 ) ) { + myViewMgrList.append( PyUnicode_AsUTF8( res2 ) ); } // ... or list of strings else if ( PyList_Check( res2 ) ) { int size = PyList_Size( res2 ); for ( int i = 0; i < size; i++ ) { PyObject* value = PyList_GetItem( res2, i ); - if( value && PyString_Check( value ) ) { - myViewMgrList.append( PyString_AsString( value ) ); + if( value && PyUnicode_Check( value ) ) { + myViewMgrList.append( PyUnicode_AsUTF8( value ) ); } } } @@ -1953,10 +1989,11 @@ void PyModuleHelper::internalActivate( SUIT_Study* study ) // get study Id LightApp_Study* aStudy = dynamic_cast( study ); - int aStudyId = aStudy ? aStudy->id() : 0; + if ( !aStudy ) + return; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( aStudyId ); + initInterp(); if ( !myInterp ) { myLastActivateStatus = false; return; // Error @@ -2005,10 +2042,11 @@ void PyModuleHelper::internalCustomize( SUIT_Study* study ) // get study Id LightApp_Study* aStudy = dynamic_cast( study ); - int aStudyId = aStudy ? aStudy->id() : 0; + if ( !aStudy ) + return; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( aStudyId ); + initInterp(); if ( !myInterp ) { myLastActivateStatus = false; return; // Error @@ -2081,7 +2119,8 @@ void PyModuleHelper::internalClosedStudy( SUIT_Study* theStudy ) // Get study Id // get study Id LightApp_Study* aStudy = dynamic_cast( theStudy ); - int aStudyId = aStudy ? aStudy->id() : 0; + if ( !aStudy ) + return; // check that Python subinterpreter is initialized and Python module is imported if ( !myInterp || !myPyModule ) { @@ -2090,7 +2129,7 @@ void PyModuleHelper::internalClosedStudy( SUIT_Study* theStudy ) } // then call Python module's deactivate() method if ( PyObject_HasAttrString( myPyModule , (char*)"closeStudy" ) ) { - PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"closeStudy", (char*)"i", aStudyId ) ); + PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"closeStudy", (char*)"i" ) ); if( !res ) { PyErr_Print(); } @@ -2123,8 +2162,8 @@ void PyModuleHelper::internalPreferencesChanged( const QString& section, const Q PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"preferenceChanged", (char*)"ss", - section.toLatin1().constData(), - setting.toLatin1().constData() ) ); + section.toUtf8().constData(), + setting.toUtf8().constData() ) ); if( !res ) { PyErr_Print(); } @@ -2149,12 +2188,11 @@ void PyModuleHelper::internalStudyChanged( SUIT_Study* study ) // get study Id LightApp_Study* aStudy = dynamic_cast( study ); - int id = aStudy ? aStudy->id() : 0; - - fmsg.message( QString( "study id = %1" ).arg( id ) ); + if ( !aStudy ) + return; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( id ); + initInterp(); if ( !myInterp ) return; // Error @@ -2171,7 +2209,7 @@ void PyModuleHelper::internalStudyChanged( SUIT_Study* study ) // call Python module's activeStudyChanged() method if ( PyObject_HasAttrString( myPyModule, (char*)"activeStudyChanged" ) ) { - PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"activeStudyChanged", (char*)"i", id ) ); + PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"activeStudyChanged", (char*)"i" ) ); if( !res ) { PyErr_Print(); } @@ -2205,6 +2243,44 @@ void PyModuleHelper::internalActionActivated( int id ) } } +/*! + \brief update selection from other views or modules + \internal + + Performs the following actions: + - calls Python module's onSelectionpdated(entries) method + + \param list of entries +*/ +void PyModuleHelper::internalSelectionUpdated(const QStringList& entries) +{ + FuncMsg fmsg("--- PyModuleHelper::internalSelectionUpdated()"); + MESSAGE("internalSelectionUpdated"); + + // Python interpreter should be initialized and Python module should be imported first + if (!myInterp || !myPyModule) + return; // Error + + QStringList* theList = new QStringList(entries); + +#if SIP_VERSION >= 0x041300 + static const sipTypeDef *sipType_QStringList = 0; + if (!sipType_QStringList) + sipType_QStringList = sipFindType("QStringList"); +#endif + PyObjWrapper sipList( sipBuildResult( 0, "D", theList, sipType_QStringList, NULL ) ); + if (PyObject_HasAttrString(myPyModule, (char*) "onSelectionUpdated")) + { + MESSAGE("call onSelectionUpdated"); + PyObjWrapper res(PyObject_CallMethod(myPyModule, (char*) "onSelectionUpdated", (char*) "O", sipList.get())); + + if (!res) + { + PyErr_Print(); + } + } +} + /*! \brief Context popup menu handling callback function \internal @@ -2239,9 +2315,9 @@ void PyModuleHelper::internalContextMenu( const QString& context, QMenu* menu ) PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"definePopup", (char*)"sss", - context.toLatin1().constData(), - aObject.toLatin1().constData(), - aParent.toLatin1().constData() ) ); + context.toUtf8().constData(), + aObject.toUtf8().constData(), + aParent.toUtf8().constData() ) ); if( !res ) { PyErr_Print(); } @@ -2261,11 +2337,12 @@ void PyModuleHelper::internalContextMenu( const QString& context, QMenu* menu ) if ( myXmlHandler ) myXmlHandler->createPopup( menu, aContext, aParent, aObject ); -#if SIP_VERSION < 0x040800 - PyObjWrapper sipPopup( sipBuildResult( 0, "M", menu, sipClass_QMenu ) ); -#else - PyObjWrapper sipPopup( sipBuildResult( 0, "D", menu, sipType_QMenu, NULL ) ); +#if SIP_VERSION >= 0x041300 + static const sipTypeDef *sipType_QMenu = 0; + if (!sipType_QMenu) + sipType_QMenu = sipFindType("QMenu"); #endif + PyObjWrapper sipPopup( sipBuildResult( 0, "D", menu, sipType_QMenu, NULL ) ); // then call Python module's createPopupMenu() method (for new modules) if ( PyObject_HasAttrString( myPyModule, (char*)"createPopupMenu" ) ) { @@ -2273,7 +2350,7 @@ void PyModuleHelper::internalContextMenu( const QString& context, QMenu* menu ) (char*)"createPopupMenu", (char*)"Os", sipPopup.get(), - context.toLatin1().constData() ) ); + context.toUtf8().constData() ) ); if( !res1 ) { PyErr_Print(); } @@ -2286,9 +2363,9 @@ void PyModuleHelper::internalContextMenu( const QString& context, QMenu* menu ) (char*)"customPopup", (char*)"Osss", sipPopup.get(), - aContext.toLatin1().constData(), - aObject.toLatin1().constData(), - aParent.toLatin1().constData() ) ); + aContext.toUtf8().constData(), + aObject.toUtf8().constData(), + aParent.toUtf8().constData() ) ); if( !res2 ) { PyErr_Print(); } @@ -2415,8 +2492,9 @@ void PyModuleHelper::internalCloneView( SUIT_ViewWindow* view ) \brief Module data saving callback function. \internal \param files output list of files where module stores data + \param url study URL */ -void PyModuleHelper::internalSave( QStringList& files ) +void PyModuleHelper::internalSave( QStringList& files, const QString& url ) { FuncMsg fmsg( "--- PyModuleHelper::internalSave()" ); @@ -2428,17 +2506,24 @@ void PyModuleHelper::internalSave( QStringList& files ) if ( PyObject_HasAttrString(myPyModule, (char*)"saveFiles") ) { + // try with two parameters (new syntax) PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"saveFiles", - (char*)"s", files.first().toLatin1().constData() ) ); - + (char*)"ss", + files.first().toUtf8().constData(), + url.toUtf8().constData() ) ); + if ( !res ) + // try with single parameter (old syntax) + res = PyObject_CallMethod( myPyModule, (char*)"saveFiles", + (char*)"s", files.first().toUtf8().constData() ); + if ( !res ) { PyErr_Print(); } else { // parse the return value // result can be one string... - if ( PyString_Check( res ) ) { - QString astr = PyString_AsString( res ); + if ( PyUnicode_Check( res ) ) { + QString astr = PyUnicode_AsUTF8( res ); files.append( astr ); } //also result can be a list... @@ -2446,8 +2531,8 @@ void PyModuleHelper::internalSave( QStringList& files ) int size = PyList_Size( res ); for ( int i = 0; i < size; i++ ) { PyObject* value = PyList_GetItem( res, i ); - if ( value && PyString_Check( value ) ) { - files.append( PyString_AsString( value ) ); + if ( value && PyUnicode_Check( value ) ) { + files.append( PyUnicode_AsUTF8( value ) ); } } } @@ -2459,9 +2544,10 @@ void PyModuleHelper::internalSave( QStringList& files ) \brief Module data loading callback function. \internal \param files list of files where module data is stored + \param url study URL \param opened output success flag */ -void PyModuleHelper::internalLoad( const QStringList& files, bool& opened ) +void PyModuleHelper::internalLoad( const QStringList& files, const QString& url, bool& opened ) { FuncMsg fmsg( "--- PyModuleHelper::internalLoad()" ); @@ -2472,19 +2558,29 @@ void PyModuleHelper::internalLoad( const QStringList& files, bool& opened ) QStringList* theList = new QStringList( files ); -#if SIP_VERSION < 0x040800 - PyObjWrapper sipList( sipBuildResult( 0, "M", theList, sipClass_QStringList ) ); -#else - PyObjWrapper sipList( sipBuildResult( 0, "D", theList, sipType_QStringList, NULL ) ); +#if SIP_VERSION >= 0x041300 + static const sipTypeDef *sipType_QStringList = 0; + if (!sipType_QStringList) + sipType_QStringList = sipFindType("QStringList"); #endif + PyObjWrapper sipList( sipBuildResult( 0, "D", theList, sipType_QStringList, NULL ) ); if ( PyObject_HasAttrString(myPyModule , (char*)"openFiles") ) { + + // try with two parameters (new syntax) PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"openFiles", - (char*)"O", sipList.get())); - if( !res || !PyBool_Check( res )) { + (char*)"Os", sipList.get(), + url.toUtf8().constData() ) ); + + if ( !res ) + // try with single parameter (old syntax) + res = PyObject_CallMethod( myPyModule, (char*)"openFiles", + (char*)"O", sipList.get() ); + + if ( !res || !PyBool_Check( res ) ) { PyErr_Print(); opened = false; } - else{ + else { opened = PyObject_IsTrue( res ); } } @@ -2507,7 +2603,7 @@ void PyModuleHelper::internalDumpPython( QStringList& files ) if ( PyObject_HasAttrString(myPyModule, (char*)"dumpStudy") ) { PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"dumpStudy", - (char*)"s", files.first().toLatin1().constData())); + (char*)"s", files.first().toUtf8().constData())); if ( !res ) { PyErr_Print(); @@ -2515,8 +2611,8 @@ void PyModuleHelper::internalDumpPython( QStringList& files ) else { // parse the return value // result can be one string... - if ( PyString_Check( res ) ) { - QString astr = PyString_AsString( res ); + if ( PyUnicode_Check( res ) ) { + QString astr = PyUnicode_AsUTF8( res ); //SCRUTE(astr); files.append(astr); } @@ -2525,8 +2621,8 @@ void PyModuleHelper::internalDumpPython( QStringList& files ) int size = PyList_Size( res ); for ( int i = 0; i < size; i++ ) { PyObject* value = PyList_GetItem( res, i ); - if( value && PyString_Check( value ) ) { - files.append( PyString_AsString( value ) ); + if( value && PyUnicode_Check( value ) ) { + files.append( PyUnicode_AsUTF8( value ) ); } } } @@ -2553,7 +2649,7 @@ bool PyModuleHelper::internalIsDraggable( LightApp_DataObject* what ) if ( PyObject_HasAttrString(myPyModule , (char*)"isDraggable") ) { PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"isDraggable", - (char*)"s", what->entry().toLatin1().constData() ) ); + (char*)"s", what->entry().toUtf8().constData() ) ); if( !res || !PyBool_Check( res )) { PyErr_Print(); draggable = false; @@ -2585,7 +2681,7 @@ bool PyModuleHelper::internalIsDropAccepted( LightApp_DataObject* where ) if ( PyObject_HasAttrString(myPyModule , (char*)"isDropAccepted") ) { PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"isDropAccepted", - (char*)"s", where->entry().toLatin1().constData() ) ); + (char*)"s", where->entry().toUtf8().constData() ) ); if( !res || !PyBool_Check( res )) { PyErr_Print(); dropAccepted = false; @@ -2626,15 +2722,16 @@ void PyModuleHelper::internalDropObjects( const DataObjectList& what, SUIT_DataO if ( dataObject ) theList->append( dataObject->entry() ); } -#if SIP_VERSION < 0x040800 - PyObjWrapper sipList( sipBuildResult( 0, "M", theList, sipClass_QStringList) ); -#else - PyObjWrapper sipList( sipBuildResult( 0, "D", theList, sipType_QStringList, NULL) ); +#if SIP_VERSION >= 0x041300 + static const sipTypeDef *sipType_QStringList = 0; + if (!sipType_QStringList) + sipType_QStringList = sipFindType("QStringList"); #endif + PyObjWrapper sipList( sipBuildResult( 0, "D", theList, sipType_QStringList, NULL) ); if ( PyObject_HasAttrString(myPyModule, (char*)"dropObjects") ) { PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"dropObjects", (char*)"Osii", sipList.get(), - whereObject->entry().toLatin1().constData(), + whereObject->entry().toUtf8().constData(), row, action ) ); if( !res ) { @@ -2668,8 +2765,8 @@ QString PyModuleHelper::internalEngineIOR() const } else { // parse the return value, result chould be string - if ( PyString_Check( res ) ) { - ior = PyString_AsString( res ); + if ( PyUnicode_Check( res ) ) { + ior = PyUnicode_AsUTF8( res ); } } } @@ -2722,7 +2819,7 @@ void PyModuleHelper::internalOBClickedPython( const QString& theObj, int theColu return; // Error if ( PyObject_HasAttrString( myPyModule, (char*)"onObjectBrowserClicked" ) ) { - PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"onObjectBrowserClicked", (char*)"si", theObj.toLatin1().constData(), theColumn ) ); + PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"onObjectBrowserClicked", (char*)"si", theObj.toUtf8().constData(), theColumn ) ); if( !res ) { PyErr_Print(); }