Compare commits

..
557 Commits
Author SHA1 Message Date
Chris Bessent 7c54a45f63 Merge pull request #99 from Holt59/no-more-external-python
Remove support for external Python.
2022-03-19 21:15:05 -07:00
Chris Bessent b090d1341b Merge pull request #100 from Qudix/isX
Add hasMasterExtension, hasLightExtension, isMasterFlagged, and isLightFlagged
2022-03-19 21:10:02 -07:00
Qudix f3b43a5375 Change isXFile to hasXExtension 2022-03-19 19:47:35 -05:00
Qudix 0423ccb9ca Rename isX to isXFile and deprecate isMaster 2022-02-24 20:00:56 -06:00
Qudix d4d958018d Add isMasterFlagged isLight isLightFlagged 2022-02-24 17:57:23 -06:00
Mikaël Capelle b1c51ada08 Remove support for external Python. 2022-02-13 17:33:53 +01:00
Mikaël Capelle 5f56aa99ca Merge pull request #98 from Holt59/fix-sharedptr-deletion
Fix shared_ptr in createFile().
2022-02-13 17:32:39 +01:00
Mikaël Capelle 0c5622ea69 Fix shared_ptr in createFile(). 2022-01-11 22:36:16 +01:00
Mikaël Capelle 071498f305 Merge pull request #96 from Holt59/remove-boost-uibase
Update after removal of boost in uibase.
2021-05-27 15:43:22 +02:00
Mikaël Capelle f134881da6 Update after removal of boost in uibase. 2021-05-26 19:47:15 +02:00
Mikaël Capelle 931996347b Merge pull request #94 from Holt59/fix-fileinfo
Fix FileInfo attribute access.
2021-05-20 20:21:07 +02:00
Mikaël Capelle 4775bafc33 Merge pull request #95 from Holt59/iorganizer-virtualfiletree
Add IOrganizer::virtualFileTree().
2021-05-20 20:20:47 +02:00
Mikaël Capelle f5a8446230 Add IOrganizer::virtualFileTree(). 2021-05-14 14:40:36 +02:00
Mikaël Capelle 120c13170c Fix FileInfo attribute access. 2021-05-14 13:54:06 +02:00
Mikaël Capelle ae975e52d7 Merge pull request #93 from Holt59/fix-startup-logs
Import mobase after installing the exception wrapper.
2021-03-04 20:29:24 +01:00
Mikaël Capelle e5ac21442f Import mobase after installing the exception wrapper. 2021-03-03 20:44:20 +01:00
Mikaël Capelle 40e6924714 Merge pull request #92 from LostDragonist/disabled_plugins
Add enabledByDefault to IPlugin definition
2021-03-02 19:27:44 +01:00
Mikaël Capelle e4ff66b727 Merge pull request #91 from Holt59/fix-ifiletree-sharedptr
Fix deletion of shared_ptr created from C++.
2021-03-02 19:27:32 +01:00
Chris Bessent a9a3d49efa Add enabledByDefault to IPlugin definition 2021-03-02 02:45:47 -07:00
Mikaël Capelle fce4f39dc8 Fix deleting of shared_ptr create from C++. 2021-02-28 19:58:15 +01:00
Mikaël Capelle 57441bd3c5 Update translation file. 2021-02-02 20:39:14 +01:00
Mikaël Capelle bab25d25ca Merge pull request #89 from Holt59/fix-iplugininstaller-install
Update IInstallationManager::installArchive() to handle string directly.
2021-01-02 15:30:16 +01:00
Mikaël Capelle ca052389b5 Merge pull request #90 from Holt59/update-imodinterface
Remove setName and remove from mod interface.
2021-01-02 15:25:35 +01:00
Mikaël Capelle 5f86de5d9e Remove setName and remove from mod interface. 2021-01-02 15:07:31 +01:00
Mikaël Capelle 91c55c909f Update IInstallationManager::installArchive() to handle string directly. 2021-01-01 19:58:19 +01:00
Mikaël Capelle d2d31f993d Merge pull request #88 from Holt59/fix-iorganizer-findfileinfos
Add missing converters to use IOrganizer::findFileInfos.
2020-12-30 21:06:13 +01:00
Mikaël Capelle 56dbb1f40e Add missing converters to use IOrganizer::findFileInfos. 2020-12-30 20:42:19 +01:00
Al cde7f79bc3 Merge pull request #87 from Holt59/imodinterface-isX
Add method to get the type of IModInterface.
2020-12-30 15:25:18 +01:00
Mikaël Capelle 96a7bc3898 Add method to get the type of IModInterface. 2020-12-26 16:55:07 +01:00
Mikaël Capelle f4ae1c94a0 Merge pull request #86 from Holt59/add-taskdialog
Add bindings for TaskDialog.
2020-12-12 13:00:37 +01:00
Mikaël Capelle 87c91b8259 Add bindings for TaskDialog. 2020-12-08 19:44:10 +01:00
Mikaël Capelle 2ed4b901c0 Merge pull request #85 from Holt59/moexception
Rename MyException to MOException
2020-12-04 13:30:30 +01:00
Mikaël Capelle cd9b16dcc2 MOException -> Exception. 2020-12-04 12:04:45 +01:00
Mikaël Capelle 5cad8a9ff8 Rename MyException to MOException. 2020-12-04 11:49:44 +01:00
Mikaël Capelle e961d21f24 Merge pull request #84 from Holt59/ipluginproxy-unload
Add IPluginProxy::unload() and rename instantiate() to load().
2020-12-02 16:26:56 +01:00
Mikaël Capelle 7f0848c9d2 Improve comments. 2020-12-02 09:20:13 +01:00
Mikaël Capelle bc05ec6477 Add IPluginProxy::unload() and rename instantiate() to load(). 2020-12-01 21:18:06 +01:00
Al 631fc2b31b Merge pull request #83 from ModOrganizer2/Al12rs-refresh-waitForApplication
Add refresh parameter for waitForApplication
2020-11-28 10:55:38 -08:00
AL f17ce3d2e6 add default value for refresh 2020-11-28 18:17:23 +01:00
AL 73d7771703 Add refresh parameter for waitForApplication 2020-11-28 18:02:39 +01:00
Al e737f0a5a8 Merge pull request #79 from ModOrganizer2/iplugingame-saves
IPluginGame::listSaves
2020-11-28 06:37:40 -08:00
isanae a75e94d46f Merge pull request #82 from ModOrganizer2/revert-73-master
Revert "Moving things around"
2020-11-27 07:47:30 -05:00
isanae b7855ca7d8 Merge pull request #81 from ModOrganizer2/revert-80-dll_directory
Revert "Fix libffi not found"
2020-11-27 07:47:24 -05:00
isanae f6cf0e8b33 Revert "Moving things around" 2020-11-27 07:36:39 -05:00
isanae 4fdbabdf76 Revert "Fix libffi not found" 2020-11-27 07:36:28 -05:00
Mikaël Capelle efc7d76a0a Revert translation file. 2020-11-25 22:47:10 +01:00
Mikaël Capelle 832aced4d3 Fix default binding for IPlugin::master(). 2020-11-21 14:11:36 +01:00
Mikaël Capelle a335adf928 Add argument name to IPluginRequirement::check(). 2020-11-21 13:45:30 +01:00
Mikaël Capelle ccef4be741 Replace ScriptExtender saveGameAttachmentExtensions with savegameExtension. 2020-11-21 12:25:59 +01:00
Mikaël Capelle aacf3654d8 Add default argument to GuessedString constructor to match C++ implementation. 2020-11-20 21:42:07 +01:00
Mikaël Capelle 234586823d Return shared_ptr in IPlugin::requirements(). 2020-11-19 21:21:58 +01:00
Mikaël Capelle 5b84588732 Add comment to reference Boost.Python issue. 2020-11-19 20:41:24 +01:00
Mikaël Capelle 7dbc139b10 Fix crash when destructing Python save games due to the GIL lock. 2020-11-19 20:40:05 +01:00
Mikaël Capelle 31e4f724ed Clean listSaves() bindings. 2020-11-19 20:33:24 +01:00
Mikaël Capelle 6e088406c8 Update following removal of IPlugin::isActive(). 2020-11-19 20:33:24 +01:00
Mikaël Capelle 9784881921 Update following addition of IPluginGame::listSaves(). 2020-11-19 20:33:00 +01:00
Mikaël Capelle aa8caee65c Merge pull request #80 from Qudix/dll_directory
Fix libffi not found
2020-11-19 09:36:34 +01:00
Qudix 9a10c01cc0 lamb-da 2020-11-18 14:30:40 -06:00
Qudix d9243bb617 Better 2020-11-18 13:37:54 -06:00
Qudix adf5888faf Fix libffi not found 2020-11-18 13:02:15 -06:00
Mikaël Capelle 7bec9237e6 Merge pull request #78 from Holt59/iplugin-isactive-refactoring
IPlugin::isActive refactoring
2020-11-18 10:01:30 +01:00
Mikaël Capelle 0846ffd177 Merge pull request #77 from Holt59/logging-module
Add handler for Python logging module.
2020-11-16 09:13:28 +01:00
isanae f3601e5bfe Merge pull request #73 from Qudix/master
Moving things around
2020-11-14 06:54:31 -05:00
Mikaël Capelle b37d3a9c17 Add callbacks for plugin enabled/disabled. 2020-11-12 21:49:37 +01:00
Mikaël Capelle cbb911f6a0 Rename the wrapper declaration and definition macros. 2020-11-11 22:02:40 +01:00
Mikaël Capelle 27c34af2aa Update authors. 2020-11-11 21:54:54 +01:00
Mikaël Capelle b20c015643 master() returns the name of the plugin. 2020-11-11 21:00:47 +01:00
Mikaël Capelle d89eae1646 Allow IPluginRequirement to be properly extended from Python. 2020-11-11 17:25:55 +01:00
Mikaël Capelle de5fde0f28 Cleaner IPluginRequirement. 2020-11-11 16:14:28 +01:00
Mikaël Capelle e84777d550 Remove automatic plugin dependency for proxy (moved to MO2 core). 2020-11-11 13:38:42 +01:00
Mikaël Capelle 1ca6fee64d Add plugin requirements. 2020-11-11 11:23:15 +01:00
Mikaël Capelle 57c774103d Better handling of sequence conversions. 2020-11-11 11:22:50 +01:00
Mikaël Capelle ead8352c93 Remove isActive() for the Python proxy plugin. 2020-11-11 11:22:10 +01:00
Mikaël Capelle 04e1af60a0 Do not set basicConfig() but provide a default logger. 2020-11-09 20:08:29 +01:00
Mikaël Capelle ebb566f773 Expose LogHandler in mobase. 2020-11-09 19:17:57 +01:00
Mikaël Capelle c45bfb1e35 Cast the record message to str() before extracting. 2020-11-09 18:28:58 +01:00
Mikaël Capelle 5f8e1803c0 Add handler for Python logging module. 2020-11-09 18:23:57 +01:00
Seth Riley 9bd22cfceb Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer-plugin_python into master 2020-11-06 13:24:00 -06:00
Mikaël Capelle c2c63e0624 Merge pull request #76 from Holt59/iplugingame-detectgame
Replace IPlugin::registered() by IPluginGame::detectGame().
2020-11-06 20:17:45 +01:00
Seth Riley 240622565c Fix merge 2020-11-06 12:36:43 -06:00
Seth Riley ba7ba616ea Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer-plugin_python into master 2020-11-06 12:27:51 -06:00
Mikaël Capelle 93dcf8d5b3 Replace IPlugin::registered() by IPluginGame::detectGame(). 2020-11-06 18:56:00 +01:00
isanae 7d0e97ed2b Merge pull request #75 from isanae/command-line
Command line and instance dialogs
2020-11-06 10:50:25 -05:00
isanae 86297b1170 removed unused IOrganizer from PythonRunner 2020-11-06 09:25:01 -05:00
isanae 78e4e5c548 binding for getPluginDataPath() 2020-11-06 09:22:23 -05:00
isanae 6a73c23a4b added registered() python wrapper
null checks for the IOrganizer, replaced pluginDataPath() by the static version getPluginDataPath()
2020-11-06 09:06:55 -05:00
Mikaël Capelle 7afade8642 Merge pull request #74 from Holt59/imodinterface-filetree
Add IModInterface::fileTree().
2020-11-05 10:43:55 +01:00
isanae 6445f7f47f handle empty variants returned from pluginSetting()
can happen when init() is called when MO has no instance set up
2020-11-04 22:52:56 -05:00
Mikaël Capelle c6e89dead6 Add IModInterface::fileTree(). 2020-11-04 21:48:22 +01:00
Seth Riley 20c2e5a14d Moving things around 2020-11-02 13:46:02 -06:00
Mikaël Capelle 83dec58e4a Merge pull request #72 from Holt59/imodlist-updates
IModList updates
2020-10-26 21:37:39 +01:00
Mikaël Capelle f4b8cbcd0b Merge pull request #70 from Holt59/iorganizer-profile-callbacks
Add IOrganizer::onProfileXXX callbacks.
2020-10-26 21:36:51 +01:00
Mikaël Capelle 96d15ae762 Fix default nullptr argument for allModsByProfilePriority. 2020-10-25 18:37:53 +01:00
Mikaël Capelle 7668783d3c Move IOrganizer::getMod() to IModList::getMod(). 2020-10-25 17:46:00 +01:00
Mikaël Capelle 40b7cd8e86 Move IOrganizer::removeMod() to IModList::removeMod(). 2020-10-25 17:15:22 +01:00
Mikaël Capelle 2aa65ec5bb Move IOrganizer::modsSortedByProfilePriority() to IModList::allModsByProfilePriority(). 2020-10-25 16:52:28 +01:00
Mikaël Capelle b1e554526a Fix for onModInstalled() modification. 2020-10-25 16:52:20 +01:00
Mikaël Capelle 8640890f8c Rename IOrganizer::refresh(). Move IOrganizer::onModInstalled. Add IModList::onModRemoved(). 2020-10-25 16:18:55 +01:00
Mikaël Capelle 2526b75ca1 Merge pull request #71 from Holt59/fix-ifiletree-const
Fix implicit conversion from non-const IFileTree to const IFileTree.
2020-10-25 13:00:50 +01:00
Mikaël Capelle 138de736ef Fix implicit conversion from non-const IFileTree to const IFileTree. 2020-10-25 12:58:37 +01:00
Mikaël Capelle 9e4cfaa0f0 Add IOrganizer::onProfileXXX callbacks. 2020-10-24 20:52:52 +02:00
Mikaël Capelle 8b703f2e4f Merge pull request #68 from Holt59/iplugin-setactive-fix
Switch from Qt signals to boost::signals for DownloadManager.
2020-10-21 20:07:55 +02:00
Mikaël Capelle 984a307a04 Merge pull request #69 from Holt59/add-mapping-constructor
Add Mapping constructor.
2020-10-18 12:56:34 +02:00
Mikaël Capelle 2c30cd25cd Add Mapping constructor. 2020-10-18 10:59:57 +02:00
Mikaël Capelle 9ba91b1ffa Switch from Qt signals to boost::signals for DownloadManager. 2020-10-14 18:48:14 +02:00
Mikaël Capelle d53e8de91c Merge pull request #67 from Holt59/imodinterface-seturl
Add IModInterface::setUrl and remove IInstallationManager::setURL.
2020-10-14 18:44:41 +02:00
Mikaël Capelle 702dc6c66f Add IModInterface::setUrl and remove IInstallationManager::setURL. 2020-10-09 20:32:07 +02:00
Mikaël Capelle 9c9d1ee574 Merge pull request #66 from Holt59/add-iprofile-inifilepath
Add IProfile::iniFilePath().
2020-09-27 21:22:34 +02:00
Mikaël Capelle 7a83a472b8 Rename iniFilePath() -> absoluteIniFilePath(). 2020-09-27 20:56:41 +02:00
Mikaël Capelle e4b367e909 Add IProfile::iniFilePath(). 2020-09-27 20:33:30 +02:00
Mikaël Capelle eb5232c1eb Merge pull request #60 from Holt59/fix-ipluginlist-callbacks
Make onPluginStateChanged take a list of plugins.
2020-09-27 14:55:47 +02:00
Jeremy Rimpo eb033c3e9e [skip ci] Use PR branch for umbrella repo (if it exists) 2020-09-25 00:34:18 -05:00
Jeremy Rimpo 28704a8a2e Merge branch 'master' of https://github.com/ModOrganizer2/modorganizer-plugin_python into master 2020-09-24 21:44:34 -05:00
Mikaël Capelle 5a15a374bf Merge pull request #64 from Holt59/plugin-installer-callbacks
Add IPluginInstaller onInstallationStart and onInstallationEnd callbacks
2020-09-23 18:40:24 +02:00
Mikaël Capelle f4478dcf66 Merge remote-tracking branch 'origin/master' into plugin-installer-callbacks 2020-09-23 18:38:25 +02:00
Mikaël Capelle df663f6e4f Merge pull request #63 from Holt59/expose-modinterface-meta
Add getters for most meta-information in mod.
2020-09-23 18:34:24 +02:00
Mikaël Capelle bb522b9126 Add 'reinstallation' parameter to onInstallationStart(). 2020-09-22 22:02:27 +02:00
Mikaël Capelle d549a99867 Change modId() to nexusId(). 2020-09-22 21:13:23 +02:00
Al 44553b4621 Merge pull request #65 from Holt59/imodinterface-clearpluginsettings
Add IModInterface::clearPluginSettings().
2020-09-21 14:42:42 -07:00
Mikaël Capelle 1d51b3c457 Add IModInterface::clearPluginSettings(). 2020-09-21 23:37:30 +02:00
Al 2c0f1006cf Merge pull request #61 from Holt59/iplugin-interface-improvements
Add interfaces for IPlugin::localizedName() and IPlugin::master().
2020-09-21 13:08:54 -07:00
Mikaël Capelle 58d5100dfc Add IPluginInstaller onInstallationStart and onInstallationEnd callbacks. 2020-09-21 21:34:24 +02:00
Jeremy Rimpo e545aec65a Merge branch 'test' into master 2020-09-21 13:26:04 -05:00
Jeremy Rimpo f10194a4bb Revert "Test GH integration"
This reverts commit afe671d4
2020-09-21 10:42:05 -05:00
Jeremy Rimpo afe671d484 Test GH integration 2020-09-21 07:51:33 -05:00
Jeremy Rimpo bfb85087a0 Force exit PS with last exit code after umbrella build error 2020-09-21 05:53:44 -05:00
Jeremy Rimpo b4ae13314c Needs quotes 2020-09-21 05:37:42 -05:00
Jeremy Rimpo c5be2c3605 PowerShell build should fail on error 2020-09-21 05:17:22 -05:00
Jeremy Rimpo 0f33ee2176 Finalize appveyor script update 2020-09-20 22:34:32 -05:00
Jeremy Rimpo 1d2fa7f269 Convert scripts to PowerShell 2020-09-20 19:56:37 -05:00
Jeremy Rimpo c0828f2553 Merge remote-tracking branch 'origin/master' into master 2020-09-20 19:16:23 -05:00
Jeremy Rimpo 847e73a0db Need extra space for second command 2020-09-20 19:11:50 -05:00
Al 1d111cdd8f Merge pull request #62 from Holt59/mod-specific-plugin-settings
Add pluginSetting[s]() and setPluginSetting() to IModInterface.
2020-09-20 12:53:07 -07:00
Mikaël Capelle 5b06bb75a9 Add pluginSetting[s]() and setPluginSetting() to IModInterface. 2020-09-20 21:30:01 +02:00
Mikaël Capelle 04a54c7566 Add getters for most meta-information in mod. 2020-09-20 15:20:22 +02:00
Jeremy Rimpo b96e006e7d Add /bigobj flag to compile options 2020-09-09 19:38:50 -05:00
Mikaël Capelle bfa5c28285 Remove debug logs. 2020-09-06 11:54:55 +02:00
Mikaël Capelle cf6679292f Add interfaces for IPlugin::localizedName() and IPlugin::master(). 2020-09-06 11:44:50 +02:00
Mikaël Capelle 65e73aa537 Fix typo onModStateChanged -> onPluginStateChanged. 2020-09-05 14:49:19 +02:00
Mikaël Capelle 194bba9a9b Make onPluginStateChanged take a list of plugins. 2020-09-05 13:49:11 +02:00
Al 64fd574c3b Merge pull request #59 from Holt59/ipluginlist-setpriority
Add IPluginList::setPriority binding.
2020-09-01 03:59:56 -07:00
Al 93fee5bd6c Merge pull request #58 from Holt59/modlist-setactive-bulk
Fix bindings of IModList::setActive.
2020-09-01 03:59:32 -07:00
Mikaël Capelle accb270353 Add IPluginList::setPriority binding. 2020-08-30 14:03:23 +02:00
Mikaël Capelle d8657946e9 Fix depreciation -> deprecation. 2020-08-30 11:15:31 +02:00
Mikaël Capelle 3780f157e4 Move the storage for deprecated lines in show_depreciation_warnings(). 2020-08-30 10:25:11 +02:00
Mikaël Capelle 7a9cd34878 Update following onModStateChanged + Depreciation warning. 2020-08-29 19:55:06 +02:00
Mikaël Capelle 829ac65cea Fix bindings of IModList::setActive. 2020-08-29 12:59:38 +02:00
isanae 5c34d11e79 Merge pull request #57 from Holt59/fix-imodlist-ipluginlist-callbacks
Add missing onPluginStateChanged binding and missing functor converters.
2020-08-27 12:38:01 -04:00
Mikaël Capelle 6001d88f40 Add missing onPluginStateChanged binding and missing functor converters. 2020-08-27 18:30:22 +02:00
isanae 139666705a Merge pull request #55 from Holt59/fix-ifiletree-copy
Fix IFileTree::copy() bindings.
2020-08-06 09:00:28 -04:00
Mikaël Capelle fed261e9eb Fix IFileTree::copy() bindings. 2020-08-06 11:10:26 +02:00
isanae f531905e4a Merge pull request #54 from Holt59/add-missing-iplugin-bases
Add missing bpy::bases<IPluginX> for some plugin types.
2020-07-28 21:26:13 -04:00
Mikaël Capelle e25fa00285 Add missing bpy::bases<IPlugin> for some plugin types. 2020-07-22 21:23:47 +02:00
isanae 5c63d62a1e Merge pull request #53 from Holt59/add-executableforcedloadsetting-converter
Add executableforcedloadsetting converter
2020-07-20 15:18:42 -04:00
Mikaël Capelle 624c5257bd Add missing converter for QList<ExecutableForcedLoadSetting>. 2020-07-20 19:44:51 +02:00
Mikaël Capelle 480eb3f30e Fix name of default argument in persistent(). 2020-07-20 19:36:58 +02:00
isanae 4909b6cff0 Merge pull request #52 from Holt59/add-arg-names
Add arg names
2020-07-14 12:23:02 -04:00
Mikaël Capelle 331416d1e7 Add binding for IInstallationManager::getSupportedExtensions(). 2020-07-14 16:39:45 +02:00
Mikaël Capelle c955b4e8de Fix argument name for getSaveGameWidget. 2020-07-14 15:00:26 +02:00
Mikaël Capelle 727a55e1a8 Add missing argument names. 2020-07-14 14:36:11 +02:00
Mikaël Capelle 6c1f961d83 Add missing arg names for GuessedString constructor. 2020-07-14 13:33:48 +02:00
Mikaël Capelle a3e9916400 Fix order of overloads for VersionInfo constructors. 2020-07-14 13:21:30 +02:00
Mikaël Capelle 0fbb88b3c1 Add argument names to bindings. 2020-07-14 13:14:53 +02:00
isanae 5023a13aa2 Merge pull request #51 from isanae/ts
updated translations
2020-07-10 12:21:48 -04:00
isanae fe8a0b849c updated translations
disabled translations for plugin_python, identical to pythonrunner
2020-07-10 12:17:45 -04:00
isanae e1a1b70121 Merge pull request #50 from Holt59/add-movariant
Add module variable to fake MoVariant.
2020-06-17 18:08:03 -04:00
Mikaël Capelle 671776f306 Clarify comment for MoVariant export. 2020-06-16 22:12:25 +02:00
Mikaël Capelle 95ed8ae14a Add module variable to fake MoVariant. 2020-06-16 21:57:31 +02:00
isanae e6ca79c694 Merge pull request #49 from Holt59/new-iorganizer-callbacks
Update for new organizer callbacks.
2020-06-16 15:40:04 -04:00
Mikaël Capelle c521178769 Update for new organizer callbacks. 2020-06-15 22:48:21 +02:00
Al 1cbfde96a0 Merge pull request #48 from Holt59/fix-game-plugins-getloadorder
Change getLoadOrder() to return the load order in python.
2020-06-14 15:59:29 -07:00
Mikaël Capelle e7ae48f633 Update getLoadOrder() bindings following game_features change. 2020-06-14 15:31:21 +02:00
Mikaël Capelle d0fd776648 Change getLoadOrder() to return the load order in python. 2020-06-14 14:51:52 +02:00
Al cbdf8fee14 Merge pull request #46 from Holt59/allow-plugins-to-fix-filetree
Update following ModDataChecker change.
2020-06-14 05:48:54 -07:00
Al 5fe9c44f26 Merge pull request #47 from Holt59/executable-forced-load-settings-bindings
Add missing bindings for executableForcedLoads and fix ExecutableInfo.
2020-06-14 05:48:21 -07:00
Mikaël Capelle 3f02f975aa Add missing bindings for executableForcedLoads and fix ExecutableInfo. 2020-06-14 10:52:45 +02:00
Mikaël Capelle b2b0b6f5c5 Missing includes and fix names in bindings. 2020-06-14 00:06:41 +02:00
Mikaël Capelle 6ee58c6bf9 Update following ModDataChecker change. 2020-06-13 23:51:52 +02:00
isanae 2efc6d4af6 Merge pull request #45 from Holt59/fix-exception-transfer-at-startup
Fix Python -> C++ error transfer during plugin creation.
2020-06-13 13:10:04 -04:00
Mikaël Capelle 760cca172f Fix Python -> C++ error transfer during plugin creation. 2020-06-13 19:04:58 +02:00
Al 26c0e628b8 Merge pull request #44 from Holt59/add-ifiletree-copy
Add bindings for IFileTree::copy().
2020-06-13 02:52:10 -07:00
Mikaël Capelle ab4a067042 Add bindings for IFileTree::copy(). 2020-06-12 20:54:52 +02:00
Al 38188e0b17 Merge pull request #43 from Holt59/add-utility-functions
Add bindings for utility functions from uibase.
2020-06-10 04:00:05 -07:00
Mikaël Capelle 863893cc31 Add bindings for utility functions from uibase. 2020-06-09 23:31:25 +02:00
Al 06b11c86ba Merge pull request #40 from Holt59/fix-exceptions-plugin-preview
Fix genFilePreview issue with exceptions not being properly translated to C++.
2020-06-09 05:53:15 -07:00
Al d4a6a57f14 Merge pull request #42 from Holt59/fix-iprofile-invalidationactive
Fix IProfile::invalidationActive
2020-06-08 13:10:17 -07:00
Mikaël Capelle 2ea33f4faa Return a tuple<bool, bool> for IProfile::invalidationActive() to replace the bool* parameter. 2020-06-08 21:45:01 +02:00
Al b4c23ad733 Merge pull request #41 from Holt59/iorganizer-findfiles-glob
Add findFiles overload with glob patterns.
2020-06-08 12:05:26 -07:00
Mikaël Capelle 71db9d81d4 Add findFiles overload with glob patterns. 2020-06-08 18:37:59 +02:00
Mikaël Capelle e712448ca0 Fix genFilePreview issue with exceptions not being properly translated to C++. 2020-06-08 17:54:30 +02:00
Al 98b8d92350 Merge pull request #39 from Holt59/qclass-converter-fix
Fix issue with QClass converter for overloaded functions.
2020-06-08 08:40:46 -07:00
Mikaël Capelle 7cc0f974f5 Use a sequence converter for QStringList instead of a QClass converter. 2020-06-07 17:56:58 +02:00
Mikaël Capelle 48c35a8f92 Switch 0 for nullptr. 2020-06-07 17:01:46 +02:00
Mikaël Capelle 4b9fc2d32a Fix issue with QClass converter for overloaded functions. 2020-06-07 16:54:53 +02:00
Al be63c1d9de Merge pull request #38 from Holt59/set-plugin-setting-signal
Add IOrganizer signal when a plugin setting is changed.
2020-06-07 03:45:50 -07:00
Mikaël Capelle 100a2d03f0 Add IOrganizer signal when a plugin setting is changed. 2020-06-05 16:48:42 +02:00
Al fcd1177acd Merge pull request #37 from Holt59/install-manager-improvements
Installation manager improvements
2020-06-01 13:56:14 -07:00
Mikaël Capelle 5eeb02403f Update bindings after uibase update. 2020-05-30 14:58:50 +02:00
isanae eca495c849 Merge pull request #36 from Holt59/mod-data-content
Add ModDataContent to the python interface.
2020-05-28 23:43:02 -04:00
Mikaël Capelle 024a333194 Update to match game features. 2020-05-27 22:44:32 +02:00
Mikaël Capelle ead37d1dbe Add ModDataContent to the python interface. 2020-05-25 21:24:50 +02:00
Al 65003ef4ad Merge pull request #35 from Holt59/moddatachecker
Minor updates following changes in uibase.
2020-05-23 14:07:30 -07:00
Mikaël Capelle a3b593f714 Remove time() method from FileTreeEntry. 2020-05-23 21:45:05 +02:00
Mikaël Capelle ab4168fd93 Minor updates following changes in uibase. 2020-05-23 17:32:01 +02:00
Al bfad575467 Merge pull request #34 from Holt59/cleaning
Cleaning and improvements
2020-05-22 12:30:48 +02:00
Mikaël Capelle d5f44f424d Add comments for basicWrapperFunction functions. 2020-05-21 23:15:41 +02:00
Mikaël Capelle da679b1d6d Common code for basicWrapperFunction functions. 2020-05-21 23:11:56 +02:00
Mikaël Capelle 751e67e86c Fix issue with Python errors not being retrieved correctly in C++. 2020-05-21 22:08:20 +02:00
Mikaël Capelle c96fe2d21a Add missing qflags converter for ModState. 2020-05-21 17:47:08 +02:00
Mikaël Capelle 4b4c36df7a Add possibility to create multiple plugins object from a single .py file or python module. 2020-05-20 20:52:31 +02:00
Mikaël Capelle 5f9d2b296d Remove usage of getDataFolderName() for ModDataChecker. 2020-05-20 19:53:49 +02:00
Mikaël Capelle 05e79cc13b Merge remote-tracking branch 'origin/master' into cleaning 2020-05-20 18:32:22 +02:00
Al 3f5aa49dee Merge pull request #33 from Holt59/python-module
Allow implementation of python plugin as whole module.
2020-05-20 13:15:46 +02:00
Al 3e9209a191 Merge pull request #32 from Holt59/new-filetree
Update python bindings for UI base change and new filetree implementation
2020-05-20 13:03:39 +02:00
Mikaël Capelle d70942efa1 Rollback to setGameName instead of setGamePlugin for mod interface. 2020-05-19 17:58:44 +02:00
Mikaël Capelle d9393a2d2b Add WalkReturn enumeration. 2020-05-18 16:16:26 +02:00
Mikaël Capelle 7c1389d479 Add ModDataChecker game feature and clean some game-feature related code. 2020-05-16 20:47:41 +02:00
Mikaël Capelle 7333bde006 Add makeTree in moprivate. 2020-05-16 17:37:57 +02:00
Mikaël Capelle fae9f1b52f Allow None value from python in functor converter. 2020-05-16 17:37:41 +02:00
Mikaël Capelle 23c6f3fad9 Better arity check for functor converter. 2020-05-16 17:37:22 +02:00
Mikaël Capelle f12bb05d61 Update python version to 3.8. 2020-05-14 23:24:38 +02:00
Mikaël Capelle d931d71a43 Translate failure in exceptions for some IFileTree methods. Add IFileTree::walk. 2020-05-14 23:18:23 +02:00
Mikaël Capelle aa75c3b18e Add .feature() method to the Python interface of IPluginGame. 2020-05-13 17:35:33 +02:00
Mikaël Capelle eb29202b2f Use UPPER_CASE for enumeration values (kept non-uppercase for backward compatibility). 2020-05-13 15:55:05 +02:00
Mikaël Capelle fe0a75b819 Add to-python converter for QVariant holding QStringList. 2020-05-13 15:35:50 +02:00
Mikaël Capelle 90a99b37c9 Add missing override annotation and use using to bring invalidate in public scope. 2020-05-13 14:34:17 +02:00
Mikaël Capelle 7c474c58ca Add small comments. 2020-05-13 14:33:15 +02:00
Mikaël Capelle 288f9f9a95 Rename IModRepositoryBridge to be consistent with other interfaces. 2020-05-12 19:25:57 +02:00
Mikaël Capelle a05006a0b3 Allow implementation of python plugin as whole module. 2020-05-11 23:51:58 +02:00
Mikaël Capelle d6b8c66911 Move include directive where they should be. 2020-05-11 23:40:06 +02:00
Mikaël Capelle 0c52c2417c Remove unused global variable. 2020-05-11 23:39:55 +02:00
Mikaël Capelle 24205bba66 Remove useless wrappers. 2020-05-11 23:36:35 +02:00
Mikaël Capelle f0f949c4ef Remove ModRepositoryBridgeWrapper since it is not needed anymore. 2020-05-11 23:26:29 +02:00
Mikaël Capelle 6b88cee9d8 Remove useless includes. 2020-05-11 23:26:06 +02:00
Mikaël Capelle 1825c58666 Remove comment. 2020-05-11 23:18:44 +02:00
Mikaël Capelle 83a89ca595 Move utils::register_ at the top of the module definition. 2020-05-11 23:16:51 +02:00
Mikaël Capelle e9fdfd40aa Add comment for Q_DELEGATE. 2020-05-11 23:02:08 +02:00
Mikaël Capelle fcf1aa8b42 Move converter to a dedicate file. Add Q_DELEGATE for QObject-derived wrappers. 2020-05-11 23:00:29 +02:00
Mikaël Capelle d404a37fed Add/fix bindings for ISaveGame and ISaveGameInfoWidget. 2020-05-10 16:01:14 +02:00
Mikaël Capelle b360cae555 Add missing include in error.h. 2020-05-10 15:57:46 +02:00
Mikaël Capelle 039e33f5fa Minor clean and first try for ISaveGameInfoWidget. 2020-05-09 23:30:10 +02:00
Mikaël Capelle 622d4246a7 Clean some comments. 2020-05-09 21:32:23 +02:00
Mikaël Capelle 2f1646a2e6 Remove HANDLE_converters since it is not used anymore and did not really work. 2020-05-09 21:27:00 +02:00
Mikaël Capelle 716cbcf733 More cleaning. 2020-05-09 21:16:30 +02:00
Mikaël Capelle 62f10c03ff Temporary commit. 2020-05-09 21:13:45 +02:00
Mikaël Capelle 957b786d8c Start cleaning interfaces. 2020-05-09 18:19:31 +02:00
Mikaël Capelle 29a5eb8366 Remove wrong static_assert(). 2020-05-07 00:19:11 +02:00
Mikaël Capelle 4209d90533 Remove left-out method not implemented. 2020-05-06 22:08:25 +02:00
Mikaël Capelle 7bbf05bc0c Apply appendIfInstance for each class separately. 2020-05-06 12:51:27 +02:00
Mikaël Capelle 154c643bff Replace TRY_PLUGIN_TYPE with a more modern C++ variant. 2020-05-05 17:52:54 +02:00
Mikaël Capelle 2146cc9207 Fix wrapper for custom installer. 2020-05-04 20:17:02 +02:00
Mikaël Capelle 163ed213ef Update the install() bindings to allow more flexibility and be easier to use. 2020-05-04 20:09:24 +02:00
Mikaël Capelle 6919539d35 Remove left-out comment. 2020-05-04 18:40:53 +02:00
Mikaël Capelle 917b8dfb4b Slight modification for tuple and variant registers using C++17 fold expressions. 2020-05-04 01:58:56 +02:00
Mikaël Capelle 54e447c0a9 Switch from boost variant/tuple to std. 2020-05-04 01:47:30 +02:00
Mikaël Capelle 206454c34e Remove makeTree that was meant for testing purpose. 2020-05-03 23:16:58 +02:00
Mikaël Capelle 457529546b Add a bit of documentation to register functions. 2020-05-03 21:01:43 +02:00
Mikaël Capelle b9de35772f Clean sequence converters. 2020-05-03 20:57:50 +02:00
Mikaël Capelle 4589cab093 Add missing std::vector register for installation manager. 2020-05-03 20:19:25 +02:00
Mikaël Capelle 2b4eedb62b Clean std::set/std::vector from/to python conversions. 2020-05-03 20:17:49 +02:00
Mikaël Capelle 36022774e3 Add methods to utils to register map, vector and set. 2020-05-03 20:17:14 +02:00
Mikaël Capelle aac45a39e2 Make register_variant work for all variant types. 2020-05-03 20:16:57 +02:00
Mikaël Capelle 61ad2ef2b6 Clean bindings for IFileTree and FileTreeEntry. 2020-05-03 18:27:26 +02:00
Mikaël Capelle 1ea006b74e Add bindings for FileInfo. 2020-05-03 18:26:27 +02:00
Mikaël Capelle af37a451f9 Better variant handling for IFileTree::merge. 2020-05-03 18:26:11 +02:00
Mikaël Capelle 473cef6217 Add utility package with register_map for std::map. 2020-05-03 18:25:35 +02:00
Mikaël Capelle 5cd7917709 Add to_python to register_variant.h. 2020-05-03 18:25:16 +02:00
Mikaël Capelle 585296d527 Fix issue with shared pointer being registered twice. 2020-05-03 18:24:32 +02:00
Mikaël Capelle 221949f48b Fix issue with Functor_converter when return type was not bool or void. 2020-05-03 13:39:04 +02:00
Mikaël Capelle 8b118ad898 Better handling of boost::variant. 2020-05-03 13:38:47 +02:00
Mikaël Capelle f83ed39287 Modify FileTypes enumeration for FileTreeEntry. 2020-05-03 12:57:23 +02:00
Mikaël Capelle 8a286f9cfc Change Functor_converter to use a function-type template argument. 2020-05-03 12:57:01 +02:00
Mikaël Capelle 70172ddda6 Add possibility to create GuessedString from python. 2020-05-02 15:34:06 +02:00
Mikaël Capelle 817f8d7238 Fix variants() method of GuessedValue. 2020-05-02 15:05:24 +02:00
Mikaël Capelle 9f5dab285d Fix return_value_policy for methods returning QWidget. 2020-05-02 15:04:44 +02:00
Mikaël Capelle 53b91f0092 Update exposed method names for installer to be consistent with others. 2020-05-02 13:28:08 +02:00
Mikaël Capelle f1d5a1f31b Improve GuessedValue binding and switch to upper-case for enumerations in Python. 2020-05-02 13:22:55 +02:00
Mikaël Capelle 626a7bc670 Update python bindings for tree to be consistent with others. 2020-05-02 13:22:34 +02:00
Mikaël Capelle c9115e7ad0 Add python interface for IPluginInstallerSimple. 2020-05-02 00:30:17 +02:00
Mikaël Capelle 6cececc7a0 Fix issue with default QDateTime() throwing error. 2020-05-01 21:32:30 +02:00
Mikaël Capelle d82640455f Update wrappers and expose the new file tree interface. 2020-05-01 21:32:08 +02:00
Mikaël Capelle f25602cc69 Update the wrapper and the python interface after change to IModInterface. 2020-05-01 21:30:31 +02:00
Silarn 168b9d7b0d Appveyor CMAKE fix 2020-05-01 04:59:02 -05:00
isanae 247944baa8 Merge pull request #31 from isanae/new-cmakefiles
New cmakefiles
2020-04-26 02:53:56 -04:00
isanae 332b8239bb unused 2020-04-25 00:51:20 -04:00
isanae 97a93a5989 now using new cmakefiles 2020-04-25 00:51:14 -04:00
Al e871617843 Merge pull request #30 from AnyOldName3/threadsafe
Make runner threadsafe again
2020-04-17 14:41:38 +02:00
AnyOldName3 c5d4857f47 Make functor converter variadic
Duplicating code three times is silly.
2020-04-16 00:56:57 +01:00
AnyOldName3 5825661a4f Only initialise Python once
When switching instances, the Python runner gets another initPython call, despite the previous interpreter existing. Most of the function was either a no-op or was redundant, and the GIL state got confusing. This is the simplest fix.

If things catch fire that I haven't anticipated, instead of returning true, we can destroy the pre-existing interpreter and create a new one by running the rest of the function.
2020-04-16 00:53:29 +01:00
AnyOldName3 2e13cf0dab Ensure we relinquish the GIL after initialising Python and have it when destroying callables 2020-04-15 17:01:28 +01:00
Chris Bessent d6dd0342b7 Merge pull request #29 from ModOrganizer2/2_2_2
Pull in 2.2.2.1 changes
2020-01-13 23:05:28 -07:00
Chris Bessent 67abab0779 Merge pull request #28 from ModOrganizer2/Develop
Stage for release 2.2.2
2020-01-06 05:11:19 -07:00
Silarn b0ef81214a Fix cmakelists and use zip 2019-10-29 01:35:15 -05:00
Silarn b2ae43a0e5 Add lightPluginsAreSupported to the wrapped game plugin functions 2019-10-19 02:28:01 -05:00
LostDragonist 52dd7454be Update version 2019-10-06 17:22:09 -05:00
LostDragonist 059dc8b9d2 Report plugin as active even if failed
This is required for the plugin to report notifications.  This
behavior was changed in the main MO program at some point.
2019-10-06 17:20:53 -05:00
Silarn b8bcecbed4 Update Appveyor to official VS 2019 image 2019-09-28 00:41:47 -05:00
Jeremy Rimpo 42e559b59c Merge pull request #26 from ModOrganizer2/Develop
Stage for release 2.2.1
2019-07-22 01:02:42 -05:00
Jeremy Rimpo b7d343a8dd Merge pull request #27 from AnyOldName3/message-forwarding
Message forwarding
2019-07-22 00:56:29 -05:00
AnyOldName3 63a6c504b0 Restore logging of historically-logged Python exceptions. 2019-07-22 00:08:35 +01:00
AnyOldName3 19dcdd95c0 Prevent PyQt from using its buggy exception logging by making it look like we're using custom exception handling. 2019-07-15 20:04:44 +01:00
AnyOldName3 ac5540ba87 Forward Python stdout and stderr to qDebug and qCritical 2019-07-15 20:02:18 +01:00
Silarn 0708bdedbf Improve error parser for _C_API loader 2019-07-02 12:33:18 -05:00
Silarn 2b6f453fbc Add better error handling when loading the SIP API 2019-07-01 22:19:14 -05:00
Brian Munro 4f86e542cc Merge pull request #25 from AnyOldName3/sip-transfer-fix
Correctly use SIP to transfer ownership of objects from Python to C++
2019-06-01 09:02:05 +02:00
AnyOldName3 e280b07cb6 Correctly use SIP to transfer ownership of objects from Python to C++ 2019-06-01 00:59:39 +01:00
Silarn 0c11e75f0f Set optimization for release builds 2019-05-22 02:04:22 -05:00
Silarn ab72c2f42f Fix artifact paths 2019-05-22 01:07:13 -05:00
Silarn cbe679aad8 Add logs to build artifacts on CI fail, commit translation changes 2019-05-21 23:46:06 -05:00
Silarn 59e5f1acf2 Switch to local build files as appveyor can't use installed files 2019-05-21 02:27:58 -05:00
Silarn d0598cd849 Unify artifacts source path to install path 2019-05-21 01:37:18 -05:00
Silarn 174abb3cea Enable parallel building 2019-05-09 02:10:42 -05:00
Silarn dee8825960 Set appveyor image to VS 2019 Preview 2019-05-08 23:10:34 -05:00
LostDragonist 46a4ee8653 Merge pull request #24 from ModOrganizer2/Develop
Stage for Release 2.2.0
2019-05-03 21:09:18 -05:00
Brian Munro 4721ab35df Merge pull request #23 from ModOrganizer2/Appveyor
Support Appveyor.
2019-04-29 14:18:19 +02:00
LePresidente 352e5c2103 Fixed artifacts for proxy_python. 2019-04-29 14:07:19 +02:00
LePresidente 78278ae57d Support Appveyor. 2019-04-29 10:30:47 +02:00
LostDragonist 3eb85cd17f Update for startApplication 2019-03-24 21:28:13 -05:00
Brian Munro 208965b96d Merge pull request #22 from ModOrganizer2/Appveyor
Removed unneeded cmake variables due to that umbrella handles them co…
2019-03-09 20:20:01 +02:00
LostDragonist c17d703b15 Add function for tracking status 2019-03-07 11:20:59 -06:00
LostDragonist 65eb0c6374 Add function to get configured mods directory 2019-02-23 07:11:19 -06:00
LostDragonist 97a20d522a Add setGameName to the mod interface 2019-02-22 22:16:17 -06:00
Silarn caee1fb7f6 Change to uibase requires Qt5Network linkage 2019-02-18 21:40:12 -06:00
Silarn bab649af43 Update to support API changes to uibase 2019-02-18 21:40:12 -06:00
Brian Munro 30ab7b8e14 Removed unneeded cmake variables due to that umbrella handles them correctly.
Requires testing.
2019-02-12 21:37:41 +02:00
LostDragonist 956d481ca4 Make logs more consistent in format and content 2019-01-30 20:53:48 -06:00
LostDragonist 41a4f273d6 Support for force loading libraries 2019-01-11 01:39:05 -06:00
LostDragonist 66391098b6 Update version to 2.0.1.0 2019-01-05 16:43:30 -06:00
LostDragonist c9d77cf948 Change qPrintable to qUtf8Printable to better support non-ASCII text 2019-01-05 16:34:11 -06:00
LostDragonist b939f7e88e Add enumerations for plugin states and mod states 2018-12-21 02:30:58 -06:00
LostDragonist be6b102599 Merge pull request #21 from ModOrganizer2/Develop
Stage for release 2.1.6
2018-12-20 13:58:41 -06:00
LostDragonist a1bc87e75a Fix the crash in a better, non-leaky way 2018-12-17 17:56:24 -06:00
LostDragonist 4160dea823 Convert a crash when converting strings to QStrings to possibly a memory leak 2018-12-16 18:27:45 -06:00
LostDragonist 1bd5dda7d8 Update version to 2.0.0.0 2018-12-12 02:14:02 -06:00
LostDragonist 9780aeb477 Improve refresh of data when changing profile settings 2018-12-08 00:12:09 -06:00
LostDragonist f6d41a1a81 Update for archive invalidation changes 2018-12-05 06:34:30 -06:00
Al 69ff972b12 Merge pull request #20 from AnyOldName3/settable-plugin-settings
Fix typo preventing IOrganizer::setPluginSetting from being used in P…
2018-09-25 20:28:15 +02:00
Al ada342e818 Merge pull request #19 from AnyOldName3/qvariant-from-unicode
Add missing PyUnicode_Check which prevented QVariants being created f…
2018-09-25 20:27:58 +02:00
AnyOldName3 051c14fe72 Add working version of IOrganizer::waitForApplication (#18) 2018-09-25 20:27:23 +02:00
AnyOldName3 f841a3b13a Add support for the default (invalid) QVariant 2018-09-19 22:52:40 +01:00
AnyOldName3 60701b6ba0 Add forgotten PyDict_Check 2018-09-19 22:36:11 +01:00
AnyOldName3 a8cf8d45f3 Fix typo preventing IOrganizer::setPluginSetting from being used in Python 2018-09-19 22:16:50 +01:00
AnyOldName3 84c04c32dc Add missing PyUnicode_Check which prevented QVariants being created from Python 3 strings 2018-09-19 21:45:42 +01:00
Al 6ce4138b31 Add new function wrapper for archive conflicts (#17) 2018-09-09 23:28:53 +02:00
Silarn d1f6766e16 Allow installs to pass Mod ID through (fixes NCC installs losing ID) 2018-09-09 04:20:21 -05:00
LostDragonist aa2b0744f7 Update for changes to local save game class 2018-08-26 17:55:31 -05:00
Jeremy Rimpo f1997b4788 Merge pull request #15 from ModOrganizer2/python3
Migrate to python 3.7
2018-08-23 11:48:07 -05:00
Brian Munro 423e6f8842 Merge pull request #14 from Modorganizer2/Develop
Stage for 2.1.5 release
2018-08-21 12:11:25 +02:00
Silarn b5b547e041 Changes to compile and run with python3 (WIP) 2018-08-20 19:01:18 -05:00
Silarn 61977d6149 Remove archive conflict code from python 3 branch 2018-08-20 19:00:06 -05:00
Silarn fbf59519c0 Fix to use modularized sip API and embedded python libs 2018-08-20 18:49:15 -05:00
Silarn 08bcebe19c Changes to compile and run with python3 (WIP) 2018-08-20 18:49:15 -05:00
LostDragonist 4900135130 Merge pull request #13 from AnyOldName3/free-plugin-support
Add support for free plugins which don't implement any specialised interface
2018-08-15 15:41:55 -05:00
AnyOldName3 b70fa8174e Add support for free plugins which don't implement any specialised interface 2018-08-15 15:34:08 +01:00
Brian Munro 437d89fc04 Merge pull request #12 from Modorganizer2/Develop
Stage for 2.1.3 release
2018-05-08 12:20:04 +02:00
Silarn 51b59de04d Changes to allow installer_NCC to use the game source set in the DL meta 2018-05-07 01:28:59 -05:00
Silarn 19015289cb Updating gitignore 2018-05-04 00:28:40 -05:00
Silarn e004b56dc9 Fit primarySources to new wrapper method 2018-05-03 22:32:31 -05:00
Jeremy Rimpo fba18c2b96 Merge pull request #11 from AnyOldName3/reusable-wrapper-template
Helpful error message and reduce code duplication
2018-05-03 20:49:05 -05:00
AnyOldName3 00c38f5f03 Remove superfluous template parameter specification to shrink lines to a more readable length. 2018-05-03 22:22:32 +01:00
AnyOldName3 8919fbd351 Use new template for game features wrappers. 2018-05-03 22:19:55 +01:00
Silarn 6a3a257ecd Allow for primary game sources and marking mods as converted/working 2018-05-03 16:17:39 -05:00
AnyOldName3 ec4945db3e Use new template for (non-pointless) uibase wrappers. 2018-05-03 22:02:06 +01:00
AnyOldName3 9f975b92b2 Create template for wrapper functions and add helpful error message. Use this for plugin wrappers. 2018-05-03 21:56:23 +01:00
Jeremy Rimpo 17c86ef540 Merge pull request #10 from AnyOldName3/proxy-multiple-inheritance-support
Return a plugin as multiple (differently-typed) instances to work aro…
2018-05-02 14:02:13 -05:00
AnyOldName3 7ab4b71ed3 Return a plugin as multiple (differently-typed) instances to work around multiple inheritance issues 2018-05-02 17:24:09 +01:00
Jeremy Rimpo 61ecb68918 Merge pull request #9 from AnyOldName3/implement-more-interfaces-2
Implement more interfaces
2018-05-01 18:25:53 -05:00
AnyOldName3 94886104f3 Prevent the C++ part of PyQt objects being deleted while the Python component is still accessible. 2018-05-02 00:19:29 +01:00
AnyOldName3 902024e508 Add Game Features support 2018-04-25 17:25:12 +01:00
AnyOldName3 0a9b4b9fc4 Change the capitalisation of sipapiaccess.h to make it consistent with other files 2018-04-22 15:39:09 +01:00
AnyOldName3 028c14a951 Add missing include guard to sipApiAccess.h 2018-04-22 15:37:29 +01:00
AnyOldName3 bf8f427cd8 Move sipAPI getter function to a shared header so it isn't duplicated. 2018-04-22 00:59:42 +01:00
AnyOldName3 8fe091ab48 Implement IPluginProxy bindings. 2018-04-22 00:34:59 +01:00
AnyOldName3 8877fee4fa Implement IpluginModPage bindings. 2018-04-20 16:40:39 +01:00
AnyOldName3 f13a5961df Align ModRepositoryFileInfo indentation 2018-04-20 16:40:39 +01:00
AnyOldName3 7b6ca76dec Handle conversion for types IPluginModPage depends on 2018-04-20 16:40:39 +01:00
AnyOldName3 a35208d902 Improve QVariant conversion and generalise QMap conversion 2018-04-20 16:40:39 +01:00
AnyOldName3 4feb06a099 Add IPluginFileMapper Wrapper and bindings. 2018-04-20 16:40:39 +01:00
AnyOldName3 0abbab9f8c Add missing parts of IOrganizer bindings 2018-04-20 16:40:39 +01:00
AnyOldName3 86d859d430 Allow anonymous Python functions to return values 2018-04-20 16:40:38 +01:00
AnyOldName3 5a730941db Implement wrapper and bindings for IPluginDiagnose 2018-04-20 16:40:38 +01:00
AnyOldName3 c70f78adfe Reduce code duplication by moving common implementation to macros 2018-04-20 16:40:38 +01:00
AnyOldName3 e8af8819df Add PYCATCH missed when rebasing 2018-04-20 16:40:38 +01:00
AnyOldName3 de809c6d57 Fix simple errors with IPluginGame proxy and add warning when the unimplemented part is encountered 2018-04-20 16:40:38 +01:00
AnyOldName3 01168483c5 handle errors in Python game plugins 2018-04-20 16:40:38 +01:00
AnyOldName3 317f13177e Move IPluginGameWrapper's mentod implementations into the cpp file 2018-04-20 16:40:38 +01:00
AnyOldName3 c47b94d534 Restore indentation which rearraging things broke 2018-04-20 16:40:38 +01:00
AnyOldName3 ca51a53d41 Make IPluginGameWrapper into a class and include the necessary Qt annotations 2018-04-20 16:40:38 +01:00
AnyOldName3 9722d5b093 Move IPluginGameWrapper to proxypluginwrappers.h as it's a wrapper for a plugin. 2018-04-20 16:40:38 +01:00
AnyOldName3 2df983e22c Create ExecutableInfo interface 2018-04-20 16:40:38 +01:00
AnyOldName3 52417d64e4 Implement missing handling for QFileInfo 2018-04-20 16:40:38 +01:00
AnyOldName3 4a558d4caf Implement from_python handling for QStringList 2018-04-20 16:40:38 +01:00
AnyOldName3 8dd9a710b4 Replace wrong QDir converter 2018-04-20 16:40:38 +01:00
AnyOldName3 377199f233 Put plugin wrappers in alphabetical order 2018-04-20 16:40:38 +01:00
Silarn 18a73c2f54 Remove remnants of QtScript and fix some CMake issues 2018-04-19 01:43:57 -05:00
Silarn fba28bb9ab Add SortMechanism check 2018-04-18 03:30:09 -05:00
Silarn cdbc0f3bdb Support for multi-game downloads 2018-04-16 13:07:56 -05:00
Silarn ffbd4e3f11 Support for multi-game downloads 2018-04-16 12:51:40 -05:00
Jeremy Rimpo e1ba01777d Merge pull request #8 from AnyOldName3/version-info-missing-parts
Add missing comparison operators and functions for MOBase::VersionInfo
2018-04-13 12:44:29 -05:00
Jeremy Rimpo 9cbb35d354 Merge pull request #7 from AnyOldName3/cleanup
Cleanup dead code & update .gitignore
2018-04-13 12:43:44 -05:00
Brian Munro abff0e890d Merge pull request #6 from Modorganizer2/Develop
Merge to Master for Release
2018-04-13 08:44:06 +02:00
Jeremy Rimpo c076d7a8bb Remove extraneous search code 2018-04-13 00:38:21 -05:00
AnyOldName3 e277c9b56b Add missing comparison operators and functions for MOBase::VersionInfo 2018-04-12 01:16:27 +01:00
AnyOldName3 d8ad6569ba remove dead include 2018-04-11 17:27:23 +01:00
AnyOldName3 e08b8be570 Remove dead code 2018-04-11 17:12:27 +01:00
AnyOldName3 aca861194d Update .gitignore with msbuild stuff 2018-04-11 17:10:55 +01:00
Silarn fdffe6f277 Prep for Qt 5.11 (backward-compatible) 2018-04-10 23:28:32 -05:00
Silarn 341daf5c5f Fix up CMAKE to use /MP and allow building through umbrella 2018-04-07 17:12:21 -05:00
Jeremy Rimpo b272bd12fe Merge pull request #5 from Modorganizer2/LePresidente-patch-1
Fixed typo causing compilation to fail
2018-03-19 13:33:10 -05:00
Brian Munro d6b673f149 Fixed typo causing compilation to fail
Fixed typo causing compilation to fail
2018-03-19 11:05:00 +02:00
Jeremy Rimpo 81ec421adb Merge pull request #4 from AnyOldName3/better-qflags-support
Better QFlags support
2018-03-17 00:02:12 -05:00
AnyOldName3 f3fa0baa41 Make indentation consistent 2018-03-17 00:35:59 +00:00
AnyOldName3 9a3465cc7a Register converters for all remaining uses of QFlags in the Python wrappers 2018-03-17 00:19:45 +00:00
AnyOldName3 277a2862b1 Make QFlags conversion bidirectional and register the converter for more uses of QFlags 2018-03-17 00:05:17 +00:00
Jeremy Rimpo 046e080943 Merge pull request #3 from AnyOldName3/register-missing-functions
Register some functions which Tannin created wrappers for, but omitte…
2018-03-16 13:28:41 -05:00
AnyOldName3 af7823b920 Register some functions which Tannin created wrappers for, but omitted to make accessible from Python 2018-03-16 17:03:48 +00:00
Jeremy Rimpo d408512a2c Merge pull request #2 from AnyOldName3/full-unicode-support
Allow conversion of any unicode sequence into a QString
2018-03-15 22:25:04 -05:00
AnyOldName3 10437e0aca Allow conversion of any unicode sequence into a QString 2018-03-16 00:32:21 +00:00
Al c6e8a223e1 Merge pull request #1 from AnyOldName3/unicode-support
Add support for converting Python unicode strings to QStrings
2018-03-15 23:26:31 +01:00
AnyOldName3 425ec8df5a Add support for converting Python unicode strings to QStrings 2018-03-15 21:21:23 +00:00
Jeremy Rimpo 39e17ebbe3 Merge pull request #6 from Silarn/mainline_dev
Allow getLauncherName to be overridden
2017-12-12 15:44:01 -06:00
Jeremy Rimpo fc0a257b51 Allow getLauncherName to be overridden 2017-12-12 12:41:28 -06:00
Brian Munro fe87c841a8 Merge pull request #5 from Silarn/mainline_dev
Add QDir and required function to pythonrunner to fix missing definition
2017-12-08 19:40:40 +02:00
Jeremy Rimpo 705d423839 Add QDir and required function to pythonrunner to fix missing definition 2017-12-08 02:41:53 -06:00
Brian Munro 9dff2ab02e Merge pull request #4 from Silarn/mainline_dev
Add CCPlugins support
2017-12-03 07:51:57 +02:00
Jeremy Rimpo 1bc41a72b4 Add CCPlugins support 2017-11-18 12:28:36 -06:00
Brian Munro d212bff9e9 Merge pull request #3 from Silarn/mainline_dev
Fix bind failure due to function overload and move to std bind (MSVC 2017 - Boost 1.65.1)
2017-11-05 17:26:29 +02:00
Jeremy Rimpo 85cb9b18e4 Fix bind failure due to function overload and move to std bind 2017-11-05 03:49:56 -06:00
LePresidente 6a5ab7f747 Updated cmakelists to get the QT5 location from the QT_ROOT variable, instead of expecting it in DEPENDENCIES_DIR. 2017-09-21 16:48:15 +02:00
Brian Munro 539b068b71 Merge pull request #2 from Hugues92/master
Cannot override basePath as it is not present in parent class
2017-03-29 07:35:28 -07:00
Hugues92 96dbb56467 Cannot override basePath as it is not present in parent class 2017-03-22 23:22:38 +01:00
Brian Munro ea408a05af Merge pull request #1 from ZachHaber/master
Adding basePath to python plugins
2017-01-17 20:23:22 -08:00
ZachHaber fa66025024 Adding basePath to python plugins
Adds the virtual function override to the boost python wrapper.
2017-01-17 17:05:22 -06:00
LePresidente 3e61a88abb added if statement to allow to build on msvc2013 2016-12-12 05:13:08 -08:00
lepresidente 828e35a129 changes required by adding gameNexusName to uibase. 2016-12-04 17:52:43 +02:00
lepresidente cc58ccc992 Fixed cmake python location.
Fixed build issue with VS2015.
2016-11-27 16:54:19 +02:00
Tannin aa37f30c68 bugfix: invalid return type in python api 2016-06-06 20:27:29 +02:00
Tannin f9353e4da0 translation 2016-06-04 20:39:14 +02:00
Tannin 9a310229e7 updated wrappers to current api 2016-05-06 22:45:52 +02:00
Tannin a78db4cbdc Merge branch 'ThosRTanner-issue/418' 2016-02-10 18:55:43 +01:00
Tannin 9502ea561e Merge branch 'issue/418' of https://github.com/ThosRTanner/modorganizer-plugin_python into ThosRTanner-issue/418
Conflicts:
	src/runner/uibasewrappers.h
2016-02-10 18:55:18 +01:00
Tannin 179deda6e4 Merge branch 'ThosRTanner-master' 2016-02-10 18:52:48 +01:00
Tannin fa85cc89d3 Merge branch 'master' of https://github.com/ThosRTanner/modorganizer-plugin_python into ThosRTanner-master
Conflicts:
	src/runner/uibasewrappers.h
2016-02-10 18:52:20 +01:00
Tannin ee31647014 minor cleanup 2016-02-09 19:34:09 +01:00
Thomas Tanner 4bb0994d71 Merge branch 'master' into issue/418 2016-01-24 15:57:54 +00:00
Thomas Tanner 4b8b75e641 Removing the 'get' in all function names and making FO4 plugin build
Merge branch 'master' of https://github.com/TanninOne/modorganizer-plugin_python

# Conflicts:
#	src/runner/uibasewrappers.h
2016-01-24 15:23:30 +00:00
Tannin 2fcb932e16 allow for game plugins to be written in python 2016-01-10 19:50:19 +01:00
Tannin 40192cb583 Merge branch 'master' of https://github.com/TanninOne/modorganizer-plugin_python 2015-12-28 14:35:43 +01:00
Tannin 163e3d4544 removed get-prefix from many getters 2015-12-28 14:35:35 +01:00
TanninOne a65763fb58 fixes to build system 2015-12-28 13:46:31 +01:00
Thomas Tanner d144d7c97b Fix const correctness 2015-12-26 15:47:50 +00:00
Thomas Tanner de99a71085 Merge branch 'master' into issue/418 2015-12-26 15:26:41 +00:00
Thomas Tanner 9bdb48c6bc Merge remote-tracking branch 'refs/remotes/TanninOne/master' into issue/418 2015-12-26 15:04:13 +00:00
Thomas Tanner a20b166290 Restore start download file method (3 of 3) 2015-12-20 22:25:45 +00:00
Thomas Tanner d1b2259cc5 For TanninOne/modarganizer#418
Changes to support getting list of mods / esps to activate from game plugin
2015-12-19 20:49:30 +00:00
Tannin 4bb048aa67 Merge branch 'master' of https://github.com/TanninOne/modorganizer-plugin_python
Conflicts:
	src/runner/pythonrunner.cpp
	src/runner/uibasewrappers.h
2015-12-06 20:58:22 +01:00
Tannin 0b53e86e5a updated python api 2015-12-06 20:55:36 +01:00
Thomas Tanner 9077573b9d Merge remote-tracking branch 'refs/remotes/TanninOne/master' 2015-12-06 18:08:43 +00:00
TanninOne 0fa436fc0f Merge pull request #5 from ThosRTanner/issue/344
Issue 344
2015-12-06 18:44:14 +01:00
Thomas Tanner d75eda53fc Merge remote-tracking branch 'TanninOne/master' into issue/344 2015-12-06 17:31:13 +00:00
Thomas Tanner a71566122e Merge remote-tracking branch 'TanninOne/master' into issue/344
# Conflicts:
#	src/runner/pythonrunner.cpp
#	src/runner/uibasewrappers.h
2015-12-06 17:31:02 +00:00
TanninOne 69b988eede Merge pull request #1 from ThosRTanner/issue/308
View web pages from non-nexus installs (3 of 4)
2015-12-06 17:56:42 +01:00
Thomas Tanner c106d6f342 Merge remote-tracking branch 'TanninOne/master' 2015-12-06 16:22:27 +00:00
Thomas Tanner 4a6f8e84f4 work through build issues 2015-12-06 16:13:29 +00:00
TanninOne efc0b1962f Merge branch 'ThosRTanner-issue/344' 2015-12-06 16:24:22 +01:00
TanninOne 8f408a77d2 Merge branch 'issue/344' of https://github.com/ThosRTanner/modorganizer-plugin_python into ThosRTanner-issue/344 2015-12-06 16:23:29 +01:00
Thomas Tanner dccc265364 Merge remote-tracking branch 'TanninOne/master' 2015-12-06 14:56:14 +00:00
TanninOne aa9c6ead94 Merge pull request #4 from ThosRTanner/issue/356
Refactor gameinfo & 'shared' library to use game plugins (7 of 17)
2015-12-06 13:21:25 +01:00
Thomas Tanner f94f37b635 Merge remote-tracking branch 'refs/remotes/TanninOne/master' into issue/356
Conflicts:
	src/runner/pythonrunner.cpp
2015-12-05 12:48:39 +00:00
Thomas Tanner 9fdcde3bd5 Merge remote-tracking branch 'TanninOne/master' into issue/344 2015-12-05 10:33:09 +00:00
Thomas Tanner 11c92e7e96 Merge remote-tracking branch 'refs/remotes/TanninOne/master' 2015-12-05 10:02:16 +00:00
Thomas Tanner 287a82ed48 Most of work for savegame 2015-12-05 06:51:41 +00:00
Thomas Tanner c9299bb623 Addition of directory validity check to IPluginGame API 2015-11-28 14:48:28 +00:00
Tannin 7d6d51b213 fixed build scripts and added fallout 4 support 2015-11-28 10:58:49 +01:00
Thomas Tanner e60121b21f Renamed getNexusName to getGameShortName as previously because it hopefully isn't too nexus related. 2015-11-26 21:17:06 +00:00
Thomas Tanner 7f7a3fb1ca Replaced the IPluginGame getNexusDisplayURL with some APIs in NexusInterface
It makes more sense to have them here as they have very little to do with the game, more to do with the origin of the mod.
2015-11-26 21:03:23 +00:00
Thomas Tanner 9ba337ef17 Remove the getNexusManagementURL as it is a property of how you talk to nexus, not the game 2015-11-26 17:45:30 +00:00
Thomas Tanner 1455bda2f8 Sigh - python wrapper version of the 2 URL fetch functions 2015-11-26 07:40:53 +00:00
Thomas Tanner cc62f15cc8 Replace GameInfo::getNexusModID with IPluginGame::getNexusModOrganizerID()
Also implement IPluginGame::getNexusGameID() but not hooked it in yet.
2015-11-24 16:16:10 +00:00
Thomas Tanner 0b9a56fa7a Replace GameInfo::getLoadorderMechanism with IPluginGame::getLoadOrderMechanism 2015-11-24 14:20:47 +00:00
Thomas Tanner fc8f6c77bc Remove most instances of GameInfo::getname, and transfer getDLCPlugins to the plugingame interface
Also removed startDownloadNextFile as it doesn't appear to be used anywhere
2015-11-23 18:34:04 +00:00
Thomas Tanner 55e9c9c7b6 Final eradication of igameinfo and adding python wrappers for IPluginGame 2015-11-22 21:18:12 +00:00
Thomas Tanner 47e25da95e Removes igameinfo.h from everywhere apart from (sort of) the pythonrunner plugin. 2015-11-22 08:42:42 +00:00
Thomas Tanner cb5d3b4e62 Replace GameInfo::path with iPluginGame::gameDirectory (or dataDirectory where applicable)
Note: this isn''t ideal as it's not backward compatible
2015-11-21 16:41:28 +00:00
Thomas Tanner 542ef73a30 Removal of (get)BinaryName.
Note in pythonrunner this is a bit commented out so I can think about how to deal with it.
2015-11-21 12:28:48 +00:00
Thomas Tanner f6d499e6c6 Merge remote-tracking branch 'refs/remotes/TanninOne/master' 2015-11-18 20:46:19 +00:00
Tannin fe2169650e updated build scripts 2015-11-16 21:39:53 +01:00
Thomas Tanner 07798f2e23 More changes suggested by compiling with clang 2015-11-09 18:14:57 +00:00
Thomas Tanner 86d2ce34f3 Fix compilation issues with clang, requires adding widgets to build 2015-11-08 23:15:55 +00:00
Thomas Tanner 88846e52f5 Add support for version dependency checks 2015-11-01 18:27:03 +00:00
Thomas Tanner 27704407a3 Add the python wrapper changes for the new setURL method 2015-10-15 19:06:04 +01:00
Thomas Tanner 3648690c5e Merge remote-tracking branch 'TanninOne/master' 2015-10-10 14:00:38 +01:00
Tannin 97787553f7 more work on build system 2015-10-09 19:57:45 +02:00
Tannin 10fd3e77d7 more work on build system 2015-10-09 19:57:17 +02:00
convert-repo f806d29a75 update tags 2015-09-07 16:36:52 +00:00
Tom Tanner 25ac05622a Small fix to shut up messages about long boost names 2015-08-20 19:53:39 +01:00
Tannin f29d9ac993 added plugin interface to add/remove/list categories to/from/of mods 2015-06-10 22:09:32 +02:00
Tom Tanner d8f49b3906 Update scons build 2015-05-28 20:42:15 +01:00
Tannin 25d9ad16c2 python runner is now bundled with MO as a separate file instead of embedded in the plugin 2015-05-24 18:44:57 +02:00
Tannin a5901d7975 extended plugin interface. Plugins can now activate/deactivate mods, install mods
suggesting a name and retrieve a list of all installed mods
2015-05-17 14:30:14 +02:00
Tannin a7b81418a5 fixes to make MO compile with mingw (also fixes some warnings generated by mingw) 2015-05-16 18:44:07 +02:00
Tannin 560e1ce0c7 Merge 2015-05-09 21:46:40 +02:00
Tannin 6edbec745d plugin can now have multiple states 2015-03-31 18:35:12 +02:00
Tom Tanner d6edcf4fa0 Adding an icon to nxmhandler so that it looks pretty in firefox 2015-03-28 10:39:40 +00:00
Tannin 50a725a1b4 Merge in changes by Tom Tanner 2015-03-27 18:24:37 +01:00
Tom Tanner a1fdb54471 Add in all the necessary stuff for scons 2015-03-25 22:35:53 +00:00
Tom Tanner e602014dda Fix a meory leak with modules that error during loading
More Sconscript stuff
2015-03-22 10:49:15 +00:00
Tom Tanner 90df417a8c Fixed Scons build for existing bits.
Changed pynedit.pro to fetch from 'standard' install location
Changed saveas code to use organizer report rather than uibase - this way it's
not dependant on the vagaries of the include path, and works the same as the
rest of the organiser directory
2015-03-20 10:34:30 +00:00
Tom Tanner cb9a7fcd2d Merge with branch1.2 2015-03-18 17:40:29 +00:00
Tom Tanner 9d2264aff8 Refactoring and cleanup. 2015-03-18 14:16:04 +00:00
Tom Tanner 0aeeb9365f Every plugin now built 2015-03-17 16:31:15 +00:00
Tom Tanner 3967d64437 Cleanup 2015-03-16 08:35:14 +00:00
Tom Tanner a7e881869e Yet more scons stuff. Now builds everything but the plugins, and installs all the dlls 2015-03-15 10:58:21 +00:00
Tom Tanner 3f66d206e8 More sconscripts set up 2015-03-14 14:59:52 +00:00
Tannin 9d48b75388 python proxy plugin should no longer throw a fit if another process locks the unpacked pythonrunner 2015-02-25 18:13:17 +01:00
Tannin 841b923751 better error handling in python runner extraction 2015-01-29 19:28:58 +01:00
Tannin 23fd430605 extended the game-plugin interface 2015-01-29 19:26:42 +01:00
Tannin 1a89e42c0f Merge with branch1.2 2015-01-24 19:34:12 +01:00
Tannin 42afc90c8d cleanup (mostly removing unused includes) 2015-01-22 19:44:38 +01:00
Tannin 9b989e9f97 bugfix: translations for some plugins weren't loaded 2015-01-11 11:14:58 +01:00
Tannin c7203bf9de - bugfixes
- moved more functionality to game-plugins
- further decoupled management functionality from the UI
- created another "tutorial" which is only a single page with relevant parts of
  the ui highlighted with info as tooltips
2015-01-06 19:31:53 +01:00
Tannin a7d626c83c Merge 2015-01-04 10:33:37 +01:00
Tannin bbea63e7af - fixes after merge 2015-01-04 10:13:12 +01:00
Tannin 9f607a5fcb Merge with branch1.2 2015-01-03 15:58:52 +01:00
Tannin b7edde6fa0 custom installers can now set the installation file (and the ncc installer now does) 2014-12-14 16:30:23 +01:00
Tannin 589325d91b - NCC installer can now discover files in other mods (thanks Reunion!) and knows the script extender version 2014-12-13 16:47:11 +01:00
Tannin 994018a491 minor fixes 2014-12-04 19:25:07 +01:00
Tannin 868ab93a1f replaced all uses of NULL with nullptr
fixed a few placed where NULL was used as a number or boolean
2014-11-28 11:19:20 +01:00
Tannin 7c8fafc196 several bugfixes from the bugfix-wc that I forgot to backport 2014-11-26 20:21:33 +01:00
Tannin dec620b5b7 - started on a refactoring moving functionality out of the MainWindow class
- started on support for game-plugins
2014-11-21 14:45:30 +01:00
Tannin 29c66c621d - updated staging script to use qt5 and to fetch translations from transifex
- removed call to function unavailable in Windows XP
2014-11-11 23:48:22 +01:00
Tannin 5da6a9d3bd - updated staging script to use qt5 and to fetch translations from transifex
- removed call to function unavailable in Windows XP
2014-11-11 23:48:22 +01:00
Tannin 7b5f01b49d - bsa parser will now cancel in case of a read error. Before, when attempting to parse a broken bsa it could take forever and continuously allocate memory
- better error message when bsa parsing fails
- slightly better support for font colors in bbcode converter
- configurator now also uses pyqt5
- bugfix: bsa hashing function converted backslashes to slashes instead of the other way around. hash calculation is still often wrong on folder names...
2014-11-09 14:01:48 +01:00
Tannin 573be8c6b5 - bsa parser will now cancel in case of a read error. Before, when attempting to parse a broken bsa it could take forever and continuously allocate memory
- better error message when bsa parsing fails
- slightly better support for font colors in bbcode converter
- configurator now also uses pyqt5
- bugfix: bsa hashing function converted backslashes to slashes instead of the other way around. hash calculation is still often wrong on folder names...
2014-11-09 14:01:48 +01:00
Tannin a738cef190 - moved the hook-recursion-protection to tls
- some code cleanup and consolidation
- hook.dll will now report all of its own exceptions
- some more logging during startup
- changed the way urls are encoded for download requests
- now displaying (one of the) process name(s) while waiting for a program to end
- bugfix: spawned processes were forced to leave the job
2014-09-29 20:35:35 +02:00
Tannin 2c661da2da - moved the hook-recursion-protection to tls
- some code cleanup and consolidation
- hook.dll will now report all of its own exceptions
- some more logging during startup
- changed the way urls are encoded for download requests
- now displaying (one of the) process name(s) while waiting for a program to end
- bugfix: spawned processes were forced to leave the job
2014-09-29 20:35:35 +02:00
Tannin 2bf3ba0984 plugins can now query the list of masters for a plugin 2014-09-10 20:37:17 +02:00
Tannin fa09fd7635 plugins can now query the list of masters for a plugin 2014-09-10 20:37:17 +02:00
Tannin b76c4a1869 - re-enabled building of loot_cli and started developing against the new api
- extended set of default categories
- more tolerand bbcode parser
- added a few colors for the bbcode parser
- more fixes to qt5 compatibility
- started work on ability to unloading (and thus re-loading) of plugins
- names of plugins are no longer localizable (because those names are also used to store settings)
- added settings to disable individual diagnosis settings
- path of dependencies is now configured in a .pri file instead of environment variablees
- bugfix: if the modid-input is canceled, the id was saved as -1 and wasn't re-requested from the user
- bugfix: moving files with the SHFileOperation-Api didn't update the vfs correctly (still not perfect but better)
- bugfix: attempt to remove the deleter-file seems to have caused error messages for some users
- bugfix: fixed a couple of cases that might have caused the tutorial to hang
2014-09-08 20:37:23 +02:00
Tannin 84fe2b0307 - re-enabled building of loot_cli and started developing against the new api
- extended set of default categories
- more tolerand bbcode parser
- added a few colors for the bbcode parser
- more fixes to qt5 compatibility
- started work on ability to unloading (and thus re-loading) of plugins
- names of plugins are no longer localizable (because those names are also used to store settings)
- added settings to disable individual diagnosis settings
- path of dependencies is now configured in a .pri file instead of environment variablees
- bugfix: if the modid-input is canceled, the id was saved as -1 and wasn't re-requested from the user
- bugfix: moving files with the SHFileOperation-Api didn't update the vfs correctly (still not perfect but better)
- bugfix: attempt to remove the deleter-file seems to have caused error messages for some users
- bugfix: fixed a couple of cases that might have caused the tutorial to hang
2014-09-08 20:37:23 +02:00
Tannin e7e686c361 - can now filter by mod content
- all files/directories that require write access can now be placed in AppData instead of the MO directory
2014-08-18 23:00:25 +02:00
Tannin ae8b6a39b0 - browser dialog now has a hidden url-field (for testing only)
- loot_cli is no longer part of this project. I will probably create a fork of loot that allows command-line usage instead
- loot integration now works with such a modified loot version
- integrated loot will now also integrate incompatibility messages in the MO UI
- overwrite-markers are now updated as the list order is changed
- fnis checker will now always allow the user to ignore fnis errors
- plugin interface now has a function to wait for handles returned from startApplication (which can be job or process handles)
- bugfix: non-mo mods sharing the name with regular mods now have a different internal name
- bugfix: using hotkeys the vanilla game-plugins could be moved
2014-07-27 18:34:32 +02:00
TheBloke 2dc9463951 pythonRunner.pro - formatting/consistency fixes
Same types of fixes as previous commit; missed this file.
2014-07-08 00:28:06 +01:00
TheBloke 1d4a4b485d .pro files - formatting/consistency fixes
Many small formatting changes to the majority of .pro files
 Consistent style for Qt version checking, using greaterThan(QT_MAJOR_VERSION, 4)
  This seems safest, as would continue to work for a future Qt 6 etc.
  Note that this makes redudundant the commit before this one, to organizer.pro
 Consistent indenting
 Moved some file configuration sections to be together with related sections
 Moved some installation-related sections (e.g. OUTDIR/DSTDIR) to be at the bottom,
  immediately before the related POST_LINK install lines.
 Similarly, in some cases separated out CONFIG(debug,.. checks into separate
  LIB/INCLUDE sections (high in file) and installation directory sections (low
   in file)
2014-07-07 23:32:18 +01:00
Tannin d5838c7560 - added pseudo-categories to filter for mo-managed vs. unmanaged mods
- deleted mods are now moved to the recycle bin instead of being deleted permanently
- reduced modinfo dialog for foreign mods
- foreign mods are now displayed with a pseudo-category
- added a signal when a plugin is moved
- bugfix: refreshing of directory structure for mods with bsas didn't work correctly when enabling a mod and on changing display of foreign mods
- bugfix: one mod in the list was assigned the same priority on the directory structure as the data directory
- bugfix: conflicts tab in the mod info dialog offered the hide option for files in bsas
2014-06-16 21:49:57 +02:00
Tannin 9cbf374166 - loot client now only updates the masterlist once per MO session
- new event to notify plugins of changed mod priority
- overwrite now shows up in the "checked" category instead of "unchecked"
- display of "foreign" mods can now be limited to only official content
- bugfix: bsa extraction dialog showed up even if the plugin was disabled
- bugfix: after detection of foreign mods the priority of the overwrite folder could get messed up
- bugfix: when displaying only the context menu for the mod list as a whole, the menu didn't disappear
- bugfix: MO crashed when trying to download via the integrated browser
2014-06-08 15:10:08 +02:00
Tannin f71bfff0e6 Merge 2014-05-28 14:23:11 +02:00
Tannin 8aa2ab4eac small bugfixes 2014-05-28 14:14:28 +02:00
Tannin 46a0ce9e38 - files in bsas are now only displayed in the data tab if they are managed by mo
- number of problems detected by MO is now displayed as a badge on the icon
- rephrased the explanation text on the Archives tab. unchecked plugin-loaded bsas no longer prompt a warning
- bsa extraction is now handled in a plugin
- added a way for plugins to react to mod installation
- re-enabled the automatic fix for asset order problems
- bugfix: In some cases when a download wasn't started successfully the download urls weren't stored in the meta file so no resume was possible
- bugfix: MO tried to resume downloads when it didn't have and download urls
- bugfix: downloads couldn't be paused if the download was already broken on the network layer
- bugfix: download managear did not recognize a file as downloaded if the download completed before signals were hooked up
- bugfix: in-place file replacement was re-broken
2014-05-25 15:39:45 +02:00
Tannin 15e635741c - mod list context menu split into two menus (one for whole list, one for selected mods)
- added option to combine category filters using "or"
- added context menu option for deselecting category filters
- slightly changed ui on the category filters
- added a sample plugin for cpp that can be built without building the rest of MO
- simple installer can now be configured to run without any user interaction
- extended interface for python plugins
- iorganizer implementation moved out of the main window
- nexus requests from plugins will now be identified in the user agent
- bugfix: shortcuts created from MO used the wrong working directory
- bugfix: deactivation of bsas didn't stick
- bugfix: file hiding mechanism wasn't active
- bugfix: executables linked on the toolbar couldn't be removed if the executable was removed first
- bugfix: the endorsement-filter couldn't be combined with other filters
- bugfix: python interface to repository bridge was broken
2014-05-13 21:20:44 +02:00
Tannin f56c605479 - bugfix: endless loop in detection of mod order problems 2014-05-04 16:13:35 +02:00
Tannin 617c76e9f8 - main window now has a small view displaying log messages
- mod list will now be highlighted when grouping is active is active
- download tooltip now supports bbcode markup in the description
- bbcode translator will now translate some named colors
- algorithm for detection of mod order problems is now more sophisticated
- exposed more functionality to python plugins
- updated to qt 4.8.6 dlls
- bugfix: plugin list wasn't
- bugfix: state changes in mod list wasn't always reported
- bugfix: loot client will now create necessary directory
- bugfix: NCC sometimes used wrong source path for extracting
- bugfix: removed noisy debug message
2014-05-04 14:50:01 +02:00
Tannin 96081888f1 Merge with branch1.1 2014-04-05 15:36:42 +02:00
Tannin af5958b0af some fixes towards qt5 compatibility 2014-03-16 20:04:57 +01:00
Tannin b33293e49a - bugfix: elevation dialog didn't offer a "yes" option
- bugfix: python plugins crashed the application when trying to create a nexus bridge
- bugfix: python plugins couldn't register for failed requests correctly
2014-01-29 21:06:55 +01:00
Tannin dc3b60e578 - bugfix: accessing profile without loading one when starting an app through the commandline
- bugfix: locked-dialog was disabled
2014-01-27 21:31:10 +01:00
Tannin fee774db45 - added support for mod page plugins
- re-introduced the integrated browser
- added a plugin to download from the tes alliance page
- the download list now contains the file description
- nexus interface now stores cookies persistently to reduce number of required log-ins
2013-09-15 15:20:00 +02:00
46 changed files with 5038 additions and 2299 deletions
+5
View File
@@ -0,0 +1,5 @@
edit
CMakeLists.txt.user
/msbuild.log
/*std*.log
/*build
+15
View File
@@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.16)
project(plugin_python)
set(project_type plugin)
set(enable_warnings OFF)
set(create_translations OFF)
if(DEFINED DEPENDENCIES_DIR)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/project.cmake)
else()
include(../cmake_common/project.cmake)
endif()
add_subdirectory(src/proxy)
add_subdirectory(src/runner)
+48
View File
@@ -0,0 +1,48 @@
version: 1.0.{build}
skip_branch_with_pr: true
image: Visual Studio 2019
environment:
WEBHOOK_URL:
secure: gOKbXaZM9ImtMD5XrYITvdyZUW/az082G9OIN1EC1Vbg57wBaeLhi49uGjxPw5GVujHku6kxN6ab89zhbS5GVeluR76GM83IbKV4Sh7udXzoYZZdg6YudtYHzdhCgUeiedpswbuczTq9ceIkkfSEWZuh/lMAAVVwvcGsJAnoPFw=
build:
parallel: true
build_script:
- pwsh: >-
$ErrorActionPreference = 'Stop'
git clone --depth=1 --no-single-branch https://github.com/ModOrganizer2/modorganizer-umbrella.git c:\projects\modorganizer-umbrella
New-Item -ItemType Directory -Path c:\projects\modorganizer-build
cd c:\projects\modorganizer-umbrella
($env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH -eq $null) ? ($branch = $env:APPVEYOR_REPO_BRANCH) : ($branch = $env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH)
git checkout $(git show-ref --verify --quiet refs/remotes/origin/${branch} || echo '-b') ${branch}
C:\Python37-x64\python.exe unimake.py -d c:\projects\modorganizer-build -s Appveyor_Build=True ${env:APPVEYOR_PROJECT_NAME}
if($LastExitCode -ne 0) { $host.SetShouldExit($LastExitCode ) }
artifacts:
- path: build\src\proxy\plugin_python.dll
name: plugin_python_dll
- path: build\src\proxy\plugin_python.pdb
name: plugin_python_pdb
- path: build\src\proxy\plugin_python.lib
name: plugin_python_lib
- path: build\src\runner\pythonrunner.dll
name: pythonrunner_dll
- path: build\src\runner\pythonrunner.pdb
name: pythonrunner_pdb
- path: build\src\runner\pythonrunner.lib
name: pythonrunner_lib
on_success:
- ps: Set-Location -Path $env:APPVEYOR_BUILD_FOLDER
- ps: Invoke-RestMethod https://raw.githubusercontent.com/DiscordHooks/appveyor-discord-webhook/master/send.ps1 -o send.ps1
- ps: ./send.ps1 success $env:WEBHOOK_URL
on_failure:
- ps: Set-Location -Path $env:APPVEYOR_BUILD_FOLDER
- ps: Push-AppveyorArtifact ${env:APPVEYOR_BUILD_FOLDER}\stdout.log
- ps: Push-AppveyorArtifact ${env:APPVEYOR_BUILD_FOLDER}\stderr.log
- ps: Invoke-RestMethod https://raw.githubusercontent.com/DiscordHooks/appveyor-discord-webhook/master/send.ps1 -o send.ps1
- ps: ./send.ps1 failure $env:WEBHOOK_URL
+12
View File
@@ -0,0 +1,12 @@
cmake_minimum_required(VERSION 3.16)
# appveyor does not build modorganizer in its standard location, so use
# DEPENDENCIES_DIR to find cmake_common
if(DEFINED DEPENDENCIES_DIR)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/src.cmake)
else()
include(../../../cmake_common/src.cmake)
endif()
requires_library(python)
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_SOURCE_DIR}/src/runner)
+32
View File
@@ -0,0 +1,32 @@
import os
Import('qt_env')
env = qt_env.Clone()
env.AppendUnique(CPPDEFINES = [
'PROXYPYTHON_LIBRARY',
# suppress a few warnings caused by boost vs vc++ paranoia
'_SCL_SECURE_NO_WARNINGS'
])
env.AppendUnique(CPPPATH = [
'${BOOSTPATH}',
'..\\..\\pythonRunner'
])
env.AppendUnique(LIBS = 'shell32')
runner = env.File(os.path.join('..', '..', 'pythonRunner', 'pythonRunner.dll'))
runner_env = env.Clone()
runner_env.AppendUnique(CPPDEFINES = 'SCONS_BUILD')
runner_env.AppendUnique(CPPPATH = runner.dir)
# There's a whole load of unused C++ files in here.
lib = env.SharedLibrary('proxyPython', [ 'proxypython.cpp' ])
env.InstallModule(lib)
res = env['QT_USED_MODULES']
Return('res')
-7
View File
@@ -1,7 +0,0 @@
#include "resource.h"
#ifdef _DEBUG
IDR_LOADER_DLL BINARY MOVEABLE PURE "..\\..\\pythonRunner\\debug\\pythonRunner.dll"
#else // _DEBUG
IDR_LOADER_DLL BINARY MOVEABLE PURE "..\\..\\pythonRunner\\release\\pythonRunner.dll"
#endif // _DEBUG
+8 -11
View File
@@ -8,9 +8,7 @@
TARGET = proxyPython
TEMPLATE = lib
contains(QT_VERSION, "^5.*") {
QT += widgets
}
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += plugins
CONFIG += dll
@@ -31,21 +29,20 @@ HEADERS += proxypython.h \
OTHER_FILES += \
proxypython.json \
embedrunner.rc
SConscript
RC_FILE += \
embedrunner.rc
RC_FILE +=
include(../plugin_template.pri)
INCLUDEPATH += "../../pythonRunner" "$(BOOSTPATH)"
INCLUDEPATH += "../../pythonRunner" "$${BOOSTPATH}"
WINPWD = $$PWD
WINPWD ~= s,/,$$QMAKE_DIR_SEP,g
//QMAKE_POST_LINK += SET VS90COMNTOOLS=%VS100COMNTOOLS% $$escape_expand(\\n)
#QMAKE_POST_LINK += SET VS90COMNTOOLS=%VS100COMNTOOLS% $$escape_expand(\\n)
//QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\sip.pyd $$quote($$DSTDIR)\\plugins\\data\\ $$escape_expand(\\n)
//QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtCore.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
//QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtGui.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
#QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\sip.pyd $$quote($$DSTDIR)\\plugins\\data\\ $$escape_expand(\\n)
#QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtCore.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
#QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtGui.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
-213
View File
@@ -1,213 +0,0 @@
#include "proxypluginwrappers.h"
#include <boost/python.hpp>
#include <utility.h>
#include "error.h"
#include "gilock.h"
namespace bpy = boost::python;
using namespace MOBase;
#define PYCATCH catch (const bpy::error_already_set &) { reportPythonError(); throw MyException("unhandled exception"); }\
catch (...) { throw MyException("An unknown exception was thrown in python code"); }
/////////////////////////////
/// IPluginTool Wrapper
bool IPluginToolWrapper::init(MOBase::IOrganizer *moInfo)
{
try {
return this->get_override("init")(bpy::ptr(moInfo));
} PYCATCH;
}
QString IPluginToolWrapper::name() const
{
try {
return this->get_override("name")();
} PYCATCH;
}
QString IPluginToolWrapper::author() const
{
try {
return this->get_override("author")();
} PYCATCH;
}
QString IPluginToolWrapper::description() const
{
try {
return this->get_override("description")();
} PYCATCH;
}
MOBase::VersionInfo IPluginToolWrapper::version() const
{
try {
return this->get_override("version")();
} PYCATCH;
}
bool IPluginToolWrapper::isActive() const
{
try {
return this->get_override("isActive")();
} PYCATCH;
}
QList<MOBase::PluginSetting> IPluginToolWrapper::settings() const
{
try {
return this->get_override("settings")();
} PYCATCH;
}
QString IPluginToolWrapper::displayName() const
{
try {
return this->get_override("displayName")();
} PYCATCH;
}
QString IPluginToolWrapper::tooltip() const
{
try {
return this->get_override("tooltip")();
} PYCATCH;
}
QIcon IPluginToolWrapper::icon() const
{
try {
return this->get_override("icon")();
} PYCATCH;
}
void IPluginToolWrapper::setParentWidget(QWidget *parent)
{
try {
this->get_override("setParentWidget")(parent);
} PYCATCH;
}
void IPluginToolWrapper::display() const
{
try {
GILock lock;
this->get_override("display")();
} PYCATCH;
}
/// end IPluginTool Wrapper
/////////////////////////////////////
/// IPluginInstallerCustom Wrapper
bool IPluginInstallerCustomWrapper::init(MOBase::IOrganizer *moInfo)
{
try {
return this->get_override("init")(bpy::ptr(moInfo));
} PYCATCH;
}
QString IPluginInstallerCustomWrapper::name() const
{
try {
return this->get_override("name")();
} PYCATCH;
}
QString IPluginInstallerCustomWrapper::author() const
{
try {
return this->get_override("author")();
} PYCATCH;
}
QString IPluginInstallerCustomWrapper::description() const
{
try {
return this->get_override("description")();
} PYCATCH;
}
MOBase::VersionInfo IPluginInstallerCustomWrapper::version() const
{
try {
return this->get_override("version")();
} PYCATCH;
}
bool IPluginInstallerCustomWrapper::isActive() const
{
try {
return this->get_override("isActive")();
} PYCATCH;
}
QList<MOBase::PluginSetting> IPluginInstallerCustomWrapper::settings() const
{
try {
return this->get_override("settings")();
} PYCATCH;
}
unsigned int IPluginInstallerCustomWrapper::priority() const
{
try {
return this->get_override("priority")();
} PYCATCH;
}
bool IPluginInstallerCustomWrapper::isManualInstaller() const
{
try {
return this->get_override("isManualInstaller")();
} PYCATCH;
}
bool IPluginInstallerCustomWrapper::isArchiveSupported(const DirectoryTree &tree) const
{
try {
//return this->get_override("isArchiveSupported")(tree);
return false;
} PYCATCH;
}
bool IPluginInstallerCustomWrapper::isArchiveSupported(const QString &archiveName) const
{
try {
return this->get_override("isArchiveSupported")(archiveName);
} PYCATCH;
}
std::set<QString> IPluginInstallerCustomWrapper::supportedExtensions() const
{
try {
return this->get_override("supportedExtensions")();
} PYCATCH;
}
IPluginInstaller::EInstallResult IPluginInstallerCustomWrapper::install(GuessedValue<QString> &modName, const QString &archiveName,
const QString &version, int modID)
{
try {
return this->get_override("install")(modName, archiveName, version, modID);
} PYCATCH;
}
void IPluginInstallerCustomWrapper::setParentWidget(QWidget *parent)
{
try {
this->get_override("setParentWidget")(parent);
} PYCATCH;
}
-80
View File
@@ -1,80 +0,0 @@
#ifndef PROXYPLUGINWRAPPERS_H
#define PROXYPLUGINWRAPPERS_H
#include <iplugintool.h>
#include <iplugininstallersimple.h>
#include <iplugininstallercustom.h>
#include <iplugindiagnose.h>
#ifndef Q_MOC_RUN
#include <boost/python.hpp>
#endif
class IPluginWrapper : public boost::python::wrapper<MOBase::IPlugin>
{
public:
virtual bool init(MOBase::IOrganizer *moInfo);
virtual QString name() const;
virtual QString author() const;
virtual QString description() const;
virtual MOBase::VersionInfo version() const;
virtual bool isActive() const;
virtual QList<MOBase::PluginSetting> settings() const;
};
class IPluginToolWrapper: public MOBase::IPluginTool, public boost::python::wrapper<MOBase::IPluginTool>
{
Q_OBJECT
Q_INTERFACES(MOBase::IPlugin MOBase::IPluginTool)
public:
virtual bool init(MOBase::IOrganizer *moInfo);
virtual QString name() const;
virtual QString author() const;
virtual QString description() const;
virtual MOBase::VersionInfo version() const;
virtual bool isActive() const;
virtual QList<MOBase::PluginSetting> settings() const;
virtual QString displayName() const;
virtual QString tooltip() const;
virtual QIcon icon() const;
virtual void setParentWidget(QWidget *parent);
public slots:
virtual void display() const;
};
class IPluginInstallerCustomWrapper: public MOBase::IPluginInstallerCustom, public boost::python::wrapper<MOBase::IPluginInstallerCustom>
{
Q_OBJECT
Q_INTERFACES(MOBase::IPlugin MOBase::IPluginInstaller MOBase::IPluginInstallerCustom)
public:
virtual bool init(MOBase::IOrganizer *moInfo);
virtual QString name() const;
virtual QString author() const;
virtual QString description() const;
virtual MOBase::VersionInfo version() const;
virtual bool isActive() const;
virtual QList<MOBase::PluginSetting> settings() const;
virtual unsigned int priority() const;
virtual bool isManualInstaller() const;
virtual bool isArchiveSupported(const MOBase::DirectoryTree &tree) const;
virtual bool isArchiveSupported(const QString &archiveName) const;
virtual std::set<QString> supportedExtensions() const;
virtual EInstallResult install(MOBase::GuessedValue<QString> &modName, const QString &archiveName,
const QString &version, int modID);
virtual void setParentWidget(QWidget *parent);
};
#endif // PROXYPLUGINWRAPPERS_H
+126 -211
View File
@@ -26,149 +26,101 @@ along with python proxy plugin. If not, see <http://www.gnu.org/licenses/>.
#include <QWidget>
#include <QMessageBox>
#include <QCoreApplication>
#include "resource.h"
#include "log.h"
using namespace MOBase;
const char *ProxyPython::s_DownloadPythonURL = "http://www.python.org/download/releases/";
HMODULE GetOwnModuleHandle()
{
HMODULE hMod = NULL;
GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
reinterpret_cast<LPCWSTR>(&GetOwnModuleHandle), &hMod);
return hMod;
}
QString ExtractResource(WORD resourceID, const QString &szFilename)
{
HMODULE mod = GetOwnModuleHandle();
HRSRC hResource = FindResourceW(mod, MAKEINTRESOURCE(resourceID), L"BINARY");
if (hResource == NULL) {
throw MyException("embedded dll not available: " + windowsErrorString(::GetLastError()));
}
HGLOBAL hFileResource = LoadResource(mod, hResource);
if (hFileResource == NULL) {
throw MyException("failed to load embedded dll resource: " + windowsErrorString(::GetLastError()));
}
LPVOID lpFile = LockResource(hFileResource);
DWORD dwSize = SizeofResource(mod, hResource);
QString outFile = QDir::tempPath() + "/" + szFilename;
HANDLE hFile = CreateFileW(ToWString(outFile).c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);
LPVOID lpAddress = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);
CopyMemory(lpAddress, lpFile, dwSize);
UnmapViewOfFile(lpAddress);
CloseHandle(hFileMap);
CloseHandle(hFile);
return outFile;
}
ProxyPython::ProxyPython()
: m_MOInfo(NULL), m_Runner(NULL), m_LoadFailure(FAIL_NOTINIT)
: m_MOInfo{ nullptr },
m_RunnerLib{ nullptr },
m_Runner{ nullptr },
m_LoadFailure(FailureType::NONE)
{
}
ProxyPython::~ProxyPython()
{
if (!m_TempRunnerFile.isEmpty()) {
::FreeLibrary(m_RunnerLib);
QFile(m_TempRunnerFile).remove();
}
}
typedef IPythonRunner* (*CreatePythonRunner_func)(const MOBase::IOrganizer *moInfo, const QString &pythonPath);
bool ProxyPython::init(IOrganizer *moInfo)
{
using CreatePythonRunner_func = IPythonRunner * (*)();
m_MOInfo = moInfo;
if (!m_MOInfo->pluginSetting(name(), "enabled").toBool()) {
m_LoadFailure = FAIL_NONE;
if (m_MOInfo && !m_MOInfo->isPluginEnabled(this)) {
return false;
}
m_LoadFailure = FAIL_OTHER;
if (QCoreApplication::applicationDirPath().contains(';')) {
m_LoadFailure = FAIL_SEMICOLON;
m_LoadFailure = FailureType::SEMICOLON;
return true;
}
QString pythonPath = m_MOInfo->pluginSetting(name(), "python_dir").toString();
// load the pythonrunner library
m_RunnerLib = ::LoadLibraryW(QDir::toNativeSeparators(
IOrganizer::getPluginDataPath() + "/pythonRunner.dll").toStdWString().c_str());
if (!pythonPath.isEmpty() && !QFile::exists(pythonPath + "/python.exe")) {
m_LoadFailure = FAIL_WRONGPYTHONPATH;
return true;
}
m_TempRunnerFile = ExtractResource(IDR_LOADER_DLL, "__pythonRunner.dll");
m_RunnerLib = ::LoadLibraryW(ToWString(m_TempRunnerFile).c_str());
if (m_RunnerLib != NULL) {
CreatePythonRunner_func CreatePythonRunner = (CreatePythonRunner_func)::GetProcAddress(m_RunnerLib, "CreatePythonRunner");
if (CreatePythonRunner == NULL) {
throw MyException("embedded dll is invalid: " + windowsErrorString(::GetLastError()));
}
if (m_MOInfo->persistent(name(), "tryInit", false).toBool()) {
if (pythonPath.isEmpty()) {
m_LoadFailure = FAIL_PYTHONDETECTION;
} else {
m_LoadFailure = FAIL_WRONGPYTHONPATH;
}
if (QMessageBox::question(parentWidget(), tr("Python Initialization failed"),
tr("On a previous start the Python Plugin failed to initialize.\n"
"Either the value in Settings->Plugins->ProxyPython->plugin_dir is set incorrectly or it is empty and auto-detection doesn't work "
"for whatever reason.\n"
"Do you want to try initializing python again (at the risk of another crash)?\n"
"Suggestion: Select \"no\", and click the warning sign for further help. Afterwards you have to re-enable the python plugin."),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
m_MOInfo->setPluginSetting(name(), "enabled", false);
return true;
}
}
m_MOInfo->setPersistent(name(), "tryInit", true);
m_Runner = CreatePythonRunner(moInfo, pythonPath);
m_MOInfo->setPersistent(name(), "tryInit", false);
if (m_Runner != NULL) {
m_LoadFailure = FAIL_NONE;
} else {
m_LoadFailure = FAIL_INITFAIL;
}
return true;
} else {
if (!m_RunnerLib) {
DWORD error = ::GetLastError();
qCritical("Failed to load python runner: %s", qPrintable(windowsErrorString(error)));
log::error("failed to load python runner ({}): {}", qUtf8Printable(windowsErrorString(error)));
if (error == ERROR_MOD_NOT_FOUND) {
m_LoadFailure = FAIL_MISSINGDEPENDENCIES;
m_LoadFailure = FailureType::DLL_NOT_FOUND;
}
else {
m_LoadFailure = FailureType::INVALID_DLL;
}
return true;
}
const CreatePythonRunner_func createPythonRunner = (CreatePythonRunner_func)::GetProcAddress(m_RunnerLib, "CreatePythonRunner");
if (!createPythonRunner) {
m_LoadFailure = FailureType::INVALID_DLL;
return true;
}
if (m_MOInfo && m_MOInfo->persistent(name(), "tryInit", false).toBool()) {
m_LoadFailure = FailureType::INITIALIZATION;
if (QMessageBox::question(parentWidget(), tr("Python Initialization failed"),
tr("On a previous start the Python Plugin failed to initialize.\n"
"Do you want to try initializing python again (at the risk of another crash)?\n"
"Suggestion: Select \"no\", and click the warning sign for further help. Afterwards you have to re-enable the python plugin."),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
// we force enabled here (note: this is a persistent settings since MO2 2.4 or something), plugin
// usually should not handle enabled/disabled themselves but this is a base plugin so...
m_MOInfo->setPersistent(name(), "enabled", false, true);
return true;
}
}
if (m_MOInfo) {
m_MOInfo->setPersistent(name(), "tryInit", true);
}
m_Runner = std::unique_ptr<IPythonRunner>{ createPythonRunner() };
if (m_MOInfo) {
m_MOInfo->setPersistent(name(), "tryInit", false);
}
if (!m_Runner) {
m_LoadFailure = FailureType::INITIALIZATION;
}
return true;
}
QString ProxyPython::name() const
{
return "Python Proxy";
}
QString ProxyPython::localizedName() const
{
return tr("Python Proxy");
}
QString ProxyPython::author() const
{
return "Tannin";
return "AnyOldName3, Holt59, Silarn, Tannin";
}
QString ProxyPython::description() const
@@ -178,150 +130,113 @@ QString ProxyPython::description() const
VersionInfo ProxyPython::version() const
{
return VersionInfo(1, 2, 0, VersionInfo::RELEASE_FINAL);
}
bool ProxyPython::isActive() const
{
return m_LoadFailure == FAIL_NONE;
return VersionInfo(2, 3, 0, VersionInfo::RELEASE_FINAL);
}
QList<PluginSetting> ProxyPython::settings() const
{
QList<PluginSetting> result;
result.push_back(PluginSetting("python_dir", "Path to your python installation. Leave empty for auto-detection", ""));
result.push_back(PluginSetting("enabled", "Set to true to enable support for python plugins", true));
return result;
return {};
}
QStringList ProxyPython::pluginList(const QString &pluginPath) const
QStringList ProxyPython::pluginList(const QDir& pluginPath) const
{
QDirIterator iter(pluginPath, QStringList("*.py"));
QDir dir(pluginPath);
dir.setFilter(dir.filter() | QDir::NoDotAndDotDot);
QDirIterator iter(dir);
// Note: We put python script (.py) and directory names, not the __init__.py
// files in those since it is easier for the runner to import them.
QStringList result;
while (iter.hasNext()) {
result.append(iter.next());
QString name = iter.next();
QFileInfo info = iter.fileInfo();
if (info.isFile() && name.endsWith(".py")) {
result.append(name);
}
else if (info.isDir() && QDir(info.absoluteFilePath()).exists("__init__.py")) {
result.append(name);
}
}
return result;
}
QObject *ProxyPython::instantiate(const QString &pluginName)
QList<QObject*> ProxyPython::load(const QString& identifier)
{
if (m_Runner != NULL) {
QObject *result = m_Runner->instantiate(pluginName);
return result;
} else {
return NULL;
if (!m_Runner) {
return {};
}
return m_Runner->load(identifier);
}
void ProxyPython::unload(const QString& identifier)
{
if (m_Runner) {
return m_Runner->unload(identifier);
}
}
std::vector<unsigned int> ProxyPython::activeProblems() const
{
std::vector<unsigned int> result;
if (m_LoadFailure == FAIL_MISSINGDEPENDENCIES) {
result.push_back(PROBLEM_PYTHONMISSING);
} else if (m_LoadFailure == FAIL_WRONGPYTHONPATH) {
result.push_back(PROBLEM_WRONGPYTHONPATH);
} else if (m_LoadFailure == FAIL_PYTHONDETECTION) {
result.push_back(PROBLEM_PYTHONDETECTION);
} else if (m_LoadFailure == FAIL_INITFAIL) {
result.push_back(PROBLEM_INITFAIL);
} else if (m_LoadFailure == FAIL_SEMICOLON) {
result.push_back(PROBLEM_SEMICOLON);
} else if (m_Runner != NULL) {
if (!m_Runner->isPythonInstalled()) {
// don't know how this could happen but wth
result.push_back(PROBLEM_PYTHONMISSING);
}
if (!m_Runner->isPythonVersionSupported()) {
result.push_back(PROBLEM_PYTHONWRONGVERSION);
}
auto failure = m_LoadFailure;
// don't know how this could happen but wth
if (m_Runner && !m_Runner->isPythonInitialized()) {
failure = FailureType::INITIALIZATION;
}
return result;
if (failure != FailureType::NONE) {
return { static_cast<std::underlying_type_t<FailureType>>(failure) };
}
return {};
}
QString ProxyPython::shortDescription(unsigned int key) const
{
switch (key) {
case PROBLEM_PYTHONMISSING: {
return tr("Python not installed or not found");
} break;
case PROBLEM_PYTHONWRONGVERSION: {
return tr("Python version is incompatible");
} break;
case PROBLEM_WRONGPYTHONPATH: {
return tr("Invalid python path");
} break;
case PROBLEM_INITFAIL: {
return tr("Initializing Python failed");
} break;
case PROBLEM_PYTHONDETECTION: {
return tr("Python auto-detection failed");
} break;
case PROBLEM_SEMICOLON: {
switch (static_cast<FailureType>(key)) {
case FailureType::SEMICOLON:
return tr("ModOrganizer path contains a semicolon");
} break;
case FailureType::DLL_NOT_FOUND:
return tr("Python DLL not found");
case FailureType::INVALID_DLL:
return tr("Invalid Python DLL");
case FailureType::INITIALIZATION:
return tr("Initializing Python failed");
default:
throw MyException(tr("invalid problem key %1").arg(key));
return tr("invalid problem key %1").arg(key);
}
}
QString ProxyPython::fullDescription(unsigned int key) const
{
switch (key) {
case PROBLEM_PYTHONMISSING: {
return tr("Some MO plugins require the python interpreter to be installed. "
"These plugins will not even show up in settings-&gt;plugins.<br>"
"If you want to use those plugins, please install the 32-bit version of Python 2.7.x from <a href=\"%1\">%1</a>.<br>"
"This is only required to use some extended functionality in MO, you do not need Python to play the game.").arg(s_DownloadPythonURL);
} break;
case PROBLEM_PYTHONWRONGVERSION: {
return tr("Your installed python version has a different version than 2.7. "
"Some MO plugins may not work.<br>"
"If you have multiple versions of python installed you may have to configure the path to 2.7 (32 bit) "
"in the settings dialog.<br>"
"This is only required to use some extended functionality in MO, you do not need Python to play the game.");
} break;
case PROBLEM_WRONGPYTHONPATH: {
return tr("Please set python_dir in Settings->Plugins->ProxyPython to the path of your python 2.7 (32 bit) installation.");
} break;
case PROBLEM_PYTHONDETECTION: {
return tr("The auto-detection of the python path failed. I don't know why this would happen but you can try to fix it "
"by setting python_dir in Settings->Plugins->ProxyPython to the path of your python 2.7 (32 bit) installation.");
} break;
case PROBLEM_INITFAIL: {
return tr("Sorry, I don't know any details. Most likely your python installation is not supported.");
} break;
case PROBLEM_SEMICOLON: {
return tr("The path to Mod Organizer (%1) contains a semicolon. <br>"
"While this is legal on NTFS drives there is a lot of software that doesn't handle it correctly.<br>"
"Unfortunately MO depends on libraries that seem to fall into that group.<br>"
"As a result the python plugin can't be loaded.<br>"
"The only solution I can offer is to remove the semicolon / move MO to a path without a semicolon.").arg(QCoreApplication::applicationDirPath());
} break;
default:
throw MyException(QString("invalid problem key %1").arg(key));
switch (static_cast<FailureType>(key)) {
case FailureType::SEMICOLON:
return tr("The path to Mod Organizer (%1) contains a semicolon. <br>"
"While this is legal on NTFS drives, many softwares do not handle it correctly.<br>"
"Unfortunately MO depends on libraries that seem to fall into that group.<br>"
"As a result the python plugin cannot be loaded, and the only solution we can"
"offer is to remove the semicolon or move MO to a path without a semicolon.").arg(QCoreApplication::applicationDirPath());
case FailureType::DLL_NOT_FOUND:
return tr("The Python plugin DLL was not found, maybe your antivirus deleted it. Re-installing MO2 might fix the problem.");
case FailureType::INVALID_DLL:
return tr("The Python plugin DLL is invalid, maybe your antivirus is blocking it. "
"Re-installing MO2 and adding exclusions for it to your AV might fix the problem.");
case FailureType::INITIALIZATION:
return tr("The initialization of the Python plugin DLL failed, unfortunately without any details.");
default:
return tr("invalid problem key %1").arg(key);
}
}
bool ProxyPython::hasGuidedFix(unsigned int key) const
{
return (key == PROBLEM_PYTHONMISSING) || (key == PROBLEM_PYTHONWRONGVERSION);
return false;
}
void ProxyPython::startGuidedFix(unsigned int key) const
{
if ((key == PROBLEM_PYTHONMISSING) || (key == PROBLEM_PYTHONWRONGVERSION)) {
::ShellExecuteA(NULL, "open", s_DownloadPythonURL, NULL, NULL, SW_SHOWNORMAL);
}
}
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
Q_EXPORT_PLUGIN2(proxyPython, ProxyPython)
#endif
+30 -43
View File
@@ -20,15 +20,18 @@ along with python proxy plugin. If not, see <http://www.gnu.org/licenses/>.
#ifndef PROXYPYTHON_H
#define PROXYPYTHON_H
#include <map>
#include <memory>
#include <Windows.h>
#include <ipluginproxy.h>
#include <iplugindiagnose.h>
#include <map>
#include <Windows.h>
#include <pythonrunner.h>
class ProxyPython : public QObject, MOBase::IPluginProxy, MOBase::IPluginDiagnose
class ProxyPython : public QObject, public MOBase::IPluginProxy, public MOBase::IPluginDiagnose
{
Q_OBJECT
Q_INTERFACES(MOBase::IPlugin MOBase::IPluginProxy MOBase::IPluginDiagnose)
@@ -38,58 +41,42 @@ class ProxyPython : public QObject, MOBase::IPluginProxy, MOBase::IPluginDiagnos
public:
ProxyPython();
~ProxyPython();
virtual bool init(MOBase::IOrganizer *moInfo);
virtual QString name() const;
virtual QString author() const;
virtual QString description() const;
virtual MOBase::VersionInfo version() const;
virtual bool isActive() const;
virtual QList<MOBase::PluginSetting> settings() const;
virtual QString name() const override;
virtual QString localizedName() const override;
virtual QString author() const override;
virtual QString description() const override;
virtual MOBase::VersionInfo version() const override;
virtual QList<MOBase::PluginSetting> settings() const override;
QStringList pluginList(const QString &pluginPath) const;
QObject *instantiate(const QString &pluginName);
/**
* @return the parent widget for newly created dialogs
* @note needs to be public so it can be exposed to plugins
*/
virtual QWidget *getParentWidget() { return parentWidget(); }
QStringList pluginList(const QDir& pluginPath) const override;
QList<QObject*> load(const QString& identifier) override;
void unload(const QString& identifier) override;
public: // IPluginDiagnose
virtual std::vector<unsigned int> activeProblems() const;
virtual QString shortDescription(unsigned int key) const;
virtual QString fullDescription(unsigned int key) const;
virtual bool hasGuidedFix(unsigned int key) const;
virtual void startGuidedFix(unsigned int key) const;
virtual std::vector<unsigned int> activeProblems() const override;
virtual QString shortDescription(unsigned int key) const override;
virtual QString fullDescription(unsigned int key) const override;
virtual bool hasGuidedFix(unsigned int key) const override;
virtual void startGuidedFix(unsigned int key) const override;
private:
static const unsigned int PROBLEM_PYTHONMISSING = 1;
static const unsigned int PROBLEM_PYTHONWRONGVERSION = 2;
static const unsigned int PROBLEM_WRONGPYTHONPATH = 3;
static const unsigned int PROBLEM_INITFAIL = 4;
static const unsigned int PROBLEM_PYTHONDETECTION = 5;
static const unsigned int PROBLEM_SEMICOLON = 6;
static const char *s_DownloadPythonURL;
MOBase::IOrganizer *m_MOInfo;
QString m_TempRunnerFile;
HMODULE m_RunnerLib;
IPythonRunner *m_Runner;
std::unique_ptr<IPythonRunner> m_Runner;
enum {
FAIL_NONE,
FAIL_SEMICOLON,
FAIL_NOTINIT,
FAIL_MISSINGDEPENDENCIES,
FAIL_INITFAIL,
FAIL_WRONGPYTHONPATH,
FAIL_PYTHONDETECTION,
FAIL_OTHER
} m_LoadFailure;
enum class FailureType : unsigned int {
NONE = 0,
SEMICOLON = 1,
DLL_NOT_FOUND = 2,
INVALID_DLL = 3,
INITIALIZATION = 4
};
FailureType m_LoadFailure;
};
-112
View File
@@ -1,112 +0,0 @@
#include "pythonpluginwrapper.h"
using boost::python::extract;
using boost::python::handle_exception;
PythonPluginWrapper::PythonPluginWrapper(const boost::python::object &initFunction,
const boost::python::object &nameFunction,
const boost::python::object &authorFunction,
const boost::python::object &descriptionFunction,
const boost::python::object &versionFunction,
const boost::python::object &isActiveFunction,
const boost::python::object &settingsFunction)
: m_InitFunction(initFunction)
, m_NameFunction(nameFunction)
, m_AuthorFunction(authorFunction)
, m_DescriptionFunction(descriptionFunction)
, m_VersionFunction(versionFunction)
, m_IsActiveFunction(isActiveFunction)
, m_SettingsFunction(settingsFunction)
{
}
void PythonPluginWrapper::reportPythonError() const
{
if (PyErr_Occurred()) {
PyErr_Print();
} else {
qCritical("An unexpected C++ exception was thrown in python code");
}
}
bool PythonPluginWrapper::init(MOBase::IOrganizer *moInfo)
{
try {
return boost::python::extract<bool>(m_InitFunction(boost::python::ptr(moInfo)));
} catch (const boost::python::error_already_set&) {
reportPythonError();
return false;
}
}
QString PythonPluginWrapper::name() const
{
try {
return boost::python::extract<QString>(m_NameFunction());
} catch (const boost::python::error_already_set&) {
reportPythonError();
return QString();
}
}
QString PythonPluginWrapper::author() const
{
try {
return boost::python::extract<QString>(m_AuthorFunction());
} catch (const boost::python::error_already_set&) {
reportPythonError();
return QString();
}
}
QString PythonPluginWrapper::description() const
{
try {
return boost::python::extract<QString>(m_DescriptionFunction());
} catch (const boost::python::error_already_set&) {
reportPythonError();
return QString();
}
}
MOBase::VersionInfo PythonPluginWrapper::version() const
{
try {
return boost::python::extract<MOBase::VersionInfo>(m_VersionFunction());
} catch (const boost::python::error_already_set&) {
reportPythonError();
return MOBase::VersionInfo();
}
}
bool PythonPluginWrapper::isActive() const
{
try {
return boost::python::extract<bool>(m_IsActiveFunction());
} catch (const boost::python::error_already_set&) {
reportPythonError();
return false;
}
}
QList<MOBase::PluginSetting> PythonPluginWrapper::settings() const
{
QList<MOBase::PluginSetting> result;
try {
boost::python::object l = m_SettingsFunction();
if (!l.is_none()) {
// boost::python::list l = extract<boost::python::list>(temp);
for (int i = 0; i < boost::python::len(l); ++i) {
result.append(extract<MOBase::PluginSetting>(l[i]));
}
}
} catch (const boost::python::error_already_set&) {
reportPythonError();
}
return result;
}
-44
View File
@@ -1,44 +0,0 @@
#ifndef PYTHONPLUGINWRAPPER_H
#define PYTHONPLUGINWRAPPER_H
#include <iplugin.h>
#ifndef Q_MOC_RUN
#include <boost/python.hpp>
#endif
class PythonPluginWrapper : public virtual MOBase::IPlugin
{
public:
PythonPluginWrapper(const boost::python::object &initFunction,
const boost::python::object &nameFunction,
const boost::python::object &authorFunction,
const boost::python::object &descriptionFunction,
const boost::python::object &versionFunction,
const boost::python::object &isActiveFunction,
const boost::python::object &settingsFunction);
virtual bool init(MOBase::IOrganizer *moInfo);
virtual QString name() const;
virtual QString author() const;
virtual QString description() const;
virtual MOBase::VersionInfo version() const;
virtual bool isActive() const;
virtual QList<MOBase::PluginSetting> settings() const;
protected:
void reportPythonError() const;
private:
boost::python::object m_InitFunction;
boost::python::object m_NameFunction;
boost::python::object m_AuthorFunction;
boost::python::object m_DescriptionFunction;
boost::python::object m_VersionFunction;
boost::python::object m_IsActiveFunction;
boost::python::object m_SettingsFunction;
};
#endif // PYTHONPLUGINWRAPPER_H
-80
View File
@@ -1,80 +0,0 @@
#include "pythontoolwrapper.h"
#include <QApplication>
#include <QWidget>
using boost::python::extract;
using boost::python::handle_exception;
PythonToolWrapper::PythonToolWrapper(const boost::python::object &initFunction,
const boost::python::object &nameFunction,
const boost::python::object &authorFunction,
const boost::python::object &descriptionFunction,
const boost::python::object &versionFunction,
const boost::python::object &isActiveFunction,
const boost::python::object &settingsFunction,
const boost::python::object &displayNameFunction,
const boost::python::object &tooltipFunction,
const boost::python::object &iconFunction,
const boost::python::object &displayFunction,
const boost::python::object &setParentWidget)
: PythonPluginWrapper(initFunction, nameFunction, authorFunction, descriptionFunction,
versionFunction, isActiveFunction, settingsFunction)
, m_DisplayNameFunction(displayNameFunction)
, m_ToolTipFunction(tooltipFunction)
, m_IconFunction(iconFunction)
, m_DisplayFunction(displayFunction)
, m_SetParentWidget(setParentWidget)
{
}
QString PythonToolWrapper::displayName() const
{
try {
return boost::python::extract<QString>(m_DisplayNameFunction());
} catch (const boost::python::error_already_set&) {
reportPythonError();
return QString();
}
}
QString PythonToolWrapper::tooltip() const
{
try {
return boost::python::extract<QString>(m_ToolTipFunction());
} catch (const boost::python::error_already_set&) {
reportPythonError();
return QString();
}
}
QIcon PythonToolWrapper::icon() const
{
try {
std::vector<const char*> rows;
boost::python::object l = m_IconFunction();
if (!l.is_none()) {
for (int i = 0; i < boost::python::len(l); ++i) {
rows.push_back(extract<const char*>(l[i]));
}
return QIcon(QPixmap(&rows[0]));
} else {
return QIcon();
}
} catch (const boost::python::error_already_set&) {
reportPythonError();
return QIcon();
}
}
void PythonToolWrapper::display() const
{
try {
m_SetParentWidget(parentWidget());
m_DisplayFunction();
} catch (const boost::python::error_already_set&) {
reportPythonError();
}
}
-56
View File
@@ -1,56 +0,0 @@
#ifndef PYTHONTOOLWRAPPER_H
#define PYTHONTOOLWRAPPER_H
#include <iplugintool.h>
#ifndef Q_MOC_RUN
#include <boost/python.hpp>
#endif
#include "pythonpluginwrapper.h"
class PythonToolWrapper : public QObject, public MOBase::IPluginTool, public PythonPluginWrapper
{
Q_OBJECT
Q_INTERFACES(MOBase::IPlugin MOBase::IPluginTool)
public:
PythonToolWrapper(const boost::python::object &initFunction,
const boost::python::object &nameFunction,
const boost::python::object &authorFunction,
const boost::python::object &descriptionFunction,
const boost::python::object &versionFunction,
const boost::python::object &isActiveFunction,
const boost::python::object &settingsFunction,
const boost::python::object &displayNameFunction,
const boost::python::object &tooltipFunction,
const boost::python::object &iconFunction,
const boost::python::object &displayFunction,
const boost::python::object &setParentWidget);
using PythonPluginWrapper::init;
using PythonPluginWrapper::name;
virtual QString displayName() const;
virtual QString tooltip() const;
virtual QIcon icon() const;
public slots:
virtual void display() const;
private:
boost::python::object m_DisplayNameFunction;
boost::python::object m_ToolTipFunction;
boost::python::object m_IconFunction;
boost::python::object m_DisplayFunction;
boost::python::object m_SetParentWidget;
};
#endif // PYTHONTOOLWRAPPER_H
+17
View File
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>QObject</name>
<message>
<location filename="runner/error.h" line="68"/>
<source>An unexpected C++ exception was thrown in python code.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="runner/error.h" line="117"/>
<source>An unknown exception was thrown in python code.</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
+52
View File
@@ -0,0 +1,52 @@
cmake_minimum_required(VERSION 3.16)
project(pythonrunner)
set(project_type plugin)
set(enable_warnings OFF)
set(enable_bigobj ON)
set(install_dir bin/plugins/data)
set(create_translations ON)
add_compile_definitions(
QT_NO_KEYWORDS
PYTHONRUNNER_LIBRARY)
# appveyor does not build modorganizer in its standard location, so use
# DEPENDENCIES_DIR to find cmake_common
if(DEFINED DEPENDENCIES_DIR)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/project.cmake)
include(${DEPENDENCIES_DIR}/modorganizer_super/cmake_common/src.cmake)
else()
include(../../../cmake_common/project.cmake)
include(../../../cmake_common/src.cmake)
endif()
requires_project(game_features)
requires_library(python)
add_filter(NAME src/converters GROUPS
converters
pythonutils
shared_ptr_converter
tuple_helper
variant_helper
)
add_filter(NAME src/runner GROUPS
pythonrunner
pylogger
widgets
)
add_filter(NAME src/utils GROUPS
error
gilock
sipapiaccess
)
add_filter(NAME src/wrappers GROUPS
gamefeatureswrappers
proxypluginwrappers
pythonwrapperutilities
uibasewrappers
)
+63
View File
@@ -0,0 +1,63 @@
Import('qt_env')
env = qt_env.Clone()
env.EnableQtModules('Core', 'Gui', 'Widgets')
env.AppendUnique(CPPDEFINES = 'PYTHONRUNNER_LIBRARY')
# suppress a few warnings caused by boost vs vc++ paranoia
# NB HAVE_ROUND causes a warning because it's defined in pythonrunner.cpp
env.AppendUnique(CPPDEFINES = [
'_SCL_SECURE_NO_WARNINGS',
'HAVE_ROUND'
])
# Boost produces very long names with msvc truncates. Doesn't seem to cause
# problems.
env.AppendUnique(CPPFLAGS = [ '-wd4503' ])
# QMAKE_CXXFLAGS += /Zi
# QMAKE_LFLAGS += /DEBUG
env.RequireLibraries('uibase')
# AppendUnique appears not to work with QT4
env['CPPPATH'] += [
'${BOOSTPATH}',
'${PYTHONPATH}\\include',
]
env.AppendUnique(LIBS = [
'python27', # Could be done better
])
env.AppendUnique(LIBPATH = [
'${PYTHONPATH}/libs', # Could be done better
])
# We have to 'persuade' moc to generate certain other targets and inject them
# into the list of cpps
targets = env.AddExtraMoc(env.Glob('*.h'))
# pythontoolwrapper doesnt compile and isn't in the project file
cpp_files = [
x for x in Glob('*.cpp') if x.name != 'pythontoolwrapper.cpp'
]
lib = env.SharedLibrary('pythonRunner', cpp_files + targets)
env.InstallModule(lib, 'plugins/data')
# However...
# we do need boost-python and pythonvv.dll and pythonvv.zip (though the last
# isn't needed to just bring up the module)
#env.Pseudo('install')
#env.Depends('install',
# (env.Install('${INSTALL_PATH}', 'pyCfg.py'),
# env.Install(os.path.join('${INSTALL_PATH}', 'data'),
# ( ui, rc, 'settings.json' )),
# ))
res = env['QT_USED_MODULES']
Return('res')
File diff suppressed because it is too large Load Diff
+38 -14
View File
@@ -1,24 +1,48 @@
#ifndef Q_MOC_RUN
#include <boost/python.hpp>
#include <QString>
#endif
#include <utility.h>
#include <QDebug>
#include "error.h"
using namespace MOBase;
namespace bpy = boost::python;
void reportPythonError()
ErrWrapper & ErrWrapper::instance()
{
if (PyErr_Occurred()) {
// prints to s_ErrIO buffer
PyErr_Print();
// extract data from python buffer
bpy::object mainModule = bpy::import("__main__");
bpy::object mainNamespace = mainModule.attr("__dict__");
bpy::object errMsgObj = bpy::eval("s_ErrIO.getvalue()", mainNamespace);
QString errMsg = bpy::extract<QString>(errMsgObj.ptr());
bpy::eval("s_ErrIO.truncate(0)", mainNamespace);
static ErrWrapper err;
return err;
}
throw MyException(errMsg);
} else {
throw MyException("An unexpected C++ exception was thrown in python code");
void ErrWrapper::write(const char * message)
{
buffer << message;
if (buffer.tellp() != 0 && buffer.str().back() == '\n')
{
// actually put the string in a variable so it doesn't get destroyed as soon as we get a pointer to its data
std::string string = buffer.str().substr(0, buffer.str().length() - 1);
qCritical().nospace().noquote() << string.c_str();
buffer = std::stringstream();
}
if (recordingExceptionMessage)
{
lastException << message;
}
}
void ErrWrapper::startRecordingExceptionMessage()
{
recordingExceptionMessage = true;
lastException = std::stringstream();
}
void ErrWrapper::stopRecordingExceptionMessage()
{
recordingExceptionMessage = false;
}
QString ErrWrapper::getLastExceptionMessage()
{
return QString::fromStdString(lastException.str());
}

Some files were not shown because too many files have changed in this diff Show More