PrEditor 0.0.0.dev1__py2.py3-none-any.whl → 0.1.0__py2.py3-none-any.whl

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 (363) hide show
  1. PrEditor-0.1.0.dist-info/LICENSE +165 -0
  2. PrEditor-0.1.0.dist-info/METADATA +212 -0
  3. PrEditor-0.1.0.dist-info/RECORD +149 -0
  4. {PrEditor-0.0.0.dev1.dist-info → PrEditor-0.1.0.dist-info}/WHEEL +1 -1
  5. PrEditor-0.1.0.dist-info/entry_points.txt +18 -0
  6. PrEditor-0.1.0.dist-info/top_level.txt +1 -0
  7. preditor/__init__.py +301 -0
  8. {blurdev → preditor}/__main__.py +13 -13
  9. preditor/about_module.py +166 -0
  10. preditor/cli.py +192 -0
  11. {blurdev → preditor}/contexts.py +119 -119
  12. preditor/cores/core.py +65 -0
  13. preditor/dccs/maya/PrEditor_maya.mod +2 -0
  14. preditor/dccs/maya/plug-ins/PrEditor_maya.py +108 -0
  15. preditor/debug.py +294 -0
  16. blurdev/scintilla/delayable_engine.py → preditor/delayable_engine/__init__.py +310 -299
  17. blurdev/scintilla/delayables/base.py → preditor/delayable_engine/delayables.py +85 -85
  18. {blurdev → preditor}/enum.py +728 -1003
  19. {blurdev → preditor}/gui/__init__.py +84 -125
  20. preditor/gui/app.py +159 -0
  21. {blurdev → preditor}/gui/codehighlighter.py +209 -219
  22. {blurdev → preditor}/gui/completer.py +226 -236
  23. {blurdev → preditor}/gui/console.py +801 -858
  24. {blurdev → preditor}/gui/dialog.py +200 -216
  25. preditor/gui/drag_tab_bar.py +190 -0
  26. preditor/gui/editor_chooser.py +57 -0
  27. {blurdev → preditor}/gui/errordialog.py +100 -97
  28. preditor/gui/fuzzy_search/fuzzy_search.py +93 -0
  29. preditor/gui/group_tab_widget/__init__.py +319 -0
  30. preditor/gui/group_tab_widget/grouped_tab_menu.py +35 -0
  31. preditor/gui/group_tab_widget/grouped_tab_models.py +108 -0
  32. preditor/gui/group_tab_widget/grouped_tab_widget.py +75 -0
  33. preditor/gui/group_tab_widget/one_tab_widget.py +54 -0
  34. preditor/gui/level_buttons.py +349 -0
  35. {blurdev → preditor}/gui/logger_window_handler.py +46 -45
  36. {blurdev → preditor}/gui/loggerwindow.py +1205 -1417
  37. {blurdev → preditor}/gui/newtabwidget.py +69 -68
  38. {blurdev → preditor}/gui/redmine_login_dialog.py +63 -61
  39. {blurdev → preditor}/gui/set_text_editor_path_dialog.py +59 -57
  40. preditor/gui/ui/editor_chooser.ui +93 -0
  41. {blurdev → preditor}/gui/ui/errordialog.ui +81 -81
  42. {blurdev → preditor}/gui/ui/loggerwindow.ui +1030 -864
  43. {blurdev → preditor}/gui/ui/redmine_login_dialog.ui +124 -124
  44. {blurdev → preditor}/gui/ui/set_text_editor_path_dialog.ui +149 -149
  45. {blurdev → preditor}/gui/window.py +183 -199
  46. preditor/gui/workbox_mixin.py +357 -0
  47. preditor/gui/workbox_text_edit.py +117 -0
  48. preditor/gui/workboxwidget.py +276 -0
  49. preditor/logging_config.py +52 -0
  50. preditor/osystem.py +401 -0
  51. preditor/plugins.py +65 -0
  52. preditor/prefs.py +74 -0
  53. {blurdev → preditor}/resource/environment_variables.html +26 -38
  54. {blurdev → preditor}/resource/error_mail.html +85 -85
  55. {blurdev → preditor}/resource/error_mail_inline.html +41 -41
  56. preditor/resource/img/README.md +7 -0
  57. preditor/resource/img/arrow_forward.png +0 -0
  58. preditor/resource/img/check-bold.png +0 -0
  59. preditor/resource/img/chevron-down.png +0 -0
  60. preditor/resource/img/chevron-up.png +0 -0
  61. preditor/resource/img/close-thick.png +0 -0
  62. preditor/resource/img/comment-edit.png +0 -0
  63. preditor/resource/img/content-copy.png +0 -0
  64. preditor/resource/img/content-cut.png +0 -0
  65. preditor/resource/img/content-duplicate.png +0 -0
  66. preditor/resource/img/content-paste.png +0 -0
  67. preditor/resource/img/content-save.png +0 -0
  68. preditor/resource/img/debug_disabled.png +0 -0
  69. preditor/resource/img/eye-check.png +0 -0
  70. preditor/resource/img/file-plus.png +0 -0
  71. preditor/resource/img/file-remove.png +0 -0
  72. preditor/resource/img/format-align-left.png +0 -0
  73. preditor/resource/img/format-letter-case-lower.png +0 -0
  74. preditor/resource/img/format-letter-case-upper.png +0 -0
  75. preditor/resource/img/information.png +0 -0
  76. preditor/resource/img/logging_critical.png +0 -0
  77. preditor/resource/img/logging_custom.png +0 -0
  78. preditor/resource/img/logging_debug.png +0 -0
  79. preditor/resource/img/logging_error.png +0 -0
  80. preditor/resource/img/logging_info.png +0 -0
  81. preditor/resource/img/logging_not_set.png +0 -0
  82. preditor/resource/img/logging_warning.png +0 -0
  83. preditor/resource/img/marker.png +0 -0
  84. preditor/resource/img/play.png +0 -0
  85. preditor/resource/img/playlist-play.png +0 -0
  86. preditor/resource/img/plus-minus-variant.png +0 -0
  87. preditor/resource/img/preditor.ico +0 -0
  88. preditor/resource/img/preditor.png +0 -0
  89. preditor/resource/img/preditor.psd +0 -0
  90. preditor/resource/img/preditor.svg +44 -0
  91. preditor/resource/img/restart.svg +1 -0
  92. preditor/resource/img/skip-forward-outline.png +0 -0
  93. preditor/resource/img/skip-next-outline.png +0 -0
  94. preditor/resource/img/skip-next.png +0 -0
  95. preditor/resource/img/skip-previous.png +0 -0
  96. preditor/resource/img/subdirectory-arrow-right.png +0 -0
  97. preditor/resource/img/text-search-variant.png +0 -0
  98. {blurdev → preditor}/resource/lang/python.json +30 -30
  99. preditor/resource/settings.ini +25 -0
  100. {blurdev/resource/stylesheet/logger → preditor/resource/stylesheet}/Bright.css +56 -61
  101. {blurdev → preditor}/resource/stylesheet/Dark.css +190 -132
  102. {blurdev → preditor}/scintilla/__init__.py +22 -28
  103. preditor/scintilla/delayables/__init__.py +11 -0
  104. {blurdev → preditor}/scintilla/delayables/smart_highlight.py +94 -93
  105. {blurdev → preditor}/scintilla/delayables/spell_check.py +173 -172
  106. {blurdev → preditor}/scintilla/documenteditor.py +2039 -2115
  107. {blurdev → preditor}/scintilla/finddialog.py +68 -81
  108. {blurdev → preditor}/scintilla/lang/__init__.py +80 -93
  109. {blurdev → preditor}/scintilla/lang/config/bash.ini +15 -15
  110. {blurdev → preditor}/scintilla/lang/config/batch.ini +14 -14
  111. {blurdev → preditor}/scintilla/lang/config/cpp.ini +19 -19
  112. {blurdev → preditor}/scintilla/lang/config/css.ini +19 -19
  113. {blurdev → preditor}/scintilla/lang/config/eyeonscript.ini +17 -17
  114. {blurdev → preditor}/scintilla/lang/config/html.ini +21 -21
  115. {blurdev → preditor}/scintilla/lang/config/javascript.ini +24 -24
  116. {blurdev → preditor}/scintilla/lang/config/lua.ini +16 -16
  117. {blurdev → preditor}/scintilla/lang/config/maxscript.ini +20 -20
  118. {blurdev → preditor}/scintilla/lang/config/mel.ini +18 -18
  119. {blurdev → preditor}/scintilla/lang/config/mu.ini +22 -22
  120. {blurdev → preditor}/scintilla/lang/config/nsi.ini +5 -5
  121. {blurdev → preditor}/scintilla/lang/config/perl.ini +19 -19
  122. {blurdev → preditor}/scintilla/lang/config/puppet.ini +19 -19
  123. {blurdev → preditor}/scintilla/lang/config/python.ini +28 -28
  124. {blurdev → preditor}/scintilla/lang/config/ruby.ini +19 -19
  125. {blurdev → preditor}/scintilla/lang/config/sql.ini +7 -7
  126. {blurdev → preditor}/scintilla/lang/config/xml.ini +21 -21
  127. {blurdev → preditor}/scintilla/lang/config/yaml.ini +18 -18
  128. {blurdev → preditor}/scintilla/lang/language.py +240 -250
  129. preditor/scintilla/lexers/__init__.py +0 -0
  130. {blurdev → preditor}/scintilla/lexers/cpplexer.py +21 -30
  131. {blurdev → preditor}/scintilla/lexers/javascriptlexer.py +25 -34
  132. {blurdev → preditor}/scintilla/lexers/maxscriptlexer.py +234 -253
  133. {blurdev → preditor}/scintilla/lexers/mellexer.py +368 -376
  134. {blurdev → preditor}/scintilla/lexers/mulexer.py +32 -41
  135. {blurdev → preditor}/scintilla/lexers/pythonlexer.py +41 -50
  136. {blurdev → preditor}/scintilla/ui/finddialog.ui +160 -160
  137. preditor/settings.py +71 -0
  138. preditor/stream/__init__.py +80 -0
  139. preditor/stream/director.py +56 -0
  140. preditor/stream/manager.py +74 -0
  141. preditor/streamhandler_helper.py +46 -0
  142. preditor/utils/__init__.py +0 -0
  143. preditor/utils/cute.py +30 -0
  144. preditor/utils/stylesheets.py +54 -0
  145. {blurdev → preditor}/version.py +5 -5
  146. preditor/weakref.py +363 -0
  147. PrEditor-0.0.0.dev1.dist-info/METADATA +0 -51
  148. PrEditor-0.0.0.dev1.dist-info/RECORD +0 -279
  149. PrEditor-0.0.0.dev1.dist-info/top_level.txt +0 -1
  150. blurdev/__init__.py +0 -356
  151. blurdev/cores/__init__.py +0 -98
  152. blurdev/cores/application.py +0 -26
  153. blurdev/cores/core.py +0 -634
  154. blurdev/debug.py +0 -593
  155. blurdev/external.py +0 -391
  156. blurdev/gui/level_buttons.py +0 -585
  157. blurdev/gui/workboxwidget.py +0 -205
  158. blurdev/logger.py +0 -238
  159. blurdev/osystem.py +0 -813
  160. blurdev/prefs.py +0 -33
  161. blurdev/protocols/__init__.py +0 -71
  162. blurdev/protocols/write_std_output_handler.py +0 -83
  163. blurdev/resource/designer_plugins.xml +0 -9
  164. blurdev/resource/error_email_old.html +0 -41
  165. blurdev/resource/img/add.png +0 -0
  166. blurdev/resource/img/ajax-loader.gif +0 -0
  167. blurdev/resource/img/application.png +0 -0
  168. blurdev/resource/img/applications.png +0 -0
  169. blurdev/resource/img/assburner.png +0 -0
  170. blurdev/resource/img/assfreezer.png +0 -0
  171. blurdev/resource/img/bar.gif +0 -0
  172. blurdev/resource/img/blank.png +0 -0
  173. blurdev/resource/img/blurdev.png +0 -0
  174. blurdev/resource/img/calendar_disabled.png +0 -0
  175. blurdev/resource/img/calendar_enabled.png +0 -0
  176. blurdev/resource/img/cancel.png +0 -0
  177. blurdev/resource/img/custom.png +0 -0
  178. blurdev/resource/img/debug_high.png +0 -0
  179. blurdev/resource/img/debug_low.png +0 -0
  180. blurdev/resource/img/debug_mid.png +0 -0
  181. blurdev/resource/img/debug_off.png +0 -0
  182. blurdev/resource/img/django.png +0 -0
  183. blurdev/resource/img/doc.png +0 -0
  184. blurdev/resource/img/edit.png +0 -0
  185. blurdev/resource/img/elemental.png +0 -0
  186. blurdev/resource/img/explore.png +0 -0
  187. blurdev/resource/img/favorite.png +0 -0
  188. blurdev/resource/img/file.png +0 -0
  189. blurdev/resource/img/folder.png +0 -0
  190. blurdev/resource/img/ide/add.png +0 -0
  191. blurdev/resource/img/ide/add_note.png +0 -0
  192. blurdev/resource/img/ide/arrow_down.png +0 -0
  193. blurdev/resource/img/ide/arrow_up.png +0 -0
  194. blurdev/resource/img/ide/check.png +0 -0
  195. blurdev/resource/img/ide/class.png +0 -0
  196. blurdev/resource/img/ide/clean.png +0 -0
  197. blurdev/resource/img/ide/clearlog.png +0 -0
  198. blurdev/resource/img/ide/close.png +0 -0
  199. blurdev/resource/img/ide/comment_add.png +0 -0
  200. blurdev/resource/img/ide/comment_remove.png +0 -0
  201. blurdev/resource/img/ide/comment_toggle.png +0 -0
  202. blurdev/resource/img/ide/console.png +0 -0
  203. blurdev/resource/img/ide/copy.png +0 -0
  204. blurdev/resource/img/ide/copylstrip.png +0 -0
  205. blurdev/resource/img/ide/cut.png +0 -0
  206. blurdev/resource/img/ide/edit.png +0 -0
  207. blurdev/resource/img/ide/find.png +0 -0
  208. blurdev/resource/img/ide/find_replace.png +0 -0
  209. blurdev/resource/img/ide/findnext.png +0 -0
  210. blurdev/resource/img/ide/findprev.png +0 -0
  211. blurdev/resource/img/ide/folder_find.png +0 -0
  212. blurdev/resource/img/ide/function.png +0 -0
  213. blurdev/resource/img/ide/git-bash.png +0 -0
  214. blurdev/resource/img/ide/git-gui.png +0 -0
  215. blurdev/resource/img/ide/gitk.png +0 -0
  216. blurdev/resource/img/ide/goto.png +0 -0
  217. blurdev/resource/img/ide/goto_def.png +0 -0
  218. blurdev/resource/img/ide/help.png +0 -0
  219. blurdev/resource/img/ide/highlighter.png +0 -0
  220. blurdev/resource/img/ide/lowercase.png +0 -0
  221. blurdev/resource/img/ide/newfile.png +0 -0
  222. blurdev/resource/img/ide/newfolder.png +0 -0
  223. blurdev/resource/img/ide/newproject.png +0 -0
  224. blurdev/resource/img/ide/newwizard.png +0 -0
  225. blurdev/resource/img/ide/open.png +0 -0
  226. blurdev/resource/img/ide/paste.png +0 -0
  227. blurdev/resource/img/ide/pdb_continue.png +0 -0
  228. blurdev/resource/img/ide/pdb_down.png +0 -0
  229. blurdev/resource/img/ide/pdb_next.png +0 -0
  230. blurdev/resource/img/ide/pdb_step.png +0 -0
  231. blurdev/resource/img/ide/pdb_up.png +0 -0
  232. blurdev/resource/img/ide/plus_minus.png +0 -0
  233. blurdev/resource/img/ide/preferences.png +0 -0
  234. blurdev/resource/img/ide/project_find.png +0 -0
  235. blurdev/resource/img/ide/python.png +0 -0
  236. blurdev/resource/img/ide/pyular.png +0 -0
  237. blurdev/resource/img/ide/qt.png +0 -0
  238. blurdev/resource/img/ide/quit.png +0 -0
  239. blurdev/resource/img/ide/redo.png +0 -0
  240. blurdev/resource/img/ide/refresh.png +0 -0
  241. blurdev/resource/img/ide/remove.png +0 -0
  242. blurdev/resource/img/ide/ruler.png +0 -0
  243. blurdev/resource/img/ide/run.png +0 -0
  244. blurdev/resource/img/ide/runall.png +0 -0
  245. blurdev/resource/img/ide/runallclear.png +0 -0
  246. blurdev/resource/img/ide/runselected.png +0 -0
  247. blurdev/resource/img/ide/runselectedclear.png +0 -0
  248. blurdev/resource/img/ide/save.png +0 -0
  249. blurdev/resource/img/ide/saveas.png +0 -0
  250. blurdev/resource/img/ide/sdk.png +0 -0
  251. blurdev/resource/img/ide/separator.png +0 -0
  252. blurdev/resource/img/ide/tabbed.png +0 -0
  253. blurdev/resource/img/ide/tile.png +0 -0
  254. blurdev/resource/img/ide/toolbar.png +0 -0
  255. blurdev/resource/img/ide/undo.png +0 -0
  256. blurdev/resource/img/ide/uppercase.png +0 -0
  257. blurdev/resource/img/ide/view_as.png +0 -0
  258. blurdev/resource/img/ide/windowed.png +0 -0
  259. blurdev/resource/img/ide.ico +0 -0
  260. blurdev/resource/img/ide.png +0 -0
  261. blurdev/resource/img/ide48.png +0 -0
  262. blurdev/resource/img/info.png +0 -0
  263. blurdev/resource/img/legacy tool.png +0 -0
  264. blurdev/resource/img/library.png +0 -0
  265. blurdev/resource/img/logger/about.png +0 -0
  266. blurdev/resource/img/logger/arrow_forward.png +0 -0
  267. blurdev/resource/img/logger/clear.png +0 -0
  268. blurdev/resource/img/logger/close.png +0 -0
  269. blurdev/resource/img/logger/debug_disabled.png +0 -0
  270. blurdev/resource/img/logger/debug_high.png +0 -0
  271. blurdev/resource/img/logger/debug_low.png +0 -0
  272. blurdev/resource/img/logger/debug_mid.png +0 -0
  273. blurdev/resource/img/logger/down.png +0 -0
  274. blurdev/resource/img/logger/find.png +0 -0
  275. blurdev/resource/img/logger/logging_critical.png +0 -0
  276. blurdev/resource/img/logger/logging_debug.png +0 -0
  277. blurdev/resource/img/logger/logging_error.png +0 -0
  278. blurdev/resource/img/logger/logging_info.png +0 -0
  279. blurdev/resource/img/logger/logging_not_set.png +0 -0
  280. blurdev/resource/img/logger/logging_warning.png +0 -0
  281. blurdev/resource/img/logger/next.png +0 -0
  282. blurdev/resource/img/logger/play.png +0 -0
  283. blurdev/resource/img/logger/playlist_play.png +0 -0
  284. blurdev/resource/img/logger/previous.png +0 -0
  285. blurdev/resource/img/logger/return.png +0 -0
  286. blurdev/resource/img/logger/save.png +0 -0
  287. blurdev/resource/img/logger/subdirectory_arrow_right.png +0 -0
  288. blurdev/resource/img/logger/up.png +0 -0
  289. blurdev/resource/img/lovebar.png +0 -0
  290. blurdev/resource/img/new.png +0 -0
  291. blurdev/resource/img/new_selected.png +0 -0
  292. blurdev/resource/img/node.png +0 -0
  293. blurdev/resource/img/ok.png +0 -0
  294. blurdev/resource/img/options.png +0 -0
  295. blurdev/resource/img/packages.png +0 -0
  296. blurdev/resource/img/preview/add.png +0 -0
  297. blurdev/resource/img/preview/brush.png +0 -0
  298. blurdev/resource/img/preview/delete.png +0 -0
  299. blurdev/resource/img/preview/delte.png +0 -0
  300. blurdev/resource/img/preview/fill.png +0 -0
  301. blurdev/resource/img/preview/layers.png +0 -0
  302. blurdev/resource/img/preview/media.png +0 -0
  303. blurdev/resource/img/preview/navigate.png +0 -0
  304. blurdev/resource/img/preview/pencil.png +0 -0
  305. blurdev/resource/img/preview/select.png +0 -0
  306. blurdev/resource/img/preview/type.png +0 -0
  307. blurdev/resource/img/preview/visible.png +0 -0
  308. blurdev/resource/img/project.png +0 -0
  309. blurdev/resource/img/python_logger.ico +0 -0
  310. blurdev/resource/img/python_logger.png +0 -0
  311. blurdev/resource/img/refresh.png +0 -0
  312. blurdev/resource/img/remove.png +0 -0
  313. blurdev/resource/img/reset.png +0 -0
  314. blurdev/resource/img/richtext/font_bold.png +0 -0
  315. blurdev/resource/img/richtext/font_italic.png +0 -0
  316. blurdev/resource/img/richtext/link_image.png +0 -0
  317. blurdev/resource/img/richtext/spell_check.png +0 -0
  318. blurdev/resource/img/richtext/unordered_list.png +0 -0
  319. blurdev/resource/img/save.png +0 -0
  320. blurdev/resource/img/savesettings.png +0 -0
  321. blurdev/resource/img/settings.png +0 -0
  322. blurdev/resource/img/tool.png +0 -0
  323. blurdev/resource/img/toolbarHandleHorizontal.png +0 -0
  324. blurdev/resource/img/toolbarHandleVertical.png +0 -0
  325. blurdev/resource/img/trash.png +0 -0
  326. blurdev/resource/img/trax.png +0 -0
  327. blurdev/resource/img/tree.png +0 -0
  328. blurdev/resource/img/treegrunt.ico +0 -0
  329. blurdev/resource/img/treegrunt.png +0 -0
  330. blurdev/resource/img/treegruntedit.png +0 -0
  331. blurdev/resource/img/user interface.png +0 -0
  332. blurdev/resource/img/warning.png +0 -0
  333. blurdev/resource/img/watermark.png +0 -0
  334. blurdev/resource/sdk/blurdev.sdk +0 -3
  335. blurdev/resource/settings.ini +0 -82
  336. blurdev/resource/softimage/BlurApplication.dll +0 -0
  337. blurdev/resource/softimage/BlurApplication64.dll +0 -0
  338. blurdev/resource/stylesheet/Carbon.css +0 -35
  339. blurdev/resource/stylesheet/logger/Dark.css +0 -62
  340. blurdev/resource/templ/py_comment.templ +0 -1
  341. blurdev/resource/templ/py_debug_raise_error.templ +0 -7
  342. blurdev/resource/templ/py_doc_string.templ +0 -10
  343. blurdev/resource/templ/py_header.templ +0 -9
  344. blurdev/resource/templ/py_line_comment.templ +0 -1
  345. blurdev/resource/templ/py_log_to_file.templ +0 -22
  346. blurdev/resource/templ/py_module_path.templ +0 -1
  347. blurdev/resource/templ/py_pyqt_core.templ +0 -1
  348. blurdev/resource/templ/py_pyqt_gui.templ +0 -1
  349. blurdev/resource/templ/py_splashscreen.templ +0 -6
  350. blurdev/resource/templ/py_testing_note.templ +0 -1
  351. blurdev/resource/templ/py_testing_note_end.templ +0 -1
  352. blurdev/resource/tools_environments.json +0 -72
  353. blurdev/resource/tools_environments.xml +0 -11
  354. blurdev/resource/tools_environments_linux.xml +0 -11
  355. blurdev/resource/tools_environments_offline.xml +0 -7
  356. blurdev/runtimes/__init__.py +0 -2
  357. blurdev/runtimes/logger.py +0 -44
  358. blurdev/scintilla/delayables/__init__.py +0 -9
  359. blurdev/settings.py +0 -312
  360. blurdev/utils/error.py +0 -389
  361. {blurdev/scintilla/lexers → preditor/cores}/__init__.py +0 -0
  362. {blurdev/utils → preditor/gui/fuzzy_search}/__init__.py +0 -0
  363. {blurdev → preditor}/resource/img/warning-big.png +0 -0
@@ -1,199 +1,183 @@
1
- ##
2
- # \namespace blurdev.gui.window
3
- #
4
- # \remarks Defines the main Window instance for this system
5
- #
6
- # \author beta@blur.com
7
- # \author Blur Studio
8
- # \date 12/05/08
9
- #
10
-
11
- from __future__ import absolute_import
12
- from Qt.QtWidgets import QMainWindow
13
- from Qt.QtCore import Qt
14
-
15
-
16
- class Window(QMainWindow):
17
- _instance = None
18
-
19
- @classmethod
20
- def instance(cls, parent=None):
21
- """If you only want to have one instance of a window, use this
22
- method instead of creating a new window. It will only create a
23
- new instance of the class if the class variable _instance is
24
- none.
25
-
26
- Args:
27
- parent (QWidget, optional): The parent widget
28
-
29
- Returns:
30
- Window:
31
- """
32
- if not cls._instance:
33
- import blurdev
34
-
35
- cls._instance = cls(parent=parent)
36
- # protect the memory
37
- cls._instance.setAttribute(Qt.WA_DeleteOnClose, False)
38
- # but make sure that if we reload the environment, everything gets deleted
39
- # properly
40
- blurdev.core.aboutToClearPaths.connect(cls._instance.shutdown)
41
- return cls._instance
42
-
43
- def __init__(self, parent=None, flags=0):
44
- import blurdev
45
-
46
- # if there is no root, create
47
- if not parent:
48
- parent = blurdev.core.rootWindow()
49
-
50
- # create a QMainWindow
51
- if flags:
52
- QMainWindow.__init__(self, parent, flags)
53
- else:
54
- QMainWindow.__init__(self, parent)
55
-
56
- # INFO
57
- #
58
- # As far as we can tell, the purpose for this class is keeping live
59
- # references to the subclasses so they don't get garbage collected, all while
60
- # getting around having to actively maintain a list of running dialogs.
61
- #
62
- # Generally, setting WA_DeleteOnClose to False, and keeping the _instance
63
- # variable around
64
- # will do the trick for pseudo-singleton dialogs. (created with instance=True)
65
- #
66
- # However, for non-instanced dialogs where multiples are allowed, deleteOnClose
67
- # is set to True and no _instance variable is set. Because there are no live
68
- # references to the dialog, it is closed and garbage collected almost
69
- # immediately in certain programs (xsi, maya).
70
- #
71
- # The current workaround is to manually set WA_DeleteOnClose to False, however
72
- # this causes any subclasses to stick around in memory even when the
73
- # window/dialog is closed. So you also have to manually set WA_DeleteOnClose to
74
- # True in the sub-classed .closeEvent() method before you call super()
75
- #
76
- # It is completely possible to write some code that would automatically handle
77
- # this, and it is CERTAINLY something we can/will be doing in the future, but
78
- # for now we're not quite sure how that would affect the production tools.
79
- # Technically this is a problem, but there are currently no consequences from an
80
- # artist standpoint because we have more than enough memory to hold all those
81
- # dead dialogs
82
-
83
- # set the delete attribute to clean up the window once it is closed
84
- self.setAttribute(Qt.WA_DeleteOnClose, True)
85
- # If this value is set to False calling setGeometry on this window will not
86
- # adjust the geometry to ensure the window is on a valid screen.
87
- self.checkScreenGeo = True
88
- # If this value is set to True the window will listen for
89
- # blurdev.core.aboutToClearPaths and call shutdown on the window.
90
- self.aboutToClearPathsEnabled = True
91
- # attempt to set the dialog icon
92
- import os
93
- import sys
94
- from Qt.QtGui import QIcon
95
-
96
- try:
97
- path = blurdev.relativePath(
98
- os.path.abspath(sys.modules[self.__class__.__module__].__file__),
99
- 'img/icon.png',
100
- )
101
- if os.path.exists(path):
102
- self.setWindowIcon(QIcon(path))
103
- except (KeyError, AttributeError):
104
- pass
105
-
106
- def _shouldDisableAccelerators(self, old, now):
107
- """Used to enable typing in DCC's that require it(Max 2018).
108
-
109
- Args:
110
- old (QWidget or None): The QWidget that lost focus.
111
- new (QWidget or None): The QWidget that gained focus.
112
-
113
- Returns:
114
- bool: If accelerators should be disabled.
115
- """
116
- # By default we always want to disable accelerators.
117
- return True
118
-
119
- def closeEvent(self, event):
120
- # ensure this object gets deleted
121
- wwidget = None
122
- if self.testAttribute(Qt.WA_DeleteOnClose):
123
- # collect the win widget to uncache it
124
- if self.parent() and self.parent().inherits('QWinWidget'):
125
- wwidget = self.parent()
126
-
127
- QMainWindow.closeEvent(self, event)
128
-
129
- # uncache the win widget if necessary
130
- if wwidget:
131
- from .winwidget import WinWidget
132
-
133
- WinWidget.uncache(wwidget)
134
-
135
- # only disconnect here if deleting on close
136
- if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
137
- import blurdev
138
-
139
- try:
140
- blurdev.core.aboutToClearPaths.disconnect(self.shutdown)
141
- except TypeError:
142
- pass
143
-
144
- def setGeometry(self, *args):
145
- """
146
- Sets the window's geometry, It will also check if the geometry is visible on any
147
- monitors. If it is not it will move the window so it is visible. This can be
148
- disabled by setting self.checkScreenGeo to False
149
- """
150
- super(Window, self).setGeometry(*args)
151
- if self.checkScreenGeo:
152
- from cute.functions import ensureWindowIsVisible
153
-
154
- ensureWindowIsVisible(self)
155
-
156
- def showEvent(self, event):
157
- # listen for aboutToClearPaths signal if requested
158
- # but only connect here if deleting on close
159
- if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
160
- import blurdev
161
-
162
- blurdev.core.aboutToClearPaths.connect(self.shutdown)
163
- super(Window, self).showEvent(event)
164
-
165
- def shutdown(self):
166
- # use a @classmethod to make inheritance magically work
167
- self._shutdown(self)
168
-
169
- @classmethod
170
- def _shutdown(cls, this):
171
- """
172
- If this item is the class instance properly close it and remove it from memory
173
- so it can be recreated.
174
- """
175
- # allow the global instance to be cleared
176
- if this == cls._instance:
177
- import blurdev
178
-
179
- cls._instance = None
180
- if this.aboutToClearPathsEnabled:
181
- blurdev.core.aboutToClearPaths.disconnect(this.shutdown)
182
- this.setAttribute(Qt.WA_DeleteOnClose, True)
183
- try:
184
- this.close()
185
- except RuntimeError:
186
- pass
187
-
188
- @classmethod
189
- def instanceShutdown(cls):
190
- """Call shutdown on this class instance only if the class was instantiated.
191
-
192
- Returns:
193
- bool: if cls.instance().shutdown() needed to be called.
194
- """
195
- instance = cls._instance
196
- if instance:
197
- instance.shutdown()
198
- return True
199
- return False
1
+ from __future__ import absolute_import
2
+
3
+ from Qt.QtCore import Qt
4
+ from Qt.QtWidgets import QMainWindow
5
+
6
+ from .. import core, relativePath, root_window
7
+
8
+
9
+ class Window(QMainWindow):
10
+ _instance = None
11
+
12
+ @classmethod
13
+ def instance(cls, parent=None):
14
+ """If you only want to have one instance of a window, use this
15
+ method instead of creating a new window. It will only create a
16
+ new instance of the class if the class variable _instance is
17
+ none.
18
+
19
+ Args:
20
+ parent (QWidget, optional): The parent widget
21
+
22
+ Returns:
23
+ Window:
24
+ """
25
+ if not cls._instance:
26
+ cls._instance = cls(parent=parent)
27
+ # protect the memory
28
+ cls._instance.setAttribute(Qt.WA_DeleteOnClose, False)
29
+ # but make sure that if we reload the environment, everything gets deleted
30
+ # properly
31
+ core.aboutToClearPaths.connect(cls._instance.shutdown)
32
+ return cls._instance
33
+
34
+ def __init__(self, parent=None, flags=0):
35
+ # if there is no root, create
36
+ if not parent:
37
+ parent = root_window()
38
+
39
+ # create a QMainWindow
40
+ if flags:
41
+ QMainWindow.__init__(self, parent, flags)
42
+ else:
43
+ QMainWindow.__init__(self, parent)
44
+
45
+ # INFO
46
+ #
47
+ # As far as we can tell, the purpose for this class is keeping live
48
+ # references to the subclasses so they don't get garbage collected, all while
49
+ # getting around having to actively maintain a list of running dialogs.
50
+ #
51
+ # Generally, setting WA_DeleteOnClose to False, and keeping the _instance
52
+ # variable around
53
+ # will do the trick for pseudo-singleton dialogs. (created with instance=True)
54
+ #
55
+ # However, for non-instanced dialogs where multiples are allowed, deleteOnClose
56
+ # is set to True and no _instance variable is set. Because there are no live
57
+ # references to the dialog, it is closed and garbage collected almost
58
+ # immediately in certain programs (xsi, maya).
59
+ #
60
+ # The current workaround is to manually set WA_DeleteOnClose to False, however
61
+ # this causes any subclasses to stick around in memory even when the
62
+ # window/dialog is closed. So you also have to manually set WA_DeleteOnClose to
63
+ # True in the sub-classed .closeEvent() method before you call super()
64
+ #
65
+ # It is completely possible to write some code that would automatically handle
66
+ # this, and it is CERTAINLY something we can/will be doing in the future, but
67
+ # for now we're not quite sure how that would affect the production tools.
68
+ # Technically this is a problem, but there are currently no consequences from an
69
+ # artist standpoint because we have more than enough memory to hold all those
70
+ # dead dialogs
71
+
72
+ # set the delete attribute to clean up the window once it is closed
73
+ self.setAttribute(Qt.WA_DeleteOnClose, True)
74
+ # If this value is set to False calling setGeometry on this window will not
75
+ # adjust the geometry to ensure the window is on a valid screen.
76
+ self.checkScreenGeo = True
77
+ # If this value is set to True the window will listen for
78
+ # preditor.core.aboutToClearPaths and call shutdown on the window.
79
+ self.aboutToClearPathsEnabled = True
80
+ # attempt to set the dialog icon
81
+ import os
82
+ import sys
83
+
84
+ from Qt.QtGui import QIcon
85
+
86
+ try:
87
+ path = relativePath(
88
+ os.path.abspath(sys.modules[self.__class__.__module__].__file__),
89
+ 'img/icon.png',
90
+ )
91
+ if os.path.exists(path):
92
+ self.setWindowIcon(QIcon(path))
93
+ except (KeyError, AttributeError):
94
+ pass
95
+
96
+ def _shouldDisableAccelerators(self, old, now):
97
+ """Used to enable typing in DCC's that require it(Max 2018).
98
+
99
+ Args:
100
+ old (QWidget or None): The QWidget that lost focus.
101
+ new (QWidget or None): The QWidget that gained focus.
102
+
103
+ Returns:
104
+ bool: If accelerators should be disabled.
105
+ """
106
+ # By default we always want to disable accelerators.
107
+ return True
108
+
109
+ def closeEvent(self, event):
110
+ # ensure this object gets deleted
111
+ wwidget = None
112
+ if self.testAttribute(Qt.WA_DeleteOnClose):
113
+ # collect the win widget to uncache it
114
+ if self.parent() and self.parent().inherits('QWinWidget'):
115
+ wwidget = self.parent()
116
+
117
+ QMainWindow.closeEvent(self, event)
118
+
119
+ # uncache the win widget if necessary
120
+ if wwidget:
121
+ from .winwidget import WinWidget
122
+
123
+ WinWidget.uncache(wwidget)
124
+
125
+ # only disconnect here if deleting on close
126
+ if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
127
+ try:
128
+ core.aboutToClearPaths.disconnect(self.shutdown)
129
+ except TypeError:
130
+ pass
131
+
132
+ def setGeometry(self, *args):
133
+ """
134
+ Sets the window's geometry, It will also check if the geometry is visible on any
135
+ monitors. If it is not it will move the window so it is visible. This can be
136
+ disabled by setting self.checkScreenGeo to False
137
+ """
138
+ super(Window, self).setGeometry(*args)
139
+ if self.checkScreenGeo:
140
+ from ..utils.cute import ensureWindowIsVisible
141
+
142
+ ensureWindowIsVisible(self)
143
+
144
+ def showEvent(self, event):
145
+ # listen for aboutToClearPaths signal if requested
146
+ # but only connect here if deleting on close
147
+ if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
148
+ core.aboutToClearPaths.connect(self.shutdown)
149
+ super(Window, self).showEvent(event)
150
+
151
+ def shutdown(self):
152
+ # use a @classmethod to make inheritance magically work
153
+ self._shutdown(self)
154
+
155
+ @classmethod
156
+ def _shutdown(cls, this):
157
+ """
158
+ If this item is the class instance properly close it and remove it from memory
159
+ so it can be recreated.
160
+ """
161
+ # allow the global instance to be cleared
162
+ if this == cls._instance:
163
+ cls._instance = None
164
+ if this.aboutToClearPathsEnabled:
165
+ core.aboutToClearPaths.disconnect(this.shutdown)
166
+ this.setAttribute(Qt.WA_DeleteOnClose, True)
167
+ try:
168
+ this.close()
169
+ except RuntimeError:
170
+ pass
171
+
172
+ @classmethod
173
+ def instance_shutdown(cls):
174
+ """Call shutdown on this class instance only if the class was instantiated.
175
+
176
+ Returns:
177
+ bool: if cls.instance().shutdown() needed to be called.
178
+ """
179
+ instance = cls._instance
180
+ if instance:
181
+ instance.shutdown()
182
+ return True
183
+ return False