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,2119 @@
1
+ # --------------------------------------------------------------------------- #
2
+ # SCROLLEDTHUMBNAIL Control wxPython IMPLEMENTATION
3
+ # Python Code By:
4
+ #
5
+ # (c) 2021 Zombie
6
+ # Michael Eager (eager@eagercon.com), 26 Sep 2020
7
+ #
8
+ # Based on thumnailctrl.py by
9
+ # Andrea Gavana And Peter Damoc, @ 12 Dec 2005, revised 27 Dec 2012
10
+ # andrea.gavana@gmail.com
11
+ # andrea.gavana@maerskoil.com
12
+ #
13
+ # Tags: phoenix-port, documented, unittest, py3-port
14
+ #
15
+ # End Of Comments
16
+ # --------------------------------------------------------------------------- #
17
+
18
+ """
19
+ :class:`ScrolledThumbnail` is a widget that can be used to display a series of
20
+ thumbnails for files in a scrollable window.
21
+
22
+ Description
23
+ ===========
24
+
25
+ :class:`ScrolledThumbnail` is a widget derived from :class:`wx.ScrolledWindow`
26
+ which will display the thumbnail image for a file in a scrollable, resizable
27
+ window. It supports selecting one or more thumbnails, rotating the thumbnails,
28
+ displaying information for each thumbnail, and popups for both the window and
29
+ for individual thumbnails.
30
+
31
+ The class uses two support classes: :class:`Thumb` and :class:`ImageHandler`.
32
+
33
+ :class:`Thumb` contains all of the information for a particular thumbnail,
34
+ including filename, bitmaped thumbnail image, caption, and other data. This
35
+ class also has methods to perform thumbnail operations such as rotation,
36
+ highlighting, setting a file name.
37
+
38
+ :class:`ImageHandler` provides file/image handling functions, including loading
39
+ a file and creating an image from it, rotating an image, or highlighting an image.
40
+
41
+ The implementations of these two classes included in this file support generating
42
+ thumbnails from supported image files, such as JPEG, GIF, PNG, etc., using either
43
+ WxPythons native support or the PIL image library. Additional file types can be
44
+ supported by extending these classes, for example, to provide a thumbnail image
45
+ for an MP4 file, perhaps the cover photo, an MPEG by providing the image of a
46
+ title frame, or a PDF by providing an image of the cover page. The images for
47
+ these files may be generated on the fly by a suitably extended :class:`ImageHandler`,
48
+ or may be provided with the instance of :class:`Thumb`. The list of `Thumb`
49
+ instances passed to `ScrolledThumbnail` may contain different derived classes,
50
+ as long as each contains the required funtions.
51
+
52
+ NB: Use of :class:`ScrolledThumbnail` has not been tested with extended classes.
53
+
54
+ :class:`ScrolledThumbnail`, :class:`Thumb`, and :class:`ImageHandler`, implemented
55
+ here are derived from the similarly named classes included in :class:`agw.ThumbnailCtrl`,
56
+ written by Andrea Gavana. That implementation was tightly integrated as a image
57
+ file browser application. The current implementation removes dependencies between
58
+ the several classes and narrows the scope of `ScrolledThumbnail` to the placement
59
+ and management of thumbnails within a window.
60
+
61
+ An updated :class:`ThumbnailCtrl` which uses this implementation of
62
+ :class:`ScrolledThumbnail`, :class:`Thumb`, and :class:`ImageHandler` provides
63
+ all of the previous functionality, which described as a widget that can be used
64
+ to display a series of images in a "thumbnail" format; it mimics, for example,
65
+ the windows explorer behavior when you select the "view thumbnails" option.
66
+ Basically, by specifying a folder that contains some image files, the files
67
+ in the folder are displayed as miniature versions of the actual images in
68
+ a :class:`ScrolledWindow`.
69
+
70
+ The code in the previous implementation is partly based on `wxVillaLib`, a
71
+ wxWidgets implementation of the :class:`ThumbnailCtrl` control. Andrea Gavana
72
+ notes that :class:`ThumbnailCtrl` wouldn't have been so fast and complete
73
+ without the suggestions and hints from Peter Damoc.
74
+
75
+ Usage:
76
+ =====
77
+
78
+ Usage example::
79
+
80
+ import os
81
+ import wx
82
+ from scrolledthumbnail import ScrolledThumbnail, Thumb, NativeImageHandler
83
+
84
+ class MyFrame(wx.Frame):
85
+
86
+ def __init__(self, parent):
87
+ wx.Frame.__init__(self, parent, -1, "ScrolledThumb Demo", size=(400,300))
88
+
89
+ self.scroll = ScrolledThumbnail(self, -1, size=(400,300))
90
+
91
+ def ShowDir(self, dir):
92
+ dir = os.getcwd()
93
+ files = os.listdir(dir)
94
+ thumbs = []
95
+ for f in files:
96
+ if os.path.splitext(f)[1] in [".jpg", ".gif", ".png"]:
97
+ thumbs.append(Thumb(dir, f, caption=f, imagehandler=NativeImageHandler))
98
+ self.scroll.ShowThumbs(thumbs)
99
+
100
+
101
+ app = wx.App(False)
102
+ frame = MyFrame(None)
103
+ frame.ShowDir(os.getcwd())
104
+ frame.Show(True)
105
+
106
+ app.MainLoop()
107
+
108
+
109
+
110
+ Methods and Settings
111
+ ====================
112
+
113
+ With :class:`ScrolledThumbnail` you can:
114
+
115
+ - Create different thumbnail outlines (none, images only, full, etc...);
116
+ - Highlight thumbnails on mouse hovering;
117
+ - Show/hide file names below thumbnails;
118
+ - Change thumbnail caption font;
119
+ - Zoom in/out thumbnails (done via ``Ctrl`` key + mouse wheel or with ``+`` and ``-`` chars,
120
+ with zoom factor value customizable);
121
+ - Rotate thumbnails with these specifications:
122
+
123
+ a) ``d`` key rotates 90 degrees clockwise;
124
+ b) ``s`` key rotates 90 degrees counter-clockwise;
125
+ c) ``a`` key rotates 180 degrees.
126
+
127
+ - Drag and drop thumbnails from :class:`ScrolledThumbnail` to whatever application you want;
128
+ - Use local (when at least one thumbnail is selected) or global (no need for
129
+ thumbnail selection) popup menus;
130
+ - possibility to show tooltips on thumbnails, which display file information
131
+ (like file name, size, last modification date and thumbnail size).
132
+
133
+ :note: Using highlight thumbnails on mouse hovering may be slow on slower
134
+ computers.
135
+
136
+
137
+ Window Styles
138
+ =============
139
+
140
+ `No particular window styles are available for this class.`
141
+
142
+
143
+ Events Processing
144
+ =================
145
+
146
+ This class processes the following events:
147
+
148
+ This class processes the following events:
149
+
150
+ ================================== ==================================================
151
+ Event Name Description
152
+ ================================== ==================================================
153
+ ``EVT_THUMBNAILS_CAPTION_CHANGED`` The thumbnail caption has been changed. Not used at present.
154
+ ``EVT_THUMBNAILS_DCLICK`` The user has double-clicked on a thumbnail.
155
+ ``EVT_THUMBNAILS_POINTED`` The mouse cursor is hovering over a thumbnail.
156
+ ``EVT_THUMBNAILS_SEL_CHANGED`` The user has changed the selected thumbnail.
157
+ ``EVT_THUMBNAILS_THUMB_CHANGED`` The thumbnail of an image has changed. Used internally.
158
+ ``EVT_THUMBNAILS_CHAR`` A character has been typed
159
+ ================================== ==================================================
160
+
161
+
162
+ License And Version
163
+ ===================
164
+
165
+ :class:`ScrolledThumbnail` is distributed under the wxPython license.
166
+
167
+ Latest revision: Michael Eager @ 2 Oct 2020
168
+
169
+ Version 1.0
170
+
171
+ """
172
+
173
+ #----------------------------------------------------------------------
174
+ # Beginning Of ThumbnailCtrl wxPython Code
175
+ #----------------------------------------------------------------------
176
+
177
+ import os
178
+ import wx
179
+ import six
180
+ import zlib
181
+ from math import radians
182
+
183
+ from wx.lib.embeddedimage import PyEmbeddedImage
184
+
185
+ if six.PY3:
186
+ import _thread as thread
187
+ else:
188
+ import thread
189
+
190
+ #----------------------------------------------------------------------
191
+ # Get Default Icon/Data
192
+ #----------------------------------------------------------------------
193
+
194
+ #----------------------------------------------------------------------
195
+ file_broken = PyEmbeddedImage(
196
+ b"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAAK/INwWK6QAADU9J"
197
+ b"REFUeJzNWn1QE2cefja7yRI+lAKiAgKCVIqegUYMFMsM4kfvzk7nmFrnvHGcOT3bq3P/OJ1p"
198
+ b"b+zYf+r0HGxt6VVFqpYqWq9TW23RVnp6R7FXiq0UPAGhyFeQSCQJISHZ7Mf9gZuGkE02IeA9"
199
+ b"M5k3u/vuu+/z/H7v7/297y4BPzh//vxfSJIsIgjC5a/eTIPn+UnHgiDIqisIAsUwTNfmzZtf"
200
+ b"A8D7qk/5e3B0dPS6wsLCp/09MFTIbdO7ntR9vs5HRESgvr6+E0AlAD2AKZX8CsDzvEKtVsvq"
201
+ b"aKjw7LggCO7jcJQqlQoMw6gBpAIYRAgCECGxCgDPTsohEopI4n+e5xXww1MRHkry4d1Zf9fk"
202
+ b"uv90MOsCeMKfGN51pO6ZrmizKsBsWt976EjhoQ+BYMQItpSDWRNAjptPZ4xLCfl/PQTCaX2p"
203
+ b"+wNhVgSYbet7tumdRXpj1ofAbFhfqn1fmHEBHpb1AYAgAudxMy4AQRB+LReuSB/MGsETMyqA"
204
+ b"2WyG1WqVZQl/CDUZeuge0NvbKwwODk7bC7zryYFI/qF6QGNj42BnZ6dZ6rocQtNNhQNhxgQw"
205
+ b"Go24fPnyDy0tLTcFQfDpBZ7/w2198RcIMyZAW1vb+KVLlxoGBwfr7927B4Vi8qO8CfnqbCjW"
206
+ b"D4Y8MEMCCIKA77777me73d7a1tb25dDQkNXzmud/giDgdDrBsqzkuA1l7CuVSgCA0+n0y3FG"
207
+ b"BBgYGMCVK1eub926dRFN04aBgYH/el73JKRUKjE4OIi+vj5QFDWtaVG0fGRkJHiex7lz5xyn"
208
+ b"T59uBMBI9TWsAoidaW1tNTc1Nd1cv379zuzs7F91dHT8x+l0TooDnuju7h779ttvjdOdLlUq"
209
+ b"FaKjo9HV1YX9+/d379q16+QXX3xxFsAAMHU7DAgggNw1tQiCIOByuXDt2rWbK1asUOfk5KxM"
210
+ b"SUlZW19f39LX18eTJDmpbbG8cePGndra2mtDQ0NQKpUhJUPR0dHgeR6ffvqpbdeuXV+9/vrr"
211
+ b"R4eGhs4A+ArA3ZAECAXd3d24dOnSD2VlZavy8vKQmppaUFdXN2gwGO561yVJEmazGR0dHV3n"
212
+ b"z5//+NatW0MU5XebcgooikJMTAy6urqwb9++zp07d1ZfvXq1GsAn8+bNa6qsrEyGxJY4EGBT"
213
+ b"lCAIhVR0ZhgGTqcTTqcTDocDDocDgiDgm2++0Y+MjNxbuXLl7wmCQFpaWtbcuXMje3p6fly9"
214
+ b"enWyeL8gCCBJEj09PUJLS0s7z/PXWlpavigoKNhBURRYlnU/S6qMjIwEwzD47LPPbIcOHWq4"
215
+ b"cuXKPwF8D+DHF154QV1cXFxpsVjiAGwGYIUPL/ArgNFoNNbV1dmtVqvdarW6LBaLY2xszOFw"
216
+ b"OBiLxWKz2WxOs9lsHx0ddZhMJpvZbB7v7u7+effu3elZWVmJAJCUlBS1bt26nNbW1kaj0fj0"
217
+ b"I4884iYHAHfu3Lnf2dnZDWC4oaHhH08++eRWrVZLe9bxJk9RFNRqNTo6OvDhhx92Hj16tG5k"
218
+ b"ZKQBwHUAneXl5cVarfaQVqtddurUqesAUgC0BysAsWfPngOjo6ONY2NjUQzDOACMA7ADcGAi"
219
+ b"sjoBuB6U4jFTWlp6Kj4+HjzPIzExEbm5uSuPHz9+csuWLfaEhIRIl8sFgiDA8zxu3rz585Yt"
220
+ b"W3SpqanX9u7d+93GjRuv5eXlrRGvT+oQQUCtVsPhcODcuXO2w4cPi1ZvAnADgP3EiRN7NBrN"
221
+ b"ntzcXDXHcXA6nREAJF9u+BNA6OnpuQ1gGAD5gCjrUXIPFOUflAIA7siRI8Xp6ekaYOI1lVKp"
222
+ b"RGZmpqatre2QXq/v1mg0y4EJKxoMBrS1tQ2UlJQ8abPZjAD23Lhx46Pi4uI1aWlp7mEl1qdp"
223
+ b"Grdu3UJNTU1nVVVV3cjIyDUAPwJof+WVVzJ0Ol1NQUHBbxMTEyHOOoEQKOKMP/jJxoIFC/6Q"
224
+ b"mZlJidYTBAHp6emp2dnZCV1dXY0MwywnCAIkSUKv1zu7u7uNu3fvTh8aGtoE4Pj7779/ec2a"
225
+ b"NZ0ZGRlZwC9Wt9vt+Pzzz22VlZUNV69eFa3+EwDTkSNHynJyct5ZtWpVikKhgMPhgEKhkJx2"
226
+ b"gxFgSv1t27ZRUVFRFMuyZGZmZmJcXNwcpVIZT9N0tMvlWpiSklKmVConBbGkpCRq3bp1Kxsb"
227
+ b"G69v3Lhxe3p6OgRBQHt7u2Hx4sVRycnJ9Ny5czO3bdv2VHV19XvNzc2frF69+pXY2FgoFAop"
228
+ b"q3ds2rQp6plnnnkzLy9v99KlS8EwDDiOC2r5LSnAiRMnIubNm/dHkiSzaZqOIUkygabpGIqi"
229
+ b"4iiKmkuSZDRJkiqVSkWRJKmkaZqMiIhAZGQkOI5zk+c4DnFxccjOztZWVVV9+eKLLw5nZGTM"
230
+ b"YxgGzc3Ndx577LGF8fHxiI2NhU6n+111dfWZixcvnispKfmzTqebe+HCBW+rtwK4/8Ybb+Rp"
231
+ b"NJojBQUFq2JiYuB0OgH8kgqLpdiXoAVobW2NfvbZZ/cWFhbOly3ngwf6yvczMzNzWJZV9Pb2"
232
+ b"/lRUVLR2cHAQt2/fvrt9+3YtSZJQKBRYtmxZYXFx8ar6+vqrTU1NF7/++mtdZWXll0ajsQET"
233
+ b"Qa4TE3HmBY1Gsz8/P3+Oy+Vyj3dP8nK9QFKA/v5+Cn7GfzBZmiAISE5OTiwqKsq4fft2k91u"
234
+ b"X9vf3283GAyWtLS0ZNFTsrOzI0pKSsrq6+v//c477/xNr9evwMRr7ZsAhl966aUFOp3uzfz8"
235
+ b"/C2LFi3C+Pj4JMLeAsjJYiUFYFk2oIRyReA4DikpKSgqKlpZW1t7saysjOvo6NAvXbo0NjEx"
236
+ b"MZLneXAchzlz5kCj0TwVGxu7RK/Xt2Mihx8DwBw4cGBDbm5uRWFh4aNKpRJ2u30S8VCsD8hY"
237
+ b"CwRzXqouz/OIiopCVlaWtrm5+X57e/tAS0uLPicnJzEhIcE9TnmeR05OTvJzzz33a0xMtyNa"
238
+ b"rVY4fvz4a6WlpRdKSkoeFZfPYpSXIi93SyzYWWASMTmlZ/2MjIys+Pj4mI6Ojoa+vj5h/fr1"
239
+ b"xaKrikIlJyfj8ccfLwNw7NVXX43TarV/LyoqWhsXF4fx8XF3TPFF2Pv/tPIAu93ul7g/+BJD"
240
+ b"EAQsXLgwqrS0NLexsfE8RVHLFi1atNn7PpVKhdzc3OUvv/zyvg0bNvwmPz8/WeyPt8sHEkLO"
241
+ b"anZaQyCYDUmO47BgwQIsX758VW1t7bc6nU5ISkpSeuYLHMeBYRhkZWWpd+zY8afCwsJklmXB"
242
+ b"MMwUlw9EXjwOhIDL4dHRUQwMDMBms4Hn+YCuJSUKz/NQqVRYsmTJcgDzlixZsnzOnDlu1xfj"
243
+ b"AMdxoGkaqampsNvtEATBvZ8olzxBEO57whIDxsbGMD4+DrVajaioKERGRoKiKMmdXn9IT09P"
244
+ b"Li4ufiIxMVEHACzLThGW47gp54IhHwz8CiCSEt3P4XDA6XTCYrGApmnQNA2VSuUWwzvyescA"
245
+ b"l8uF+fPnK59//vm/zp8/f6FoebF98VlSBOWS99WXkATwfrhnw+JmiEKhgEKhAEmSEDM6KTEI"
246
+ b"gkBcXBwRExOTkpCQAJfLNSPkg4EsD/Algncs4Hl+ktv6+onjOS0tDTRNT1q4hJN8MCKE5AFS"
247
+ b"nQx0DQAYhkFqaqpbrJkmH5YPJMJFXqFQTBmTM0E+LB5gt9slXTpU8t4E5JKXSnsDkfV+HReU"
248
+ b"AJ6YLnlf1pNLXhAEmM1msCw7KSZ598/7PEEQ4DgOLMv6VSHQt8JhIS/HG/y5vV6vh9FohFqt"
249
+ b"ducN3r8pxCgKJpMJvb29o/hlzzI4AUSEk7yUtfyJwTAMMjMzsXjxYr/zuuf7wbt376K8vLz/"
250
+ b"7NmzlzCxpA5NgHCTl1vHFzkAPjNE774aDAaUl5f3V1RU1HAc9y9MbKr4RMA8QIr4TJP3LEU3"
251
+ b"5zjOnTtItWUwGLB//36R/CVMbKXZQhbAV2dnk7zYD3G1KI537/oURbndvqKi4hTHcV9iYvd4"
252
+ b"zB/HkFPh6ZL3JurvHIBJXuB9XfzG4MCBA/3vvvtujVzysgTwR2I65KVmAl/3iUtmlmUnDQGR"
253
+ b"/P3793H48GH9A/Ki2wckH1AAzxjgS4yZJO/dD899A7EORVEYGRlBVVWV8b333vs4GMvLEsAT"
254
+ b"oQ4Ff+Q92/YniGcMEAUQ5/ljx44Nv/XWWx9ZrdaLAJqDIR9QAO/9gHCTlxsERRFEAZRKJUwm"
255
+ b"E6qrq4cPHjx4xmq11mLi1bglGPIBBfBF8mGQFyHmACaTCSdPnhx+++23z4yOjtZi4pWZKVjy"
256
+ b"sgTwFiIU8v7GuVzyIsxmM06fPj188ODBjx5Y/nsAkl+jBoLsPECEryDl7ziQMHLJkyQJi8WC"
257
+ b"mpqa4YqKCtHtmzAN8oCM9wJKpRIRERGyyAQi6CvwyeokRcFsNqOurm64oqLijMVimZbbT2pb"
258
+ b"6gJN04TNZlNZLBYwDOOeEgNtMsqpF+y1sbEx1NbWDn/wwQdhJQ8AkmZYsWJFVEZGxtZ79+49"
259
+ b"wbIsDa/VlBQJqS0of6QD3UMQBHp7e++YTKYrCIPbe8KfHyoALACwGIAqXA8MEQImPnO7A2Ak"
260
+ b"nA3/D+/OyD/Ur3BPAAAAAElFTkSuQmCC")
261
+
262
+
263
+ def getDataSH():
264
+ """ Return the first part of the shadow dropped behind thumbnails. """
265
+
266
+ return zlib.decompress(
267
+ b'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2_A\x98\x83\rHvl\
268
+ \xdc\x9c\n\xa4X\x8a\x9d<C8\x80\xa0\x86#\xa5\x83\x81\x81y\x96\xa7\x8bcH\xc5\
269
+ \x9c\xb7\xd7\xd7\xf6\x85D2\xb4^\xbc\x1b\xd0\xd0p\xa6\x85\x9d\xa1\xf1\xc0\xc7\
270
+ \x7f\xef\x8d\x98\xf89_:p]\xaew\x0c\xe9\x16[\xbc\x8bSt\xdf\x9aT\xad\xef\xcb\
271
+ \x8e\x98\xc5\xbf\xb3\x94\x9ePT\xf8\xff\xf7\xfbm\xf5\xdb\xfeZ<\x16{\xf01o[l\
272
+ \xee\xee\xbd7\xbe\x95\xdd\xde\x9d+\xbf\xfdo\xf9\xb9\xd0\x03\x8be\xb7\xc7\xe6\
273
+ Y\xcb\xbd\x8b\xdfs\xe3[\xd6\xed\xe5\x9b}\x99\xe6=:\xbd\xed\xfc\xedu|\xfcq\
274
+ \xfb\xec/K<\xf8\xfec\xd7\xdb\xdb\x87W\xec\xcf\xfd]\xb0\xcc\xf0\xc0\xe5=\xf7^\
275
+ \x1e\xf9\xfb\xe6\xe6\xce\xe9\x0c\xfb\xa7\xafPt\xbb"\xa0\x9c\xd5!hz\xa4C*\xc9\
276
+ \x85\xd7pQ\x9bD\xa0s\xcf\xa8\xf0\xa8\xf0\x00\x0b\x9fyX\x7fo\xef\xdf\xc7\xda\
277
+ \r\xcbw\xd4\xfcx\xe0\xcdk\xd8\x9e[~{\xdd\xf6\xbfw\xbe\xfd\xddS\xdc\xe0\xfec_\
278
+ \xf0\xfe\xeb\xb7\xdf\xf1\xdd\xce\xdb&\xbb\xbdv\xe7\xff\xc3\xaf\x8dy\x99\xe5\
279
+ \x9e?\xf7\xfb+\xb7\xfdnLN\xf5\xc6\xb7g\xfd\xca_\x9a\x7f?\x7f\xe0\xfe\xe3\xaa\
280
+ \xe5\x0b\xf4\xb7\xcb\xea\x97\xed\n\xb7\xbf\xff\xadh\xf9\xe3\x1d\xd5f\x7fb\
281
+ \xdf\x95Y\x15\xc6\xe7\xee\xfe\xcbz7Y\xbd\xde[\xf3y\x1f0\xd72x\xba\xfa\xb9\
282
+ \xacsJh\x02\x00\xc4i\x8dN' )
283
+
284
+
285
+ def getDataBL():
286
+ """ Return the second part of the shadow dropped behind thumbnails. """
287
+
288
+ return zlib.decompress(
289
+ b"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\xac \xcc\xc1\
290
+ \x06${\xf3\xd5\x9e\x02)\x96b'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2\xed=]\x1cC8f\
291
+ \xea\x9e\xde\xcb\xd9` \xc2\xf0P\xdf~\xc9y\xaeu\x0f\xfe1\xdf\xcc\x14\x1482A\
292
+ \xe9\xfd\x83\x1d\xaf\x84\xac\xf8\xe6\\\x8c3\xfc\x98\xf8\xa0\xb1\xa9K\xec\x9f\
293
+ \xc4\xd1\xb4GG{\xb5\x15\x8f_|t\x8a[a\x1fWzG\xa9\xc4,\xa0Q\x0c\x9e\xae~.\xeb\
294
+ \x9c\x12\x9a\x00\x7f1,7" )
295
+
296
+
297
+ def getDataTR():
298
+ """ Return the third part of the shadow dropped behind thumbnails. """
299
+
300
+ return zlib.decompress(
301
+ b'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\xac \xcc\xc1\
302
+ \x06${\xf3\xd5\x9e\x02)\x96b\'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2m=]\x1cC8f\
303
+ \xe6\x9e\xd9\xc8\xd9` \xc2p\x91\xbd\xaei\xeeL\x85\xdcUo\xf6\xf7\xd6\xb2\x88\
304
+ \x0bp\x9a\x89i\x16=-\x94\xe16\x93\xb9!\xb8y\xcd\t\x0f\x89\n\xe6\xb7\xfcV~6\
305
+ \x8dFo\xf5\xee\xc8\x1fOaw\xc9\x88\x0c\x16\x05\x1a\xc4\xe0\xe9\xea\xe7\xb2\
306
+ \xce)\xa1\t\x00"\xf9$\x83' )
307
+
308
+
309
+ def getShadow():
310
+ """ Creates a shadow behind every thumbnail. """
311
+
312
+ sh_tr = wx.Image(six.BytesIO(getDataTR())).ConvertToBitmap()
313
+ sh_bl = wx.Image(six.BytesIO(getDataBL())).ConvertToBitmap()
314
+ sh_sh = wx.Image(six.BytesIO(getDataSH())).Rescale(500, 500, wx.IMAGE_QUALITY_HIGH)
315
+ return (sh_tr, sh_bl, sh_sh.ConvertToBitmap())
316
+
317
+
318
+ #-----------------------------------------------------------------------------
319
+ # PATH & FILE FILLING (OS INDEPENDENT)
320
+ #-----------------------------------------------------------------------------
321
+
322
+ def opj(path):
323
+ """
324
+ Convert paths to the platform-specific separator.
325
+
326
+ :param `path`: the path to convert.
327
+ """
328
+
329
+ strs = os.path.join(*tuple(path.split('/')))
330
+ # HACK: on Linux, a leading / gets lost...
331
+ if path.startswith('/'):
332
+ strs = '/' + strs
333
+
334
+ return strs
335
+
336
+ #-----------------------------------------------------------------------------
337
+
338
+ # Different Outline On Thumb Selection:
339
+ # THUMB_OUTLINE_NONE: No Outline Drawn On Selection
340
+ # THUMB_OUTLINE_FULL: Full Outline Drawn On Selection
341
+ # THUMB_OUTLINE_RECT: Only Maximum Image Rect Outlined On Selection
342
+ # THUMB_OUTLINE_IMAGE: Only Image Rect Outlined On Selection
343
+
344
+ THUMB_OUTLINE_NONE = 0
345
+ """ No outline drawn on selection. """
346
+ THUMB_OUTLINE_FULL = 1
347
+ """ Full outline drawn on selection. """
348
+ THUMB_OUTLINE_RECT = 2
349
+ """ Only the maximum image rectangle outlined on selection. """
350
+ THUMB_OUTLINE_IMAGE = 4
351
+ """ Only the image rectangle outlined on selection. """
352
+
353
+ # ThumbnailCtrl Events:
354
+ # wxEVT_THUMBNAILS_SEL_CHANGED: Event Fired When You Change Thumb Selection
355
+ # wxEVT_THUMBNAILS_POINTED: Event Fired When You Point A Thumb
356
+ # wxEVT_THUMBNAILS_DCLICK: Event Fired When You Double-Click A Thumb
357
+ # wxEVT_THUMBNAILS_CAPTION_CHANGED: Not Used At Present
358
+ # wxEVT_THUMBNAILS_THUMB_CHANGED: Used nternally
359
+ # wxEVT_THUMBNAILS_CHAR: Event Fired when character typed
360
+
361
+ wxEVT_THUMBNAILS_SEL_CHANGED = wx.NewEventType()
362
+ wxEVT_THUMBNAILS_POINTED = wx.NewEventType()
363
+ wxEVT_THUMBNAILS_DCLICK = wx.NewEventType()
364
+ wxEVT_THUMBNAILS_CAPTION_CHANGED = wx.NewEventType()
365
+ wxEVT_THUMBNAILS_THUMB_CHANGED = wx.NewEventType()
366
+ wxEVT_THUMBNAILS_CHAR = wx.NewEventType()
367
+
368
+ #-----------------------------------#
369
+ # ThumbnailCtrlEvent
370
+ #-----------------------------------#
371
+
372
+ EVT_THUMBNAILS_SEL_CHANGED = wx.PyEventBinder(wxEVT_THUMBNAILS_SEL_CHANGED, 1)
373
+ """ The user has changed the selected thumbnail. """
374
+ EVT_THUMBNAILS_POINTED = wx.PyEventBinder(wxEVT_THUMBNAILS_POINTED, 1)
375
+ """ The mouse cursor is hovering over a thumbnail. """
376
+ EVT_THUMBNAILS_DCLICK = wx.PyEventBinder(wxEVT_THUMBNAILS_DCLICK, 1)
377
+ """ The user has double-clicked on a thumbnail. """
378
+ EVT_THUMBNAILS_THUMB_CHANGED = wx.PyEventBinder(wxEVT_THUMBNAILS_THUMB_CHANGED, 1)
379
+ """ The thumbnail of an image has changed. Used internally"""
380
+ EVT_THUMBNAILS_CHAR = wx.PyEventBinder(wxEVT_THUMBNAILS_CHAR, 1)
381
+ """ A character has been typed. """
382
+
383
+ # ---------------------------------------------------------------------------- #
384
+ # Class PILImageHandler, handles loading and highlighting images with PIL
385
+ # ---------------------------------------------------------------------------- #
386
+
387
+ class PILImageHandler(object):
388
+ """
389
+ This image handler loads and manipulates the thumbnails with the help
390
+ of PIL (the Python Imaging Library).
391
+ """
392
+
393
+ def __init__(self):
394
+ """
395
+ Default class constructor.
396
+
397
+ :note: If PIL is not installed, this will raise an exception. PIL
398
+ can be downloaded from http://www.pythonware.com/products/pil/ .
399
+ """
400
+
401
+ try:
402
+
403
+ import PIL.Image as Image
404
+ import PIL.ImageEnhance as ImageEnhance
405
+
406
+ except ImportError:
407
+
408
+ errstr = ("\nThumbnailCtrl *requires* PIL (Python Imaging Library).\n"
409
+ "You can get it at:\n\n"
410
+ "http://www.pythonware.com/products/pil/\n\n"
411
+ "ThumbnailCtrl can not continue. Exiting...\n")
412
+
413
+ raise Exception(errstr)
414
+
415
+
416
+ def Load(self, filename):
417
+ """
418
+ Load the file.
419
+
420
+ :param `filename`: a file containing an image;
421
+ """
422
+
423
+ import PIL.Image as Image
424
+
425
+ try:
426
+ with Image.open(filename) as pil:
427
+ originalsize = pil.size
428
+
429
+ img = wx.Image(pil.size[0], pil.size[1])
430
+
431
+ img.SetData(pil.convert("RGB").tobytes())
432
+
433
+ alpha = False
434
+ if "A" in pil.getbands():
435
+ img.SetAlpha(pil.convert("RGBA").tobytes()[3::4])
436
+ alpha = True
437
+ except:
438
+ img = file_broken.GetImage()
439
+ originalsize = (img.GetWidth(), img.GetHeight())
440
+ alpha = False
441
+
442
+ return img, originalsize, alpha
443
+
444
+
445
+ def HighlightImage(self, img, factor):
446
+ """
447
+ Adjust overall image brightness to highlight.
448
+
449
+ :param `img`: an instance of :class:`wx.Image`;
450
+ :param `factor`: unused in :class:`PILImageHandler`.
451
+ """
452
+
453
+ import PIL.Image as Image
454
+ import PIL.ImageEnhance as ImageEnhance
455
+
456
+ pil = Image.new('RGB', (img.GetWidth(), img.GetHeight()))
457
+ pil.frombytes(bytes(img.GetData()))
458
+ enh = ImageEnhance.Brightness(pil)
459
+ enh = enh.enhance(1.5)
460
+ img.SetData(enh.convert('RGB').tobytes())
461
+ return img
462
+
463
+ def Rotate(self, img, angle):
464
+ """
465
+ Rotate image by angle degrees.
466
+
467
+ :param img: an instance of :class:wx.Image;
468
+ :param angle: angle in degrees
469
+ :return: rotated image
470
+ """
471
+
472
+ img = img.Rotate(radians(angle), (img.GetWidth(), img.GetHeight()), True)
473
+ return img
474
+
475
+ # ---------------------------------------------------------------------------- #
476
+ # Class NativeImageHandler, handles loading and highlighting images with wx
477
+ # ---------------------------------------------------------------------------- #
478
+
479
+ class NativeImageHandler(object):
480
+ """
481
+ This image handler loads and manipulates the thumbnails with the help of
482
+ wxPython's own image related functions.
483
+ """
484
+
485
+ def Load(self, filename):
486
+ """
487
+ Load the file.
488
+
489
+ :param `filename`: a file containing an image;
490
+ """
491
+
492
+ img = wx.Image(filename)
493
+
494
+ # Don't stop when a corrupt file is to be loaded, show Mondrian instead
495
+ try:
496
+ originalsize = (img.GetWidth(), img.GetHeight())
497
+ alpha = img.HasAlpha()
498
+ assert img.IsOk()
499
+ except:
500
+ img = file_broken.GetImage()
501
+ originalsize = (img.GetWidth(), img.GetHeight())
502
+ alpha = False
503
+
504
+ return img, originalsize, alpha
505
+
506
+
507
+ def HighlightImage(self, img, factor):
508
+ """
509
+ Adjust overall image brightness to highlight.
510
+
511
+ :param `img`: an instance of :class:`wx.Image`;
512
+ :param `factor`: a floating point number representing the highlight factor.
513
+ """
514
+
515
+ return img.AdjustChannels(factor, factor, factor, factor)
516
+
517
+
518
+ def Rotate(self, img, angle):
519
+ """
520
+ Rotate image by angle degrees.
521
+
522
+ :param img: an instance of :class:wx.Image;
523
+ :param angle: angle in degrees
524
+ :return: rotated image
525
+ """
526
+
527
+ img = img.Rotate(radians(angle), (img.GetWidth(), img.GetHeight()), True)
528
+ return img
529
+
530
+
531
+ # ---------------------------------------------------------------------------- #
532
+ # Class Thumb
533
+ # Auxiliary Class, To Handle Single Thumb Information For Every Thumb.
534
+ # ---------------------------------------------------------------------------- #
535
+
536
+ class Thumb(object):
537
+ """
538
+ This is an auxiliary class, to handle single thumbnail information for every thumb.
539
+
540
+ Used internally.
541
+ """
542
+
543
+ def __init__(self, folder, filename, caption="", size=0, lastmod=0, imagehandler=None):
544
+ """
545
+ Default class constructor.
546
+
547
+ :param `folder`: the directory containing the images;
548
+ :param `filename`: a file containing an image;
549
+ :param `caption`: the thumbnail caption string;
550
+ :param `size`: the file size;
551
+ :param `lastmod`: the file last modification time.
552
+ """
553
+
554
+ self._filename = filename
555
+ self.SetCaption(caption)
556
+ self._id = 0
557
+ self._dir = folder
558
+ self._filesize = size
559
+ self._lastmod = lastmod
560
+ self._captionbreaks = []
561
+ self._image = wx.Image(1, 1)
562
+ self._alpha = None
563
+ self._imagehandler = imagehandler()
564
+ self._bitmap = None
565
+
566
+
567
+ def SetCaption(self, caption=""):
568
+ """
569
+ Sets the thumbnail caption.
570
+
571
+ :param `caption`: the thumbnail caption string.
572
+ """
573
+
574
+ self._caption = caption
575
+ self._captionbreaks = []
576
+
577
+
578
+ def GetImage(self):
579
+ """ Returns the thumbnail image. """
580
+
581
+ return self._image
582
+
583
+
584
+ def SetImage(self, image):
585
+ """
586
+ Sets the thumbnail image.
587
+
588
+ :param `image`: a :class:`wx.Image` object.
589
+ """
590
+
591
+ self._image = image
592
+
593
+
594
+ def GetFileName(self):
595
+ """ Returns the file name associated with this thumbnail. """
596
+
597
+ return self._filename
598
+
599
+
600
+ def SetFileName(self, filename):
601
+ """
602
+ Sets the file name associated with this thumbnail.
603
+
604
+ :param `filename`: the file containing the image.
605
+ """
606
+
607
+ self._filename = filename
608
+
609
+
610
+ def GetId(self):
611
+ """ Returns the thumbnail identifier. """
612
+
613
+ return self._id
614
+
615
+
616
+ def SetId(self, id=-1):
617
+ """
618
+ Sets the thumbnail identifier.
619
+
620
+ :param `id`: an integer specifying the thumbnail identifier.
621
+ """
622
+
623
+ self._id = id
624
+
625
+
626
+ def GetThumbnail(self, width, height):
627
+ """
628
+ Returns the wx.Image of the thumbnail
629
+
630
+ :param `width`: the associated bitmap width;
631
+ :param `height`: the associated bitmap height.
632
+ """
633
+
634
+ img = self._image
635
+ imgwidth, imgheight = (img.GetWidth(), img.GetHeight())
636
+ if width < imgwidth or height < imgheight:
637
+ scale = float(width)/imgwidth
638
+
639
+ if scale > float(height)/imgheight:
640
+ scale = float(height)/imgheight
641
+
642
+ newW, newH = int(imgwidth*scale), int(imgheight*scale)
643
+ if newW < 1:
644
+ newW = 1
645
+ if newH < 1:
646
+ newH = 1
647
+
648
+ img = img.Scale(newW, newH)
649
+
650
+ return img
651
+
652
+
653
+ def GetBitmap(self, width, height):
654
+ """
655
+ Returns the bitmap of the thumbnail
656
+
657
+ :param `width`: the associated bitmap width;
658
+ :param `height`: the associated bitmap height.
659
+ """
660
+
661
+ if self._bitmap:
662
+ if self._bitmap.GetWidth() == width and self._bitmap.GetHeight() == height:
663
+ return self._bitmap
664
+
665
+ img = self.GetThumbnail(width, height)
666
+ bmp = img.ConvertToBitmap()
667
+
668
+ return bmp
669
+
670
+
671
+ def GetFullFileName(self):
672
+ """ Returns the full filename of the thumbnail. """
673
+
674
+ return os.path.join(self._dir, self._filename)
675
+
676
+
677
+ def GetCaption(self, line):
678
+ """
679
+ Returns the caption associated to a thumbnail.
680
+
681
+ :param `line`: the caption line we wish to retrieve (useful for multilines
682
+ caption strings).
683
+ """
684
+
685
+ if line + 1 >= len(self._captionbreaks):
686
+ return ""
687
+
688
+ strs = self._caption
689
+
690
+ return strs
691
+
692
+
693
+ def GetFileSize(self):
694
+ """ Returns the file size in bytes associated to a thumbnail. """
695
+
696
+ return self._filesize
697
+
698
+
699
+ def GetDisplayFileSize(self):
700
+ """ Return printable file size (with bytes, Kb, Mb suffix). """
701
+
702
+ size = self.GetFileSize()
703
+ if size < 1000:
704
+ size = str(size) + " bytes"
705
+ elif size < 1000000:
706
+ size = str(int(round(size/1000.0))) + " Kb"
707
+ else:
708
+ size = str(round(size/1000000.0, 2)) + " Mb"
709
+ return size
710
+
711
+
712
+ def GetCreationDate(self):
713
+ """ Returns the file last modification date associated to a thumbnail. """
714
+
715
+ return self._lastmod
716
+
717
+
718
+ def GetOriginalSize(self):
719
+ """ Returns a tuple containing the original image width and height, in pixels. """
720
+
721
+ return self._originalsize
722
+
723
+
724
+ def GetCaptionLinesCount(self, width):
725
+ """
726
+ Returns the number of lines for the caption.
727
+
728
+ :param `width`: the maximum width, in pixels, available for the caption text.
729
+ """
730
+
731
+ self.BreakCaption(width)
732
+ return len(self._captionbreaks) - 1
733
+
734
+
735
+ def BreakCaption(self, width):
736
+ """
737
+ Breaks the caption in several lines of text (if needed).
738
+
739
+ :param `width`: the maximum width, in pixels, available for the caption text.
740
+ """
741
+
742
+ if len(self._captionbreaks) > 0 or width < 16:
743
+ return
744
+
745
+ self._captionbreaks.append(0)
746
+
747
+ if len(self._caption) == 0:
748
+ return
749
+
750
+ pos = width//16
751
+ beg = 0
752
+ end = 0
753
+
754
+ dc = wx.MemoryDC()
755
+ bmp = wx.Bitmap(10, 10)
756
+ dc.SelectObject(bmp)
757
+
758
+ while 1:
759
+
760
+ if pos >= len(self._caption):
761
+
762
+ self._captionbreaks.append(len(self._caption))
763
+ break
764
+
765
+ sw, sh = dc.GetTextExtent(self._caption[beg:pos-beg])
766
+
767
+ if sw > width:
768
+
769
+ if end > 0:
770
+
771
+ self._captionbreaks.append(end)
772
+ beg = end
773
+
774
+ else:
775
+
776
+ self._captionbreaks.append(pos)
777
+ beg = pos
778
+
779
+ pos = beg + width//16
780
+ end = 0
781
+
782
+ if pos < len(self._caption) and self._caption[pos] in [" ", "-", ",", ".", "_"]:
783
+ end = pos + 1
784
+
785
+ pos = pos + 1
786
+
787
+
788
+ dc.SelectObject(wx.NullBitmap)
789
+
790
+
791
+ def GetInfo(self):
792
+ """ Returns info for thumbnain in display format. """
793
+ thumbinfo = "Name: " + self.GetFileName() + "\n" \
794
+ "Size: " + self.GetDisplayFileSize() + "\n" \
795
+ "Modified: " + self.GetCreationDate() + "\n" \
796
+ "Dimensions: " + str(self.GetOriginalSize()) + "\n"
797
+ return thumbinfo
798
+
799
+
800
+ def LoadImage(self):
801
+ """ Load image using imagehandler. """
802
+ filename = self.GetFullFileName()
803
+ img, size, alpha = self._imagehandler.Load(filename)
804
+ self._image = img
805
+ self._originalsize = size
806
+ self._alpha = alpha
807
+
808
+
809
+ def Rotate(self, angle):
810
+ """ Rotate image using imagehandler. """
811
+ img = self._imagehandler.Rotate(self._image, angle)
812
+ self._image = img
813
+ self._originalsize = (img.GetWidth, img.GetHeight)
814
+ self._alpha = img.HasAlpha()
815
+ # Clear _bitmap so thumbnail is recreated after rotate
816
+ self._bitmap = None
817
+
818
+
819
+ def GetHighlightBitmap(self, width, height, factor):
820
+ """ Returned highlighted bitmap of thumbnail. """
821
+
822
+ img = self.GetThumbnail(width, height)
823
+ img = self._imagehandler.HighlightImage(img, factor)
824
+
825
+ bmp = img.ConvertToBitmap()
826
+
827
+ return bmp
828
+
829
+ # ---------------------------------------------------------------------------- #
830
+ # Class ScrolledThumbnail
831
+ # This Is The Main Class Implementation
832
+ # ---------------------------------------------------------------------------- #
833
+
834
+ class ScrolledThumbnail(wx.ScrolledWindow):
835
+ """ This is the main class implementation of :class:`ThumbnailCtrl`. """
836
+
837
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
838
+ size=wx.DefaultSize, thumboutline=THUMB_OUTLINE_IMAGE,
839
+ imagehandler=None):
840
+ """
841
+ Default class constructor.
842
+
843
+ :param `parent`: parent window. Must not be ``None``;
844
+ :param `id`: window identifier. A value of -1 indicates a default value;
845
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
846
+ chosen by either the windowing system or wxPython, depending on platform;
847
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
848
+ chosen by either the windowing system or wxPython, depending on platform;
849
+ :param `thumboutline`: outline style for :class:`ScrolledThumbnail`, which may be:
850
+
851
+ =========================== ======= ==================================
852
+ Outline Flag Value Description
853
+ =========================== ======= ==================================
854
+ ``THUMB_OUTLINE_NONE`` 0 No outline is drawn on selection
855
+ ``THUMB_OUTLINE_FULL`` 1 Full outline (image+caption) is drawn on selection
856
+ ``THUMB_OUTLINE_RECT`` 2 Only thumbnail bounding rectangle is drawn on selection (default)
857
+ ``THUMB_OUTLINE_IMAGE`` 4 Only image bounding rectangle is drawn.
858
+ =========================== ======= ==================================
859
+
860
+ :param `imagehandler`: can be :class:`PILImageHandler` if PIL is installed (faster), or
861
+ :class:`NativeImageHandler` which only uses wxPython image methods.
862
+ """
863
+
864
+ wx.ScrolledWindow.__init__(self, parent, id, pos, size)
865
+
866
+ self._items = []
867
+ self.SetThumbSize(96, 80)
868
+ self._tOutline = thumboutline
869
+ self._selected = -1
870
+ self._pointed = -1
871
+ self._pmenu = None
872
+ self._gpmenu = None
873
+ self._dragging = False
874
+ self._checktext = False
875
+ self._dropShadow = True
876
+
877
+ self._tCaptionHeight = []
878
+ self._selectedarray = []
879
+ self._tTextHeight = 16
880
+ self._tCaptionBorder = 8
881
+ self._tOutlineNotSelected = True
882
+ self._mouseeventhandled = False
883
+ self._highlight = False
884
+ self._zoomfactor = 1.4
885
+ self.SetCaptionFont()
886
+
887
+ self._enabletooltip = False
888
+
889
+ self._parent = parent
890
+
891
+ self._selectioncolour = "#009EFF"
892
+ self.grayPen = wx.Pen("#A2A2D2", 1, wx.SHORT_DASH)
893
+ self.grayPen.SetJoin(wx.JOIN_MITER)
894
+ self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_LISTBOX))
895
+
896
+ t, b, s = getShadow()
897
+ self.shadow = wx.MemoryDC()
898
+ self.shadow.SelectObject(s)
899
+
900
+ self.ShowFileNames(True)
901
+
902
+ self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
903
+ self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
904
+ self.Bind(wx.EVT_LEFT_DCLICK, self.OnMouseDClick)
905
+ self.Bind(wx.EVT_RIGHT_DOWN, self.OnMouseDown)
906
+ self.Bind(wx.EVT_RIGHT_UP, self.OnMouseUp)
907
+ self.Bind(wx.EVT_MOTION, self.OnMouseMove)
908
+ self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeave)
909
+ self.Bind(EVT_THUMBNAILS_THUMB_CHANGED, self.OnThumbChanged)
910
+ self.Bind(wx.EVT_CHAR, self.OnChar)
911
+ self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel)
912
+
913
+ self.Bind(wx.EVT_SIZE, self.OnResize)
914
+ self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x: None)
915
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
916
+
917
+
918
+ def GetSelectedItem(self, index):
919
+ """
920
+ Returns the selected thumbnail.
921
+
922
+ :param `index`: the thumbnail index (i.e., the selection).
923
+ """
924
+
925
+ return self.GetItem(self.GetSelection(index))
926
+
927
+
928
+ def GetPointed(self):
929
+ """ Returns the pointed thumbnail index. """
930
+
931
+ return self._pointed
932
+
933
+
934
+ def GetHighlightPointed(self):
935
+ """
936
+ Returns whether the thumbnail pointed should be highlighted or not.
937
+
938
+ :note: Please be aware that this functionality may be slow on slower computers.
939
+ """
940
+
941
+ return self._highlight
942
+
943
+
944
+ def SetHighlightPointed(self, highlight=True):
945
+ """
946
+ Sets whether the thumbnail pointed should be highlighted or not.
947
+
948
+ :param `highlight`: ``True`` to enable highlight-on-point with the mouse,
949
+ ``False`` otherwise.
950
+
951
+ :note: Please be aware that this functionality may be slow on slower computers.
952
+ """
953
+
954
+ self._highlight = highlight
955
+
956
+
957
+ def SetThumbOutline(self, outline):
958
+ """
959
+ Sets the thumbnail outline style on selection.
960
+
961
+ :param `outline`: the outline to use on selection. This can be one of the following
962
+ bits:
963
+
964
+ =========================== ======= ==================================
965
+ Outline Flag Value Description
966
+ =========================== ======= ==================================
967
+ ``THUMB_OUTLINE_NONE`` 0 No outline is drawn on selection
968
+ ``THUMB_OUTLINE_FULL`` 1 Full outline (image+caption) is drawn on selection
969
+ ``THUMB_OUTLINE_RECT`` 2 Only thumbnail bounding rectangle is drawn on selection (default)
970
+ ``THUMB_OUTLINE_IMAGE`` 4 Only image bounding rectangle is drawn.
971
+ =========================== ======= ==================================
972
+
973
+ """
974
+
975
+ if outline not in [THUMB_OUTLINE_NONE, THUMB_OUTLINE_FULL, THUMB_OUTLINE_RECT,
976
+ THUMB_OUTLINE_IMAGE]:
977
+ return
978
+
979
+ self._tOutline = outline
980
+
981
+
982
+ def GetThumbOutline(self):
983
+ """
984
+ Returns the thumbnail outline style on selection.
985
+
986
+ :see: :meth:`~ScrolledThumbnail.SetThumbOutline` for a list of possible return values.
987
+ """
988
+
989
+ return self._tOutline
990
+
991
+
992
+ def SetDropShadow(self, drop):
993
+ """
994
+ Sets whether to drop a shadow behind thumbnails or not.
995
+
996
+ :param `drop`: ``True`` to drop a shadow behind each thumbnail, ``False`` otheriwise.
997
+ """
998
+
999
+ self._dropShadow = drop
1000
+ self.Refresh()
1001
+
1002
+
1003
+ def GetDropShadow(self):
1004
+ """
1005
+ Returns whether to drop a shadow behind thumbnails or not.
1006
+ """
1007
+
1008
+ return self._dropShadow
1009
+
1010
+
1011
+ def GetPointedItem(self):
1012
+ """ Returns the pointed thumbnail. """
1013
+
1014
+ return self.GetItem(self._pointed)
1015
+
1016
+
1017
+ def GetItem(self, index):
1018
+ """
1019
+ Returns the item at position `index`.
1020
+
1021
+ :param `index`: the thumbnail index position.
1022
+ """
1023
+
1024
+ return index >= 0 and (index < len(self._items) and [self._items[index]] or [None])[0]
1025
+
1026
+
1027
+ def GetItemCount(self):
1028
+ """ Returns the number of thumbnails. """
1029
+
1030
+ return len(self._items)
1031
+
1032
+
1033
+ def GetThumbWidth(self):
1034
+ """ Returns the thumbnail width. """
1035
+
1036
+ return self._tWidth
1037
+
1038
+
1039
+ def GetThumbHeight(self):
1040
+ """ Returns the thumbnail height. """
1041
+
1042
+ return self._tHeight
1043
+
1044
+
1045
+ def GetThumbBorder(self):
1046
+ """ Returns the thumbnail border. """
1047
+
1048
+ return self._tBorder
1049
+
1050
+
1051
+ def ShowFileNames(self, show=True):
1052
+ """
1053
+ Sets whether the user wants to show file names under the thumbnails or not.
1054
+
1055
+ :param `show`: ``True`` to show file names under the thumbnails, ``False`` otherwise.
1056
+ """
1057
+
1058
+ self._showfilenames = show
1059
+ self.Refresh()
1060
+
1061
+
1062
+ def SetPopupMenu(self, menu):
1063
+ """
1064
+ Sets the thumbnails popup menu when at least one thumbnail is selected.
1065
+
1066
+ :param `menu`: an instance of :class:`wx.Menu`.
1067
+ """
1068
+
1069
+ self._pmenu = menu
1070
+
1071
+
1072
+ def GetPopupMenu(self):
1073
+ """ Returns the thumbnails popup menu when at least one thumbnail is selected. """
1074
+
1075
+ return self._pmenu
1076
+
1077
+
1078
+ def SetGlobalPopupMenu(self, gpmenu):
1079
+ """
1080
+ Sets the global thumbnails popup menu (no need of thumbnail selection).
1081
+
1082
+ :param `gpmenu`: an instance of :class:`wx.Menu`.
1083
+ """
1084
+
1085
+ self._gpmenu = gpmenu
1086
+
1087
+
1088
+ def GetGlobalPopupMenu(self):
1089
+ """ Returns the global thumbnailss popup menu (no need of thumbnail selection). """
1090
+
1091
+ return self._gpmenu
1092
+
1093
+
1094
+ def GetSelectionColour(self):
1095
+ """ Returns the colour used to indicate a selected thumbnail. """
1096
+
1097
+ return self._selectioncolour
1098
+
1099
+
1100
+ def SetSelectionColour(self, colour=None):
1101
+ """
1102
+ Sets the colour used to indicate a selected thumbnail.
1103
+
1104
+ :param `colour`: a valid :class:`wx.Colour` object. If defaulted to ``None``, it
1105
+ will be taken from the system settings.
1106
+ """
1107
+
1108
+ if colour is None:
1109
+ colour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)
1110
+
1111
+ self._selectioncolour = colour
1112
+
1113
+
1114
+ def EnableDragging(self, enable=True):
1115
+ """
1116
+ Enables/disables thumbnails drag and drop.
1117
+
1118
+ :param `enable`: ``True`` to enable drag and drop, ``False`` to disable it.
1119
+ """
1120
+
1121
+ self._dragging = enable
1122
+
1123
+
1124
+ def EnableToolTips(self, enable=True):
1125
+ """
1126
+ Globally enables/disables thumbnail file information.
1127
+
1128
+ :param `enable`: ``True`` to enable thumbnail file information, ``False`` to disable it.
1129
+ """
1130
+
1131
+ self._enabletooltip = enable
1132
+
1133
+ if not enable and hasattr(self, "_tipwindow"):
1134
+ self._tipwindow.Enable(False)
1135
+
1136
+
1137
+ def GetThumbInfo(self, thumb=-1):
1138
+ """
1139
+ Returns the thumbnail information.
1140
+
1141
+ :param `thumb`: the index of the thumbnail for which we are collecting information.
1142
+ """
1143
+
1144
+ thumbinfo = None
1145
+
1146
+ if thumb >= 0:
1147
+ thumbinfo = self._items[thumb].GetInfo() + \
1148
+ "Thumb: " + str(self.GetThumbSize()[0:2])
1149
+ return thumbinfo
1150
+
1151
+ def SetThumbSize(self, width, height, border=6):
1152
+ """
1153
+ Sets the thumbnail size as width, height and border.
1154
+
1155
+ :param `width`: the desired thumbnail width;
1156
+ :param `height`: the desired thumbnail height;
1157
+ :param `border`: the spacing between thumbnails.
1158
+ """
1159
+
1160
+ if width > 350 or height > 280:
1161
+ return
1162
+
1163
+ self._tWidth = width
1164
+ self._tHeight = height
1165
+ self._tBorder = border
1166
+ self.SetScrollRate(int((self._tWidth + self._tBorder)/4),
1167
+ int((self._tHeight + self._tBorder)/4))
1168
+ self.SetSizeHints(self._tWidth + self._tBorder*2 + 16,
1169
+ self._tHeight + self._tBorder*2 + 8)
1170
+ if self._items:
1171
+ self.UpdateShow()
1172
+
1173
+
1174
+ def GetThumbSize(self):
1175
+ """ Returns the thumbnail size as width, height and border. """
1176
+
1177
+ return self._tWidth, self._tHeight, self._tBorder
1178
+
1179
+
1180
+ def Clear(self):
1181
+ """ Clears :class:`ThumbnailCtrl`. """
1182
+
1183
+ self._items = []
1184
+ self._selected = -1
1185
+ self._selectedarray = []
1186
+ self.UpdateProp()
1187
+ self.Refresh()
1188
+
1189
+
1190
+ def ThreadImage(self, filenames):
1191
+ """
1192
+ Threaded method to load images. Used internally.
1193
+
1194
+ :param `filenames`: a Python list of file names containing images.
1195
+ """
1196
+
1197
+ count = 0
1198
+
1199
+ while count < len(filenames):
1200
+
1201
+ if not self._isrunning:
1202
+ self._isrunning = False
1203
+ thread.exit()
1204
+ return
1205
+
1206
+ self.LoadImages(filenames[count], count)
1207
+ if count < 4:
1208
+ self.Refresh()
1209
+ elif count%4 == 0:
1210
+ self.Refresh()
1211
+
1212
+ count = count + 1
1213
+
1214
+ self._isrunning = False
1215
+ thread.exit()
1216
+
1217
+
1218
+ def LoadImages(self, newfile, imagecount):
1219
+ """
1220
+ Threaded method to load images. Used internally.
1221
+
1222
+ :param `newfile`: a file name containing an image to thumbnail;
1223
+ :param `imagecount`: the number of images loaded until now.
1224
+ """
1225
+
1226
+ if not self._isrunning:
1227
+ thread.exit()
1228
+ return
1229
+
1230
+ self._items[imagecount].LoadImage()
1231
+
1232
+
1233
+ def ShowThumbs(self, thumbs):
1234
+ """
1235
+ Shows all the thumbnails.
1236
+
1237
+ :param `thumbs`: should be a sequence with instances of :class:`Thumb`;
1238
+ """
1239
+
1240
+ self._isrunning = False
1241
+
1242
+ # update items
1243
+ self._items = thumbs
1244
+ myfiles = [thumb.GetFullFileName() for thumb in thumbs]
1245
+
1246
+ self._isrunning = True
1247
+
1248
+ thread.start_new_thread(self.ThreadImage, (myfiles,))
1249
+ wx.MilliSleep(20)
1250
+
1251
+ self._selectedarray = []
1252
+ self.UpdateProp()
1253
+ self.Refresh()
1254
+
1255
+
1256
+
1257
+ def SetSelection(self, value=-1):
1258
+ """
1259
+ Sets thumbnail selection.
1260
+
1261
+ :param `value`: the thumbnail index to select.
1262
+ """
1263
+
1264
+ self._selected = value
1265
+
1266
+ if value != -1:
1267
+ self._selectedarray = [value]
1268
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_SEL_CHANGED, self.GetId())
1269
+ self.GetEventHandler().ProcessEvent(eventOut)
1270
+ self.ScrollToSelected()
1271
+ self.Refresh()
1272
+
1273
+
1274
+ def SetZoomFactor(self, zoom=1.4):
1275
+ """
1276
+ Sets the zoom factor.
1277
+
1278
+ :param `zoom`: a floating point number representing the zoom factor. Must be
1279
+ greater than or equal to 1.0.
1280
+ """
1281
+
1282
+ if zoom <= 1.0:
1283
+ raise Exception("\nERROR: Zoom Factor Must Be Greater Than 1.0")
1284
+
1285
+ self._zoomfactor = zoom
1286
+
1287
+
1288
+ def GetZoomFactor(self):
1289
+ """ Returns the zoom factor. """
1290
+
1291
+ return self._zoomfactor
1292
+
1293
+
1294
+ def UpdateItems(self):
1295
+ """ Updates thumbnail items. """
1296
+
1297
+ selected = self._selectedarray
1298
+ selectedfname = []
1299
+ selecteditemid = []
1300
+
1301
+ for ii in range(len(self._selectedarray)):
1302
+ selectedfname.append(self.GetSelectedItem(ii).GetFileName())
1303
+ selecteditemid.append(self.GetSelectedItem(ii).GetId())
1304
+
1305
+ self.UpdateShow()
1306
+
1307
+ if len(selected) > 0:
1308
+ self._selectedarray = []
1309
+ for ii in range(len(self._items)):
1310
+ for jj in range(len(selected)):
1311
+ if self._items[ii].GetFileName() == selectedfname[jj] and \
1312
+ self._items[ii].GetId() == selecteditemid[jj]:
1313
+
1314
+ self._selectedarray.append(ii)
1315
+ if len(self._selectedarray) == 1:
1316
+ self.ScrollToSelected()
1317
+
1318
+ if len(self._selectedarray) > 0:
1319
+ self.Refresh()
1320
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_SEL_CHANGED, self.GetId())
1321
+ self.GetEventHandler().ProcessEvent(eventOut)
1322
+
1323
+
1324
+ def SetCaptionFont(self, font=None):
1325
+ """
1326
+ Sets the font for all the thumbnail captions.
1327
+
1328
+ :param `font`: a valid :class:`wx.Font` object. If defaulted to ``None``, a standard
1329
+ font will be generated.
1330
+ """
1331
+
1332
+ if font is None:
1333
+ font = wx.Font(8, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False)
1334
+
1335
+ self._captionfont = font
1336
+
1337
+
1338
+ def GetCaptionFont(self):
1339
+ """ Returns the font for all the thumbnail captions. """
1340
+
1341
+ return self._captionfont
1342
+
1343
+
1344
+ def UpdateShow(self):
1345
+ """ Updates thumbnail items. """
1346
+
1347
+ self.ShowThumbs(self._items)
1348
+
1349
+
1350
+ def GetCaptionHeight(self, begRow, count=1):
1351
+ """
1352
+ Returns the height for the file name caption.
1353
+
1354
+ :param `begRow`: the caption line at which we start measuring the height;
1355
+ :param `count`: the number of lines to measure.
1356
+ """
1357
+
1358
+ capHeight = 0
1359
+ for ii in range(begRow, begRow + count):
1360
+ if ii < len(self._tCaptionHeight):
1361
+ capHeight = capHeight + self._tCaptionHeight[ii]
1362
+
1363
+ return capHeight*self._tTextHeight
1364
+
1365
+
1366
+ def GetItemIndex(self, x, y):
1367
+ """
1368
+ Returns the thumbnail index at position (x, y).
1369
+
1370
+ :param `x`: the mouse `x` position;
1371
+ :param `y`: the mouse `y` position.
1372
+ """
1373
+
1374
+ col = (x - self._tBorder)//(self._tWidth + self._tBorder)
1375
+
1376
+ if col >= self._cols:
1377
+ col = self._cols - 1
1378
+
1379
+ row = -1
1380
+ y = y - self._tBorder
1381
+
1382
+ while y > 0:
1383
+
1384
+ row = row + 1
1385
+ y = y - (self._tHeight + self._tBorder + self.GetCaptionHeight(row))
1386
+
1387
+ if row < 0:
1388
+ row = 0
1389
+
1390
+ index = row*self._cols + col
1391
+
1392
+ if index >= len(self._items):
1393
+ index = -1
1394
+
1395
+ return index
1396
+
1397
+
1398
+ def UpdateProp(self, checkSize=True):
1399
+ """
1400
+ Updates :class:`ThumbnailCtrl` and its visible thumbnails.
1401
+
1402
+ :param `checkSize`: ``True`` to update the items visibility if the window
1403
+ size has changed.
1404
+ """
1405
+
1406
+ width = self.GetClientSize().GetWidth()
1407
+ self._cols = (width - self._tBorder)//(self._tWidth + self._tBorder)
1408
+
1409
+ if self._cols <= 0:
1410
+ self._cols = 1
1411
+
1412
+ tmpvar = (len(self._items)%self._cols and [1] or [0])[0]
1413
+ self._rows = len(self._items)//self._cols + tmpvar
1414
+
1415
+ self._tCaptionHeight = []
1416
+
1417
+ for row in range(self._rows):
1418
+
1419
+ capHeight = 0
1420
+
1421
+ for col in range(self._cols):
1422
+
1423
+ ii = row*self._cols + col
1424
+
1425
+ if len(self._items) > ii and \
1426
+ self._items[ii].GetCaptionLinesCount(self._tWidth - self._tCaptionBorder) > capHeight:
1427
+
1428
+ capHeight = self._items[ii].GetCaptionLinesCount(self._tWidth - self._tCaptionBorder)
1429
+
1430
+ self._tCaptionHeight.append(capHeight)
1431
+
1432
+ self.SetVirtualSize((self._cols*(self._tWidth + self._tBorder) + self._tBorder,
1433
+ self._rows*(self._tHeight + self._tBorder) + \
1434
+ self.GetCaptionHeight(0, self._rows) + self._tBorder))
1435
+
1436
+ self.SetSizeHints(self._tWidth + 2*self._tBorder + 16,
1437
+ self._tHeight + 2*self._tBorder + 8 + \
1438
+ (self._rows and [self.GetCaptionHeight(0)] or [0])[0])
1439
+
1440
+ if checkSize and width != self.GetClientSize().GetWidth():
1441
+ self.UpdateProp(False)
1442
+
1443
+
1444
+ def GetItem(self, pos):
1445
+ """
1446
+ Return thumbnail at specified position.
1447
+
1448
+ :param pos: the index of the thumbnail
1449
+ :return: the Thumb
1450
+ """
1451
+
1452
+ return self._items[pos]
1453
+
1454
+ def InsertItem(self, thumb, pos):
1455
+ """
1456
+ Inserts a thumbnail in the specified position.
1457
+
1458
+ :param `pos`: the index at which we wish to insert the new thumbnail.
1459
+ """
1460
+
1461
+ if pos < 0 or pos > len(self._items):
1462
+ self._items.append(thumb)
1463
+ else:
1464
+ self._items.insert(pos, thumb)
1465
+
1466
+ self.UpdateProp()
1467
+
1468
+
1469
+ def RemoveItemAt(self, pos):
1470
+ """
1471
+ Removes a thumbnail at the specified position.
1472
+
1473
+ :param `pos`: the index at which we wish to remove the thumbnail.
1474
+ """
1475
+
1476
+ del self._items[pos]
1477
+
1478
+ self.UpdateProp()
1479
+
1480
+
1481
+ def GetPaintRect(self):
1482
+ """ Returns the paint bounding rect for the :meth:`~ScrolledThumbnail.OnPaint` method. """
1483
+
1484
+ size = self.GetClientSize()
1485
+ paintRect = wx.Rect(0, 0, size.GetWidth(), size.GetHeight())
1486
+ paintRect.x, paintRect.y = self.GetViewStart()
1487
+ xu, yu = self.GetScrollPixelsPerUnit()
1488
+ paintRect.x = paintRect.x*xu
1489
+ paintRect.y = paintRect.y*yu
1490
+
1491
+ return paintRect
1492
+
1493
+
1494
+ def IsSelected(self, indx):
1495
+ """
1496
+ Returns whether a thumbnail is selected or not.
1497
+
1498
+ :param `indx`: the index of the thumbnail to check for selection.
1499
+ """
1500
+
1501
+ return self._selectedarray.count(indx) != 0
1502
+
1503
+
1504
+ def GetSelection(self, selIndex=-1):
1505
+ """
1506
+ Returns the selected thumbnail.
1507
+
1508
+ :param `selIndex`: if not equal to -1, the index of the selected thumbnail.
1509
+ """
1510
+
1511
+ return (selIndex == -1 and [self._selected] or
1512
+ [self._selectedarray[selIndex]])[0]
1513
+
1514
+
1515
+ def ScrollToSelected(self):
1516
+ """ Scrolls the :class:`ScrolledWindow` to the selected thumbnail. """
1517
+
1518
+ if self.GetSelection() == -1:
1519
+ return
1520
+
1521
+ # get row
1522
+ row = self.GetSelection()//self._cols
1523
+ # calc position to scroll view
1524
+
1525
+ paintRect = self.GetPaintRect()
1526
+ y1 = row*(self._tHeight + self._tBorder) + self.GetCaptionHeight(0, row)
1527
+ y2 = y1 + self._tBorder + self._tHeight + self.GetCaptionHeight(row)
1528
+
1529
+ if y1 < paintRect.GetTop():
1530
+ sy = y1 # scroll top
1531
+ elif y2 > paintRect.GetBottom():
1532
+ sy = y2 - paintRect.height # scroll bottom
1533
+ else:
1534
+ return
1535
+
1536
+ # scroll view
1537
+ xu, yu = self.GetScrollPixelsPerUnit()
1538
+ sy = sy/yu + (sy%yu and [1] or [0])[0] # convert sy to scroll units
1539
+ x, y = self.GetViewStart()
1540
+
1541
+ self.Scroll(x,sy)
1542
+
1543
+
1544
+ def CalculateBestCaption(self, dc, caption, sw, width):
1545
+ """
1546
+ Calculates the best caption string to show based on the actual zoom factor.
1547
+
1548
+ :param `dc`: an instance of :class:`wx.DC`;
1549
+ :param `caption`: the original caption string;
1550
+ :param `sw`: the maximum width allowed for the caption string, in pixels;
1551
+ :param `width`: the caption string width, in pixels.
1552
+ """
1553
+
1554
+ caption = caption + "..."
1555
+
1556
+ while sw > width:
1557
+ caption = caption[1:]
1558
+ sw, sh = dc.GetTextExtent(caption)
1559
+
1560
+ return "..." + caption[0:-3]
1561
+
1562
+
1563
+ def DrawThumbnail(self, bmp, thumb, index):
1564
+ """
1565
+ Draws a visible thumbnail.
1566
+
1567
+ :param `bmp`: the thumbnail version of the original image;
1568
+ :param `thumb`: an instance of :class:`Thumb`;
1569
+ :param `index`: the index of the thumbnail to draw.
1570
+ """
1571
+
1572
+ dc = wx.MemoryDC()
1573
+ dc.SelectObject(bmp)
1574
+
1575
+ x = int(self._tBorder/2)
1576
+ y = int(self._tBorder/2)
1577
+
1578
+ # background
1579
+ dc.SetPen(wx.Pen(wx.BLACK, 0, wx.TRANSPARENT))
1580
+ dc.SetBrush(wx.Brush(self.GetBackgroundColour(), wx.BRUSHSTYLE_SOLID))
1581
+ dc.DrawRectangle(0, 0, bmp.GetWidth(), bmp.GetHeight())
1582
+
1583
+ # image
1584
+ if index == self.GetPointed() and self.GetHighlightPointed():
1585
+ factor = 1.5
1586
+ img = thumb.GetHighlightBitmap(self._tWidth, self._tHeight, factor)
1587
+ else:
1588
+ img = thumb.GetBitmap(self._tWidth, self._tHeight)
1589
+
1590
+ ww = img.GetWidth()
1591
+ hh = img.GetHeight()
1592
+ imgRect = wx.Rect(int(x + (self._tWidth - img.GetWidth())/2),
1593
+ int(y + (self._tHeight - img.GetHeight())/2),
1594
+ img.GetWidth(), img.GetHeight())
1595
+
1596
+ if not thumb._alpha and self._dropShadow:
1597
+ dc.Blit(imgRect.x+5, imgRect.y+5, imgRect.width, imgRect.height, self.shadow, 500-ww, 500-hh)
1598
+ dc.DrawBitmap(img, imgRect.x, imgRect.y, True)
1599
+
1600
+ colour = self.GetSelectionColour()
1601
+ selected = self.IsSelected(index)
1602
+
1603
+ colour = self.GetSelectionColour()
1604
+
1605
+ # draw caption
1606
+ sw, sh = 0, 0
1607
+ if self._showfilenames:
1608
+ textWidth = 0
1609
+ dc.SetFont(self.GetCaptionFont())
1610
+ mycaption = thumb.GetCaption(0)
1611
+ sw, sh = dc.GetTextExtent(mycaption)
1612
+
1613
+ if sw > self._tWidth:
1614
+ mycaption = self.CalculateBestCaption(dc, mycaption, sw, self._tWidth)
1615
+ sw = self._tWidth
1616
+
1617
+ textWidth = sw + 8
1618
+ tx = x + (self._tWidth - textWidth)/2
1619
+ ty = y + self._tHeight
1620
+
1621
+ txtcolour = "#7D7D7D"
1622
+ dc.SetTextForeground(txtcolour)
1623
+
1624
+ tx = x + (self._tWidth - sw)/2
1625
+ if hh >= self._tHeight:
1626
+ ty = y + self._tHeight + (self._tTextHeight - sh)/2 + 3
1627
+ else:
1628
+ ty = y + hh + (self._tHeight-hh)/2 + (self._tTextHeight - sh)/2 + 3
1629
+
1630
+ dc.DrawText(mycaption, int(tx), int(ty))
1631
+
1632
+ # outline
1633
+ if self._tOutline != THUMB_OUTLINE_NONE and (self._tOutlineNotSelected or self.IsSelected(index)):
1634
+
1635
+ dotrect = wx.Rect()
1636
+ dotrect.x = x - 2
1637
+ dotrect.y = y - 2
1638
+ dotrect.width = bmp.GetWidth() - self._tBorder + 4
1639
+ dotrect.height = bmp.GetHeight() - self._tBorder + 4
1640
+
1641
+ dc.SetPen(wx.Pen((self.IsSelected(index) and [colour] or [wx.LIGHT_GREY])[0],
1642
+ 0, wx.PENSTYLE_SOLID))
1643
+ dc.SetBrush(wx.Brush(wx.BLACK, wx.BRUSHSTYLE_TRANSPARENT))
1644
+
1645
+ if self._tOutline == THUMB_OUTLINE_FULL or self._tOutline == THUMB_OUTLINE_RECT:
1646
+
1647
+ imgRect.x = x
1648
+ imgRect.y = y
1649
+ imgRect.width = bmp.GetWidth() - self._tBorder
1650
+ imgRect.height = bmp.GetHeight() - self._tBorder
1651
+
1652
+ if self._tOutline == THUMB_OUTLINE_RECT:
1653
+ imgRect.height = self._tHeight
1654
+
1655
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
1656
+
1657
+ if selected:
1658
+
1659
+ dc.SetPen(self.grayPen)
1660
+ dc.DrawRoundedRectangle(dotrect, 2)
1661
+
1662
+ dc.SetPen(wx.Pen(wx.WHITE))
1663
+ dc.DrawRectangle(imgRect.x, imgRect.y,
1664
+ imgRect.width, imgRect.height)
1665
+
1666
+ pen = wx.Pen((selected and [colour] or [wx.LIGHT_GREY])[0], 2)
1667
+ pen.SetJoin(wx.JOIN_MITER)
1668
+ dc.SetPen(pen)
1669
+ if self._tOutline == THUMB_OUTLINE_FULL:
1670
+ dc.DrawRoundedRectangle(imgRect.x - 1, imgRect.y - 1,
1671
+ imgRect.width + 3, imgRect.height + 3, 2)
1672
+ else:
1673
+ dc.DrawRectangle(imgRect.x - 1, imgRect.y - 1,
1674
+ imgRect.width + 3, imgRect.height + 3)
1675
+ else:
1676
+ dc.SetPen(wx.Pen(wx.LIGHT_GREY))
1677
+
1678
+ dc.DrawRectangle(imgRect.x - 1, imgRect.y - 1,
1679
+ imgRect.width + 2, imgRect.height + 2)
1680
+
1681
+
1682
+ dc.SelectObject(wx.NullBitmap)
1683
+
1684
+
1685
+ def OnPaint(self, event):
1686
+ """
1687
+ Handles the ``wx.EVT_PAINT`` event for :class:`ThumbnailCtrl`.
1688
+
1689
+ :param `event`: a :class:`PaintEvent` event to be processed.
1690
+ """
1691
+
1692
+ paintRect = self.GetPaintRect()
1693
+
1694
+ dc = wx.BufferedPaintDC(self)
1695
+ self.PrepareDC(dc)
1696
+
1697
+ dc.SetPen(wx.Pen(wx.BLACK, 0, wx.PENSTYLE_TRANSPARENT))
1698
+ dc.SetBrush(wx.Brush(self.GetBackgroundColour(), wx.BRUSHSTYLE_SOLID))
1699
+
1700
+ w, h = self.GetClientSize()
1701
+
1702
+ # items
1703
+ row = -1
1704
+ xwhite = self._tBorder
1705
+
1706
+ for ii in range(len(self._items)):
1707
+
1708
+ col = ii%self._cols
1709
+ if col == 0:
1710
+ row = row + 1
1711
+
1712
+ xwhite = ((w - self._cols*(self._tWidth + self._tBorder)))/(self._cols+1)
1713
+ tx = int(xwhite + col * (self._tWidth + self._tBorder))
1714
+ ty = int(self._tBorder/2 + row * (self._tHeight + self._tBorder) +
1715
+ self.GetCaptionHeight(0, row))
1716
+ tw = self._tWidth + self._tBorder
1717
+ th = self._tHeight + self.GetCaptionHeight(row) + self._tBorder
1718
+ # visible?
1719
+ if not paintRect.Intersects(wx.Rect(tx, ty, tw, th)):
1720
+ continue
1721
+
1722
+ thmb = wx.Bitmap(tw, th)
1723
+ self.DrawThumbnail(thmb, self._items[ii], ii)
1724
+ dc.DrawBitmap(thmb, tx, ty)
1725
+
1726
+ rect = wx.Rect(int(xwhite), int(self._tBorder/2),
1727
+ self._cols*(self._tWidth + self._tBorder),
1728
+ self._rows*(self._tHeight + self._tBorder) + \
1729
+ self.GetCaptionHeight(0, self._rows))
1730
+
1731
+ w = max(self.GetClientSize().GetWidth(), rect.width)
1732
+ h = max(self.GetClientSize().GetHeight(), rect.height)
1733
+ dc.DrawRectangle(0, 0, w, rect.y)
1734
+ dc.DrawRectangle(0, 0, rect.x, h)
1735
+ dc.DrawRectangle(rect.GetRight(), 0, w - rect.GetRight(), h + 50)
1736
+ dc.DrawRectangle(0, rect.GetBottom(), w, h - rect.GetBottom() + 50)
1737
+
1738
+ col = len(self._items)%self._cols
1739
+
1740
+ if col > 0:
1741
+ rect.x = rect.x + col*(self._tWidth + self._tBorder)
1742
+ rect.y = rect.y + (self._rows - 1)*(self._tHeight + self._tBorder) + \
1743
+ self.GetCaptionHeight(0, self._rows - 1)
1744
+ dc.DrawRectangle(rect)
1745
+
1746
+
1747
+ def OnResize(self, event):
1748
+ """
1749
+ Handles the ``wx.EVT_SIZE`` event for :class:`ThumbnailCtrl`.
1750
+
1751
+ :param `event`: a :class:`wx.SizeEvent` event to be processed.
1752
+ """
1753
+
1754
+ self.UpdateProp()
1755
+ self.ScrollToSelected()
1756
+ self.Refresh()
1757
+
1758
+
1759
+ def OnMouseDown(self, event):
1760
+ """
1761
+ Handles the ``wx.EVT_LEFT_DOWN`` and ``wx.EVT_RIGHT_DOWN`` events for :class:`ThumbnailCtrl`.
1762
+
1763
+ :param `event`: a :class:`MouseEvent` event to be processed.
1764
+ """
1765
+
1766
+ x = event.GetX()
1767
+ y = event.GetY()
1768
+ x, y = self.CalcUnscrolledPosition(x, y)
1769
+ # get item number to select
1770
+ lastselected = self._selected
1771
+ self._selected = self.GetItemIndex(x, y)
1772
+
1773
+ self._mouseeventhandled = False
1774
+ update = False
1775
+
1776
+ if event.ControlDown():
1777
+ if self._selected == -1:
1778
+ self._mouseeventhandled = True
1779
+ elif not self.IsSelected(self._selected):
1780
+ self._selectedarray.append(self._selected)
1781
+ update = True
1782
+ self._mouseeventhandled = True
1783
+
1784
+ elif event.ShiftDown():
1785
+ if self._selected != -1:
1786
+ begindex = self._selected
1787
+ endindex = lastselected
1788
+ if lastselected < self._selected:
1789
+ begindex = lastselected
1790
+ endindex = self._selected
1791
+ self._selectedarray = []
1792
+
1793
+ for ii in range(begindex, endindex+1):
1794
+ self._selectedarray.append(ii)
1795
+
1796
+ update = True
1797
+
1798
+ self._selected = lastselected
1799
+ self._mouseeventhandled = True
1800
+
1801
+ else:
1802
+
1803
+ if self._selected == -1:
1804
+ update = len(self._selectedarray) > 0
1805
+ self._selectedarray = []
1806
+ self._mouseeventhandled = True
1807
+ elif len(self._selectedarray) <= 1:
1808
+ try:
1809
+ update = len(self._selectedarray)== 0 or self._selectedarray[0] != self._selected
1810
+ except:
1811
+ update = True
1812
+ self._selectedarray = []
1813
+ self._selectedarray.append(self._selected)
1814
+ self._mouseeventhandled = True
1815
+
1816
+ if update:
1817
+ self.ScrollToSelected()
1818
+ self.Refresh()
1819
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_SEL_CHANGED, self.GetId())
1820
+ self.GetEventHandler().ProcessEvent(eventOut)
1821
+
1822
+ self.SetFocus()
1823
+
1824
+
1825
+ def OnMouseUp(self, event):
1826
+ """
1827
+ Handles the ``wx.EVT_LEFT_UP`` and ``wx.EVT_RIGHT_UP`` events for :class:`ThumbnailCtrl`.
1828
+
1829
+ :param `event`: a :class:`MouseEvent` event to be processed.
1830
+ """
1831
+
1832
+ # get item number to select
1833
+ x = event.GetX()
1834
+ y = event.GetY()
1835
+ x, y = self.CalcUnscrolledPosition(x, y)
1836
+ lastselected = self._selected
1837
+ self._selected = self.GetItemIndex(x,y)
1838
+
1839
+ if not self._mouseeventhandled:
1840
+ # set new selection
1841
+ if event.ControlDown():
1842
+ if self._selected in self._selectedarray:
1843
+ self._selectedarray.remove(self._selected)
1844
+
1845
+ self._selected = -1
1846
+ else:
1847
+ self._selectedarray = []
1848
+ self._selectedarray.append(self._selected)
1849
+
1850
+ self.ScrollToSelected()
1851
+ self.Refresh()
1852
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_SEL_CHANGED, self.GetId())
1853
+ self.GetEventHandler().ProcessEvent(eventOut)
1854
+
1855
+ # Popup menu
1856
+ if event.RightUp():
1857
+ if self._selected >= 0 and self._pmenu:
1858
+ self.PopupMenu(self._pmenu)
1859
+ elif self._selected >= 0 and not self._pmenu and self._gpmenu:
1860
+ self.PopupMenu(self._gpmenu)
1861
+ elif self._selected == -1 and self._gpmenu:
1862
+ self.PopupMenu(self._gpmenu)
1863
+
1864
+ if event.ShiftDown():
1865
+ self._selected = lastselected
1866
+
1867
+
1868
+ def OnMouseDClick(self, event):
1869
+ """
1870
+ Handles the ``wx.EVT_LEFT_DCLICK`` event for :class:`ThumbnailCtrl`.
1871
+
1872
+ :param `event`: a :class:`MouseEvent` event to be processed.
1873
+ """
1874
+
1875
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_DCLICK, self.GetId())
1876
+ self.GetEventHandler().ProcessEvent(eventOut)
1877
+
1878
+
1879
+ def OnMouseMove(self, event):
1880
+ """
1881
+ Handles the ``wx.EVT_MOTION`` event for :class:`ThumbnailCtrl`.
1882
+
1883
+ :param `event`: a :class:`MouseEvent` event to be processed.
1884
+ """
1885
+
1886
+ # -- drag & drop --
1887
+ if self._dragging and event.Dragging() and len(self._selectedarray) > 0:
1888
+
1889
+ files = wx.FileDataObject()
1890
+ for ii in range(len(self._selectedarray)):
1891
+ files.AddFile(opj(self.GetSelectedItem(ii).GetFullFileName()))
1892
+
1893
+ source = wx.DropSource(self)
1894
+ source.SetData(files)
1895
+ source.DoDragDrop(wx.Drag_DefaultMove)
1896
+
1897
+ # -- light-effect --
1898
+ x = event.GetX()
1899
+ y = event.GetY()
1900
+ x, y = self.CalcUnscrolledPosition(x, y)
1901
+
1902
+ # get item number
1903
+ sel = self.GetItemIndex(x, y)
1904
+
1905
+ if sel == self._pointed:
1906
+ if self._enabletooltip and sel >= 0:
1907
+ if not hasattr(self, "_tipwindow"):
1908
+ self._tipwindow = wx.ToolTip(self.GetThumbInfo(sel))
1909
+ self._tipwindow.SetDelay(1000)
1910
+ self.SetToolTip(self._tipwindow)
1911
+ else:
1912
+ self._tipwindow.SetDelay(1000)
1913
+ self._tipwindow.SetTip(self.GetThumbInfo(sel))
1914
+
1915
+ event.Skip()
1916
+ return
1917
+
1918
+ if self._enabletooltip:
1919
+ if hasattr(self, "_tipwindow"):
1920
+ self._tipwindow.Enable(False)
1921
+
1922
+ # update thumbnail
1923
+ self._pointed = sel
1924
+
1925
+ if self._enabletooltip and sel >= 0:
1926
+ if not hasattr(self, "_tipwindow"):
1927
+ self._tipwindow = wx.ToolTip(self.GetThumbInfo(sel))
1928
+ self._tipwindow.SetDelay(1000)
1929
+ self._tipwindow.Enable(True)
1930
+ self.SetToolTip(self._tipwindow)
1931
+ else:
1932
+ self._tipwindow.SetDelay(1000)
1933
+ self._tipwindow.Enable(True)
1934
+ self._tipwindow.SetTip(self.GetThumbInfo(sel))
1935
+
1936
+ self.Refresh()
1937
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_POINTED, self.GetId())
1938
+ self.GetEventHandler().ProcessEvent(eventOut)
1939
+ event.Skip()
1940
+
1941
+
1942
+ def OnMouseLeave(self, event):
1943
+ """
1944
+ Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`ThumbnailCtrl`.
1945
+
1946
+ :param `event`: a :class:`MouseEvent` event to be processed.
1947
+ """
1948
+
1949
+ if self._pointed != -1:
1950
+
1951
+ self._pointed = -1
1952
+ self.Refresh()
1953
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_POINTED, self.GetId())
1954
+ self.GetEventHandler().ProcessEvent(eventOut)
1955
+
1956
+
1957
+ def OnThumbChanged(self, event):
1958
+ """
1959
+ Handles the ``EVT_THUMBNAILS_THUMB_CHANGED`` event for :class:`ThumbnailCtrl`.
1960
+
1961
+ :param `event`: a :class:`ThumbnailEvent` event to be processed.
1962
+ """
1963
+
1964
+ for ii in range(len(self._items)):
1965
+ if self._items[ii].GetFileName() == event.GetString():
1966
+
1967
+ self._items[ii].SetFilename(self._items[ii].GetFileName())
1968
+ if event.GetClientData():
1969
+
1970
+ img = wx.Image(event.GetClientData())
1971
+ self._items[ii].SetImage(img)
1972
+
1973
+ self.Refresh()
1974
+
1975
+
1976
+ def OnChar(self, event):
1977
+ """
1978
+ Handles the ``wx.EVT_CHAR`` event for :class:`ThumbnailCtrl`.
1979
+
1980
+ :param `event`: a :class:`KeyEvent` event to be processed.
1981
+
1982
+ :note: You have these choices:
1983
+
1984
+ (1) ``d`` key rotates 90 degrees clockwise the selected thumbnails;
1985
+ (2) ``s`` key rotates 90 degrees counter-clockwise the selected thumbnails;
1986
+ (3) ``a`` key rotates 180 degrees the selected thumbnails;
1987
+ (4) ``+`` key zooms in;
1988
+ (5) ``-`` key zooms out.
1989
+ All other keys cause an EVT_THUMBNAILS_CHAR event to be thrown.
1990
+ """
1991
+
1992
+ if event.KeyCode == ord("s"):
1993
+ self.Rotate()
1994
+ elif event.KeyCode == ord("d"):
1995
+ self.Rotate(270)
1996
+ elif event.KeyCode == ord("a"):
1997
+ self.Rotate(180)
1998
+ elif event.KeyCode in [wx.WXK_ADD, wx.WXK_NUMPAD_ADD]:
1999
+ self.ZoomIn()
2000
+ elif event.KeyCode in [wx.WXK_SUBTRACT, wx.WXK_NUMPAD_SUBTRACT]:
2001
+ self.ZoomOut()
2002
+
2003
+ selected = []
2004
+ for ii in range(len(self._items)):
2005
+ if self.IsSelected(ii):
2006
+ selected.append(ii)
2007
+
2008
+ eventOut = ThumbnailEvent(wxEVT_THUMBNAILS_CHAR, self.GetId(),
2009
+ thumbs=selected, keycode=event.KeyCode)
2010
+ self.GetEventHandler().ProcessEvent(eventOut)
2011
+
2012
+ event.Skip()
2013
+
2014
+ def Rotate(self, angle=90):
2015
+ """
2016
+ Rotates the selected thumbnails by the angle specified by `angle`.
2017
+
2018
+ :param `angle`: the rotation angle for the thumbnail, in degrees.
2019
+ """
2020
+
2021
+ wx.BeginBusyCursor()
2022
+
2023
+ selected = []
2024
+ for ii in range(len(self._items)):
2025
+ if self.IsSelected(ii):
2026
+ selected.append(self._items[ii])
2027
+
2028
+ for thumb in selected:
2029
+ thumb.Rotate(angle)
2030
+
2031
+ wx.EndBusyCursor()
2032
+
2033
+ if self.GetSelection() != -1:
2034
+ self.Refresh()
2035
+
2036
+
2037
+ def OnMouseWheel(self, event):
2038
+ """
2039
+ Handles the ``wx.EVT_MOUSEWHEEL`` event for :class:`ThumbnailCtrl`.
2040
+
2041
+ :param `event`: a :class:`MouseEvent` event to be processed.
2042
+
2043
+ :note: If you hold down the ``Ctrl`` key, you can zoom in/out with the mouse wheel.
2044
+ """
2045
+
2046
+ if event.ControlDown():
2047
+ if event.GetWheelRotation() > 0:
2048
+ self.ZoomIn()
2049
+ else:
2050
+ self.ZoomOut()
2051
+ else:
2052
+ event.Skip()
2053
+
2054
+
2055
+ def ZoomOut(self):
2056
+ """ Zooms the thumbnails out. """
2057
+
2058
+ w, h, b = self.GetThumbSize()
2059
+
2060
+ if w < 40 or h < 40:
2061
+ return
2062
+
2063
+ zoom = self.GetZoomFactor()
2064
+ neww = float(w)/zoom
2065
+ newh = float(h)/zoom
2066
+
2067
+ self.SetThumbSize(int(neww), int(newh))
2068
+ self.OnResize(None)
2069
+ self._checktext = True
2070
+
2071
+ self.Refresh()
2072
+
2073
+
2074
+ def ZoomIn(self):
2075
+ """ Zooms the thumbnails in. """
2076
+
2077
+ size = self.GetClientSize()
2078
+ w, h, b = self.GetThumbSize()
2079
+ zoom = self.GetZoomFactor()
2080
+
2081
+ if w*zoom + b > size.GetWidth() or h*zoom + b > size.GetHeight():
2082
+ if w*zoom + b > size.GetWidth():
2083
+ neww = size.GetWidth() - 2*self._tBorder
2084
+ newh = (float(h)/w)*neww
2085
+ else:
2086
+ newh = size.GetHeight() - 2*self._tBorder
2087
+ neww = (float(w)/h)*newh
2088
+
2089
+ else:
2090
+ neww = float(w)*zoom
2091
+ newh = float(h)*zoom
2092
+
2093
+ self.SetThumbSize(int(neww), int(newh))
2094
+ self.OnResize(None)
2095
+ self._checktext = True
2096
+
2097
+ self.Refresh()
2098
+
2099
+
2100
+ # ---------------------------------------------------------------------------- #
2101
+ # Class ThumbnailEvent
2102
+ # ---------------------------------------------------------------------------- #
2103
+
2104
+ class ThumbnailEvent(wx.PyCommandEvent):
2105
+ """
2106
+ This class is used to send events when a thumbnail is hovered, selected,
2107
+ double-clicked or when its caption has been changed.
2108
+ """
2109
+ def __init__(self, evtType, evtId=-1, thumbs=None, keycode=None):
2110
+ """
2111
+ Default class constructor.
2112
+
2113
+ :param `evtType`: the event type;
2114
+ :param `evtId`: the event identifier.
2115
+ """
2116
+
2117
+ wx.PyCommandEvent.__init__(self, evtType, evtId)
2118
+ self.thumbs = thumbs
2119
+ self.keycode = keycode