PrEditor 2.6.0__tar.gz → 2.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. {preditor-2.6.0 → preditor-2.8.0}/PKG-INFO +1 -1
  2. {preditor-2.6.0 → preditor-2.8.0}/PrEditor.egg-info/PKG-INFO +1 -1
  3. {preditor-2.6.0 → preditor-2.8.0}/PrEditor.egg-info/SOURCES.txt +2 -0
  4. preditor-2.8.0/PrEditor.egg-info/scm_file_list.json +221 -0
  5. preditor-2.8.0/PrEditor.egg-info/scm_version.json +8 -0
  6. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/completer.py +7 -10
  7. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/console_base.py +10 -5
  8. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/drag_tab_bar.py +7 -3
  9. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/loggerwindow.py +1 -1
  10. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/workbox_mixin.py +3 -1
  11. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/workboxwidget.py +1 -1
  12. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/documenteditor.py +12 -12
  13. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/finddialog.py +4 -4
  14. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/ui/finddialog.ui +5 -5
  15. {preditor-2.6.0 → preditor-2.8.0}/preditor/stream/director.py +48 -11
  16. preditor-2.8.0/preditor/version.py +24 -0
  17. preditor-2.6.0/preditor/version.py +0 -34
  18. {preditor-2.6.0 → preditor-2.8.0}/.coveragerc +0 -0
  19. {preditor-2.6.0 → preditor-2.8.0}/.github/ISSUE_TEMPLATE/BUG_REPORT.md +0 -0
  20. {preditor-2.6.0 → preditor-2.8.0}/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +0 -0
  21. {preditor-2.6.0 → preditor-2.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  22. {preditor-2.6.0 → preditor-2.8.0}/.github/workflows/release.yml +0 -0
  23. {preditor-2.6.0 → preditor-2.8.0}/.github/workflows/static-analysis-and-test.yml +0 -0
  24. {preditor-2.6.0 → preditor-2.8.0}/.gitignore +0 -0
  25. {preditor-2.6.0 → preditor-2.8.0}/.pre-commit-config.yaml +0 -0
  26. {preditor-2.6.0 → preditor-2.8.0}/CODE_OF_CONDUCT.md +0 -0
  27. {preditor-2.6.0 → preditor-2.8.0}/CONTRIBUTING.md +0 -0
  28. {preditor-2.6.0 → preditor-2.8.0}/LICENSE +0 -0
  29. {preditor-2.6.0 → preditor-2.8.0}/MANIFEST.in +0 -0
  30. {preditor-2.6.0 → preditor-2.8.0}/PrEditor.egg-info/dependency_links.txt +0 -0
  31. {preditor-2.6.0 → preditor-2.8.0}/PrEditor.egg-info/entry_points.txt +0 -0
  32. {preditor-2.6.0 → preditor-2.8.0}/PrEditor.egg-info/requires.txt +0 -0
  33. {preditor-2.6.0 → preditor-2.8.0}/PrEditor.egg-info/top_level.txt +0 -0
  34. {preditor-2.6.0 → preditor-2.8.0}/README.md +0 -0
  35. {preditor-2.6.0 → preditor-2.8.0}/examples/add_to_app.py +0 -0
  36. {preditor-2.6.0 → preditor-2.8.0}/examples/output_capture_and_show.py +0 -0
  37. {preditor-2.6.0 → preditor-2.8.0}/examples/output_console.py +0 -0
  38. {preditor-2.6.0 → preditor-2.8.0}/examples/output_console.ui +0 -0
  39. {preditor-2.6.0 → preditor-2.8.0}/preditor/__init__.py +0 -0
  40. {preditor-2.6.0 → preditor-2.8.0}/preditor/__main__.py +0 -0
  41. {preditor-2.6.0 → preditor-2.8.0}/preditor/about_module.py +0 -0
  42. {preditor-2.6.0 → preditor-2.8.0}/preditor/cli.py +0 -0
  43. {preditor-2.6.0 → preditor-2.8.0}/preditor/config.py +0 -0
  44. {preditor-2.6.0 → preditor-2.8.0}/preditor/constants.py +0 -0
  45. {preditor-2.6.0 → preditor-2.8.0}/preditor/contexts.py +0 -0
  46. {preditor-2.6.0 → preditor-2.8.0}/preditor/cores/__init__.py +0 -0
  47. {preditor-2.6.0 → preditor-2.8.0}/preditor/cores/core.py +0 -0
  48. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/.hab.json +0 -0
  49. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/maya/PrEditor_maya.mod +0 -0
  50. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/maya/README.md +0 -0
  51. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/maya/plug-ins/PrEditor_maya.py +0 -0
  52. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/studiomax/PackageContents.xml +0 -0
  53. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/studiomax/PrEditor-PrEditor_Show.mcr +0 -0
  54. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/studiomax/README.md +0 -0
  55. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/studiomax/preditor.ms +0 -0
  56. {preditor-2.6.0 → preditor-2.8.0}/preditor/dccs/studiomax/preditor_menu.mnx +0 -0
  57. {preditor-2.6.0 → preditor-2.8.0}/preditor/debug.py +0 -0
  58. {preditor-2.6.0 → preditor-2.8.0}/preditor/delayable_engine/__init__.py +0 -0
  59. {preditor-2.6.0 → preditor-2.8.0}/preditor/delayable_engine/delayables.py +0 -0
  60. {preditor-2.6.0 → preditor-2.8.0}/preditor/enum.py +0 -0
  61. {preditor-2.6.0 → preditor-2.8.0}/preditor/excepthooks.py +0 -0
  62. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/__init__.py +0 -0
  63. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/app.py +0 -0
  64. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/codehighlighter.py +0 -0
  65. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/console.py +0 -0
  66. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/dialog.py +0 -0
  67. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/editor_chooser.py +0 -0
  68. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/errordialog.py +0 -0
  69. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/find_files.py +0 -0
  70. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/fuzzy_search/__init__.py +0 -0
  71. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/fuzzy_search/fuzzy_search.py +0 -0
  72. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/group_tab_widget/__init__.py +0 -0
  73. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/group_tab_widget/group_tab_widget.py +0 -0
  74. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/group_tab_widget/grouped_tab_menu.py +0 -0
  75. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/group_tab_widget/grouped_tab_models.py +0 -0
  76. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/group_tab_widget/grouped_tab_widget.py +0 -0
  77. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/group_tab_widget/one_tab_widget.py +0 -0
  78. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/level_buttons.py +0 -0
  79. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/logger_window_handler.py +0 -0
  80. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/logger_window_plugin.py +0 -0
  81. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/newtabwidget.py +0 -0
  82. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/output_console.py +0 -0
  83. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/qtdesigner/__init__.py +0 -0
  84. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/qtdesigner/_log_plugin.py +0 -0
  85. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/qtdesigner/console_base_plugin.py +0 -0
  86. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/qtdesigner/console_predit_plugin.py +0 -0
  87. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/set_text_editor_path_dialog.py +0 -0
  88. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/status_label.py +0 -0
  89. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/suggest_path_quotes_dialog.py +0 -0
  90. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/ui/editor_chooser.ui +0 -0
  91. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/ui/errordialog.ui +0 -0
  92. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/ui/find_files.ui +0 -0
  93. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/ui/loggerwindow.ui +0 -0
  94. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/ui/set_text_editor_path_dialog.ui +0 -0
  95. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/ui/suggest_path_quotes_dialog.ui +0 -0
  96. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/window.py +0 -0
  97. {preditor-2.6.0 → preditor-2.8.0}/preditor/gui/workbox_text_edit.py +0 -0
  98. {preditor-2.6.0 → preditor-2.8.0}/preditor/logging_config.py +0 -0
  99. {preditor-2.6.0 → preditor-2.8.0}/preditor/osystem.py +0 -0
  100. {preditor-2.6.0 → preditor-2.8.0}/preditor/plugins.py +0 -0
  101. {preditor-2.6.0 → preditor-2.8.0}/preditor/prefs.py +0 -0
  102. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/error_mail.html +0 -0
  103. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/error_mail_inline.html +0 -0
  104. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/README.md +0 -0
  105. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/arrow_forward.png +0 -0
  106. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/check-bold.png +0 -0
  107. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/chevron-down.png +0 -0
  108. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/chevron-up.png +0 -0
  109. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/close-thick.png +0 -0
  110. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/comment-edit.png +0 -0
  111. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/content-copy.png +0 -0
  112. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/content-cut.png +0 -0
  113. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/content-duplicate.png +0 -0
  114. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/content-paste.png +0 -0
  115. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/content-save.png +0 -0
  116. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/debug_disabled.png +0 -0
  117. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/eye-check.png +0 -0
  118. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/file-plus.png +0 -0
  119. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/file-remove.png +0 -0
  120. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/format-align-left.png +0 -0
  121. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/format-letter-case-lower.png +0 -0
  122. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/format-letter-case-upper.png +0 -0
  123. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/format-letter-case.svg +0 -0
  124. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/information.png +0 -0
  125. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/logging_critical.png +0 -0
  126. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/logging_custom.png +0 -0
  127. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/logging_debug.png +0 -0
  128. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/logging_error.png +0 -0
  129. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/logging_info.png +0 -0
  130. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/logging_not_set.png +0 -0
  131. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/logging_warning.png +0 -0
  132. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/marker.png +0 -0
  133. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/play.png +0 -0
  134. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/playlist-play.png +0 -0
  135. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/plus-minus-variant.png +0 -0
  136. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/preditor.ico +0 -0
  137. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/preditor.png +0 -0
  138. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/preditor.psd +0 -0
  139. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/preditor.svg +0 -0
  140. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/regex.svg +0 -0
  141. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/restart.svg +0 -0
  142. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/skip-forward-outline.png +0 -0
  143. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/skip-next-outline.png +0 -0
  144. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/skip-next.png +0 -0
  145. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/skip-previous.png +0 -0
  146. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/subdirectory-arrow-right.png +0 -0
  147. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/text-search-variant.png +0 -0
  148. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/img/warning-big.png +0 -0
  149. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/lang/python.json +0 -0
  150. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/pref_updates/pref_updates.json +0 -0
  151. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/settings.ini +0 -0
  152. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/stylesheet/Bright.css +0 -0
  153. {preditor-2.6.0 → preditor-2.8.0}/preditor/resource/stylesheet/Dark.css +0 -0
  154. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/__init__.py +0 -0
  155. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/delayables/__init__.py +0 -0
  156. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/delayables/smart_highlight.py +0 -0
  157. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/delayables/spell_check.py +0 -0
  158. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/__init__.py +0 -0
  159. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/bash.ini +0 -0
  160. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/batch.ini +0 -0
  161. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/cpp.ini +0 -0
  162. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/css.ini +0 -0
  163. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/eyeonscript.ini +0 -0
  164. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/html.ini +0 -0
  165. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/javascript.ini +0 -0
  166. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/lua.ini +0 -0
  167. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/maxscript.ini +0 -0
  168. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/mel.ini +0 -0
  169. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/mu.ini +0 -0
  170. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/nsi.ini +0 -0
  171. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/perl.ini +0 -0
  172. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/puppet.ini +0 -0
  173. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/python.ini +0 -0
  174. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/ruby.ini +0 -0
  175. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/sql.ini +0 -0
  176. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/xml.ini +0 -0
  177. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/config/yaml.ini +0 -0
  178. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lang/language.py +0 -0
  179. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lexers/__init__.py +0 -0
  180. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lexers/cpplexer.py +0 -0
  181. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lexers/javascriptlexer.py +0 -0
  182. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lexers/maxscriptlexer.py +0 -0
  183. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lexers/mellexer.py +0 -0
  184. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lexers/mulexer.py +0 -0
  185. {preditor-2.6.0 → preditor-2.8.0}/preditor/scintilla/lexers/pythonlexer.py +0 -0
  186. {preditor-2.6.0 → preditor-2.8.0}/preditor/settings.py +0 -0
  187. {preditor-2.6.0 → preditor-2.8.0}/preditor/stream/__init__.py +0 -0
  188. {preditor-2.6.0 → preditor-2.8.0}/preditor/stream/console_handler.py +0 -0
  189. {preditor-2.6.0 → preditor-2.8.0}/preditor/stream/manager.py +0 -0
  190. {preditor-2.6.0 → preditor-2.8.0}/preditor/streamhandler_helper.py +0 -0
  191. {preditor-2.6.0 → preditor-2.8.0}/preditor/utils/__init__.py +0 -0
  192. {preditor-2.6.0 → preditor-2.8.0}/preditor/utils/call_stack.py +0 -0
  193. {preditor-2.6.0 → preditor-2.8.0}/preditor/utils/cute.py +0 -0
  194. {preditor-2.6.0 → preditor-2.8.0}/preditor/utils/stylesheets.py +0 -0
  195. {preditor-2.6.0 → preditor-2.8.0}/preditor/utils/text_search.py +0 -0
  196. {preditor-2.6.0 → preditor-2.8.0}/preditor/weakref.py +0 -0
  197. {preditor-2.6.0 → preditor-2.8.0}/pyproject.toml +0 -0
  198. {preditor-2.6.0 → preditor-2.8.0}/requirements-cli.txt +0 -0
  199. {preditor-2.6.0 → preditor-2.8.0}/requirements-dev.txt +0 -0
  200. {preditor-2.6.0 → preditor-2.8.0}/requirements-qsci5.txt +0 -0
  201. {preditor-2.6.0 → preditor-2.8.0}/requirements-qsci6.txt +0 -0
  202. {preditor-2.6.0 → preditor-2.8.0}/requirements-shortcut.txt +0 -0
  203. {preditor-2.6.0 → preditor-2.8.0}/requirements.txt +0 -0
  204. {preditor-2.6.0 → preditor-2.8.0}/setup.cfg +0 -0
  205. {preditor-2.6.0 → preditor-2.8.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PrEditor
3
- Version: 2.6.0
3
+ Version: 2.8.0
4
4
  Summary: A python REPL and Editor and console based on Qt.
5
5
  Author-email: Blur Studio <opensource@blur.com>
6
6
  License: LGPL-3.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PrEditor
3
- Version: 2.6.0
3
+ Version: 2.8.0
4
4
  Summary: A python REPL and Editor and console based on Qt.
5
5
  Author-email: Blur Studio <opensource@blur.com>
6
6
  License: LGPL-3.0
@@ -24,6 +24,8 @@ PrEditor.egg-info/SOURCES.txt
24
24
  PrEditor.egg-info/dependency_links.txt
25
25
  PrEditor.egg-info/entry_points.txt
26
26
  PrEditor.egg-info/requires.txt
27
+ PrEditor.egg-info/scm_file_list.json
28
+ PrEditor.egg-info/scm_version.json
27
29
  PrEditor.egg-info/top_level.txt
28
30
  examples/add_to_app.py
29
31
  examples/output_capture_and_show.py
@@ -0,0 +1,221 @@
1
+ {
2
+ "files": [
3
+ ".coveragerc",
4
+ ".github/ISSUE_TEMPLATE/BUG_REPORT.md",
5
+ ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.md",
6
+ ".github/PULL_REQUEST_TEMPLATE.md",
7
+ ".github/workflows/release.yml",
8
+ ".github/workflows/static-analysis-and-test.yml",
9
+ ".gitignore",
10
+ ".pre-commit-config.yaml",
11
+ "CODE_OF_CONDUCT.md",
12
+ "CONTRIBUTING.md",
13
+ "LICENSE",
14
+ "MANIFEST.in",
15
+ "README.md",
16
+ "examples/add_to_app.py",
17
+ "examples/output_capture_and_show.py",
18
+ "examples/output_console.py",
19
+ "examples/output_console.ui",
20
+ "preditor/__init__.py",
21
+ "preditor/__main__.py",
22
+ "preditor/about_module.py",
23
+ "preditor/cli.py",
24
+ "preditor/config.py",
25
+ "preditor/constants.py",
26
+ "preditor/contexts.py",
27
+ "preditor/cores/__init__.py",
28
+ "preditor/cores/core.py",
29
+ "preditor/dccs/.hab.json",
30
+ "preditor/dccs/maya/PrEditor_maya.mod",
31
+ "preditor/dccs/maya/README.md",
32
+ "preditor/dccs/maya/plug-ins/PrEditor_maya.py",
33
+ "preditor/dccs/studiomax/PackageContents.xml",
34
+ "preditor/dccs/studiomax/PrEditor-PrEditor_Show.mcr",
35
+ "preditor/dccs/studiomax/README.md",
36
+ "preditor/dccs/studiomax/preditor.ms",
37
+ "preditor/dccs/studiomax/preditor_menu.mnx",
38
+ "preditor/debug.py",
39
+ "preditor/delayable_engine/__init__.py",
40
+ "preditor/delayable_engine/delayables.py",
41
+ "preditor/enum.py",
42
+ "preditor/excepthooks.py",
43
+ "preditor/gui/__init__.py",
44
+ "preditor/gui/app.py",
45
+ "preditor/gui/codehighlighter.py",
46
+ "preditor/gui/completer.py",
47
+ "preditor/gui/console.py",
48
+ "preditor/gui/console_base.py",
49
+ "preditor/gui/dialog.py",
50
+ "preditor/gui/drag_tab_bar.py",
51
+ "preditor/gui/editor_chooser.py",
52
+ "preditor/gui/errordialog.py",
53
+ "preditor/gui/find_files.py",
54
+ "preditor/gui/fuzzy_search/__init__.py",
55
+ "preditor/gui/fuzzy_search/fuzzy_search.py",
56
+ "preditor/gui/group_tab_widget/__init__.py",
57
+ "preditor/gui/group_tab_widget/group_tab_widget.py",
58
+ "preditor/gui/group_tab_widget/grouped_tab_menu.py",
59
+ "preditor/gui/group_tab_widget/grouped_tab_models.py",
60
+ "preditor/gui/group_tab_widget/grouped_tab_widget.py",
61
+ "preditor/gui/group_tab_widget/one_tab_widget.py",
62
+ "preditor/gui/level_buttons.py",
63
+ "preditor/gui/logger_window_handler.py",
64
+ "preditor/gui/logger_window_plugin.py",
65
+ "preditor/gui/loggerwindow.py",
66
+ "preditor/gui/newtabwidget.py",
67
+ "preditor/gui/output_console.py",
68
+ "preditor/gui/qtdesigner/__init__.py",
69
+ "preditor/gui/qtdesigner/_log_plugin.py",
70
+ "preditor/gui/qtdesigner/console_base_plugin.py",
71
+ "preditor/gui/qtdesigner/console_predit_plugin.py",
72
+ "preditor/gui/set_text_editor_path_dialog.py",
73
+ "preditor/gui/status_label.py",
74
+ "preditor/gui/suggest_path_quotes_dialog.py",
75
+ "preditor/gui/ui/editor_chooser.ui",
76
+ "preditor/gui/ui/errordialog.ui",
77
+ "preditor/gui/ui/find_files.ui",
78
+ "preditor/gui/ui/loggerwindow.ui",
79
+ "preditor/gui/ui/set_text_editor_path_dialog.ui",
80
+ "preditor/gui/ui/suggest_path_quotes_dialog.ui",
81
+ "preditor/gui/window.py",
82
+ "preditor/gui/workbox_mixin.py",
83
+ "preditor/gui/workbox_text_edit.py",
84
+ "preditor/gui/workboxwidget.py",
85
+ "preditor/logging_config.py",
86
+ "preditor/osystem.py",
87
+ "preditor/plugins.py",
88
+ "preditor/prefs.py",
89
+ "preditor/resource/error_mail.html",
90
+ "preditor/resource/error_mail_inline.html",
91
+ "preditor/resource/img/README.md",
92
+ "preditor/resource/img/arrow_forward.png",
93
+ "preditor/resource/img/check-bold.png",
94
+ "preditor/resource/img/chevron-down.png",
95
+ "preditor/resource/img/chevron-up.png",
96
+ "preditor/resource/img/close-thick.png",
97
+ "preditor/resource/img/comment-edit.png",
98
+ "preditor/resource/img/content-copy.png",
99
+ "preditor/resource/img/content-cut.png",
100
+ "preditor/resource/img/content-duplicate.png",
101
+ "preditor/resource/img/content-paste.png",
102
+ "preditor/resource/img/content-save.png",
103
+ "preditor/resource/img/debug_disabled.png",
104
+ "preditor/resource/img/eye-check.png",
105
+ "preditor/resource/img/file-plus.png",
106
+ "preditor/resource/img/file-remove.png",
107
+ "preditor/resource/img/format-align-left.png",
108
+ "preditor/resource/img/format-letter-case-lower.png",
109
+ "preditor/resource/img/format-letter-case-upper.png",
110
+ "preditor/resource/img/format-letter-case.svg",
111
+ "preditor/resource/img/information.png",
112
+ "preditor/resource/img/logging_critical.png",
113
+ "preditor/resource/img/logging_custom.png",
114
+ "preditor/resource/img/logging_debug.png",
115
+ "preditor/resource/img/logging_error.png",
116
+ "preditor/resource/img/logging_info.png",
117
+ "preditor/resource/img/logging_not_set.png",
118
+ "preditor/resource/img/logging_warning.png",
119
+ "preditor/resource/img/marker.png",
120
+ "preditor/resource/img/play.png",
121
+ "preditor/resource/img/playlist-play.png",
122
+ "preditor/resource/img/plus-minus-variant.png",
123
+ "preditor/resource/img/preditor.ico",
124
+ "preditor/resource/img/preditor.png",
125
+ "preditor/resource/img/preditor.psd",
126
+ "preditor/resource/img/preditor.svg",
127
+ "preditor/resource/img/regex.svg",
128
+ "preditor/resource/img/restart.svg",
129
+ "preditor/resource/img/skip-forward-outline.png",
130
+ "preditor/resource/img/skip-next-outline.png",
131
+ "preditor/resource/img/skip-next.png",
132
+ "preditor/resource/img/skip-previous.png",
133
+ "preditor/resource/img/subdirectory-arrow-right.png",
134
+ "preditor/resource/img/text-search-variant.png",
135
+ "preditor/resource/img/warning-big.png",
136
+ "preditor/resource/lang/python.json",
137
+ "preditor/resource/pref_updates/pref_updates.json",
138
+ "preditor/resource/settings.ini",
139
+ "preditor/resource/stylesheet/Bright.css",
140
+ "preditor/resource/stylesheet/Dark.css",
141
+ "preditor/scintilla/__init__.py",
142
+ "preditor/scintilla/delayables/__init__.py",
143
+ "preditor/scintilla/delayables/smart_highlight.py",
144
+ "preditor/scintilla/delayables/spell_check.py",
145
+ "preditor/scintilla/documenteditor.py",
146
+ "preditor/scintilla/finddialog.py",
147
+ "preditor/scintilla/lang/__init__.py",
148
+ "preditor/scintilla/lang/config/bash.ini",
149
+ "preditor/scintilla/lang/config/batch.ini",
150
+ "preditor/scintilla/lang/config/cpp.ini",
151
+ "preditor/scintilla/lang/config/css.ini",
152
+ "preditor/scintilla/lang/config/eyeonscript.ini",
153
+ "preditor/scintilla/lang/config/html.ini",
154
+ "preditor/scintilla/lang/config/javascript.ini",
155
+ "preditor/scintilla/lang/config/lua.ini",
156
+ "preditor/scintilla/lang/config/maxscript.ini",
157
+ "preditor/scintilla/lang/config/mel.ini",
158
+ "preditor/scintilla/lang/config/mu.ini",
159
+ "preditor/scintilla/lang/config/nsi.ini",
160
+ "preditor/scintilla/lang/config/perl.ini",
161
+ "preditor/scintilla/lang/config/puppet.ini",
162
+ "preditor/scintilla/lang/config/python.ini",
163
+ "preditor/scintilla/lang/config/ruby.ini",
164
+ "preditor/scintilla/lang/config/sql.ini",
165
+ "preditor/scintilla/lang/config/xml.ini",
166
+ "preditor/scintilla/lang/config/yaml.ini",
167
+ "preditor/scintilla/lang/language.py",
168
+ "preditor/scintilla/lexers/__init__.py",
169
+ "preditor/scintilla/lexers/cpplexer.py",
170
+ "preditor/scintilla/lexers/javascriptlexer.py",
171
+ "preditor/scintilla/lexers/maxscriptlexer.py",
172
+ "preditor/scintilla/lexers/mellexer.py",
173
+ "preditor/scintilla/lexers/mulexer.py",
174
+ "preditor/scintilla/lexers/pythonlexer.py",
175
+ "preditor/scintilla/ui/finddialog.ui",
176
+ "preditor/settings.py",
177
+ "preditor/stream/__init__.py",
178
+ "preditor/stream/console_handler.py",
179
+ "preditor/stream/director.py",
180
+ "preditor/stream/manager.py",
181
+ "preditor/streamhandler_helper.py",
182
+ "preditor/utils/__init__.py",
183
+ "preditor/utils/call_stack.py",
184
+ "preditor/utils/cute.py",
185
+ "preditor/utils/stylesheets.py",
186
+ "preditor/utils/text_search.py",
187
+ "preditor/weakref.py",
188
+ "pyproject.toml",
189
+ "requirements-cli.txt",
190
+ "requirements-dev.txt",
191
+ "requirements-qsci5.txt",
192
+ "requirements-qsci6.txt",
193
+ "requirements-shortcut.txt",
194
+ "requirements.txt",
195
+ "tests/conftest.py",
196
+ "tests/encodings/a_utf-8.txt",
197
+ "tests/encodings/b_utf-8.txt",
198
+ "tests/encodings/test_ecoding.py",
199
+ "tests/find_files/re_greedy_False_0_True.md",
200
+ "tests/find_files/re_greedy_False_2_True.md",
201
+ "tests/find_files/re_greedy_True_2_True.md",
202
+ "tests/find_files/re_greedy_upper_True_2_True.md",
203
+ "tests/find_files/re_simple_False_0_True.md",
204
+ "tests/find_files/re_simple_False_2_True.md",
205
+ "tests/find_files/re_simple_False_3_True.md",
206
+ "tests/find_files/re_simple_True_2_True.md",
207
+ "tests/find_files/simple_False_0_False.md",
208
+ "tests/find_files/simple_False_1_False.md",
209
+ "tests/find_files/simple_False_2_False.md",
210
+ "tests/find_files/simple_False_3_False.md",
211
+ "tests/find_files/simple_True_2_False.md",
212
+ "tests/find_files/tab_text.txt",
213
+ "tests/find_files/test_find_files.py",
214
+ "tests/ide/test_delayable_engine.py",
215
+ "tests/test_config.py",
216
+ "tests/test_cute.py",
217
+ "tests/test_prefs.py",
218
+ "tests/test_stream.py",
219
+ "tox.ini"
220
+ ]
221
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.8.0",
3
+ "distance": 0,
4
+ "node": "ge6dd558d24b9e26fa7b9276b7fba723b31a1558a",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-17"
8
+ }
@@ -5,8 +5,7 @@ import re
5
5
  import sys
6
6
  from enum import Enum
7
7
 
8
- import Qt as Qt_py
9
- from Qt.QtCore import QRegExp, QSortFilterProxyModel, QStringListModel, Qt
8
+ from Qt.QtCore import QRegularExpression, QSortFilterProxyModel, QStringListModel, Qt
10
9
  from Qt.QtGui import QCursor, QTextCursor
11
10
  from Qt.QtWidgets import QCompleter, QToolTip
12
11
 
@@ -160,14 +159,12 @@ class PythonCompleter(QCompleter):
160
159
  if self._completerMode == CompleterMode.FULL_FUZZY:
161
160
  regExStr = ".*".join(prefix)
162
161
 
163
- if Qt_py.IsPyQt6 or Qt_py.IsPySide6:
164
- regexp = QRegExp(regExStr)
165
- if self._sensitivity:
166
- regexp.setPatternOptions(QRegExp.PatternOption.CaseInsensitiveOption)
167
- self.filterModel.setFilterRegularExpression(regexp)
168
- else:
169
- regexp = QRegExp(regExStr, self._sensitivity)
170
- self.filterModel.setFilterRegExp(regexp)
162
+ regexp = QRegularExpression(regExStr)
163
+ if self._sensitivity == Qt.CaseSensitivity.CaseInsensitive:
164
+ regexp.setPatternOptions(
165
+ QRegularExpression.PatternOption.CaseInsensitiveOption
166
+ )
167
+ self.filterModel.setFilterRegularExpression(regexp)
171
168
 
172
169
  def clear(self):
173
170
  self.popup().hide()
@@ -18,6 +18,7 @@ from Qt.QtGui import (
18
18
  QTextCursor,
19
19
  )
20
20
  from Qt.QtWidgets import QAction, QApplication, QTextEdit, QWidget
21
+ from Qt.QtCompat import QMouseEvent
21
22
 
22
23
  from .. import instance, resourcePath, stream
23
24
  from ..constants import StreamType
@@ -136,6 +137,7 @@ class ConsoleBase(QTextEdit):
136
137
  def contextMenuEvent(self, event):
137
138
  """Builds a custom right click menu to show."""
138
139
  # Create the standard menu and allow subclasses to customize it
140
+ # The event.pos method for QContextMenuEvent was NOT removed
139
141
  menu = self.createStandardContextMenu(event.pos())
140
142
  menu = self.update_context_menu(menu)
141
143
  if self.controller:
@@ -432,7 +434,8 @@ class ConsoleBase(QTextEdit):
432
434
  """Overload of mousePressEvent to change mouse pointer to indicate it is
433
435
  over a clickable error hyperlink.
434
436
  """
435
- if self.anchorAt(event.pos()):
437
+ pos = QMouseEvent.position(event).toPoint()
438
+ if self.anchorAt(pos):
436
439
  self.viewport().setCursor(Qt.CursorShape.PointingHandCursor)
437
440
  else:
438
441
  self.viewport().unsetCursor()
@@ -444,8 +447,9 @@ class ConsoleBase(QTextEdit):
444
447
  select text), we check if user clicked an error hyperlink.
445
448
  """
446
449
  left = event.button() == Qt.MouseButton.LeftButton
447
- anchor = self.anchorAt(event.pos())
448
- self.mousePressPos = event.pos()
450
+ pos = QMouseEvent.position(event).toPoint()
451
+ anchor = self.anchorAt(pos)
452
+ self.mousePressPos = pos
449
453
 
450
454
  if left and anchor:
451
455
  event.ignore()
@@ -457,9 +461,10 @@ class ConsoleBase(QTextEdit):
457
461
  """Overload of mouseReleaseEvent to capture if user has left clicked... Check if
458
462
  click position is the same as release position, if so, call errorHyperlink.
459
463
  """
460
- samePos = event.pos() == self.mousePressPos
464
+ pos = QMouseEvent.position(event).toPoint()
465
+ samePos = pos == self.mousePressPos
461
466
  left = event.button() == Qt.MouseButton.LeftButton
462
- anchor = self.anchorAt(event.pos())
467
+ anchor = self.anchorAt(pos)
463
468
 
464
469
  if samePos and left and anchor:
465
470
  self.errorHyperlink(anchor)
@@ -14,6 +14,7 @@ from Qt.QtWidgets import (
14
14
  QSizePolicy,
15
15
  QTabBar,
16
16
  )
17
+ from Qt.QtCompat import QMouseEvent, QDragMoveEvent
17
18
 
18
19
  from preditor import osystem
19
20
 
@@ -236,7 +237,8 @@ class DragTabBar(QTabBar):
236
237
 
237
238
  # Check if the mouse has moved outside of the widget, if not, let
238
239
  # the QTabBar handle the internal tab movement.
239
- event_pos = event.pos()
240
+
241
+ event_pos = QMouseEvent.position(event).toPoint()
240
242
  global_pos = self.mapToGlobal(event_pos)
241
243
  bar_geo = QRect(self.mapToGlobal(self.pos()), self.size())
242
244
  inside = bar_geo.contains(global_pos)
@@ -268,7 +270,8 @@ class DragTabBar(QTabBar):
268
270
 
269
271
  def mousePressEvent(self, event): # noqa: N802
270
272
  if event.button() == Qt.MouseButton.LeftButton and not self._mime_data:
271
- tab_index = self.tabAt(event.pos())
273
+ pos = QMouseEvent.position(event).toPoint()
274
+ tab_index = self.tabAt(pos)
272
275
 
273
276
  # While we don't remove the tab on mouse press, capture its tab image
274
277
  # and attach it to the mouse. This also stores info needed to handle
@@ -312,7 +315,8 @@ class DragTabBar(QTabBar):
312
315
  # the current tab so users can easily drop inside that tab.
313
316
  if not event.mimeData().hasFormat(self.mime_type):
314
317
  event.accept()
315
- tab_index = self.tabAt(event.pos())
318
+ pos = QDragMoveEvent().position(event).toPoint()
319
+ tab_index = self.tabAt(pos)
316
320
  if tab_index == -1:
317
321
  tab_index = self.count() - 1
318
322
  if self.currentIndex() != tab_index:
@@ -311,7 +311,7 @@ class LoggerWindow(Window):
311
311
 
312
312
  # Tooltips - Qt4 doesn't have a ToolTipsVisible method, so we fake it
313
313
  regEx = ".*"
314
- menus = self.findChildren(QtWidgets.QMenu, QtCore.QRegExp(regEx))
314
+ menus = self.findChildren(QtWidgets.QMenu, QtCore.QRegularExpression(regEx))
315
315
  for menu in menus:
316
316
  menu.hovered.connect(handleMenuHovered)
317
317
 
@@ -655,7 +655,9 @@ class WorkboxMixin(object):
655
655
  # Save the file to disk
656
656
  try:
657
657
  txt = self.__text__()
658
- self.__write_file__(filename, txt, encoding=self._encoding)
658
+ self.__write_file__(
659
+ filename, txt, encoding=self._encoding, toUnixEOL=False
660
+ )
659
661
  self.__set_filename__(filename)
660
662
  self.__set_last_workbox_name__(self.__workbox_name__())
661
663
  self.__set_last_saved_text__(txt)
@@ -285,7 +285,7 @@ class WorkboxWidget(WorkboxMixin, DocumentEditor):
285
285
  # refresh the search text unless we are using regular expressions
286
286
  if (
287
287
  not self._searchDialog.isVisible()
288
- and not self._searchFlags & SearchOptions.QRegExp
288
+ and not self._searchFlags & SearchOptions.Regex
289
289
  ):
290
290
  txt = self.selectedText()
291
291
  if txt:
@@ -49,7 +49,7 @@ class SearchOptions(EnumGroup):
49
49
  Backward = Enum()
50
50
  CaseSensitive = Enum()
51
51
  WholeWords = Enum()
52
- QRegExp = Enum()
52
+ Regex = Enum()
53
53
 
54
54
 
55
55
  @contextmanager
@@ -640,7 +640,7 @@ class DocumentEditor(QsciScintilla):
640
640
  window.uiLanguageDDL.blockSignals(False)
641
641
 
642
642
  def lineMarginWidth(self):
643
- return self.marginWidth(self.SymbolMargin)
643
+ return self.marginWidth(QsciScintilla.MarginType.SymbolMargin)
644
644
 
645
645
  def filename(self):
646
646
  return self._filename
@@ -649,7 +649,7 @@ class DocumentEditor(QsciScintilla):
649
649
  self._filename = filename
650
650
 
651
651
  def findNext(self, text, flags):
652
- re = (flags & SearchOptions.QRegExp) != 0
652
+ re = (flags & SearchOptions.Regex) != 0
653
653
  cs = (flags & SearchOptions.CaseSensitive) != 0
654
654
  wo = (flags & SearchOptions.WholeWords) != 0
655
655
  wrap = True
@@ -663,7 +663,7 @@ class DocumentEditor(QsciScintilla):
663
663
  return result
664
664
 
665
665
  def findPrev(self, text, flags):
666
- re = (flags & SearchOptions.QRegExp) != 0
666
+ re = (flags & SearchOptions.Regex) != 0
667
667
  cs = (flags & SearchOptions.CaseSensitive) != 0
668
668
  wo = (flags & SearchOptions.WholeWords) != 0
669
669
  wrap = True
@@ -932,14 +932,14 @@ class DocumentEditor(QsciScintilla):
932
932
  in the file.
933
933
  """
934
934
  for line in input:
935
- marker = self.markerDefine(self.Circle)
935
+ marker = self.markerDefine(QsciScintilla.MarkerSymbol.Circle)
936
936
  self.markerAdd(line, marker)
937
937
 
938
938
  def markerToggle(self):
939
939
  line, index = self.getCursorPosition()
940
940
  markers = self.markersAtLine(line)
941
941
  if not markers:
942
- marker = self.markerDefine(self.Circle)
942
+ marker = self.markerDefine(QsciScintilla.MarkerSymbol.Circle)
943
943
  self.markerAdd(line, marker)
944
944
  else:
945
945
  self.markerDelete(line)
@@ -1147,7 +1147,7 @@ class DocumentEditor(QsciScintilla):
1147
1147
  )
1148
1148
 
1149
1149
  def setLineMarginWidth(self, width):
1150
- self.setMarginWidth(self.SymbolMargin, width)
1150
+ self.setMarginWidth(QsciScintilla.MarginType.SymbolMargin, width)
1151
1151
 
1152
1152
  def setMarginsFont(self, font):
1153
1153
  super(DocumentEditor, self).setMarginsFont(font)
@@ -1200,12 +1200,12 @@ class DocumentEditor(QsciScintilla):
1200
1200
 
1201
1201
  def setShowFolding(self, state):
1202
1202
  if state:
1203
- self.setFolding(self.BoxedTreeFoldStyle)
1203
+ self.setFolding(QsciScintilla.FoldStyle.BoxedTreeFoldStyle)
1204
1204
  else:
1205
- self.setFolding(self.NoFoldStyle)
1205
+ self.setFolding(QsciScintilla.FoldStyle.NoFoldStyle)
1206
1206
 
1207
1207
  def setShowLineNumbers(self, state):
1208
- self.setMarginLineNumbers(self.SymbolMargin, state)
1208
+ self.setMarginLineNumbers(QsciScintilla.MarginType.SymbolMargin, state)
1209
1209
 
1210
1210
  def setShowSmartHighlighting(self, state):
1211
1211
  self.delayable_engine.set_delayable_enabled('smart_highlight', state)
@@ -1459,10 +1459,10 @@ class DocumentEditor(QsciScintilla):
1459
1459
  self.updateColorScheme()
1460
1460
 
1461
1461
  def showFolding(self):
1462
- return self.folding() != self.NoFoldStyle
1462
+ return self.folding() != QsciScintilla.FoldStyle.NoFoldStyle
1463
1463
 
1464
1464
  def showLineNumbers(self):
1465
- return self.marginLineNumbers(self.SymbolMargin)
1465
+ return self.marginLineNumbers(QsciScintilla.MarginType.SymbolMargin)
1466
1466
 
1467
1467
  def showSmartHighlighting(self):
1468
1468
  return self.delayable_engine.delayable_enabled('smart_highlight')
@@ -16,13 +16,13 @@ class FindDialog(Dialog):
16
16
  self.uiFindWholeWordsCHK.setChecked(
17
17
  parent.searchFlags() & SearchOptions.WholeWords
18
18
  )
19
- self.uiQRegExpCHK.setChecked(parent.searchFlags() & SearchOptions.QRegExp)
19
+ self.uiRegexCHK.setChecked(parent.searchFlags() & SearchOptions.Regex)
20
20
  self.uiSearchTXT.setPlainText(parent.searchText())
21
21
 
22
22
  # update the signals
23
23
  self.uiCaseSensitiveCHK.clicked.connect(self.updateSearchTerms)
24
24
  self.uiFindWholeWordsCHK.clicked.connect(self.updateSearchTerms)
25
- self.uiQRegExpCHK.clicked.connect(self.updateSearchTerms)
25
+ self.uiRegexCHK.clicked.connect(self.updateSearchTerms)
26
26
  self.uiSearchTXT.textChanged.connect(self.updateSearchTerms)
27
27
 
28
28
  self.uiFindNextBTN.clicked.connect(parent.uiFindNextACT.triggered.emit)
@@ -61,8 +61,8 @@ class FindDialog(Dialog):
61
61
  options |= SearchOptions.CaseSensitive
62
62
  if self.uiFindWholeWordsCHK.isChecked():
63
63
  options |= SearchOptions.WholeWords
64
- if self.uiQRegExpCHK.isChecked():
65
- options |= SearchOptions.QRegExp
64
+ if self.uiRegexCHK.isChecked():
65
+ options |= SearchOptions.Regex
66
66
 
67
67
  parent.setSearchFlags(options)
68
68
  parent.setSearchText(self.uiSearchTXT.toPlainText())
@@ -6,7 +6,7 @@
6
6
  <rect>
7
7
  <x>0</x>
8
8
  <y>0</y>
9
- <width>436</width>
9
+ <width>421</width>
10
10
  <height>170</height>
11
11
  </rect>
12
12
  </property>
@@ -115,12 +115,12 @@
115
115
  </widget>
116
116
  </item>
117
117
  <item row="3" column="2">
118
- <widget class="QCheckBox" name="uiQRegExpCHK">
118
+ <widget class="QCheckBox" name="uiRegexCHK">
119
119
  <property name="toolTip">
120
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Use Qt's QRegExp engine to find using regular expressions instead of a plain text find.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
120
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Find using regular expressions instead of plain text.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
121
121
  </property>
122
122
  <property name="text">
123
- <string>QRegExp</string>
123
+ <string>Regex</string>
124
124
  </property>
125
125
  </widget>
126
126
  </item>
@@ -135,7 +135,7 @@
135
135
  <tabstop>uiFindPrevBTN</tabstop>
136
136
  <tabstop>uiFindWholeWordsCHK</tabstop>
137
137
  <tabstop>uiCaseSensitiveCHK</tabstop>
138
- <tabstop>uiQRegExpCHK</tabstop>
138
+ <tabstop>uiRegexCHK</tabstop>
139
139
  <tabstop>uiCloseBTN</tabstop>
140
140
  </tabstops>
141
141
  <resources/>
@@ -6,6 +6,28 @@ import sys
6
6
  from ..constants import StreamType
7
7
 
8
8
 
9
+ def _open_stream(stream):
10
+ """Returns stream if it is still usable, otherwise None.
11
+
12
+ The old_stream a Director wraps may be closed before the Director is. For
13
+ example pytest closes its capture files at the end of a test run. Using a
14
+ closed stream raises ``ValueError: I/O operation on closed file``, so treat
15
+ a closed stream the same as not having an old_stream at all.
16
+
17
+ Note: It's possible the stream is closed after this call so its recommended to
18
+ use a try/except ValueError when accessing the returned stream.
19
+ """
20
+ if stream is None:
21
+ return None
22
+ try:
23
+ if stream.closed:
24
+ return None
25
+ except (AttributeError, ValueError):
26
+ # Not all file like objects implement closed, assume it's usable.
27
+ pass
28
+ return stream
29
+
30
+
9
31
  class _DirectorBuffer(io.RawIOBase):
10
32
  """Binary buffer that forwards text writes to the manager.
11
33
 
@@ -32,8 +54,9 @@ class _DirectorBuffer(io.RawIOBase):
32
54
  self.name = name
33
55
 
34
56
  def flush(self):
35
- if self.old_stream:
36
- self.old_stream.flush()
57
+ old_stream = _open_stream(self.old_stream)
58
+ if old_stream:
59
+ old_stream.flush()
37
60
  super().flush()
38
61
 
39
62
  def writable(self):
@@ -47,8 +70,9 @@ class _DirectorBuffer(io.RawIOBase):
47
70
  msg = b.decode("utf-8", errors="replace")
48
71
  self.manager.write(msg, self.state)
49
72
 
50
- if self.old_stream:
51
- self.old_stream.write(msg)
73
+ old_stream = _open_stream(self.old_stream)
74
+ if old_stream:
75
+ old_stream.write(msg)
52
76
 
53
77
  return len(b)
54
78
 
@@ -115,7 +139,7 @@ class Director(io.TextIOWrapper):
115
139
 
116
140
  def close(self):
117
141
  if (
118
- self.old_stream
142
+ _open_stream(self.old_stream)
119
143
  and not self.std_stream_wrapped
120
144
  and self.old_stream is not sys.__stdout__
121
145
  and self.old_stream is not sys.__stderr__
@@ -131,18 +155,31 @@ class Director(io.TextIOWrapper):
131
155
 
132
156
  # These methods enable terminal features like color coding etc.
133
157
  def isatty(self):
134
- if self.old_stream is not None:
135
- return self.old_stream.isatty()
158
+ old_stream = _open_stream(self.old_stream)
159
+ if old_stream is not None:
160
+ try:
161
+ return old_stream.isatty()
162
+ except ValueError:
163
+ # The stream was closed after we checked it
164
+ return False
136
165
  return False
137
166
 
138
167
  @property
139
168
  def encoding(self):
140
- if self.old_stream is not None:
141
- return self.old_stream.encoding
169
+ old_stream = _open_stream(self.old_stream)
170
+ if old_stream is not None:
171
+ try:
172
+ return old_stream.encoding
173
+ except ValueError:
174
+ pass
142
175
  return super().encoding
143
176
 
144
177
  @property
145
178
  def errors(self):
146
- if self.old_stream is not None:
147
- return self.old_stream.errors
179
+ old_stream = _open_stream(self.old_stream)
180
+ if old_stream is not None:
181
+ try:
182
+ return old_stream.errors
183
+ except ValueError:
184
+ pass
148
185
  return super().errors