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,216 +1,200 @@
1
- ##
2
- # \namespace blurdev.gui.dialog
3
- #
4
- # \remarks Defines the main Dialog 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 QDialog
13
- from Qt.QtCore import Qt
14
-
15
-
16
- class Dialog(QDialog):
17
- _instance = None
18
-
19
- @classmethod
20
- def instance(cls, parent=None):
21
- """If you only want to have one instance of a dialog, use this method instead
22
- of creating a new dialog. It will only create a new instance of the class if
23
- the class variable _instance is none.
24
-
25
- Args:
26
- parent (QWidget, optional):The parent widget
27
-
28
- Returns:
29
- Dialog:
30
- """
31
- if not cls._instance:
32
- import blurdev
33
-
34
- cls._instance = cls(parent=parent)
35
- # protect the memory
36
- cls._instance.setAttribute(Qt.WA_DeleteOnClose, False)
37
- # but make sure that if we reload the environment, everything gets deleted
38
- # properly
39
- blurdev.core.aboutToClearPaths.connect(cls._instance.shutdown)
40
- return cls._instance
41
-
42
- def __init__(
43
- self, parent=None, flags=Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint
44
- ):
45
- import blurdev
46
-
47
- # if there is no root, create
48
- if not parent:
49
- parent = blurdev.core.rootWindow()
50
-
51
- # create a QDialog
52
- if flags:
53
- QDialog.__init__(self, parent, flags)
54
- else:
55
- QDialog.__init__(self, parent)
56
-
57
- # INFO
58
- #
59
- # As far as we can tell, the purpose for this class is keeping live
60
- # references to the subclasses so they don't get garbage collected, all while
61
- # getting around having to actively maintain a list of running dialogs.
62
- #
63
- # Generally, setting WA_DeleteOnClose to False, and keeping the _instance
64
- # variable around will do the trick for pseudo-singleton dialogs. (created with
65
- # instance=True)
66
- #
67
- # However, for non-instanced dialogs where multiples are allowed, deleteOnClose
68
- # is set to True and no _instance variable is set. Because there are no live
69
- # references to the dialog, it is closed and garbage collected almost
70
- # immediately in certain programs (xsi, maya).
71
- #
72
- # The current workaround is to manually set WA_DeleteOnClose to False, however
73
- # this causes any subclasses to stick around in memory even when the
74
- # window/dialog is closed. So you also have to manually set WA_DeleteOnClose to
75
- # True in the sub-classed .closeEvent() method before you call super()
76
- #
77
- # It is completely possible to write some code that would automatically handle
78
- # this, and it is CERTAINLY something we can/will be doing in the future, but
79
- # for now we're not quite sure how that would affect the production tools.
80
- # Technically this is a problem, but there are currently no consequences from an
81
- # artist standpoint because we have more than enough memory to hold all those
82
- # dead dialogs
83
-
84
- # set the delete attribute to clean up the window once it is closed
85
- self.setAttribute(Qt.WA_DeleteOnClose, True)
86
-
87
- # set this property to true to properly handle tracking events to control
88
- # keyboard overrides
89
- self.setMouseTracking(True)
90
-
91
- # If this value is set to False calling setGeometry on this dialog will not
92
- # adjust the geometry to ensure the dialog is on a valid screen.
93
- self.checkScreenGeo = True
94
- # If this value is set to True the dialog will listen for
95
- # blurdev.core.aboutToClearPaths and call shutdown on the dialog.
96
- self.aboutToClearPathsEnabled = True
97
- # attempt to set the dialog icon
98
- import os
99
- import sys
100
- from Qt.QtGui import QIcon
101
-
102
- try:
103
- path = blurdev.relativePath(
104
- os.path.abspath(sys.modules[self.__class__.__module__].__file__),
105
- 'img/icon.png',
106
- )
107
- if os.path.exists(path):
108
- self.setWindowIcon(QIcon(path))
109
- except (AttributeError, KeyError):
110
- pass
111
-
112
- def _shouldDisableAccelerators(self, old, now):
113
- """Used to enable typing in DCC's that require it(Max 2018).
114
-
115
- Args:
116
- old (QWidget or None): The QWidget that lost focus.
117
- new (QWidget or None): The QWidget that gained focus.
118
-
119
- Returns:
120
- bool: If accelerators should be disabled.
121
- """
122
- # By default we always want to disable accelerators.
123
- return True
124
-
125
- def closeEvent(self, event):
126
- # ensure this object gets deleted
127
- wwidget = None
128
- if self.testAttribute(Qt.WA_DeleteOnClose):
129
- # collect the win widget to uncache it
130
- if self.parent() and self.parent().inherits('QWinWidget'):
131
- wwidget = self.parent()
132
-
133
- QDialog.closeEvent(self, event)
134
-
135
- # uncache the win widget if necessary
136
- if wwidget:
137
- from .winwidget import WinWidget
138
-
139
- WinWidget.uncache(wwidget)
140
-
141
- # only disconnect here if deleting on close
142
- if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
143
- import blurdev
144
-
145
- try:
146
- blurdev.core.aboutToClearPaths.disconnect(self.shutdown)
147
- except TypeError:
148
- pass
149
-
150
- def exec_(self):
151
- # do not use the DeleteOnClose attribute when executing a dialog as often times
152
- # a user will be accessing information from the dialog instance after it closes.
153
- # This function properly transfers ownership of the dialog instance back to
154
- # Python anyway
155
-
156
- self.setAttribute(Qt.WA_DeleteOnClose, False)
157
-
158
- # execute the dialog
159
- return QDialog.exec_(self)
160
-
161
- def setGeometry(self, *args):
162
- """
163
- Sets the dialog's geometry, It will also check if the geometry is visible on any
164
- monitors. If it is not it will move the dialog so it is visible. This can be
165
- disabled by setting self.checkScreenGeo to False
166
- """
167
- super(Dialog, self).setGeometry(*args)
168
- if self.checkScreenGeo:
169
- from cute.functions import ensureWindowIsVisible
170
-
171
- ensureWindowIsVisible(self)
172
-
173
- def showEvent(self, event):
174
- # listen for aboutToClearPaths signal if requested
175
- # but only connect here if deleting on close
176
- if self.aboutToClearPathsEnabled and self.testAttribute(Qt.WA_DeleteOnClose):
177
- import blurdev
178
-
179
- blurdev.core.aboutToClearPaths.connect(self.shutdown)
180
- super(Dialog, self).showEvent(event)
181
-
182
- def shutdown(self):
183
- # use a @classmethod to make inheritance magically work
184
- self._shutdown(self)
185
-
186
- @classmethod
187
- def _shutdown(cls, this):
188
- """
189
- If this item is the class instance properly close it and remove it from memory
190
- so it can be recreated.
191
- """
192
- # allow the global instance to be cleared
193
- if this == cls._instance:
194
- import blurdev
195
-
196
- cls._instance = None
197
- if this.aboutToClearPathsEnabled:
198
- blurdev.core.aboutToClearPaths.disconnect(this.shutdown)
199
- this.setAttribute(Qt.WA_DeleteOnClose, True)
200
- try:
201
- this.close()
202
- except RuntimeError:
203
- pass
204
-
205
- @classmethod
206
- def instanceShutdown(cls):
207
- """Call shutdown on this class instance only if the class was instantiated.
208
-
209
- Returns:
210
- bool: if cls.instance().shutdown() needed to be called.
211
- """
212
- instance = cls._instance
213
- if instance:
214
- instance.shutdown()
215
- return True
216
- return False
1
+ from __future__ import absolute_import
2
+
3
+ from Qt.QtCore import Qt
4
+ from Qt.QtWidgets import QDialog
5
+
6
+ from .. import core, relativePath, root_window
7
+
8
+
9
+ class Dialog(QDialog):
10
+ _instance = None
11
+
12
+ @classmethod
13
+ def instance(cls, parent=None):
14
+ """If you only want to have one instance of a dialog, use this method instead
15
+ of creating a new dialog. It will only create a new instance of the class if
16
+ the class variable _instance is none.
17
+
18
+ Args:
19
+ parent (QWidget, optional):The parent widget
20
+
21
+ Returns:
22
+ Dialog:
23
+ """
24
+ if not cls._instance:
25
+ cls._instance = cls(parent=parent)
26
+ # protect the memory
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
+ return cls._instance
32
+
33
+ def __init__(
34
+ self, parent=None, flags=Qt.WindowMinMaxButtonsHint | Qt.WindowCloseButtonHint
35
+ ):
36
+ # if there is no root, create
37
+ if not parent:
38
+ parent = root_window()
39
+
40
+ # create a QDialog
41
+ if flags:
42
+ QDialog.__init__(self, parent, flags)
43
+ else:
44
+ QDialog.__init__(self, parent)
45
+
46
+ # INFO
47
+ #
48
+ # As far as we can tell, the purpose for this class is keeping live
49
+ # references to the subclasses so they don't get garbage collected, all while
50
+ # getting around having to actively maintain a list of running dialogs.
51
+ #
52
+ # Generally, setting WA_DeleteOnClose to False, and keeping the _instance
53
+ # variable around will do the trick for pseudo-singleton dialogs. (created with
54
+ # instance=True)
55
+ #
56
+ # However, for non-instanced dialogs where multiples are allowed, deleteOnClose
57
+ # is set to True and no _instance variable is set. Because there are no live
58
+ # references to the dialog, it is closed and garbage collected almost
59
+ # immediately in certain programs (xsi, maya).
60
+ #
61
+ # The current workaround is to manually set WA_DeleteOnClose to False, however
62
+ # this causes any subclasses to stick around in memory even when the
63
+ # window/dialog is closed. So you also have to manually set WA_DeleteOnClose to
64
+ # True in the sub-classed .closeEvent() method before you call super()
65
+ #
66
+ # It is completely possible to write some code that would automatically handle
67
+ # this, and it is CERTAINLY something we can/will be doing in the future, but
68
+ # for now we're not quite sure how that would affect the production tools.
69
+ # Technically this is a problem, but there are currently no consequences from an
70
+ # artist standpoint because we have more than enough memory to hold all those
71
+ # dead dialogs
72
+
73
+ # set the delete attribute to clean up the window once it is closed
74
+ self.setAttribute(Qt.WA_DeleteOnClose, True)
75
+
76
+ # set this property to true to properly handle tracking events to control
77
+ # keyboard overrides
78
+ self.setMouseTracking(True)
79
+
80
+ # If this value is set to False calling setGeometry on this dialog will not
81
+ # adjust the geometry to ensure the dialog is on a valid screen.
82
+ 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
+ # attempt to set the dialog icon
87
+ import os
88
+ import sys
89
+
90
+ from Qt.QtGui import QIcon
91
+
92
+ try:
93
+ path = relativePath(
94
+ os.path.abspath(sys.modules[self.__class__.__module__].__file__),
95
+ 'img/icon.png',
96
+ )
97
+ if os.path.exists(path):
98
+ self.setWindowIcon(QIcon(path))
99
+ except (AttributeError, KeyError):
100
+ pass
101
+
102
+ def _shouldDisableAccelerators(self, old, now):
103
+ """Used to enable typing in DCC's that require it(Max 2018).
104
+
105
+ Args:
106
+ old (QWidget or None): The QWidget that lost focus.
107
+ new (QWidget or None): The QWidget that gained focus.
108
+
109
+ Returns:
110
+ bool: If accelerators should be disabled.
111
+ """
112
+ # By default we always want to disable accelerators.
113
+ return True
114
+
115
+ def closeEvent(self, event):
116
+ # ensure this object gets deleted
117
+ wwidget = None
118
+ if self.testAttribute(Qt.WA_DeleteOnClose):
119
+ # collect the win widget to uncache it
120
+ if self.parent() and self.parent().inherits('QWinWidget'):
121
+ wwidget = self.parent()
122
+
123
+ QDialog.closeEvent(self, event)
124
+
125
+ # uncache the win widget if necessary
126
+ if wwidget:
127
+ from .winwidget import WinWidget
128
+
129
+ WinWidget.uncache(wwidget)
130
+
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
+ def exec_(self):
139
+ # do not use the DeleteOnClose attribute when executing a dialog as often times
140
+ # a user will be accessing information from the dialog instance after it closes.
141
+ # This function properly transfers ownership of the dialog instance back to
142
+ # Python anyway
143
+
144
+ self.setAttribute(Qt.WA_DeleteOnClose, False)
145
+
146
+ # execute the dialog
147
+ return QDialog.exec_(self)
148
+
149
+ def setGeometry(self, *args):
150
+ """
151
+ Sets the dialog's geometry, It will also check if the geometry is visible on any
152
+ monitors. If it is not it will move the dialog so it is visible. This can be
153
+ disabled by setting self.checkScreenGeo to False
154
+ """
155
+ super(Dialog, self).setGeometry(*args)
156
+ if self.checkScreenGeo:
157
+ from ..utils.cute import ensureWindowIsVisible
158
+
159
+ ensureWindowIsVisible(self)
160
+
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
+ def shutdown(self):
169
+ # use a @classmethod to make inheritance magically work
170
+ self._shutdown(self)
171
+
172
+ @classmethod
173
+ def _shutdown(cls, this):
174
+ """
175
+ If this item is the class instance properly close it and remove it from memory
176
+ so it can be recreated.
177
+ """
178
+ # allow the global instance to be cleared
179
+ if this == cls._instance:
180
+ cls._instance = None
181
+ if this.aboutToClearPathsEnabled:
182
+ core.aboutToClearPaths.disconnect(this.shutdown)
183
+ this.setAttribute(Qt.WA_DeleteOnClose, True)
184
+ try:
185
+ this.close()
186
+ except RuntimeError:
187
+ pass
188
+
189
+ @classmethod
190
+ def instance_shutdown(cls):
191
+ """Call shutdown on this class instance only if the class was instantiated.
192
+
193
+ Returns:
194
+ bool: if cls.instance().shutdown() needed to be called.
195
+ """
196
+ instance = cls._instance
197
+ if instance:
198
+ instance.shutdown()
199
+ return True
200
+ return False
@@ -0,0 +1,190 @@
1
+ from __future__ import absolute_import
2
+
3
+ from Qt.QtCore import QByteArray, QMimeData, QPoint, QRect, Qt
4
+ from Qt.QtGui import QCursor, QDrag, QPixmap, QRegion
5
+ from Qt.QtWidgets import QInputDialog, QMenu, QTabBar
6
+
7
+
8
+ class DragTabBar(QTabBar):
9
+ """A QTabBar that allows you to drag and drop its tabs to other DragTabBar's
10
+ while still allowing you to move tabs normally.
11
+
12
+ In most cases you should use `install_tab_widget` to create and add this TabBar
13
+ to a QTabWidget. It takes care of enabling usability features of QTabWidget's.
14
+
15
+ Args:
16
+ mime_type (str, optional): Only accepts dropped tabs that implement this
17
+ Mime Type. Tabs dragged off of this TabBar will have this Mime Type
18
+ implemented.
19
+
20
+ Based on code by ARussel: https://forum.qt.io/post/420469
21
+ """
22
+
23
+ def __init__(self, parent=None, mime_type='DragTabBar'):
24
+ super(DragTabBar, self).__init__(parent=parent)
25
+ self.setAcceptDrops(True)
26
+ self.setMouseTracking(True)
27
+ self._mime_data = None
28
+ self._context_menu_tab = -1
29
+ self.mime_type = mime_type
30
+
31
+ def mouseMoveEvent(self, event): # noqa: N802
32
+
33
+ if not self._mime_data:
34
+ return super(DragTabBar, self).mouseMoveEvent(event)
35
+
36
+ # Check if the mouse has moved outside of the widget, if not, let
37
+ # the QTabBar handle the internal tab movement.
38
+ event_pos = event.pos()
39
+ global_pos = self.mapToGlobal(event_pos)
40
+ bar_geo = QRect(self.mapToGlobal(self.pos()), self.size())
41
+ inside = bar_geo.contains(global_pos)
42
+ if inside:
43
+ return super(DragTabBar, self).mouseMoveEvent(event)
44
+
45
+ # The user has moved the tab outside of the QTabBar, remove the tab from
46
+ # this tab bar and store it in the MimeData, initiating a drag event.
47
+ widget = self._mime_data.property('widget')
48
+ tab_index = self.parentWidget().indexOf(widget)
49
+ self.parentWidget().removeTab(tab_index)
50
+ pos_in_tab = self.mapFromGlobal(global_pos)
51
+ drag = QDrag(self)
52
+ drag.setMimeData(self._mime_data)
53
+ drag.setPixmap(self._mime_data.imageData())
54
+ drag.setHotSpot(event_pos - pos_in_tab)
55
+ cursor = QCursor(Qt.OpenHandCursor)
56
+ drag.setDragCursor(cursor.pixmap(), Qt.MoveAction)
57
+ action = drag.exec_(Qt.MoveAction)
58
+ # If the user didn't successfully add this to a new tab widget, restore
59
+ # the tab to the original location.
60
+ if action == Qt.IgnoreAction:
61
+ original_tab_index = self._mime_data.property('original_tab_index')
62
+ self.parentWidget().insertTab(
63
+ original_tab_index, widget, self._mime_data.text()
64
+ )
65
+
66
+ self._mime_data = None
67
+
68
+ def mousePressEvent(self, event): # noqa: N802
69
+ if event.button() == Qt.LeftButton and not self._mime_data:
70
+ tab_index = self.tabAt(event.pos())
71
+
72
+ # While we don't remove the tab on mouse press, capture its tab image
73
+ # and attach it to the mouse. This also stores info needed to handle
74
+ # moving the tab to a new QTabWidget, and undoing the move if the
75
+ # user cancels the drop.
76
+ tab_rect = self.tabRect(tab_index)
77
+ pixmap = QPixmap(tab_rect.size())
78
+ self.render(pixmap, QPoint(), QRegion(tab_rect))
79
+
80
+ self._mime_data = QMimeData()
81
+ self._mime_data.setData(self.mime_type, QByteArray())
82
+ self._mime_data.setText(self.tabText(tab_index))
83
+ self._mime_data.setProperty('original_tab_index', tab_index)
84
+ self._mime_data.setImageData(pixmap)
85
+ widget = self.parentWidget().widget(tab_index)
86
+ self._mime_data.setProperty('widget', widget)
87
+
88
+ # By default if there are no tabs, the tab bar is hidden. This
89
+ # prevents users from re-adding tabs to the tab bar as only it
90
+ # accepts the tab drops. This preserves the tab bar height
91
+ # after it was drawn with a tab so it should automatically stay
92
+ # the same visual height.
93
+ if not self.minimumHeight():
94
+ self.setMinimumHeight(self.height())
95
+
96
+ super(DragTabBar, self).mousePressEvent(event)
97
+
98
+ def mouseReleaseEvent(self, event): # noqa: N802
99
+ self._mime_data = None
100
+ super(DragTabBar, self).mouseReleaseEvent(event)
101
+
102
+ def dragEnterEvent(self, event): # noqa: N802
103
+ # if event.mimeData().hasFormat(self.mime_type):
104
+ event.accept()
105
+
106
+ def dragLeaveEvent(self, event): # noqa: N802
107
+ event.accept()
108
+
109
+ def dragMoveEvent(self, event): # noqa: N802
110
+ # If this is not a tab of the same mime type, make the tab under the mouse
111
+ # the current tab so users can easily drop inside that tab.
112
+ if not event.mimeData().hasFormat(self.mime_type):
113
+ event.accept()
114
+ tab_index = self.tabAt(event.pos())
115
+ if tab_index == -1:
116
+ tab_index = self.count() - 1
117
+ if self.currentIndex() != tab_index:
118
+ self.setCurrentIndex(tab_index)
119
+
120
+ def dropEvent(self, event): # noqa: N802
121
+ if not event.mimeData().hasFormat(self.mime_type):
122
+ return
123
+ if event.source().parentWidget() == self:
124
+ return
125
+
126
+ event.setDropAction(Qt.MoveAction)
127
+ event.accept()
128
+ counter = self.count()
129
+
130
+ mime_data = event.mimeData()
131
+ if counter == 0:
132
+ self.parent().addTab(mime_data.property('widget'), mime_data.text())
133
+ else:
134
+ self.parent().insertTab(
135
+ counter + 1, mime_data.property('widget'), mime_data.text()
136
+ )
137
+
138
+ def rename_tab(self):
139
+ """Used by the tab_menu to rename the tab at index `_context_menu_tab`."""
140
+ if self._context_menu_tab != -1:
141
+ current = self.tabText(self._context_menu_tab)
142
+ msg = 'Rename the {} tab to:'.format(current)
143
+ name, success = QInputDialog.getText(self, 'Rename Tab', msg, text=current)
144
+ if success:
145
+ self.setTabText(self._context_menu_tab, name)
146
+
147
+ def tab_menu(self, pos, popup=True):
148
+ """Creates the custom context menu for the tab bar. To customize the menu
149
+ call super setting `popup=False`. This will return the menu for
150
+ customization and you will then need to call popup on the menu.
151
+
152
+ This method sets the tab index the user right clicked on in the variable
153
+ `_context_menu_tab`. This can be used in the triggered QAction methods."""
154
+
155
+ self._context_menu_tab = self.tabAt(pos)
156
+ if self._context_menu_tab == -1:
157
+ return
158
+ menu = QMenu(self)
159
+ act = menu.addAction('Rename')
160
+ act.triggered.connect(self.rename_tab)
161
+
162
+ if popup:
163
+ menu.popup(self.mapToGlobal(pos))
164
+
165
+ return menu
166
+
167
+ @classmethod
168
+ def install_tab_widget(cls, tab_widget, mime_type='DragTabBar', menu=True):
169
+ """Creates and returns a instance of DragTabBar and installs it on the
170
+ QTabWidget. This enables movable tabs, and enables document mode.
171
+ Document mode makes the tab bar expand to the size of the QTabWidget so
172
+ drag drop operations are more intuitive.
173
+
174
+ Args:
175
+ tab_widget (QTabWidget): The QTabWidget to install the tab bar on.
176
+ mime_data (str, optional): This TabBar will only accept tab drop
177
+ operations with this mime type.
178
+ menu (bool, optional): Install a custom context menu on the bar bar.
179
+ Override `tab_menu` to customize the menu.
180
+ """
181
+ bar = cls(tab_widget, mime_type=mime_type)
182
+ tab_widget.setTabBar(bar)
183
+ tab_widget.setMovable(True)
184
+ tab_widget.setDocumentMode(True)
185
+
186
+ if menu:
187
+ bar.setContextMenuPolicy(Qt.CustomContextMenu)
188
+ bar.customContextMenuRequested.connect(bar.tab_menu)
189
+
190
+ return bar