wxPython-zombie 3.1.5.8__cp313-cp313-win_amd64.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.
Files changed (1175) hide show
  1. wx/__init__.py +22 -0
  2. wx/__version__.py +9 -0
  3. wx/_adv.cp313-win_amd64.pyd +0 -0
  4. wx/_aui.cp313-win_amd64.pyd +0 -0
  5. wx/_core.cp313-win_amd64.pyd +0 -0
  6. wx/_dataview.cp313-win_amd64.pyd +0 -0
  7. wx/_glcanvas.cp313-win_amd64.pyd +0 -0
  8. wx/_grid.cp313-win_amd64.pyd +0 -0
  9. wx/_html.cp313-win_amd64.pyd +0 -0
  10. wx/_html2.cp313-win_amd64.pyd +0 -0
  11. wx/_media.cp313-win_amd64.pyd +0 -0
  12. wx/_msw.cp313-win_amd64.pyd +0 -0
  13. wx/_propgrid.cp313-win_amd64.pyd +0 -0
  14. wx/_ribbon.cp313-win_amd64.pyd +0 -0
  15. wx/_richtext.cp313-win_amd64.pyd +0 -0
  16. wx/_stc.cp313-win_amd64.pyd +0 -0
  17. wx/_xml.cp313-win_amd64.pyd +0 -0
  18. wx/_xrc.cp313-win_amd64.pyd +0 -0
  19. wx/adv.py +124 -0
  20. wx/adv.pyi +5182 -0
  21. wx/aui.py +77 -0
  22. wx/aui.pyi +3655 -0
  23. wx/core.py +3540 -0
  24. wx/core.pyi +50592 -0
  25. wx/dataview.py +173 -0
  26. wx/dataview.pyi +3491 -0
  27. wx/demo/AUI_DockingWindowMgr.py +1154 -0
  28. wx/demo/AUI_MDI.py +117 -0
  29. wx/demo/AUI_Notebook.py +58 -0
  30. wx/demo/About.py +75 -0
  31. wx/demo/AboutBox.py +75 -0
  32. wx/demo/ActiveXWrapper_Acrobat.py +132 -0
  33. wx/demo/ActiveXWrapper_IE.py +187 -0
  34. wx/demo/ActiveX_FlashWindow.py +107 -0
  35. wx/demo/ActiveX_IEHtmlWindow.py +242 -0
  36. wx/demo/ActiveX_PDFWindow.py +204 -0
  37. wx/demo/ActivityIndicator.py +80 -0
  38. wx/demo/AddPrivateFont.py +116 -0
  39. wx/demo/AdjustChannels.py +178 -0
  40. wx/demo/AlphaDrawing.py +77 -0
  41. wx/demo/AnalogClock.py +144 -0
  42. wx/demo/AnimationCtrl.py +104 -0
  43. wx/demo/ArtProvider.py +893 -0
  44. wx/demo/BannerWindow.py +1 -0
  45. wx/demo/BitmapButton.py +87 -0
  46. wx/demo/BitmapComboBox.py +63 -0
  47. wx/demo/BitmapFromBuffer.py +140 -0
  48. wx/demo/Button.py +77 -0
  49. wx/demo/Cairo.py +197 -0
  50. wx/demo/Cairo_Snippets.py +135 -0
  51. wx/demo/Calendar.py +660 -0
  52. wx/demo/CalendarCtrl.py +122 -0
  53. wx/demo/CheckBox.py +74 -0
  54. wx/demo/CheckListBox.py +79 -0
  55. wx/demo/CheckListCtrl.py +99 -0
  56. wx/demo/Choice.py +55 -0
  57. wx/demo/Choicebook.py +80 -0
  58. wx/demo/CollapsibleHeaderCtrl.py +85 -0
  59. wx/demo/CollapsiblePane.py +126 -0
  60. wx/demo/ColorPanel.py +19 -0
  61. wx/demo/ColourDB.py +203 -0
  62. wx/demo/ColourDialog.py +76 -0
  63. wx/demo/ColourSelect.py +119 -0
  64. wx/demo/ComboBox.py +111 -0
  65. wx/demo/ComboCtrl.py +153 -0
  66. wx/demo/ComboTreeBox.py +71 -0
  67. wx/demo/CommandLinkButton.py +50 -0
  68. wx/demo/ContextHelp.py +112 -0
  69. wx/demo/Cursor.py +336 -0
  70. wx/demo/CustomDragAndDrop.py +353 -0
  71. wx/demo/DVC_CustomRenderer.py +204 -0
  72. wx/demo/DVC_DataViewModel.py +365 -0
  73. wx/demo/DVC_IndexListModel.py +257 -0
  74. wx/demo/DVC_ListCtrl.py +69 -0
  75. wx/demo/DVC_TreeCtrl.py +76 -0
  76. wx/demo/DatePickerCtrl.py +68 -0
  77. wx/demo/DelayedResult.py +239 -0
  78. wx/demo/Dialog.py +169 -0
  79. wx/demo/DialogUnits.py +128 -0
  80. wx/demo/DirDialog.py +58 -0
  81. wx/demo/DragAndDrop.py +265 -0
  82. wx/demo/DragImage.py +316 -0
  83. wx/demo/DragScroller.py +59 -0
  84. wx/demo/DrawXXXList.py +436 -0
  85. wx/demo/DynamicSashWindow.py +177 -0
  86. wx/demo/EditableListBox.py +101 -0
  87. wx/demo/Editor.py +70 -0
  88. wx/demo/EventManager.py +291 -0
  89. wx/demo/ExpandoTextCtrl.py +164 -0
  90. wx/demo/FancyText.py +83 -0
  91. wx/demo/FileBrowseButton.py +100 -0
  92. wx/demo/FileCtrl.py +97 -0
  93. wx/demo/FileDialog.py +144 -0
  94. wx/demo/FileHistory.py +140 -0
  95. wx/demo/FindReplaceDialog.py +123 -0
  96. wx/demo/FloatCanvas.py +1959 -0
  97. wx/demo/FontDialog.py +142 -0
  98. wx/demo/FontEnumerator.py +82 -0
  99. wx/demo/Frame.py +85 -0
  100. wx/demo/GLCanvas.py +371 -0
  101. wx/demo/Gauge.py +66 -0
  102. wx/demo/GenericButtons.py +185 -0
  103. wx/demo/GenericCheckBox.py +65 -0
  104. wx/demo/GenericDirCtrl.py +74 -0
  105. wx/demo/GetMouseState.py +159 -0
  106. wx/demo/GraphicsContext.py +236 -0
  107. wx/demo/GraphicsGradient.py +281 -0
  108. wx/demo/Grid.py +95 -0
  109. wx/demo/GridBagSizer.py +170 -0
  110. wx/demo/GridCustEditor.py +247 -0
  111. wx/demo/GridCustTable.py +170 -0
  112. wx/demo/GridDragAndDrop.py +102 -0
  113. wx/demo/GridDragable.py +206 -0
  114. wx/demo/GridEnterHandler.py +66 -0
  115. wx/demo/GridHugeTable.py +89 -0
  116. wx/demo/GridLabelRenderer.py +114 -0
  117. wx/demo/GridSimple.py +270 -0
  118. wx/demo/GridStdEdRend.py +186 -0
  119. wx/demo/Grid_MegaExample.py +490 -0
  120. wx/demo/HTML2_WebView.py +183 -0
  121. wx/demo/HtmlWindow.py +232 -0
  122. wx/demo/I18N.py +237 -0
  123. wx/demo/Image.py +338 -0
  124. wx/demo/ImageAlpha.py +87 -0
  125. wx/demo/ImageBrowser.py +70 -0
  126. wx/demo/ImageFromStream.py +49 -0
  127. wx/demo/Img2PyArtProvider.py +99 -0
  128. wx/demo/InfoBar.py +127 -0
  129. wx/demo/IntCtrl.py +343 -0
  130. wx/demo/ItemsPicker.py +108 -0
  131. wx/demo/Joystick.py +1083 -0
  132. wx/demo/KeyEvents.py +428 -0
  133. wx/demo/LEDNumberCtrl.py +121 -0
  134. wx/demo/LayoutAnchors.py +258 -0
  135. wx/demo/LayoutConstraints.py +149 -0
  136. wx/demo/Layoutf.py +69 -0
  137. wx/demo/ListBox.py +164 -0
  138. wx/demo/ListCtrl.py +538 -0
  139. wx/demo/ListCtrl_edit.py +155 -0
  140. wx/demo/ListCtrl_virtual.py +145 -0
  141. wx/demo/Listbook.py +104 -0
  142. wx/demo/MDIDemo.py +86 -0
  143. wx/demo/MDISashDemo.py +152 -0
  144. wx/demo/MDIWindows.py +66 -0
  145. wx/demo/Main.py +2768 -0
  146. wx/demo/Mask.py +137 -0
  147. wx/demo/MaskedEditControls.py +648 -0
  148. wx/demo/MaskedNumCtrl.py +359 -0
  149. wx/demo/MediaCtrl.py +190 -0
  150. wx/demo/Menu.py +322 -0
  151. wx/demo/MessageDialog.py +54 -0
  152. wx/demo/MimeTypesManager.py +354 -0
  153. wx/demo/MiniFrame.py +67 -0
  154. wx/demo/MouseGestures.py +198 -0
  155. wx/demo/MultiChoiceDialog.py +59 -0
  156. wx/demo/MultiSash.py +95 -0
  157. wx/demo/MultiSplitterWindow.py +168 -0
  158. wx/demo/MultipleChoiceDialog.py +101 -0
  159. wx/demo/Notebook.py +134 -0
  160. wx/demo/NotificationMessage.py +61 -0
  161. wx/demo/OGL.py +433 -0
  162. wx/demo/Overlay.py +209 -0
  163. wx/demo/OwnerDrawnComboBox.py +152 -0
  164. wx/demo/PDFViewer.py +109 -0
  165. wx/demo/PageSetupDialog.py +70 -0
  166. wx/demo/PenAndBrushStyles.py +208 -0
  167. wx/demo/Pickers.py +120 -0
  168. wx/demo/PlateButton.py +430 -0
  169. wx/demo/PopupControl.py +99 -0
  170. wx/demo/PopupMenu.py +156 -0
  171. wx/demo/PopupWindow.py +227 -0
  172. wx/demo/PrintDialog.py +60 -0
  173. wx/demo/PrintFramework.py +227 -0
  174. wx/demo/Process.py +168 -0
  175. wx/demo/ProgressDialog.py +87 -0
  176. wx/demo/PropertyGrid.py +1045 -0
  177. wx/demo/PropertySheetDialog.py +231 -0
  178. wx/demo/PseudoDC.py +350 -0
  179. wx/demo/PyColourChooser.py +60 -0
  180. wx/demo/PyCrust.py +21 -0
  181. wx/demo/PyPlot.py +83 -0
  182. wx/demo/PyShell.py +22 -0
  183. wx/demo/PythonEvents.py +109 -0
  184. wx/demo/README.txt +7 -0
  185. wx/demo/RadioBox.py +67 -0
  186. wx/demo/RadioButton.py +127 -0
  187. wx/demo/RawBitmapAccess.py +208 -0
  188. wx/demo/RearrangeDialog.py +160 -0
  189. wx/demo/RendererNative.py +170 -0
  190. wx/demo/ResizeWidget.py +76 -0
  191. wx/demo/RichMessageDialog.py +85 -0
  192. wx/demo/RichTextCtrl.py +732 -0
  193. wx/demo/RichToolTip.py +145 -0
  194. wx/demo/SVGImage_Bitmap.py +130 -0
  195. wx/demo/SVGImage_Render.py +138 -0
  196. wx/demo/SashWindow.py +151 -0
  197. wx/demo/ScrolledMessageDialog.py +52 -0
  198. wx/demo/ScrolledPanel.py +124 -0
  199. wx/demo/ScrolledWindow.py +260 -0
  200. wx/demo/SearchCtrl.py +115 -0
  201. wx/demo/ShapedWindow.py +145 -0
  202. wx/demo/Simplebook.py +202 -0
  203. wx/demo/SingleChoiceDialog.py +56 -0
  204. wx/demo/SizedControls.py +433 -0
  205. wx/demo/Sizers.py +609 -0
  206. wx/demo/Slider.py +52 -0
  207. wx/demo/Sound.py +95 -0
  208. wx/demo/SpinButton.py +63 -0
  209. wx/demo/SpinCtrl.py +56 -0
  210. wx/demo/SpinCtrlDouble.py +42 -0
  211. wx/demo/SplitTree.py +146 -0
  212. wx/demo/SplitterWindow.py +62 -0
  213. wx/demo/StandardPaths.py +113 -0
  214. wx/demo/StaticBitmap.py +55 -0
  215. wx/demo/StaticBox.py +62 -0
  216. wx/demo/StaticText.py +69 -0
  217. wx/demo/StatusBar.py +144 -0
  218. wx/demo/StockButtons.py +113 -0
  219. wx/demo/StyledTextCtrl_1.py +303 -0
  220. wx/demo/StyledTextCtrl_2.py +410 -0
  221. wx/demo/SystemSettings.py +333 -0
  222. wx/demo/TablePrint.py +215 -0
  223. wx/demo/TestTable.txt +38 -0
  224. wx/demo/TextCtrl.py +187 -0
  225. wx/demo/TextEntryDialog.py +57 -0
  226. wx/demo/Threads.py +258 -0
  227. wx/demo/Throbber.py +250 -0
  228. wx/demo/Ticker.py +147 -0
  229. wx/demo/TimeCtrl.py +240 -0
  230. wx/demo/TimePickerCtrl.py +60 -0
  231. wx/demo/Timer.py +275 -0
  232. wx/demo/ToggleButton.py +54 -0
  233. wx/demo/ToolBar.py +249 -0
  234. wx/demo/ToolTip.py +71 -0
  235. wx/demo/Toolbook.py +111 -0
  236. wx/demo/TreeCtrl.py +199 -0
  237. wx/demo/TreeListCtrl.py +121 -0
  238. wx/demo/TreeMixin.py +269 -0
  239. wx/demo/Treebook.py +117 -0
  240. wx/demo/UIActionSimulator.py +151 -0
  241. wx/demo/URLDragAndDrop.py +130 -0
  242. wx/demo/Unicode.py +146 -0
  243. wx/demo/VListBox.py +176 -0
  244. wx/demo/Validator.py +237 -0
  245. wx/demo/Wizard.py +248 -0
  246. wx/demo/WrapSizer.py +115 -0
  247. wx/demo/XmlResource.py +80 -0
  248. wx/demo/XmlResourceHandler.py +199 -0
  249. wx/demo/XmlResourceSubclass.py +119 -0
  250. wx/demo/__init__.py +9 -0
  251. wx/demo/agw/AGWInfoBar.py +175 -0
  252. wx/demo/agw/AUI.py +3058 -0
  253. wx/demo/agw/AdvancedSplash.py +59 -0
  254. wx/demo/agw/AquaButton.py +146 -0
  255. wx/demo/agw/BalloonTip.py +378 -0
  256. wx/demo/agw/ButtonPanel.py +890 -0
  257. wx/demo/agw/CubeColourDialog.py +83 -0
  258. wx/demo/agw/CustomTreeCtrl.py +2167 -0
  259. wx/demo/agw/Example1 +67 -0
  260. wx/demo/agw/Example2 +49 -0
  261. wx/demo/agw/FlatMenu.py +876 -0
  262. wx/demo/agw/FlatNotebook.py +994 -0
  263. wx/demo/agw/FloatSpin.py +475 -0
  264. wx/demo/agw/FoldPanelBar.py +953 -0
  265. wx/demo/agw/FourWaySplitter.py +300 -0
  266. wx/demo/agw/GenericMessageDialog.py +207 -0
  267. wx/demo/agw/GradientButton.py +156 -0
  268. wx/demo/agw/HyperLinkCtrl.py +144 -0
  269. wx/demo/agw/HyperTreeList.py +2660 -0
  270. wx/demo/agw/KnobCtrl.py +186 -0
  271. wx/demo/agw/LabelBook.py +567 -0
  272. wx/demo/agw/MacLargeDemo.py +360 -0
  273. wx/demo/agw/MultiDirDialog.py +117 -0
  274. wx/demo/agw/PeakMeter.py +194 -0
  275. wx/demo/agw/PersistentControls.py +589 -0
  276. wx/demo/agw/PieCtrl.py +206 -0
  277. wx/demo/agw/PyBusyInfo.py +64 -0
  278. wx/demo/agw/PyCollapsiblePane.py +308 -0
  279. wx/demo/agw/PyGauge.py +162 -0
  280. wx/demo/agw/PyProgress.py +155 -0
  281. wx/demo/agw/RibbonBar.py +925 -0
  282. wx/demo/agw/RulerCtrl.py +454 -0
  283. wx/demo/agw/ScrolledThumbnail.py +128 -0
  284. wx/demo/agw/ShapedButton.py +603 -0
  285. wx/demo/agw/ShortcutEditor.py +397 -0
  286. wx/demo/agw/SpeedMeter.py +668 -0
  287. wx/demo/agw/SuperToolTip.py +396 -0
  288. wx/demo/agw/ThumbDemoConfig.py +603 -0
  289. wx/demo/agw/ThumbnailCtrl.py +149 -0
  290. wx/demo/agw/ToasterBox.py +410 -0
  291. wx/demo/agw/UltimateListCtrl.py +80 -0
  292. wx/demo/agw/UltimateListIconDemo.py +908 -0
  293. wx/demo/agw/UltimateListListDemo.py +124 -0
  294. wx/demo/agw/UltimateReportDemo.py +1146 -0
  295. wx/demo/agw/UltimateVirtualDemo.py +207 -0
  296. wx/demo/agw/Windows7Explorer_Contents.py +368 -0
  297. wx/demo/agw/XLSGrid.py +238 -0
  298. wx/demo/agw/ZoomBar.py +230 -0
  299. wx/demo/agw/__demo__.py +183 -0
  300. wx/demo/agw/bitmaps/Explorer96.png +0 -0
  301. wx/demo/agw/bitmaps/Explorer96Flip40.png +0 -0
  302. wx/demo/agw/bitmaps/Folder96.png +0 -0
  303. wx/demo/agw/bitmaps/Folder96Flip40.png +0 -0
  304. wx/demo/agw/bitmaps/Monitor96.png +0 -0
  305. wx/demo/agw/bitmaps/Monitor96Flip40.png +0 -0
  306. wx/demo/agw/bitmaps/Music96.png +0 -0
  307. wx/demo/agw/bitmaps/Music96Flip40.png +0 -0
  308. wx/demo/agw/bitmaps/Photo96.png +0 -0
  309. wx/demo/agw/bitmaps/Photo96Flip40.png +0 -0
  310. wx/demo/agw/bitmaps/Search96.png +0 -0
  311. wx/demo/agw/bitmaps/Search96Flip40.png +0 -0
  312. wx/demo/agw/bitmaps/Wizard96.png +0 -0
  313. wx/demo/agw/bitmaps/Wizard96Flip40.png +0 -0
  314. wx/demo/agw/bitmaps/advancedsplash.png +0 -0
  315. wx/demo/agw/bitmaps/aquabutton.png +0 -0
  316. wx/demo/agw/bitmaps/aquachecked.ico +0 -0
  317. wx/demo/agw/bitmaps/aquaflagged.ico +0 -0
  318. wx/demo/agw/bitmaps/aquanotchecked.ico +0 -0
  319. wx/demo/agw/bitmaps/aquanotflagged.ico +0 -0
  320. wx/demo/agw/bitmaps/canada.gif +0 -0
  321. wx/demo/agw/bitmaps/checked.ico +0 -0
  322. wx/demo/agw/bitmaps/columns.png +0 -0
  323. wx/demo/agw/bitmaps/contexthelp-16.png +0 -0
  324. wx/demo/agw/bitmaps/contexthelp.png +0 -0
  325. wx/demo/agw/bitmaps/copy.png +0 -0
  326. wx/demo/agw/bitmaps/cut.png +0 -0
  327. wx/demo/agw/bitmaps/editcopy.png +0 -0
  328. wx/demo/agw/bitmaps/editcut.png +0 -0
  329. wx/demo/agw/bitmaps/editpaste.png +0 -0
  330. wx/demo/agw/bitmaps/empty_icon.png +0 -0
  331. wx/demo/agw/bitmaps/exit-16.png +0 -0
  332. wx/demo/agw/bitmaps/exit.ico +0 -0
  333. wx/demo/agw/bitmaps/ffwd.png +0 -0
  334. wx/demo/agw/bitmaps/ffwddisabled.png +0 -0
  335. wx/demo/agw/bitmaps/field-16.png +0 -0
  336. wx/demo/agw/bitmaps/filenew.png +0 -0
  337. wx/demo/agw/bitmaps/fileopen.png +0 -0
  338. wx/demo/agw/bitmaps/filesave.png +0 -0
  339. wx/demo/agw/bitmaps/flagged.ico +0 -0
  340. wx/demo/agw/bitmaps/folder.png +0 -0
  341. wx/demo/agw/bitmaps/folder_new.png +0 -0
  342. wx/demo/agw/bitmaps/ghost.png +0 -0
  343. wx/demo/agw/bitmaps/gradientbutton.png +0 -0
  344. wx/demo/agw/bitmaps/help-16.png +0 -0
  345. wx/demo/agw/bitmaps/help.ico +0 -0
  346. wx/demo/agw/bitmaps/italy.gif +0 -0
  347. wx/demo/agw/bitmaps/lbadd.png +0 -0
  348. wx/demo/agw/bitmaps/lbcharge.png +0 -0
  349. wx/demo/agw/bitmaps/lbdecrypted.png +0 -0
  350. wx/demo/agw/bitmaps/lbnews.png +0 -0
  351. wx/demo/agw/bitmaps/lbroll.png +0 -0
  352. wx/demo/agw/bitmaps/minus1.ico +0 -0
  353. wx/demo/agw/bitmaps/minus2.ico +0 -0
  354. wx/demo/agw/bitmaps/minus3.ico +0 -0
  355. wx/demo/agw/bitmaps/minus4.ico +0 -0
  356. wx/demo/agw/bitmaps/minus5.ico +0 -0
  357. wx/demo/agw/bitmaps/month-16.png +0 -0
  358. wx/demo/agw/bitmaps/new_file.png +0 -0
  359. wx/demo/agw/bitmaps/new_folder.png +0 -0
  360. wx/demo/agw/bitmaps/notchecked.ico +0 -0
  361. wx/demo/agw/bitmaps/notflagged.ico +0 -0
  362. wx/demo/agw/bitmaps/ok-16.png +0 -0
  363. wx/demo/agw/bitmaps/open_folder.png +0 -0
  364. wx/demo/agw/bitmaps/paste.png +0 -0
  365. wx/demo/agw/bitmaps/pause.png +0 -0
  366. wx/demo/agw/bitmaps/pausedisabled.png +0 -0
  367. wx/demo/agw/bitmaps/play.png +0 -0
  368. wx/demo/agw/bitmaps/playdisabled.png +0 -0
  369. wx/demo/agw/bitmaps/plus1.ico +0 -0
  370. wx/demo/agw/bitmaps/plus2.ico +0 -0
  371. wx/demo/agw/bitmaps/plus3.ico +0 -0
  372. wx/demo/agw/bitmaps/plus4.ico +0 -0
  373. wx/demo/agw/bitmaps/plus5.ico +0 -0
  374. wx/demo/agw/bitmaps/record.png +0 -0
  375. wx/demo/agw/bitmaps/recorddisabled.png +0 -0
  376. wx/demo/agw/bitmaps/recording.gif +0 -0
  377. wx/demo/agw/bitmaps/rewind.png +0 -0
  378. wx/demo/agw/bitmaps/rewinddisabled.png +0 -0
  379. wx/demo/agw/bitmaps/round.png +0 -0
  380. wx/demo/agw/bitmaps/save.png +0 -0
  381. wx/demo/agw/bitmaps/separator.gif +0 -0
  382. wx/demo/agw/bitmaps/separatorflip.png +0 -0
  383. wx/demo/agw/bitmaps/smfuel.ico +0 -0
  384. wx/demo/agw/bitmaps/smpi.ico +0 -0
  385. wx/demo/agw/bitmaps/smtemp.ico +0 -0
  386. wx/demo/agw/bitmaps/stop.png +0 -0
  387. wx/demo/agw/bitmaps/stopdisabled.png +0 -0
  388. wx/demo/agw/bitmaps/sttbutton.png +0 -0
  389. wx/demo/agw/bitmaps/sttfont.png +0 -0
  390. wx/demo/agw/bitmaps/sttheader.png +0 -0
  391. wx/demo/agw/bitmaps/stthelp.png +0 -0
  392. wx/demo/agw/bitmaps/view1.png +0 -0
  393. wx/demo/agw/bitmaps/view2.png +0 -0
  394. wx/demo/agw/bitmaps/view_choose.png +0 -0
  395. wx/demo/agw/bitmaps/view_detailed.png +0 -0
  396. wx/demo/agw/bitmaps/view_icon.png +0 -0
  397. wx/demo/agw/bitmaps/view_multicolumn.png +0 -0
  398. wx/demo/agw/bitmaps/viewmag-16.png +0 -0
  399. wx/demo/agw/bitmaps/viewmag-m-16.png +0 -0
  400. wx/demo/agw/bitmaps/viewmag-p-16.png +0 -0
  401. wx/demo/agw/bitmaps/viewmagfit-16.png +0 -0
  402. wx/demo/agw/data/Example_1.xls +0 -0
  403. wx/demo/agw/images.py +6714 -0
  404. wx/demo/bitmaps/AG00028_.gif +0 -0
  405. wx/demo/bitmaps/AG00039_.gif +0 -0
  406. wx/demo/bitmaps/AG00178_.gif +0 -0
  407. wx/demo/bitmaps/AG00183_.gif +0 -0
  408. wx/demo/bitmaps/AG00185_.gif +0 -0
  409. wx/demo/bitmaps/BD13656_.gif +0 -0
  410. wx/demo/bitmaps/advancedsplash.png +0 -0
  411. wx/demo/bitmaps/aquabutton.png +0 -0
  412. wx/demo/bitmaps/aquachecked.ico +0 -0
  413. wx/demo/bitmaps/aquaflagged.ico +0 -0
  414. wx/demo/bitmaps/aquanotchecked.ico +0 -0
  415. wx/demo/bitmaps/aquanotflagged.ico +0 -0
  416. wx/demo/bitmaps/canada.gif +0 -0
  417. wx/demo/bitmaps/checked.ico +0 -0
  418. wx/demo/bitmaps/columns.png +0 -0
  419. wx/demo/bitmaps/contexthelp-16.png +0 -0
  420. wx/demo/bitmaps/contexthelp.png +0 -0
  421. wx/demo/bitmaps/copy.png +0 -0
  422. wx/demo/bitmaps/cropshot24x20.png +0 -0
  423. wx/demo/bitmaps/cut.png +0 -0
  424. wx/demo/bitmaps/editcopy.png +0 -0
  425. wx/demo/bitmaps/editcut.png +0 -0
  426. wx/demo/bitmaps/editpaste.png +0 -0
  427. wx/demo/bitmaps/exit-16.png +0 -0
  428. wx/demo/bitmaps/exit.ico +0 -0
  429. wx/demo/bitmaps/ffwd.png +0 -0
  430. wx/demo/bitmaps/ffwddisabled.png +0 -0
  431. wx/demo/bitmaps/field-16.png +0 -0
  432. wx/demo/bitmaps/filenew.png +0 -0
  433. wx/demo/bitmaps/fileopen.png +0 -0
  434. wx/demo/bitmaps/filesave.png +0 -0
  435. wx/demo/bitmaps/flagged.ico +0 -0
  436. wx/demo/bitmaps/folder_new.png +0 -0
  437. wx/demo/bitmaps/ghost.png +0 -0
  438. wx/demo/bitmaps/gradientbutton.png +0 -0
  439. wx/demo/bitmaps/help-16.png +0 -0
  440. wx/demo/bitmaps/help.ico +0 -0
  441. wx/demo/bitmaps/honeycomb300.png +0 -0
  442. wx/demo/bitmaps/image.bmp +0 -0
  443. wx/demo/bitmaps/image.gif +0 -0
  444. wx/demo/bitmaps/image.ico +0 -0
  445. wx/demo/bitmaps/image.jpg +0 -0
  446. wx/demo/bitmaps/image.png +0 -0
  447. wx/demo/bitmaps/image.tif +0 -0
  448. wx/demo/bitmaps/italy.gif +0 -0
  449. wx/demo/bitmaps/lbadd.png +0 -0
  450. wx/demo/bitmaps/lbcharge.png +0 -0
  451. wx/demo/bitmaps/lbdecrypted.png +0 -0
  452. wx/demo/bitmaps/lbnews.png +0 -0
  453. wx/demo/bitmaps/lbroll.png +0 -0
  454. wx/demo/bitmaps/minus1.ico +0 -0
  455. wx/demo/bitmaps/minus2.ico +0 -0
  456. wx/demo/bitmaps/minus3.ico +0 -0
  457. wx/demo/bitmaps/minus4.ico +0 -0
  458. wx/demo/bitmaps/minus5.ico +0 -0
  459. wx/demo/bitmaps/month-16.png +0 -0
  460. wx/demo/bitmaps/new_file.png +0 -0
  461. wx/demo/bitmaps/new_folder.png +0 -0
  462. wx/demo/bitmaps/notchecked.ico +0 -0
  463. wx/demo/bitmaps/notflagged.ico +0 -0
  464. wx/demo/bitmaps/ok-16.png +0 -0
  465. wx/demo/bitmaps/open_folder.png +0 -0
  466. wx/demo/bitmaps/paste.png +0 -0
  467. wx/demo/bitmaps/pause.png +0 -0
  468. wx/demo/bitmaps/pausedisabled.png +0 -0
  469. wx/demo/bitmaps/phoenix_title.png +0 -0
  470. wx/demo/bitmaps/phoenix_top.png +0 -0
  471. wx/demo/bitmaps/play.png +0 -0
  472. wx/demo/bitmaps/playdisabled.png +0 -0
  473. wx/demo/bitmaps/plus1.ico +0 -0
  474. wx/demo/bitmaps/plus2.ico +0 -0
  475. wx/demo/bitmaps/plus3.ico +0 -0
  476. wx/demo/bitmaps/plus4.ico +0 -0
  477. wx/demo/bitmaps/plus5.ico +0 -0
  478. wx/demo/bitmaps/record.png +0 -0
  479. wx/demo/bitmaps/recorddisabled.png +0 -0
  480. wx/demo/bitmaps/rewind.png +0 -0
  481. wx/demo/bitmaps/rewinddisabled.png +0 -0
  482. wx/demo/bitmaps/round.png +0 -0
  483. wx/demo/bitmaps/save.png +0 -0
  484. wx/demo/bitmaps/smfuel.ico +0 -0
  485. wx/demo/bitmaps/smpi.ico +0 -0
  486. wx/demo/bitmaps/smtemp.ico +0 -0
  487. wx/demo/bitmaps/snakey_render.png +0 -0
  488. wx/demo/bitmaps/splash.png +0 -0
  489. wx/demo/bitmaps/stop.png +0 -0
  490. wx/demo/bitmaps/stopdisabled.png +0 -0
  491. wx/demo/bitmaps/sttbutton.png +0 -0
  492. wx/demo/bitmaps/sttfont.png +0 -0
  493. wx/demo/bitmaps/sttheader.png +0 -0
  494. wx/demo/bitmaps/stthelp.png +0 -0
  495. wx/demo/bitmaps/toucan.png +0 -0
  496. wx/demo/bitmaps/view1.png +0 -0
  497. wx/demo/bitmaps/view2.png +0 -0
  498. wx/demo/bitmaps/view_choose.png +0 -0
  499. wx/demo/bitmaps/view_detailed.png +0 -0
  500. wx/demo/bitmaps/view_icon.png +0 -0
  501. wx/demo/bitmaps/view_multicolumn.png +0 -0
  502. wx/demo/bitmaps/viewmag-16.png +0 -0
  503. wx/demo/bitmaps/viewmag-m-16.png +0 -0
  504. wx/demo/bitmaps/viewmag-p-16.png +0 -0
  505. wx/demo/bitmaps/viewmagfit-16.png +0 -0
  506. wx/demo/bmp_source/001.png +0 -0
  507. wx/demo/bmp_source/002.png +0 -0
  508. wx/demo/bmp_source/003.png +0 -0
  509. wx/demo/bmp_source/004.png +0 -0
  510. wx/demo/bmp_source/005.png +0 -0
  511. wx/demo/bmp_source/006.png +0 -0
  512. wx/demo/bmp_source/007.png +0 -0
  513. wx/demo/bmp_source/008.png +0 -0
  514. wx/demo/bmp_source/009.png +0 -0
  515. wx/demo/bmp_source/010.png +0 -0
  516. wx/demo/bmp_source/011.png +0 -0
  517. wx/demo/bmp_source/012.png +0 -0
  518. wx/demo/bmp_source/013.png +0 -0
  519. wx/demo/bmp_source/014.png +0 -0
  520. wx/demo/bmp_source/015.png +0 -0
  521. wx/demo/bmp_source/016.png +0 -0
  522. wx/demo/bmp_source/017.png +0 -0
  523. wx/demo/bmp_source/018.png +0 -0
  524. wx/demo/bmp_source/019.png +0 -0
  525. wx/demo/bmp_source/020.png +0 -0
  526. wx/demo/bmp_source/021.png +0 -0
  527. wx/demo/bmp_source/022.png +0 -0
  528. wx/demo/bmp_source/023.png +0 -0
  529. wx/demo/bmp_source/024.png +0 -0
  530. wx/demo/bmp_source/025.png +0 -0
  531. wx/demo/bmp_source/026.png +0 -0
  532. wx/demo/bmp_source/027.png +0 -0
  533. wx/demo/bmp_source/028.png +0 -0
  534. wx/demo/bmp_source/029.png +0 -0
  535. wx/demo/bmp_source/030.png +0 -0
  536. wx/demo/bmp_source/DbDec.bmp +0 -0
  537. wx/demo/bmp_source/DbInc.bmp +0 -0
  538. wx/demo/bmp_source/Dec.bmp +0 -0
  539. wx/demo/bmp_source/FRM_0.png +0 -0
  540. wx/demo/bmp_source/FRM_1.png +0 -0
  541. wx/demo/bmp_source/FRM_2.png +0 -0
  542. wx/demo/bmp_source/FRM_3.png +0 -0
  543. wx/demo/bmp_source/FRM_4.png +0 -0
  544. wx/demo/bmp_source/FRM_5.png +0 -0
  545. wx/demo/bmp_source/FRM_6.png +0 -0
  546. wx/demo/bmp_source/FRM_7.png +0 -0
  547. wx/demo/bmp_source/FRM_8.png +0 -0
  548. wx/demo/bmp_source/GridBG.gif +0 -0
  549. wx/demo/bmp_source/Inc.bmp +0 -0
  550. wx/demo/bmp_source/LB01.png +0 -0
  551. wx/demo/bmp_source/LB02.png +0 -0
  552. wx/demo/bmp_source/LB03.png +0 -0
  553. wx/demo/bmp_source/LB04.png +0 -0
  554. wx/demo/bmp_source/LB05.png +0 -0
  555. wx/demo/bmp_source/LB06.png +0 -0
  556. wx/demo/bmp_source/LB07.png +0 -0
  557. wx/demo/bmp_source/LB08.png +0 -0
  558. wx/demo/bmp_source/LB09.png +0 -0
  559. wx/demo/bmp_source/LB10.png +0 -0
  560. wx/demo/bmp_source/LB11.png +0 -0
  561. wx/demo/bmp_source/LB12.png +0 -0
  562. wx/demo/bmp_source/Pt.bmp +0 -0
  563. wx/demo/bmp_source/Vippi.png +0 -0
  564. wx/demo/bmp_source/backgrnd.png +0 -0
  565. wx/demo/bmp_source/book.png +0 -0
  566. wx/demo/bmp_source/book_blue.png +0 -0
  567. wx/demo/bmp_source/book_green.png +0 -0
  568. wx/demo/bmp_source/book_red.png +0 -0
  569. wx/demo/bmp_source/bp_btn1.png +0 -0
  570. wx/demo/bmp_source/bp_btn2.png +0 -0
  571. wx/demo/bmp_source/bp_btn3.png +0 -0
  572. wx/demo/bmp_source/bp_btn4.png +0 -0
  573. wx/demo/bmp_source/bulb1.bmp +0 -0
  574. wx/demo/bmp_source/bulb2.bmp +0 -0
  575. wx/demo/bmp_source/carrot.png +0 -0
  576. wx/demo/bmp_source/clipboard.png +0 -0
  577. wx/demo/bmp_source/code.png +0 -0
  578. wx/demo/bmp_source/core.png +0 -0
  579. wx/demo/bmp_source/custom.png +0 -0
  580. wx/demo/bmp_source/customcontrol.png +0 -0
  581. wx/demo/bmp_source/deletedocs.png +0 -0
  582. wx/demo/bmp_source/deleteperspective.png +0 -0
  583. wx/demo/bmp_source/demo.png +0 -0
  584. wx/demo/bmp_source/dialog.png +0 -0
  585. wx/demo/bmp_source/exit.png +0 -0
  586. wx/demo/bmp_source/expansion.png +0 -0
  587. wx/demo/bmp_source/find.png +0 -0
  588. wx/demo/bmp_source/findnext.png +0 -0
  589. wx/demo/bmp_source/floatcanvas.png +0 -0
  590. wx/demo/bmp_source/frame.png +0 -0
  591. wx/demo/bmp_source/images.png +0 -0
  592. wx/demo/bmp_source/inspect.png +0 -0
  593. wx/demo/bmp_source/layout.png +0 -0
  594. wx/demo/bmp_source/logo.png +0 -0
  595. wx/demo/bmp_source/miscellaneous.png +0 -0
  596. wx/demo/bmp_source/modifiedexists.png +0 -0
  597. wx/demo/bmp_source/mondrian.ico +0 -0
  598. wx/demo/bmp_source/morecontrols.png +0 -0
  599. wx/demo/bmp_source/moredialog.png +0 -0
  600. wx/demo/bmp_source/noicon.png +0 -0
  601. wx/demo/bmp_source/overview.png +0 -0
  602. wx/demo/bmp_source/pencil.png +0 -0
  603. wx/demo/bmp_source/pointy.png +0 -0
  604. wx/demo/bmp_source/process.png +0 -0
  605. wx/demo/bmp_source/pyshell.png +0 -0
  606. wx/demo/bmp_source/recent.png +0 -0
  607. wx/demo/bmp_source/rest.png +0 -0
  608. wx/demo/bmp_source/robin.jpg +0 -0
  609. wx/demo/bmp_source/rt_alignleft.xpm +24 -0
  610. wx/demo/bmp_source/rt_alignright.xpm +24 -0
  611. wx/demo/bmp_source/rt_bold.xpm +24 -0
  612. wx/demo/bmp_source/rt_centre.xpm +24 -0
  613. wx/demo/bmp_source/rt_colour.xpm +59 -0
  614. wx/demo/bmp_source/rt_copy.xpm +44 -0
  615. wx/demo/bmp_source/rt_cut.xpm +46 -0
  616. wx/demo/bmp_source/rt_font.xpm +25 -0
  617. wx/demo/bmp_source/rt_idea.xpm +47 -0
  618. wx/demo/bmp_source/rt_indentless.xpm +25 -0
  619. wx/demo/bmp_source/rt_indentmore.xpm +25 -0
  620. wx/demo/bmp_source/rt_italic.xpm +25 -0
  621. wx/demo/bmp_source/rt_open.xpm +57 -0
  622. wx/demo/bmp_source/rt_paste.xpm +46 -0
  623. wx/demo/bmp_source/rt_redo.xpm +58 -0
  624. wx/demo/bmp_source/rt_sample.xpm +44 -0
  625. wx/demo/bmp_source/rt_save.xpm +42 -0
  626. wx/demo/bmp_source/rt_smiley.xpm +42 -0
  627. wx/demo/bmp_source/rt_underline.xpm +25 -0
  628. wx/demo/bmp_source/rt_undo.xpm +58 -0
  629. wx/demo/bmp_source/rt_zebra.xpm +409 -0
  630. wx/demo/bmp_source/saveperspective.png +0 -0
  631. wx/demo/bmp_source/sm_down.bmp +0 -0
  632. wx/demo/bmp_source/sm_up.bmp +0 -0
  633. wx/demo/bmp_source/smiles2.bmp +0 -0
  634. wx/demo/bmp_source/test2.bmp +0 -0
  635. wx/demo/bmp_source/testmask.bmp +0 -0
  636. wx/demo/bmp_source/teststar.png +0 -0
  637. wx/demo/bmp_source/thekid.png +0 -0
  638. wx/demo/bmp_source/tog1.bmp +0 -0
  639. wx/demo/bmp_source/tog2.bmp +0 -0
  640. wx/demo/bmp_source/wiztest1.bmp +0 -0
  641. wx/demo/bmp_source/wiztest2.bmp +0 -0
  642. wx/demo/bmp_source/wxpdemo.ico +0 -0
  643. wx/demo/cursors/paperairplane_arrow_blue.cur +0 -0
  644. wx/demo/cursors/paperairplane_arrow_blue_fadeout80.cur +0 -0
  645. wx/demo/cursors/paperairplane_arrow_colorshift.ani +0 -0
  646. wx/demo/cursors/paperairplane_arrow_dark.cur +0 -0
  647. wx/demo/cursors/paperairplane_arrow_grey.cur +0 -0
  648. wx/demo/cursors/paperairplane_arrow_red.cur +0 -0
  649. wx/demo/cursors/paperairplane_arrow_white.cur +0 -0
  650. wx/demo/cursors/paperairplane_arrow_white24.png +0 -0
  651. wx/demo/data/0-tiger.svg +725 -0
  652. wx/demo/data/Asteroid_blaster.swf +0 -0
  653. wx/demo/data/SIL_OPEN_FONT_LICENSE.txt +97 -0
  654. wx/demo/data/SourceCodePro-Regular.ttf +0 -0
  655. wx/demo/data/accessories-calculator.svg +636 -0
  656. wx/demo/data/accessories-text-editor.svg +554 -0
  657. wx/demo/data/anykey.wav +0 -0
  658. wx/demo/data/applications-internet.svg +623 -0
  659. wx/demo/data/desktop-accessibility.svg +245 -0
  660. wx/demo/data/desktop-keyboard-shortcuts.svg +839 -0
  661. wx/demo/data/desktop-locale.svg +878 -0
  662. wx/demo/data/desktop-remote-desktop.svg +1479 -0
  663. wx/demo/data/desktop-theme.svg +882 -0
  664. wx/demo/data/desktop-wallpaper.svg +747 -0
  665. wx/demo/data/echo.py +25 -0
  666. wx/demo/data/imagemap.htm +20 -0
  667. wx/demo/data/imagemap.png +0 -0
  668. wx/demo/data/internet-group-chat.svg +312 -0
  669. wx/demo/data/internet-mail.svg +440 -0
  670. wx/demo/data/locale/af/LC_MESSAGES/wxpydemo.mo +0 -0
  671. wx/demo/data/locale/de/LC_MESSAGES/wxpydemo.mo +0 -0
  672. wx/demo/data/locale/es/LC_MESSAGES/wxpydemo.mo +0 -0
  673. wx/demo/data/locale/fr/LC_MESSAGES/wxpydemo.mo +0 -0
  674. wx/demo/data/locale/it/LC_MESSAGES/wxpydemo.mo +0 -0
  675. wx/demo/data/locale-src/af.po +23 -0
  676. wx/demo/data/locale-src/de.po +23 -0
  677. wx/demo/data/locale-src/es.po +22 -0
  678. wx/demo/data/locale-src/fr.po +22 -0
  679. wx/demo/data/locale-src/install +15 -0
  680. wx/demo/data/locale-src/it.po +23 -0
  681. wx/demo/data/locale-src/wxpydemo.po +21 -0
  682. wx/demo/data/office-calendar.svg +316 -0
  683. wx/demo/data/pic.png +0 -0
  684. wx/demo/data/pic2.bmp +0 -0
  685. wx/demo/data/plan.wav +0 -0
  686. wx/demo/data/proclamation.txt +115 -0
  687. wx/demo/data/resource.wdr +0 -0
  688. wx/demo/data/resource_wdr.xrc +146 -0
  689. wx/demo/data/romedalen.png +0 -0
  690. wx/demo/data/stc.h.html +3544 -0
  691. wx/demo/data/system-session.svg +510 -0
  692. wx/demo/data/system-users.svg +539 -0
  693. wx/demo/data/tables.htm +116 -0
  694. wx/demo/data/test-gradient-pen.svg +14 -0
  695. wx/demo/data/test-opacity.svg +7 -0
  696. wx/demo/data/test.htm +253 -0
  697. wx/demo/data/testmovie.mpg +0 -0
  698. wx/demo/data/testtable.txt +38 -0
  699. wx/demo/data/tips.txt +73 -0
  700. wx/demo/data/utilities-system-monitor.svg +435 -0
  701. wx/demo/data/utilities-terminal.svg +500 -0
  702. wx/demo/data/widgetTest.htm +70 -0
  703. wx/demo/data/world.dat +24055 -0
  704. wx/demo/demo.py +4 -0
  705. wx/demo/demo.pyw +4 -0
  706. wx/demo/demodata.py +310 -0
  707. wx/demo/encode_bitmaps.py +181 -0
  708. wx/demo/images.py +6812 -0
  709. wx/demo/infoframe.py +149 -0
  710. wx/demo/run.py +171 -0
  711. wx/demo/snippets/__init__.py +13 -0
  712. wx/demo/snippets/arc.py +21 -0
  713. wx/demo/snippets/arc_negative.py +21 -0
  714. wx/demo/snippets/clip.py +13 -0
  715. wx/demo/snippets/clip_image.py +13 -0
  716. wx/demo/snippets/curve_rectangle.py +53 -0
  717. wx/demo/snippets/curve_to.py +17 -0
  718. wx/demo/snippets/dash.py +18 -0
  719. wx/demo/snippets/ellipse.py +33 -0
  720. wx/demo/snippets/fill_and_stroke.py +12 -0
  721. wx/demo/snippets/fill_and_stroke2.py +18 -0
  722. wx/demo/snippets/fill_style.py +31 -0
  723. wx/demo/snippets/glyph_path.py +21 -0
  724. wx/demo/snippets/gradient.py +16 -0
  725. wx/demo/snippets/gradient_mask.py +12 -0
  726. wx/demo/snippets/group.py +16 -0
  727. wx/demo/snippets/image.py +14 -0
  728. wx/demo/snippets/imagepattern.py +23 -0
  729. wx/demo/snippets/path.py +7 -0
  730. wx/demo/snippets/set_line_cap.py +19 -0
  731. wx/demo/snippets/set_line_join.py +21 -0
  732. wx/demo/snippets/show_glyphs.py +15 -0
  733. wx/demo/snippets/text.py +22 -0
  734. wx/demo/snippets/text_align_center.py +26 -0
  735. wx/demo/snippets/text_extents.py +27 -0
  736. wx/demo/template.py +36 -0
  737. wx/demo/throbImages.py +1277 -0
  738. wx/demo/version.py +3 -0
  739. wx/demo/widgetTest.py +72 -0
  740. wx/demo/wxpdemo.ico +0 -0
  741. wx/glcanvas.py +10 -0
  742. wx/glcanvas.pyi +458 -0
  743. wx/grid.py +229 -0
  744. wx/grid.pyi +4959 -0
  745. wx/html.py +35 -0
  746. wx/html.pyi +2965 -0
  747. wx/html2.py +40 -0
  748. wx/html2.pyi +772 -0
  749. wx/lib/CDate.py +202 -0
  750. wx/lib/ClickableHtmlWindow.py +57 -0
  751. wx/lib/__init__.py +0 -0
  752. wx/lib/activex.py +178 -0
  753. wx/lib/activexwrapper.py +153 -0
  754. wx/lib/agw/__init__.py +128 -0
  755. wx/lib/agw/advancedsplash.py +564 -0
  756. wx/lib/agw/aquabutton.py +1127 -0
  757. wx/lib/agw/artmanager.py +2110 -0
  758. wx/lib/agw/aui/__init__.py +295 -0
  759. wx/lib/agw/aui/aui_constants.py +2628 -0
  760. wx/lib/agw/aui/aui_switcherdialog.py +1227 -0
  761. wx/lib/agw/aui/aui_utilities.py +672 -0
  762. wx/lib/agw/aui/auibar.py +4031 -0
  763. wx/lib/agw/aui/auibook.py +6289 -0
  764. wx/lib/agw/aui/dockart.py +1198 -0
  765. wx/lib/agw/aui/framemanager.py +10409 -0
  766. wx/lib/agw/aui/tabart.py +2771 -0
  767. wx/lib/agw/aui/tabmdi.py +679 -0
  768. wx/lib/agw/balloontip.py +1158 -0
  769. wx/lib/agw/buttonpanel.py +2823 -0
  770. wx/lib/agw/cubecolourdialog.py +3529 -0
  771. wx/lib/agw/customtreectrl.py +8963 -0
  772. wx/lib/agw/data/ShortcutEditor_1.png +0 -0
  773. wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
  774. wx/lib/agw/data/ShortcutEditor_2.png +0 -0
  775. wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
  776. wx/lib/agw/data/ShortcutEditor_3.png +0 -0
  777. wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
  778. wx/lib/agw/data/ShortcutEditor_4.png +0 -0
  779. wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
  780. wx/lib/agw/data/default_help_text.html +105 -0
  781. wx/lib/agw/flatmenu.py +7333 -0
  782. wx/lib/agw/flatnotebook.py +6672 -0
  783. wx/lib/agw/floatspin.py +1823 -0
  784. wx/lib/agw/fmcustomizedlg.py +540 -0
  785. wx/lib/agw/fmresources.py +407 -0
  786. wx/lib/agw/foldpanelbar.py +2282 -0
  787. wx/lib/agw/fourwaysplitter.py +1130 -0
  788. wx/lib/agw/genericmessagedialog.py +1549 -0
  789. wx/lib/agw/gradientbutton.py +732 -0
  790. wx/lib/agw/hyperlink.py +664 -0
  791. wx/lib/agw/hypertreelist.py +5374 -0
  792. wx/lib/agw/infobar.py +885 -0
  793. wx/lib/agw/knobctrl.py +945 -0
  794. wx/lib/agw/labelbook.py +3029 -0
  795. wx/lib/agw/multidirdialog.py +615 -0
  796. wx/lib/agw/peakmeter.py +1029 -0
  797. wx/lib/agw/persist/__init__.py +188 -0
  798. wx/lib/agw/persist/persist_constants.py +284 -0
  799. wx/lib/agw/persist/persist_handlers.py +2614 -0
  800. wx/lib/agw/persist/persistencemanager.py +864 -0
  801. wx/lib/agw/piectrl.py +1082 -0
  802. wx/lib/agw/pybusyinfo.py +399 -0
  803. wx/lib/agw/pycollapsiblepane.py +940 -0
  804. wx/lib/agw/pygauge.py +570 -0
  805. wx/lib/agw/pyprogress.py +917 -0
  806. wx/lib/agw/ribbon/__init__.py +198 -0
  807. wx/lib/agw/ribbon/art.py +219 -0
  808. wx/lib/agw/ribbon/art_aui.py +1284 -0
  809. wx/lib/agw/ribbon/art_default.py +81 -0
  810. wx/lib/agw/ribbon/art_internal.py +244 -0
  811. wx/lib/agw/ribbon/art_msw.py +2736 -0
  812. wx/lib/agw/ribbon/art_osx.py +52 -0
  813. wx/lib/agw/ribbon/bar.py +1261 -0
  814. wx/lib/agw/ribbon/buttonbar.py +1320 -0
  815. wx/lib/agw/ribbon/control.py +205 -0
  816. wx/lib/agw/ribbon/gallery.py +974 -0
  817. wx/lib/agw/ribbon/page.py +946 -0
  818. wx/lib/agw/ribbon/panel.py +1170 -0
  819. wx/lib/agw/ribbon/toolbar.py +1442 -0
  820. wx/lib/agw/rulerctrl.py +1887 -0
  821. wx/lib/agw/scrolledthumbnail.py +2119 -0
  822. wx/lib/agw/shapedbutton.py +1809 -0
  823. wx/lib/agw/shortcuteditor.py +2634 -0
  824. wx/lib/agw/speedmeter.py +1801 -0
  825. wx/lib/agw/supertooltip.py +1444 -0
  826. wx/lib/agw/thumbnailctrl.py +529 -0
  827. wx/lib/agw/toasterbox.py +1327 -0
  828. wx/lib/agw/ultimatelistctrl.py +13666 -0
  829. wx/lib/agw/xlsgrid.py +2113 -0
  830. wx/lib/agw/zoombar.py +1339 -0
  831. wx/lib/analogclock/__init__.py +140 -0
  832. wx/lib/analogclock/analogclock.py +631 -0
  833. wx/lib/analogclock/helpers.py +991 -0
  834. wx/lib/analogclock/lib_setup/__init__.py +0 -0
  835. wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
  836. wx/lib/analogclock/lib_setup/fontselect.py +57 -0
  837. wx/lib/analogclock/setup.py +490 -0
  838. wx/lib/analogclock/styles.py +47 -0
  839. wx/lib/anchors.py +103 -0
  840. wx/lib/art/__init__.py +4 -0
  841. wx/lib/art/flagart.py +1583 -0
  842. wx/lib/art/img2pyartprov.py +56 -0
  843. wx/lib/busy.py +146 -0
  844. wx/lib/buttons.py +1141 -0
  845. wx/lib/calendar.py +1597 -0
  846. wx/lib/checkbox.py +837 -0
  847. wx/lib/colourchooser/__init__.py +38 -0
  848. wx/lib/colourchooser/canvas.py +145 -0
  849. wx/lib/colourchooser/intl.py +24 -0
  850. wx/lib/colourchooser/pycolourbox.py +89 -0
  851. wx/lib/colourchooser/pycolourchooser.py +629 -0
  852. wx/lib/colourchooser/pycolourslider.py +100 -0
  853. wx/lib/colourchooser/pypalette.py +211 -0
  854. wx/lib/colourdb.py +740 -0
  855. wx/lib/colourselect.py +385 -0
  856. wx/lib/colourutils.py +118 -0
  857. wx/lib/combotreebox.py +944 -0
  858. wx/lib/delayedresult.py +420 -0
  859. wx/lib/dialogs.py +510 -0
  860. wx/lib/docview.py +3210 -0
  861. wx/lib/dragscroller.py +79 -0
  862. wx/lib/editor/README.txt +77 -0
  863. wx/lib/editor/__init__.py +24 -0
  864. wx/lib/editor/editor.py +974 -0
  865. wx/lib/editor/images.py +15 -0
  866. wx/lib/editor/selection.py +44 -0
  867. wx/lib/embeddedimage.py +76 -0
  868. wx/lib/eventStack.py +136 -0
  869. wx/lib/eventwatcher.py +440 -0
  870. wx/lib/evtmgr.py +521 -0
  871. wx/lib/expando.py +393 -0
  872. wx/lib/fancytext.py +505 -0
  873. wx/lib/filebrowsebutton.py +459 -0
  874. wx/lib/flashwin.py +262 -0
  875. wx/lib/flashwin_old.py +651 -0
  876. wx/lib/floatcanvas/FCEvents.py +53 -0
  877. wx/lib/floatcanvas/FCObjects.py +2923 -0
  878. wx/lib/floatcanvas/FloatCanvas.py +1027 -0
  879. wx/lib/floatcanvas/GUIMode.py +396 -0
  880. wx/lib/floatcanvas/NavCanvas.py +161 -0
  881. wx/lib/floatcanvas/Resources.py +319 -0
  882. wx/lib/floatcanvas/ScreenShot.py +1788 -0
  883. wx/lib/floatcanvas/Utilities/BBox.py +314 -0
  884. wx/lib/floatcanvas/Utilities/Colors.py +137 -0
  885. wx/lib/floatcanvas/Utilities/GUI.py +91 -0
  886. wx/lib/floatcanvas/Utilities/__init__.py +7 -0
  887. wx/lib/floatcanvas/__init__.py +124 -0
  888. wx/lib/foldmenu.py +89 -0
  889. wx/lib/gestures.py +310 -0
  890. wx/lib/gizmos/__init__.py +18 -0
  891. wx/lib/gizmos/dynamicsash.py +1202 -0
  892. wx/lib/gizmos/ledctrl.py +300 -0
  893. wx/lib/gizmos/treelistctrl.py +87 -0
  894. wx/lib/graphics.py +1939 -0
  895. wx/lib/gridmovers.py +511 -0
  896. wx/lib/iewin.py +249 -0
  897. wx/lib/iewin_old.py +894 -0
  898. wx/lib/imagebrowser.py +856 -0
  899. wx/lib/imageutils.py +163 -0
  900. wx/lib/infoframe.py +490 -0
  901. wx/lib/inspection.py +1255 -0
  902. wx/lib/intctrl.py +1001 -0
  903. wx/lib/itemspicker.py +256 -0
  904. wx/lib/langlistctrl.py +480 -0
  905. wx/lib/layoutf.py +271 -0
  906. wx/lib/masked/__init__.py +27 -0
  907. wx/lib/masked/combobox.py +839 -0
  908. wx/lib/masked/ctrl.py +108 -0
  909. wx/lib/masked/ipaddrctrl.py +242 -0
  910. wx/lib/masked/maskededit.py +7279 -0
  911. wx/lib/masked/numctrl.py +2001 -0
  912. wx/lib/masked/textctrl.py +465 -0
  913. wx/lib/masked/timectrl.py +1466 -0
  914. wx/lib/mixins/__init__.py +17 -0
  915. wx/lib/mixins/grid.py +47 -0
  916. wx/lib/mixins/gridlabelrenderer.py +251 -0
  917. wx/lib/mixins/imagelist.py +77 -0
  918. wx/lib/mixins/inspection.py +184 -0
  919. wx/lib/mixins/listctrl.py +894 -0
  920. wx/lib/mixins/rubberband.py +404 -0
  921. wx/lib/mixins/treemixin.py +678 -0
  922. wx/lib/msgpanel.py +95 -0
  923. wx/lib/multisash.py +747 -0
  924. wx/lib/myole4ax.idl +178 -0
  925. wx/lib/myole4ax.tlb +0 -0
  926. wx/lib/newevent.py +229 -0
  927. wx/lib/nvdlg.py +156 -0
  928. wx/lib/ogl/__init__.py +13 -0
  929. wx/lib/ogl/basic.py +3991 -0
  930. wx/lib/ogl/bmpshape.py +87 -0
  931. wx/lib/ogl/canvas.py +467 -0
  932. wx/lib/ogl/composit.py +1577 -0
  933. wx/lib/ogl/diagram.py +230 -0
  934. wx/lib/ogl/divided.py +483 -0
  935. wx/lib/ogl/drawn.py +900 -0
  936. wx/lib/ogl/lines.py +1811 -0
  937. wx/lib/ogl/oglmisc.py +608 -0
  938. wx/lib/pdfviewer/__init__.py +113 -0
  939. wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
  940. wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
  941. wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
  942. wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
  943. wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
  944. wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
  945. wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
  946. wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
  947. wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
  948. wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
  949. wx/lib/pdfviewer/bitmaps/Save.png +0 -0
  950. wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
  951. wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
  952. wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
  953. wx/lib/pdfviewer/buttonpanel.py +279 -0
  954. wx/lib/pdfviewer/images.py +240 -0
  955. wx/lib/pdfviewer/viewer.py +1077 -0
  956. wx/lib/pdfwin.py +295 -0
  957. wx/lib/pdfwin_old.py +789 -0
  958. wx/lib/platebtn.py +789 -0
  959. wx/lib/plot/CHANGELOG.md +150 -0
  960. wx/lib/plot/README.md +16 -0
  961. wx/lib/plot/__init__.py +46 -0
  962. wx/lib/plot/__main__.py +5 -0
  963. wx/lib/plot/examples/__init__.py +0 -0
  964. wx/lib/plot/examples/demo.py +1009 -0
  965. wx/lib/plot/examples/simple_example.py +54 -0
  966. wx/lib/plot/plotcanvas.py +2981 -0
  967. wx/lib/plot/polyobjects.py +1525 -0
  968. wx/lib/plot/utils.py +327 -0
  969. wx/lib/popupctl.py +250 -0
  970. wx/lib/printout.py +1157 -0
  971. wx/lib/progressindicator.py +151 -0
  972. wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
  973. wx/lib/pubsub/README_WxPython.txt +22 -0
  974. wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
  975. wx/lib/pubsub/__init__.py +25 -0
  976. wx/lib/pubsub/core/__init__.py +92 -0
  977. wx/lib/pubsub/core/arg1/__init__.py +16 -0
  978. wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
  979. wx/lib/pubsub/core/arg1/publisher.py +40 -0
  980. wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
  981. wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
  982. wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
  983. wx/lib/pubsub/core/callables.py +191 -0
  984. wx/lib/pubsub/core/imp2.py +63 -0
  985. wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
  986. wx/lib/pubsub/core/kwargs/__init__.py +16 -0
  987. wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
  988. wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
  989. wx/lib/pubsub/core/kwargs/publisher.py +77 -0
  990. wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
  991. wx/lib/pubsub/core/kwargs/topicargspecimpl.py +217 -0
  992. wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
  993. wx/lib/pubsub/core/listener.py +40 -0
  994. wx/lib/pubsub/core/listenerbase.py +185 -0
  995. wx/lib/pubsub/core/notificationmgr.py +185 -0
  996. wx/lib/pubsub/core/publisherbase.py +191 -0
  997. wx/lib/pubsub/core/topicargspec.py +77 -0
  998. wx/lib/pubsub/core/topicdefnprovider.py +632 -0
  999. wx/lib/pubsub/core/topicexc.py +72 -0
  1000. wx/lib/pubsub/core/topicmgr.py +456 -0
  1001. wx/lib/pubsub/core/topicobj.py +472 -0
  1002. wx/lib/pubsub/core/topictreetraverser.py +143 -0
  1003. wx/lib/pubsub/core/topicutils.py +118 -0
  1004. wx/lib/pubsub/core/treeconfig.py +21 -0
  1005. wx/lib/pubsub/core/validatedefnargs.py +29 -0
  1006. wx/lib/pubsub/core/weakmethod.py +102 -0
  1007. wx/lib/pubsub/policies.py +24 -0
  1008. wx/lib/pubsub/pub.py +199 -0
  1009. wx/lib/pubsub/py2and3.py +608 -0
  1010. wx/lib/pubsub/setuparg1.py +47 -0
  1011. wx/lib/pubsub/setupkwargs.py +29 -0
  1012. wx/lib/pubsub/utils/__init__.py +27 -0
  1013. wx/lib/pubsub/utils/exchandling.py +100 -0
  1014. wx/lib/pubsub/utils/misc.py +100 -0
  1015. wx/lib/pubsub/utils/notification.py +331 -0
  1016. wx/lib/pubsub/utils/topictreeprinter.py +195 -0
  1017. wx/lib/pubsub/utils/xmltopicdefnprovider.py +287 -0
  1018. wx/lib/pydocview.py +3300 -0
  1019. wx/lib/rcsizer.py +229 -0
  1020. wx/lib/resizewidget.py +357 -0
  1021. wx/lib/scrolledpanel.py +225 -0
  1022. wx/lib/sheet.py +350 -0
  1023. wx/lib/sized_controls.py +691 -0
  1024. wx/lib/softwareupdate.py +361 -0
  1025. wx/lib/splitter.py +925 -0
  1026. wx/lib/statbmp.py +199 -0
  1027. wx/lib/stattext.py +322 -0
  1028. wx/lib/throbber.py +425 -0
  1029. wx/lib/ticker.py +295 -0
  1030. wx/lib/ticker_xrc.py +48 -0
  1031. wx/lib/utils.py +89 -0
  1032. wx/lib/wordwrap.py +97 -0
  1033. wx/lib/wxcairo/__init__.py +124 -0
  1034. wx/lib/wxcairo/wx_cairocffi.py +200 -0
  1035. wx/lib/wxcairo/wx_pycairo.py +463 -0
  1036. wx/lib/wxpTag.py +274 -0
  1037. wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
  1038. wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
  1039. wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
  1040. wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
  1041. wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
  1042. wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
  1043. wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
  1044. wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
  1045. wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
  1046. wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
  1047. wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
  1048. wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
  1049. wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
  1050. wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
  1051. wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
  1052. wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
  1053. wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
  1054. wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
  1055. wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
  1056. wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
  1057. wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
  1058. wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
  1059. wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
  1060. wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
  1061. wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
  1062. wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
  1063. wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
  1064. wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
  1065. wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
  1066. wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
  1067. wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
  1068. wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
  1069. wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
  1070. wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
  1071. wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
  1072. wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
  1073. wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
  1074. wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
  1075. wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
  1076. wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
  1077. wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
  1078. wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
  1079. wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
  1080. wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
  1081. wx/media.py +27 -0
  1082. wx/media.pyi +223 -0
  1083. wx/msw.py +13 -0
  1084. wx/msw.pyi +65 -0
  1085. wx/propgrid.py +1451 -0
  1086. wx/propgrid.pyi +7914 -0
  1087. wx/py/CHANGES.txt +796 -0
  1088. wx/py/Py.ico +0 -0
  1089. wx/py/PyAlaCarte.py +34 -0
  1090. wx/py/PyAlaMode.py +34 -0
  1091. wx/py/PyAlaModeTest.py +33 -0
  1092. wx/py/PyCrust.ico +0 -0
  1093. wx/py/PyCrust.py +78 -0
  1094. wx/py/PyCrust_16.png +0 -0
  1095. wx/py/PyCrust_32.png +0 -0
  1096. wx/py/PyFilling.py +35 -0
  1097. wx/py/PyShell.py +78 -0
  1098. wx/py/PySlices.ico +0 -0
  1099. wx/py/PySlices.py +98 -0
  1100. wx/py/PySlicesShell.py +94 -0
  1101. wx/py/PySlices_16.png +0 -0
  1102. wx/py/PySlices_32.png +0 -0
  1103. wx/py/PyWrap.py +52 -0
  1104. wx/py/README.txt +77 -0
  1105. wx/py/__init__.py +20 -0
  1106. wx/py/buffer.py +136 -0
  1107. wx/py/crust.py +403 -0
  1108. wx/py/crustslices.py +403 -0
  1109. wx/py/dispatcher.py +259 -0
  1110. wx/py/document.py +37 -0
  1111. wx/py/editor.py +844 -0
  1112. wx/py/editwindow.py +299 -0
  1113. wx/py/filling.py +357 -0
  1114. wx/py/frame.py +978 -0
  1115. wx/py/images.py +212 -0
  1116. wx/py/interpreter.py +170 -0
  1117. wx/py/introspect.py +393 -0
  1118. wx/py/magic.py +98 -0
  1119. wx/py/parse.py +134 -0
  1120. wx/py/path.py +36 -0
  1121. wx/py/pseudo.py +99 -0
  1122. wx/py/shell.py +1588 -0
  1123. wx/py/sliceshell.py +3814 -0
  1124. wx/py/tests/test_interpreter.py +71 -0
  1125. wx/py/tests/test_introspect.py +862 -0
  1126. wx/py/tests/test_pseudo.py +70 -0
  1127. wx/py/tests/test_version.py +36 -0
  1128. wx/py/tests/testall.py +22 -0
  1129. wx/py/version.py +7 -0
  1130. wx/ribbon.py +45 -0
  1131. wx/ribbon.pyi +2494 -0
  1132. wx/richtext.py +142 -0
  1133. wx/richtext.pyi +12113 -0
  1134. wx/siplib.cp313-win_amd64.pyd +0 -0
  1135. wx/stc.py +58 -0
  1136. wx/stc.pyi +8463 -0
  1137. wx/svg/__init__.py +364 -0
  1138. wx/svg/_nanosvg.cp313-win_amd64.pyd +0 -0
  1139. wx/tools/__init__.py +18 -0
  1140. wx/tools/dbg.py +268 -0
  1141. wx/tools/genaxmodule.py +50 -0
  1142. wx/tools/helpviewer.py +92 -0
  1143. wx/tools/img2img.py +85 -0
  1144. wx/tools/img2png.py +54 -0
  1145. wx/tools/img2py.py +309 -0
  1146. wx/tools/img2xpm.py +54 -0
  1147. wx/tools/pywxrc.py +949 -0
  1148. wx/tools/wxget.py +254 -0
  1149. wx/tools/wxget_docs_demo.py +186 -0
  1150. wx/wxbase315u_net_vc140_x64.dll +0 -0
  1151. wx/wxbase315u_vc140_x64.dll +0 -0
  1152. wx/wxbase315u_xml_vc140_x64.dll +0 -0
  1153. wx/wxmsw315u_adv_vc140_x64.dll +0 -0
  1154. wx/wxmsw315u_aui_vc140_x64.dll +0 -0
  1155. wx/wxmsw315u_core_vc140_x64.dll +0 -0
  1156. wx/wxmsw315u_gl_vc140_x64.dll +0 -0
  1157. wx/wxmsw315u_html_vc140_x64.dll +0 -0
  1158. wx/wxmsw315u_media_vc140_x64.dll +0 -0
  1159. wx/wxmsw315u_propgrid_vc140_x64.dll +0 -0
  1160. wx/wxmsw315u_qa_vc140_x64.dll +0 -0
  1161. wx/wxmsw315u_ribbon_vc140_x64.dll +0 -0
  1162. wx/wxmsw315u_richtext_vc140_x64.dll +0 -0
  1163. wx/wxmsw315u_stc_vc140_x64.dll +0 -0
  1164. wx/wxmsw315u_webview_vc140_x64.dll +0 -0
  1165. wx/wxmsw315u_xrc_vc140_x64.dll +0 -0
  1166. wx/xml.py +15 -0
  1167. wx/xml.pyi +575 -0
  1168. wx/xrc.py +65 -0
  1169. wx/xrc.pyi +742 -0
  1170. wxPython_zombie-3.1.5.8.dist-info/LICENSE.txt +950 -0
  1171. wxPython_zombie-3.1.5.8.dist-info/METADATA +107 -0
  1172. wxPython_zombie-3.1.5.8.dist-info/RECORD +1175 -0
  1173. wxPython_zombie-3.1.5.8.dist-info/WHEEL +5 -0
  1174. wxPython_zombie-3.1.5.8.dist-info/entry_points.txt +2 -0
  1175. wxPython_zombie-3.1.5.8.dist-info/top_level.txt +1 -0
wx/lib/ogl/composit.py ADDED
@@ -0,0 +1,1577 @@
1
+ # -*- coding: utf-8 -*-
2
+ #----------------------------------------------------------------------------
3
+ # Name: composit.py
4
+ # Purpose: Composite class
5
+ #
6
+ # Author: Pierre Hjälm (from C++ original by Julian Smart)
7
+ #
8
+ # Created: 2004-05-08
9
+ # Copyright: (c) 2004 Pierre Hjälm - 1998 Julian Smart
10
+ # Licence: wxWindows license
11
+ # Tags: phoenix-port, unittest, py3-port, documented
12
+ # (c) 2021 Zombie
13
+ #----------------------------------------------------------------------------
14
+ """
15
+ The :class:`~lib.ogl.composit.CompositeShape` class.
16
+ """
17
+ import sys
18
+ import wx
19
+
20
+ from .basic import RectangleShape, Shape, ControlPoint
21
+ from .oglmisc import *
22
+
23
+ _objectStartX = 0.0
24
+ _objectStartY = 0.0
25
+
26
+ CONSTRAINT_CENTRED_VERTICALLY = 1
27
+ CONSTRAINT_CENTRED_HORIZONTALLY = 2
28
+ CONSTRAINT_CENTRED_BOTH = 3
29
+ CONSTRAINT_LEFT_OF = 4
30
+ CONSTRAINT_RIGHT_OF = 5
31
+ CONSTRAINT_ABOVE = 6
32
+ CONSTRAINT_BELOW = 7
33
+ CONSTRAINT_ALIGNED_TOP = 8
34
+ CONSTRAINT_ALIGNED_BOTTOM = 9
35
+ CONSTRAINT_ALIGNED_LEFT = 10
36
+ CONSTRAINT_ALIGNED_RIGHT = 11
37
+
38
+ # Like aligned, but with the objects centred on the respective edge
39
+ # of the reference object.
40
+ CONSTRAINT_MIDALIGNED_TOP = 12
41
+ CONSTRAINT_MIDALIGNED_BOTTOM = 13
42
+ CONSTRAINT_MIDALIGNED_LEFT = 14
43
+ CONSTRAINT_MIDALIGNED_RIGHT = 15
44
+
45
+
46
+ class ConstraintType(object):
47
+ """The :class:`ConstraintType` class."""
48
+ def __init__(self, theType, theName, thePhrase):
49
+ """
50
+ Default class constructor.
51
+
52
+ :param `theType`: one of the folowing
53
+ ====================================== ================================
54
+ Constraint type Description
55
+ ====================================== ================================
56
+ `CONSTRAINT_CENTRED_VERTICALLY` Centered vertically
57
+ `CONSTRAINT_CENTRED_HORIZONTALLY` Centered horizontally
58
+ `CONSTRAINT_CENTRED_BOTH` Centered in both directions
59
+ `CONSTRAINT_LEFT_OF` Center left of
60
+ `CONSTRAINT_RIGHT_OF` Center right of
61
+ `CONSTRAINT_ABOVE` Center above
62
+ `CONSTRAINT_BELOW` Center below
63
+ `CONSTRAINT_ALIGNED_TOP` Align top
64
+ `CONSTRAINT_ALIGNED_BOTTOM` Align bottom
65
+ `CONSTRAINT_ALIGNED_LEFT` Align left
66
+ `CONSTRAINT_ALIGNED_RIGHT` Align right
67
+ `CONSTRAINT_MIDALIGNED_TOP` Middle align top
68
+ `CONSTRAINT_MIDALIGNED_BOTTOM` Middle align bottom
69
+ `CONSTRAINT_MIDALIGNED_LEFT` Middle align left
70
+ `CONSTRAINT_MIDALIGNED_RIGHT` Middle align right
71
+ ====================================== ================================
72
+
73
+ :param `theName`: the name for the constraint
74
+ :param `thePhrase`: the descriptive phrase
75
+
76
+ """
77
+ self._type = theType
78
+ self._name = theName
79
+ self._phrase = thePhrase
80
+
81
+
82
+
83
+ ConstraintTypes = [
84
+ [CONSTRAINT_CENTRED_VERTICALLY,
85
+ ConstraintType(CONSTRAINT_CENTRED_VERTICALLY, "Centre vertically", "centred vertically w.r.t.")],
86
+
87
+ [CONSTRAINT_CENTRED_HORIZONTALLY,
88
+ ConstraintType(CONSTRAINT_CENTRED_HORIZONTALLY, "Centre horizontally", "centred horizontally w.r.t.")],
89
+
90
+ [CONSTRAINT_CENTRED_BOTH,
91
+ ConstraintType(CONSTRAINT_CENTRED_BOTH, "Centre", "centred w.r.t.")],
92
+
93
+ [CONSTRAINT_LEFT_OF,
94
+ ConstraintType(CONSTRAINT_LEFT_OF, "Left of", "left of")],
95
+
96
+ [CONSTRAINT_RIGHT_OF,
97
+ ConstraintType(CONSTRAINT_RIGHT_OF, "Right of", "right of")],
98
+
99
+ [CONSTRAINT_ABOVE,
100
+ ConstraintType(CONSTRAINT_ABOVE, "Above", "above")],
101
+
102
+ [CONSTRAINT_BELOW,
103
+ ConstraintType(CONSTRAINT_BELOW, "Below", "below")],
104
+
105
+ # Alignment
106
+ [CONSTRAINT_ALIGNED_TOP,
107
+ ConstraintType(CONSTRAINT_ALIGNED_TOP, "Top-aligned", "aligned to the top of")],
108
+
109
+ [CONSTRAINT_ALIGNED_BOTTOM,
110
+ ConstraintType(CONSTRAINT_ALIGNED_BOTTOM, "Bottom-aligned", "aligned to the bottom of")],
111
+
112
+ [CONSTRAINT_ALIGNED_LEFT,
113
+ ConstraintType(CONSTRAINT_ALIGNED_LEFT, "Left-aligned", "aligned to the left of")],
114
+
115
+ [CONSTRAINT_ALIGNED_RIGHT,
116
+ ConstraintType(CONSTRAINT_ALIGNED_RIGHT, "Right-aligned", "aligned to the right of")],
117
+
118
+ # Mid-alignment
119
+ [CONSTRAINT_MIDALIGNED_TOP,
120
+ ConstraintType(CONSTRAINT_MIDALIGNED_TOP, "Top-midaligned", "centred on the top of")],
121
+
122
+ [CONSTRAINT_MIDALIGNED_BOTTOM,
123
+ ConstraintType(CONSTRAINT_MIDALIGNED_BOTTOM, "Bottom-midaligned", "centred on the bottom of")],
124
+
125
+ [CONSTRAINT_MIDALIGNED_LEFT,
126
+ ConstraintType(CONSTRAINT_MIDALIGNED_LEFT, "Left-midaligned", "centred on the left of")],
127
+
128
+ [CONSTRAINT_MIDALIGNED_RIGHT,
129
+ ConstraintType(CONSTRAINT_MIDALIGNED_RIGHT, "Right-midaligned", "centred on the right of")]
130
+ ]
131
+
132
+
133
+ class Constraint(object):
134
+ """
135
+ The :class:`Constraint` class helps specify how child shapes are laid out
136
+ with respect to siblings and parents.
137
+ """
138
+ def __init__(self, type, constraining, constrained):
139
+ """
140
+ Default class constructor.
141
+
142
+ :param `type`: see :class:`ConstraintType` for valid types
143
+ :param `constraining`: the constraining :class:`Shape`
144
+ :param `constrained`: the constrained :class:`Shape`
145
+
146
+ """
147
+ self._xSpacing = 0.0
148
+ self._ySpacing = 0.0
149
+
150
+ self._constraintType = type
151
+ self._constrainingObject = constraining
152
+
153
+ self._constraintId = 0
154
+ self._constraintName = "noname"
155
+
156
+ self._constrainedObjects = constrained[:]
157
+
158
+ def __repr__(self):
159
+ return "<%s.%s>" % (self.__class__.__module__, self.__class__.__name__)
160
+
161
+ def SetSpacing(self, x, y):
162
+ """
163
+ Sets the horizontal and vertical spacing for the constraint.
164
+
165
+ :param `x`: the x position
166
+ :param `y`: the y position
167
+
168
+ """
169
+ self._xSpacing = x
170
+ self._ySpacing = y
171
+
172
+ def Equals(self, a, b):
173
+ """
174
+ Return `True` if a and b are approximately equal (for the purposes
175
+ of evaluating the constraint).
176
+
177
+ :param `a`: ???
178
+ :param `b`: ???
179
+
180
+ """
181
+ marg = 0.5
182
+
183
+ return b <= a + marg and b >= a - marg
184
+
185
+ def Evaluate(self):
186
+ """Evaluate this constraint and return `True` if anything changed."""
187
+ maxWidth, maxHeight = self._constrainingObject.GetBoundingBoxMax()
188
+ minWidth, minHeight = self._constrainingObject.GetBoundingBoxMin()
189
+ x = self._constrainingObject.GetX()
190
+ y = self._constrainingObject.GetY()
191
+
192
+ dc = wx.MemoryDC()
193
+ dc.SelectObject(self._constrainingObject.GetCanvas().GetBuffer())
194
+ self._constrainingObject.GetCanvas().PrepareDC(dc)
195
+
196
+ if self._constraintType == CONSTRAINT_CENTRED_VERTICALLY:
197
+ n = len(self._constrainedObjects)
198
+ totalObjectHeight = 0.0
199
+ for constrainedObject in self._constrainedObjects:
200
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
201
+ totalObjectHeight += height2
202
+
203
+ # Check if within the constraining object...
204
+ if totalObjectHeight + (n + 1) * self._ySpacing <= minHeight:
205
+ spacingY = (minHeight - totalObjectHeight) / (n + 1.0)
206
+ startY = y - minHeight / 2.0
207
+ else: # Otherwise, use default spacing
208
+ spacingY = self._ySpacing
209
+ startY = y - (totalObjectHeight + (n + 1) * spacingY) / 2.0
210
+
211
+ # Now position the objects
212
+ changed = False
213
+ for constrainedObject in self._constrainedObjects:
214
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
215
+ startY += spacingY + height2 / 2.0
216
+ if not self.Equals(startY, constrainedObject.GetY()):
217
+ constrainedObject.Move(dc, constrainedObject.GetX(), startY, False)
218
+ changed = True
219
+ startY += height2 / 2.0
220
+ return changed
221
+ elif self._constraintType == CONSTRAINT_CENTRED_HORIZONTALLY:
222
+ n = len(self._constrainedObjects)
223
+ totalObjectWidth = 0.0
224
+ for constrainedObject in self._constrainedObjects:
225
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
226
+ totalObjectWidth += width2
227
+
228
+ # Check if within the constraining object...
229
+ if totalObjectWidth + (n + 1) * self._xSpacing <= minWidth:
230
+ spacingX = (minWidth - totalObjectWidth) / (n + 1.0)
231
+ startX = x - minWidth / 2.0
232
+ else: # Otherwise, use default spacing
233
+ spacingX = self._xSpacing
234
+ startX = x - (totalObjectWidth + (n + 1) * spacingX) / 2.0
235
+
236
+ # Now position the objects
237
+ changed = False
238
+ for constrainedObject in self._constrainedObjects:
239
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
240
+ startX += spacingX + width2 / 2.0
241
+ if not self.Equals(startX, constrainedObject.GetX()):
242
+ constrainedObject.Move(dc, startX, constrainedObject.GetY(), False)
243
+ changed = True
244
+ startX += width2 / 2.0
245
+ return changed
246
+ elif self._constraintType == CONSTRAINT_CENTRED_BOTH:
247
+ n = len(self._constrainedObjects)
248
+ totalObjectWidth = 0.0
249
+ totalObjectHeight = 0.0
250
+
251
+ for constrainedObject in self._constrainedObjects:
252
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
253
+ totalObjectWidth += width2
254
+ totalObjectHeight += height2
255
+
256
+ # Check if within the constraining object...
257
+ if totalObjectHeight + (n + 1) * self._xSpacing <= minWidth:
258
+ spacingX = (minWidth - totalObjectWidth) / (n + 1.0)
259
+ startX = x - minWidth / 2.0
260
+ else: # Otherwise, use default spacing
261
+ spacingX = self._xSpacing
262
+ startX = x - (totalObjectWidth + (n + 1) * spacingX) / 2.0
263
+
264
+ # Check if within the constraining object...
265
+ if totalObjectHeight + (n + 1) * self._ySpacing <= minHeight:
266
+ spacingY = (minHeight - totalObjectHeight) / (n + 1.0)
267
+ startY = y - minHeight / 2.0
268
+ else: # Otherwise, use default spacing
269
+ spacingY = self._ySpacing
270
+ startY = y - (totalObjectHeight + (n + 1) * spacingY) / 2.0
271
+
272
+ # Now position the objects
273
+ changed = False
274
+ for constrainedObject in self._constrainedObjects:
275
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
276
+ startX += spacingX + width2 / 2.0
277
+ startY += spacingY + height2 / 2.0
278
+
279
+ if not self.Equals(startX, constrainedObject.GetX()) or not self.Equals(startY, constrainedObject.GetY()):
280
+ constrainedObject.Move(dc, startX, startY, False)
281
+ changed = True
282
+
283
+ startX += width2 / 2.0
284
+ startY += height2 / 2.0
285
+ return changed
286
+ elif self._constraintType == CONSTRAINT_LEFT_OF:
287
+ changed = False
288
+ for constrainedObject in self._constrainedObjects:
289
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
290
+
291
+ x3 = x - minWidth / 2.0 - width2 / 2.0 - self._xSpacing
292
+ if not self.Equals(x3, constrainedObject.GetX()):
293
+ changed = True
294
+ constrainedObject.Move(dc, x3, constrainedObject.GetY(), False)
295
+ return changed
296
+ elif self._constraintType == CONSTRAINT_RIGHT_OF:
297
+ changed = False
298
+
299
+ for constrainedObject in self._constrainedObjects:
300
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
301
+ x3 = x + minWidth / 2.0 + width2 / 2.0 + self._xSpacing
302
+ if not self.Equals(x3, constrainedObject.GetX()):
303
+ constrainedObject.Move(dc, x3, constrainedObject.GetY(), False)
304
+ changed = True
305
+ return changed
306
+ elif self._constraintType == CONSTRAINT_ABOVE:
307
+ changed = False
308
+
309
+ for constrainedObject in self._constrainedObjects:
310
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
311
+
312
+ y3 = y - minHeight / 2.0 - height2 / 2.0 - self._ySpacing
313
+ if not self.Equals(y3, constrainedObject.GetY()):
314
+ changed = True
315
+ constrainedObject.Move(dc, constrainedObject.GetX(), y3, False)
316
+ return changed
317
+ elif self._constraintType == CONSTRAINT_BELOW:
318
+ changed = False
319
+
320
+ for constrainedObject in self._constrainedObjects:
321
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
322
+
323
+ y3 = y + minHeight / 2.0 + height2 / 2.0 + self._ySpacing
324
+ if not self.Equals(y3, constrainedObject.GetY()):
325
+ changed = True
326
+ constrainedObject.Move(dc, constrainedObject.GetX(), y3, False)
327
+ return changed
328
+ elif self._constraintType == CONSTRAINT_ALIGNED_LEFT:
329
+ changed = False
330
+ for constrainedObject in self._constrainedObjects:
331
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
332
+ x3 = x - minWidth / 2.0 + width2 / 2.0 + self._xSpacing
333
+ if not self.Equals(x3, constrainedObject.GetX()):
334
+ changed = True
335
+ constrainedObject.Move(dc, x3, constrainedObject.GetY(), False)
336
+ return changed
337
+ elif self._constraintType == CONSTRAINT_ALIGNED_RIGHT:
338
+ changed = False
339
+ for constrainedObject in self._constrainedObjects:
340
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
341
+ x3 = x + minWidth / 2.0 - width2 / 2.0 - self._xSpacing
342
+ if not self.Equals(x3, constrainedObject.GetX()):
343
+ changed = True
344
+ constrainedObject.Move(dc, x3, constrainedObject.GetY(), False)
345
+ return changed
346
+ elif self._constraintType == CONSTRAINT_ALIGNED_TOP:
347
+ changed = False
348
+ for constrainedObject in self._constrainedObjects:
349
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
350
+ y3 = y - minHeight / 2.0 + height2 / 2.0 + self._ySpacing
351
+ if not self.Equals(y3, constrainedObject.GetY()):
352
+ changed = True
353
+ constrainedObject.Move(dc, constrainedObject.GetX(), y3, False)
354
+ return changed
355
+ elif self._constraintType == CONSTRAINT_ALIGNED_BOTTOM:
356
+ changed = False
357
+ for constrainedObject in self._constrainedObjects:
358
+ width2, height2 = constrainedObject.GetBoundingBoxMax()
359
+ y3 = y + minHeight / 2.0 - height2 / 2.0 - self._ySpacing
360
+ if not self.Equals(y3, constrainedObject.GetY()):
361
+ changed = True
362
+ constrainedObject.Move(dc, constrainedObject.GetX(), y3, False)
363
+ return changed
364
+ elif self._constraintType == CONSTRAINT_MIDALIGNED_LEFT:
365
+ changed = False
366
+ for constrainedObject in self._constrainedObjects:
367
+ x3 = x - minWidth / 2.0
368
+ if not self.Equals(x3, constrainedObject.GetX()):
369
+ changed = True
370
+ constrainedObject.Move(dc, x3, constrainedObject.GetY(), False)
371
+ return changed
372
+ elif self._constraintType == CONSTRAINT_MIDALIGNED_RIGHT:
373
+ changed = False
374
+ for constrainedObject in self._constrainedObjects:
375
+ x3 = x + minWidth / 2.0
376
+ if not self.Equals(x3, constrainedObject.GetX()):
377
+ changed = True
378
+ constrainedObject.Move(dc, x3, constrainedObject.GetY(), False)
379
+ return changed
380
+ elif self._constraintType == CONSTRAINT_MIDALIGNED_TOP:
381
+ changed = False
382
+ for constrainedObject in self._constrainedObjects:
383
+ y3 = y - minHeight / 2.0
384
+ if not self.Equals(y3, constrainedObject.GetY()):
385
+ changed = True
386
+ constrainedObject.Move(dc, constrainedObject.GetX(), y3, False)
387
+ return changed
388
+ elif self._constraintType == CONSTRAINT_MIDALIGNED_BOTTOM:
389
+ changed = False
390
+ for constrainedObject in self._constrainedObjects:
391
+ y3 = y + minHeight / 2.0
392
+ if not self.Equals(y3, constrainedObject.GetY()):
393
+ changed = True
394
+ constrainedObject.Move(dc, constrainedObject.GetX(), y3, False)
395
+ return changed
396
+
397
+ return False
398
+
399
+ OGLConstraint = wx.deprecated(Constraint,
400
+ "The OGLConstraint name is deprecated, use `ogl.Constraint` instead.")
401
+
402
+
403
+ class CompositeShape(RectangleShape):
404
+ """
405
+ The :class:`CompositeShape` is a shape with a list of child objects, and a
406
+ list of size and positioning constraints between the children.
407
+ """
408
+ def __init__(self):
409
+ """
410
+ Default class constructor.
411
+
412
+ """
413
+ RectangleShape.__init__(self, 100.0, 100.0)
414
+
415
+ self._oldX = self._xpos
416
+ self._oldY = self._ypos
417
+
418
+ self._constraints = []
419
+ self._divisions = [] # In case it's a container
420
+
421
+ def OnDraw(self, dc):
422
+ """The draw handler."""
423
+ x1 = self._xpos - self._width / 2.0
424
+ y1 = self._ypos - self._height / 2.0
425
+
426
+ if self._shadowMode != SHADOW_NONE:
427
+ if self._shadowBrush:
428
+ dc.SetBrush(self._shadowBrush)
429
+ dc.SetPen(wx.Pen(wx.WHITE, 1, wx.PENSTYLE_TRANSPARENT))
430
+
431
+ if self._cornerRadius:
432
+ dc.DrawRoundedRectangle(x1 + self._shadowOffsetX, y1 + self._shadowOffsetY, self._width, self._height, self._cornerRadius)
433
+ else:
434
+ dc.DrawRectangle(x1 + self._shadowOffsetX, y1 + self._shadowOffsetY, self._width, self._height)
435
+
436
+ # For debug purposes /pi
437
+ #dc.DrawRectangle(x1, y1, self._width, self._height)
438
+
439
+ def OnDrawContents(self, dc):
440
+ """The draw contents handler."""
441
+ for object in self._children:
442
+ object.Draw(dc)
443
+ object.DrawLinks(dc)
444
+
445
+ Shape.OnDrawContents(self, dc)
446
+
447
+ def OnMovePre(self, dc, x, y, old_x, old_y, display = True):
448
+ """The move 'pre' handler."""
449
+ diffX = x - old_x
450
+ diffY = y - old_y
451
+
452
+ for object in self._children:
453
+ object.Erase(dc)
454
+ object.Move(dc, object.GetX() + diffX, object.GetY() + diffY, display)
455
+
456
+ return True
457
+
458
+ def OnErase(self, dc):
459
+ """The erase handler."""
460
+ RectangleShape.OnErase(self, dc)
461
+ for object in self._children:
462
+ object.Erase(dc)
463
+
464
+ def OnDragLeft(self, draw, x, y, keys = 0, attachment = 0):
465
+ """The drag left handler."""
466
+ xx, yy = self._canvas.Snap(x, y)
467
+ offsetX = xx - _objectStartX
468
+ offsetY = yy - _objectStartY
469
+
470
+ dc = wx.ClientDC(self.GetCanvas())
471
+ self.GetCanvas().PrepareDC(dc)
472
+ dc.SetLogicalFunction(OGLRBLF)
473
+
474
+ dottedPen = wx.Pen(wx.BLACK, 1, wx.PENSTYLE_DOT)
475
+ dc.SetPen(dottedPen)
476
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
477
+
478
+ self.GetEventHandler().OnDrawOutline(dc, self.GetX() + offsetX, self.GetY() + offsetY, self.GetWidth(), self.GetHeight())
479
+
480
+ def OnBeginDragLeft(self, x, y, keys = 0, attachment = 0):
481
+ """The begin drag left handler."""
482
+ global _objectStartX, _objectStartY
483
+
484
+ _objectStartX = x
485
+ _objectStartY = y
486
+
487
+ dc = wx.ClientDC(self.GetCanvas())
488
+ self.GetCanvas().PrepareDC(dc)
489
+ dc.SetLogicalFunction(OGLRBLF)
490
+
491
+ dottedPen = wx.Pen(wx.BLACK, 1, wx.PENSTYLE_DOT)
492
+ dc.SetPen(dottedPen)
493
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
494
+ self._canvas.CaptureMouse()
495
+
496
+ xx, yy = self._canvas.Snap(x, y)
497
+ offsetX = xx - _objectStartX
498
+ offsetY = yy - _objectStartY
499
+
500
+ self.GetEventHandler().OnDrawOutline(dc, self.GetX() + offsetX, self.GetY() + offsetY, self.GetWidth(), self.GetHeight())
501
+
502
+ def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
503
+ """The end drag left handler."""
504
+ if self._canvas.HasCapture():
505
+ self._canvas.ReleaseMouse()
506
+
507
+ if not self._draggable:
508
+ if self._parent:
509
+ self._parent.GetEventHandler().OnEndDragLeft(x, y, keys, 0)
510
+ return
511
+
512
+ dc = wx.ClientDC(self.GetCanvas())
513
+ self.GetCanvas().PrepareDC(dc)
514
+ dc.SetLogicalFunction(wx.COPY)
515
+
516
+ self.Erase(dc)
517
+
518
+ xx, yy = self._canvas.Snap(x, y)
519
+ offsetX = xx - _objectStartX
520
+ offsetY = yy - _objectStartY
521
+
522
+ self.Move(dc, self.GetX() + offsetX, self.GetY() + offsetY)
523
+
524
+ if self._canvas and not self._canvas.GetQuickEditMode():
525
+ self._canvas.Redraw(dc)
526
+
527
+ def OnRightClick(self, x, y, keys = 0, attachment = 0):
528
+ """The right click handler.
529
+
530
+ :note: If we get a ctrl-right click, this means send the message to
531
+ the division, so we can invoke a user interface for dealing
532
+ with regions.
533
+ """
534
+ if keys & KEY_CTRL:
535
+ for division in self._divisions:
536
+ hit = division.HitTest(x, y)
537
+ if hit:
538
+ division.GetEventHandler().OnRightClick(x, y, keys, hit[0])
539
+ break
540
+
541
+ def SetSize(self, w, h, recursive = True):
542
+ """
543
+ Set the size.
544
+
545
+ :param `w`: the width
546
+ :param `h`: the heigth
547
+ :param `recursive`: size the children recursively
548
+
549
+ """
550
+ self.SetAttachmentSize(w, h)
551
+
552
+ xScale = float(w) / max(1, self.GetWidth())
553
+ yScale = float(h) / max(1, self.GetHeight())
554
+
555
+ self._width = w
556
+ self._height = h
557
+
558
+ if not recursive:
559
+ return
560
+
561
+ dc = wx.MemoryDC()
562
+ dc.SelectObject(self.GetCanvas().GetBuffer())
563
+ self.GetCanvas().PrepareDC(dc)
564
+
565
+ for object in self._children:
566
+ # Scale the position first
567
+ newX = (object.GetX() - self.GetX()) * xScale + self.GetX()
568
+ newY = (object.GetY() - self.GetY()) * yScale + self.GetY()
569
+ object.Show(False)
570
+ object.Move(dc, newX, newY)
571
+ object.Show(True)
572
+
573
+ # Now set the scaled size
574
+ xbound, ybound = object.GetBoundingBoxMax()
575
+ if not object.GetFixedWidth():
576
+ xbound *= xScale
577
+ if not object.GetFixedHeight():
578
+ ybound *= yScale
579
+ object.SetSize(xbound, ybound)
580
+
581
+ self.SetDefaultRegionSize()
582
+
583
+ def AddChild(self, child, addAfter = None):
584
+ """
585
+ Add a shape to the composite. If addAfter is not None, the shape
586
+ will be added after addAfter.
587
+
588
+ :param `child`: an instance of :class:`~lib.ogl.Shape`
589
+ :param `addAfter`: an instance of :class:`~lib.ogl.Shape`
590
+
591
+ """
592
+ self._children.append(child)
593
+ child.SetParent(self)
594
+ if self._canvas:
595
+ # Ensure we add at the right position
596
+ if addAfter:
597
+ child.RemoveFromCanvas(self._canvas)
598
+ child.AddToCanvas(self._canvas, addAfter)
599
+
600
+ def RemoveChild(self, child):
601
+ """
602
+ Removes the child from the composite and any constraint
603
+ relationships, but does not delete the child.
604
+
605
+ :param `child`: an instance of :class:`~lib.ogl.Shape`
606
+
607
+ """
608
+ if child in self._children:
609
+ self._children.remove(child)
610
+ if child in self._divisions:
611
+ self._divisions.remove(child)
612
+ self.RemoveChildFromConstraints(child)
613
+ child.SetParent(None)
614
+
615
+ def Delete(self):
616
+ """
617
+ Fully disconnect this shape from parents, children, the
618
+ canvas, etc.
619
+ """
620
+ for child in self.GetChildren():
621
+ self.RemoveChild(child)
622
+ child.Delete()
623
+ RectangleShape.Delete(self)
624
+ self._constraints = []
625
+ self._divisions = []
626
+
627
+ def DeleteConstraintsInvolvingChild(self, child):
628
+ """
629
+ This function deletes constraints which mention the given child.
630
+
631
+ Used when deleting a child from the composite.
632
+
633
+ :param `child`: an instance of :class:`~lib.ogl.Shape`
634
+
635
+ """
636
+ for constraint in self._constraints:
637
+ if constraint._constrainingObject == child or child in constraint._constrainedObjects:
638
+ self._constraints.remove(constraint)
639
+
640
+ def RemoveChildFromConstraints(self, child):
641
+ """
642
+ Removes the child from the constraints.
643
+
644
+ :param `child`: an instance of :class:`~lib.ogl.Shape`
645
+
646
+ """
647
+
648
+ for constraint in self._constraints:
649
+ if child in constraint._constrainedObjects:
650
+ constraint._constrainedObjects.remove(child)
651
+ if constraint._constrainingObject == child:
652
+ constraint._constrainingObject = None
653
+
654
+ # Delete the constraint if no participants left
655
+ if not constraint._constrainingObject:
656
+ self._constraints.remove(constraint)
657
+
658
+ def AddConstraint(self, constraint):
659
+ """
660
+ Adds a constraint to the composite.
661
+
662
+ :param `constraint`: an instance of :class:`~lib.ogl.Shape`
663
+
664
+ """
665
+ self._constraints.append(constraint)
666
+ if constraint._constraintId == 0:
667
+ constraint._constraintId = wx.NewIdRef()
668
+ return constraint
669
+
670
+ def AddSimpleConstraint(self, type, constraining, constrained):
671
+ """
672
+ Add a constraint of the given type to the composite.
673
+
674
+ :param `type`: see :class:`ConstraintType` for valid types
675
+ :param `constraining`: the constraining :class:`Shape`
676
+ :param `constrained`: the constrained :class:`Shape`
677
+
678
+ """
679
+ constraint = Constraint(type, constraining, constrained)
680
+ if constraint._constraintId == 0:
681
+ constraint._constraintId = wx.NewIdRef()
682
+ self._constraints.append(constraint)
683
+ return constraint
684
+
685
+ def FindConstraint(self, cId):
686
+ """
687
+ Finds the constraint with the given id.
688
+
689
+ :param `cId`: The constraint id to find.
690
+
691
+ :returns: None or a tuple of the constraint and the actual composite the
692
+ constraint was in, in case that composite was a descendant of
693
+ this composit.
694
+
695
+ """
696
+ for constraint in self._constraints:
697
+ if constraint._constraintId == cId:
698
+ return constraint, self
699
+
700
+ # If not found, try children
701
+ for child in self._children:
702
+ if isinstance(child, CompositeShape):
703
+ constraint = child.FindConstraint(cId)
704
+ if constraint:
705
+ return constraint[0], child
706
+
707
+ return None
708
+
709
+ def DeleteConstraint(self, constraint):
710
+ """
711
+ Deletes constraint from composite.
712
+
713
+ :param `constraint`: the constraint to delete
714
+
715
+ """
716
+ self._constraints.remove(constraint)
717
+
718
+ def CalculateSize(self):
719
+ """
720
+ Calculates the size and position of the composite based on
721
+ child sizes and positions.
722
+
723
+ """
724
+ maxX = -999999.9
725
+ maxY = -999999.9
726
+ minX = 999999.9
727
+ minY = 999999.9
728
+
729
+ for child in self._children:
730
+ # Recalculate size of composite objects because may not conform
731
+ # to size it was set to - depends on the children.
732
+ if isinstance(child, CompositeShape):
733
+ child.CalculateSize()
734
+
735
+ w, h = child.GetBoundingBoxMax()
736
+ if child.GetX() + w / 2.0 > maxX:
737
+ maxX = child.GetX() + w / 2.0
738
+ if child.GetX() - w / 2.0 < minX:
739
+ minX = child.GetX() - w / 2.0
740
+ if child.GetY() + h / 2.0 > maxY:
741
+ maxY = child.GetY() + h / 2.0
742
+ if child.GetY() - h / 2.0 < minY:
743
+ minY = child.GetY() - h / 2.0
744
+
745
+ self._width = maxX - minX
746
+ self._height = maxY - minY
747
+ self._xpos = self._width / 2.0 + minX
748
+ self._ypos = self._height / 2.0 + minY
749
+
750
+ def Recompute(self):
751
+ """
752
+ Recomputes any constraints associated with the object. If `False` is
753
+ returned, the constraints could not be satisfied (there was an
754
+ inconsistency).
755
+
756
+ """
757
+ noIterations = 0
758
+ changed = True
759
+ while changed and noIterations < 500:
760
+ changed = self.Constrain()
761
+ noIterations += 1
762
+
763
+ return not changed
764
+
765
+ def Constrain(self):
766
+ """
767
+ Constrain the children.
768
+
769
+ :returns: True if constained otherwise False
770
+
771
+ """
772
+ self.CalculateSize()
773
+
774
+ changed = False
775
+ for child in self._children:
776
+ if isinstance(child, CompositeShape) and child.Constrain():
777
+ changed = True
778
+
779
+ for constraint in self._constraints:
780
+ if constraint.Evaluate():
781
+ changed = True
782
+
783
+ return changed
784
+
785
+ def MakeContainer(self):
786
+ """
787
+ Makes this composite into a container by creating one child
788
+ DivisionShape.
789
+ """
790
+ division = self.OnCreateDivision()
791
+ self._divisions.append(division)
792
+ self.AddChild(division)
793
+
794
+ division.SetSize(self._width, self._height)
795
+
796
+ dc = wx.MemoryDC()
797
+ dc.SelectObject(self.GetCanvas().GetBuffer())
798
+ self.GetCanvas().PrepareDC(dc)
799
+
800
+ division.Move(dc, self.GetX(), self.GetY())
801
+ self.Recompute()
802
+ division.Show(True)
803
+
804
+ def OnCreateDivision(self):
805
+ """Create division handler."""
806
+ return DivisionShape()
807
+
808
+ def FindContainerImage(self):
809
+ """
810
+ Finds the image used to visualize a container. This is any child of
811
+ the composite that is not in the divisions list.
812
+
813
+ """
814
+ for child in self._children:
815
+ if child in self._divisions:
816
+ return child
817
+
818
+ return None
819
+
820
+ def ContainsDivision(self, division):
821
+ """
822
+ Check if division is descendant.
823
+
824
+ :param `division`: divison to check
825
+ :returns: `True` if division is a descendant of this container.
826
+
827
+ """
828
+ if division in self._divisions:
829
+ return True
830
+
831
+ for child in self._children:
832
+ if isinstance(child, CompositeShape):
833
+ return child.ContainsDivision(division)
834
+
835
+ return False
836
+
837
+ def GetDivisions(self):
838
+ """Return the list of divisions."""
839
+ return self._divisions
840
+
841
+ def GetConstraints(self):
842
+ """Return the list of constraints."""
843
+ return self._constraints
844
+
845
+
846
+ DIVISION_SIDE_NONE =0
847
+ DIVISION_SIDE_LEFT =1
848
+ DIVISION_SIDE_TOP =2
849
+ DIVISION_SIDE_RIGHT =3
850
+ DIVISION_SIDE_BOTTOM =4
851
+
852
+ originalX = 0.0
853
+ originalY = 0.0
854
+ originalW = 0.0
855
+ originalH = 0.0
856
+
857
+
858
+
859
+ class DivisionControlPoint(ControlPoint):
860
+ def __init__(self, the_canvas, object, size, the_xoffset, the_yoffset, the_type):
861
+ ControlPoint.__init__(self, the_canvas, object, size, the_xoffset, the_yoffset, the_type)
862
+ self.SetEraseObject(False)
863
+
864
+ # Implement resizing of canvas object
865
+ def OnDragLeft(self, draw, x, y, keys = 0, attachment = 0):
866
+ ControlPoint.OnDragLeft(self, draw, x, y, keys, attachment)
867
+
868
+ def OnBeginDragLeft(self, x, y, keys = 0, attachment = 0):
869
+ global originalX, originalY, originalW, originalH
870
+
871
+ originalX = self._shape.GetX()
872
+ originalY = self._shape.GetY()
873
+ originalW = self._shape.GetWidth()
874
+ originalH = self._shape.GetHeight()
875
+
876
+ ControlPoint.OnBeginDragLeft(self, x, y, keys, attachment)
877
+
878
+ def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
879
+ ControlPoint.OnEndDragLeft(self, x, y, keys, attachment)
880
+
881
+ dc = wx.MemoryDC()
882
+ dc.SelectObject(self.GetCanvas().GetBuffer())
883
+ self.GetCanvas().PrepareDC(dc)
884
+
885
+ division = self._shape
886
+ divisionParent = division.GetParent()
887
+
888
+ # Need to check it's within the bounds of the parent composite
889
+ x1 = divisionParent.GetX() - divisionParent.GetWidth() / 2.0
890
+ y1 = divisionParent.GetY() - divisionParent.GetHeight() / 2.0
891
+ x2 = divisionParent.GetX() + divisionParent.GetWidth() / 2.0
892
+ y2 = divisionParent.GetY() + divisionParent.GetHeight() / 2.0
893
+
894
+ # Need to check it has not made the division zero or negative
895
+ # width / height
896
+ dx1 = division.GetX() - division.GetWidth() / 2.0
897
+ dy1 = division.GetY() - division.GetHeight() / 2.0
898
+ dx2 = division.GetX() + division.GetWidth() / 2.0
899
+ dy2 = division.GetY() + division.GetHeight() / 2.0
900
+
901
+ success = True
902
+ if division.GetHandleSide() == DIVISION_SIDE_LEFT:
903
+ if x <= x1 or x >= x2 or x >= dx2:
904
+ success = False
905
+ # Try it out first...
906
+ elif not division.ResizeAdjoining(DIVISION_SIDE_LEFT, x, True):
907
+ success = False
908
+ else:
909
+ division.ResizeAdjoining(DIVISION_SIDE_LEFT, x, False)
910
+ elif division.GetHandleSide() == DIVISION_SIDE_TOP:
911
+ if y <= y1 or y >= y2 or y >= dy2:
912
+ success = False
913
+ elif not division.ResizeAdjoining(DIVISION_SIDE_TOP, y, True):
914
+ success = False
915
+ else:
916
+ division.ResizingAdjoining(DIVISION_SIDE_TOP, y, False)
917
+ elif division.GetHandleSide() == DIVISION_SIDE_RIGHT:
918
+ if x <= x1 or x >= x2 or x <= dx1:
919
+ success = False
920
+ elif not division.ResizeAdjoining(DIVISION_SIDE_RIGHT, x, True):
921
+ success = False
922
+ else:
923
+ division.ResizeAdjoining(DIVISION_SIDE_RIGHT, x, False)
924
+ elif division.GetHandleSide() == DIVISION_SIDE_BOTTOM:
925
+ if y <= y1 or y >= y2 or y <= dy1:
926
+ success = False
927
+ elif not division.ResizeAdjoining(DIVISION_SIDE_BOTTOM, y, True):
928
+ success = False
929
+ else:
930
+ division.ResizeAdjoining(DIVISION_SIDE_BOTTOM, y, False)
931
+
932
+ if not success:
933
+ division.SetSize(originalW, originalH)
934
+ division.Move(dc, originalX, originalY)
935
+
936
+ divisionParent.Draw(dc)
937
+ division.GetEventHandler().OnDrawControlPoints(dc)
938
+
939
+
940
+
941
+ DIVISION_MENU_SPLIT_HORIZONTALLY =1
942
+ DIVISION_MENU_SPLIT_VERTICALLY =2
943
+ DIVISION_MENU_EDIT_LEFT_EDGE =3
944
+ DIVISION_MENU_EDIT_TOP_EDGE =4
945
+ DIVISION_MENU_EDIT_RIGHT_EDGE =5
946
+ DIVISION_MENU_EDIT_BOTTOM_EDGE =6
947
+ DIVISION_MENU_DELETE_ALL =7
948
+
949
+
950
+
951
+ class PopupDivisionMenu(wx.Menu):
952
+ def __init__(self):
953
+ wx.Menu.__init__(self)
954
+ self.Append(DIVISION_MENU_SPLIT_HORIZONTALLY,"Split horizontally")
955
+ self.Append(DIVISION_MENU_SPLIT_VERTICALLY,"Split vertically")
956
+ self.AppendSeparator()
957
+ self.Append(DIVISION_MENU_EDIT_LEFT_EDGE,"Edit left edge")
958
+ self.Append(DIVISION_MENU_EDIT_TOP_EDGE,"Edit top edge")
959
+
960
+ wx.EVT_MENU_RANGE(self, DIVISION_MENU_SPLIT_HORIZONTALLY, DIVISION_MENU_EDIT_BOTTOM_EDGE, self.OnMenu)
961
+
962
+ def SetClientData(self, data):
963
+ self._clientData = data
964
+
965
+ def GetClientData(self):
966
+ return self._clientData
967
+
968
+ def OnMenu(self, event):
969
+ division = self.GetClientData()
970
+ if event.GetId() == DIVISION_MENU_SPLIT_HORIZONTALLY:
971
+ division.Divide(wx.HORIZONTAL)
972
+ elif event.GetId() == DIVISION_MENU_SPLIT_VERTICALLY:
973
+ division.Divide(wx.VERTICAL)
974
+ elif event.GetId() == DIVISION_MENU_EDIT_LEFT_EDGE:
975
+ division.EditEdge(DIVISION_SIDE_LEFT)
976
+ elif event.GetId() == DIVISION_MENU_EDIT_TOP_EDGE:
977
+ division.EditEdge(DIVISION_SIDE_TOP)
978
+
979
+
980
+
981
+ class DivisionShape(CompositeShape):
982
+ """
983
+ A :class:`DivisionShape` class is a composite with special properties,
984
+ to be used for containment. It's a subdivision of a container.
985
+ A containing node image consists of a composite with a main child shape
986
+ such as rounded rectangle, plus a list of division objects.
987
+ It needs to be a composite because a division contains pieces
988
+ of diagram.
989
+
990
+ :note: A container has at least one wxDivisionShape for consistency.
991
+ This can be subdivided, so it turns into two objects, then each of
992
+ these can be subdivided, etc.
993
+
994
+ """
995
+ def __init__(self):
996
+ """
997
+ Default class constructor.
998
+ """
999
+ CompositeShape.__init__(self)
1000
+ self.SetSensitivityFilter(OP_CLICK_LEFT | OP_CLICK_RIGHT | OP_DRAG_RIGHT)
1001
+ self.SetCentreResize(False)
1002
+ self.SetAttachmentMode(True)
1003
+ self._leftSide = None
1004
+ self._rightSide = None
1005
+ self._topSide = None
1006
+ self._bottomSide = None
1007
+ self._handleSide = DIVISION_SIDE_NONE
1008
+ self._leftSidePen = wx.BLACK_PEN
1009
+ self._topSidePen = wx.BLACK_PEN
1010
+ self._leftSideColour = "BLACK"
1011
+ self._topSideColour = "BLACK"
1012
+ self._leftSideStyle = "Solid"
1013
+ self._topSideStyle = "Solid"
1014
+ self.ClearRegions()
1015
+
1016
+ def SetLeftSide(self, shape):
1017
+ """Set the the division on the left side of this division."""
1018
+ self._leftSide = shape
1019
+
1020
+ def SetTopSide(self, shape):
1021
+ """Set the the division on the top side of this division."""
1022
+ self._topSide = shape
1023
+
1024
+ def SetRightSide(self, shape):
1025
+ """Set the the division on the right side of this division."""
1026
+ self._rightSide = shape
1027
+
1028
+ def SetBottomSide(self, shape):
1029
+ """Set the the division on the bottom side of this division."""
1030
+ self._bottomSide = shape
1031
+
1032
+ def GetLeftSide(self):
1033
+ """Return the division on the left side of this division."""
1034
+ return self._leftSide
1035
+
1036
+ def GetTopSide(self):
1037
+ """Return the division on the top side of this division."""
1038
+ return self._topSide
1039
+
1040
+ def GetRightSide(self):
1041
+ """Return the division on the right side of this division."""
1042
+ return self._rightSide
1043
+
1044
+ def GetBottomSide(self):
1045
+ """Return the division on the bottom side of this division."""
1046
+ return self._bottomSide
1047
+
1048
+ def SetHandleSide(self, side):
1049
+ """
1050
+ Sets the side which the handle appears on.
1051
+
1052
+ :param `side`: Either DIVISION_SIDE_LEFT or DIVISION_SIDE_TOP.
1053
+
1054
+ """
1055
+ self._handleSide = side
1056
+
1057
+ def GetHandleSide(self):
1058
+ """Return the side which the handle appears on."""
1059
+ return self._handleSide
1060
+
1061
+ def SetLeftSidePen(self, pen):
1062
+ """Set the colour for drawing the left side of the division."""
1063
+ self._leftSidePen = pen
1064
+
1065
+ def SetTopSidePen(self, pen):
1066
+ """Set the colour for drawing the top side of the division."""
1067
+ self._topSidePen = pen
1068
+
1069
+ def GetLeftSidePen(self):
1070
+ """Return the pen used for drawing the left side of the division."""
1071
+ return self._leftSidePen
1072
+
1073
+ def GetTopSidePen(self):
1074
+ """Return the pen used for drawing the top side of the division."""
1075
+ return self._topSidePen
1076
+
1077
+ def GetLeftSideColour(self):
1078
+ """Return the colour used for drawing the left side of the division."""
1079
+ return self._leftSideColour
1080
+
1081
+ def GetTopSideColour(self):
1082
+ """Return the colour used for drawing the top side of the division."""
1083
+ return self._topSideColour
1084
+
1085
+ def SetLeftSideColour(self, colour):
1086
+ """Set the colour for drawing the left side of the division."""
1087
+ self._leftSideColour = colour
1088
+
1089
+ def SetTopSideColour(self, colour):
1090
+ """Set the colour for drawing the top side of the division."""
1091
+ self._topSideColour = colour
1092
+
1093
+ def GetLeftSideStyle(self):
1094
+ """Return the style used for the left side of the division."""
1095
+ return self._leftSideStyle
1096
+
1097
+ def GetTopSideStyle(self):
1098
+ """Return the style used for the top side of the division."""
1099
+ return self._topSideStyle
1100
+
1101
+ def SetLeftSideStyle(self, style):
1102
+ """
1103
+ Set the left side style.
1104
+
1105
+ :param `style`: valid values ???
1106
+
1107
+ """
1108
+ self._leftSideStyle = style
1109
+
1110
+ def SetTopSideStyle(self, style):
1111
+ """
1112
+ Set the top side style.
1113
+
1114
+ :param `style`: valid values ???
1115
+
1116
+ """
1117
+ self._lefttopStyle = style
1118
+
1119
+ def OnDraw(self, dc):
1120
+ """The draw handler."""
1121
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
1122
+ dc.SetBackgroundMode(wx.TRANSPARENT)
1123
+
1124
+ x1 = self.GetX() - self.GetWidth() / 2.0
1125
+ y1 = self.GetY() - self.GetHeight() / 2.0
1126
+ x2 = self.GetX() + self.GetWidth() / 2.0
1127
+ y2 = self.GetY() + self.GetHeight() / 2.0
1128
+
1129
+ # Should subtract 1 pixel if drawing under Windows
1130
+ if sys.platform[:3] == "win":
1131
+ y2 -= 1
1132
+
1133
+ if self._leftSide:
1134
+ dc.SetPen(self._leftSidePen)
1135
+ dc.DrawLine(*map(int, (x1, y2, x1, y1)))
1136
+
1137
+ if self._topSide:
1138
+ dc.SetPen(self._topSidePen)
1139
+ dc.DrawLine(*map(int, (x1, y1, x2, y1)))
1140
+
1141
+ # For testing purposes, draw a rectangle so we know
1142
+ # how big the division is.
1143
+ #dc.SetBrush(wx.RED_BRUSH)
1144
+ #dc.DrawRectangle(x1, y1, self.GetWidth(), self.GetHeight())
1145
+
1146
+ def OnDrawContents(self, dc):
1147
+ """The draw contens handler."""
1148
+ CompositeShape.OnDrawContents(self, dc)
1149
+
1150
+ def OnMovePre(self, dc, x, y, oldx, oldy, display = True):
1151
+ """The move 'pre' handler."""
1152
+ diffX = x - oldx
1153
+ diffY = y - oldy
1154
+ for object in self._children:
1155
+ object.Erase(dc)
1156
+ object.Move(dc, object.GetX() + diffX, object.GetY() + diffY, display)
1157
+ return True
1158
+
1159
+ def OnDragLeft(self, draw, x, y, keys = 0, attachment = 0):
1160
+ """The drag left handler."""
1161
+ if self._sensitivity & OP_DRAG_LEFT != OP_DRAG_LEFT:
1162
+ if self._parent:
1163
+ hit = self._parent.HitTest(x, y)
1164
+ if hit:
1165
+ attachment, dist = hit
1166
+ self._parent.GetEventHandler().OnDragLeft(draw, x, y, keys, attachment)
1167
+ return
1168
+ Shape.OnDragLeft(self, draw, x, y, keys, attachment)
1169
+
1170
+ def OnBeginDragLeft(self, x, y, keys = 0, attachment = 0):
1171
+ """The begin drag left handler."""
1172
+ if self._sensitivity & OP_DRAG_LEFT != OP_DRAG_LEFT:
1173
+ if self._parent:
1174
+ hit = self._parent.HitTest(x, y)
1175
+ if hit:
1176
+ attachment, dist = hit
1177
+ self._parent.GetEventHandler().OnBeginDragLeft(x, y, keys, attachment)
1178
+ return
1179
+ Shape.OnBeginDragLeft(x, y, keys, attachment)
1180
+
1181
+ def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
1182
+ """The end drag left handler."""
1183
+ if self._canvas.HasCapture():
1184
+ self._canvas.ReleaseMouse()
1185
+ if self._sensitivity & OP_DRAG_LEFT != OP_DRAG_LEFT:
1186
+ if self._parent:
1187
+ hit = self._parent.HitTest(x, y)
1188
+ if hit:
1189
+ attachment, dist = hit
1190
+ self._parent.GetEventHandler().OnEndDragLeft(x, y, keys, attachment)
1191
+ return
1192
+
1193
+ dc = wx.MemoryDC()
1194
+ dc.SelectObject(self.GetCanvas().GetBuffer())
1195
+ self.GetCanvas().PrepareDC(dc)
1196
+ dc.SetLogicalFunction(wx.COPY)
1197
+
1198
+ self._xpos, self._ypos = self._canvas.Snap(self._xpos, self._ypos)
1199
+ self.GetEventHandler().OnMovePre(dc, x, y, self._oldX, self._oldY)
1200
+
1201
+ self.ResetControlPoints()
1202
+ self.Draw(dc)
1203
+ self.MoveLinks(dc)
1204
+ self.GetEventHandler().OnDrawControlPoints(dc)
1205
+
1206
+ if self._canvas and not self._canvas.GetQuickEditMode():
1207
+ self._canvas.Redraw(dc)
1208
+
1209
+ def SetSize(self, w, h, recursive = True):
1210
+ """
1211
+ Set the size.
1212
+
1213
+ :param `w`: the width
1214
+ :param `h`: the heigth
1215
+ :param `recursive`: `True` recurse all children
1216
+
1217
+ """
1218
+ self._width = w
1219
+ self._height = h
1220
+ RectangleShape.SetSize(self, w, h, recursive)
1221
+
1222
+ def CalculateSize(self):
1223
+ """not implemented???"""
1224
+ pass
1225
+
1226
+ # Experimental
1227
+ def OnRightClick(self, x, y, keys = 0, attachment = 0):
1228
+ """The right click handler."""
1229
+ if keys & KEY_CTRL:
1230
+ self.PopupMenu(x, y)
1231
+ else:
1232
+ if self._parent:
1233
+ hit = self._parent.HitTest(x, y)
1234
+ if hit:
1235
+ attachment, dist = hit
1236
+ self._parent.GetEventHandler().OnRightClick(x, y, keys, attachment)
1237
+
1238
+ def Divide(self, direction):
1239
+ """Divide this division into two further divisions.
1240
+
1241
+ :param `direction`: `wx.HORIZONTAL` for horizontal or `wx.VERTICAL` for
1242
+ vertical division.
1243
+
1244
+ """
1245
+ # Calculate existing top-left, bottom-right
1246
+ x1 = self.GetX() - self.GetWidth() / 2.0
1247
+ y1 = self.GetY() - self.GetHeight() / 2.0
1248
+
1249
+ compositeParent = self.GetParent()
1250
+ oldWidth = self.GetWidth()
1251
+ oldHeight = self.GetHeight()
1252
+ if self.Selected():
1253
+ self.Select(False)
1254
+
1255
+ dc = wx.MemoryDC()
1256
+ dc.SelectObject(self.GetCanvas().GetBuffer())
1257
+ self.GetCanvas().PrepareDC(dc)
1258
+
1259
+ if direction == wx.VERTICAL:
1260
+ # Dividing vertically means notionally putting a horizontal
1261
+ # line through it.
1262
+ # Break existing piece into two.
1263
+ newXPos1 = self.GetX()
1264
+ newYPos1 = y1 + self.GetHeight() / 4.0
1265
+ newXPos2 = self.GetX()
1266
+ newYPos2 = y1 + 3 * self.GetHeight() / 4.0
1267
+ newDivision = compositeParent.OnCreateDivision()
1268
+ newDivision.Show(True)
1269
+
1270
+ self.Erase(dc)
1271
+
1272
+ # Anything adjoining the bottom of this division now adjoins the
1273
+ # bottom of the new division.
1274
+ for obj in compositeParent.GetDivisions():
1275
+ if obj.GetTopSide() == self:
1276
+ obj.SetTopSide(newDivision)
1277
+
1278
+ newDivision.SetTopSide(self)
1279
+ newDivision.SetBottomSide(self._bottomSide)
1280
+ newDivision.SetLeftSide(self._leftSide)
1281
+ newDivision.SetRightSide(self._rightSide)
1282
+ self._bottomSide = newDivision
1283
+
1284
+ compositeParent.GetDivisions().append(newDivision)
1285
+
1286
+ # CHANGE: Need to insert this division at start of divisions in the
1287
+ # object list, because e.g.:
1288
+ # 1) Add division
1289
+ # 2) Add contained object
1290
+ # 3) Add division
1291
+ # Division is now receiving mouse events _before_ the contained
1292
+ # object, because it was added last (on top of all others)
1293
+
1294
+ # Add after the image that visualizes the container
1295
+ compositeParent.AddChild(newDivision, compositeParent.FindContainerImage())
1296
+
1297
+ self._handleSide = DIVISION_SIDE_BOTTOM
1298
+ newDivision.SetHandleSide(DIVISION_SIDE_TOP)
1299
+
1300
+ self.SetSize(oldWidth, oldHeight / 2.0)
1301
+ self.Move(dc, newXPos1, newYPos1)
1302
+
1303
+ newDivision.SetSize(oldWidth, oldHeight / 2.0)
1304
+ newDivision.Move(dc, newXPos2, newYPos2)
1305
+ else:
1306
+ # Dividing horizontally means notionally putting a vertical line
1307
+ # through it.
1308
+ # Break existing piece into two.
1309
+ newXPos1 = x1 + self.GetWidth() / 4.0
1310
+ newYPos1 = self.GetY()
1311
+ newXPos2 = x1 + 3 * self.GetWidth() / 4.0
1312
+ newYPos2 = self.GetY()
1313
+ newDivision = compositeParent.OnCreateDivision()
1314
+ newDivision.Show(True)
1315
+
1316
+ self.Erase(dc)
1317
+
1318
+ # Anything adjoining the left of this division now adjoins the
1319
+ # left of the new division.
1320
+ for obj in compositeParent.GetDivisions():
1321
+ if obj.GetLeftSide() == self:
1322
+ obj.SetLeftSide(newDivision)
1323
+
1324
+ newDivision.SetTopSide(self._topSide)
1325
+ newDivision.SetBottomSide(self._bottomSide)
1326
+ newDivision.SetLeftSide(self)
1327
+ newDivision.SetRightSide(self._rightSide)
1328
+ self._rightSide = newDivision
1329
+
1330
+ compositeParent.GetDivisions().append(newDivision)
1331
+ compositeParent.AddChild(newDivision, compositeParent.FindContainerImage())
1332
+
1333
+ self._handleSide = DIVISION_SIDE_RIGHT
1334
+ newDivision.SetHandleSide(DIVISION_SIDE_LEFT)
1335
+
1336
+ self.SetSize(oldWidth / 2.0, oldHeight)
1337
+ self.Move(dc, newXPos1, newYPos1)
1338
+
1339
+ newDivision.SetSize(oldWidth / 2.0, oldHeight)
1340
+ newDivision.Move(dc, newXPos2, newYPos2)
1341
+
1342
+ if compositeParent.Selected():
1343
+ compositeParent.DeleteControlPoints(dc)
1344
+ compositeParent.MakeControlPoints()
1345
+ compositeParent.MakeMandatoryControlPoints()
1346
+
1347
+ compositeParent.Draw(dc)
1348
+ return True
1349
+
1350
+ def MakeControlPoints(self):
1351
+ """Make control points."""
1352
+ self.MakeMandatoryControlPoints()
1353
+
1354
+ def MakeMandatoryControlPoints(self):
1355
+ """Make mandatory control points."""
1356
+ maxX, maxY = self.GetBoundingBoxMax()
1357
+ x = y = 0.0
1358
+ direction = 0
1359
+
1360
+ if self._handleSide == DIVISION_SIDE_LEFT:
1361
+ x = -maxX / 2.0
1362
+ direction = CONTROL_POINT_HORIZONTAL
1363
+ elif self._handleSide == DIVISION_SIDE_TOP:
1364
+ y = -maxY / 2.0
1365
+ direction = CONTROL_POINT_VERTICAL
1366
+ elif self._handleSide == DIVISION_SIDE_RIGHT:
1367
+ x = maxX / 2.0
1368
+ direction = CONTROL_POINT_HORIZONTAL
1369
+ elif self._handleSide == DIVISION_SIDE_BOTTOM:
1370
+ y = maxY / 2.0
1371
+ direction = CONTROL_POINT_VERTICAL
1372
+
1373
+ if self._handleSide != DIVISION_SIDE_NONE:
1374
+ control = DivisionControlPoint(self._canvas, self, CONTROL_POINT_SIZE, x, y, direction)
1375
+ self._canvas.AddShape(control)
1376
+ self._controlPoints.append(control)
1377
+
1378
+ def ResetControlPoints(self):
1379
+ """Reset control points."""
1380
+ self.ResetMandatoryControlPoints()
1381
+
1382
+ def ResetMandatoryControlPoints(self):
1383
+ """Reset mandatory control points."""
1384
+ if not self._controlPoints:
1385
+ return
1386
+
1387
+ maxX, maxY = self.GetBoundingBoxMax()
1388
+
1389
+ node = self._controlPoints[0]
1390
+
1391
+ if self._handleSide == DIVISION_SIDE_LEFT and node:
1392
+ node._xoffset = -maxX / 2.0
1393
+ node._yoffset = 0.0
1394
+
1395
+ if self._handleSide == DIVISION_SIDE_TOP and node:
1396
+ node._xoffset = 0.0
1397
+ node._yoffset = -maxY / 2.0
1398
+
1399
+ if self._handleSide == DIVISION_SIDE_RIGHT and node:
1400
+ node._xoffset = maxX / 2.0
1401
+ node._yoffset = 0.0
1402
+
1403
+ if self._handleSide == DIVISION_SIDE_BOTTOM and node:
1404
+ node._xoffset = 0.0
1405
+ node._yoffset = maxY / 2.0
1406
+
1407
+ def AdjustLeft(self, left, test):
1408
+ """
1409
+ Adjust a side.
1410
+
1411
+ :param `left`: desired left position ???
1412
+ :param `test`: if `True` just a test
1413
+ :returns: `False` if it's not physically possible to adjust it to
1414
+ this point.
1415
+ """
1416
+ x2 = self.GetX() + self.GetWidth() / 2.0
1417
+
1418
+ if left >= x2:
1419
+ return False
1420
+
1421
+ if test:
1422
+ return True
1423
+
1424
+ newW = x2 - left
1425
+ newX = left + newW / 2.0
1426
+ self.SetSize(newW, self.GetHeight())
1427
+
1428
+ dc = wx.MemoryDC()
1429
+ dc.SelectObject(self.GetCanvas().GetBuffer())
1430
+ self.GetCanvas().PrepareDC(dc)
1431
+
1432
+ self.Move(dc, newX, self.GetY())
1433
+ return True
1434
+
1435
+ def AdjustRight(self, right, test):
1436
+ """
1437
+ Adjust a side.
1438
+
1439
+ :param `right`: desired right position ???
1440
+ :param `test`: if `True` just a test
1441
+ :returns: `False` if it's not physically possible to adjust it to
1442
+ this point.
1443
+
1444
+ """
1445
+ x1 = self.GetX() - self.GetWidth() / 2.0
1446
+
1447
+ if right <= x1:
1448
+ return False
1449
+
1450
+ if test:
1451
+ return True
1452
+
1453
+ newW = right - x1
1454
+ newX = x1 + newW / 2.0
1455
+ self.SetSize(newW, self.GetHeight())
1456
+
1457
+ dc = wx.MemoryDC()
1458
+ dc.SelectObject(self.GetCanvas().GetBuffer())
1459
+ self.GetCanvas().PrepareDC(dc)
1460
+
1461
+ self.Move(dc, newX, self.GetY())
1462
+ return True
1463
+
1464
+ def AdjustTop(self, top, test):
1465
+ """
1466
+ Adjust a side.
1467
+
1468
+ :param `top`: desired top position ???
1469
+ :param `test`: if `True` just a test
1470
+ :returns: `False` if it's not physically possible to adjust it to
1471
+ this point.
1472
+
1473
+ """
1474
+ y1 = self.GetY() - self.GetHeight() / 2.0
1475
+
1476
+ if top <= y1:
1477
+ return False
1478
+
1479
+ if test:
1480
+ return True
1481
+
1482
+ newH = top - y1
1483
+ newY = y1 + newH / 2.0
1484
+ self.SetSize(self.GetWidth(), newH)
1485
+
1486
+ dc = wx.MemoryDC()
1487
+ dc.SelectObject(self.GetCanvas().GetBuffer())
1488
+ self.GetCanvas().PrepareDC(dc)
1489
+
1490
+ self.Move(dc, self.GetX(), newY)
1491
+ return True
1492
+
1493
+ # Resize adjoining divisions.
1494
+
1495
+ # Behaviour should be as follows:
1496
+ # If right edge moves, find all objects whose left edge
1497
+ # adjoins this object, and move left edge accordingly.
1498
+ # If left..., move ... right.
1499
+ # If top..., move ... bottom.
1500
+ # If bottom..., move top.
1501
+ # If size goes to zero or end position is other side of start position,
1502
+ # resize to original size and return.
1503
+ #
1504
+ def ResizeAdjoining(self, side, newPos, test):
1505
+ """
1506
+ Resize adjoining divisions at the given side.
1507
+
1508
+ :param `side`: can be one of
1509
+
1510
+ ======================= =======================
1511
+ Side option Description
1512
+ ======================= =======================
1513
+ `DIVISION_SIDE_NONE` no side
1514
+ `DIVISION_SIDE_LEFT` Left side
1515
+ `DIVISION_SIDE_TOP` Top side
1516
+ `DIVISION_SIDE_RIGHT` Right side
1517
+ `DIVISION_SIDE_BOTTOM` Bottom side
1518
+ ======================= =======================
1519
+
1520
+ :param `newPos`: new position
1521
+ :param `test`: if `True`, just see whether it's possible for each
1522
+ adjoining region, returning `False` if it's not.
1523
+
1524
+ """
1525
+ divisionParent = self.GetParent()
1526
+ for division in divisionParent.GetDivisions():
1527
+ if side == DIVISION_SIDE_LEFT:
1528
+ if division._rightSide == self:
1529
+ success = division.AdjustRight(newPos, test)
1530
+ if not success and test:
1531
+ return False
1532
+ elif side == DIVISION_SIDE_TOP:
1533
+ if division._bottomSide == self:
1534
+ success = division.AdjustBottom(newPos, test)
1535
+ if not success and test:
1536
+ return False
1537
+ elif side == DIVISION_SIDE_RIGHT:
1538
+ if division._leftSide == self:
1539
+ success = division.AdjustLeft(newPos, test)
1540
+ if not success and test:
1541
+ return False
1542
+ elif side == DIVISION_SIDE_BOTTOM:
1543
+ if division._topSide == self:
1544
+ success = division.AdjustTop(newPos, test)
1545
+ if not success and test:
1546
+ return False
1547
+ return True
1548
+
1549
+ def EditEdge(self, side):
1550
+ print("EditEdge() not implemented.")
1551
+
1552
+ def PopupMenu(self, x, y):
1553
+ """Popup menu handler."""
1554
+ menu = PopupDivisionMenu()
1555
+ menu.SetClientData(self)
1556
+ if self._leftSide:
1557
+ menu.Enable(DIVISION_MENU_EDIT_LEFT_EDGE, True)
1558
+ else:
1559
+ menu.Enable(DIVISION_MENU_EDIT_LEFT_EDGE, False)
1560
+ if self._topSide:
1561
+ menu.Enable(DIVISION_MENU_EDIT_TOP_EDGE, True)
1562
+ else:
1563
+ menu.Enable(DIVISION_MENU_EDIT_TOP_EDGE, False)
1564
+
1565
+ x1, y1 = self._canvas.GetViewStart()
1566
+ unit_x, unit_y = self._canvas.GetScrollPixelsPerUnit()
1567
+
1568
+ dc = wx.MemoryDC()
1569
+ dc.SelectObject(self.GetCanvas().GetBuffer())
1570
+ self.GetCanvas().PrepareDC(dc)
1571
+
1572
+ mouse_x = dc.LogicalToDeviceX(x - x1 * unit_x)
1573
+ mouse_y = dc.LogicalToDeviceY(y - y1 * unit_y)
1574
+
1575
+ self._canvas.PopupMenu(menu, (mouse_x, mouse_y))
1576
+
1577
+