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,3029 @@
1
+ # --------------------------------------------------------------------------- #
2
+ # LABELBOOK And FLATIMAGEBOOK Widgets wxPython IMPLEMENTATION
3
+ #
4
+ # Original C++ Code From Eran, embedded in the FlatMenu source code
5
+ #
6
+ #
7
+ # License: wxWidgets license
8
+ #
9
+ #
10
+ # Python Code By:
11
+ #
12
+ # Andrea Gavana, @ 03 Nov 2006
13
+ # Latest Revision: 22 Jan 2013, 21.00 GMT
14
+ # (c) 2021 Zombie
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
+ # TODO:
26
+ # LabelBook - Support IMB_SHOW_ONLY_IMAGES
27
+ # LabelBook - An option to only draw the border
28
+ # between the controls and the pages so the background
29
+ # colour can flow into the window background
30
+ #
31
+ # Tags: phoenix-port, unittest, documented, py3-port
32
+ #
33
+ #
34
+ # End Of Comments
35
+ # --------------------------------------------------------------------------- #
36
+
37
+ """
38
+ :class:`~wx.lib.agw.labelbook.LabelBook` and :class:`~wx.lib.agw.labelbook.FlatImageBook` are a quasi-full generic and owner-drawn
39
+ implementations of :class:`Notebook`.
40
+
41
+
42
+ Description
43
+ ===========
44
+
45
+ :class:`LabelBook` and :class:`FlatImageBook` are quasi-full implementations of the :class:`Notebook`,
46
+ and designed to be a drop-in replacement for :class:`Notebook`. The API functions are
47
+ similar so one can expect the function to behave in the same way.
48
+ :class:`LabelBook` anf :class:`FlatImageBook` share their appearance with :class:`Toolbook` and
49
+ :class:`Listbook`, while having more options for custom drawings, label positioning,
50
+ mouse pointing and so on. Moreover, they retain also some visual characteristics
51
+ of the Outlook address book.
52
+
53
+ Some features:
54
+
55
+ - They are generic controls;
56
+ - Supports for left, right, top (:class:`FlatImageBook` only), bottom (:class:`FlatImageBook`
57
+ only) book styles;
58
+ - Possibility to draw images only, text only or both (:class:`FlatImageBook` only);
59
+ - Support for a "pin-button", that allows the user to shrink/expand the book
60
+ tab area;
61
+ - Shadows behind tabs (:class:`LabelBook` only);
62
+ - Gradient shading of the tab area (:class:`LabelBook` only);
63
+ - Web-like mouse pointing on tabs style (:class:`LabelBook` only);
64
+ - Many customizable colours (tab area, active tab text, tab borders, active
65
+ tab, highlight) - :class:`LabelBook` only.
66
+
67
+ And much more. See the demo for a quasi-complete review of all the functionalities
68
+ of :class:`LabelBook` and :class:`FlatImageBook`.
69
+
70
+
71
+ Usage
72
+ =====
73
+
74
+ Usage example::
75
+
76
+ import wx
77
+ import wx.lib.agw.labelbook as LB
78
+
79
+ class MyFrame(wx.Frame):
80
+
81
+ def __init__(self, parent):
82
+
83
+ wx.Frame.__init__(self, parent, -1, "LabelBook Demo")
84
+
85
+ # Possible values for Tab placement are INB_TOP, INB_BOTTOM, INB_RIGHT, INB_LEFT
86
+
87
+ notebook = LB.LabelBook(self, -1, agwStyle=LB.INB_FIT_LABELTEXT|LB.INB_LEFT|LB.INB_DRAW_SHADOW|LB.INB_GRADIENT_BACKGROUND)
88
+
89
+ pane1 = wx.Panel(notebook)
90
+ pane2 = wx.Panel(notebook)
91
+
92
+ imagelist = wx.ImageList(32, 32)
93
+ imagelist.Add(wx.Bitmap("my_bitmap.png", wx.BITMAP_TYPE_PNG))
94
+ notebook.AssignImageList(imagelist)
95
+
96
+ notebook.AddPage(pane_1, "Tab1", 1, 0)
97
+ notebook.AddPage(pane_2, "Tab2", 0, 0)
98
+
99
+
100
+ # our normal wxApp-derived class, as usual
101
+
102
+ app = wx.App(0)
103
+
104
+ frame = MyFrame(None)
105
+ app.SetTopWindow(frame)
106
+ frame.Show()
107
+
108
+ app.MainLoop()
109
+
110
+
111
+
112
+ Supported Platforms
113
+ ===================
114
+
115
+ :class:`LabelBook` and :class:`FlatImageBook` have been tested on the following platforms:
116
+ * Windows (Windows XP);
117
+ * Linux Ubuntu (Dapper 6.06)
118
+
119
+
120
+ Window Styles
121
+ =============
122
+
123
+ This class supports the following window styles:
124
+
125
+ =========================== =========== ==================================================
126
+ Window Styles Hex Value Description
127
+ =========================== =========== ==================================================
128
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
129
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
130
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
131
+ ``INB_TOP`` 0x8 Place labels above the page area.
132
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
133
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
134
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
135
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
136
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
137
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
138
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
139
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
140
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
141
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
142
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
143
+ =========================== =========== ==================================================
144
+
145
+
146
+ Events Processing
147
+ =================
148
+
149
+ This class processes the following events:
150
+
151
+ =================================== ==================================================
152
+ Event Name Description
153
+ =================================== ==================================================
154
+ ``EVT_IMAGENOTEBOOK_PAGE_CHANGED`` Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` has changed.
155
+ ``EVT_IMAGENOTEBOOK_PAGE_CHANGING`` Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` is about to change.
156
+ ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` has been closed.
157
+ ``EVT_IMAGENOTEBOOK_PAGE_CLOSING`` Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` is closing.
158
+ =================================== ==================================================
159
+
160
+
161
+ TODOs
162
+ =====
163
+
164
+ - :class:`LabelBook`: support ``IMB_SHOW_ONLY_IMAGES``;
165
+ - :class:`LabelBook`: an option to only draw the border between the controls and the pages so the background
166
+ colour can flow into the window background.
167
+
168
+
169
+ License And Version
170
+ ===================
171
+
172
+ :class:`LabelBook` and :class:`FlatImageBook` are distributed under the wxPython license.
173
+
174
+ Latest Revision: Andrea Gavana @ 22 Jan 2013, 21.00 GMT
175
+
176
+ Version 0.6.
177
+
178
+ """
179
+
180
+ __version__ = "0.6"
181
+
182
+
183
+ #----------------------------------------------------------------------
184
+ # Beginning Of IMAGENOTEBOOK wxPython Code
185
+ #----------------------------------------------------------------------
186
+
187
+ import wx
188
+
189
+ from .artmanager import ArtManager, DCSaver
190
+ from .fmresources import *
191
+
192
+ # Check for the new method in 2.7 (not present in 2.6.3.3)
193
+ if wx.VERSION_STRING < "2.7":
194
+ wx.Rect.Contains = lambda self, point: wx.Rect.Inside(self, point)
195
+
196
+ # FlatImageBook and LabelBook styles
197
+ INB_BOTTOM = 1
198
+ """ Place labels below the page area. Available only for :class:`FlatImageBook`."""
199
+ INB_LEFT = 2
200
+ """ Place labels on the left side. Available only for :class:`FlatImageBook`."""
201
+ INB_RIGHT = 4
202
+ """ Place labels on the right side. """
203
+ INB_TOP = 8
204
+ """ Place labels above the page area. """
205
+ INB_BORDER = 16
206
+ """ Draws a border around :class:`LabelBook` or :class:`FlatImageBook`. """
207
+ INB_SHOW_ONLY_TEXT = 32
208
+ """ Shows only text labels and no images. Available only for :class:`LabelBook`."""
209
+ INB_SHOW_ONLY_IMAGES = 64
210
+ """ Shows only tab images and no label texts. Available only for :class:`LabelBook`."""
211
+ INB_FIT_BUTTON = 128
212
+ """ Displays a pin button to show/hide the book control. """
213
+ INB_DRAW_SHADOW = 256
214
+ """ Draw shadows below the book tabs. Available only for :class:`LabelBook`."""
215
+ INB_USE_PIN_BUTTON = 512
216
+ """ Displays a pin button to show/hide the book control. """
217
+ INB_GRADIENT_BACKGROUND = 1024
218
+ """ Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`."""
219
+ INB_WEB_HILITE = 2048
220
+ """ On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`."""
221
+ INB_NO_RESIZE = 4096
222
+ """ Don't allow resizing of the tab area. """
223
+ INB_FIT_LABELTEXT = 8192
224
+ """ Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. """
225
+ INB_BOLD_TAB_SELECTION = 16384
226
+ """ Show the selected tab text using a bold font. """
227
+
228
+ wxEVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
229
+ wxEVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
230
+ wxEVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.NewEventType()
231
+ wxEVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.NewEventType()
232
+
233
+ #-----------------------------------#
234
+ # ImageNotebookEvent
235
+ #-----------------------------------#
236
+
237
+ EVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.EVT_NOTEBOOK_PAGE_CHANGED
238
+ """ Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` has changed. """
239
+ EVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.EVT_NOTEBOOK_PAGE_CHANGING
240
+ """ Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` is about to change. """
241
+ EVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, 1)
242
+ """ Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` is closing. """
243
+ EVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, 1)
244
+ """ Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` has been closed. """
245
+
246
+
247
+ # ---------------------------------------------------------------------------- #
248
+ # Class ImageNotebookEvent
249
+ # ---------------------------------------------------------------------------- #
250
+
251
+ class ImageNotebookEvent(wx.PyCommandEvent):
252
+ """
253
+ This events will be sent when a ``EVT_IMAGENOTEBOOK_PAGE_CHANGED``,
254
+ ``EVT_IMAGENOTEBOOK_PAGE_CHANGING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSING``,
255
+ ``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` is mapped in the parent.
256
+ """
257
+
258
+ def __init__(self, eventType, eventId=1, sel=-1, oldsel=-1):
259
+ """
260
+ Default class constructor.
261
+
262
+ :param `eventType`: the event type;
263
+ :param `eventId`: the event identifier;
264
+ :param `sel`: the current selection;
265
+ :param `oldsel`: the old selection.
266
+ """
267
+
268
+ wx.PyCommandEvent.__init__(self, eventType, eventId)
269
+ self._eventType = eventType
270
+ self._sel = sel
271
+ self._oldsel = oldsel
272
+ self._allowed = True
273
+
274
+
275
+ def SetSelection(self, s):
276
+ """
277
+ Sets the event selection.
278
+
279
+ :param `s`: an integer specifying the new selection.
280
+ """
281
+
282
+ self._sel = s
283
+
284
+
285
+ def SetOldSelection(self, s):
286
+ """
287
+ Sets the event old selection.
288
+
289
+ :param `s`: an integer specifying the old selection.
290
+ """
291
+
292
+ self._oldsel = s
293
+
294
+
295
+ def GetSelection(self):
296
+ """ Returns the event selection. """
297
+
298
+ return self._sel
299
+
300
+
301
+ def GetOldSelection(self):
302
+ """ Returns the old event selection. """
303
+
304
+ return self._oldsel
305
+
306
+
307
+ def Veto(self):
308
+ """
309
+ Prevents the change announced by this event from happening.
310
+
311
+ :note: It is in general a good idea to notify the user about the reasons
312
+ for vetoing the change because otherwise the applications behaviour (which
313
+ just refuses to do what the user wants) might be quite surprising.
314
+ """
315
+
316
+ self._allowed = False
317
+
318
+
319
+ def Allow(self):
320
+ """
321
+ This is the opposite of :meth:`~ImageNotebookEvent.Veto`: it explicitly allows the event to be processed.
322
+ For most events it is not necessary to call this method as the events are
323
+ allowed anyhow but some are forbidden by default (this will be mentioned
324
+ in the corresponding event description).
325
+ """
326
+
327
+ self._allowed = True
328
+
329
+
330
+ def IsAllowed(self):
331
+ """
332
+ Returns ``True`` if the change is allowed (:meth:`~ImageNotebookEvent.Veto` hasn't been called) or
333
+ ``False`` otherwise (if it was).
334
+ """
335
+
336
+ return self._allowed
337
+
338
+
339
+ # ---------------------------------------------------------------------------- #
340
+ # Class ImageInfo
341
+ # ---------------------------------------------------------------------------- #
342
+
343
+ class ImageInfo(object):
344
+ """
345
+ This class holds all the information (caption, image, etc...) belonging to a
346
+ single tab in :class:`LabelBook`.
347
+ """
348
+ def __init__(self, strCaption="", imageIndex=-1, enabled=True):
349
+ """
350
+ Default class constructor.
351
+
352
+ :param `strCaption`: the tab caption;
353
+ :param `imageIndex`: the tab image index based on the assigned (set)
354
+ :class:`wx.ImageList` (if any);
355
+ :param `enabled`: sets the tab as enabled or disabled.
356
+ """
357
+
358
+ self._pos = wx.Point()
359
+ self._size = wx.Size()
360
+ self._strCaption = strCaption
361
+ self._ImageIndex = imageIndex
362
+ self._captionRect = wx.Rect()
363
+ self._bEnabled = enabled
364
+
365
+
366
+ def SetCaption(self, value):
367
+ """
368
+ Sets the tab caption.
369
+
370
+ :param `value`: the new tab caption.
371
+ """
372
+
373
+ self._strCaption = value
374
+
375
+
376
+ def GetCaption(self):
377
+ """ Returns the tab caption. """
378
+
379
+ return self._strCaption
380
+
381
+
382
+ def SetPosition(self, value):
383
+ """
384
+ Sets the tab position.
385
+
386
+ :param `value`: the new tab position, an instance of :class:`wx.Point`.
387
+ """
388
+
389
+ self._pos = value
390
+
391
+
392
+ def GetPosition(self):
393
+ """ Returns the tab position. """
394
+
395
+ return self._pos
396
+
397
+
398
+ def SetSize(self, value):
399
+ """
400
+ Sets the tab size.
401
+
402
+ :param `value`: the new tab size, an instance of :class:`wx.Size`.
403
+ """
404
+
405
+ self._size = value
406
+
407
+
408
+ def GetSize(self):
409
+ """ Returns the tab size. """
410
+
411
+ return self._size
412
+
413
+
414
+ def SetImageIndex(self, value):
415
+ """
416
+ Sets the tab image index.
417
+
418
+ :param `value`: an index into the image list..
419
+ """
420
+
421
+ self._ImageIndex = value
422
+
423
+
424
+ def GetImageIndex(self):
425
+ """ Returns the tab image index. """
426
+
427
+ return self._ImageIndex
428
+
429
+
430
+ def SetTextRect(self, rect):
431
+ """
432
+ Sets the client rectangle available for the tab text.
433
+
434
+ :param `rect`: the tab text client rectangle, an instance of :class:`wx.Rect`.
435
+ """
436
+
437
+ self._captionRect = rect
438
+
439
+
440
+ def GetTextRect(self):
441
+ """ Returns the client rectangle available for the tab text. """
442
+
443
+ return self._captionRect
444
+
445
+
446
+ def GetEnabled(self):
447
+ """ Returns whether the tab is enabled or not. """
448
+
449
+ return self._bEnabled
450
+
451
+
452
+ def EnableTab(self, enabled):
453
+ """
454
+ Sets the tab enabled or disabled.
455
+
456
+ :param `enabled`: ``True`` to enable a tab, ``False`` to disable it.
457
+ """
458
+
459
+ self._bEnabled = enabled
460
+
461
+
462
+ # ---------------------------------------------------------------------------- #
463
+ # Class ImageContainerBase
464
+ # ---------------------------------------------------------------------------- #
465
+
466
+ class ImageContainerBase(wx.Panel):
467
+ """
468
+ Base class for :class:`FlatImageBook` image container.
469
+ """
470
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
471
+ style=0, agwStyle=0, name="ImageContainerBase"):
472
+ """
473
+ Default class constructor.
474
+
475
+ :param `parent`: parent window. Must not be ``None``;
476
+ :param `id`: window identifier. A value of -1 indicates a default value;
477
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
478
+ chosen by either the windowing system or wxPython, depending on platform;
479
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
480
+ chosen by either the windowing system or wxPython, depending on platform;
481
+ :param `style`: the underlying :class:`Panel` window style;
482
+ :param `agwStyle`: the AGW-specific window style. This can be a combination of the
483
+ following bits:
484
+
485
+ =========================== =========== ==================================================
486
+ Window Styles Hex Value Description
487
+ =========================== =========== ==================================================
488
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
489
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
490
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
491
+ ``INB_TOP`` 0x8 Place labels above the page area.
492
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
493
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
494
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
495
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
496
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
497
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
498
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
499
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
500
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
501
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
502
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
503
+ =========================== =========== ==================================================
504
+
505
+ :param `name`: the window name.
506
+ """
507
+
508
+ self._nIndex = -1
509
+ self._nImgSize = 16
510
+ self._ImageList = None
511
+ self._nHoveredImgIdx = -1
512
+ self._bCollapsed = False
513
+ self._tabAreaSize = (-1, -1)
514
+ self._nPinButtonStatus = INB_PIN_NONE
515
+ self._pagesInfoVec = []
516
+ self._pinBtnRect = wx.Rect()
517
+
518
+ wx.Panel.__init__(self, parent, id, pos, size, style | wx.NO_BORDER | wx.NO_FULL_REPAINT_ON_RESIZE, name)
519
+
520
+
521
+ def HasAGWFlag(self, flag):
522
+ """
523
+ Tests for existence of flag in the style.
524
+
525
+ :param `flag`: a window style. This can be a combination of the following bits:
526
+
527
+ =========================== =========== ==================================================
528
+ Window Styles Hex Value Description
529
+ =========================== =========== ==================================================
530
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
531
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
532
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
533
+ ``INB_TOP`` 0x8 Place labels above the page area.
534
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
535
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
536
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
537
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
538
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
539
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
540
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
541
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
542
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
543
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
544
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
545
+ =========================== =========== ==================================================
546
+ """
547
+
548
+ style = self.GetParent().GetAGWWindowStyleFlag()
549
+ res = (style & flag and [True] or [False])[0]
550
+ return res
551
+
552
+
553
+ def ClearFlag(self, flag):
554
+ """
555
+ Removes flag from the style.
556
+
557
+ :param `flag`: a window style flag.
558
+
559
+ :see: :meth:`~ImageContainerBase.HasAGWFlag` for a list of possible window style flags.
560
+ """
561
+
562
+ parent = self.GetParent()
563
+ agwStyle = parent.GetAGWWindowStyleFlag()
564
+ agwStyle &= ~flag
565
+ parent.SetAGWWindowStyleFlag(agwStyle)
566
+
567
+
568
+ def AssignImageList(self, imglist):
569
+ """
570
+ Assigns an image list to the :class:`wx.ImageContainerBase`.
571
+
572
+ :param `imglist`: an instance of :class:`wx.ImageList`.
573
+ """
574
+
575
+ if imglist and imglist.GetImageCount() != 0:
576
+ self._nImgSize = imglist.GetBitmap(0).GetHeight()
577
+
578
+ self._ImageList = imglist
579
+ parent = self.GetParent()
580
+ agwStyle = parent.GetAGWWindowStyleFlag()
581
+ parent.SetAGWWindowStyleFlag(agwStyle)
582
+
583
+
584
+ def GetImageList(self):
585
+ """ Return the image list for :class:`wx.ImageContainerBase`. """
586
+
587
+ return self._ImageList
588
+
589
+
590
+ def GetImageSize(self):
591
+ """ Returns the image size inside the :class:`wx.ImageContainerBase` image list. """
592
+
593
+ return self._nImgSize
594
+
595
+
596
+ def FixTextSize(self, dc, text, maxWidth):
597
+ """
598
+ Fixes the text, to fit `maxWidth` value. If the text length exceeds
599
+ `maxWidth` value this function truncates it and appends two dots at
600
+ the end. ("Long Long Long Text" might become "Long Long...").
601
+
602
+ :param `dc`: an instance of :class:`wx.DC`;
603
+ :param `text`: the text to fix/truncate;
604
+ :param `maxWidth`: the maximum allowed width for the text, in pixels.
605
+ """
606
+
607
+ return ArtManager.Get().TruncateText(dc, text, maxWidth)
608
+
609
+
610
+ def CanDoBottomStyle(self):
611
+ """
612
+ Allows the parent to examine the children type. Some implementation
613
+ (such as :class:`LabelBook`), does not support top/bottom images, only left/right.
614
+ """
615
+
616
+ return False
617
+
618
+
619
+ def AddPage(self, caption, selected=False, imgIdx=-1):
620
+ """
621
+ Adds a page to the container.
622
+
623
+ :param `caption`: specifies the text for the new tab;
624
+ :param `selected`: specifies whether the page should be selected;
625
+ :param `imgIdx`: specifies the optional image index for the new tab.
626
+ """
627
+
628
+ self._pagesInfoVec.append(ImageInfo(caption, imgIdx))
629
+ if selected or len(self._pagesInfoVec) == 1:
630
+ self._nIndex = len(self._pagesInfoVec)-1
631
+
632
+ self.Refresh()
633
+
634
+
635
+ def InsertPage(self, page_idx, caption, selected=False, imgIdx=-1):
636
+ """
637
+ Inserts a page into the container at the specified position.
638
+
639
+ :param `page_idx`: specifies the position for the new tab;
640
+ :param `caption`: specifies the text for the new tab;
641
+ :param `selected`: specifies whether the page should be selected;
642
+ :param `imgIdx`: specifies the optional image index for the new tab.
643
+ """
644
+
645
+ self._pagesInfoVec.insert(page_idx, ImageInfo(caption, imgIdx))
646
+ if selected or len(self._pagesInfoVec) == 1:
647
+ self._nIndex = len(self._pagesInfoVec)-1
648
+
649
+ self.Refresh()
650
+
651
+
652
+ def SetPageImage(self, page, imgIdx):
653
+ """
654
+ Sets the image for the given page.
655
+
656
+ :param `page`: the index of the tab;
657
+ :param `imgIdx`: specifies the optional image index for the tab.
658
+ """
659
+
660
+ imgInfo = self._pagesInfoVec[page]
661
+ imgInfo.SetImageIndex(imgIdx)
662
+
663
+
664
+ def SetPageText(self, page, text):
665
+ """
666
+ Sets the tab caption for the given page.
667
+
668
+ :param `page`: the index of the tab;
669
+ :param `text`: the new tab caption.
670
+ """
671
+
672
+ imgInfo = self._pagesInfoVec[page]
673
+ imgInfo.SetCaption(text)
674
+
675
+
676
+ def GetPageImage(self, page):
677
+ """
678
+ Returns the image index for the given page.
679
+
680
+ :param `page`: the index of the tab.
681
+ """
682
+
683
+ imgInfo = self._pagesInfoVec[page]
684
+ return imgInfo.GetImageIndex()
685
+
686
+
687
+ def GetPageText(self, page):
688
+ """
689
+ Returns the tab caption for the given page.
690
+
691
+ :param `page`: the index of the tab.
692
+ """
693
+
694
+ imgInfo = self._pagesInfoVec[page]
695
+ return imgInfo.GetCaption()
696
+
697
+
698
+ def GetEnabled(self, page):
699
+ """
700
+ Returns whether a tab is enabled or not.
701
+
702
+ :param `page`: an integer specifying the page index.
703
+ """
704
+
705
+ if page >= len(self._pagesInfoVec):
706
+ return True # Adding a page - enabled by default
707
+
708
+ imgInfo = self._pagesInfoVec[page]
709
+ return imgInfo.GetEnabled()
710
+
711
+
712
+ def EnableTab(self, page, enabled=True):
713
+ """
714
+ Enables or disables a tab.
715
+
716
+ :param `page`: an integer specifying the page index;
717
+ :param `enabled`: ``True`` to enable a tab, ``False`` to disable it.
718
+ """
719
+
720
+ if page >= len(self._pagesInfoVec):
721
+ return
722
+
723
+ imgInfo = self._pagesInfoVec[page]
724
+ imgInfo.EnableTab(enabled)
725
+
726
+
727
+ def ClearAll(self):
728
+ """ Deletes all the pages in the container. """
729
+
730
+ self._pagesInfoVec = []
731
+ self._nIndex = wx.NOT_FOUND
732
+
733
+
734
+ def DoDeletePage(self, page):
735
+ """
736
+ Does the actual page deletion.
737
+
738
+ :param `page`: the index of the tab.
739
+ """
740
+
741
+ # Remove the page from the vector
742
+ book = self.GetParent()
743
+ self._pagesInfoVec.pop(page)
744
+
745
+ if self._nIndex >= page:
746
+ self._nIndex = self._nIndex - 1
747
+
748
+ # The delete page was the last first on the array,
749
+ # but the book still has more pages, so we set the
750
+ # active page to be the first one (0)
751
+ if self._nIndex < 0 and len(self._pagesInfoVec) > 0:
752
+ self._nIndex = 0
753
+
754
+ # Refresh the tabs
755
+ if self._nIndex >= 0:
756
+
757
+ book._bForceSelection = True
758
+ book.SetSelection(self._nIndex)
759
+ book._bForceSelection = False
760
+
761
+ if not self._pagesInfoVec:
762
+ # Erase the page container drawings
763
+ dc = wx.ClientDC(self)
764
+ dc.Clear()
765
+
766
+
767
+ def OnSize(self, event):
768
+ """
769
+ Handles the ``wx.EVT_SIZE`` event for :class:`wx.ImageContainerBase`.
770
+
771
+ :param `event`: a :class:`wx.SizeEvent` event to be processed.
772
+ """
773
+
774
+ self.Refresh() # Call on paint
775
+ event.Skip()
776
+
777
+
778
+ def OnEraseBackground(self, event):
779
+ """
780
+ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`wx.ImageContainerBase`.
781
+
782
+ :param `event`: a :class:`EraseEvent` event to be processed.
783
+
784
+ :note: This method is intentionally empty to reduce flicker.
785
+ """
786
+
787
+ pass
788
+
789
+
790
+ def HitTest(self, pt):
791
+ """
792
+ Returns the index of the tab at the specified position or ``wx.NOT_FOUND``
793
+ if ``None``, plus the flag style of :meth:`~ImageContainerBase.HitTest`.
794
+
795
+ :param `pt`: an instance of :class:`wx.Point`, to test for hits.
796
+
797
+ :return: The index of the tab at the specified position plus the hit test
798
+ flag, which can be one of the following bits:
799
+
800
+ ====================== ======= ================================
801
+ HitTest Flags Value Description
802
+ ====================== ======= ================================
803
+ ``IMG_OVER_IMG`` 0 The mouse is over the tab icon
804
+ ``IMG_OVER_PIN`` 1 The mouse is over the pin button
805
+ ``IMG_OVER_EW_BORDER`` 2 The mouse is over the east-west book border
806
+ ``IMG_NONE`` 3 Nowhere
807
+ ====================== ======= ================================
808
+
809
+ """
810
+
811
+ style = self.GetParent().GetAGWWindowStyleFlag()
812
+
813
+ if style & INB_USE_PIN_BUTTON:
814
+ if self._pinBtnRect.Contains(pt):
815
+ return -1, IMG_OVER_PIN
816
+
817
+ for i in range(len(self._pagesInfoVec)):
818
+
819
+ if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1):
820
+ break
821
+
822
+ # For Web Hover style, we test the TextRect
823
+ if not self.HasAGWFlag(INB_WEB_HILITE):
824
+ buttonRect = wx.Rect(self._pagesInfoVec[i].GetPosition(), self._pagesInfoVec[i].GetSize())
825
+ else:
826
+ buttonRect = self._pagesInfoVec[i].GetTextRect()
827
+
828
+ if buttonRect.Contains(pt):
829
+ return i, IMG_OVER_IMG
830
+
831
+ if self.PointOnSash(pt):
832
+ return -1, IMG_OVER_EW_BORDER
833
+ else:
834
+ return -1, IMG_NONE
835
+
836
+
837
+ def PointOnSash(self, pt):
838
+ """
839
+ Tests whether pt is located on the sash.
840
+
841
+ :param `pt`: an instance of :class:`wx.Point`, to test for hits.
842
+ """
843
+
844
+ # Check if we are on a the sash border
845
+ cltRect = self.GetClientRect()
846
+
847
+ if self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP):
848
+ if pt.x > cltRect.x + cltRect.width - 4:
849
+ return True
850
+
851
+ else:
852
+ if pt.x < 4:
853
+ return True
854
+
855
+ return False
856
+
857
+
858
+ def OnMouseLeftDown(self, event):
859
+ """
860
+ Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`wx.ImageContainerBase`.
861
+
862
+ :param `event`: a :class:`MouseEvent` event to be processed.
863
+ """
864
+
865
+ newSelection = -1
866
+ event.Skip()
867
+
868
+ # Support for collapse/expand
869
+ style = self.GetParent().GetAGWWindowStyleFlag()
870
+ if style & INB_USE_PIN_BUTTON:
871
+
872
+ if self._pinBtnRect.Contains(event.GetPosition()):
873
+
874
+ self._nPinButtonStatus = INB_PIN_PRESSED
875
+ dc = wx.ClientDC(self)
876
+ self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed)
877
+ return
878
+
879
+ # Incase panel is collapsed, there is nothing
880
+ # to check
881
+ if self._bCollapsed:
882
+ return
883
+
884
+ tabIdx, where = self.HitTest(event.GetPosition())
885
+
886
+ if where == IMG_OVER_IMG:
887
+ self._nHoveredImgIdx = -1
888
+
889
+ if tabIdx == -1:
890
+ return
891
+
892
+ self.GetParent().SetSelection(tabIdx)
893
+
894
+
895
+ def OnMouseLeaveWindow(self, event):
896
+ """
897
+ Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`wx.ImageContainerBase`.
898
+
899
+ :param `event`: a :class:`MouseEvent` event to be processed.
900
+ """
901
+
902
+ bRepaint = self._nHoveredImgIdx != -1
903
+ self._nHoveredImgIdx = -1
904
+
905
+ # Make sure the pin button status is NONE
906
+ # incase we were in pin button style
907
+ style = self.GetParent().GetAGWWindowStyleFlag()
908
+
909
+ if style & INB_USE_PIN_BUTTON:
910
+
911
+ self._nPinButtonStatus = INB_PIN_NONE
912
+ dc = wx.ClientDC(self)
913
+ self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed)
914
+
915
+ # Restore cursor
916
+ self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
917
+
918
+ if bRepaint:
919
+ self.Refresh()
920
+
921
+
922
+ def OnMouseLeftUp(self, event):
923
+ """
924
+ Handles the ``wx.EVT_LEFT_UP`` event for :class:`wx.ImageContainerBase`.
925
+
926
+ :param `event`: a :class:`MouseEvent` event to be processed.
927
+ """
928
+
929
+ style = self.GetParent().GetAGWWindowStyleFlag()
930
+
931
+ if style & INB_USE_PIN_BUTTON:
932
+
933
+ bIsLabelContainer = not self.CanDoBottomStyle()
934
+
935
+ if self._pinBtnRect.Contains(event.GetPosition()):
936
+
937
+ self._nPinButtonStatus = INB_PIN_NONE
938
+ self._bCollapsed = not self._bCollapsed
939
+
940
+ if self._bCollapsed:
941
+
942
+ # Save the current tab area width
943
+ self._tabAreaSize = self.GetSize()
944
+
945
+ if bIsLabelContainer:
946
+
947
+ self.SetSizeHints(20, self._tabAreaSize.y)
948
+
949
+ else:
950
+
951
+ if style & INB_BOTTOM or style & INB_TOP:
952
+ self.SetSizeHints(self._tabAreaSize.x, 20)
953
+ else:
954
+ self.SetSizeHints(20, self._tabAreaSize.y)
955
+
956
+ else:
957
+
958
+ if bIsLabelContainer:
959
+
960
+ self.SetSizeHints(self._tabAreaSize.x, -1)
961
+
962
+ else:
963
+
964
+ # Restore the tab area size
965
+ if style & INB_BOTTOM or style & INB_TOP:
966
+ self.SetSizeHints(-1, self._tabAreaSize.y)
967
+ else:
968
+ self.SetSizeHints(self._tabAreaSize.x, -1)
969
+
970
+ self.GetParent().GetSizer().Layout()
971
+ self.Refresh()
972
+ return
973
+
974
+
975
+ def OnMouseMove(self, event):
976
+ """
977
+ Handles the ``wx.EVT_MOTION`` event for :class:`wx.ImageContainerBase`.
978
+
979
+ :param `event`: a :class:`MouseEvent` event to be processed.
980
+ """
981
+
982
+ style = self.GetParent().GetAGWWindowStyleFlag()
983
+ if style & INB_USE_PIN_BUTTON:
984
+
985
+ # Check to see if we are in the pin button rect
986
+ if not self._pinBtnRect.Contains(event.GetPosition()) and self._nPinButtonStatus == INB_PIN_PRESSED:
987
+
988
+ self._nPinButtonStatus = INB_PIN_NONE
989
+ dc = wx.ClientDC(self)
990
+ self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed)
991
+
992
+ imgIdx, where = self.HitTest(event.GetPosition())
993
+
994
+ # Allow hovering unless over current tab or tab is disabled
995
+ self._nHoveredImgIdx = -1
996
+
997
+ if imgIdx < len(self._pagesInfoVec) and self.GetEnabled(imgIdx) and imgIdx != self._nIndex:
998
+ self._nHoveredImgIdx = imgIdx
999
+
1000
+ if not self._bCollapsed:
1001
+
1002
+ if self._nHoveredImgIdx >= 0 and self.HasAGWFlag(INB_WEB_HILITE):
1003
+
1004
+ # Change the cursor to be Hand if we have the Web hover style set
1005
+ self.SetCursor(wx.Cursor(wx.CURSOR_HAND))
1006
+
1007
+ elif not self.PointOnSash(event.GetPosition()):
1008
+
1009
+ # Restore the cursor if we are not currently hovering the sash
1010
+ self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
1011
+
1012
+ self.Refresh()
1013
+
1014
+
1015
+ def DrawPin(self, dc, rect, downPin):
1016
+ """
1017
+ Draw a pin button, that allows collapsing of the image panel.
1018
+
1019
+ :param `dc`: an instance of :class:`wx.DC`;
1020
+ :param `rect`: the pin button client rectangle;
1021
+ :param `downPin`: ``True`` if the pin button is facing downwards, ``False``
1022
+ if it is facing leftwards.
1023
+ """
1024
+
1025
+ # Set the bitmap according to the button status
1026
+
1027
+ if downPin:
1028
+ pinBmp = wx.Bitmap(pin_down_xpm)
1029
+ else:
1030
+ pinBmp = wx.Bitmap(pin_left_xpm)
1031
+
1032
+ xx = rect.x + 2
1033
+
1034
+ if self._nPinButtonStatus in [INB_PIN_HOVER, INB_PIN_NONE]:
1035
+
1036
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
1037
+ dc.SetPen(wx.BLACK_PEN)
1038
+ dc.DrawRectangle(xx, rect.y, 16, 16)
1039
+
1040
+ # Draw upper and left border with grey colour
1041
+ dc.SetPen(wx.WHITE_PEN)
1042
+ dc.DrawLine(xx, rect.y, xx + 16, rect.y)
1043
+ dc.DrawLine(xx, rect.y, xx, rect.y + 16)
1044
+
1045
+ elif self._nPinButtonStatus == INB_PIN_PRESSED:
1046
+
1047
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
1048
+ dc.SetPen(wx.LIGHT_GREY_PEN)
1049
+ dc.DrawRectangle(xx, rect.y, 16, 16)
1050
+
1051
+ # Draw upper and left border with grey colour
1052
+ dc.SetPen(wx.BLACK_PEN)
1053
+ dc.DrawLine(xx, rect.y, xx + 16, rect.y)
1054
+ dc.DrawLine(xx, rect.y, xx, rect.y + 16)
1055
+
1056
+ # Set the masking
1057
+ pinBmp.SetMask(wx.Mask(pinBmp, wx.WHITE))
1058
+
1059
+ # Draw the new bitmap
1060
+ dc.DrawBitmap(pinBmp, xx, rect.y, True)
1061
+
1062
+ # Save the pin rect
1063
+ self._pinBtnRect = rect
1064
+
1065
+
1066
+ # ---------------------------------------------------------------------------- #
1067
+ # Class ImageContainer
1068
+ # ---------------------------------------------------------------------------- #
1069
+
1070
+ class ImageContainer(ImageContainerBase):
1071
+ """
1072
+ Base class for :class:`FlatImageBook` image container.
1073
+ """
1074
+
1075
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
1076
+ style=0, agwStyle=0, name="ImageContainer"):
1077
+ """
1078
+ Default class constructor.
1079
+
1080
+ :param `parent`: parent window. Must not be ``None``;
1081
+ :param `id`: window identifier. A value of -1 indicates a default value;
1082
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
1083
+ chosen by either the windowing system or wxPython, depending on platform;
1084
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
1085
+ chosen by either the windowing system or wxPython, depending on platform;
1086
+ :param `style`: the underlying :class:`Panel` window style;
1087
+ :param `agwStyle`: the AGW-specific window style. This can be a combination of the
1088
+ following bits:
1089
+
1090
+ =========================== =========== ==================================================
1091
+ Window Styles Hex Value Description
1092
+ =========================== =========== ==================================================
1093
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
1094
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
1095
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
1096
+ ``INB_TOP`` 0x8 Place labels above the page area.
1097
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
1098
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
1099
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
1100
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
1101
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
1102
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
1103
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
1104
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
1105
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
1106
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
1107
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
1108
+ =========================== =========== ==================================================
1109
+
1110
+ :param `name`: the window name.
1111
+ """
1112
+
1113
+ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
1114
+
1115
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
1116
+ self.Bind(wx.EVT_SIZE, self.OnSize)
1117
+ self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
1118
+ self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
1119
+ self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
1120
+ self.Bind(wx.EVT_MOTION, self.OnMouseMove)
1121
+ self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow)
1122
+
1123
+
1124
+ def OnSize(self, event):
1125
+ """
1126
+ Handles the ``wx.EVT_SIZE`` event for :class:`wx.ImageContainer`.
1127
+
1128
+ :param `event`: a :class:`wx.SizeEvent` event to be processed.
1129
+ """
1130
+
1131
+ ImageContainerBase.OnSize(self, event)
1132
+ event.Skip()
1133
+
1134
+
1135
+ def OnMouseLeftDown(self, event):
1136
+ """
1137
+ Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`wx.ImageContainer`.
1138
+
1139
+ :param `event`: a :class:`MouseEvent` event to be processed.
1140
+ """
1141
+
1142
+ ImageContainerBase.OnMouseLeftDown(self, event)
1143
+ event.Skip()
1144
+
1145
+
1146
+ def OnMouseLeftUp(self, event):
1147
+ """
1148
+ Handles the ``wx.EVT_LEFT_UP`` event for :class:`wx.ImageContainer`.
1149
+
1150
+ :param `event`: a :class:`MouseEvent` event to be processed.
1151
+ """
1152
+
1153
+ ImageContainerBase.OnMouseLeftUp(self, event)
1154
+ event.Skip()
1155
+
1156
+
1157
+ def OnEraseBackground(self, event):
1158
+ """
1159
+ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`wx.ImageContainer`.
1160
+
1161
+ :param `event`: a :class:`EraseEvent` event to be processed.
1162
+ """
1163
+
1164
+ ImageContainerBase.OnEraseBackground(self, event)
1165
+
1166
+
1167
+ def OnMouseMove(self, event):
1168
+ """
1169
+ Handles the ``wx.EVT_MOTION`` event for :class:`wx.ImageContainer`.
1170
+
1171
+ :param `event`: a :class:`MouseEvent` event to be processed.
1172
+ """
1173
+
1174
+ ImageContainerBase.OnMouseMove(self, event)
1175
+ event.Skip()
1176
+
1177
+
1178
+ def OnMouseLeaveWindow(self, event):
1179
+ """
1180
+ Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`wx.ImageContainer`.
1181
+
1182
+ :param `event`: a :class:`MouseEvent` event to be processed.
1183
+ """
1184
+
1185
+ ImageContainerBase.OnMouseLeaveWindow(self, event)
1186
+ event.Skip()
1187
+
1188
+
1189
+ def CanDoBottomStyle(self):
1190
+ """
1191
+ Allows the parent to examine the children type. Some implementation
1192
+ (such as :class:`LabelBook`), does not support top/bottom images, only left/right.
1193
+ """
1194
+
1195
+ return True
1196
+
1197
+
1198
+ def OnPaint(self, event):
1199
+ """
1200
+ Handles the ``wx.EVT_PAINT`` event for :class:`wx.ImageContainer`.
1201
+
1202
+ :param `event`: a :class:`PaintEvent` event to be processed.
1203
+ """
1204
+
1205
+ dc = wx.BufferedPaintDC(self)
1206
+ style = self.GetParent().GetAGWWindowStyleFlag()
1207
+
1208
+ backBrush = wx.WHITE_BRUSH
1209
+ if style & INB_BORDER:
1210
+ borderPen = wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW))
1211
+ else:
1212
+ borderPen = wx.TRANSPARENT_PEN
1213
+
1214
+ size = self.GetSize()
1215
+
1216
+ # Background
1217
+ dc.SetBrush(backBrush)
1218
+
1219
+ borderPen.SetWidth(1)
1220
+ dc.SetPen(borderPen)
1221
+ dc.DrawRectangle(0, 0, size.x, size.y)
1222
+ bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0]
1223
+
1224
+ if bUsePin:
1225
+
1226
+ # Draw the pin button
1227
+ clientRect = self.GetClientRect()
1228
+ pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
1229
+ self.DrawPin(dc, pinRect, not self._bCollapsed)
1230
+
1231
+ if self._bCollapsed:
1232
+ return
1233
+
1234
+ borderPen = wx.BLACK_PEN
1235
+ borderPen.SetWidth(1)
1236
+ dc.SetPen(borderPen)
1237
+ dc.DrawLine(0, size.y, size.x, size.y)
1238
+ dc.DrawPoint(0, size.y)
1239
+
1240
+ clientSize = 0
1241
+ bUseYcoord = (style & INB_RIGHT or style & INB_LEFT)
1242
+
1243
+ if bUseYcoord:
1244
+ clientSize = size.GetHeight()
1245
+ else:
1246
+ clientSize = size.GetWidth()
1247
+
1248
+ # We reserver 20 pixels for the 'pin' button
1249
+
1250
+ # The drawing of the images start position. This is
1251
+ # depenedent of the style, especially when Pin button
1252
+ # style is requested
1253
+
1254
+ if bUsePin:
1255
+ if style & INB_TOP or style & INB_BOTTOM:
1256
+ pos = (style & INB_BORDER and [0] or [1])[0]
1257
+ else:
1258
+ pos = (style & INB_BORDER and [20] or [21])[0]
1259
+ else:
1260
+ pos = (style & INB_BORDER and [0] or [1])[0]
1261
+
1262
+ nPadding = 4 # Pad text with 2 pixels on the left and right
1263
+ nTextPaddingLeft = 2
1264
+
1265
+ count = 0
1266
+ normalFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
1267
+ boldFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
1268
+ boldFont.SetWeight(wx.BOLD)
1269
+
1270
+ for i in range(len(self._pagesInfoVec)):
1271
+
1272
+ count = count + 1
1273
+
1274
+ # incase the 'fit button' style is applied, we set the rectangle width to the
1275
+ # text width plus padding
1276
+ # Incase the style IS applied, but the style is either LEFT or RIGHT
1277
+ # we ignore it
1278
+ dc.SetFont(normalFont)
1279
+
1280
+ if style & INB_BOLD_TAB_SELECTION and self._nIndex == i:
1281
+ dc.SetFont(boldFont)
1282
+
1283
+ textWidth, textHeight = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption())
1284
+
1285
+ # Default values for the surrounding rectangle
1286
+ # around a button
1287
+ rectWidth = self._nImgSize * 2 # To avoid the rectangle to 'touch' the borders
1288
+ rectHeight = self._nImgSize * 2
1289
+
1290
+ # In case the style requires non-fixed button (fit to text)
1291
+ # recalc the rectangle width
1292
+ if style & INB_FIT_BUTTON and \
1293
+ not ((style & INB_LEFT) or (style & INB_RIGHT)) and \
1294
+ not self._pagesInfoVec[i].GetCaption() == "" and \
1295
+ not (style & INB_SHOW_ONLY_IMAGES):
1296
+
1297
+ rectWidth = ((textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth])[0]
1298
+
1299
+ # Make the width an even number
1300
+ if rectWidth % 2 != 0:
1301
+ rectWidth += 1
1302
+
1303
+ # Check that we have enough space to draw the button
1304
+ # If Pin button is used, consider its space as well (applicable for top/botton style)
1305
+ # since in the left/right, its size is already considered in 'pos'
1306
+ pinBtnSize = (bUsePin and [20] or [0])[0]
1307
+
1308
+ if pos + rectWidth + pinBtnSize > clientSize:
1309
+ break
1310
+
1311
+ # Calculate the button rectangle
1312
+ modRectWidth = ((style & INB_LEFT or style & INB_RIGHT) and [rectWidth - 2] or [rectWidth])[0]
1313
+ modRectHeight = ((style & INB_LEFT or style & INB_RIGHT) and [rectHeight] or [rectHeight - 2])[0]
1314
+
1315
+ if bUseYcoord:
1316
+ buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight)
1317
+ else:
1318
+ buttonRect = wx.Rect(pos , 1, modRectWidth, modRectHeight)
1319
+
1320
+ # Check if we need to draw a rectangle around the button
1321
+ if self._nIndex == i:
1322
+
1323
+ # Set the colours
1324
+ penColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION)
1325
+ brushColour = ArtManager.Get().LightColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 75)
1326
+
1327
+ dc.SetPen(wx.Pen(penColour))
1328
+ dc.SetBrush(wx.Brush(brushColour))
1329
+
1330
+ # Fix the surrounding of the rect if border is set
1331
+ if style & INB_BORDER:
1332
+
1333
+ if style & INB_TOP or style & INB_BOTTOM:
1334
+ buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height)
1335
+ else:
1336
+ buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1)
1337
+
1338
+ dc.DrawRectangle(buttonRect)
1339
+
1340
+ if self._nHoveredImgIdx == i:
1341
+
1342
+ # Set the colours
1343
+ penColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION)
1344
+ brushColour = ArtManager.Get().LightColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 90)
1345
+
1346
+ dc.SetPen(wx.Pen(penColour))
1347
+ dc.SetBrush(wx.Brush(brushColour))
1348
+
1349
+ # Fix the surrounding of the rect if border is set
1350
+ if style & INB_BORDER:
1351
+
1352
+ if style & INB_TOP or style & INB_BOTTOM:
1353
+ buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height)
1354
+ else:
1355
+ buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1)
1356
+
1357
+ dc.DrawRectangle(buttonRect)
1358
+
1359
+ if bUseYcoord:
1360
+ rect = wx.Rect(0, pos, rectWidth, rectWidth)
1361
+ else:
1362
+ rect = wx.Rect(pos, 0, rectWidth, rectWidth)
1363
+
1364
+ # Incase user set both flags:
1365
+ # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES
1366
+ # We override them to display both
1367
+
1368
+ if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES:
1369
+
1370
+ style ^= INB_SHOW_ONLY_TEXT
1371
+ style ^= INB_SHOW_ONLY_IMAGES
1372
+ self.GetParent().SetAGWWindowStyleFlag(style)
1373
+
1374
+ # Draw the caption and text
1375
+ imgTopPadding = 10
1376
+ if not style & INB_SHOW_ONLY_TEXT and self._pagesInfoVec[i].GetImageIndex() != -1:
1377
+
1378
+ if bUseYcoord:
1379
+
1380
+ imgXcoord = self._nImgSize / 2
1381
+ imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos + self._nImgSize / 2] or [pos + imgTopPadding])[0]
1382
+
1383
+ else:
1384
+
1385
+ imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2)
1386
+ imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding])[0]
1387
+
1388
+ self._ImageList.Draw(self._pagesInfoVec[i].GetImageIndex(), dc,
1389
+ int(imgXcoord), int(imgYcoord),
1390
+ wx.IMAGELIST_DRAW_TRANSPARENT, True)
1391
+
1392
+ # Draw the text
1393
+ if not style & INB_SHOW_ONLY_IMAGES and not self._pagesInfoVec[i].GetCaption() == "":
1394
+
1395
+ if style & INB_BOLD_TAB_SELECTION and self._nIndex == i:
1396
+ dc.SetFont(boldFont)
1397
+ else:
1398
+ dc.SetFont(normalFont)
1399
+
1400
+ # Check if the text can fit the size of the rectangle,
1401
+ # if not truncate it
1402
+ fixedText = self._pagesInfoVec[i].GetCaption()
1403
+ if not style & INB_FIT_BUTTON or (style & INB_LEFT or (style & INB_RIGHT)):
1404
+
1405
+ fixedText = self.FixTextSize(dc, self._pagesInfoVec[i].GetCaption(), self._nImgSize *2 - 4)
1406
+
1407
+ # Update the length of the text
1408
+ textWidth, textHeight = dc.GetTextExtent(fixedText)
1409
+
1410
+ if bUseYcoord:
1411
+
1412
+ textOffsetX = ((rectWidth - textWidth) / 2 )
1413
+ textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or \
1414
+ [pos + ((self._nImgSize * 2 - textHeight) / 2 )])[0]
1415
+
1416
+ else:
1417
+
1418
+ textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft
1419
+ textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or \
1420
+ [((self._nImgSize * 2 - textHeight) / 2 )])[0]
1421
+
1422
+ dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
1423
+ dc.DrawText(fixedText, int(textOffsetX), int(textOffsetY))
1424
+
1425
+ # Update the page info
1426
+ self._pagesInfoVec[i].SetPosition(buttonRect.GetPosition())
1427
+ self._pagesInfoVec[i].SetSize(buttonRect.GetSize())
1428
+
1429
+ pos += rectWidth
1430
+
1431
+ # Update all buttons that can not fit into the screen as non-visible
1432
+ for ii in range(count, len(self._pagesInfoVec)):
1433
+ self._pagesInfoVec[ii].SetPosition(wx.Point(-1, -1))
1434
+
1435
+ # Draw the pin button
1436
+ if bUsePin:
1437
+
1438
+ clientRect = self.GetClientRect()
1439
+ pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
1440
+ self.DrawPin(dc, pinRect, not self._bCollapsed)
1441
+
1442
+
1443
+ # ---------------------------------------------------------------------------- #
1444
+ # Class LabelContainer
1445
+ # ---------------------------------------------------------------------------- #
1446
+
1447
+ class LabelContainer(ImageContainerBase):
1448
+ """ Base class for :class:`LabelBook`. """
1449
+
1450
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
1451
+ style=0, agwStyle=0, name="LabelContainer"):
1452
+ """
1453
+ Default class constructor.
1454
+
1455
+ :param `parent`: parent window. Must not be ``None``;
1456
+ :param `id`: window identifier. A value of -1 indicates a default value;
1457
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
1458
+ chosen by either the windowing system or wxPython, depending on platform;
1459
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
1460
+ chosen by either the windowing system or wxPython, depending on platform;
1461
+ :param `style`: the underlying :class:`Panel` window style;
1462
+ :param `agwStyle`: the AGW-specific window style. This can be a combination of the
1463
+ following bits:
1464
+
1465
+ =========================== =========== ==================================================
1466
+ Window Styles Hex Value Description
1467
+ =========================== =========== ==================================================
1468
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
1469
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
1470
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
1471
+ ``INB_TOP`` 0x8 Place labels above the page area.
1472
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
1473
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
1474
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
1475
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
1476
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
1477
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
1478
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
1479
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
1480
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
1481
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
1482
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
1483
+ =========================== =========== ==================================================
1484
+
1485
+ :param `name`: the window name.
1486
+ """
1487
+
1488
+ ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
1489
+ self._nTabAreaWidth = 100
1490
+ self._oldCursor = wx.NullCursor
1491
+ self._coloursMap = {}
1492
+ self._skin = wx.NullBitmap
1493
+ self._sashRect = wx.Rect()
1494
+
1495
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
1496
+ self.Bind(wx.EVT_SIZE, self.OnSize)
1497
+ self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
1498
+ self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
1499
+ self.Bind(wx.EVT_MOTION, self.OnMouseMove)
1500
+ self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow)
1501
+ self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
1502
+
1503
+
1504
+ def OnSize(self, event):
1505
+ """
1506
+ Handles the ``wx.EVT_SIZE`` event for :class:`LabelContainer`.
1507
+
1508
+ :param `event`: a :class:`wx.SizeEvent` event to be processed.
1509
+ """
1510
+
1511
+ ImageContainerBase.OnSize(self, event)
1512
+ event.Skip()
1513
+
1514
+
1515
+ def OnEraseBackground(self, event):
1516
+ """
1517
+ Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`LabelContainer`.
1518
+
1519
+ :param `event`: a :class:`EraseEvent` event to be processed.
1520
+ """
1521
+
1522
+ ImageContainerBase.OnEraseBackground(self, event)
1523
+
1524
+
1525
+ def GetTabAreaWidth(self):
1526
+ """ Returns the width of the tab area. """
1527
+
1528
+ return self._nTabAreaWidth
1529
+
1530
+
1531
+ def SetTabAreaWidth(self, width):
1532
+ """
1533
+ Sets the width of the tab area.
1534
+
1535
+ :param `width`: the width of the tab area, in pixels.
1536
+ """
1537
+
1538
+ self._nTabAreaWidth = width
1539
+
1540
+
1541
+ def CanDoBottomStyle(self):
1542
+ """
1543
+ Allows the parent to examine the children type. Some implementation
1544
+ (such as :class:`LabelBook`), does not support top/bottom images, only left/right.
1545
+ """
1546
+
1547
+ return False
1548
+
1549
+
1550
+ def SetBackgroundBitmap(self, bmp):
1551
+ """
1552
+ Sets the background bitmap for the control.
1553
+
1554
+ :param `bmp`: a valid :class:`wx.Bitmap` object.
1555
+ """
1556
+
1557
+ self._skin = bmp
1558
+
1559
+
1560
+ def OnPaint(self, event):
1561
+ """
1562
+ Handles the ``wx.EVT_PAINT`` event for :class:`LabelContainer`.
1563
+
1564
+ :param `event`: a :class:`PaintEvent` event to be processed.
1565
+ """
1566
+
1567
+ style = self.GetParent().GetAGWWindowStyleFlag()
1568
+
1569
+ dc = wx.BufferedPaintDC(self)
1570
+ backBrush = wx.Brush(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR])
1571
+ if self.HasAGWFlag(INB_BORDER):
1572
+ borderPen = wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])
1573
+ else:
1574
+ borderPen = wx.TRANSPARENT_PEN
1575
+
1576
+ size = self.GetSize()
1577
+
1578
+ # Set the pen & brush
1579
+ dc.SetBrush(backBrush)
1580
+ dc.SetPen(borderPen)
1581
+
1582
+ # In case user set both flags, we override them to display both
1583
+ # INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES
1584
+ if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES:
1585
+
1586
+ style ^= INB_SHOW_ONLY_TEXT
1587
+ style ^= INB_SHOW_ONLY_IMAGES
1588
+ self.GetParent().SetAGWWindowStyleFlag(style)
1589
+
1590
+ if self.HasAGWFlag(INB_GRADIENT_BACKGROUND) and not self._skin.IsOk():
1591
+
1592
+ # Draw gradient in the background area
1593
+ startColour = self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]
1594
+ endColour = ArtManager.Get().LightColour(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR], 50)
1595
+ ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(0, 0, size.x // 2, size.y), startColour, endColour, False)
1596
+ ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(size.x // 2, 0, size.x // 2, size.y), endColour, startColour, False)
1597
+
1598
+ else:
1599
+
1600
+ # Draw the border and background
1601
+ if self._skin.IsOk():
1602
+
1603
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
1604
+ self.DrawBackgroundBitmap(dc)
1605
+
1606
+ dc.DrawRectangle(wx.Rect(0, 0, size.x, size.y))
1607
+
1608
+ # Draw border
1609
+ if self.HasAGWFlag(INB_BORDER) and self.HasAGWFlag(INB_GRADIENT_BACKGROUND):
1610
+
1611
+ # Just draw the border with transparent brush
1612
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
1613
+ dc.DrawRectangle(wx.Rect(0, 0, size.x, size.y))
1614
+
1615
+ bUsePin = (self.HasAGWFlag(INB_USE_PIN_BUTTON) and [True] or [False])[0]
1616
+
1617
+ if bUsePin:
1618
+
1619
+ # Draw the pin button
1620
+ clientRect = self.GetClientRect()
1621
+ pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
1622
+ self.DrawPin(dc, pinRect, not self._bCollapsed)
1623
+
1624
+ if self._bCollapsed:
1625
+ return
1626
+
1627
+ dc.SetPen(wx.BLACK_PEN)
1628
+ self.SetSizeHints(self._nTabAreaWidth, -1)
1629
+
1630
+ # We reserve 20 pixels for the pin button
1631
+ posy = 20
1632
+ count = 0
1633
+
1634
+ for i in range(len(self._pagesInfoVec)):
1635
+ count = count+1
1636
+ # Default values for the surrounding rectangle
1637
+ # around a button
1638
+ rectWidth = self._nTabAreaWidth
1639
+
1640
+ if self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
1641
+ font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
1642
+ font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple())
1643
+
1644
+ if self.GetParent().GetFontBold():
1645
+ font.SetWeight(wx.FONTWEIGHT_BOLD)
1646
+ elif self.HasAGWFlag(INB_BOLD_TAB_SELECTION) and self._nIndex == i:
1647
+ font.SetWeight(wx.FONTWEIGHT_BOLD)
1648
+
1649
+ dc.SetFont(font)
1650
+ w, h = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption())
1651
+ rectHeight = h * 2
1652
+ else:
1653
+ rectHeight = self._nImgSize * 2
1654
+
1655
+ # Check that we have enough space to draw the button
1656
+ if posy + rectHeight > size.GetHeight():
1657
+ break
1658
+
1659
+ # Calculate the button rectangle
1660
+ posx = 0
1661
+
1662
+ buttonRect = wx.Rect(posx, posy, rectWidth, rectHeight)
1663
+ indx = self._pagesInfoVec[i].GetImageIndex()
1664
+
1665
+ if indx == -1:
1666
+ bmp = wx.NullBitmap
1667
+ else:
1668
+ bmp = self._ImageList.GetBitmap(indx)
1669
+
1670
+ self.DrawLabel(dc, buttonRect, self._pagesInfoVec[i].GetCaption(), bmp,
1671
+ self._pagesInfoVec[i], self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP),
1672
+ i, self._nIndex == i, self._nHoveredImgIdx == i)
1673
+
1674
+ posy += rectHeight
1675
+
1676
+ # Update all buttons that can not fit into the screen as non-visible
1677
+ for ii in range(count, len(self._pagesInfoVec)):
1678
+ self._pagesInfoVec[i].SetPosition(wx.Point(-1, -1))
1679
+
1680
+ if bUsePin:
1681
+
1682
+ clientRect = self.GetClientRect()
1683
+ pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
1684
+ self.DrawPin(dc, pinRect, not self._bCollapsed)
1685
+
1686
+
1687
+ def DrawBackgroundBitmap(self, dc):
1688
+ """
1689
+ Draws a bitmap as the background of the control.
1690
+
1691
+ :param `dc`: an instance of :class:`wx.DC`.
1692
+ """
1693
+
1694
+ clientRect = self.GetClientRect()
1695
+ width = clientRect.GetWidth()
1696
+ height = clientRect.GetHeight()
1697
+ coveredY = coveredX = 0
1698
+ xstep = self._skin.GetWidth()
1699
+ ystep = self._skin.GetHeight()
1700
+ bmpRect = wx.Rect(0, 0, xstep, ystep)
1701
+ if bmpRect != clientRect:
1702
+
1703
+ mem_dc = wx.MemoryDC()
1704
+ bmp = wx.Bitmap(width, height)
1705
+ mem_dc.SelectObject(bmp)
1706
+
1707
+ while coveredY < height:
1708
+
1709
+ while coveredX < width:
1710
+
1711
+ mem_dc.DrawBitmap(self._skin, coveredX, coveredY, True)
1712
+ coveredX += xstep
1713
+
1714
+ coveredX = 0
1715
+ coveredY += ystep
1716
+
1717
+ mem_dc.SelectObject(wx.NullBitmap)
1718
+ #self._skin = bmp
1719
+ dc.DrawBitmap(bmp, 0, 0)
1720
+
1721
+ else:
1722
+
1723
+ dc.DrawBitmap(self._skin, 0, 0)
1724
+
1725
+
1726
+ def OnMouseLeftUp(self, event):
1727
+ """
1728
+ Handles the ``wx.EVT_LEFT_UP`` event for :class:`LabelContainer`.
1729
+
1730
+ :param `event`: a :class:`MouseEvent` event to be processed.
1731
+ """
1732
+
1733
+ if self.HasAGWFlag(INB_NO_RESIZE):
1734
+
1735
+ ImageContainerBase.OnMouseLeftUp(self, event)
1736
+ return
1737
+
1738
+ if self.HasCapture():
1739
+ self.ReleaseMouse()
1740
+
1741
+ # Sash was being dragged?
1742
+ if not self._sashRect.IsEmpty():
1743
+
1744
+ # Remove sash
1745
+ ArtManager.Get().DrawDragSash(self._sashRect)
1746
+ self.Resize(event)
1747
+
1748
+ self._sashRect = wx.Rect()
1749
+ return
1750
+
1751
+ self._sashRect = wx.Rect()
1752
+
1753
+ # Restore cursor
1754
+ if self._oldCursor.IsOk():
1755
+
1756
+ self.SetCursor(self._oldCursor)
1757
+ self._oldCursor = wx.NullCursor
1758
+
1759
+ ImageContainerBase.OnMouseLeftUp(self, event)
1760
+
1761
+
1762
+ def Resize(self, event):
1763
+ """
1764
+ Actually resizes the tab area.
1765
+
1766
+ :param `event`: an instance of :class:`wx.SizeEvent`.
1767
+ """
1768
+
1769
+ # Resize our size
1770
+ self._tabAreaSize = self.GetSize()
1771
+ newWidth = self._tabAreaSize.x
1772
+ x = event.GetX()
1773
+
1774
+ if self.HasAGWFlag(INB_BOTTOM) or self.HasAGWFlag(INB_RIGHT):
1775
+
1776
+ newWidth -= event.GetX()
1777
+
1778
+ else:
1779
+
1780
+ newWidth = x
1781
+
1782
+ if newWidth < 100: # Dont allow width to be lower than that
1783
+ newWidth = 100
1784
+
1785
+ self.SetSizeHints(newWidth, self._tabAreaSize.y)
1786
+
1787
+ # Update the tab new area width
1788
+ self._nTabAreaWidth = newWidth
1789
+ self.GetParent().Freeze()
1790
+ self.GetParent().GetSizer().Layout()
1791
+ self.GetParent().Thaw()
1792
+
1793
+
1794
+ def OnMouseMove(self, event):
1795
+ """
1796
+ Handles the ``wx.EVT_MOTION`` event for :class:`LabelContainer`.
1797
+
1798
+ :param `event`: a :class:`MouseEvent` event to be processed.
1799
+ """
1800
+
1801
+ if self.HasAGWFlag(INB_NO_RESIZE):
1802
+
1803
+ ImageContainerBase.OnMouseMove(self, event)
1804
+ return
1805
+
1806
+ # Remove old sash
1807
+ if not self._sashRect.IsEmpty():
1808
+ ArtManager.Get().DrawDragSash(self._sashRect)
1809
+
1810
+ if event.LeftIsDown():
1811
+
1812
+ if not self._sashRect.IsEmpty():
1813
+
1814
+ # Progress sash, and redraw it
1815
+ clientRect = self.GetClientRect()
1816
+ pt = self.ClientToScreen(wx.Point(event.GetX(), 0))
1817
+ self._sashRect = wx.Rect(pt, wx.Size(4, clientRect.height))
1818
+ ArtManager.Get().DrawDragSash(self._sashRect)
1819
+
1820
+ else:
1821
+
1822
+ # Sash is not being dragged
1823
+ if self._oldCursor.IsOk():
1824
+ self.SetCursor(self._oldCursor)
1825
+ self._oldCursor = wx.NullCursor
1826
+
1827
+ else:
1828
+
1829
+ if self.HasCapture():
1830
+ self.ReleaseMouse()
1831
+
1832
+ if self.PointOnSash(event.GetPosition()):
1833
+
1834
+ # Change cursor to EW cursor
1835
+ self._oldCursor = self.GetCursor()
1836
+ self.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE))
1837
+
1838
+ elif self._oldCursor.IsOk():
1839
+
1840
+ self.SetCursor(self._oldCursor)
1841
+ self._oldCursor = wx.NullCursor
1842
+
1843
+ self._sashRect = wx.Rect()
1844
+ ImageContainerBase.OnMouseMove(self, event)
1845
+
1846
+
1847
+ def OnMouseLeftDown(self, event):
1848
+ """
1849
+ Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`LabelContainer`.
1850
+
1851
+ :param `event`: a :class:`MouseEvent` event to be processed.
1852
+ """
1853
+
1854
+ if self.HasAGWFlag(INB_NO_RESIZE):
1855
+
1856
+ ImageContainerBase.OnMouseLeftDown(self, event)
1857
+ return
1858
+
1859
+ imgIdx, where = self.HitTest(event.GetPosition())
1860
+
1861
+ if IMG_OVER_EW_BORDER == where and not self._bCollapsed:
1862
+
1863
+ # We are over the sash
1864
+ if not self._sashRect.IsEmpty():
1865
+ ArtManager.Get().DrawDragSash(self._sashRect)
1866
+ else:
1867
+ # first time, begin drawing sash
1868
+ self.CaptureMouse()
1869
+
1870
+ # Change mouse cursor
1871
+ self._oldCursor = self.GetCursor()
1872
+ self.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE))
1873
+
1874
+ clientRect = self.GetClientRect()
1875
+ pt = self.ClientToScreen(wx.Point(event.GetX(), 0))
1876
+ self._sashRect = wx.Rect(pt, wx.Size(4, clientRect.height))
1877
+
1878
+ ArtManager.Get().DrawDragSash(self._sashRect)
1879
+
1880
+ else:
1881
+ ImageContainerBase.OnMouseLeftDown(self, event)
1882
+
1883
+
1884
+ def OnMouseLeaveWindow(self, event):
1885
+ """
1886
+ Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`LabelContainer`.
1887
+
1888
+ :param `event`: a :class:`MouseEvent` event to be processed.
1889
+ """
1890
+
1891
+ if self.HasAGWFlag(INB_NO_RESIZE):
1892
+
1893
+ ImageContainerBase.OnMouseLeaveWindow(self, event)
1894
+ return
1895
+
1896
+ # If Sash is being dragged, ignore this event
1897
+ if not self.HasCapture():
1898
+ ImageContainerBase.OnMouseLeaveWindow(self, event)
1899
+
1900
+
1901
+ def DrawRegularHover(self, dc, rect):
1902
+ """
1903
+ Draws a rounded rectangle around the current tab.
1904
+
1905
+ :param `dc`: an instance of :class:`wx.DC`;
1906
+ :param `rect`: the current tab client rectangle.
1907
+ """
1908
+
1909
+ # The hovered tab with default border
1910
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
1911
+ dc.SetPen(wx.Pen(wx.WHITE))
1912
+
1913
+ # We draw CCW
1914
+ if self.HasAGWFlag(INB_RIGHT) or self.HasAGWFlag(INB_TOP):
1915
+
1916
+ # Right images
1917
+ # Upper line
1918
+ dc.DrawLine(rect.x + 1, rect.y, rect.x + rect.width, rect.y)
1919
+
1920
+ # Right line (white)
1921
+ dc.DrawLine(rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height)
1922
+
1923
+ # Bottom diagonal - we change pen
1924
+ dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]))
1925
+
1926
+ # Bottom line
1927
+ dc.DrawLine(rect.x + rect.width, rect.y + rect.height, rect.x, rect.y + rect.height)
1928
+
1929
+ else:
1930
+
1931
+ # Left images
1932
+ # Upper line white
1933
+ dc.DrawLine(rect.x, rect.y, rect.x + rect.width - 1, rect.y)
1934
+
1935
+ # Left line
1936
+ dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height)
1937
+
1938
+ # Bottom diagonal, we change the pen
1939
+ dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]))
1940
+
1941
+ # Bottom line
1942
+ dc.DrawLine(rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height)
1943
+
1944
+
1945
+ def DrawWebHover(self, dc, caption, xCoord, yCoord, selected):
1946
+ """
1947
+ Draws a web style hover effect (cursor set to hand & text is underlined).
1948
+
1949
+ :param `dc`: an instance of :class:`wx.DC`;
1950
+ :param `caption`: the tab caption text;
1951
+ :param `xCoord`: the x position of the tab caption;
1952
+ :param `yCoord`: the y position of the tab caption;
1953
+ :param `selected`: ``True`` if the tab is selected, ``False`` otherwise.
1954
+ """
1955
+
1956
+ # Redraw the text with underlined font
1957
+ underLinedFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
1958
+ underLinedFont.SetPointSize(underLinedFont.GetPointSize() * self.GetParent().GetFontSizeMultiple())
1959
+ if self.GetParent().GetFontBold():
1960
+ underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD)
1961
+ elif self.HasAGWFlag(INB_BOLD_TAB_SELECTION) and selected:
1962
+ underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD)
1963
+
1964
+ underLinedFont.SetUnderlined(True)
1965
+ dc.SetFont(underLinedFont)
1966
+ dc.DrawText(caption, xCoord, yCoord)
1967
+
1968
+
1969
+ def SetColour(self, which, colour):
1970
+ """
1971
+ Sets a colour for a parameter.
1972
+
1973
+ :param `which`: can be one of the following parameters:
1974
+
1975
+ ================================== ======= ==================================
1976
+ Colour Key Value Description
1977
+ ================================== ======= ==================================
1978
+ ``INB_TAB_AREA_BACKGROUND_COLOUR`` 100 The tab area background colour
1979
+ ``INB_ACTIVE_TAB_COLOUR`` 101 The active tab background colour
1980
+ ``INB_TABS_BORDER_COLOUR`` 102 The tabs border colour
1981
+ ``INB_TEXT_COLOUR`` 103 The tab caption text colour
1982
+ ``INB_ACTIVE_TEXT_COLOUR`` 104 The active tab caption text colour
1983
+ ``INB_HILITE_TAB_COLOUR`` 105 The tab caption highlight text colour
1984
+ ================================== ======= ==================================
1985
+
1986
+ :param `colour`: a valid :class:`wx.Colour` object.
1987
+ """
1988
+
1989
+ self._coloursMap[which] = colour
1990
+
1991
+
1992
+ def GetColour(self, which):
1993
+ """
1994
+ Returns a colour for a parameter.
1995
+
1996
+ :param `which`: the colour key.
1997
+
1998
+ :see: :meth:`~LabelContainer.SetColour` for a list of valid colour keys.
1999
+ """
2000
+
2001
+ return self._coloursMap.get(which, wx.Colour())
2002
+
2003
+
2004
+ def InitializeColours(self):
2005
+ """ Initializes the colours map to be used for this control. """
2006
+
2007
+ # Initialize map colours
2008
+ self._coloursMap.update({INB_TAB_AREA_BACKGROUND_COLOUR: ArtManager.Get().LightColour(ArtManager.Get().FrameColour(), 50)})
2009
+ self._coloursMap.update({INB_ACTIVE_TAB_COLOUR: ArtManager.Get().GetMenuFaceColour()})
2010
+ self._coloursMap.update({INB_TABS_BORDER_COLOUR: wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)})
2011
+ self._coloursMap.update({INB_HILITE_TAB_COLOUR: wx.Colour("LIGHT BLUE")})
2012
+ self._coloursMap.update({INB_TEXT_COLOUR: wx.WHITE})
2013
+ self._coloursMap.update({INB_ACTIVE_TEXT_COLOUR: wx.BLACK})
2014
+
2015
+ # Don't allow bright colour one over the other
2016
+ if not ArtManager.Get().IsDark(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]) and \
2017
+ not ArtManager.Get().IsDark(self._coloursMap[INB_TEXT_COLOUR]):
2018
+
2019
+ self._coloursMap[INB_TEXT_COLOUR] = ArtManager.Get().DarkColour(self._coloursMap[INB_TEXT_COLOUR], 100)
2020
+
2021
+
2022
+ def DrawLabel(self, dc, rect, text, bmp, imgInfo, orientationLeft, imgIdx, selected, hover):
2023
+ """
2024
+ Draws a label using the specified dc.
2025
+
2026
+ :param `dc`: an instance of :class:`wx.DC`;
2027
+ :param `rect`: the text client rectangle;
2028
+ :param `text`: the actual text string;
2029
+ :param `bmp`: a bitmap to be drawn next to the text;
2030
+ :param `imgInfo`: an instance of :class:`wx.ImageInfo`;
2031
+ :param `orientationLeft`: ``True`` if the book has the ``INB_RIGHT`` or ``INB_LEFT``
2032
+ style set;
2033
+ :param `imgIdx`: the tab image index;
2034
+ :param `selected`: ``True`` if the tab is selected, ``False`` otherwise;
2035
+ :param `hover`: ``True`` if the tab is being hovered with the mouse, ``False`` otherwise.
2036
+ """
2037
+
2038
+ dcsaver = DCSaver(dc)
2039
+ nPadding = 6
2040
+
2041
+ if orientationLeft:
2042
+
2043
+ rect.x += nPadding
2044
+ rect.width -= nPadding
2045
+
2046
+ else:
2047
+
2048
+ rect.width -= nPadding
2049
+
2050
+ textRect = wx.Rect(*rect)
2051
+ imgRect = wx.Rect(*rect)
2052
+
2053
+ font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
2054
+ font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple())
2055
+
2056
+ if self.GetParent().GetFontBold():
2057
+ font.SetWeight(wx.FONTWEIGHT_BOLD)
2058
+ elif self.HasAGWFlag(INB_BOLD_TAB_SELECTION) and selected:
2059
+ font.SetWeight(wx.FONTWEIGHT_BOLD)
2060
+
2061
+ dc.SetFont(font)
2062
+
2063
+ # First we define the rectangle for the text
2064
+ w, h = dc.GetTextExtent(text)
2065
+
2066
+ #-------------------------------------------------------------------------
2067
+ # Label layout:
2068
+ # [ nPadding | Image | nPadding | Text | nPadding ]
2069
+ #-------------------------------------------------------------------------
2070
+
2071
+ # Text bounding rectangle
2072
+ textRect.x += nPadding
2073
+ textRect.y = rect.y + (rect.height - h) // 2
2074
+ textRect.width = rect.width - 2 * nPadding
2075
+
2076
+ if bmp.IsOk() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
2077
+ textRect.x += (bmp.GetWidth() + nPadding)
2078
+ textRect.width -= (bmp.GetWidth() + nPadding)
2079
+
2080
+ textRect.height = h
2081
+
2082
+ # Truncate text if needed
2083
+ caption = ArtManager.Get().TruncateText(dc, text, textRect.width)
2084
+
2085
+ # Image bounding rectangle
2086
+ if bmp.IsOk() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
2087
+
2088
+ imgRect.x += nPadding
2089
+ imgRect.width = bmp.GetWidth()
2090
+ imgRect.y = rect.y + (rect.height - bmp.GetHeight()) // 2
2091
+ imgRect.height = bmp.GetHeight()
2092
+
2093
+ # Draw bounding rectangle
2094
+ if selected:
2095
+
2096
+ # First we colour the tab
2097
+ dc.SetBrush(wx.Brush(self._coloursMap[INB_ACTIVE_TAB_COLOUR]))
2098
+
2099
+ if self.HasAGWFlag(INB_BORDER):
2100
+ dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]))
2101
+ else:
2102
+ dc.SetPen(wx.Pen(self._coloursMap[INB_ACTIVE_TAB_COLOUR]))
2103
+
2104
+ labelRect = wx.Rect(*rect)
2105
+
2106
+ if orientationLeft:
2107
+ labelRect.width += 3
2108
+ else:
2109
+ labelRect.width += 3
2110
+ labelRect.x -= 3
2111
+
2112
+ dc.DrawRoundedRectangle(labelRect, 3)
2113
+
2114
+ if not orientationLeft and self.HasAGWFlag(INB_DRAW_SHADOW):
2115
+ dc.SetPen(wx.BLACK_PEN)
2116
+ dc.DrawPoint(labelRect.x + labelRect.width - 1, labelRect.y + labelRect.height - 1)
2117
+
2118
+ # Draw the text & bitmap
2119
+ if caption != "":
2120
+
2121
+ if selected:
2122
+ dc.SetTextForeground(self._coloursMap[INB_ACTIVE_TEXT_COLOUR])
2123
+ else:
2124
+ dc.SetTextForeground(self._coloursMap[INB_TEXT_COLOUR])
2125
+
2126
+ dc.DrawText(caption, textRect.x, textRect.y)
2127
+ imgInfo.SetTextRect(textRect)
2128
+
2129
+ else:
2130
+
2131
+ imgInfo.SetTextRect(wx.Rect())
2132
+
2133
+ if bmp.IsOk() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
2134
+ dc.DrawBitmap(bmp, imgRect.x, imgRect.y, True)
2135
+
2136
+ # Drop shadow
2137
+ if self.HasAGWFlag(INB_DRAW_SHADOW) and selected:
2138
+
2139
+ sstyle = 0
2140
+ if orientationLeft:
2141
+ sstyle = BottomShadow
2142
+ else:
2143
+ sstyle = BottomShadowFull | RightShadow
2144
+
2145
+ if self.HasAGWFlag(INB_WEB_HILITE):
2146
+
2147
+ # Always drop shadow for this style
2148
+ ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle)
2149
+
2150
+ else:
2151
+
2152
+ if imgIdx+1 != self._nHoveredImgIdx:
2153
+ ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle)
2154
+
2155
+ # Draw hover effect
2156
+ if hover:
2157
+
2158
+ if self.HasAGWFlag(INB_WEB_HILITE) and caption != "":
2159
+ self.DrawWebHover(dc, caption, textRect.x, textRect.y, selected)
2160
+ else:
2161
+ self.DrawRegularHover(dc, rect)
2162
+
2163
+ # Update the page information bout position and size
2164
+ imgInfo.SetPosition(rect.GetPosition())
2165
+ imgInfo.SetSize(rect.GetSize())
2166
+
2167
+
2168
+ # ---------------------------------------------------------------------------- #
2169
+ # Class FlatBookBase
2170
+ # ---------------------------------------------------------------------------- #
2171
+
2172
+ class FlatBookBase(wx.Panel):
2173
+ """ Base class for the containing window for :class:`LabelBook` and :class:`FlatImageBook`. """
2174
+
2175
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
2176
+ style=0, agwStyle=0, name="FlatBookBase"):
2177
+ """
2178
+ Default class constructor.
2179
+
2180
+ :param `parent`: parent window. Must not be ``None``;
2181
+ :param `id`: window identifier. A value of -1 indicates a default value;
2182
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
2183
+ chosen by either the windowing system or wxPython, depending on platform;
2184
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
2185
+ chosen by either the windowing system or wxPython, depending on platform;
2186
+ :param `style`: the underlying :class:`Panel` window style;
2187
+ :param `agwStyle`: the AGW-specific window style. This can be a combination of the
2188
+ following bits:
2189
+
2190
+ =========================== =========== ==================================================
2191
+ Window Styles Hex Value Description
2192
+ =========================== =========== ==================================================
2193
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
2194
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
2195
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
2196
+ ``INB_TOP`` 0x8 Place labels above the page area.
2197
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
2198
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
2199
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
2200
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
2201
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
2202
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
2203
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
2204
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
2205
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
2206
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
2207
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
2208
+ =========================== =========== ==================================================
2209
+
2210
+ :param `name`: the window name.
2211
+ """
2212
+
2213
+ self._pages = None
2214
+ self._bInitializing = True
2215
+ self._pages = None
2216
+ self._bForceSelection = False
2217
+ self._windows = []
2218
+ self._fontSizeMultiple = 1
2219
+ self._fontBold = False
2220
+
2221
+ style |= wx.TAB_TRAVERSAL
2222
+ self._agwStyle = agwStyle
2223
+
2224
+ wx.Panel.__init__(self, parent, id, pos, size, style, name)
2225
+ self._bInitializing = False
2226
+
2227
+ self.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigationKey)
2228
+ self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, lambda evt: True)
2229
+
2230
+
2231
+ def SetAGWWindowStyleFlag(self, agwStyle):
2232
+ """
2233
+ Sets the window style.
2234
+
2235
+ :param `agwStyle`: can be a combination of the following bits:
2236
+
2237
+ =========================== =========== ==================================================
2238
+ Window Styles Hex Value Description
2239
+ =========================== =========== ==================================================
2240
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
2241
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
2242
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
2243
+ ``INB_TOP`` 0x8 Place labels above the page area.
2244
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
2245
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
2246
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
2247
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
2248
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
2249
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
2250
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
2251
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
2252
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
2253
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
2254
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
2255
+ =========================== =========== ==================================================
2256
+
2257
+ """
2258
+
2259
+ self._agwStyle = agwStyle
2260
+
2261
+ # Check that we are not in initialization process
2262
+ if self._bInitializing:
2263
+ return
2264
+
2265
+ if not self._pages:
2266
+ return
2267
+
2268
+ # Detach the windows attached to the sizer
2269
+ if self.GetSelection() >= 0:
2270
+ self._mainSizer.Detach(self._windows[self.GetSelection()])
2271
+
2272
+ self._mainSizer.Detach(self._pages)
2273
+
2274
+ if isinstance(self, LabelBook):
2275
+ self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
2276
+ else:
2277
+ if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
2278
+ self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
2279
+ else:
2280
+ self._mainSizer = wx.BoxSizer(wx.VERTICAL)
2281
+
2282
+ self.SetSizer(self._mainSizer)
2283
+
2284
+ # Add the tab container and the separator
2285
+ self._mainSizer.Add(self._pages, 0, wx.EXPAND)
2286
+
2287
+ if isinstance(self, FlatImageBook):
2288
+ if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
2289
+ self._pages.SetSizeHints(self._pages._nImgSize * 2, -1)
2290
+ else:
2291
+ self._pages.SetSizeHints(-1, self._pages._nImgSize * 2)
2292
+
2293
+ # Attach the windows back to the sizer to the sizer
2294
+ if self.GetSelection() >= 0:
2295
+ self.DoSetSelection(self._windows[self.GetSelection()])
2296
+
2297
+ if agwStyle & INB_FIT_LABELTEXT:
2298
+ self.ResizeTabArea()
2299
+
2300
+ self._mainSizer.Layout()
2301
+ dummy = wx.SizeEvent(self.GetSize())
2302
+ wx.PostEvent(self, dummy)
2303
+ self._pages.Refresh()
2304
+
2305
+
2306
+ def GetAGWWindowStyleFlag(self):
2307
+ """
2308
+ Returns the :class:`FlatBookBase` window style.
2309
+
2310
+ :see: :meth:`~FlatBookBase.SetAGWWindowStyleFlag` for a list of possible window style flags.
2311
+ """
2312
+
2313
+ return self._agwStyle
2314
+
2315
+
2316
+ def HasAGWFlag(self, flag):
2317
+ """
2318
+ Returns whether a flag is present in the :class:`FlatBookBase` style.
2319
+
2320
+ :param `flag`: one of the possible :class:`FlatBookBase` window styles.
2321
+
2322
+ :see: :meth:`~FlatBookBase.SetAGWWindowStyleFlag` for a list of possible window style flags.
2323
+ """
2324
+
2325
+ agwStyle = self.GetAGWWindowStyleFlag()
2326
+ res = (agwStyle & flag and [True] or [False])[0]
2327
+ return res
2328
+
2329
+
2330
+ def AddPage(self, page, text, select=False, imageId=-1):
2331
+ """
2332
+ Adds a page to the book.
2333
+
2334
+ :param `page`: specifies the new page;
2335
+ :param `text`: specifies the text for the new page;
2336
+ :param `select`: specifies whether the page should be selected;
2337
+ :param `imageId`: specifies the optional image index for the new page.
2338
+
2339
+ :note: The call to this function generates the page changing events.
2340
+ """
2341
+
2342
+ if not page:
2343
+ return
2344
+
2345
+ page.Reparent(self)
2346
+
2347
+ self._windows.append(page)
2348
+
2349
+ if select or len(self._windows) == 1:
2350
+ self.SetSelection(len(self._windows)-1)
2351
+ else:
2352
+ page.Hide()
2353
+
2354
+ self._pages.AddPage(text, select, imageId)
2355
+ self.ResizeTabArea()
2356
+ self.Refresh()
2357
+
2358
+
2359
+ def InsertPage(self, page_idx, page, text, select=False, imageId=-1):
2360
+ """
2361
+ Inserts a page into the book at the specified position.
2362
+
2363
+ :param `page_idx`: specifies the position for the new page;
2364
+ :param `page`: specifies the new page;
2365
+ :param `text`: specifies the text for the new page;
2366
+ :param `select`: specifies whether the page should be selected;
2367
+ :param `imageId`: specifies the optional image index for the new page.
2368
+
2369
+ :note: The call to this function generates the page changing events.
2370
+ """
2371
+
2372
+ if not page:
2373
+ return
2374
+
2375
+ page.Reparent(self)
2376
+
2377
+ self._windows.insert(page_idx, page)
2378
+
2379
+ if select or len(self._windows) == 1:
2380
+ self.SetSelection(page_idx)
2381
+ else:
2382
+ page.Hide()
2383
+
2384
+ self._pages.InsertPage(page_idx, text, select, imageId)
2385
+ self.ResizeTabArea()
2386
+ self.Refresh()
2387
+
2388
+
2389
+ def DeletePage(self, page):
2390
+ """
2391
+ Deletes the specified page, and the associated window.
2392
+
2393
+ :param `page`: an integer specifying the page to be deleted.
2394
+
2395
+ :note: The call to this function generates the page changing events.
2396
+ """
2397
+
2398
+ if page >= len(self._windows) or page < 0:
2399
+ return
2400
+
2401
+ # Fire a closing event
2402
+ event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId())
2403
+ event.SetSelection(page)
2404
+ event.SetEventObject(self)
2405
+ self.GetEventHandler().ProcessEvent(event)
2406
+
2407
+ # The event handler allows it?
2408
+ if not event.IsAllowed():
2409
+ return False
2410
+
2411
+ self.Freeze()
2412
+
2413
+ # Delete the requested page
2414
+ pageRemoved = self._windows[page]
2415
+
2416
+ # If the page is the current window, remove it from the sizer
2417
+ # as well
2418
+ if page == self.GetSelection():
2419
+ self._mainSizer.Detach(pageRemoved)
2420
+
2421
+ # Remove it from the array as well
2422
+ self._windows.pop(page)
2423
+
2424
+ # Now we can destroy it in wxWidgets use Destroy instead of delete
2425
+ pageRemoved.Destroy()
2426
+ self._mainSizer.Layout()
2427
+
2428
+ self._pages.DoDeletePage(page)
2429
+ self.ResizeTabArea()
2430
+ self.Thaw()
2431
+
2432
+ # Fire a closed event
2433
+ closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId())
2434
+ closedEvent.SetSelection(page)
2435
+ closedEvent.SetEventObject(self)
2436
+ self.GetEventHandler().ProcessEvent(closedEvent)
2437
+
2438
+
2439
+ def RemovePage(self, page):
2440
+ """
2441
+ Deletes the specified page, without deleting the associated window.
2442
+
2443
+ :param `page`: an integer specifying the page to be removed.
2444
+
2445
+ :note: The call to this function generates the page changing events.
2446
+ """
2447
+
2448
+ if page >= len(self._windows):
2449
+ return False
2450
+
2451
+ # Fire a closing event
2452
+ event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId())
2453
+ event.SetSelection(page)
2454
+ event.SetEventObject(self)
2455
+ self.GetEventHandler().ProcessEvent(event)
2456
+
2457
+ # The event handler allows it?
2458
+ if not event.IsAllowed():
2459
+ return False
2460
+
2461
+ self.Freeze()
2462
+
2463
+ # Remove the requested page
2464
+ pageRemoved = self._windows[page]
2465
+
2466
+ # If the page is the current window, remove it from the sizer
2467
+ # as well
2468
+ if page == self.GetSelection():
2469
+ self._mainSizer.Detach(pageRemoved)
2470
+
2471
+ # Remove it from the array as well
2472
+ self._windows.pop(page)
2473
+ self._mainSizer.Layout()
2474
+ self.ResizeTabArea()
2475
+ self.Thaw()
2476
+
2477
+ self._pages.DoDeletePage(page)
2478
+
2479
+ # Fire a closed event
2480
+ closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId())
2481
+ closedEvent.SetSelection(page)
2482
+ closedEvent.SetEventObject(self)
2483
+ self.GetEventHandler().ProcessEvent(closedEvent)
2484
+
2485
+ return True
2486
+
2487
+
2488
+ def ResizeTabArea(self):
2489
+ """ Resizes the tab area if the control has the ``INB_FIT_LABELTEXT`` style set. """
2490
+
2491
+ agwStyle = self.GetAGWWindowStyleFlag()
2492
+
2493
+ if agwStyle & INB_FIT_LABELTEXT == 0:
2494
+ return
2495
+
2496
+ if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
2497
+ dc = wx.MemoryDC()
2498
+ dc.SelectObject(wx.Bitmap(1, 1))
2499
+ font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
2500
+ font.SetPointSize(font.GetPointSize()*self._fontSizeMultiple)
2501
+ if self.GetFontBold() or agwStyle & INB_BOLD_TAB_SELECTION:
2502
+ font.SetWeight(wx.FONTWEIGHT_BOLD)
2503
+ dc.SetFont(font)
2504
+ maxW = 0
2505
+
2506
+ for page in range(self.GetPageCount()):
2507
+ caption = self._pages.GetPageText(page)
2508
+ w, h = dc.GetTextExtent(caption)
2509
+ maxW = max(maxW, w)
2510
+
2511
+ maxW += 24 #TODO this is 6*4 6 is nPadding from drawlabel
2512
+
2513
+ if not agwStyle & INB_SHOW_ONLY_TEXT:
2514
+ maxW += self._pages._nImgSize * 2
2515
+
2516
+ maxW = max(maxW, 100)
2517
+ self._pages.SetSizeHints(maxW, -1)
2518
+ self._pages._nTabAreaWidth = maxW
2519
+
2520
+
2521
+ def DeleteAllPages(self):
2522
+ """ Deletes all the pages in the book. """
2523
+
2524
+ if not self._windows:
2525
+ return
2526
+
2527
+ self.Freeze()
2528
+
2529
+ for win in self._windows:
2530
+ win.Destroy()
2531
+
2532
+ self._windows = []
2533
+ self.Thaw()
2534
+
2535
+ # remove old selection
2536
+ self._pages.ClearAll()
2537
+ self._pages.Refresh()
2538
+
2539
+
2540
+ def SetSelection(self, page):
2541
+ """
2542
+ Changes the selection from currently visible/selected page to the page
2543
+ given by page.
2544
+
2545
+ :param `page`: an integer specifying the page to be selected.
2546
+
2547
+ :note: The call to this function generates the page changing events.
2548
+ """
2549
+
2550
+ if page >= len(self._windows):
2551
+ return
2552
+
2553
+ if not self.GetEnabled(page):
2554
+ return
2555
+
2556
+ if page == self.GetSelection() and not self._bForceSelection:
2557
+ return
2558
+
2559
+ oldSelection = self.GetSelection()
2560
+
2561
+ # Generate an event that indicates that an image is about to be selected
2562
+ event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGING, self.GetId())
2563
+ event.SetSelection(page)
2564
+ event.SetOldSelection(oldSelection)
2565
+ event.SetEventObject(self)
2566
+ self.GetEventHandler().ProcessEvent(event)
2567
+
2568
+ # The event handler allows it?
2569
+ if not event.IsAllowed() and not self._bForceSelection:
2570
+ return
2571
+
2572
+ self.DoSetSelection(self._windows[page])
2573
+ # Now we can update the new selection
2574
+ self._pages._nIndex = page
2575
+
2576
+ # Refresh calls the OnPaint of this class
2577
+ self._pages.Refresh()
2578
+
2579
+ # Generate an event that indicates that an image was selected
2580
+ eventChanged = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGED, self.GetId())
2581
+ eventChanged.SetEventObject(self)
2582
+ eventChanged.SetOldSelection(oldSelection)
2583
+ eventChanged.SetSelection(page)
2584
+ self.GetEventHandler().ProcessEvent(eventChanged)
2585
+
2586
+
2587
+ def AssignImageList(self, imglist):
2588
+ """
2589
+ Assigns an image list to the control.
2590
+
2591
+ :param `imglist`: an instance of :class:`wx.ImageList`.
2592
+ """
2593
+
2594
+ self._pages.AssignImageList(imglist)
2595
+
2596
+ # Force change
2597
+ self.SetAGWWindowStyleFlag(self.GetAGWWindowStyleFlag())
2598
+
2599
+
2600
+ def GetSelection(self):
2601
+ """ Returns the current selection. """
2602
+
2603
+ if self._pages:
2604
+ return self._pages._nIndex
2605
+ else:
2606
+ return -1
2607
+
2608
+
2609
+ def DoSetSelection(self, window):
2610
+ """
2611
+ Select the window by the provided pointer.
2612
+
2613
+ :param `window`: an instance of :class:`wx.Window`.
2614
+ """
2615
+
2616
+ curSel = self.GetSelection()
2617
+ agwStyle = self.GetAGWWindowStyleFlag()
2618
+ # Replace the window in the sizer
2619
+ self.Freeze()
2620
+
2621
+ # Check if a new selection was made
2622
+ bInsertFirst = (agwStyle & INB_BOTTOM or agwStyle & INB_RIGHT)
2623
+
2624
+ if curSel >= 0:
2625
+
2626
+ # Remove the window from the main sizer
2627
+ self._mainSizer.Detach(self._windows[curSel])
2628
+ self._windows[curSel].Hide()
2629
+
2630
+ if bInsertFirst:
2631
+ self._mainSizer.Insert(0, window, 1, wx.EXPAND)
2632
+ else:
2633
+ self._mainSizer.Add(window, 1, wx.EXPAND)
2634
+
2635
+ window.Show()
2636
+ self._mainSizer.Layout()
2637
+ self.Thaw()
2638
+
2639
+
2640
+ def GetImageList(self):
2641
+ """ Returns the associated image list. """
2642
+
2643
+ return self._pages.GetImageList()
2644
+
2645
+
2646
+ def GetPageCount(self):
2647
+ """ Returns the number of pages in the book. """
2648
+
2649
+ return len(self._windows)
2650
+
2651
+
2652
+ def GetFontBold(self):
2653
+ """ Gets the font bold status. """
2654
+
2655
+ return self._fontBold
2656
+
2657
+
2658
+ def SetFontBold(self, bold):
2659
+ """
2660
+ Sets whether the page captions are bold or not.
2661
+
2662
+ :param `bold`: ``True`` or ``False``.
2663
+ """
2664
+
2665
+ self._fontBold = bold
2666
+
2667
+
2668
+ def GetFontSizeMultiple(self):
2669
+ """ Gets the font size multiple for the page captions. """
2670
+
2671
+ return self._fontSizeMultiple
2672
+
2673
+
2674
+ def SetFontSizeMultiple(self, multiple):
2675
+ """
2676
+ Sets the font size multiple for the page captions.
2677
+
2678
+ :param `multiple`: The multiple to be applied to the system font to get the our font size.
2679
+ """
2680
+
2681
+ self._fontSizeMultiple = int(multiple)
2682
+
2683
+
2684
+ def SetPageImage(self, page, imageId):
2685
+ """
2686
+ Sets the image index for the given page.
2687
+
2688
+ :param `page`: an integer specifying the page index;
2689
+ :param `image`: an index into the image list.
2690
+ """
2691
+
2692
+ self._pages.SetPageImage(page, imageId)
2693
+ self._pages.Refresh()
2694
+
2695
+
2696
+ def SetPageText(self, page, text):
2697
+ """
2698
+ Sets the text for the given page.
2699
+
2700
+ :param `page`: an integer specifying the page index;
2701
+ :param `text`: the new tab label.
2702
+ """
2703
+
2704
+ self._pages.SetPageText(page, text)
2705
+ self._pages.Refresh()
2706
+
2707
+
2708
+ def GetPageText(self, page):
2709
+ """
2710
+ Returns the text for the given page.
2711
+
2712
+ :param `page`: an integer specifying the page index.
2713
+ """
2714
+
2715
+ return self._pages.GetPageText(page)
2716
+
2717
+
2718
+ def GetPageImage(self, page):
2719
+ """
2720
+ Returns the image index for the given page.
2721
+
2722
+ :param `page`: an integer specifying the page index.
2723
+ """
2724
+
2725
+ return self._pages.GetPageImage(page)
2726
+
2727
+
2728
+ def GetEnabled(self, page):
2729
+ """
2730
+ Returns whether a tab is enabled or not.
2731
+
2732
+ :param `page`: an integer specifying the page index.
2733
+ """
2734
+
2735
+ return self._pages.GetEnabled(page)
2736
+
2737
+
2738
+ def EnableTab(self, page, enabled=True):
2739
+ """
2740
+ Enables or disables a tab.
2741
+
2742
+ :param `page`: an integer specifying the page index;
2743
+ :param `enabled`: ``True`` to enable a tab, ``False`` to disable it.
2744
+ """
2745
+
2746
+ if page >= len(self._windows):
2747
+ return
2748
+
2749
+ self._windows[page].Enable(enabled)
2750
+ self._pages.EnableTab(page, enabled)
2751
+
2752
+
2753
+ def GetPage(self, page):
2754
+ """
2755
+ Returns the window at the given page position.
2756
+
2757
+ :param `page`: an integer specifying the page to be returned.
2758
+ """
2759
+
2760
+ if page >= len(self._windows):
2761
+ return
2762
+
2763
+ return self._windows[page]
2764
+
2765
+
2766
+ def GetCurrentPage(self):
2767
+ """ Returns the currently selected notebook page or ``None``. """
2768
+
2769
+ if self.GetSelection() < 0:
2770
+ return
2771
+
2772
+ return self.GetPage(self.GetSelection())
2773
+
2774
+
2775
+ def OnNavigationKey(self, event):
2776
+ """
2777
+ Handles the ``wx.EVT_NAVIGATION_KEY`` event for :class:`FlatBookBase`.
2778
+
2779
+ :param `event`: a :class:`NavigationKeyEvent` event to be processed.
2780
+ """
2781
+
2782
+ if event.IsWindowChange():
2783
+ if self.GetPageCount() == 0:
2784
+ return
2785
+
2786
+ # change pages
2787
+ self.AdvanceSelection(event.GetDirection())
2788
+
2789
+ else:
2790
+ event.Skip()
2791
+
2792
+
2793
+ def AdvanceSelection(self, forward=True):
2794
+ """
2795
+ Cycles through the tabs.
2796
+
2797
+ :param `forward`: if ``True``, the selection is advanced in ascending order
2798
+ (to the right), otherwise the selection is advanced in descending order.
2799
+
2800
+ :note: The call to this function generates the page changing events.
2801
+ """
2802
+
2803
+ nSel = self.GetSelection()
2804
+
2805
+ if nSel < 0:
2806
+ return
2807
+
2808
+ nMax = self.GetPageCount() - 1
2809
+
2810
+ if forward:
2811
+ newSelection = (nSel == nMax and [0] or [nSel + 1])[0]
2812
+ else:
2813
+ newSelection = (nSel == 0 and [nMax] or [nSel - 1])[0]
2814
+
2815
+ self.SetSelection(newSelection)
2816
+
2817
+
2818
+ def ChangeSelection(self, page):
2819
+ """
2820
+ Changes the selection for the given page, returning the previous selection.
2821
+
2822
+ :param `page`: an integer specifying the page to be selected.
2823
+
2824
+ :note: The call to this function does not generate the page changing events.
2825
+ """
2826
+
2827
+ if page < 0 or page >= self.GetPageCount():
2828
+ return
2829
+
2830
+ oldPage = self.GetSelection()
2831
+ self.DoSetSelection(page)
2832
+
2833
+ return oldPage
2834
+
2835
+ CurrentPage = property(GetCurrentPage, doc="See `GetCurrentPage`")
2836
+ Page = property(GetPage, doc="See `GetPage`")
2837
+ PageCount = property(GetPageCount, doc="See `GetPageCount`")
2838
+ PageImage = property(GetPageImage, SetPageImage, doc="See `GetPageImage, SetPageImage`")
2839
+ PageText = property(GetPageText, SetPageText, doc="See `GetPageText, SetPageText`")
2840
+ Selection = property(GetSelection, SetSelection, doc="See `GetSelection, SetSelection`")
2841
+
2842
+
2843
+ # ---------------------------------------------------------------------------- #
2844
+ # Class FlatImageBook
2845
+ # ---------------------------------------------------------------------------- #
2846
+
2847
+ class FlatImageBook(FlatBookBase):
2848
+ """
2849
+ Default implementation of the image book, it is like a :class:`Notebook`, except that
2850
+ images are used to control the different pages. This container is usually used
2851
+ for configuration dialogs etc.
2852
+
2853
+ :note: Currently, this control works properly for images of size 32x32 and bigger.
2854
+ """
2855
+
2856
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
2857
+ style=0, agwStyle=0, name="FlatImageBook"):
2858
+ """
2859
+ Default class constructor.
2860
+
2861
+ :param `parent`: parent window. Must not be ``None``;
2862
+ :param `id`: window identifier. A value of -1 indicates a default value;
2863
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
2864
+ chosen by either the windowing system or wxPython, depending on platform;
2865
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
2866
+ chosen by either the windowing system or wxPython, depending on platform;
2867
+ :param `style`: the underlying :class:`Panel` window style;
2868
+ :param `agwStyle`: the AGW-specific window style. This can be a combination of the
2869
+ following bits:
2870
+
2871
+ =========================== =========== ==================================================
2872
+ Window Styles Hex Value Description
2873
+ =========================== =========== ==================================================
2874
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
2875
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
2876
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
2877
+ ``INB_TOP`` 0x8 Place labels above the page area.
2878
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
2879
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
2880
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
2881
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
2882
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
2883
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
2884
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
2885
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
2886
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
2887
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
2888
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
2889
+ =========================== =========== ==================================================
2890
+
2891
+ :param `name`: the window name.
2892
+ """
2893
+
2894
+ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
2895
+
2896
+ self._pages = self.CreateImageContainer()
2897
+
2898
+ if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
2899
+ self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
2900
+ else:
2901
+ self._mainSizer = wx.BoxSizer(wx.VERTICAL)
2902
+
2903
+ self.SetSizer(self._mainSizer)
2904
+
2905
+ # Add the tab container to the sizer
2906
+ self._mainSizer.Add(self._pages, 0, wx.EXPAND)
2907
+
2908
+ if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
2909
+ self._pages.SetSizeHints(self._pages.GetImageSize() * 2, -1)
2910
+ else:
2911
+ self._pages.SetSizeHints(-1, self._pages.GetImageSize() * 2)
2912
+
2913
+ self._mainSizer.Layout()
2914
+
2915
+
2916
+ def CreateImageContainer(self):
2917
+ """ Creates the image container class for :class:`FlatImageBook`. """
2918
+
2919
+ return ImageContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag())
2920
+
2921
+
2922
+ # ---------------------------------------------------------------------------- #
2923
+ # Class LabelBook
2924
+ # ---------------------------------------------------------------------------- #
2925
+
2926
+ class LabelBook(FlatBookBase):
2927
+ """
2928
+ An implementation of a notebook control - except that instead of having
2929
+ tabs to show labels, it labels to the right or left (arranged horizontally).
2930
+ """
2931
+
2932
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
2933
+ style=0, agwStyle=0, name="LabelBook"):
2934
+ """
2935
+ Default class constructor.
2936
+
2937
+ :param `parent`: parent window. Must not be ``None``;
2938
+ :param `id`: window identifier. A value of -1 indicates a default value;
2939
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
2940
+ chosen by either the windowing system or wxPython, depending on platform;
2941
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
2942
+ chosen by either the windowing system or wxPython, depending on platform;
2943
+ :param `style`: the underlying :class:`Panel` window style;
2944
+ :param `agwStyle`: the AGW-specific window style. This can be a combination of the
2945
+ following bits:
2946
+
2947
+ =========================== =========== ==================================================
2948
+ Window Styles Hex Value Description
2949
+ =========================== =========== ==================================================
2950
+ ``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
2951
+ ``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
2952
+ ``INB_RIGHT`` 0x4 Place labels on the right side.
2953
+ ``INB_TOP`` 0x8 Place labels above the page area.
2954
+ ``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
2955
+ ``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
2956
+ ``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
2957
+ ``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
2958
+ ``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
2959
+ ``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
2960
+ ``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
2961
+ ``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
2962
+ ``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
2963
+ ``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
2964
+ ``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
2965
+ =========================== =========== ==================================================
2966
+
2967
+ :param `name`: the window name.
2968
+ """
2969
+
2970
+ FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
2971
+
2972
+ self._pages = self.CreateImageContainer()
2973
+
2974
+ # Label book specific initialization
2975
+ self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
2976
+ self.SetSizer(self._mainSizer)
2977
+
2978
+ # Add the tab container to the sizer
2979
+ self._mainSizer.Add(self._pages, 0, wx.EXPAND)
2980
+ self._pages.SetSizeHints(self._pages.GetTabAreaWidth(), -1)
2981
+
2982
+ # Initialize the colours maps
2983
+ self._pages.InitializeColours()
2984
+
2985
+ self.Bind(wx.EVT_SIZE, self.OnSize)
2986
+
2987
+
2988
+ def CreateImageContainer(self):
2989
+ """ Creates the image container (LabelContainer) class for :class:`FlatImageBook`. """
2990
+
2991
+ return LabelContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag())
2992
+
2993
+
2994
+ def SetColour(self, which, colour):
2995
+ """
2996
+ Sets the colour for the specified parameter.
2997
+
2998
+ :param `which`: the colour key;
2999
+ :param `colour`: a valid :class:`wx.Colour` instance.
3000
+
3001
+ :see: :meth:`LabelContainer.SetColour() <LabelContainer.SetColour>` for a list of valid colour keys.
3002
+ """
3003
+
3004
+ self._pages.SetColour(which, colour)
3005
+
3006
+
3007
+ def GetColour(self, which):
3008
+ """
3009
+ Returns the colour for the specified parameter.
3010
+
3011
+ :param `which`: the colour key.
3012
+
3013
+ :see: :meth:`LabelContainer.SetColour() <LabelContainer.SetColour>` for a list of valid colour keys.
3014
+ """
3015
+
3016
+ return self._pages.GetColour(which)
3017
+
3018
+
3019
+ def OnSize(self, event):
3020
+ """
3021
+ Handles the ``wx.EVT_SIZE`` event for :class:`LabelBook`.
3022
+
3023
+ :param `event`: a :class:`wx.SizeEvent` event to be processed.
3024
+ """
3025
+
3026
+ self._pages.Refresh()
3027
+ event.Skip()
3028
+
3029
+