diff --git a/src/runner/pythonrunner.cpp b/src/runner/pythonrunner.cpp index 3aaf328..c503221 100644 --- a/src/runner/pythonrunner.cpp +++ b/src/runner/pythonrunner.cpp @@ -379,17 +379,13 @@ BOOST_PYTHON_MODULE(mobase) .def("invalidationActive", bpy::pure_virtual(&IProfile::invalidationActive)) ; - bpy::class_("ModRepositoryBridge") - .def(bpy::init()) - .def("requestDescription", &ModRepositoryBridgeWrapper::requestDescription) - .def("requestFiles", &ModRepositoryBridgeWrapper::requestFiles) - .def("requestFileInfo", &ModRepositoryBridgeWrapper::requestFileInfo) - .def("requestToggleEndorsement", &ModRepositoryBridgeWrapper::requestToggleEndorsement) - .def("onFilesAvailable", &ModRepositoryBridgeWrapper::onFilesAvailable) - .def("onFileInfoAvailable", &ModRepositoryBridgeWrapper::onFileInfoAvailable) - .def("onDescriptionAvailable", &ModRepositoryBridgeWrapper::onDescriptionAvailable) - .def("onEndorsementToggled", &ModRepositoryBridgeWrapper::onEndorsementToggled) - .def("onRequestFailed", &ModRepositoryBridgeWrapper::onRequestFailed) + bpy::class_("ModRepositoryBridge") + .def(bpy::init>()) + .def("requestDescription", &IModRepositoryBridge::requestDescription) + .def("requestFiles", &IModRepositoryBridge::requestFiles) + .def("requestFileInfo", &IModRepositoryBridge::requestFileInfo) + .def("requestDownloadURL", &IModRepositoryBridge::requestDownloadURL) + .def("requestToggleEndorsement", &IModRepositoryBridge::requestToggleEndorsement) Q_DELEGATE(IModRepositoryBridge, QObject, "_object") ; diff --git a/src/runner/uibasewrappers.h b/src/runner/uibasewrappers.h index 3af6b4c..6a1419a 100644 --- a/src/runner/uibasewrappers.h +++ b/src/runner/uibasewrappers.h @@ -31,206 +31,6 @@ extern MOBase::IOrganizer *s_Organizer; -using MOBase::ModRepositoryFileInfo; - -/** - * @brief Wrapper class for the bridge to a mod repository. Awkward: This may be - * unnecessary but I didn't manage to figure out how to correctly connect python - * code to C++ signals - */ -class ModRepositoryBridgeWrapper : public QObject -{ - Q_OBJECT -public: - - ModRepositoryBridgeWrapper() - : m_Wrapped(s_Organizer->createNexusBridge()) - { - } - - ModRepositoryBridgeWrapper(MOBase::IModRepositoryBridge *wrapped) - : m_Wrapped(wrapped) - { - } - - ~ModRepositoryBridgeWrapper() - { - delete m_Wrapped; - } - - void requestDescription(QString gameName, int modID, QVariant userData) - { m_Wrapped->requestDescription(gameName, modID, userData); } - void requestFiles(QString gameName, int modID, QVariant userData) - { m_Wrapped->requestFiles(gameName, modID, userData); } - void requestFileInfo(QString gameName, int modID, int fileID, QVariant userData) - { m_Wrapped->requestFileInfo(gameName, modID, fileID, userData); } - void requestToggleEndorsement(QString gameName, int modID, QString modVersion, bool endorse, QVariant userData) - { m_Wrapped->requestToggleEndorsement(gameName, modID, modVersion, endorse, userData); } - - void onFilesAvailable(boost::python::object callback) { - m_FilesAvailableHandler = callback; - connect(m_Wrapped, SIGNAL(filesAvailable(int,QVariant,const QList&)), - this, SLOT(filesAvailable(int,QVariant,const QList&)), - Qt::UniqueConnection); - } - - void onDescriptionAvailable(boost::python::object callback) { - m_DescriptionAvailableHandler = callback; - connect(m_Wrapped, SIGNAL(descriptionAvailable(int,QVariant,QVariant)), - this, SLOT(descriptionAvailable(int,QVariant,QVariant)), - Qt::UniqueConnection); - } - - void onFileInfoAvailable(boost::python::object callback) { - m_FileInfoHandler = callback; - connect(m_Wrapped, SIGNAL(fileInfoAvailable(int,int,QVariant,QVariant)), - this, SLOT(fileInfoAvailable(int,int,QVariant,QVariant)), - Qt::UniqueConnection); - } - - void onEndorsementToggled(boost::python::object callback) { - m_EndorsementToggledHandler = callback; - connect(m_Wrapped, SIGNAL(endorsementToggled(int,QVariant,QVariant)), - this, SLOT(endorsementToggled(int,QVariant,QVariant)), - Qt::UniqueConnection); - } - - void onTrackingToggled(boost::python::object callback) { - m_TrackingToggledHandler = callback; - connect(m_Wrapped, SIGNAL(trackingToggled(int,QVariant,bool)), - this, SLOT(trackingToggled(int,QVariant,bool)), - Qt::UniqueConnection); - - } - - void onRequestFailed(boost::python::object callback) { - m_FailedHandler = callback; - connect(m_Wrapped, SIGNAL(requestFailed(int,int,QVariant,QString)), - this, SLOT(requestFailed(int,int,QVariant,QString)), - Qt::UniqueConnection); - } - -private: - - Q_DISABLE_COPY(ModRepositoryBridgeWrapper) - -private Q_SLOTS: - - void filesAvailable(int modID, QVariant userData, const QList &resultData) - { - if (m_FilesAvailableHandler.is_none()) { - qCritical("no handler connected"); - return; - } - try { - GILock lock; - m_FilesAvailableHandler(modID, userData, resultData); - } catch (const boost::python::error_already_set&) { - throw pyexcept::PythonError(); - } - } - - void descriptionAvailable(int modID, QVariant userData, const QVariant resultData) - { - try { - if (m_DescriptionAvailableHandler.is_none()) { - qCritical("no handler connected"); - return; - } - try { - GILock lock; - m_DescriptionAvailableHandler(modID, userData, resultData); - } catch (const boost::python::error_already_set&) { - throw pyexcept::PythonError(); - } - } catch (const std::exception &e) { - qCritical("failed to report event: %s", e.what()); - } catch (...) { - qCritical("failed to report event"); - } - } - - void fileInfoAvailable(int modID, int fileID, QVariant userData, const QVariant resultData) { - try { - if (m_FileInfoHandler.is_none()) { - qCritical("no handler connected"); - return; - } - try { - GILock lock; - m_FileInfoHandler(modID, fileID, userData, resultData); - } catch (const boost::python::error_already_set&) { - throw pyexcept::PythonError(); - } - } catch (const std::exception &e) { - qCritical("failed to report event: %s", e.what()); - } catch (...) { - qCritical("failed to report event"); - } - } - - void endorsementToggled(int modID, QVariant userData, const QVariant resultData) - { - try { - if (m_EndorsementToggledHandler.is_none()) { - qCritical("no handler connected"); - return; - } - try { - GILock lock; - m_EndorsementToggledHandler(modID, userData, resultData); - } catch (const boost::python::error_already_set&) { - throw pyexcept::PythonError(); - } - } catch (const std::exception &e) { - qCritical("failed to report event: %s", e.what()); - } catch (...) { - qCritical("failed to report event"); - } - } - - void trackingToggled(int modID, QVariant userData, bool tracked) - { - try { - if (m_TrackingToggledHandler.is_none()) { - qCritical("no handler connected"); - return; - } - try { - GILock lock; - m_TrackingToggledHandler(modID, userData, tracked); - } catch (const boost::python::error_already_set&) { - throw pyexcept::PythonError(); - } - } catch (const std::exception &e) { - qCritical("failed to report event: %s", e.what()); - } catch (...) { - qCritical("failed to report event"); - } - } - - void requestFailed(int modID, int fileID, QVariant userData, const QString &errorMessage) - { - try { - GILock lock; - m_FailedHandler(modID, fileID, userData, errorMessage); - } catch (const boost::python::error_already_set&) { - throw pyexcept::PythonError(); - } - } - -private: - - MOBase::IModRepositoryBridge *m_Wrapped; - boost::python::object m_FilesAvailableHandler; - boost::python::object m_DescriptionAvailableHandler; - boost::python::object m_FileInfoHandler; - boost::python::object m_EndorsementToggledHandler; - boost::python::object m_TrackingToggledHandler; - boost::python::object m_FailedHandler; - -}; - struct IProfileWrapper: MOBase::IProfile, boost::python::wrapper { virtual QString name() const override { return this->get_override("name")(); } @@ -249,6 +49,7 @@ struct IDownloadManagerWrapper: MOBase::IDownloadManager, boost::python::wrapper struct IModRepositoryBridgeWrapper: MOBase::IModRepositoryBridge, boost::python::wrapper { + using IModRepositoryBridge::IModRepositoryBridge; virtual void requestDescription(QString gameName, int modID, QVariant userData) { this->get_override("requestDescription")(gameName, modID, userData); } virtual void requestFiles(QString gameName, int modID, QVariant userData) { this->get_override("requestFiles")(gameName, modID, userData); } virtual void requestFileInfo(QString gameName, int modID, int fileID, QVariant userData) { this->get_override("requestFileInfo")(gameName, modID, fileID, userData); }