PrEditor 0.8.0__tar.gz → 0.9.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.

Potentially problematic release.


This version of PrEditor might be problematic. Click here for more details.

Files changed (197) hide show
  1. {preditor-0.8.0 → preditor-0.9.0}/PKG-INFO +6 -1
  2. {preditor-0.8.0 → preditor-0.9.0}/PrEditor.egg-info/PKG-INFO +6 -1
  3. {preditor-0.8.0 → preditor-0.9.0}/PrEditor.egg-info/SOURCES.txt +1 -0
  4. {preditor-0.8.0 → preditor-0.9.0}/README.md +5 -0
  5. {preditor-0.8.0 → preditor-0.9.0}/preditor/__init__.py +34 -1
  6. {preditor-0.8.0 → preditor-0.9.0}/preditor/cores/core.py +4 -10
  7. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/__init__.py +9 -0
  8. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/dialog.py +1 -23
  9. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/group_tab_widget/__init__.py +10 -3
  10. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/level_buttons.py +2 -4
  11. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/logger_window_handler.py +6 -4
  12. preditor-0.9.0/preditor/gui/logger_window_plugin.py +32 -0
  13. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/loggerwindow.py +85 -19
  14. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/ui/loggerwindow.ui +15 -24
  15. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/window.py +1 -23
  16. preditor-0.9.0/preditor/plugins.py +117 -0
  17. {preditor-0.8.0 → preditor-0.9.0}/preditor/version.py +2 -2
  18. preditor-0.8.0/preditor/plugins.py +0 -65
  19. {preditor-0.8.0 → preditor-0.9.0}/.coveragerc +0 -0
  20. {preditor-0.8.0 → preditor-0.9.0}/.github/ISSUE_TEMPLATE/BUG_REPORT.md +0 -0
  21. {preditor-0.8.0 → preditor-0.9.0}/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +0 -0
  22. {preditor-0.8.0 → preditor-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  23. {preditor-0.8.0 → preditor-0.9.0}/.github/workflows/release.yml +0 -0
  24. {preditor-0.8.0 → preditor-0.9.0}/.github/workflows/static-analysis-and-test.yml +0 -0
  25. {preditor-0.8.0 → preditor-0.9.0}/.gitignore +0 -0
  26. {preditor-0.8.0 → preditor-0.9.0}/.pre-commit-config.yaml +0 -0
  27. {preditor-0.8.0 → preditor-0.9.0}/CODE_OF_CONDUCT.md +0 -0
  28. {preditor-0.8.0 → preditor-0.9.0}/CONTRIBUTING.md +0 -0
  29. {preditor-0.8.0 → preditor-0.9.0}/LICENSE +0 -0
  30. {preditor-0.8.0 → preditor-0.9.0}/MANIFEST.in +0 -0
  31. {preditor-0.8.0 → preditor-0.9.0}/PrEditor.egg-info/dependency_links.txt +0 -0
  32. {preditor-0.8.0 → preditor-0.9.0}/PrEditor.egg-info/entry_points.txt +0 -0
  33. {preditor-0.8.0 → preditor-0.9.0}/PrEditor.egg-info/requires.txt +0 -0
  34. {preditor-0.8.0 → preditor-0.9.0}/PrEditor.egg-info/top_level.txt +0 -0
  35. {preditor-0.8.0 → preditor-0.9.0}/examples/add_to_app.py +0 -0
  36. {preditor-0.8.0 → preditor-0.9.0}/examples/output_capture_and_show.py +0 -0
  37. {preditor-0.8.0 → preditor-0.9.0}/preditor/__main__.py +0 -0
  38. {preditor-0.8.0 → preditor-0.9.0}/preditor/about_module.py +0 -0
  39. {preditor-0.8.0 → preditor-0.9.0}/preditor/cli.py +0 -0
  40. {preditor-0.8.0 → preditor-0.9.0}/preditor/contexts.py +0 -0
  41. {preditor-0.8.0 → preditor-0.9.0}/preditor/cores/__init__.py +0 -0
  42. {preditor-0.8.0 → preditor-0.9.0}/preditor/dccs/maya/PrEditor_maya.mod +0 -0
  43. {preditor-0.8.0 → preditor-0.9.0}/preditor/dccs/maya/plug-ins/PrEditor_maya.py +0 -0
  44. {preditor-0.8.0 → preditor-0.9.0}/preditor/debug.py +0 -0
  45. {preditor-0.8.0 → preditor-0.9.0}/preditor/delayable_engine/__init__.py +0 -0
  46. {preditor-0.8.0 → preditor-0.9.0}/preditor/delayable_engine/delayables.py +0 -0
  47. {preditor-0.8.0 → preditor-0.9.0}/preditor/enum.py +0 -0
  48. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/app.py +0 -0
  49. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/codehighlighter.py +0 -0
  50. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/completer.py +0 -0
  51. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/console.py +0 -0
  52. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/drag_tab_bar.py +0 -0
  53. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/editor_chooser.py +0 -0
  54. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/errordialog.py +0 -0
  55. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/find_files.py +0 -0
  56. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/fuzzy_search/__init__.py +0 -0
  57. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/fuzzy_search/fuzzy_search.py +0 -0
  58. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/group_tab_widget/grouped_tab_menu.py +0 -0
  59. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/group_tab_widget/grouped_tab_models.py +0 -0
  60. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/group_tab_widget/grouped_tab_widget.py +0 -0
  61. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/group_tab_widget/one_tab_widget.py +0 -0
  62. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/newtabwidget.py +0 -0
  63. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/redmine_login_dialog.py +0 -0
  64. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/set_text_editor_path_dialog.py +0 -0
  65. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/status_label.py +0 -0
  66. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/suggest_path_quotes_dialog.py +0 -0
  67. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/ui/editor_chooser.ui +0 -0
  68. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/ui/errordialog.ui +0 -0
  69. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/ui/find_files.ui +0 -0
  70. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/ui/redmine_login_dialog.ui +0 -0
  71. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/ui/set_text_editor_path_dialog.ui +0 -0
  72. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/ui/suggest_path_quotes_dialog.ui +0 -0
  73. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/workbox_mixin.py +0 -0
  74. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/workbox_text_edit.py +0 -0
  75. {preditor-0.8.0 → preditor-0.9.0}/preditor/gui/workboxwidget.py +0 -0
  76. {preditor-0.8.0 → preditor-0.9.0}/preditor/logging_config.py +0 -0
  77. {preditor-0.8.0 → preditor-0.9.0}/preditor/osystem.py +0 -0
  78. {preditor-0.8.0 → preditor-0.9.0}/preditor/prefs.py +0 -0
  79. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/environment_variables.html +0 -0
  80. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/error_mail.html +0 -0
  81. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/error_mail_inline.html +0 -0
  82. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/README.md +0 -0
  83. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/arrow_forward.png +0 -0
  84. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/check-bold.png +0 -0
  85. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/chevron-down.png +0 -0
  86. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/chevron-up.png +0 -0
  87. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/close-thick.png +0 -0
  88. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/comment-edit.png +0 -0
  89. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/content-copy.png +0 -0
  90. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/content-cut.png +0 -0
  91. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/content-duplicate.png +0 -0
  92. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/content-paste.png +0 -0
  93. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/content-save.png +0 -0
  94. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/debug_disabled.png +0 -0
  95. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/eye-check.png +0 -0
  96. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/file-plus.png +0 -0
  97. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/file-remove.png +0 -0
  98. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/format-align-left.png +0 -0
  99. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/format-letter-case-lower.png +0 -0
  100. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/format-letter-case-upper.png +0 -0
  101. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/format-letter-case.svg +0 -0
  102. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/information.png +0 -0
  103. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/logging_critical.png +0 -0
  104. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/logging_custom.png +0 -0
  105. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/logging_debug.png +0 -0
  106. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/logging_error.png +0 -0
  107. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/logging_info.png +0 -0
  108. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/logging_not_set.png +0 -0
  109. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/logging_warning.png +0 -0
  110. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/marker.png +0 -0
  111. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/play.png +0 -0
  112. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/playlist-play.png +0 -0
  113. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/plus-minus-variant.png +0 -0
  114. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/preditor.ico +0 -0
  115. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/preditor.png +0 -0
  116. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/preditor.psd +0 -0
  117. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/preditor.svg +0 -0
  118. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/regex.svg +0 -0
  119. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/restart.svg +0 -0
  120. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/skip-forward-outline.png +0 -0
  121. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/skip-next-outline.png +0 -0
  122. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/skip-next.png +0 -0
  123. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/skip-previous.png +0 -0
  124. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/subdirectory-arrow-right.png +0 -0
  125. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/text-search-variant.png +0 -0
  126. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/img/warning-big.png +0 -0
  127. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/lang/python.json +0 -0
  128. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/settings.ini +0 -0
  129. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/stylesheet/Bright.css +0 -0
  130. {preditor-0.8.0 → preditor-0.9.0}/preditor/resource/stylesheet/Dark.css +0 -0
  131. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/__init__.py +0 -0
  132. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/delayables/__init__.py +0 -0
  133. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/delayables/smart_highlight.py +0 -0
  134. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/delayables/spell_check.py +0 -0
  135. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/documenteditor.py +0 -0
  136. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/finddialog.py +0 -0
  137. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/__init__.py +0 -0
  138. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/bash.ini +0 -0
  139. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/batch.ini +0 -0
  140. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/cpp.ini +0 -0
  141. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/css.ini +0 -0
  142. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/eyeonscript.ini +0 -0
  143. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/html.ini +0 -0
  144. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/javascript.ini +0 -0
  145. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/lua.ini +0 -0
  146. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/maxscript.ini +0 -0
  147. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/mel.ini +0 -0
  148. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/mu.ini +0 -0
  149. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/nsi.ini +0 -0
  150. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/perl.ini +0 -0
  151. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/puppet.ini +0 -0
  152. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/python.ini +0 -0
  153. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/ruby.ini +0 -0
  154. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/sql.ini +0 -0
  155. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/xml.ini +0 -0
  156. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/config/yaml.ini +0 -0
  157. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lang/language.py +0 -0
  158. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lexers/__init__.py +0 -0
  159. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lexers/cpplexer.py +0 -0
  160. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lexers/javascriptlexer.py +0 -0
  161. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lexers/maxscriptlexer.py +0 -0
  162. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lexers/mellexer.py +0 -0
  163. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lexers/mulexer.py +0 -0
  164. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/lexers/pythonlexer.py +0 -0
  165. {preditor-0.8.0 → preditor-0.9.0}/preditor/scintilla/ui/finddialog.ui +0 -0
  166. {preditor-0.8.0 → preditor-0.9.0}/preditor/settings.py +0 -0
  167. {preditor-0.8.0 → preditor-0.9.0}/preditor/stream/__init__.py +0 -0
  168. {preditor-0.8.0 → preditor-0.9.0}/preditor/stream/director.py +0 -0
  169. {preditor-0.8.0 → preditor-0.9.0}/preditor/stream/manager.py +0 -0
  170. {preditor-0.8.0 → preditor-0.9.0}/preditor/streamhandler_helper.py +0 -0
  171. {preditor-0.8.0 → preditor-0.9.0}/preditor/utils/__init__.py +0 -0
  172. {preditor-0.8.0 → preditor-0.9.0}/preditor/utils/cute.py +0 -0
  173. {preditor-0.8.0 → preditor-0.9.0}/preditor/utils/stylesheets.py +0 -0
  174. {preditor-0.8.0 → preditor-0.9.0}/preditor/utils/text_search.py +0 -0
  175. {preditor-0.8.0 → preditor-0.9.0}/preditor/weakref.py +0 -0
  176. {preditor-0.8.0 → preditor-0.9.0}/pyproject.toml +0 -0
  177. {preditor-0.8.0 → preditor-0.9.0}/requirements.txt +0 -0
  178. {preditor-0.8.0 → preditor-0.9.0}/setup.cfg +0 -0
  179. {preditor-0.8.0 → preditor-0.9.0}/setup.py +0 -0
  180. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_greedy_False_0_True.md +0 -0
  181. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_greedy_False_2_True.md +0 -0
  182. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_greedy_True_2_True.md +0 -0
  183. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_greedy_upper_True_2_True.md +0 -0
  184. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_simple_False_0_True.md +0 -0
  185. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_simple_False_2_True.md +0 -0
  186. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_simple_False_3_True.md +0 -0
  187. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/re_simple_True_2_True.md +0 -0
  188. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/simple_False_0_False.md +0 -0
  189. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/simple_False_1_False.md +0 -0
  190. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/simple_False_2_False.md +0 -0
  191. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/simple_False_3_False.md +0 -0
  192. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/simple_True_2_False.md +0 -0
  193. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/tab_text.txt +0 -0
  194. {preditor-0.8.0 → preditor-0.9.0}/tests/find_files/test_find_files.py +0 -0
  195. {preditor-0.8.0 → preditor-0.9.0}/tests/ide/test_delayable_engine.py +0 -0
  196. {preditor-0.8.0 → preditor-0.9.0}/tests/test_stream.py +0 -0
  197. {preditor-0.8.0 → preditor-0.9.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PrEditor
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: A python REPL and Editor and console based on Qt.
5
5
  Home-page: https://github.com/blurstudio/PrEditor.git
6
6
  Author: Blur Studio
@@ -208,6 +208,11 @@ added in [setup.cfg](setup.cfg).
208
208
  implementing a workbox. See [workbox_mixin.py](preditor/gui/workbox_mixin.py)
209
209
  for the full interface to implement all features of an editor.
210
210
 
211
+ * `preditor.plug.loggerwindow`: Used to customize the LoggerWindow instance when
212
+ the LoggerWindow is created. For example, this can be used to create extra Toolbars
213
+ or add menu items. When using this plugin, make sure to use the
214
+ `preditor.gui.logger_window_plugin.LoggerWindowPlugin` class for your base class.
215
+
211
216
  * `preditor.plug.logging_handlers`: Used to add custom python logging handlers
212
217
  to the LoggingLevelButton's handlers sub-menus. This allows you to install a
213
218
  handler instance on a specific logging object.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PrEditor
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: A python REPL and Editor and console based on Qt.
5
5
  Home-page: https://github.com/blurstudio/PrEditor.git
6
6
  Author: Blur Studio
@@ -208,6 +208,11 @@ added in [setup.cfg](setup.cfg).
208
208
  implementing a workbox. See [workbox_mixin.py](preditor/gui/workbox_mixin.py)
209
209
  for the full interface to implement all features of an editor.
210
210
 
211
+ * `preditor.plug.loggerwindow`: Used to customize the LoggerWindow instance when
212
+ the LoggerWindow is created. For example, this can be used to create extra Toolbars
213
+ or add menu items. When using this plugin, make sure to use the
214
+ `preditor.gui.logger_window_plugin.LoggerWindowPlugin` class for your base class.
215
+
211
216
  * `preditor.plug.logging_handlers`: Used to add custom python logging handlers
212
217
  to the LoggingLevelButton's handlers sub-menus. This allows you to install a
213
218
  handler instance on a specific logging object.
@@ -57,6 +57,7 @@ preditor/gui/errordialog.py
57
57
  preditor/gui/find_files.py
58
58
  preditor/gui/level_buttons.py
59
59
  preditor/gui/logger_window_handler.py
60
+ preditor/gui/logger_window_plugin.py
60
61
  preditor/gui/loggerwindow.py
61
62
  preditor/gui/newtabwidget.py
62
63
  preditor/gui/redmine_login_dialog.py
@@ -165,6 +165,11 @@ added in [setup.cfg](setup.cfg).
165
165
  implementing a workbox. See [workbox_mixin.py](preditor/gui/workbox_mixin.py)
166
166
  for the full interface to implement all features of an editor.
167
167
 
168
+ * `preditor.plug.loggerwindow`: Used to customize the LoggerWindow instance when
169
+ the LoggerWindow is created. For example, this can be used to create extra Toolbars
170
+ or add menu items. When using this plugin, make sure to use the
171
+ `preditor.gui.logger_window_plugin.LoggerWindowPlugin` class for your base class.
172
+
168
173
  * `preditor.plug.logging_handlers`: Used to add custom python logging handlers
169
174
  to the LoggingLevelButton's handlers sub-menus. This allows you to install a
170
175
  handler instance on a specific logging object.
@@ -93,7 +93,7 @@ def configure(name, parent_callback=None, excepthook=True, logging=True, streams
93
93
  # Store the core_name,.
94
94
  _global_config['core_name'] = name
95
95
  if parent_callback:
96
- _global_config['parent_callback'] = parent_callback
96
+ set_parent_callback(parent_callback)
97
97
 
98
98
  if streams:
99
99
  # Install the stream manager to capture output
@@ -229,6 +229,39 @@ def root_window():
229
229
  return App.root_window()
230
230
 
231
231
 
232
+ def parent_callback():
233
+ """Returns the parent_callback or None.
234
+
235
+ This is a callback that returns a QWidget to use as the parent of the
236
+ LoggerWindow when its first created. This can be used by DCC's to set the
237
+ parent to their main window.
238
+ """
239
+ return _global_config.get("parent_callback")
240
+
241
+
242
+ def set_parent_callback(parent_callback, if_unset=True):
243
+ """Update the parent_callback even if it was already set.
244
+
245
+ This is useful for cases where `configure` is called before it's possible to
246
+ provide the parent_callback.
247
+
248
+ Note: Changing this does not re-parent an existing instance of LoggerWindows.
249
+ If you change this after the LoggerWindow instance has been created you will
250
+ need to manually re-parent it.
251
+
252
+ Args:
253
+ if_unset(bool): If True then only set this value if the parent_callback
254
+ hasn't already been set.
255
+
256
+ Returns:
257
+ bool: Returns False if if_unset is True and it was already set.
258
+ """
259
+ if "parent_callback" in _global_config and not if_unset:
260
+ return False
261
+ _global_config["parent_callback"] = parent_callback
262
+ return True
263
+
264
+
232
265
  def connect_preditor(
233
266
  parent, sequence='F2', text='Show PrEditor', obj_name='uiShowPreditorACT', name=None
234
267
  ):
@@ -1,6 +1,6 @@
1
1
  from __future__ import absolute_import, print_function
2
2
 
3
- from Qt.QtCore import QObject, Signal
3
+ from Qt.QtCore import QObject
4
4
 
5
5
 
6
6
  class Core(QObject):
@@ -9,17 +9,11 @@ class Core(QObject):
9
9
  be distributed between different pacakges.
10
10
  """
11
11
 
12
- # ----------------------------------------------------------------
13
- # blurdev signals
14
- aboutToClearPaths = Signal() # Emitted before environment is changed or reloaded
15
-
16
- # ----------------------------------------------------------------
17
-
18
12
  def __init__(self, objectName=None):
19
- QObject.__init__(self)
13
+ super(Core, self).__init__()
20
14
  if objectName is None:
21
- objectName = 'blurdev'
22
- QObject.setObjectName(self, objectName)
15
+ objectName = 'PrEditor'
16
+ self.setObjectName(objectName)
23
17
 
24
18
  # create custom properties
25
19
  self._headless = False
@@ -3,6 +3,7 @@ from __future__ import absolute_import
3
3
  from functools import partial
4
4
 
5
5
  from Qt.QtCore import Property
6
+ from Qt.QtWidgets import QStackedWidget
6
7
 
7
8
  from .dialog import Dialog # noqa: F401
8
9
  from .window import Window # noqa: F401
@@ -82,3 +83,11 @@ def loadUi(filename, widget, uiname=''):
82
83
  uiname = os.path.basename(filename).split('.')[0]
83
84
 
84
85
  QtCompat.loadUi(os.path.split(filename)[0] + '/ui/%s.ui' % uiname, widget)
86
+
87
+
88
+ def tab_widget_for_tab(tab_widget):
89
+ """Returns the `QTabWidget` `tab_widget` is parented to or `None`."""
90
+ tab_parent = tab_widget.parent()
91
+ if not isinstance(tab_parent, QStackedWidget):
92
+ return None
93
+ return tab_parent.parent()
@@ -3,7 +3,7 @@ from __future__ import absolute_import
3
3
  from Qt.QtCore import Qt
4
4
  from Qt.QtWidgets import QDialog
5
5
 
6
- from .. import core, relativePath, root_window
6
+ from .. import relativePath, root_window
7
7
 
8
8
 
9
9
  class Dialog(QDialog):
@@ -25,9 +25,6 @@ class Dialog(QDialog):
25
25
  cls._instance = cls(parent=parent)
26
26
  # protect the memory
27
27
  cls._instance.setAttribute(Qt.WA_DeleteOnClose, False)
28
- # but make sure that if we reload the environment, everything gets deleted
29
- # properly
30
- core.aboutToClearPaths.connect(cls._instance.shutdown)
31
28
  return cls._instance
32
29
 
33
30
  def __init__(
@@ -80,9 +77,6 @@ class Dialog(QDialog):
80
77
  # If this value is set to False calling setGeometry on this dialog will not
81
78
  # adjust the geometry to ensure the dialog is on a valid screen.
82
79
  self.checkScreenGeo = True
83
- # If this value is set to True the dialog will listen for
84
- # core.aboutToClearPaths and call shutdown on the dialog.
85
- self.aboutToClearPathsEnabled = True
86
80
  # attempt to set the dialog icon
87
81
  import os
88
82
  import sys
@@ -128,13 +122,6 @@ class Dialog(QDialog):
128
122
 
129
123
  WinWidget.uncache(wwidget)
130
124
 
131
- # only disconnect here if deleting on close
132
- if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
133
- try:
134
- core.aboutToClearPaths.disconnect(self.shutdown)
135
- except TypeError:
136
- pass
137
-
138
125
  def exec_(self):
139
126
  # do not use the DeleteOnClose attribute when executing a dialog as often times
140
127
  # a user will be accessing information from the dialog instance after it closes.
@@ -158,13 +145,6 @@ class Dialog(QDialog):
158
145
 
159
146
  ensureWindowIsVisible(self)
160
147
 
161
- def showEvent(self, event):
162
- # listen for aboutToClearPaths signal if requested
163
- # but only connect here if deleting on close
164
- if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
165
- core.aboutToClearPaths.connect(self.shutdown)
166
- super(Dialog, self).showEvent(event)
167
-
168
148
  def shutdown(self):
169
149
  # use a @classmethod to make inheritance magically work
170
150
  self._shutdown(self)
@@ -178,8 +158,6 @@ class Dialog(QDialog):
178
158
  # allow the global instance to be cleared
179
159
  if this == cls._instance:
180
160
  cls._instance = None
181
- if this.aboutToClearPathsEnabled:
182
- core.aboutToClearPaths.disconnect(this.shutdown)
183
161
  this.setAttribute(Qt.WA_DeleteOnClose, True)
184
162
  try:
185
163
  this.close()
@@ -70,7 +70,7 @@ class GroupTabWidget(OneTabWidget):
70
70
  self.uiCornerBTN = corner
71
71
  self.setCornerWidget(self.uiCornerBTN, Qt.TopRightCorner)
72
72
 
73
- def add_new_tab(self, group, title="Workbox"):
73
+ def add_new_tab(self, group, title="Workbox", group_fmt=None):
74
74
  """Adds a new tab to the requested group, creating the group if the group
75
75
  doesn't exist.
76
76
 
@@ -79,6 +79,11 @@ class GroupTabWidget(OneTabWidget):
79
79
  existing tab, or the name of the group and it will create the group
80
80
  if needed. If None is passed it will add a new tab `Group {last+1}`.
81
81
  If True is passed, then the current group tab is used.
82
+ title (str, optional): The name to give the newly created tab inside
83
+ the group.
84
+ group_fmt(str, optional): If None is passed to group, this string is
85
+ used to search for existing tabs to calculate the last number
86
+ and generate the new group tab name.
82
87
 
83
88
  Returns:
84
89
  GroupedTabWidget: The tab group for this group.
@@ -86,12 +91,14 @@ class GroupTabWidget(OneTabWidget):
86
91
  """
87
92
  parent = None
88
93
  if not group:
94
+ if group_fmt is None:
95
+ group_fmt = r'Group {}'
89
96
  last = 0
90
97
  for i in range(self.count()):
91
- match = re.match(r'Group (\d+)', self.tabText(i))
98
+ match = re.match(group_fmt.format(r'(\d+)'), self.tabText(i))
92
99
  if match:
93
100
  last = max(last, int(match.group(1)))
94
- group = "Group {}".format(last + 1)
101
+ group = group_fmt.format(last + 1)
95
102
  elif group is True:
96
103
  group = self.currentIndex()
97
104
  if isinstance(group, int):
@@ -212,9 +212,7 @@ class HandlerMenu(LazyMenu):
212
212
  self.logger = logger
213
213
 
214
214
  def install_handler(self, name):
215
- for _, cls in plugins.logging_handlers(name):
216
- handler = cls()
217
- self.logger.addHandler(handler)
215
+ plugins.add_logging_handler(self.logger, name)
218
216
 
219
217
  def refresh(self):
220
218
  self.clear()
@@ -224,7 +222,7 @@ class HandlerMenu(LazyMenu):
224
222
  act = handler_install.addAction(name)
225
223
  act.triggered.connect(partial(self.install_handler, name))
226
224
  for h in self.logger.handlers:
227
- if isinstance(h, cls):
225
+ if type(h) is cls:
228
226
  act.setEnabled(False)
229
227
  act.setToolTip('Already installed for this logger.')
230
228
  break
@@ -1,13 +1,12 @@
1
1
  from __future__ import absolute_import
2
2
 
3
3
  import logging
4
- import weakref
5
4
 
6
5
  from .. import instance
7
6
 
8
7
 
9
8
  class LoggerWindowHandler(logging.Handler):
10
- """A logging handler that writes directly to the Python Logger.
9
+ """A logging handler that writes directly to the PrEditor instance.
11
10
 
12
11
  Args:
13
12
  error (bool, optional): Write the output as if it were written
@@ -22,7 +21,6 @@ class LoggerWindowHandler(logging.Handler):
22
21
 
23
22
  def __init__(self, error=True, formatter=default_format):
24
23
  super(LoggerWindowHandler, self).__init__()
25
- self.console = weakref.ref(instance().console())
26
24
  self.error = error
27
25
  if formatter is not None:
28
26
  if not isinstance(formatter, logging.Formatter):
@@ -30,10 +28,14 @@ class LoggerWindowHandler(logging.Handler):
30
28
  self.setFormatter(formatter)
31
29
 
32
30
  def emit(self, record):
31
+ _instance = instance(create=False)
32
+ if _instance is None:
33
+ # No gui has been created yet, so nothing to do
34
+ return
33
35
  try:
34
36
  # If the python logger was closed and garbage collected,
35
37
  # there is nothing to do, simply exit the call
36
- console = self.console()
38
+ console = _instance.console()
37
39
  if not console:
38
40
  return
39
41
 
@@ -0,0 +1,32 @@
1
+ class LoggerWindowPlugin:
2
+ """Base class for LoggerWindow plugins.
3
+
4
+ These plugins are loaded using the `preditor.plug.loggerwindow` entry point.
5
+ This entry point is loaded when `LoggerWindow` is initialized. For each entry
6
+ point defined a single instance of the plugin is created per instance of
7
+ a LoggerWindow.
8
+
9
+ To save preferences override `record_prefs` and `restore_prefs` methods. These
10
+ are used to save and load preferences any time the PrEditor save/loads prefs.
11
+ """
12
+
13
+ def __init__(self, parent):
14
+ self.parent = parent
15
+
16
+ def record_prefs(self, name):
17
+ """Returns any prefs to save with the PrEditor's preferences.
18
+
19
+ Returns:
20
+ dict: A dictionary that will be saved using json or None.
21
+ """
22
+
23
+ def restore_prefs(self, name, prefs):
24
+ """Restore the preferences saved from a previous launch.
25
+
26
+ Args:
27
+ name(str): The name specified by the `preditor.plug.loggerwindow`
28
+ entry point.
29
+ prefs(dict or None): The prefs returned by a previous call to
30
+ `record_prefs()` from the last preference save. None is passed
31
+ if no prefs were recorded.
32
+ """
@@ -37,7 +37,7 @@ from .. import (
37
37
  resourcePath,
38
38
  )
39
39
  from ..delayable_engine import DelayableEngine
40
- from ..gui import Dialog, Window, loadUi
40
+ from ..gui import Dialog, Window, loadUi, tab_widget_for_tab
41
41
  from ..gui.fuzzy_search.fuzzy_search import FuzzySearch
42
42
  from ..gui.group_tab_widget.grouped_tab_models import GroupTabListItemModel
43
43
  from ..logging_config import LoggingConfig
@@ -55,6 +55,31 @@ class WorkboxPages:
55
55
  Workboxes = 1
56
56
 
57
57
 
58
+ class WorkboxName(str):
59
+ """The joined name of a workbox `group/workbox` with access to its parts.
60
+
61
+ This subclass provides properties for the group and workbox values separately.
62
+ """
63
+
64
+ def __new__(cls, group, workbox):
65
+ txt = "/".join((group, workbox))
66
+ ret = super().__new__(cls, txt)
67
+ # Preserve the imitable nature of str's by using properties without setters.
68
+ ret._group = group
69
+ ret._workbox = workbox
70
+ return ret
71
+
72
+ @property
73
+ def group(self):
74
+ """The tab name of the group tab that contains the workbox."""
75
+ return self._group
76
+
77
+ @property
78
+ def workbox(self):
79
+ """The workbox of the tab for this workbox inside of the group."""
80
+ return self._workbox
81
+
82
+
58
83
  class LoggerWindow(Window):
59
84
  _instance = None
60
85
  styleSheetChanged = Signal(str)
@@ -62,7 +87,6 @@ class LoggerWindow(Window):
62
87
  def __init__(self, parent, name=None, run_workbox=False, standalone=False):
63
88
  super(LoggerWindow, self).__init__(parent=parent)
64
89
  self.name = name if name else get_core_name()
65
- self.aboutToClearPathsEnabled = False
66
90
  self._stylesheet = 'Bright'
67
91
 
68
92
  # Create timer to autohide status messages
@@ -237,7 +261,6 @@ class LoggerWindow(Window):
237
261
  self.uiBackupPreferencesACT.triggered.connect(self.backupPreferences)
238
262
  self.uiBrowsePreferencesACT.triggered.connect(self.browsePreferences)
239
263
  self.uiAboutPreditorACT.triggered.connect(self.show_about)
240
- core.aboutToClearPaths.connect(self.pathsAboutToBeCleared)
241
264
  self.uiSetFlashWindowIntervalACT.triggered.connect(self.setFlashWindowInterval)
242
265
 
243
266
  self.uiSetPreferredTextEditorPathACT.triggered.connect(
@@ -264,6 +287,12 @@ class LoggerWindow(Window):
264
287
  self.addAction(self.uiClearLogACT)
265
288
 
266
289
  self.dont_ask_again = []
290
+
291
+ # Load any plugins that modify the LoggerWindow
292
+ self.plugins = {}
293
+ for name, plugin in plugins.loggerwindow():
294
+ self.plugins[name] = plugin(self)
295
+
267
296
  self.restorePrefs()
268
297
 
269
298
  # add stylesheet menu options.
@@ -335,16 +364,48 @@ class LoggerWindow(Window):
335
364
 
336
365
  @classmethod
337
366
  def name_for_workbox(cls, workbox):
338
- """Returns the name for a given workbox.
339
- The name is the group tab text and the workbox tab text joined by a `/`"""
340
- ret = []
341
- logger = cls.instance()
342
- index = logger.uiWorkboxTAB.currentIndex()
343
- ret.append(logger.uiWorkboxTAB.tabText(index))
344
- group_widget = logger.uiWorkboxTAB.currentWidget()
345
- index = group_widget.currentIndex()
346
- ret.append(group_widget.tabText(index))
347
- return "/".join(ret)
367
+ """Returns the name for a given workbox or None if not valid.
368
+
369
+ The name is a `WorkboxName` object showing the group and name joined by
370
+ a `/`.
371
+
372
+ Args:
373
+ workbox: The workbox to get the name of. If None is passed then it
374
+ will return the name of the current workbox.
375
+
376
+ Returns:
377
+ The name of the widget as a `WorkboxName` object showing the group
378
+ and name joined by a `/`. If workbox is not valid for the LoggerWindow
379
+ instance then None is returned.
380
+ """
381
+
382
+ if workbox is None:
383
+ # if the workbox was not provided use the current workbox
384
+ logger = cls.instance()
385
+ index = logger.uiWorkboxTAB.currentIndex()
386
+ group = logger.uiWorkboxTAB.tabText(index)
387
+ group_widget = logger.uiWorkboxTAB.currentWidget()
388
+ index = group_widget.currentIndex()
389
+ name = group_widget.tabText(index)
390
+ return WorkboxName(group, name)
391
+
392
+ # Otherwise resolve from the parent widgets.
393
+ # Get the parent QTabWidget of the workbox
394
+ workbox_tab_widget = tab_widget_for_tab(workbox)
395
+ if not workbox_tab_widget:
396
+ return None
397
+ # Get the group QTabWidget of the parent QTabWidget of the workbox
398
+ group_widget = tab_widget_for_tab(workbox_tab_widget)
399
+ if not group_widget:
400
+ return None
401
+
402
+ # Get the group name
403
+ index = group_widget.indexOf(workbox_tab_widget)
404
+ group = group_widget.tabText(index)
405
+
406
+ index = workbox_tab_widget.indexOf(workbox)
407
+ name = workbox_tab_widget.tabText(index)
408
+ return WorkboxName(group, name)
348
409
 
349
410
  @classmethod
350
411
  def workbox_for_name(cls, name, show=False, visible=False):
@@ -699,10 +760,6 @@ class LoggerWindow(Window):
699
760
  else:
700
761
  super(LoggerWindow, self).keyPressEvent(event)
701
762
 
702
- def pathsAboutToBeCleared(self):
703
- if self.uiClearLogOnRefreshACT.isChecked():
704
- self.clearLog()
705
-
706
763
  def clearExecutionTime(self):
707
764
  """Update status text with hyphens to indicate execution has begun."""
708
765
  self.setStatusText('Exec: -.- Seconds')
@@ -734,7 +791,6 @@ class LoggerWindow(Window):
734
791
  'spellCheckEnabled': self.uiSpellCheckEnabledACT.isChecked(),
735
792
  'wordWrap': self.uiWordWrapACT.isChecked(),
736
793
  'clearBeforeRunning': self.uiClearBeforeRunningACT.isChecked(),
737
- 'clearBeforeEnvRefresh': self.uiClearLogOnRefreshACT.isChecked(),
738
794
  'uiSelectTextACT': self.uiSelectTextACT.isChecked(),
739
795
  'toolbarStates': six.text_type(self.saveState().toHex(), 'utf-8'),
740
796
  'consoleFont': self.console().font().toString(),
@@ -773,6 +829,13 @@ class LoggerWindow(Window):
773
829
 
774
830
  pref['editor_cls'] = self.editor_cls_name
775
831
 
832
+ # Allow any plugins to add their own preferences dictionary
833
+ pref["plugins"] = {}
834
+ for name, plugin in self.plugins.items():
835
+ plugin_pref = plugin.record_prefs(name)
836
+ if plugin_pref:
837
+ pref["plugins"][name] = plugin_pref
838
+
776
839
  self.save_prefs(pref)
777
840
 
778
841
  def load_prefs(self):
@@ -893,7 +956,6 @@ class LoggerWindow(Window):
893
956
  self.uiWordWrapACT.setChecked(pref.get('wordWrap', True))
894
957
  self.setWordWrap(self.uiWordWrapACT.isChecked())
895
958
  self.uiClearBeforeRunningACT.setChecked(pref.get('clearBeforeRunning', False))
896
- self.uiClearLogOnRefreshACT.setChecked(pref.get('clearBeforeEnvRefresh', False))
897
959
  self.setClearBeforeRunning(self.uiClearBeforeRunningACT.isChecked())
898
960
  self.uiSelectTextACT.setChecked(pref.get('uiSelectTextACT', True))
899
961
 
@@ -924,6 +986,10 @@ class LoggerWindow(Window):
924
986
 
925
987
  self.dont_ask_again = pref.get('dont_ask_again', [])
926
988
 
989
+ # Allow any plugins to restore their own preferences
990
+ for name, plugin in self.plugins.items():
991
+ plugin.restore_prefs(name, pref.get("plugins", {}).get(name))
992
+
927
993
  def restoreToolbars(self, pref=None):
928
994
  if pref is None:
929
995
  pref = self.load_prefs()
@@ -92,7 +92,7 @@
92
92
  <x>0</x>
93
93
  <y>0</y>
94
94
  <width>796</width>
95
- <height>29</height>
95
+ <height>21</height>
96
96
  </rect>
97
97
  </property>
98
98
  <widget class="QMenu" name="uiDebugMENU">
@@ -105,7 +105,7 @@
105
105
  <addaction name="uiLogToFileACT"/>
106
106
  <addaction name="uiLogToFileClearACT"/>
107
107
  </widget>
108
- <widget class="QMenu" name="uiScriptingMENU">
108
+ <widget class="QMenu" name="uiFileMENU">
109
109
  <property name="title">
110
110
  <string comment="File Menu">&amp;File</string>
111
111
  </property>
@@ -120,19 +120,19 @@
120
120
  <property name="title">
121
121
  <string>Help</string>
122
122
  </property>
123
- <widget class="QMenu" name="menuPreferences">
123
+ <widget class="QMenu" name="uiPreferencesMENU">
124
124
  <property name="title">
125
125
  <string>Preferences</string>
126
126
  </property>
127
127
  <addaction name="uiBrowsePreferencesACT"/>
128
128
  <addaction name="uiBackupPreferencesACT"/>
129
129
  </widget>
130
- <addaction name="menuPreferences"/>
130
+ <addaction name="uiPreferencesMENU"/>
131
131
  <addaction name="uiEnvironmentVarsACT"/>
132
132
  <addaction name="separator"/>
133
133
  <addaction name="uiAboutPreditorACT"/>
134
134
  </widget>
135
- <widget class="QMenu" name="menu_Run">
135
+ <widget class="QMenu" name="uiRunMENU">
136
136
  <property name="title">
137
137
  <string>Run</string>
138
138
  </property>
@@ -144,7 +144,7 @@
144
144
  <addaction name="uiClearToLastPromptACT"/>
145
145
  <addaction name="uiSelectTextACT"/>
146
146
  </widget>
147
- <widget class="QMenu" name="uiFileMENU">
147
+ <widget class="QMenu" name="uiOptionsMENU">
148
148
  <property name="title">
149
149
  <string>&amp;Options</string>
150
150
  </property>
@@ -178,7 +178,6 @@
178
178
  <addaction name="uiHighlightExactCompletionACT"/>
179
179
  <addaction name="separator"/>
180
180
  <addaction name="uiClearLogACT"/>
181
- <addaction name="uiClearLogOnRefreshACT"/>
182
181
  <addaction name="separator"/>
183
182
  <addaction name="uiSelectFontsMENU"/>
184
183
  <addaction name="uiStyleMENU"/>
@@ -197,11 +196,11 @@
197
196
  <addaction name="uiSetPreferredTextEditorPathACT"/>
198
197
  <addaction name="uiSetWorkboxEditorACT"/>
199
198
  </widget>
200
- <widget class="QMenu" name="menuEdit">
199
+ <widget class="QMenu" name="uiEditMENU">
201
200
  <property name="title">
202
201
  <string>Edit</string>
203
202
  </property>
204
- <widget class="QMenu" name="menuFocus_to_Group">
203
+ <widget class="QMenu" name="uiFocus_to_GroupMENU">
205
204
  <property name="title">
206
205
  <string>Focus to Group</string>
207
206
  </property>
@@ -216,7 +215,7 @@
216
215
  <addaction name="separator"/>
217
216
  <addaction name="uiGroupLastACT"/>
218
217
  </widget>
219
- <widget class="QMenu" name="menuFocus_to_Tab">
218
+ <widget class="QMenu" name="uiFocus_to_TabMENU">
220
219
  <property name="title">
221
220
  <string>Focus to Tab</string>
222
221
  </property>
@@ -316,17 +315,17 @@
316
315
  <addaction name="uiNextTabACT"/>
317
316
  <addaction name="uiPrevTabACT"/>
318
317
  <addaction name="separator"/>
319
- <addaction name="menuFocus_to_Group"/>
320
- <addaction name="menuFocus_to_Tab"/>
318
+ <addaction name="uiFocus_to_GroupMENU"/>
319
+ <addaction name="uiFocus_to_TabMENU"/>
321
320
  <addaction name="separator"/>
322
321
  <addaction name="uiFindInWorkboxesACT"/>
323
322
  <addaction name="uiFocusNameACT"/>
324
323
  </widget>
325
- <addaction name="uiScriptingMENU"/>
326
- <addaction name="menuEdit"/>
327
- <addaction name="uiDebugMENU"/>
328
- <addaction name="menu_Run"/>
329
324
  <addaction name="uiFileMENU"/>
325
+ <addaction name="uiEditMENU"/>
326
+ <addaction name="uiDebugMENU"/>
327
+ <addaction name="uiRunMENU"/>
328
+ <addaction name="uiOptionsMENU"/>
330
329
  <addaction name="uiHelpMENU"/>
331
330
  </widget>
332
331
  <widget class="QToolBar" name="uiConsoleTOOLBAR">
@@ -507,14 +506,6 @@
507
506
  <string>Editor Vertical</string>
508
507
  </property>
509
508
  </action>
510
- <action name="uiClearLogOnRefreshACT">
511
- <property name="checkable">
512
- <bool>true</bool>
513
- </property>
514
- <property name="text">
515
- <string>Clear Log on Environment Refresh</string>
516
- </property>
517
- </action>
518
509
  <action name="uiClearToLastPromptACT">
519
510
  <property name="text">
520
511
  <string>Clear to Last Prompt</string>