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
@@ -0,0 +1,2823 @@
1
+ # --------------------------------------------------------------------------- #
2
+ # BUTTONPANEL Widget wxPython IMPLEMENTATION
3
+ #
4
+ # Original C++ Code From Eran. You Can Find It At:
5
+ #
6
+ # http://wxforum.shadonet.com/viewtopic.php?t=6619
7
+ #
8
+ # License: wxWidgets license
9
+ #
10
+ #
11
+ # Python Code By:
12
+ #
13
+ # Andrea Gavana, @ 02 Oct 2006
14
+ # Latest Revision: 27 Dec 2012, 21.00 GMT
15
+ #
16
+ #
17
+ # For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please
18
+ # Write To Me At:
19
+ #
20
+ # andrea.gavana@gmail.com
21
+ # andrea.gavana@maerskoil.com
22
+ #
23
+ # Or, Obviously, To The wxPython Mailing List!!!
24
+ #
25
+ # Tags: phoenix-port, unittest, documented, py3-port
26
+ #
27
+ # End Of Comments
28
+ # --------------------------------------------------------------------------- #
29
+
30
+ """
31
+ A custom panel class with gradient background shading with the possibility to
32
+ add buttons and controls still respecting the gradient background.
33
+
34
+
35
+ Description
36
+ ===========
37
+
38
+ With :class:`ButtonPanel` class you have a panel with gradient colouring
39
+ on it and with the possibility to place some buttons on it. Using a
40
+ standard panel with normal :class:`Button` leads to an ugly result: the
41
+ buttons are placed correctly on the panel - but with grey area around
42
+ them. Gradient colouring is kept behind the images - this was achieved
43
+ due to the PNG format and the transparency of the bitmaps.
44
+
45
+ The image are functioning like a buttons and can be caught in your
46
+ code using the usual::
47
+
48
+ self.Bind(wx.EVT_BUTTON, self.OnButton)
49
+
50
+ method.
51
+
52
+ The control is generic, and support theming (well, I tested it under
53
+ Windows with the three defauls themes: grey, blue, silver and the
54
+ classic look).
55
+
56
+
57
+ Usage
58
+ =====
59
+
60
+ :class:`ButtonPanel` supports 4 alignments: left, right, top, bottom, which have a
61
+ different meaning and behavior with respect to :class:`ToolBar`. The easiest
62
+ thing is to try the demo to understand, but I'll try to explain how it works.
63
+
64
+ **CASE 1**: :class:`ButtonPanel` has a main caption text.
65
+
66
+ - Left alignment means :class:`ButtonPanel` is horizontal, with the text aligned to the
67
+ left. When you shrink the demo frame, if there is not enough room for all
68
+ the controls to be shown, the controls closest to the text are hidden;
69
+
70
+ - Right alignment means :class:`ButtonPanel` is horizontal, with the text aligned to the
71
+ right. Item layout as above;
72
+
73
+ - Top alignment means :class:`ButtonPanel` is vertical, with the text aligned to the top.
74
+ Item layout as above;
75
+
76
+ - Bottom alignment means :class:`ButtonPanel` is vertical, with the text aligned to the
77
+ bottom. Item layout as above.
78
+
79
+
80
+ **CASE 2**: :class:`ButtonPanel` has **no** main caption text.
81
+
82
+ - In this case, left and right alignment are the same (as top and bottom are the same),
83
+ but the layout strategy changes: now if there is not enough room for all the controls
84
+ to be shown, the last added items are hidden ("last" means on the far right for an
85
+ horizontal :class:`ButtonPanel` and far bottom for a vertical :class:`ButtonPanel`).
86
+
87
+
88
+ Usage example::
89
+
90
+ import wx
91
+ import wx.lib.agw.buttonpanel as BP
92
+
93
+ class MyFrame(wx.Frame):
94
+
95
+ def __init__(self, parent, id=-1, title="ButtonPanel", pos=wx.DefaultPosition,
96
+ size=(800, 600), style=wx.DEFAULT_FRAME_STYLE):
97
+
98
+ wx.Frame.__init__(self, parent, id, title, pos, size, style)
99
+
100
+ mainPanel = wx.Panel(self, -1)
101
+ self.logtext = wx.TextCtrl(mainPanel, -1, "", style=wx.TE_MULTILINE)
102
+
103
+ vSizer = wx.BoxSizer(wx.VERTICAL)
104
+ mainPanel.SetSizer(vSizer)
105
+
106
+ titleBar = BP.ButtonPanel(mainPanel, -1, "A Simple Test & Demo")
107
+
108
+ btn1 = BP.ButtonInfo(titleBar, wx.ID_ANY, wx.Bitmap("png4.png", wx.BITMAP_TYPE_PNG))
109
+ titleBar.AddButton(btn1)
110
+ self.Bind(wx.EVT_BUTTON, self.OnButton, btn1)
111
+
112
+ btn2 = BP.ButtonInfo(titleBar, wx.ID_ANY, wx.Bitmap("png3.png", wx.BITMAP_TYPE_PNG))
113
+ titleBar.AddButton(btn2)
114
+ self.Bind(wx.EVT_BUTTON, self.OnButton, btn2)
115
+
116
+ btn3 = BP.ButtonInfo(titleBar, wx.ID_ANY, wx.Bitmap("png2.png", wx.BITMAP_TYPE_PNG))
117
+ titleBar.AddButton(btn3)
118
+ self.Bind(wx.EVT_BUTTON, self.OnButton, btn3)
119
+
120
+ btn4 = BP.ButtonInfo(titleBar, wx.ID_ANY, wx.Bitmap("png1.png", wx.BITMAP_TYPE_PNG))
121
+ titleBar.AddButton(btn4)
122
+ self.Bind(wx.EVT_BUTTON, self.OnButton, btn4)
123
+
124
+ vSizer.Add(titleBar, 0, wx.EXPAND)
125
+ vSizer.Add((20, 20))
126
+ vSizer.Add(self.logtext, 1, wx.EXPAND | wx.ALL, 5)
127
+
128
+ titleBar.DoLayout()
129
+ vSizer.Layout()
130
+
131
+
132
+ def OnButton(self, event):
133
+ ''' Handler for the ``wx.EVT_BUTTON`` event. '''
134
+
135
+ obj = event.GetEventObject()
136
+
137
+ # This will print the button label
138
+ print(obj.GetText())
139
+
140
+
141
+ # our normal wxApp-derived class, as usual
142
+
143
+ app = wx.App(0)
144
+
145
+ frame = MyFrame(None)
146
+ app.SetTopWindow(frame)
147
+ frame.Show()
148
+
149
+ app.MainLoop()
150
+
151
+
152
+
153
+ Window Styles
154
+ =============
155
+
156
+ This class supports the following window styles:
157
+
158
+ ==================== =========== ==================================================
159
+ Window Styles Hex Value Description
160
+ ==================== =========== ==================================================
161
+ ``BP_DEFAULT_STYLE`` 0x1 :class:`ButtonPanel` has a plain solid background.
162
+ ``BP_USE_GRADIENT`` 0x2 :class:`ButtonPanel` has a gradient shading background.
163
+ ==================== =========== ==================================================
164
+
165
+
166
+ Events Processing
167
+ =================
168
+
169
+ This class processes the following events:
170
+
171
+ ================= ==================================================
172
+ Event Name Description
173
+ ================= ==================================================
174
+ ``wx.EVT_BUTTON`` Process a `wxEVT_COMMAND_BUTTON_CLICKED` event, when a button is clicked.
175
+ ================= ==================================================
176
+
177
+
178
+ License And Version
179
+ ===================
180
+
181
+ :class:`ButtonPanel` is distributed under the wxPython license.
182
+
183
+ Latest Revision: Andrea Gavana @ 27 Dec 2012, 21.00 GMT
184
+
185
+ Version 0.7.
186
+
187
+ """
188
+
189
+
190
+ import wx
191
+
192
+ # Some constants to tune the BPArt class
193
+ BP_BACKGROUND_COLOUR = 0
194
+ """ Background brush colour when no gradient shading exists. """
195
+ BP_GRADIENT_COLOUR_FROM = 1
196
+ """ Starting gradient colour, used only when ``BP_USE_GRADIENT`` style is applied. """
197
+ BP_GRADIENT_COLOUR_TO = 2
198
+ """ Ending gradient colour, used only when ``BP_USE_GRADIENT`` style is applied. """
199
+ BP_BORDER_COLOUR = 3
200
+ """ Pen colour to paint the border of :class:`ButtonPanel`. """
201
+ BP_TEXT_COLOUR = 4
202
+ """ Main :class:`ButtonPanel` caption colour. """
203
+ BP_BUTTONTEXT_COLOUR = 5
204
+ """ Text colour for buttons with text. """
205
+ BP_BUTTONTEXT_INACTIVE_COLOUR = 6
206
+ """ Text colour for inactive buttons with text. """
207
+ BP_SELECTION_BRUSH_COLOUR = 7
208
+ """ Brush colour to be used when hovering or selecting a button. """
209
+ BP_SELECTION_PEN_COLOUR = 8
210
+ """ Pen colour to be used when hovering or selecting a button. """
211
+ BP_SEPARATOR_COLOUR = 9
212
+ """ Pen colour used to paint the separators. """
213
+ BP_TEXT_FONT = 10
214
+ """ Font of the :class:`ButtonPanel` main caption. """
215
+ BP_BUTTONTEXT_FONT = 11
216
+ """ Text font for the buttons with text. """
217
+
218
+ BP_BUTTONTEXT_ALIGN_BOTTOM = 12
219
+ """ Flag that indicates the image and text in buttons is stacked. """
220
+ BP_BUTTONTEXT_ALIGN_RIGHT = 13
221
+ """ Flag that indicates the text is shown alongside the image in buttons with text. """
222
+
223
+ BP_SEPARATOR_SIZE = 14
224
+ """ Separator size. NB: This is not the line width, but the sum of the space before and after the separator line plus the width of the line. """
225
+ BP_MARGINS_SIZE = 15
226
+ """ Size of the left/right margins in :class:`ButtonPanel` (top/bottom for vertically aligned :class:`ButtonPanel`)."""
227
+ BP_BORDER_SIZE = 16
228
+ """ Size of the border. """
229
+ BP_PADDING_SIZE = 17
230
+ """ Inter-tool separator size. """
231
+
232
+ # Caption Gradient Type
233
+ BP_GRADIENT_NONE = 0
234
+ """ No gradient shading should be used to paint the background. """
235
+ BP_GRADIENT_VERTICAL = 1
236
+ """ Vertical gradient shading should be used to paint the background. """
237
+ BP_GRADIENT_HORIZONTAL = 2
238
+ """ Horizontal gradient shading should be used to paint the background. """
239
+
240
+ # Flags for HitTest() method
241
+ BP_HT_BUTTON = 200
242
+ """ This flag indicates that the user has hit a button inside :class:`ButtonPanel`. """
243
+ BP_HT_NONE = 201
244
+ """ This flag indicates that no buttons were hit inside :class:`ButtonPanel`. """
245
+
246
+ # Alignment of buttons in the panel
247
+ BP_ALIGN_RIGHT = 1
248
+ """ Aligns the buttons to the right (for an horizontal :class:`ButtonPanel`). """
249
+ BP_ALIGN_LEFT = 2
250
+ """ Aligns the buttons to the left (for an horizontal :class:`ButtonPanel`). """
251
+ BP_ALIGN_TOP = 4
252
+ """ Aligns the buttons at the top (for a vertical :class:`ButtonPanel`). """
253
+ BP_ALIGN_BOTTOM = 8
254
+ """ Aligns the buttons at the bottom (for a vertical :class:`ButtonPanel`). """
255
+
256
+ # ButtonPanel styles
257
+ BP_DEFAULT_STYLE = 1
258
+ """ :class:`ButtonPanel` has a plain solid background. """
259
+ BP_USE_GRADIENT = 2
260
+ """ :class:`ButtonPanel` has a gradient shading background. """
261
+
262
+ # Delay used to cancel the longHelp in the statusbar field
263
+ _DELAY = 3000
264
+
265
+
266
+ # Check for the new method in 2.7 (not present in 2.6.3.3)
267
+ if wx.VERSION_STRING < "2.7":
268
+ wx.Rect.Contains = lambda self, point: wx.Rect.Inside(self, point)
269
+
270
+
271
+ def BrightenColour(colour, factor):
272
+ """
273
+ Brighten the input colour by a factor.
274
+
275
+ :param `colour`: a valid :class:`wx.Colour` instance;
276
+ :param integer `factor`: the factor by which the input colour should be brightened.
277
+
278
+ :return: An instance of :class:`wx.Colour`, a brightened version of the input `colour`.
279
+ """
280
+
281
+ val = colour.Red()*factor
282
+ if val > 255:
283
+ red = 255
284
+ else:
285
+ red = val
286
+
287
+ val = colour.Green()*factor
288
+ if val > 255:
289
+ green = 255
290
+ else:
291
+ green = val
292
+
293
+ val = colour.Blue()*factor
294
+ if val > 255:
295
+ blue = 255
296
+ else:
297
+ blue = val
298
+
299
+ return wx.Colour(int(red), int(green), int(blue))
300
+
301
+
302
+ # ----------------------------------------------------------------------------
303
+
304
+ def MakeDisabledBitmap(original):
305
+ """
306
+ Creates a disabled-looking bitmap starting from the input one.
307
+
308
+ :param `original`: an instance of :class:`wx.Bitmap` to be greyed-out.
309
+
310
+ :return: A greyed-out representation of the input bitmap, an instance of :class:`wx.Bitmap`.
311
+ """
312
+
313
+ img = original.ConvertToImage()
314
+ return wx.Bitmap(img.ConvertToGreyscale())
315
+
316
+
317
+ # ---------------------------------------------------------------------------- #
318
+ # Class BPArt
319
+ # Handles all the drawings for buttons, separators and text and allows the
320
+ # programmer to set colours, sizes and gradient shadings for ButtonPanel
321
+ # ---------------------------------------------------------------------------- #
322
+
323
+ class BPArt(object):
324
+ """
325
+ :class:`BPArt` is an art provider class which does all of the drawing for :class:`ButtonPanel`.
326
+ This allows the library caller to customize the :class:`BPArt` or to completely replace
327
+ all drawing with custom BPArts.
328
+ """
329
+
330
+ def __init__(self, parentStyle):
331
+ """
332
+ Default class constructor.
333
+
334
+ :param integer `parentStyle`: the window style for :class:`ButtonPanel`.
335
+ """
336
+
337
+ base_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE)
338
+
339
+ self._background_brush = wx.Brush(base_colour, wx.BRUSHSTYLE_SOLID)
340
+ self._gradient_colour_to = wx.WHITE
341
+ self._gradient_colour_from = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION)
342
+
343
+ if parentStyle & BP_USE_GRADIENT:
344
+ self._border_pen = wx.Pen(wx.WHITE, 3)
345
+ self._caption_text_colour = wx.WHITE
346
+ self._buttontext_colour = wx.Colour(70, 143, 255)
347
+ self._separator_pen = wx.Pen(BrightenColour(self._gradient_colour_from, 1.4))
348
+ self._gradient_type = BP_GRADIENT_VERTICAL
349
+ else:
350
+ self._border_pen = wx.Pen(BrightenColour(base_colour, 0.9), 3)
351
+ self._caption_text_colour = wx.BLACK
352
+ self._buttontext_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT)
353
+ self._separator_pen = wx.Pen(BrightenColour(base_colour, 0.9))
354
+ self._gradient_type = BP_GRADIENT_NONE
355
+
356
+ self._buttontext_inactive_colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)
357
+ self._selection_brush = wx.WHITE_BRUSH
358
+ self._selection_pen = wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION))
359
+
360
+ sysfont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
361
+ self._caption_font = wx.Font(sysfont.GetPointSize(), wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD,
362
+ False, sysfont.GetFaceName())
363
+ self._buttontext_font = wx.Font(sysfont.GetPointSize(), wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD,
364
+ False, sysfont.GetFaceName())
365
+
366
+ self._separator_size = 7
367
+ self._margins_size = wx.Size(6, 6)
368
+ self._caption_border_size = 3
369
+ self._padding_size = wx.Size(6, 6)
370
+
371
+
372
+ def GetMetric(self, id):
373
+ """
374
+ Returns the option value for the specified size `id`.
375
+
376
+ :param integer `id`: the identification bit for the size value. This can be one of the
377
+ following bits:
378
+
379
+ ============================== ======= =====================================
380
+ Size Id Value Description
381
+ ============================== ======= =====================================
382
+ ``BP_SEPARATOR_SIZE`` 14 Separator size. Note: This is not the line width, but the sum of the space before and after the separator line plus the width of the line
383
+ ``BP_MARGINS_SIZE`` 15 Size of the left/right margins in :class:`ButtonPanel` (top/bottom for vertically aligned :class:`ButtonPanel`)
384
+ ``BP_BORDER_SIZE`` 16 Size of the border
385
+ ``BP_PADDING_SIZE`` 17 Inter-tool separator size
386
+ ============================== ======= =====================================
387
+
388
+ :return: An integer representing the option value for the input `id`.
389
+
390
+ :raise: `Exception` if the `id` is not recognized.
391
+ """
392
+
393
+ if id == BP_SEPARATOR_SIZE:
394
+ return self._separator_size
395
+ elif id == BP_MARGINS_SIZE:
396
+ return self._margins_size
397
+ elif id == BP_BORDER_SIZE:
398
+ return self._caption_border_size
399
+ elif id == BP_PADDING_SIZE:
400
+ return self._padding_size
401
+ else:
402
+ raise Exception("\nERROR: Invalid Metric Ordinal. ")
403
+
404
+
405
+ def SetMetric(self, id, new_val):
406
+ """
407
+ Sets the option value for the specified size `id`.
408
+
409
+ :param integer `id`: the identification bit for the size value;
410
+ :param integer `new_val`: the new value for the size.
411
+
412
+ :raise: `Exception` if the `id` is not recognized.
413
+
414
+ :see: :meth:`~BPArt.GetMetric` for a list of meaningful size ids.
415
+ """
416
+
417
+ if id == BP_SEPARATOR_SIZE:
418
+ self._separator_size = new_val
419
+ elif id == BP_MARGINS_SIZE:
420
+ self._margins_size = new_val
421
+ elif id == BP_BORDER_SIZE:
422
+ self._caption_border_size = new_val
423
+ self._border_pen.SetWidth(new_val)
424
+ elif id == BP_PADDING_SIZE:
425
+ self._padding_size = new_val
426
+ else:
427
+ raise Exception("\nERROR: Invalid Metric Ordinal. ")
428
+
429
+
430
+ def GetColour(self, id):
431
+ """
432
+ Returns the option value for the specified colour `id`.
433
+
434
+ :param integer `id`: the identification bit for the colour value. This can be one of the
435
+ following bits:
436
+
437
+ ================================== ======= =====================================
438
+ Colour Id Value Description
439
+ ================================== ======= =====================================
440
+ ``BP_BACKGROUND_COLOUR`` 0 Background brush colour when no gradient shading exists
441
+ ``BP_GRADIENT_COLOUR_FROM`` 1 Starting gradient colour, used only when ``BP_USE_GRADIENT`` style is applied
442
+ ``BP_GRADIENT_COLOUR_TO`` 2 Ending gradient colour, used only when ``BP_USE_GRADIENT`` style is applied
443
+ ``BP_BORDER_COLOUR`` 3 Pen colour to paint the border of :class:`ButtonPanel`
444
+ ``BP_TEXT_COLOUR`` 4 Main :class:`ButtonPanel` caption colour
445
+ ``BP_BUTTONTEXT_COLOUR`` 5 Text colour for buttons with text
446
+ ``BP_BUTTONTEXT_INACTIVE_COLOUR`` 6 Text colour for inactive buttons with text
447
+ ``BP_SELECTION_BRUSH_COLOUR`` 7 Brush colour to be used when hovering or selecting a button
448
+ ``BP_SELECTION_PEN_COLOUR`` 8 Pen colour to be used when hovering or selecting a button
449
+ ``BP_SEPARATOR_COLOUR`` 9 Pen colour used to paint the separators
450
+ ================================== ======= =====================================
451
+
452
+ :return: An instance of :class:`wx.Colour` for the input `id`.
453
+
454
+ :raise: `Exception` if the `id` is not recognized.
455
+ """
456
+
457
+ if id == BP_BACKGROUND_COLOUR:
458
+ return self._background_brush.GetColour()
459
+ elif id == BP_GRADIENT_COLOUR_FROM:
460
+ return self._gradient_colour_from
461
+ elif id == BP_GRADIENT_COLOUR_TO:
462
+ return self._gradient_colour_to
463
+ elif id == BP_BORDER_COLOUR:
464
+ return self._border_pen.GetColour()
465
+ elif id == BP_TEXT_COLOUR:
466
+ return self._caption_text_colour
467
+ elif id == BP_BUTTONTEXT_COLOUR:
468
+ return self._buttontext_colour
469
+ elif id == BP_BUTTONTEXT_INACTIVE_COLOUR:
470
+ return self._buttontext_inactive_colour
471
+ elif id == BP_SELECTION_BRUSH_COLOUR:
472
+ return self._selection_brush.GetColour()
473
+ elif id == BP_SELECTION_PEN_COLOUR:
474
+ return self._selection_pen.GetColour()
475
+ elif id == BP_SEPARATOR_COLOUR:
476
+ return self._separator_pen.GetColour()
477
+ else:
478
+ raise Exception("\nERROR: Invalid Colour Ordinal. ")
479
+
480
+
481
+ def SetColour(self, id, colour):
482
+ """
483
+ Sets the option value for the specified colour `id`.
484
+
485
+ :param integer `id`: the identification bit for the colour value;
486
+ :param `colour`: the new value for the colour (a valid :class:`wx.Colour` instance).
487
+
488
+ :raise: `Exception` if the `id` is not recognized.
489
+
490
+ :see: :meth:`~BPArt.GetColour` for a list of meaningful colour ids.
491
+ """
492
+
493
+ if id == BP_BACKGROUND_COLOUR:
494
+ self._background_brush.SetColour(colour)
495
+ elif id == BP_GRADIENT_COLOUR_FROM:
496
+ self._gradient_colour_from = colour
497
+ elif id == BP_GRADIENT_COLOUR_TO:
498
+ self._gradient_colour_to = colour
499
+ elif id == BP_BORDER_COLOUR:
500
+ self._border_pen.SetColour(colour)
501
+ elif id == BP_TEXT_COLOUR:
502
+ self._caption_text_colour = colour
503
+ elif id == BP_BUTTONTEXT_COLOUR:
504
+ self._buttontext_colour = colour
505
+ elif id == BP_BUTTONTEXT_INACTIVE_COLOUR:
506
+ self._buttontext_inactive_colour = colour
507
+ elif id == BP_SELECTION_BRUSH_COLOUR:
508
+ self._selection_brush.SetColour(colour)
509
+ elif id == BP_SELECTION_PEN_COLOUR:
510
+ self._selection_pen.SetColour(colour)
511
+ elif id == BP_SEPARATOR_COLOUR:
512
+ self._separator_pen.SetColour(colour)
513
+ else:
514
+ raise Exception("\nERROR: Invalid Colour Ordinal. ")
515
+
516
+
517
+ GetColor = GetColour
518
+ SetColor = SetColour
519
+
520
+
521
+ def GetFont(self, id):
522
+ """
523
+ Returns the option value for the specified font `id`.
524
+
525
+ :param integer `id`: the identification bit for the font value. This can be one of the
526
+ following bits:
527
+
528
+ ============================== ======= =====================================
529
+ Size Id Value Description
530
+ ============================== ======= =====================================
531
+ ``BP_TEXT_FONT`` 10 Font of the :class:`ButtonPanel` main caption
532
+ ``BP_BUTTONTEXT_FONT`` 11 Text font for the buttons with text
533
+ ============================== ======= =====================================
534
+
535
+ :return: An instance of :class:`wx.Font` for the input `id`.
536
+
537
+ :raise: `Exception` if the `id` is not recognized.
538
+ """
539
+
540
+ if id == BP_TEXT_FONT:
541
+ return self._caption_font
542
+ elif id == BP_BUTTONTEXT_FONT:
543
+ return self._buttontext_font
544
+
545
+ return wx.NoneFont
546
+
547
+
548
+ def SetFont(self, id, font):
549
+ """
550
+ Sets the option value for the specified font `id`.
551
+
552
+ :param integer `id`: the identification bit for the font value;
553
+ :param `colour`: the new value for the font (a valid :class:`wx.Font` instance).
554
+
555
+ :raise: `Exception` if the `id` is not recognized.
556
+
557
+ :see: :meth:`~BPArt.GetFont` for a list of meaningful font ids.
558
+ """
559
+
560
+ if id == BP_TEXT_FONT:
561
+ self._caption_font = font
562
+ elif id == BP_BUTTONTEXT_FONT:
563
+ self._buttontext_font = font
564
+
565
+
566
+ def SetGradientType(self, gradient):
567
+ """
568
+ Sets the gradient type for :class:`BPArt` drawings.
569
+
570
+ :param integer `gradient`: can be one of the following bits:
571
+
572
+ ============================ ======= ============================
573
+ Gradient Type Value Description
574
+ ============================ ======= ============================
575
+ ``BP_GRADIENT_NONE`` 0 No gradient shading should be used to paint the background
576
+ ``BP_GRADIENT_VERTICAL`` 1 Vertical gradient shading should be used to paint the background
577
+ ``BP_GRADIENT_HORIZONTAL`` 2 Horizontal gradient shading should be used to paint the background
578
+ ============================ ======= ============================
579
+
580
+ """
581
+
582
+ self._gradient_type = gradient
583
+
584
+
585
+ def GetGradientType(self):
586
+ """
587
+ Returns the gradient type for :class:`BPArt` drawings.
588
+
589
+ :return: An integer representing the gradient type.
590
+
591
+ :see: :meth:`~BPArt.SetGradientType` for a list of possible gradient types.
592
+ """
593
+
594
+ return self._gradient_type
595
+
596
+
597
+ def DrawSeparator(self, dc, rect, isVertical):
598
+ """
599
+ Draws a separator in :class:`ButtonPanel`.
600
+
601
+ :param `dc`: an instance of :class:`wx.DC`;
602
+ :param wx.Rect `rect`: the separator client rectangle;
603
+ :param bool `isVertical`: ``True`` if :class:`ButtonPanel` is in vertical orientation,
604
+ ``False`` otherwise.
605
+ """
606
+
607
+ dc.SetPen(self._separator_pen)
608
+
609
+ if isVertical:
610
+ ystart = yend = rect.y + rect.height//2
611
+ xstart = int(rect.x + 1.5*self._caption_border_size)
612
+ xend = int(rect.x + rect.width - 1.5*self._caption_border_size)
613
+ dc.DrawLine(xstart, ystart, xend, yend)
614
+ else:
615
+ xstart = xend = rect.x + rect.width//2
616
+ ystart = int(rect.y + 1.5*self._caption_border_size)
617
+ yend = int(rect.y + rect.height - 1.5*self._caption_border_size)
618
+ dc.DrawLine(xstart, ystart, xend, yend)
619
+
620
+
621
+ def DrawCaption(self, dc, rect, captionText):
622
+ """
623
+ Draws the main caption text in :class:`ButtonPanel`.
624
+
625
+ :param `dc`: an instance of :class:`wx.DC`;
626
+ :param wx.Rect `rect`: the main caption text rectangle;
627
+ :param string `captionText`: the caption text string.
628
+ """
629
+
630
+ textColour = self._caption_text_colour
631
+ textFont = self._caption_font
632
+ padding = self._padding_size
633
+
634
+ dc.SetTextForeground(textColour)
635
+ dc.SetFont(textFont)
636
+
637
+ dc.DrawText(captionText, rect.x + padding.x, rect.y+padding.y)
638
+
639
+
640
+ def DrawButton(self, dc, rect, buttonBitmap, isVertical, buttonStatus,
641
+ isToggled, textAlignment, text=""):
642
+ """
643
+ Draws a button in :class:`ButtonPanel`, together with its text (if any).
644
+
645
+ :param `dc`: an instance of :class:`wx.DC`;
646
+ :param wx.Rect `rect`: the button client rectangle;
647
+ :param wx.Bitmap `buttonBitmap`: the bitmap associated with the button;
648
+ :param bool `isVertical`: ``True`` if :class:`ButtonPanel` is in vertical orientation,
649
+ ``False`` otherwise;
650
+ :param string `buttonStatus`: one of "Normal", "Toggled", "Pressed", "Disabled" or "Hover";
651
+ :param bool `isToggled`: whether the button is toggled or not;
652
+ :param integer `textAlignment`: the text alignment inside the button;
653
+ :param string `text`: the button label.
654
+ """
655
+
656
+ bmpxsize, bmpysize = buttonBitmap.GetWidth(), buttonBitmap.GetHeight()
657
+ dx = dy = focus = 0
658
+
659
+ borderw = self._caption_border_size
660
+ padding = self._padding_size
661
+
662
+ buttonFont = self._buttontext_font
663
+ dc.SetFont(buttonFont)
664
+
665
+ if isVertical:
666
+
667
+ rect = wx.Rect(borderw, rect.y, rect.width-2*borderw, rect.height)
668
+
669
+ if text != "":
670
+
671
+ textW, textH = dc.GetTextExtent(text)
672
+
673
+ if textAlignment == BP_BUTTONTEXT_ALIGN_RIGHT:
674
+ fullExtent = bmpxsize + padding.x//2 + textW
675
+ bmpypos = rect.y + (rect.height - bmpysize)//2
676
+ bmpxpos = rect.x + (rect.width - fullExtent)//2
677
+ textxpos = bmpxpos + padding.x//2 + bmpxsize
678
+ textypos = bmpypos + (bmpysize - textH)//2
679
+ else:
680
+ bmpxpos = rect.x + (rect.width - bmpxsize)//2
681
+ bmpypos = rect.y + padding.y
682
+ textxpos = rect.x + (rect.width - textW)//2
683
+ textypos = bmpypos + bmpysize + padding.y//2
684
+ else:
685
+ bmpxpos = rect.x + (rect.width - bmpxsize)//2
686
+ bmpypos = rect.y + (rect.height - bmpysize)//2
687
+
688
+
689
+ else:
690
+
691
+ rect = wx.Rect(rect.x, borderw, rect.width, rect.height-2*borderw)
692
+
693
+ if text != "":
694
+
695
+ textW, textH = dc.GetTextExtent(text)
696
+
697
+ if textAlignment == BP_BUTTONTEXT_ALIGN_RIGHT:
698
+ fullExtent = bmpxsize + padding.x//2 + textW
699
+ bmpypos = rect.y + (rect.height - bmpysize)//2
700
+ bmpxpos = rect.x + (rect.width - fullExtent)//2
701
+ textxpos = bmpxpos + padding.x//2 + bmpxsize
702
+ textypos = bmpypos + (bmpysize - textH)//2
703
+ else:
704
+ fullExtent = bmpysize + padding.y//2 + textH
705
+ bmpxpos = rect.x + (rect.width - bmpxsize)//2
706
+ bmpypos = rect.y + (rect.height - fullExtent)//2
707
+ textxpos = rect.x + (rect.width - textW)//2
708
+ textypos = bmpypos + bmpysize + padding.y//2
709
+ else:
710
+ bmpxpos = rect.x + (rect.width - bmpxsize)//2
711
+ bmpypos = rect.y + (rect.height - bmpysize)//2
712
+
713
+ # Draw a button
714
+ # [ Padding | Text | .. Buttons .. | Padding ]
715
+
716
+ if buttonStatus in ["Pressed", "Toggled", "Hover"]:
717
+ dc.SetBrush(self._selection_brush)
718
+ dc.SetPen(self._selection_pen)
719
+ dc.DrawRoundedRectangle(rect, 4)
720
+
721
+ if buttonStatus == "Pressed" or isToggled:
722
+ dx = dy = 1
723
+
724
+ if buttonBitmap:
725
+ dc.DrawBitmap(buttonBitmap, bmpxpos+dx, bmpypos+dy, True)
726
+
727
+ if text != "":
728
+ isEnabled = buttonStatus != "Disabled"
729
+ self.DrawLabel(dc, text, isEnabled, textxpos+dx, textypos+dy)
730
+
731
+
732
+ def DrawLabel(self, dc, text, isEnabled, xpos, ypos):
733
+ """
734
+ Draws the label for a button.
735
+
736
+ :param `dc`: an instance of :class:`wx.DC`;
737
+ :param string `text`: the button label;
738
+ :param bool `isEnabled`: ``True`` if the button is enabled, ``False`` otherwise;
739
+ :param integer `xpos`: the text `x` position inside the button;
740
+ :param integer `ypos`: the text `y` position inside the button.
741
+ """
742
+
743
+ if not isEnabled:
744
+ dc.SetTextForeground(self._buttontext_inactive_colour)
745
+ else:
746
+ dc.SetTextForeground(self._buttontext_colour)
747
+
748
+ dc.DrawText(text, xpos, ypos)
749
+
750
+
751
+ def DrawButtonPanel(self, dc, rect, style):
752
+ """
753
+ Paint the :class:`ButtonPanel`'s background.
754
+
755
+ :param `dc`: an instance of :class:`wx.DC`;
756
+ :param wx.Rect `rect`: the :class:`ButtonPanel` client rectangle;
757
+ :param integer `style`: the :class:`ButtonPanel` window style.
758
+ """
759
+
760
+ if style & BP_USE_GRADIENT:
761
+ # Draw gradient colour in the backgroud of the panel
762
+ self.FillGradientColour(dc, rect)
763
+
764
+ # Draw a rectangle around the panel
765
+ backBrush = (style & BP_USE_GRADIENT and [wx.TRANSPARENT_BRUSH] or \
766
+ [self._background_brush])[0]
767
+
768
+ dc.SetBrush(backBrush)
769
+ dc.SetPen(self._border_pen)
770
+ dc.DrawRectangle(rect)
771
+
772
+
773
+ def FillGradientColour(self, dc, rect):
774
+ """
775
+ Gradient fill from colour 1 to colour 2 with top to bottom or left to right.
776
+
777
+ :param `dc`: an instance of :class:`wx.DC`;
778
+ :param wx.Rect `rect`: the :class:`ButtonPanel` client rectangle.
779
+ """
780
+
781
+ if rect.height < 1 or rect.width < 1:
782
+ return
783
+
784
+ isVertical = self._gradient_type == BP_GRADIENT_VERTICAL
785
+ size = (isVertical and [rect.height] or [rect.width])[0]
786
+ start = (isVertical and [rect.y] or [rect.x])[0]
787
+
788
+ # calculate gradient coefficients
789
+
790
+ col2 = self._gradient_colour_from
791
+ col1 = self._gradient_colour_to
792
+
793
+ rf, gf, bf = 0, 0, 0
794
+ rstep = float((col2.Red() - col1.Red()))/float(size)
795
+ gstep = float((col2.Green() - col1.Green()))/float(size)
796
+ bstep = float((col2.Blue() - col1.Blue()))/float(size)
797
+
798
+ for coord in range(start, start + size):
799
+
800
+ currCol = wx.Colour(col1.Red() + int(rf), col1.Green() + int(gf), col1.Blue() + int(bf))
801
+ dc.SetBrush(wx.Brush(currCol, wx.BRUSHSTYLE_SOLID))
802
+ dc.SetPen(wx.Pen(currCol))
803
+ if isVertical:
804
+ dc.DrawLine(rect.x, coord, rect.x + rect.width, coord)
805
+ else:
806
+ dc.DrawLine(coord, rect.y, coord, rect.y + rect.height)
807
+
808
+ rf += rstep
809
+ gf += gstep
810
+ bf += bstep
811
+
812
+
813
+ class StatusBarTimer(wx.Timer):
814
+ """ Timer used for deleting :class:`StatusBar` long help after ``_DELAY`` seconds."""
815
+
816
+ def __init__(self, owner):
817
+ """
818
+ Default class constructor.
819
+ For internal use: do not call it in your code!
820
+
821
+ :param `owner`: an instance of :class:`ButtonPanel`.
822
+ """
823
+
824
+ wx.Timer.__init__(self)
825
+ self._owner = owner
826
+
827
+
828
+ def Notify(self):
829
+ """ The timer has expired. """
830
+
831
+ self._owner.OnStatusBarTimer()
832
+
833
+
834
+ class Control(wx.EvtHandler):
835
+ """
836
+ This class represents a base class for all pseudo controls used in
837
+ :class:`ButtonPanel`.
838
+ """
839
+
840
+ def __init__(self, parent, size=wx.Size(-1, -1), id=wx.ID_ANY):
841
+ """
842
+ Default class constructor.
843
+
844
+ :param wx.Window `parent`: the control parent object. Must not be ``None``;
845
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
846
+ chosen by either the windowing system or wxPython, depending on platform;
847
+ :type `size`: tuple or :class:`wx.Size`
848
+ :param integer `id`: window identifier. A value of -1 indicates a default value.
849
+ """
850
+
851
+ wx.EvtHandler.__init__(self)
852
+
853
+ self._parent = parent
854
+
855
+ if id == wx.ID_ANY:
856
+ self._id = wx.NewIdRef()
857
+ else:
858
+ self._id = id
859
+
860
+ self._size = size
861
+ self._isshown = True
862
+ self._focus = False
863
+
864
+
865
+ def Show(self, show=True):
866
+ """
867
+ Shows or hide the control.
868
+
869
+ :param bool `show`: If ``True`` displays the window. Otherwise, it hides it.
870
+ """
871
+
872
+ self._isshown = show
873
+
874
+
875
+ def Hide(self):
876
+ """
877
+ Hides the control.
878
+
879
+ :note: This is functionally equivalent of calling :meth:`~Control.Show` with a ``False`` input.
880
+ """
881
+
882
+ self.Show(False)
883
+
884
+
885
+ def IsShown(self):
886
+ """ Returns ``True`` if the window is shown, ``False`` if it has been hidden. """
887
+
888
+ return self._isshown
889
+
890
+
891
+ def GetId(self):
892
+ """
893
+ Returns the identifier of the window.
894
+
895
+ :return: An integer representing the identifier of the window.
896
+
897
+ :note: Each window has an integer identifier. If the application has not provided
898
+ one (or the default ``wx.ID_ANY``) an unique identifier with a negative value will
899
+ be generated.
900
+ """
901
+
902
+ return self._id
903
+
904
+
905
+ def GetBestSize(self):
906
+ """
907
+ This functions returns the best acceptable minimal size for the window. For
908
+ example, for a static control, it will be the minimal size such that the control
909
+ label is not truncated. For windows containing subwindows (typically :class:`Panel`),
910
+ the size returned by this function will be the same as the size the window would
911
+ have had after calling `Fit()`.
912
+
913
+ :return: An instance of :class:`wx.Size`.
914
+ """
915
+
916
+ return self._size
917
+
918
+
919
+ def Disable(self):
920
+ """
921
+ Disables the control.
922
+
923
+ :returns: ``True`` if the window has been disabled, ``False`` if it had been
924
+ already disabled before the call to this function.
925
+
926
+ :note: This is functionally equivalent of calling :meth:`~Control.Enable` with a ``False`` flag.
927
+ """
928
+
929
+ return self.Enable(False)
930
+
931
+
932
+ def Enable(self, enable=True):
933
+ """
934
+ Enable or disable the window for user input.
935
+
936
+ :param bool `enable`: If ``True``, enables the window for input. If ``False``, disables the window.
937
+
938
+ :returns: ``True`` if the window has been enabled or disabled, ``False`` if nothing was
939
+ done, i.e. if the window had already been in the specified state.
940
+
941
+ :note: Note that when a parent window is disabled, all of its children are disabled as
942
+ well and they are reenabled again when the parent is.
943
+ """
944
+
945
+ self.disabled = not enable
946
+ return True
947
+
948
+
949
+ def SetFocus(self, focus=True):
950
+ """
951
+ Sets or kills the focus on the control.
952
+
953
+ :param bool `focus`: whether the control can receive keyboard inputs or not.
954
+ """
955
+
956
+ self._focus = focus
957
+
958
+
959
+ def HasFocus(self):
960
+ """
961
+ Returns whether the control has the focus or not.
962
+
963
+ :return: ``True`` if the control has the focus, ``False`` otherwise.
964
+ """
965
+
966
+ return self._focus
967
+
968
+
969
+ def OnMouseEvent(self, x, y, event):
970
+ """
971
+ Handles the ``wx.EVT_MOUSE_EVENTS`` events for the control.
972
+
973
+ :param integer `x`: the mouse `x` position;
974
+ :param integer `y`: the mouse `y` position;
975
+ :param `event`: the :class:`MouseEvent` event to be processed.
976
+ """
977
+
978
+ pass
979
+
980
+
981
+ def Draw(self, rect):
982
+ """
983
+ Handles the drawing of the control.
984
+
985
+ :param wx.Rect `rect`: the control client rectangle.
986
+ """
987
+
988
+ pass
989
+
990
+
991
+ class Sizer(object):
992
+ """
993
+ This is a mix-in class to add pseudo support to :class:`wx.Sizer`. Just create
994
+ a new class that derives from this class and :class:`wx.Sizer` and intercepts
995
+ any methods that add to the wx sizer.
996
+ """
997
+
998
+ def __init__(self):
999
+ """
1000
+ Default class constructor.
1001
+ For internal use: do not call it in your code!
1002
+ """
1003
+
1004
+ self.children = [] # list of child Pseudo Controls
1005
+
1006
+ # Sizer doesn't use the x1,y1,x2,y2 so allow it to
1007
+ # be called with or without the coordinates
1008
+ def Draw(self, dc, x1=0, y1=0, x2=0, y2=0):
1009
+ """ Draws all the children of the sizer. """
1010
+
1011
+ for item in self.children:
1012
+ # use sizer coordinates rather than
1013
+ # what is passed in
1014
+ c = item.GetUserData()
1015
+ c.Draw(dc, item.GetRect())
1016
+
1017
+
1018
+ def GetBestSize(self):
1019
+ """
1020
+ This functions returns the best acceptable minimal size for the sizer object.
1021
+
1022
+ :return: An instance of :class:`wx.Size`.
1023
+ """
1024
+
1025
+ # this should be handled by the wx.Sizer based class
1026
+ return self.GetMinSize()
1027
+
1028
+
1029
+ # Pseudo BoxSizer
1030
+ class BoxSizer(Sizer, wx.BoxSizer):
1031
+ """ Pseudo-class that imitates :class:`BoxSizer`. """
1032
+
1033
+ def __init__(self, orient=wx.HORIZONTAL):
1034
+ """
1035
+ Constructor for :class:`BoxSizer`.
1036
+
1037
+ :param integer `orient`: may be one of ``wx.VERTICAL`` or ``wx.HORIZONTAL`` for creating
1038
+ either a column sizer or a row sizer.
1039
+ """
1040
+
1041
+ wx.BoxSizer.__init__(self, orient)
1042
+ Sizer.__init__(self)
1043
+
1044
+ #-------------------------------------------
1045
+ # sizer overrides (only called from Python)
1046
+ #-------------------------------------------
1047
+ # no support for user data if it's a pseudocontrol
1048
+ # since that is already used
1049
+ def Add(self, item, proportion=0, flag=0, border=0, userData=None):
1050
+ """
1051
+ Appends a child item to the sizer.
1052
+
1053
+ :param `item`: the item to be added to :class:`BoxSizer`. Can be an instance of :class:`wx.Window`,
1054
+ :class:`wx.Sizer` or a spacer;
1055
+ :param integer `proportion`: this parameter is used in :class:`BoxSizer` to indicate if a child of
1056
+ a sizer can change its size in the main orientation of the :class:`BoxSizer` - where 0
1057
+ stands for not changeable and a value of more than zero is interpreted relative
1058
+ to the value of other children of the same :class:`BoxSizer`. For example, you might have
1059
+ a horizontal :class:`BoxSizer` with three children, two of which are supposed to change their
1060
+ size with the sizer. Then the two stretchable windows would get a value of 1 each to
1061
+ make them grow and shrink equally with the sizer's horizontal dimension.
1062
+ :param integer `flag`: this parameter can be used to set a number of flags which can be combined using the binary OR operator ``|``.
1063
+ Two main behaviours are defined using these flags. One is the border around a window: the border parameter determines the border
1064
+ width whereas the flags given here determine which side(s) of the item that the border will be added. The other flags determine
1065
+ how the sizer item behaves when the space allotted to the sizer changes, and is somewhat dependent on the specific kind of sizer used:
1066
+
1067
+ +-----------------------------------------------------------------------+------------------------------------------------------------------------------+
1068
+ | Sizer Flag | Description |
1069
+ +=======================================================================+==============================================================================+
1070
+ | | ``wx.TOP`` | These flags are used to specify which side(s) of the sizer |
1071
+ | | ``wx.BOTTOM`` | item the border width will apply to. |
1072
+ | | ``wx.LEFT`` | |
1073
+ | | ``wx.RIGHT`` | |
1074
+ | | ``wx.ALL`` | |
1075
+ +-----------------------------------------------------------------------+------------------------------------------------------------------------------+
1076
+ | ``wx.EXPAND`` | The item will be expanded to fill the space assigned to |
1077
+ | | the item. |
1078
+ +-----------------------------------------------------------------------+------------------------------------------------------------------------------+
1079
+ | ``wx.SHAPED`` | The item will be expanded as much as possible while also |
1080
+ | | maintaining its aspect ratio |
1081
+ +-----------------------------------------------------------------------+------------------------------------------------------------------------------+
1082
+ | ``wx.FIXED_MINSIZE`` | Normally :class:`wx.Sizer` will use |
1083
+ | | :meth:`wx.Window.GetEffectiveMinSize` to |
1084
+ | | determine what the minimal size of window items should be, and will use that |
1085
+ | | size to calculate the layout. This allows layouts to adjust when an item |
1086
+ | | changes and its best size becomes different. If you would rather have a |
1087
+ | | window item stay the size it started with then use ``wx.FIXED_MINSIZE``. |
1088
+ +-----------------------------------------------------------------------+------------------------------------------------------------------------------+
1089
+ | ``wx.RESERVE_SPACE_EVEN_IF_HIDDEN`` | Normally `Sizers` don't allocate space for hidden windows or other items. |
1090
+ | | This flag overrides this behavior so that sufficient space is allocated for |
1091
+ | | the window even if it isn't visible. This makes it possible to dynamically |
1092
+ | | show and hide controls without resizing parent dialog, for example. This |
1093
+ | | function is new since wxWidgets version 2.8.8 |
1094
+ +-----------------------------------------------------------------------+------------------------------------------------------------------------------+
1095
+ | | ``wx.ALIGN_CENTER`` **or** ``wx.ALIGN_CENTRE`` | The ``wx.ALIGN*`` flags allow you to specify the alignment of the item |
1096
+ | | ``wx.ALIGN_LEFT`` | within the space allotted to it by the sizer, adjusted for the border if |
1097
+ | | ``wx.ALIGN_RIGHT`` | any. |
1098
+ | | ``wx.ALIGN_TOP`` | |
1099
+ | | ``wx.ALIGN_BOTTOM`` | |
1100
+ | | ``wx.ALIGN_CENTER_VERTICAL`` **or** ``wx.ALIGN_CENTRE_VERTICAL`` | |
1101
+ | | ``wx.ALIGN_CENTER_HORIZONTAL`` **or** ``wx.ALIGN_CENTRE_HORIZONTAL``| |
1102
+ +-----------------------------------------------------------------------+------------------------------------------------------------------------------+
1103
+
1104
+ :param integer `border`: determines the border width, if the flag parameter is set
1105
+ to include any border flag.
1106
+ :param object `userData`: Allows an extra object to be attached to the sizer item,
1107
+ for use in derived classes when sizing information is more complex than the
1108
+ proportion and flag will allow for.
1109
+
1110
+ :note: there is no support for `userData` parameter if `item` is a pseudocontrol,
1111
+ since that is already used.
1112
+ """
1113
+
1114
+ # check to see if it's a pseudo object or sizer
1115
+ if isinstance(item, Sizer):
1116
+ szitem = wx.BoxSizer.Add(self, item, proportion, flag, border, item)
1117
+ self.children.append(szitem)
1118
+ elif isinstance(item, Control): # Control should be what ever class your controls come from
1119
+ sz = item.GetBestSize()
1120
+ # add a spacer to track this object
1121
+ szitem = wx.BoxSizer.Add(self, sz, proportion, flag, border, item)
1122
+ self.children.append(szitem)
1123
+ else:
1124
+ wx.BoxSizer.Add(self, item, proportion, flag, border, userData)
1125
+
1126
+
1127
+ def Prepend(self, item, proportion=0, flag=0, border=0, userData=None):
1128
+ """
1129
+ Prepends a child item to the sizer.
1130
+
1131
+ :see: :meth:`BoxSizer.Add` method for an explanation of the input parameters.
1132
+ """
1133
+
1134
+ # check to see if it's a pseudo object or sizer
1135
+ if isinstance(item, Sizer):
1136
+ szitem = wx.BoxSizer.Prepend(self, item, proportion, flag, border, item)
1137
+ self.children.append(szitem)
1138
+ elif isinstance(item, Control): # Control should be what ever class your controls come from
1139
+ sz = item.GetBestSize()
1140
+ # add a spacer to track this object
1141
+ szitem = wx.BoxSizer.Prepend(self, sz, proportion, flag, border, item)
1142
+ self.children.insert(0,szitem)
1143
+ else:
1144
+ wx.BoxSizer.Prepend(self, item, proportion, flag, border, userData)
1145
+
1146
+
1147
+ def Insert(self, before, item, proportion=0, flag=0, border=0, userData=None, realIndex=None):
1148
+ """
1149
+ Inserts a child item into the sizer.
1150
+
1151
+ :see: :meth:`BoxSizer.Add` method for an explanation of the input parameters.
1152
+ """
1153
+
1154
+ # check to see if it's a pseudo object or sizer
1155
+ if isinstance(item, Sizer):
1156
+ szitem = wx.BoxSizer.Insert(self, before, item, proportion, flag, border, item)
1157
+ self.children.append(szitem)
1158
+ elif isinstance(item, Control): # Control should be what ever class your controls come from
1159
+ sz = item.GetBestSize()
1160
+ # add a spacer to track this object
1161
+ szitem = wx.BoxSizer.Insert(self, before, sz, proportion, flag, border, item)
1162
+ if realIndex is not None:
1163
+ self.children.insert(realIndex,szitem)
1164
+ else:
1165
+ self.children.insert(before,szitem)
1166
+
1167
+ else:
1168
+ wx.BoxSizer.Insert(self, before, item, proportion, flag, border, userData)
1169
+
1170
+
1171
+ def Remove(self, indx, pop=-1):
1172
+ """
1173
+ Removes an item from the sizer and destroys it.
1174
+
1175
+ This method does not cause any layout or resizing to take place, call
1176
+ :meth:`BoxSizer.Layout() <BoxSizer.Layout>` to update the layout on screen after removing a child from
1177
+ the sizer.
1178
+
1179
+ :param integer `indx`: the zero-based index of an item to remove;
1180
+ :param bool `pop`: whether to remove the sizer item from the list of children.
1181
+ """
1182
+
1183
+ if pop >= 0:
1184
+ self.children.pop(pop)
1185
+
1186
+ wx.BoxSizer.Remove(self, indx)
1187
+
1188
+
1189
+ def Layout(self):
1190
+ """
1191
+ Call this to force layout of the children anew, e.g. after having added a
1192
+ child to or removed a child (window, other sizer or space) from the sizer
1193
+ while keeping the current dimension.
1194
+ """
1195
+
1196
+ for ii, child in enumerate(self.GetChildren()):
1197
+ item = child.GetUserData()
1198
+ if item and child.IsShown():
1199
+ self.SetItemMinSize(ii, *item.GetBestSize())
1200
+
1201
+ wx.BoxSizer.Layout(self)
1202
+
1203
+
1204
+ def Show(self, item, show=True):
1205
+ """
1206
+ Shows or hides the sizer item.
1207
+
1208
+ :param `item`: the sizer item we want to show/hide;
1209
+ :param bool `show`: ``True`` to show the item, ``False`` to hide it.
1210
+ """
1211
+
1212
+ child = self.GetChildren()[item]
1213
+ if child and child.GetUserData():
1214
+ child.GetUserData().Show(show)
1215
+
1216
+ wx.BoxSizer.Show(self, item, show)
1217
+
1218
+
1219
+ # ---------------------------------------------------------------------------- #
1220
+ # Class Separator
1221
+ # This class holds all the information to size and draw a separator inside
1222
+ # ButtonPanel
1223
+ # ---------------------------------------------------------------------------- #
1224
+
1225
+ class Separator(Control):
1226
+ """
1227
+ This class holds all the information to size and draw a separator inside
1228
+ :class:`ButtonPanel`.
1229
+ """
1230
+
1231
+ def __init__(self, parent):
1232
+ """
1233
+ Default class constructor.
1234
+
1235
+ :param `parent`: the separator parent object, an instance of :class:`ButtonPanel`.
1236
+ """
1237
+
1238
+ self._isshown = True
1239
+ self._parent = parent
1240
+ Control.__init__(self, parent)
1241
+
1242
+
1243
+ def GetBestSize(self):
1244
+ """
1245
+ Returns the separator best size.
1246
+
1247
+ :return: An instance of :class:`wx.Size`.
1248
+ """
1249
+
1250
+ # 10 is completely arbitrary, but it works anyhow
1251
+ if self._parent.IsVertical():
1252
+ return wx.Size(10, self._parent._art.GetMetric(BP_SEPARATOR_SIZE))
1253
+ else:
1254
+ return wx.Size(self._parent._art.GetMetric(BP_SEPARATOR_SIZE), 10)
1255
+
1256
+
1257
+ def Draw(self, dc, rect):
1258
+ """
1259
+ Draws the separator. Actually the drawing is done in :class:`BPArt`.
1260
+
1261
+ :param `dc`: an instance of :class:`wx.DC`;
1262
+ :param wx.Rect `rect`: the separator client rectangle.
1263
+ """
1264
+
1265
+ if not self.IsShown():
1266
+ return
1267
+
1268
+ isVertical = self._parent.IsVertical()
1269
+ self._parent._art.DrawSeparator(dc, rect, isVertical)
1270
+
1271
+
1272
+ # ---------------------------------------------------------------------------- #
1273
+ # Class ButtonPanelText
1274
+ # This class is used to hold data about the main caption in ButtonPanel
1275
+ # ---------------------------------------------------------------------------- #
1276
+
1277
+ class ButtonPanelText(Control):
1278
+ """ This class is used to hold data about the main caption in :class:`ButtonPanel`. """
1279
+
1280
+ def __init__(self, parent, text=""):
1281
+ """
1282
+ Default class constructor.
1283
+
1284
+ :param `parent`: the text parent object, an instance of :class:`ButtonPanel`;
1285
+ :param string `text`: the actual main caption string.
1286
+ """
1287
+
1288
+ self._text = text
1289
+ self._isshown = True
1290
+ self._parent = parent
1291
+
1292
+ Control.__init__(self, parent)
1293
+
1294
+
1295
+ def GetText(self):
1296
+ """
1297
+ Returns the caption text.
1298
+
1299
+ :return: A string representing the caption text.
1300
+ """
1301
+
1302
+ return self._text
1303
+
1304
+
1305
+ def SetText(self, text=""):
1306
+ """
1307
+ Sets the caption text.
1308
+
1309
+ :param string `text`: the main caption string.
1310
+ """
1311
+
1312
+ self._text = text
1313
+
1314
+
1315
+ def CreateDC(self):
1316
+ """ Convenience function to create a :class:`wx.DC`. """
1317
+
1318
+ dc = wx.ClientDC(self._parent)
1319
+ textFont = self._parent._art.GetFont(BP_TEXT_FONT)
1320
+ dc.SetFont(textFont)
1321
+
1322
+ return dc
1323
+
1324
+
1325
+ def GetBestSize(self):
1326
+ """
1327
+ Returns the best size for the main caption in :class:`ButtonPanel`.
1328
+
1329
+ :return: An instance of :class:`wx.Size`.
1330
+ """
1331
+
1332
+ if self._text == "":
1333
+ return wx.Size(0, 0)
1334
+
1335
+ dc = self.CreateDC()
1336
+ rect = self._parent.GetClientRect()
1337
+
1338
+ tw, th = dc.GetTextExtent(self._text)
1339
+ padding = self._parent._art.GetMetric(BP_PADDING_SIZE)
1340
+ self._size = wx.Size(tw+2*padding.x, th+2*padding.y)
1341
+
1342
+ return self._size
1343
+
1344
+
1345
+ def Draw(self, dc, rect):
1346
+ """
1347
+ Draws the main caption. Actually the drawing is done in :class:`BPArt`.
1348
+
1349
+ :param `dc`: an instance of :class:`wx.DC`;
1350
+ :param wx.Rect `rect`: the main caption text client rectangle.
1351
+ """
1352
+
1353
+ if not self.IsShown():
1354
+ return
1355
+
1356
+ captionText = self.GetText()
1357
+ self._parent._art.DrawCaption(dc, rect, captionText)
1358
+
1359
+
1360
+ # -- ButtonInfo class implementation ----------------------------------------
1361
+ # This class holds information about every button that is added to
1362
+ # ButtonPanel. It is an auxiliary class that you should use
1363
+ # every time you add a button.
1364
+
1365
+ class ButtonInfo(Control):
1366
+ """
1367
+ This class holds information about every button that is added to
1368
+ :class:`ButtonPanel`. It is an auxiliary class that you should use
1369
+ every time you add a button.
1370
+ """
1371
+ def __init__(self, parent, id=wx.ID_ANY, bmp=wx.NullBitmap,
1372
+ status="Normal", text="", kind=wx.ITEM_NORMAL,
1373
+ shortHelp="", longHelp=""):
1374
+ """
1375
+ Default class constructor.
1376
+
1377
+ :param `parent`: the parent window (:class:`ButtonPanel`);
1378
+ :param integer `id`: the button id;
1379
+ :param wx.Bitmap `bmp`: the associated bitmap;
1380
+ :param string `status`: button status ("Pressed", "Hover", "Normal", "Toggled", "Disabled");
1381
+ :param string `text`: text to be displayed either below of to the right of the button;
1382
+ :param integer `kind`: button kind, may be ``wx.ITEM_NORMAL`` for standard buttons or
1383
+ ``wx.ITEM_CHECK`` for toggle buttons;
1384
+ :param string `shortHelp`: a short help to be shown in the button tooltip;
1385
+ :param string `longHelp`: this string is shown in the statusbar (if any) of the parent
1386
+ frame when the mouse pointer is inside the button.
1387
+ """
1388
+
1389
+ if id == wx.ID_ANY:
1390
+ id = wx.NewIdRef()
1391
+
1392
+ self._status = status
1393
+ self._rect = wx.Rect()
1394
+ self._text = text
1395
+ self._kind = kind
1396
+ self._toggle = False
1397
+ self._textAlignment = BP_BUTTONTEXT_ALIGN_BOTTOM
1398
+ self._shortHelp = shortHelp
1399
+ self._longHelp = longHelp
1400
+
1401
+ if bmp and bmp.IsOk():
1402
+ disabledbmp = MakeDisabledBitmap(bmp)
1403
+ else:
1404
+ disabledbmp = wx.NullBitmap
1405
+
1406
+ self._bitmaps = {"Normal": bmp, "Toggled": None, "Disabled": disabledbmp,
1407
+ "Hover": None, "Pressed": None}
1408
+
1409
+ Control.__init__(self, parent, id=id)
1410
+
1411
+
1412
+ def GetBestSize(self):
1413
+ """
1414
+ Returns the best size for the button.
1415
+
1416
+ :return: An instance of :class:`wx.Size`.
1417
+ """
1418
+
1419
+ xsize = self.GetBitmap().GetWidth()
1420
+ ysize = self.GetBitmap().GetHeight()
1421
+
1422
+ if self.HasText():
1423
+ # We have text in the button
1424
+ dc = wx.ClientDC(self._parent)
1425
+ normalFont = self._parent._art.GetFont(BP_BUTTONTEXT_FONT)
1426
+ dc.SetFont(normalFont)
1427
+ tw, th = dc.GetTextExtent(self.GetText())
1428
+
1429
+ if self.GetTextAlignment() == BP_BUTTONTEXT_ALIGN_BOTTOM:
1430
+ xsize = max(xsize, tw)
1431
+ ysize = ysize + th
1432
+ else:
1433
+ xsize = xsize + tw
1434
+ ysize = max(ysize, th)
1435
+
1436
+ border = self._parent._art.GetMetric(BP_BORDER_SIZE)
1437
+ padding = self._parent._art.GetMetric(BP_PADDING_SIZE)
1438
+
1439
+ if self._parent.IsVertical():
1440
+ xsize = xsize + 2*border
1441
+ else:
1442
+ ysize = ysize + 2*border
1443
+
1444
+ self._size = wx.Size(xsize+2*padding.x, ysize+2*padding.y)
1445
+
1446
+ return self._size
1447
+
1448
+
1449
+ def Draw(self, dc, rect):
1450
+ """
1451
+ Draws the button on :class:`ButtonPanel`. Actually the drawing is done in :class:`BPArt`.
1452
+
1453
+ :param `dc`: an instance of :class:`wx.DC`;
1454
+ :param wx.Rect `rect`: the main caption text client rectangle.
1455
+ """
1456
+
1457
+ if not self.IsShown():
1458
+ return
1459
+
1460
+ buttonBitmap = self.GetBitmap()
1461
+ isVertical = self._parent.IsVertical()
1462
+ text = self.GetText()
1463
+ buttonStatus = self.GetStatus()
1464
+ isToggled = self.GetToggled()
1465
+ textAlignment = self.GetTextAlignment()
1466
+
1467
+ self._parent._art.DrawButton(dc, rect, buttonBitmap, isVertical,
1468
+ buttonStatus, isToggled, textAlignment, text)
1469
+
1470
+ self.SetRect(rect)
1471
+
1472
+
1473
+ def CheckRefresh(self, status):
1474
+ """
1475
+ Checks whether a :class:`ButtonPanel` repaint is needed or not. This is a convenience function.
1476
+
1477
+ :param bool `status`: the status of a newly added :class:`ButtonInfo` or a change in the
1478
+ :class:`ButtonInfo` status.
1479
+ """
1480
+
1481
+ if status == self._status:
1482
+ self._parent.RefreshRect(self.GetRect())
1483
+
1484
+
1485
+ def SetBitmap(self, bmp, status="Normal"):
1486
+ """
1487
+ Sets the bitmap associated with this instance of :class:`ButtonInfo`.
1488
+
1489
+ :param `bmp`: a valid :class:`wx.Bitmap` object;
1490
+ :param string `status`: the :class:`ButtonInfo` status ("Pressed", "Hover", "Normal",
1491
+ "Toggled", "Disabled").
1492
+ """
1493
+
1494
+ self._bitmaps[status] = bmp
1495
+ self.CheckRefresh(status)
1496
+
1497
+
1498
+ def GetBitmap(self, status=None):
1499
+ """
1500
+ Returns the bitmap associated with this instance of :class:`ButtonInfo`.
1501
+
1502
+ :param string `status`: the :class:`ButtonInfo` status ("Pressed", "Hover", "Normal",
1503
+ "Toggled", "Disabled").
1504
+
1505
+ :return: An instance of :class:`wx.Bitmap`.
1506
+ """
1507
+
1508
+ if status is None:
1509
+ status = self._status
1510
+
1511
+ if not self.IsEnabled():
1512
+ status = "Disabled"
1513
+
1514
+ if self._bitmaps[status] is None:
1515
+ if self.GetToggled():
1516
+ if self._bitmaps["Toggled"] is not None:
1517
+ return self._bitmaps["Toggled"]
1518
+ return self._bitmaps["Normal"]
1519
+
1520
+ return self._bitmaps[status]
1521
+
1522
+
1523
+ def GetRect(self):
1524
+ """
1525
+ Returns the :class:`ButtonInfo` client rectangle.
1526
+
1527
+ :return: An instance of :class:`wx.Rect`.
1528
+ """
1529
+
1530
+ return self._rect
1531
+
1532
+
1533
+ def GetStatus(self):
1534
+ """
1535
+ Returns the :class:`ButtonInfo` status.
1536
+
1537
+ :return: A string containing the :class:`ButtonInfo` status (one of "Pressed", "Hover", "Normal",
1538
+ "Toggled", "Disabled").
1539
+ """
1540
+
1541
+ return self._status
1542
+
1543
+
1544
+ def GetId(self):
1545
+ """
1546
+ Returns the :class:`ButtonInfo` id.
1547
+
1548
+ :return: An integer representing the button id.
1549
+ """
1550
+
1551
+ return self._id
1552
+
1553
+
1554
+ def SetRect(self, rect):
1555
+ """
1556
+ Sets the :class:`ButtonInfo` client rectangle.
1557
+
1558
+ :param `rect`: an instance of :class:`wx.Rect`.
1559
+ """
1560
+
1561
+ self._rect = rect
1562
+
1563
+
1564
+ def SetStatus(self, status):
1565
+ """
1566
+ Sets the :class:`ButtonInfo` status.
1567
+
1568
+ :param string `status`: one of "Pressed", "Hover", "Normal", "Toggled", "Disabled".
1569
+ """
1570
+
1571
+ if status == self._status:
1572
+ return
1573
+
1574
+ if self.GetToggled() and status == "Normal":
1575
+ status = "Toggled"
1576
+
1577
+ self._status = status
1578
+ self._parent.RefreshRect(self.GetRect())
1579
+
1580
+
1581
+ def GetTextAlignment(self):
1582
+ """
1583
+ Returns the text alignment in the button (bottom or right).
1584
+
1585
+ :return: An integer representing the :class:`ButtonInfo` text alignment.
1586
+ """
1587
+
1588
+ return self._textAlignment
1589
+
1590
+
1591
+ def SetTextAlignment(self, alignment):
1592
+ """
1593
+ Sets the text alignment in the button (bottom or right).
1594
+
1595
+ :param integer `alignment`: the text alignment in this :class:`ButtonInfo` instance.
1596
+ """
1597
+
1598
+ if alignment == self._textAlignment:
1599
+ return
1600
+
1601
+ self._textAlignment = alignment
1602
+
1603
+
1604
+ def GetToggled(self):
1605
+ """
1606
+ Returns whether a ``wx.ITEM_CHECK`` button is toggled or not.
1607
+
1608
+ :return: ``True`` if the button is toggled, ``False`` otherwise.
1609
+ """
1610
+
1611
+ if self._kind == wx.ITEM_NORMAL:
1612
+ return False
1613
+
1614
+ return self._toggle
1615
+
1616
+
1617
+ def SetToggled(self, toggle=True):
1618
+ """
1619
+ Sets a ``wx.ITEM_CHECK`` button toggled/not toggled.
1620
+
1621
+ :param bool `toggle`: ``True`` to toggle the button, ``False`` otherwise.
1622
+ """
1623
+
1624
+ if self._kind == wx.ITEM_NORMAL:
1625
+ return
1626
+
1627
+ self._toggle = toggle
1628
+
1629
+
1630
+ def SetId(self, id):
1631
+ """
1632
+ Sets the :class:`ButtonInfo` identifier.
1633
+
1634
+ :param integer `id`: the identifier of the window.
1635
+ """
1636
+
1637
+ self._id = id
1638
+
1639
+
1640
+ def AddStatus(self, name="Custom", bmp=wx.NullBitmap):
1641
+ """
1642
+ Add a programmer-defined status in addition to the 5 default status:
1643
+
1644
+ - Normal;
1645
+ - Disabled;
1646
+ - Hover;
1647
+ - Pressed;
1648
+ - Toggled.
1649
+
1650
+ :param string `name`: the new status name;
1651
+ :param wx.Bitmap `bmp`: the bitmap associated with the new status.
1652
+ """
1653
+
1654
+ self._bitmaps.update({name: bmp})
1655
+
1656
+
1657
+ def Enable(self, enable=True):
1658
+ """
1659
+ Enables/disables this instance of :class:`ButtonInfo`.
1660
+
1661
+ :param bool `enable`: ``True`` to enable the button, ``False`` otherwise.
1662
+ """
1663
+
1664
+ if enable:
1665
+ self._status = "Normal"
1666
+ else:
1667
+ self._status = "Disabled"
1668
+
1669
+
1670
+ def IsEnabled(self):
1671
+ """
1672
+ Returns ``True`` if this instance of :class:`ButtonInfo` is enabled for input,
1673
+ ``False`` otherwise.
1674
+ """
1675
+
1676
+ return self._status != "Disabled"
1677
+
1678
+
1679
+ def SetText(self, text=""):
1680
+ """
1681
+ Sets the button label text.
1682
+
1683
+ :param string `text`: the button label string.
1684
+ """
1685
+
1686
+ self._text = text
1687
+
1688
+
1689
+ def GetText(self):
1690
+ """
1691
+ Returns the text associated to the button.
1692
+
1693
+ :return: A string containing the :class:`ButtonInfo` text.
1694
+ """
1695
+
1696
+ return self._text
1697
+
1698
+
1699
+ def HasText(self):
1700
+ """
1701
+ Returns whether the button has text or not.
1702
+
1703
+ :return: ``True`` if this :class:`ButtonInfo` instance has a label, ``False`` otherwise.
1704
+ """
1705
+
1706
+ return self._text != ""
1707
+
1708
+
1709
+ def SetKind(self, kind=wx.ITEM_NORMAL):
1710
+ """
1711
+ Sets the button type (standard or toggle).
1712
+
1713
+ :param integer `kind`: one of ``wx.ITEM_NORMAL``, ``wx.ITEM_CHECK``.
1714
+ """
1715
+
1716
+ self._kind = kind
1717
+
1718
+
1719
+ def GetKind(self):
1720
+ """
1721
+ Returns the button type (standard or toggle).
1722
+
1723
+ :return: An integer representing the button type, one of ``wx.ITEM_NORMAL``, ``wx.ITEM_CHECK``.
1724
+ """
1725
+
1726
+ return self._kind
1727
+
1728
+
1729
+ def SetShortHelp(self, help=""):
1730
+ """
1731
+ Sets the help string to be shown in a tooltip.
1732
+
1733
+ :param string `help`: the string for the short help.
1734
+ """
1735
+
1736
+ self._shortHelp = help
1737
+
1738
+
1739
+ def GetShortHelp(self):
1740
+ """
1741
+ Returns the help string shown in a tooltip.
1742
+
1743
+ :return: A string containing the :class:`ButtonInfo` short help string.
1744
+ """
1745
+
1746
+ return self._shortHelp
1747
+
1748
+
1749
+ def SetLongHelp(self, help=""):
1750
+ """
1751
+ Sets the help string to be shown in the statusbar.
1752
+
1753
+ :param string `help`: the string for the long help.
1754
+ """
1755
+
1756
+ self._longHelp = help
1757
+
1758
+
1759
+ def GetLongHelp(self):
1760
+ """
1761
+ Returns the help string shown in the statusbar.
1762
+
1763
+ :return: A string containing the :class:`ButtonInfo` long help string.
1764
+ """
1765
+
1766
+ return self._longHelp
1767
+
1768
+
1769
+ Bitmap = property(GetBitmap, SetBitmap)
1770
+ Id = property(GetId, SetId)
1771
+ Rect = property(GetRect, SetRect)
1772
+ Status = property(GetStatus, SetStatus)
1773
+
1774
+
1775
+ # -- ButtonPanel class implementation ----------------------------------
1776
+ # This is the main class.
1777
+
1778
+ class ButtonPanel(wx.Panel):
1779
+ """
1780
+ A custom panel class with gradient background shading with the possibility to
1781
+ add buttons and controls still respecting the gradient background.
1782
+ """
1783
+
1784
+ def __init__(self, parent, id=wx.ID_ANY, text="", agwStyle=BP_DEFAULT_STYLE,
1785
+ alignment=BP_ALIGN_LEFT, name="buttonPanel"):
1786
+ """
1787
+ Default class constructor.
1788
+
1789
+ :param wx.Window `parent`: the parent window. Must not be ``None``;
1790
+ :param integer `id`: window identifier. If ``wx.ID_ANY``, will automatically create an identifier;
1791
+ :param string `text`: the main caption text for :class:`ButtonPanel`;
1792
+ :param integer `agwStyle`: the AGW-specific window style (one of ``BP_DEFAULT_STYLE``, ``BP_USE_GRADIENT``);
1793
+ :param integer `alignment`: alignment of buttons (left or right);
1794
+ :param string `name`: window class name.
1795
+ """
1796
+
1797
+ wx.Panel.__init__(self, parent, id, wx.DefaultPosition, wx.DefaultSize,
1798
+ wx.NO_BORDER, name=name)
1799
+
1800
+ self._vButtons = []
1801
+ self._vSeparators = []
1802
+
1803
+ self._agwStyle = agwStyle
1804
+ self._alignment = alignment
1805
+ self._statusTimer = None
1806
+ self._useHelp = True
1807
+ self._freezeCount = 0
1808
+ self._currentButton = -1
1809
+ self._haveTip = False
1810
+
1811
+ self._art = BPArt(agwStyle)
1812
+
1813
+ self._controlCreated = False
1814
+
1815
+ direction = (self.IsVertical() and [wx.VERTICAL] or [wx.HORIZONTAL])[0]
1816
+ self._mainsizer = BoxSizer(direction)
1817
+ self.SetSizer(self._mainsizer)
1818
+
1819
+ margins = self._art.GetMetric(BP_MARGINS_SIZE)
1820
+
1821
+ # First spacer to create some room before the first text/button/control
1822
+ self._mainsizer.Add((margins.x, margins.y), 0)
1823
+
1824
+ # Last spacer to create some room before the last text/button/control
1825
+ self._mainsizer.Add((margins.x, margins.y), 0)
1826
+
1827
+ self.Bind(wx.EVT_SIZE, self.OnSize)
1828
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
1829
+ self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
1830
+ self.Bind(wx.EVT_MOTION, self.OnMouseMove)
1831
+ self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
1832
+ self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
1833
+ self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave)
1834
+ self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseEnterWindow)
1835
+
1836
+ self.SetBarText(text)
1837
+ self.LayoutItems()
1838
+
1839
+
1840
+ def SetBarText(self, text):
1841
+ """
1842
+ Sets the main caption text.
1843
+
1844
+ :param string `text`: the main caption text label. An empty string erases the
1845
+ main caption text.
1846
+ """
1847
+
1848
+ self.Freeze()
1849
+
1850
+ text = text.strip()
1851
+
1852
+ if self._controlCreated:
1853
+ self.RemoveText()
1854
+
1855
+ self._text = ButtonPanelText(self, text)
1856
+ lenChildren = len(self._mainsizer.GetChildren())
1857
+
1858
+ if text == "":
1859
+ # Even if we have no text, we insert it an empty spacer anyway
1860
+ # it is easier to handle if you have to recreate the sizer after.
1861
+ if self.IsStandard():
1862
+ self._mainsizer.Insert(1, self._text, 0, wx.ALIGN_CENTER,
1863
+ userData=self._text, realIndex=0)
1864
+ else:
1865
+ self._mainsizer.Insert(lenChildren-1, self._text, 0, wx.ALIGN_CENTER,
1866
+ userData=self._text, realIndex=lenChildren)
1867
+
1868
+ return
1869
+
1870
+ # We have text, so insert the text and an expandable spacer
1871
+ # alongside it. "Standard" ButtonPanel are left or top aligned.
1872
+ if self.IsStandard():
1873
+ self._mainsizer.Insert(1, self._text, 0, wx.ALIGN_CENTER,
1874
+ userData=self._text, realIndex=0)
1875
+ self._mainsizer.Insert(2, (0, 0), 1, wx.EXPAND)
1876
+
1877
+ else:
1878
+ self._mainsizer.Insert(lenChildren-1, self._text, 0, wx.ALIGN_CENTER,
1879
+ userData=self._text, realIndex=lenChildren)
1880
+ self._mainsizer.Insert(lenChildren-1, (0, 0), 1, wx.EXPAND)
1881
+
1882
+
1883
+ def RemoveText(self):
1884
+ """ Removes the main caption text. """
1885
+
1886
+ lenChildren = len(self._mainsizer.GetChildren())
1887
+ lenCustom = len(self._vButtons) + len(self._vSeparators) + 1
1888
+
1889
+ if self.IsStandard():
1890
+ # Detach the text
1891
+ self._mainsizer.Remove(1, 0)
1892
+ if self.HasBarText():
1893
+ # Detach the expandable spacer
1894
+ self._mainsizer.Remove(1, -1)
1895
+ else:
1896
+ # Detach the text
1897
+ self._mainsizer.Remove(lenChildren-2, lenCustom-1)
1898
+ if self.HasBarText():
1899
+ # Detach the expandable spacer
1900
+ self._mainsizer.Remove(lenChildren-3, -1)
1901
+
1902
+
1903
+ def GetBarText(self):
1904
+ """
1905
+ Returns the main caption text.
1906
+
1907
+ :return: A string representing the caption text.
1908
+ """
1909
+
1910
+ return self._text.GetText()
1911
+
1912
+
1913
+ def HasBarText(self):
1914
+ """
1915
+ Returns whether :class:`ButtonPanel` has a main caption text or not.
1916
+
1917
+ :return: ``True`` if :class:`ButtonPanel` has a main caption text, ``False`` otherwise.
1918
+ """
1919
+
1920
+ return hasattr(self, "_text") and self._text.GetText() != ""
1921
+
1922
+
1923
+ def AddButton(self, btnInfo):
1924
+ """
1925
+ Adds a button to :class:`ButtonPanel`.
1926
+
1927
+ :param `btnInfo`: an instance of :class:`ButtonInfo`.
1928
+
1929
+ :note: Remember to pass a :class:`ButtonInfo` instance to this method, and not a
1930
+ standard :class:`Button` or a :class:`ToolBar` tool.
1931
+ """
1932
+
1933
+ lenChildren = len(self._mainsizer.GetChildren())
1934
+ self._mainsizer.Insert(lenChildren-1, btnInfo, 0, wx.ALIGN_CENTER, userData=btnInfo)
1935
+
1936
+ self._vButtons.append(btnInfo)
1937
+
1938
+
1939
+ def AddSpacer(self, size=(0, 0), proportion=1, flag=wx.EXPAND):
1940
+ """
1941
+ Adds a spacer (stretchable or fixed-size) to :class:`ButtonPanel`.
1942
+
1943
+ :param tuple `size`: the spacer size as a tuple;
1944
+ :param integer `proportion`: the spacer proportion (0 for fixed-size, 1 or more for a
1945
+ stretchable one);
1946
+ :param integer `flag`: one of the :class:`BoxSizer` flags.
1947
+ """
1948
+
1949
+ lenChildren = len(self._mainsizer.GetChildren())
1950
+ self._mainsizer.Insert(lenChildren-1, size, proportion, flag)
1951
+
1952
+
1953
+ def AddControl(self, control, proportion=0, flag=wx.ALIGN_CENTER|wx.ALL, border=None):
1954
+ """
1955
+ Adds a wxPython control to :class:`ButtonPanel`.
1956
+
1957
+ :param `control`: an instance of :class:`wx.Window`;
1958
+ :param integer `proportion`: the control proportion (0 for fixed-size, 1 or more for a
1959
+ stretchable one);
1960
+ :param integer `flag`: one of the :class:`BoxSizer` flags;
1961
+ :param integer `border`: the control border width (in pixels), if the `flag` parameter
1962
+ is set to include any border flag.
1963
+ """
1964
+
1965
+ lenChildren = len(self._mainsizer.GetChildren())
1966
+
1967
+ if border is None:
1968
+ border = self._art.GetMetric(BP_PADDING_SIZE)
1969
+ border = max(border.x, border.y)
1970
+
1971
+ self._mainsizer.Insert(lenChildren-1, control, proportion, flag, border)
1972
+
1973
+
1974
+ def AddSeparator(self):
1975
+ """ Adds a separator line to :class:`ButtonPanel`. """
1976
+
1977
+ lenChildren = len(self._mainsizer.GetChildren())
1978
+ separator = Separator(self)
1979
+
1980
+ self._mainsizer.Insert(lenChildren-1, separator, 0, wx.EXPAND)
1981
+ self._vSeparators.append(separator)
1982
+
1983
+
1984
+ def RemoveAllButtons(self):
1985
+ """
1986
+ Remove all the buttons from :class:`ButtonPanel`.
1987
+
1988
+ :note: This function is for internal use only. If you are interested in
1989
+ manipulating a :class:`ButtonPanel` in real time (ie. removing things on it)
1990
+ have a look at the :meth:`~ButtonPanel.Clear` method.
1991
+ """
1992
+
1993
+ self._vButtons = []
1994
+
1995
+
1996
+ def RemoveAllSeparators(self):
1997
+ """
1998
+ Remove all the separators from :class:`ButtonPanel`.
1999
+
2000
+ :note: This function is for internal use only. If you are interested in
2001
+ manipulating a :class:`ButtonPanel` in real time (ie. removing things on it)
2002
+ have a look at the :meth:`~ButtonPanel.Clear` method.
2003
+ """
2004
+
2005
+ self._vSeparators = []
2006
+
2007
+
2008
+ def Clear(self):
2009
+ """
2010
+ Clears the :class:`ButtonPanel`.
2011
+
2012
+ Can be used to reset the :class:`ButtonPanel` if you'd like have a new set of
2013
+ buttons on the panel.
2014
+ """
2015
+
2016
+ if self.HasBarText():
2017
+ bartext = self.GetBarText()
2018
+ else:
2019
+ bartext = None
2020
+
2021
+ self.Freeze()
2022
+
2023
+ self._currentButton = -1
2024
+ self._mainsizer.Clear()
2025
+ self.ReCreateSizer(bartext)
2026
+
2027
+
2028
+ def GetAlignment(self):
2029
+ """
2030
+ Returns the buttons alignment.
2031
+
2032
+ :return: An integer specifying the buttons alignment.
2033
+
2034
+ :see: :meth:`~ButtonPanel.SetAlignment` for a set of valid alignment bits.
2035
+ """
2036
+
2037
+ return self._alignment
2038
+
2039
+
2040
+ def SetAlignment(self, alignment):
2041
+ """
2042
+ Sets the buttons alignment.
2043
+
2044
+ :param integer `alignment`: can be one of the following bits:
2045
+
2046
+ ====================== ======= ==========================
2047
+ Alignment Flag Value Description
2048
+ ====================== ======= ==========================
2049
+ ``BP_ALIGN_RIGHT`` 1 Buttons are aligned on the right
2050
+ ``BP_ALIGN_LEFT`` 2 Buttons are aligned on the left
2051
+ ``BP_ALIGN_TOP`` 4 Buttons are aligned at the top
2052
+ ``BP_ALIGN_BOTTOM`` 8 Buttons are aligned at the bottom
2053
+ ====================== ======= ==========================
2054
+ """
2055
+
2056
+ if alignment == self._alignment:
2057
+ return
2058
+
2059
+ self.Freeze()
2060
+
2061
+ text = self.GetBarText()
2062
+
2063
+ # Remove the text in any case
2064
+ self.RemoveText()
2065
+
2066
+ # Remove the first and last spacers
2067
+ self._mainsizer.Remove(0, -1)
2068
+ self._mainsizer.Remove(len(self._mainsizer.GetChildren())-1, -1)
2069
+
2070
+ self._alignment = alignment
2071
+
2072
+ # Recreate the sizer accordingly to the new alignment
2073
+ self.ReCreateSizer(text)
2074
+
2075
+
2076
+ def IsVertical(self):
2077
+ """
2078
+ Returns whether :class:`ButtonPanel` is vertically aligned or not.
2079
+
2080
+ :return: ``True`` if :class:`ButtonPanel` is vertically aligned, ``False`` otherwise.
2081
+ """
2082
+
2083
+ return self._alignment not in [BP_ALIGN_RIGHT, BP_ALIGN_LEFT]
2084
+
2085
+
2086
+ def IsStandard(self):
2087
+ """
2088
+ Returns whether :class:`ButtonPanel` is aligned "Standard" (left/top) or not.
2089
+
2090
+ :return: ``True`` if :class:`ButtonPanel` is aligned "standard", ``False`` otherwise.
2091
+ """
2092
+
2093
+ return self._alignment in [BP_ALIGN_LEFT, BP_ALIGN_TOP]
2094
+
2095
+
2096
+ def DoLayout(self):
2097
+ """
2098
+ Do the Layout for :class:`ButtonPanel`.
2099
+
2100
+ :note: Call this method every time you make a modification to the layout
2101
+ or to the customizable sizes of the pseudo controls.
2102
+ """
2103
+
2104
+ margins = self._art.GetMetric(BP_MARGINS_SIZE)
2105
+ lenChildren = len(self._mainsizer.GetChildren())
2106
+
2107
+ self._mainsizer.SetItemMinSize(0, (margins.x, margins.y))
2108
+ self._mainsizer.SetItemMinSize(lenChildren-1, (margins.x, margins.y))
2109
+
2110
+ self._controlCreated = True
2111
+ self.LayoutItems()
2112
+
2113
+ # *VERY* WEIRD: the sizer seems not to respond to any layout until I
2114
+ # change the ButtonPanel size and restore it back
2115
+ size = self.GetSize()
2116
+ self.SetSize((size.x+1, size.y+1))
2117
+ self.SetSize((size.x, size.y))
2118
+
2119
+ if self.IsFrozen():
2120
+ self.Thaw()
2121
+
2122
+
2123
+ def ReCreateSizer(self, text=None):
2124
+ """
2125
+ Recreates the :class:`ButtonPanel` sizer accordingly to the alignment specified.
2126
+
2127
+ :param string `text`: the text to display as main caption. If `text` is set to ``None``,
2128
+ the main caption will not be displayed.
2129
+ """
2130
+
2131
+ children = self._mainsizer.GetChildren()
2132
+ self.RemoveAllButtons()
2133
+ self.RemoveAllSeparators()
2134
+
2135
+ # Create a new sizer depending on the alignment chosen
2136
+ direction = (self.IsVertical() and [wx.VERTICAL] or [wx.HORIZONTAL])[0]
2137
+ self._mainsizer = BoxSizer(direction)
2138
+
2139
+ margins = self._art.GetMetric(BP_MARGINS_SIZE)
2140
+ # First spacer to create some room before the first text/button/control
2141
+ self._mainsizer.Add((margins.x, margins.y), 0)
2142
+
2143
+ # Last spacer to create some room before the last text/button/control
2144
+ self._mainsizer.Add((margins.x, margins.y), 0)
2145
+
2146
+ # This is needed otherwise SetBarText goes mad
2147
+ self._controlCreated = False
2148
+
2149
+ for child in children:
2150
+ userData = child.GetUserData()
2151
+ if userData:
2152
+ if isinstance(userData, ButtonInfo):
2153
+ # It is a ButtonInfo, can't be anything else
2154
+ self.AddButton(child.GetUserData())
2155
+ elif isinstance(userData, Separator):
2156
+ self.AddSeparator()
2157
+
2158
+ else:
2159
+ if child.IsSpacer():
2160
+ # This is a spacer, expandable or not
2161
+ self.AddSpacer(child.GetSize(), child.GetProportion(),
2162
+ child.GetFlag())
2163
+ else:
2164
+ # This is a wxPython control
2165
+ self.AddControl(child.GetWindow(), child.GetProportion(),
2166
+ child.GetFlag(), child.GetBorder())
2167
+
2168
+ self.SetSizer(self._mainsizer)
2169
+
2170
+ if text is not None:
2171
+ self.SetBarText(text)
2172
+
2173
+ self.DoLayout()
2174
+
2175
+ self.Thaw()
2176
+
2177
+
2178
+ def DoGetBestSize(self):
2179
+ """
2180
+ Gets the size which best suits :class:`ButtonPanel`: for a control, it would be
2181
+ the minimal size which doesn't truncate the control, for a panel - the
2182
+ same size as it would have after a call to `Fit()`.
2183
+
2184
+ :return: An instance of :class:`wx.Size`.
2185
+
2186
+ :note: Overridden from :class:`Panel`.
2187
+ """
2188
+
2189
+ w = h = btnWidth = btnHeight = 0
2190
+ isVertical = self.IsVertical()
2191
+
2192
+ padding = self._art.GetMetric(BP_PADDING_SIZE)
2193
+ border = self._art.GetMetric(BP_BORDER_SIZE)
2194
+ margins = self._art.GetMetric(BP_MARGINS_SIZE)
2195
+ separator_size = self._art.GetMetric(BP_SEPARATOR_SIZE)
2196
+
2197
+ # Add the space required for the main caption
2198
+ if self.HasBarText():
2199
+ w, h = self._text.GetBestSize()
2200
+ if isVertical:
2201
+ h += padding.y
2202
+ else:
2203
+ w += padding.x
2204
+ else:
2205
+ w = h = border
2206
+
2207
+ # Add the button's sizes
2208
+ for btn in self._vButtons:
2209
+
2210
+ bw, bh = btn.GetBestSize()
2211
+ btnWidth = max(btnWidth, bw)
2212
+ btnHeight = max(btnHeight, bh)
2213
+
2214
+ if isVertical:
2215
+ w = max(w, btnWidth)
2216
+ h += bh
2217
+ else:
2218
+ h = max(h, btnHeight)
2219
+ w += bw
2220
+
2221
+ # Add the control's sizes
2222
+ for control in self.GetControls():
2223
+ cw, ch = control.GetSize()
2224
+ if isVertical:
2225
+ h += ch
2226
+ w = max(w, cw)
2227
+ else:
2228
+ w += cw
2229
+ h = max(h, ch)
2230
+
2231
+ # Add the separator's sizes and the 2 SizerItems at the beginning
2232
+ # and at the end
2233
+ if self.IsVertical():
2234
+ h += 2*margins.y + len(self._vSeparators)*separator_size
2235
+ else:
2236
+ w += 2*margins.x + len(self._vSeparators)*separator_size
2237
+
2238
+ return wx.Size(w, h)
2239
+
2240
+
2241
+ def OnPaint(self, event):
2242
+ """
2243
+ Handles the ``wx.EVT_PAINT`` event for :class:`ButtonPanel`.
2244
+
2245
+ :param `event`: a :class:`PaintEvent` event to be processed.
2246
+ """
2247
+
2248
+ dc = wx.BufferedPaintDC(self)
2249
+ rect = self.GetClientRect()
2250
+
2251
+ self._art.DrawButtonPanel(dc, rect, self._agwStyle)
2252
+ self._mainsizer.Draw(dc)
2253
+
2254
+
2255
+ def OnEraseBackground(self, event):
2256
+ """
2257
+ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`ButtonPanel`.
2258
+
2259
+ :param `event`: a :class:`EraseEvent` event to be processed.
2260
+
2261
+ :note: This is intentionally empty to reduce flicker.
2262
+ """
2263
+
2264
+ pass
2265
+
2266
+
2267
+ def OnSize(self, event):
2268
+ """
2269
+ Handles the ``wx.EVT_SIZE`` event for :class:`ButtonPanel`.
2270
+
2271
+ :param `event`: a :class:`wx.SizeEvent` event to be processed.
2272
+
2273
+ .. todo::
2274
+
2275
+ Improve the chain of methods :meth:`~ButtonPanel.OnSize` ==> :meth:`~ButtonPanel.DoLayout` ==> :meth:`~ButtonPanel.LayoutItems`
2276
+ to avoid multiple calls to :meth:`~ButtonPanel.LayoutItems`.
2277
+ """
2278
+
2279
+ # NOTE: It seems like LayoutItems number of calls can be optimized in some way.
2280
+ # Currently every DoLayout (or every parent Layout()) calls about 3 times
2281
+ # the LayoutItems method. Any idea on how to improve it?
2282
+ self.LayoutItems()
2283
+ self.Refresh()
2284
+
2285
+ event.Skip()
2286
+
2287
+
2288
+ def LayoutItems(self):
2289
+ """
2290
+ Layout the items using a different algorithms depending on the existance
2291
+ of the main caption.
2292
+ """
2293
+
2294
+ nonspacers, allchildren = self.GetNonFlexibleChildren()
2295
+
2296
+ if self.HasBarText():
2297
+ self.FlexibleLayout(nonspacers, allchildren)
2298
+ else:
2299
+ self.SizeLayout(nonspacers, allchildren)
2300
+
2301
+ self._mainsizer.Layout()
2302
+
2303
+
2304
+ def SizeLayout(self, nonspacers, children):
2305
+ """
2306
+ Layout the items when no main caption exists.
2307
+
2308
+ :param list `nonspacers`: a list of items which are not spacers;
2309
+ :param list `children`: a list of all the children of :class:`ButtonPanel`.
2310
+ """
2311
+
2312
+ size = self.GetSize()
2313
+ isVertical = self.IsVertical()
2314
+
2315
+ corner = 0
2316
+ indx1 = len(nonspacers)
2317
+
2318
+ for item in nonspacers:
2319
+ corner += self.GetItemSize(item, isVertical)
2320
+ if corner > size[isVertical]:
2321
+ indx1 = nonspacers.index(item)
2322
+ break
2323
+
2324
+ # Leave out the last spacer, it has to be there always
2325
+ for ii in range(len(nonspacers)-1):
2326
+ indx = children.index(nonspacers[ii])
2327
+ self._mainsizer.Show(indx, ii < indx1)
2328
+
2329
+
2330
+ def GetItemSize(self, item, isVertical):
2331
+ """
2332
+ Returns the size of an item in the main :class:`ButtonPanel` sizer.
2333
+
2334
+ :param `item`: an instance of :class:`ButtonInfo`;
2335
+ :param bool `isVertical`: ``True`` if :class:`ButtonPanel` is in vertical orientation,
2336
+ ``False`` otherwise.
2337
+
2338
+ :return: An instance of :class:`wx.Size`.
2339
+ """
2340
+
2341
+ if item.GetUserData():
2342
+ return item.GetUserData().GetBestSize()[isVertical]
2343
+ else:
2344
+ return item.GetSize()[isVertical]
2345
+
2346
+
2347
+ def FlexibleLayout(self, nonspacers, allchildren):
2348
+ """
2349
+ Layout the items when the main caption exists.
2350
+
2351
+ :param list `nonspacers`: a list of items which are not spacers;
2352
+ :param list `allchildren`: a list of all the children of :class:`ButtonPanel`.
2353
+ """
2354
+
2355
+ if len(nonspacers) < 2:
2356
+ return
2357
+
2358
+ isVertical = self.IsVertical()
2359
+ isStandard = self.IsStandard()
2360
+
2361
+ size = self.GetSize()[isVertical]
2362
+ padding = self._art.GetMetric(BP_PADDING_SIZE)
2363
+
2364
+ fixed = (isStandard and [nonspacers[1]] or [nonspacers[-2]])[0]
2365
+
2366
+ if isStandard:
2367
+ nonspacers.reverse()
2368
+ leftendx = fixed.GetSize()[isVertical] + padding.x
2369
+ else:
2370
+ rightstartx = size - fixed.GetSize()[isVertical]
2371
+ size = 0
2372
+
2373
+ count = lennonspacers = len(nonspacers)
2374
+
2375
+ for item in nonspacers:
2376
+ if isStandard:
2377
+ size -= self.GetItemSize(item, isVertical)
2378
+ if size < leftendx:
2379
+ break
2380
+ else:
2381
+ size += self.GetItemSize(item, isVertical)
2382
+ if size > rightstartx:
2383
+ break
2384
+
2385
+ count = count - 1
2386
+
2387
+ nonspacers.reverse()
2388
+
2389
+ for jj in range(2, lennonspacers):
2390
+ indx = allchildren.index(nonspacers[jj])
2391
+ self._mainsizer.Show(indx, jj >= count)
2392
+
2393
+
2394
+ def GetNonFlexibleChildren(self):
2395
+ """
2396
+ Returns all the :class:`ButtonPanel` main sizer's children that are not
2397
+ flexible spacers.
2398
+
2399
+ :return: A list of items inside :class:`ButtonPanel` that are not flexible spacers.
2400
+ """
2401
+
2402
+ children1 = []
2403
+ children2 = list(self._mainsizer.GetChildren())
2404
+
2405
+ for child in children2:
2406
+ if child.IsSpacer():
2407
+ if child.GetUserData() or child.GetProportion() == 0:
2408
+ children1.append(child)
2409
+ else:
2410
+ children1.append(child)
2411
+
2412
+ return children1, children2
2413
+
2414
+
2415
+ def GetControls(self):
2416
+ """
2417
+ Returns the wxPython controls that belongs to :class:`ButtonPanel`.
2418
+
2419
+ :return: A list of items inside :class:`ButtonPanel` that are wxPython controls.
2420
+ """
2421
+
2422
+ children2 = self._mainsizer.GetChildren()
2423
+ children1 = [child for child in children2 if not child.IsSpacer()]
2424
+
2425
+ return children1
2426
+
2427
+
2428
+ def SetStyle(self, agwStyle):
2429
+ """
2430
+ Sets the :class:`ButtonPanel` window style.
2431
+
2432
+ :param integer `agwStyle`: one of the following bits:
2433
+
2434
+ ==================== =========== ==================================================
2435
+ Window Styles Hex Value Description
2436
+ ==================== =========== ==================================================
2437
+ ``BP_DEFAULT_STYLE`` 0x1 :class:`ButtonPanel` has a plain solid background.
2438
+ ``BP_USE_GRADIENT`` 0x2 :class:`ButtonPanel` has a gradient shading background.
2439
+ ==================== =========== ==================================================
2440
+
2441
+ """
2442
+
2443
+ if agwStyle == self._agwStyle:
2444
+ return
2445
+
2446
+ self._agwStyle = agwStyle
2447
+ self.Refresh()
2448
+
2449
+
2450
+ def GetStyle(self):
2451
+ """
2452
+ Returns the :class:`ButtonPanel` window style.
2453
+
2454
+ :see: :meth:`~ButtonPanel.SetStyle` for a list of valid window styles.
2455
+ """
2456
+
2457
+ return self._agwStyle
2458
+
2459
+
2460
+ def OnMouseMove(self, event):
2461
+ """
2462
+ Handles the ``wx.EVT_MOTION`` event for :class:`ButtonPanel`.
2463
+
2464
+ :param `event`: a :class:`MouseEvent` event to be processed.
2465
+ """
2466
+
2467
+ # Check to see if we are hovering a button
2468
+ tabId, flags = self.HitTest(event.GetPosition())
2469
+
2470
+ if flags != BP_HT_BUTTON:
2471
+ self.RemoveHelp()
2472
+ self.RepaintOldSelection()
2473
+ self._currentButton = -1
2474
+ return
2475
+
2476
+ btn = self._vButtons[tabId]
2477
+
2478
+ if not btn.IsEnabled():
2479
+ self.RemoveHelp()
2480
+ self.RepaintOldSelection()
2481
+ return
2482
+
2483
+ if tabId != self._currentButton:
2484
+ self.RepaintOldSelection()
2485
+
2486
+ if btn.GetRect().Contains(event.GetPosition()):
2487
+ if btn.GetStatus() != "Pressed":
2488
+ btn.SetStatus("Hover")
2489
+ else:
2490
+ btn.SetStatus("Normal")
2491
+
2492
+ if tabId != self._currentButton:
2493
+ self.RemoveHelp()
2494
+ self.DoGiveHelp(btn)
2495
+
2496
+ self._currentButton = tabId
2497
+
2498
+ event.Skip()
2499
+
2500
+
2501
+ def OnLeftDown(self, event):
2502
+ """
2503
+ Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`ButtonPanel`.
2504
+
2505
+ :param `event`: a :class:`MouseEvent` event to be processed.
2506
+ """
2507
+
2508
+ tabId, hit = self.HitTest(event.GetPosition())
2509
+
2510
+ if hit == BP_HT_BUTTON:
2511
+ btn = self._vButtons[tabId]
2512
+ if btn.IsEnabled():
2513
+ btn.SetStatus("Pressed")
2514
+ self._currentButton = tabId
2515
+
2516
+
2517
+ def OnLeftUp(self, event):
2518
+ """
2519
+ Handles the ``wx.EVT_LEFT_UP`` event for :class:`ButtonPanel`.
2520
+
2521
+ :param `event`: a :class:`MouseEvent` event to be processed.
2522
+ """
2523
+
2524
+ tabId, flags = self.HitTest(event.GetPosition())
2525
+
2526
+ if flags != BP_HT_BUTTON:
2527
+ return
2528
+
2529
+ hit = self._vButtons[tabId]
2530
+
2531
+ if hit.GetStatus() == "Disabled":
2532
+ return
2533
+
2534
+ for btn in self._vButtons:
2535
+ if btn != hit:
2536
+ btn.SetFocus(False)
2537
+
2538
+ if hit.GetStatus() == "Pressed":
2539
+ hit.SetToggled(not hit.GetToggled())
2540
+
2541
+ # Update the button status to be hovered
2542
+ hit.SetStatus("Hover")
2543
+ hit.SetFocus()
2544
+ self._currentButton = tabId
2545
+
2546
+ # Fire a button click event
2547
+ btnEvent = wx.CommandEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, hit.GetId())
2548
+ btnEvent.SetEventObject(hit)
2549
+ self.GetEventHandler().ProcessEvent(btnEvent)
2550
+
2551
+
2552
+ def OnMouseLeave(self, event):
2553
+ """
2554
+ Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`ButtonPanel`.
2555
+
2556
+ :param `event`: a :class:`MouseEvent` event to be processed.
2557
+ """
2558
+
2559
+ # Reset all buttons statuses
2560
+ for btn in self._vButtons:
2561
+ if not btn.IsEnabled():
2562
+ continue
2563
+ btn.SetStatus("Normal")
2564
+
2565
+ self.RemoveHelp()
2566
+
2567
+ event.Skip()
2568
+
2569
+
2570
+ def OnMouseEnterWindow(self, event):
2571
+ """
2572
+ Handles the ``wx.EVT_ENTER_WINDOW`` event for :class:`ButtonPanel`.
2573
+
2574
+ :param `event`: a :class:`MouseEvent` event to be processed.
2575
+ """
2576
+
2577
+ tabId, flags = self.HitTest(event.GetPosition())
2578
+
2579
+ if flags == BP_HT_BUTTON:
2580
+
2581
+ hit = self._vButtons[tabId]
2582
+
2583
+ if hit.GetStatus() == "Disabled":
2584
+ event.Skip()
2585
+ return
2586
+
2587
+ self.DoGiveHelp(hit)
2588
+ self._currentButton = tabId
2589
+
2590
+ event.Skip()
2591
+
2592
+
2593
+ def DoGiveHelp(self, hit):
2594
+ """
2595
+ Shows tooltips and long help strings in :class:`StatusBar`.
2596
+
2597
+ :param `hit`: an instance of :class:`ButtonInfo` where the mouse is hovering.
2598
+ """
2599
+
2600
+ if not self.GetUseHelp():
2601
+ return
2602
+
2603
+ shortHelp = hit.GetShortHelp()
2604
+ if shortHelp:
2605
+ self.SetToolTip(shortHelp)
2606
+ self._haveTip = True
2607
+
2608
+ longHelp = hit.GetLongHelp()
2609
+ if not longHelp:
2610
+ return
2611
+
2612
+ topLevel = wx.GetTopLevelParent(self)
2613
+
2614
+ if isinstance(topLevel, wx.Frame) and topLevel.GetStatusBar():
2615
+ statusBar = topLevel.GetStatusBar()
2616
+
2617
+ if self._statusTimer and self._statusTimer.IsRunning():
2618
+ self._statusTimer.Stop()
2619
+ statusBar.PopStatusText(0)
2620
+
2621
+ statusBar.PushStatusText(longHelp, 0)
2622
+ self._statusTimer = StatusBarTimer(self)
2623
+ self._statusTimer.Start(_DELAY, wx.TIMER_ONE_SHOT)
2624
+
2625
+
2626
+ def RemoveHelp(self):
2627
+ """ Removes the tooltips and statusbar help (if any) for a button. """
2628
+
2629
+ if not self.GetUseHelp():
2630
+ return
2631
+
2632
+ if self._haveTip:
2633
+ self.SetToolTip("")
2634
+ self._haveTip = False
2635
+
2636
+ if self._statusTimer and self._statusTimer.IsRunning():
2637
+ topLevel = wx.GetTopLevelParent(self)
2638
+ statusBar = topLevel.GetStatusBar()
2639
+ self._statusTimer.Stop()
2640
+ statusBar.PopStatusText(0)
2641
+ self._statusTimer = None
2642
+
2643
+
2644
+ def RepaintOldSelection(self):
2645
+ """ Repaints the old selected/hovered button. """
2646
+
2647
+ current = self._currentButton
2648
+
2649
+ if current == -1:
2650
+ return
2651
+
2652
+ btn = self._vButtons[current]
2653
+ if not btn.IsEnabled():
2654
+ return
2655
+
2656
+ btn.SetStatus("Normal")
2657
+
2658
+
2659
+ def OnStatusBarTimer(self):
2660
+ """ Handles the timer expiring to delete the long help string in :class:`StatusBar`. """
2661
+
2662
+ topLevel = wx.GetTopLevelParent(self)
2663
+ statusBar = topLevel.GetStatusBar()
2664
+ statusBar.PopStatusText(0)
2665
+
2666
+
2667
+ def SetUseHelp(self, useHelp=True):
2668
+ """
2669
+ Sets whether or not short and long help strings should be displayed as tooltips
2670
+ and :class:`StatusBar` items respectively.
2671
+
2672
+ :param bool `useHelp`: ``True`` to display short and long help strings as tooltips
2673
+ and :class:`StatusBar` items respectively, ``False`` otherwise.
2674
+ """
2675
+
2676
+ self._useHelp = useHelp
2677
+
2678
+
2679
+ def GetUseHelp(self):
2680
+ """
2681
+ Returns whether or not short and long help strings should be displayed as tooltips
2682
+ and :class:`StatusBar` items respectively.
2683
+
2684
+ :return: ``True`` if the short and long help strings should be displayed as tooltips
2685
+ and :class:`StatusBar` items respectively, ``False`` otherwise.
2686
+ """
2687
+
2688
+ return self._useHelp
2689
+
2690
+
2691
+ def HitTest(self, pt):
2692
+ """
2693
+ HitTest method for :class:`ButtonPanel`.
2694
+
2695
+ :param `pt`: the mouse position, an instance of :class:`wx.Point`.
2696
+
2697
+ :returns: an instance of :class:`ButtonInfo` and the hit flag ``BP_HT_BUTTON`` if a button
2698
+ client rectangle contains the input point `pt`, or ``wx.NOT_FOUND`` and ``BP_HT_NONE``.
2699
+ """
2700
+
2701
+ for ii in range(len(self._vButtons)):
2702
+ if not self._vButtons[ii].IsEnabled():
2703
+ continue
2704
+ if self._vButtons[ii].GetRect().Contains(pt):
2705
+ return ii, BP_HT_BUTTON
2706
+
2707
+ return wx.NOT_FOUND, BP_HT_NONE
2708
+
2709
+
2710
+ def GetBPArt(self):
2711
+ """ Returns the associated :class:`BPArt` art provider. """
2712
+
2713
+ return self._art
2714
+
2715
+
2716
+ def SetBPArt(self, art):
2717
+ """
2718
+ Sets a new :class:`BPArt` art provider to :class:`ButtonPanel`.
2719
+
2720
+ :param `art`: an instance of :class:`BPArt`.
2721
+ """
2722
+
2723
+ self._art = art
2724
+ self.Refresh()
2725
+
2726
+
2727
+ if wx.VERSION < (2,7,1,1):
2728
+ def Freeze(self):
2729
+ """
2730
+ Freezes the window or, in other words, prevents any updates from taking place
2731
+ on screen, the window is not redrawn at all. :meth:`~ButtonPanel.Thaw` must be called to reenable
2732
+ window redrawing. Calls to these two functions may be nested.
2733
+
2734
+ :note: This method is useful for visual appearance optimization.
2735
+ """
2736
+
2737
+ self._freezeCount = self._freezeCount + 1
2738
+ wx.Panel.Freeze(self)
2739
+
2740
+
2741
+ def Thaw(self):
2742
+ """
2743
+ Reenables window updating after a previous call to :meth:`~ButtonPanel.Freeze`. To really thaw the
2744
+ control, it must be called exactly the same number of times as :meth:`~ButtonPanel.Freeze`.
2745
+ """
2746
+
2747
+ if self._freezeCount == 0:
2748
+ raise Exception("\nERROR: Thawing Unfrozen ButtonPanel?")
2749
+
2750
+ self._freezeCount = self._freezeCount - 1
2751
+ wx.Panel.Thaw(self)
2752
+
2753
+
2754
+ def IsFrozen(self):
2755
+ """ Returns ``True`` if the window is currently frozen by a call to :meth:`~ButtonPanel.Freeze`. """
2756
+
2757
+ return self._freezeCount != 0
2758
+
2759
+
2760
+ if __name__ == '__main__':
2761
+
2762
+ import wx
2763
+
2764
+ class MyFrame(wx.Frame):
2765
+
2766
+ def __init__(self, parent, id=-1, title='ButtonPanel', pos=wx.DefaultPosition,
2767
+ size=(800, 600), style=wx.DEFAULT_FRAME_STYLE):
2768
+
2769
+ wx.Frame.__init__(self, parent, id, title, pos, size, style)
2770
+
2771
+ mainPanel = wx.Panel(self, -1)
2772
+ self.logtext = wx.TextCtrl(mainPanel, -1, '', style=wx.TE_MULTILINE)
2773
+
2774
+ vSizer = wx.BoxSizer(wx.VERTICAL)
2775
+ mainPanel.SetSizer(vSizer)
2776
+
2777
+ titleBar = ButtonPanel(mainPanel, -1, 'A Simple Test & Demo')
2778
+
2779
+ btn1 = ButtonInfo(titleBar, wx.ID_ANY,
2780
+ wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, (32, 32)),
2781
+ text='Button 1')
2782
+ titleBar.AddButton(btn1)
2783
+ self.Bind(wx.EVT_BUTTON, self.OnButton, btn1)
2784
+
2785
+ btn2 = ButtonInfo(titleBar, wx.ID_ANY,
2786
+ wx.ArtProvider.GetBitmap(wx.ART_TIP, wx.ART_OTHER, (32, 32)),
2787
+ text='Button 2')
2788
+ titleBar.AddButton(btn2)
2789
+ self.Bind(wx.EVT_BUTTON, self.OnButton, btn2)
2790
+
2791
+ btn3 = ButtonInfo(titleBar, wx.ID_ANY,
2792
+ wx.ArtProvider.GetBitmap(wx.ART_WARNING, wx.ART_OTHER, (32, 32)),
2793
+ text='Button 3')
2794
+
2795
+ titleBar.AddButton(btn3)
2796
+ self.Bind(wx.EVT_BUTTON, self.OnButton, btn3)
2797
+
2798
+ vSizer.Add(titleBar, 0, wx.EXPAND)
2799
+ vSizer.Add((20, 20))
2800
+ vSizer.Add(self.logtext, 1, wx.EXPAND|wx.ALL, 5)
2801
+
2802
+ titleBar.DoLayout()
2803
+ vSizer.Layout()
2804
+
2805
+
2806
+ def OnButton(self, event):
2807
+ ''' Handler for the ``wx.EVT_BUTTON`` event. '''
2808
+
2809
+ obj = event.GetEventObject()
2810
+
2811
+ # This will print the button label
2812
+ print((obj.GetText()))
2813
+
2814
+
2815
+ # our normal wxApp-derived class, as usual
2816
+
2817
+ app = wx.App(0)
2818
+
2819
+ frame = MyFrame(None)
2820
+ app.SetTopWindow(frame)
2821
+ frame.Show()
2822
+
2823
+ app.MainLoop()