wxPython 4.3.2__cp315-cp315-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.
- wx/WebView2Loader.dll +0 -0
- wx/__init__.py +22 -0
- wx/__init__.pyi +10 -0
- wx/__version__.py +9 -0
- wx/__version__.pyi +15 -0
- wx/_adv.cp315-win_amd64.pyd +0 -0
- wx/_aui.cp315-win_amd64.pyd +0 -0
- wx/_core.cp315-win_amd64.pyd +0 -0
- wx/_dataview.cp315-win_amd64.pyd +0 -0
- wx/_glcanvas.cp315-win_amd64.pyd +0 -0
- wx/_grid.cp315-win_amd64.pyd +0 -0
- wx/_html.cp315-win_amd64.pyd +0 -0
- wx/_html2.cp315-win_amd64.pyd +0 -0
- wx/_media.cp315-win_amd64.pyd +0 -0
- wx/_msw.cp315-win_amd64.pyd +0 -0
- wx/_propgrid.cp315-win_amd64.pyd +0 -0
- wx/_ribbon.cp315-win_amd64.pyd +0 -0
- wx/_richtext.cp315-win_amd64.pyd +0 -0
- wx/_stc.cp315-win_amd64.pyd +0 -0
- wx/_xml.cp315-win_amd64.pyd +0 -0
- wx/_xrc.cp315-win_amd64.pyd +0 -0
- wx/adv.py +127 -0
- wx/adv.pyi +5931 -0
- wx/aui.py +70 -0
- wx/aui.pyi +4805 -0
- wx/core.py +3417 -0
- wx/core.pyi +62949 -0
- wx/dataview.py +176 -0
- wx/dataview.pyi +3828 -0
- wx/gizmos.py +18 -0
- wx/glcanvas.py +13 -0
- wx/glcanvas.pyi +544 -0
- wx/grid.py +237 -0
- wx/grid.pyi +5678 -0
- wx/html.py +38 -0
- wx/html.pyi +3283 -0
- wx/html2.py +46 -0
- wx/html2.pyi +1301 -0
- wx/include/wxPython/sip.h +1938 -0
- wx/include/wxPython/wxpy_api.h +418 -0
- wx/lib/CDate.py +201 -0
- wx/lib/ClickableHtmlWindow.py +57 -0
- wx/lib/__init__.py +0 -0
- wx/lib/activex.py +178 -0
- wx/lib/activexwrapper.py +153 -0
- wx/lib/agw/__init__.py +128 -0
- wx/lib/agw/advancedsplash.py +563 -0
- wx/lib/agw/aquabutton.py +1127 -0
- wx/lib/agw/artmanager.py +2110 -0
- wx/lib/agw/aui/__init__.py +295 -0
- wx/lib/agw/aui/aui_constants.py +2616 -0
- wx/lib/agw/aui/aui_switcherdialog.py +1232 -0
- wx/lib/agw/aui/aui_utilities.py +648 -0
- wx/lib/agw/aui/auibar.py +4045 -0
- wx/lib/agw/aui/auibook.py +6288 -0
- wx/lib/agw/aui/dockart.py +1198 -0
- wx/lib/agw/aui/framemanager.py +10485 -0
- wx/lib/agw/aui/tabart.py +2749 -0
- wx/lib/agw/aui/tabmdi.py +679 -0
- wx/lib/agw/balloontip.py +1157 -0
- wx/lib/agw/buttonpanel.py +2787 -0
- wx/lib/agw/cubecolourdialog.py +3529 -0
- wx/lib/agw/customtreectrl.py +9908 -0
- wx/lib/agw/data/ShortcutEditor_1.png +0 -0
- wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
- wx/lib/agw/data/default_help_text.html +105 -0
- wx/lib/agw/flatmenu.py +7392 -0
- wx/lib/agw/flatnotebook.py +6669 -0
- wx/lib/agw/floatspin.py +1820 -0
- wx/lib/agw/fmcustomizedlg.py +535 -0
- wx/lib/agw/fmresources.py +407 -0
- wx/lib/agw/foldpanelbar.py +2282 -0
- wx/lib/agw/fourwaysplitter.py +1130 -0
- wx/lib/agw/genericmessagedialog.py +1549 -0
- wx/lib/agw/gradientbutton.py +731 -0
- wx/lib/agw/hyperlink.py +664 -0
- wx/lib/agw/hypertreelist.py +5756 -0
- wx/lib/agw/infobar.py +885 -0
- wx/lib/agw/knobctrl.py +944 -0
- wx/lib/agw/labelbook.py +3028 -0
- wx/lib/agw/multidirdialog.py +581 -0
- wx/lib/agw/peakmeter.py +1028 -0
- wx/lib/agw/persist/__init__.py +188 -0
- wx/lib/agw/persist/persist_constants.py +283 -0
- wx/lib/agw/persist/persist_handlers.py +2614 -0
- wx/lib/agw/persist/persistencemanager.py +863 -0
- wx/lib/agw/piectrl.py +1082 -0
- wx/lib/agw/pybusyinfo.py +399 -0
- wx/lib/agw/pycollapsiblepane.py +940 -0
- wx/lib/agw/pygauge.py +570 -0
- wx/lib/agw/pyprogress.py +916 -0
- wx/lib/agw/ribbon/__init__.py +198 -0
- wx/lib/agw/ribbon/art.py +219 -0
- wx/lib/agw/ribbon/art_aui.py +1283 -0
- wx/lib/agw/ribbon/art_default.py +81 -0
- wx/lib/agw/ribbon/art_internal.py +248 -0
- wx/lib/agw/ribbon/art_msw.py +2735 -0
- wx/lib/agw/ribbon/art_osx.py +52 -0
- wx/lib/agw/ribbon/bar.py +1259 -0
- wx/lib/agw/ribbon/buttonbar.py +1317 -0
- wx/lib/agw/ribbon/control.py +205 -0
- wx/lib/agw/ribbon/gallery.py +973 -0
- wx/lib/agw/ribbon/page.py +946 -0
- wx/lib/agw/ribbon/panel.py +1170 -0
- wx/lib/agw/ribbon/toolbar.py +1441 -0
- wx/lib/agw/rulerctrl.py +1885 -0
- wx/lib/agw/scrolledthumbnail.py +2116 -0
- wx/lib/agw/shapedbutton.py +1809 -0
- wx/lib/agw/shortcuteditor.py +2642 -0
- wx/lib/agw/speedmeter.py +1800 -0
- wx/lib/agw/supertooltip.py +1443 -0
- wx/lib/agw/thumbnailctrl.py +529 -0
- wx/lib/agw/toasterbox.py +1327 -0
- wx/lib/agw/ultimatelistctrl.py +13671 -0
- wx/lib/agw/xlsgrid.py +2111 -0
- wx/lib/agw/zoombar.py +1336 -0
- wx/lib/analogclock/__init__.py +140 -0
- wx/lib/analogclock/analogclock.py +630 -0
- wx/lib/analogclock/helpers.py +986 -0
- wx/lib/analogclock/lib_setup/__init__.py +0 -0
- wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
- wx/lib/analogclock/lib_setup/fontselect.py +57 -0
- wx/lib/analogclock/setup.py +490 -0
- wx/lib/analogclock/styles.py +47 -0
- wx/lib/anchors.py +103 -0
- wx/lib/art/__init__.py +4 -0
- wx/lib/art/flagart.py +1583 -0
- wx/lib/art/img2pyartprov.py +56 -0
- wx/lib/busy.py +152 -0
- wx/lib/buttons.py +1140 -0
- wx/lib/calendar.py +1596 -0
- wx/lib/checkbox.py +837 -0
- wx/lib/colourchooser/__init__.py +36 -0
- wx/lib/colourchooser/canvas.py +145 -0
- wx/lib/colourchooser/intl.py +24 -0
- wx/lib/colourchooser/pycolourbox.py +89 -0
- wx/lib/colourchooser/pycolourchooser.py +626 -0
- wx/lib/colourchooser/pycolourslider.py +98 -0
- wx/lib/colourchooser/pypalette.py +208 -0
- wx/lib/colourdb.py +740 -0
- wx/lib/colourselect.py +385 -0
- wx/lib/colourutils.py +118 -0
- wx/lib/combotreebox.py +944 -0
- wx/lib/delayedresult.py +420 -0
- wx/lib/dialogs.py +510 -0
- wx/lib/docview.py +3210 -0
- wx/lib/dragscroller.py +79 -0
- wx/lib/editor/README.txt +77 -0
- wx/lib/editor/__init__.py +24 -0
- wx/lib/editor/editor.py +974 -0
- wx/lib/editor/images.py +15 -0
- wx/lib/editor/selection.py +44 -0
- wx/lib/embeddedimage.py +76 -0
- wx/lib/eventStack.py +136 -0
- wx/lib/eventwatcher.py +440 -0
- wx/lib/evtmgr.py +521 -0
- wx/lib/expando.py +393 -0
- wx/lib/fancytext.py +494 -0
- wx/lib/filebrowsebutton.py +461 -0
- wx/lib/flashwin.py +262 -0
- wx/lib/flashwin_old.py +651 -0
- wx/lib/floatcanvas/FCEvents.py +53 -0
- wx/lib/floatcanvas/FCObjects.py +2910 -0
- wx/lib/floatcanvas/FloatCanvas.py +1025 -0
- wx/lib/floatcanvas/GUIMode.py +396 -0
- wx/lib/floatcanvas/NavCanvas.py +162 -0
- wx/lib/floatcanvas/Resources.py +319 -0
- wx/lib/floatcanvas/ScreenShot.py +1788 -0
- wx/lib/floatcanvas/Utilities/BBox.py +313 -0
- wx/lib/floatcanvas/Utilities/Colors.py +137 -0
- wx/lib/floatcanvas/Utilities/GUI.py +91 -0
- wx/lib/floatcanvas/Utilities/__init__.py +7 -0
- wx/lib/floatcanvas/__init__.py +124 -0
- wx/lib/foldmenu.py +89 -0
- wx/lib/gestures.py +310 -0
- wx/lib/gizmos/__init__.py +18 -0
- wx/lib/gizmos/dynamicsash.py +1202 -0
- wx/lib/gizmos/ledctrl.py +299 -0
- wx/lib/gizmos/treelistctrl.py +87 -0
- wx/lib/graphics.py +1942 -0
- wx/lib/gridmovers.py +516 -0
- wx/lib/iewin.py +249 -0
- wx/lib/iewin_old.py +894 -0
- wx/lib/imagebrowser.py +853 -0
- wx/lib/imageutils.py +163 -0
- wx/lib/infoframe.py +490 -0
- wx/lib/inspection.py +1254 -0
- wx/lib/intctrl.py +990 -0
- wx/lib/itemspicker.py +256 -0
- wx/lib/langlistctrl.py +480 -0
- wx/lib/layoutf.py +271 -0
- wx/lib/masked/__init__.py +27 -0
- wx/lib/masked/combobox.py +839 -0
- wx/lib/masked/ctrl.py +108 -0
- wx/lib/masked/ipaddrctrl.py +241 -0
- wx/lib/masked/maskededit.py +7262 -0
- wx/lib/masked/numctrl.py +2000 -0
- wx/lib/masked/textctrl.py +465 -0
- wx/lib/masked/timectrl.py +1465 -0
- wx/lib/mixins/__init__.py +17 -0
- wx/lib/mixins/grid.py +47 -0
- wx/lib/mixins/gridlabelrenderer.py +277 -0
- wx/lib/mixins/imagelist.py +77 -0
- wx/lib/mixins/inspection.py +184 -0
- wx/lib/mixins/listctrl.py +893 -0
- wx/lib/mixins/rubberband.py +403 -0
- wx/lib/mixins/treemixin.py +678 -0
- wx/lib/msgpanel.py +95 -0
- wx/lib/multisash.py +746 -0
- wx/lib/myole4ax.idl +178 -0
- wx/lib/myole4ax.tlb +0 -0
- wx/lib/newevent.py +229 -0
- wx/lib/newevent.pyi +25 -0
- wx/lib/nvdlg.py +156 -0
- wx/lib/ogl/__init__.py +13 -0
- wx/lib/ogl/basic.py +3989 -0
- wx/lib/ogl/bmpshape.py +86 -0
- wx/lib/ogl/canvas.py +467 -0
- wx/lib/ogl/composit.py +1576 -0
- wx/lib/ogl/diagram.py +230 -0
- wx/lib/ogl/divided.py +482 -0
- wx/lib/ogl/drawn.py +898 -0
- wx/lib/ogl/lines.py +1809 -0
- wx/lib/ogl/oglmisc.py +607 -0
- wx/lib/pdfviewer/__init__.py +113 -0
- wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
- wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
- wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
- wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
- wx/lib/pdfviewer/bitmaps/Save.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
- wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
- wx/lib/pdfviewer/buttonpanel.py +285 -0
- wx/lib/pdfviewer/images.py +240 -0
- wx/lib/pdfviewer/viewer.py +1118 -0
- wx/lib/pdfwin.py +295 -0
- wx/lib/pdfwin_old.py +789 -0
- wx/lib/platebtn.py +789 -0
- wx/lib/plot/CHANGELOG.md +150 -0
- wx/lib/plot/README.md +16 -0
- wx/lib/plot/__init__.py +46 -0
- wx/lib/plot/__main__.py +5 -0
- wx/lib/plot/examples/__init__.py +0 -0
- wx/lib/plot/examples/demo.py +1010 -0
- wx/lib/plot/examples/simple_example.py +56 -0
- wx/lib/plot/plotcanvas.py +2985 -0
- wx/lib/plot/polyobjects.py +1524 -0
- wx/lib/plot/utils.py +334 -0
- wx/lib/popupctl.py +251 -0
- wx/lib/printout.py +1155 -0
- wx/lib/progressindicator.py +151 -0
- wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
- wx/lib/pubsub/README_WxPython.txt +22 -0
- wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
- wx/lib/pubsub/__init__.py +25 -0
- wx/lib/pubsub/core/__init__.py +92 -0
- wx/lib/pubsub/core/arg1/__init__.py +16 -0
- wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
- wx/lib/pubsub/core/arg1/publisher.py +40 -0
- wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
- wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
- wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
- wx/lib/pubsub/core/callables.py +198 -0
- wx/lib/pubsub/core/imp2.py +62 -0
- wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
- wx/lib/pubsub/core/kwargs/__init__.py +16 -0
- wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
- wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
- wx/lib/pubsub/core/kwargs/publisher.py +77 -0
- wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
- wx/lib/pubsub/core/kwargs/topicargspecimpl.py +216 -0
- wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
- wx/lib/pubsub/core/listener.py +40 -0
- wx/lib/pubsub/core/listenerbase.py +185 -0
- wx/lib/pubsub/core/notificationmgr.py +185 -0
- wx/lib/pubsub/core/publisherbase.py +189 -0
- wx/lib/pubsub/core/topicargspec.py +77 -0
- wx/lib/pubsub/core/topicdefnprovider.py +631 -0
- wx/lib/pubsub/core/topicexc.py +72 -0
- wx/lib/pubsub/core/topicmgr.py +454 -0
- wx/lib/pubsub/core/topicobj.py +472 -0
- wx/lib/pubsub/core/topictreetraverser.py +143 -0
- wx/lib/pubsub/core/topicutils.py +119 -0
- wx/lib/pubsub/core/treeconfig.py +21 -0
- wx/lib/pubsub/core/validatedefnargs.py +29 -0
- wx/lib/pubsub/core/weakmethod.py +102 -0
- wx/lib/pubsub/policies.py +24 -0
- wx/lib/pubsub/pub.py +199 -0
- wx/lib/pubsub/setuparg1.py +47 -0
- wx/lib/pubsub/setupkwargs.py +29 -0
- wx/lib/pubsub/utils/__init__.py +27 -0
- wx/lib/pubsub/utils/exchandling.py +100 -0
- wx/lib/pubsub/utils/misc.py +99 -0
- wx/lib/pubsub/utils/notification.py +331 -0
- wx/lib/pubsub/utils/topictreeprinter.py +195 -0
- wx/lib/pubsub/utils/xmltopicdefnprovider.py +286 -0
- wx/lib/pydocview.py +3300 -0
- wx/lib/rcsizer.py +227 -0
- wx/lib/resizewidget.py +357 -0
- wx/lib/scrolledpanel.py +243 -0
- wx/lib/sheet.py +350 -0
- wx/lib/sized_controls.py +691 -0
- wx/lib/softwareupdate.py +355 -0
- wx/lib/splitter.py +925 -0
- wx/lib/statbmp.py +199 -0
- wx/lib/stattext.py +321 -0
- wx/lib/throbber.py +424 -0
- wx/lib/ticker.py +306 -0
- wx/lib/ticker_xrc.py +48 -0
- wx/lib/utils.py +89 -0
- wx/lib/wordwrap.py +97 -0
- wx/lib/wxcairo/__init__.py +139 -0
- wx/lib/wxcairo/wx_cairocffi.py +200 -0
- wx/lib/wxcairo/wx_pycairo.py +455 -0
- wx/lib/wxpTag.py +274 -0
- wx/libcairo-2.dll +0 -0
- wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/co/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
- wx/media.py +30 -0
- wx/media.pyi +272 -0
- wx/msw.py +16 -0
- wx/msw.pyi +91 -0
- wx/propgrid.py +498 -0
- wx/propgrid.pyi +7427 -0
- wx/py/CHANGES.txt +796 -0
- wx/py/Py.ico +0 -0
- wx/py/PyAlaCarte.py +34 -0
- wx/py/PyAlaMode.py +34 -0
- wx/py/PyAlaModeTest.py +33 -0
- wx/py/PyCrust.ico +0 -0
- wx/py/PyCrust.py +78 -0
- wx/py/PyCrust_16.png +0 -0
- wx/py/PyCrust_32.png +0 -0
- wx/py/PyFilling.py +35 -0
- wx/py/PyShell.py +78 -0
- wx/py/PySlices.ico +0 -0
- wx/py/PySlices.py +98 -0
- wx/py/PySlicesShell.py +94 -0
- wx/py/PySlices_16.png +0 -0
- wx/py/PySlices_32.png +0 -0
- wx/py/PyWrap.py +52 -0
- wx/py/README.txt +77 -0
- wx/py/__init__.py +20 -0
- wx/py/buffer.py +136 -0
- wx/py/crust.py +403 -0
- wx/py/crustslices.py +403 -0
- wx/py/dispatcher.py +259 -0
- wx/py/document.py +37 -0
- wx/py/editor.py +844 -0
- wx/py/editwindow.py +316 -0
- wx/py/filling.py +358 -0
- wx/py/frame.py +976 -0
- wx/py/images.py +212 -0
- wx/py/interpreter.py +161 -0
- wx/py/introspect.py +402 -0
- wx/py/magic.py +98 -0
- wx/py/parse.py +134 -0
- wx/py/path.py +36 -0
- wx/py/pseudo.py +99 -0
- wx/py/shell.py +1579 -0
- wx/py/sliceshell.py +3805 -0
- wx/py/tests/test_interpreter.py +71 -0
- wx/py/tests/test_introspect.py +810 -0
- wx/py/tests/test_pseudo.py +70 -0
- wx/py/tests/test_version.py +36 -0
- wx/py/tests/testall.py +22 -0
- wx/py/version.py +7 -0
- wx/py.typed +0 -0
- wx/ribbon.py +48 -0
- wx/ribbon.pyi +3099 -0
- wx/richtext.py +141 -0
- wx/richtext.pyi +13581 -0
- wx/siplib.cp315-win_amd64.pyd +0 -0
- wx/siplib.pyi +19 -0
- wx/stc.py +59 -0
- wx/stc.pyi +9918 -0
- wx/svg/__init__.py +363 -0
- wx/svg/_nanosvg.cp315-win_amd64.pyd +0 -0
- wx/tools/__init__.py +18 -0
- wx/tools/dbg.py +268 -0
- wx/tools/genaxmodule.py +50 -0
- wx/tools/helpviewer.py +92 -0
- wx/tools/img2img.py +85 -0
- wx/tools/img2png.py +54 -0
- wx/tools/img2py.py +306 -0
- wx/tools/img2xpm.py +54 -0
- wx/tools/pywxrc.py +951 -0
- wx/tools/wxget.py +254 -0
- wx/tools/wxget_docs_demo.py +183 -0
- wx/wxbase334u_net_vc140_x64.dll +0 -0
- wx/wxbase334u_vc140_x64.dll +0 -0
- wx/wxbase334u_xml_vc140_x64.dll +0 -0
- wx/wxmsw334u_adv_vc140_x64.dll +0 -0
- wx/wxmsw334u_aui_vc140_x64.dll +0 -0
- wx/wxmsw334u_core_vc140_x64.dll +0 -0
- wx/wxmsw334u_gl_vc140_x64.dll +0 -0
- wx/wxmsw334u_html_vc140_x64.dll +0 -0
- wx/wxmsw334u_media_vc140_x64.dll +0 -0
- wx/wxmsw334u_propgrid_vc140_x64.dll +0 -0
- wx/wxmsw334u_qa_vc140_x64.dll +0 -0
- wx/wxmsw334u_ribbon_vc140_x64.dll +0 -0
- wx/wxmsw334u_richtext_vc140_x64.dll +0 -0
- wx/wxmsw334u_stc_vc140_x64.dll +0 -0
- wx/wxmsw334u_webview_vc140_x64.dll +0 -0
- wx/wxmsw334u_xrc_vc140_x64.dll +0 -0
- wx/xml.py +18 -0
- wx/xml.pyi +728 -0
- wx/xrc.py +68 -0
- wx/xrc.pyi +896 -0
- wxpython-4.3.2.dist-info/METADATA +71 -0
- wxpython-4.3.2.dist-info/RECORD +472 -0
- wxpython-4.3.2.dist-info/WHEEL +5 -0
- wxpython-4.3.2.dist-info/entry_points.txt +13 -0
- wxpython-4.3.2.dist-info/licenses/LICENSE.txt +610 -0
- wxpython-4.3.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
#----------------------------------------------------------------------------
|
|
2
|
+
# Name: GUIMode.py
|
|
3
|
+
# Purpose:
|
|
4
|
+
#
|
|
5
|
+
# Author:
|
|
6
|
+
#
|
|
7
|
+
# Created:
|
|
8
|
+
# Version:
|
|
9
|
+
# Date:
|
|
10
|
+
# Licence:
|
|
11
|
+
# Tags: phoenix-port
|
|
12
|
+
#----------------------------------------------------------------------------
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
Module that holds the GUI modes used by FloatCanvas
|
|
16
|
+
|
|
17
|
+
Note that this can only be imported after a wx.App() has been created.
|
|
18
|
+
|
|
19
|
+
This approach was inspired by Christian Blouin, who also wrote the initial
|
|
20
|
+
version of the code.
|
|
21
|
+
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import wx
|
|
25
|
+
import numpy as np
|
|
26
|
+
|
|
27
|
+
from . import FCEvents, Resources
|
|
28
|
+
from .Utilities import BBox
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Cursors(object):
|
|
32
|
+
"""
|
|
33
|
+
Class to hold the standard Cursors
|
|
34
|
+
|
|
35
|
+
"""
|
|
36
|
+
def __init__(self):
|
|
37
|
+
if "wxMac" in wx.PlatformInfo: # use 16X16 cursors for wxMac
|
|
38
|
+
self.HandCursor = wx.Cursor(Resources.getHand16Image())
|
|
39
|
+
self.GrabHandCursor = wx.Cursor(Resources.getGrabHand16Image())
|
|
40
|
+
|
|
41
|
+
img = Resources.getMagPlus16Image()
|
|
42
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 6)
|
|
43
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 6)
|
|
44
|
+
self.MagPlusCursor = wx.Cursor(img)
|
|
45
|
+
|
|
46
|
+
img = Resources.getMagMinus16Image()
|
|
47
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 6)
|
|
48
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 6)
|
|
49
|
+
self.MagMinusCursor = wx.Cursor(img)
|
|
50
|
+
else: # use 24X24 cursors for GTK and Windows
|
|
51
|
+
self.HandCursor = wx.Cursor(Resources.getHandImage())
|
|
52
|
+
self.GrabHandCursor = wx.Cursor(Resources.getGrabHandImage())
|
|
53
|
+
|
|
54
|
+
img = Resources.getMagPlusImage()
|
|
55
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 9)
|
|
56
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 9)
|
|
57
|
+
self.MagPlusCursor = wx.Cursor(img)
|
|
58
|
+
|
|
59
|
+
img = Resources.getMagMinusImage()
|
|
60
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 9)
|
|
61
|
+
img.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 9)
|
|
62
|
+
self.MagMinusCursor = wx.Cursor(img)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class GUIBase(object):
|
|
66
|
+
"""
|
|
67
|
+
Basic Mouse mode and baseclass for other GUImode.
|
|
68
|
+
|
|
69
|
+
This one does nothing with any event
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
def __init__(self, Canvas=None):
|
|
73
|
+
"""
|
|
74
|
+
Default class constructor.
|
|
75
|
+
|
|
76
|
+
:param `Canvas`: the canvas the GUI mode is attached too
|
|
77
|
+
|
|
78
|
+
"""
|
|
79
|
+
self.Canvas = Canvas # set the FloatCanvas for the mode
|
|
80
|
+
# it gets set when the Mode is set on the Canvas.
|
|
81
|
+
self.Cursors = Cursors()
|
|
82
|
+
|
|
83
|
+
Cursor = wx.NullCursor
|
|
84
|
+
def UnSet(self):
|
|
85
|
+
"""
|
|
86
|
+
this method gets called by FloatCanvas when a new mode is being set
|
|
87
|
+
on the Canvas
|
|
88
|
+
"""
|
|
89
|
+
pass
|
|
90
|
+
# Handlers
|
|
91
|
+
def OnLeftDown(self, event):
|
|
92
|
+
pass
|
|
93
|
+
def OnLeftUp(self, event):
|
|
94
|
+
pass
|
|
95
|
+
def OnLeftDouble(self, event):
|
|
96
|
+
pass
|
|
97
|
+
def OnRightDown(self, event):
|
|
98
|
+
pass
|
|
99
|
+
def OnRightUp(self, event):
|
|
100
|
+
pass
|
|
101
|
+
def OnRightDouble(self, event):
|
|
102
|
+
pass
|
|
103
|
+
def OnMiddleDown(self, event):
|
|
104
|
+
pass
|
|
105
|
+
def OnMiddleUp(self, event):
|
|
106
|
+
pass
|
|
107
|
+
def OnMiddleDouble(self, event):
|
|
108
|
+
pass
|
|
109
|
+
def OnWheel(self, event):
|
|
110
|
+
pass
|
|
111
|
+
def OnMove(self, event):
|
|
112
|
+
pass
|
|
113
|
+
def OnKeyDown(self, event):
|
|
114
|
+
pass
|
|
115
|
+
def OnKeyUp(self, event):
|
|
116
|
+
pass
|
|
117
|
+
def UpdateScreen(self):
|
|
118
|
+
"""
|
|
119
|
+
Update gets called if the screen has been repainted in the middle of a zoom in
|
|
120
|
+
so the Rubber Band Box can get updated. Other GUIModes may require something similar
|
|
121
|
+
"""
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
## some mix-ins for use with the other modes:
|
|
126
|
+
class ZoomWithMouseWheel():
|
|
127
|
+
def OnWheel(self, event):
|
|
128
|
+
point = event.Position
|
|
129
|
+
if event.GetWheelRotation() < 0:
|
|
130
|
+
self.Canvas.Zoom(0.9, point, centerCoords = "Pixel", keepPointInPlace=True)
|
|
131
|
+
else:
|
|
132
|
+
self.Canvas.Zoom(1.1, point, centerCoords = "Pixel", keepPointInPlace=True)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class GUIMouse(GUIBase):
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
Mouse mode checks for a hit test, and if nothing is hit,
|
|
139
|
+
raises a FloatCanvas mouse event for each event.
|
|
140
|
+
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
Cursor = wx.NullCursor
|
|
144
|
+
|
|
145
|
+
# Handlers
|
|
146
|
+
def OnLeftDown(self, event):
|
|
147
|
+
EventType = FCEvents.EVT_FC_LEFT_DOWN
|
|
148
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
149
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
150
|
+
|
|
151
|
+
def OnLeftUp(self, event):
|
|
152
|
+
EventType = FCEvents.EVT_FC_LEFT_UP
|
|
153
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
154
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
155
|
+
|
|
156
|
+
def OnLeftDouble(self, event):
|
|
157
|
+
EventType = FCEvents.EVT_FC_LEFT_DCLICK
|
|
158
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
159
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
160
|
+
|
|
161
|
+
def OnMiddleDown(self, event):
|
|
162
|
+
EventType = FCEvents.EVT_FC_MIDDLE_DOWN
|
|
163
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
164
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
165
|
+
|
|
166
|
+
def OnMiddleUp(self, event):
|
|
167
|
+
EventType = FCEvents.EVT_FC_MIDDLE_UP
|
|
168
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
169
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
170
|
+
|
|
171
|
+
def OnMiddleDouble(self, event):
|
|
172
|
+
EventType = FCEvents.EVT_FC_MIDDLE_DCLICK
|
|
173
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
174
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
175
|
+
|
|
176
|
+
def OnRightDown(self, event):
|
|
177
|
+
EventType = FCEvents.EVT_FC_RIGHT_DOWN
|
|
178
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
179
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
180
|
+
|
|
181
|
+
def OnRightUp(self, event):
|
|
182
|
+
EventType = FCEvents.EVT_FC_RIGHT_UP
|
|
183
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
184
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
185
|
+
|
|
186
|
+
def OnRightDouble(self, event):
|
|
187
|
+
EventType = FCEvents.EVT_FC_RIGHT_DCLICK
|
|
188
|
+
if not self.Canvas.HitTest(event, EventType):
|
|
189
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
190
|
+
|
|
191
|
+
def OnWheel(self, event):
|
|
192
|
+
EventType = FCEvents.EVT_FC_MOUSEWHEEL
|
|
193
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
194
|
+
|
|
195
|
+
def OnMove(self, event):
|
|
196
|
+
## The Move event always gets raised, even if there is a hit-test
|
|
197
|
+
EventType = FCEvents.EVT_FC_MOTION
|
|
198
|
+
# process the object hit test for EVT_MOTION bindings
|
|
199
|
+
self.Canvas.HitTest(event, EventType)
|
|
200
|
+
# process enter and leave events
|
|
201
|
+
self.Canvas.MouseOverTest(event)
|
|
202
|
+
# then raise the event on the canvas
|
|
203
|
+
self.Canvas._RaiseMouseEvent(event, EventType)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class GUIMove(ZoomWithMouseWheel, GUIBase):
|
|
207
|
+
"""
|
|
208
|
+
Mode that moves the image (pans).
|
|
209
|
+
It doesn't change any coordinates, it only changes what the viewport is
|
|
210
|
+
"""
|
|
211
|
+
def __init__(self, canvas=None):
|
|
212
|
+
GUIBase.__init__(self, canvas)
|
|
213
|
+
self.Cursor = self.Cursors.HandCursor
|
|
214
|
+
self.GrabCursor = self.Cursors.GrabHandCursor
|
|
215
|
+
self.StartMove = None
|
|
216
|
+
self.MidMove = None
|
|
217
|
+
self.PrevMoveXY = None
|
|
218
|
+
|
|
219
|
+
## timer to give a delay when moving so that buffers aren't re-built too many times.
|
|
220
|
+
self.MoveTimer = wx.PyTimer(self.OnMoveTimer)
|
|
221
|
+
|
|
222
|
+
def OnLeftDown(self, event):
|
|
223
|
+
self.Canvas.SetCursor(self.GrabCursor)
|
|
224
|
+
self.Canvas.CaptureMouse()
|
|
225
|
+
self.StartMove = np.array( event.GetPosition() )
|
|
226
|
+
self.MidMove = self.StartMove
|
|
227
|
+
self.PrevMoveXY = (0,0)
|
|
228
|
+
|
|
229
|
+
def OnLeftUp(self, event):
|
|
230
|
+
self.Canvas.SetCursor(self.Cursor)
|
|
231
|
+
if self.StartMove is not None:
|
|
232
|
+
self.EndMove = np.array(event.GetPosition())
|
|
233
|
+
DiffMove = self.MidMove-self.EndMove
|
|
234
|
+
self.Canvas.MoveImage(DiffMove, 'Pixel', ReDraw=True)
|
|
235
|
+
|
|
236
|
+
def OnMove(self, event):
|
|
237
|
+
# Always raise the Move event.
|
|
238
|
+
self.Canvas._RaiseMouseEvent(event, FCEvents.EVT_FC_MOTION)
|
|
239
|
+
if event.Dragging() and event.LeftIsDown() and not self.StartMove is None:
|
|
240
|
+
self.EndMove = np.array(event.GetPosition())
|
|
241
|
+
self.MoveImage(event)
|
|
242
|
+
DiffMove = self.MidMove-self.EndMove
|
|
243
|
+
self.Canvas.MoveImage(DiffMove, 'Pixel', ReDraw=False)# reset the canvas without re-drawing
|
|
244
|
+
self.MidMove = self.EndMove
|
|
245
|
+
self.MoveTimer.Start(30, oneShot=True)
|
|
246
|
+
|
|
247
|
+
def OnMoveTimer(self, event=None):
|
|
248
|
+
self.Canvas.Draw()
|
|
249
|
+
|
|
250
|
+
def UpdateScreen(self):
|
|
251
|
+
## The screen has been re-drawn, so StartMove needs to be reset.
|
|
252
|
+
self.StartMove = self.MidMove
|
|
253
|
+
|
|
254
|
+
def MoveImage(self, event ):
|
|
255
|
+
#xy1 = N.array( event.GetPosition() )
|
|
256
|
+
xy1 = self.EndMove
|
|
257
|
+
wh = self.Canvas.PanelSize
|
|
258
|
+
xy_tl = xy1 - self.StartMove
|
|
259
|
+
dc = wx.ClientDC(self.Canvas)
|
|
260
|
+
x1,y1 = self.PrevMoveXY
|
|
261
|
+
x2,y2 = xy_tl
|
|
262
|
+
w,h = self.Canvas.PanelSize
|
|
263
|
+
##fixme: This sure could be cleaner!
|
|
264
|
+
## This is all to fill in the background with the background color
|
|
265
|
+
## without flashing as the image moves.
|
|
266
|
+
if x2 > x1 and y2 > y1:
|
|
267
|
+
xa = xb = x1
|
|
268
|
+
ya = yb = y1
|
|
269
|
+
wa = w
|
|
270
|
+
ha = y2 - y1
|
|
271
|
+
wb = x2- x1
|
|
272
|
+
hb = h
|
|
273
|
+
elif x2 > x1 and y2 <= y1:
|
|
274
|
+
xa = x1
|
|
275
|
+
ya = y1
|
|
276
|
+
wa = x2 - x1
|
|
277
|
+
ha = h
|
|
278
|
+
xb = x1
|
|
279
|
+
yb = y2 + h
|
|
280
|
+
wb = w
|
|
281
|
+
hb = y1 - y2
|
|
282
|
+
elif x2 <= x1 and y2 > y1:
|
|
283
|
+
xa = x1
|
|
284
|
+
ya = y1
|
|
285
|
+
wa = w
|
|
286
|
+
ha = y2 - y1
|
|
287
|
+
xb = x2 + w
|
|
288
|
+
yb = y1
|
|
289
|
+
wb = x1 - x2
|
|
290
|
+
hb = h - y2 + y1
|
|
291
|
+
elif x2 <= x1 and y2 <= y1:
|
|
292
|
+
xa = x2 + w
|
|
293
|
+
ya = y1
|
|
294
|
+
wa = x1 - x2
|
|
295
|
+
ha = h
|
|
296
|
+
xb = x1
|
|
297
|
+
yb = y2 + h
|
|
298
|
+
wb = w
|
|
299
|
+
hb = y1 - y2
|
|
300
|
+
|
|
301
|
+
dc.SetPen(wx.TRANSPARENT_PEN)
|
|
302
|
+
dc.SetBrush(self.Canvas.BackgroundBrush)
|
|
303
|
+
dc.DrawRectangle(xa, ya, wa, ha)
|
|
304
|
+
dc.DrawRectangle(xb, yb, wb, hb)
|
|
305
|
+
self.PrevMoveXY = xy_tl
|
|
306
|
+
if self.Canvas._ForeDrawList:
|
|
307
|
+
dc.DrawBitmap(self.Canvas._ForegroundBuffer,xy_tl)
|
|
308
|
+
else:
|
|
309
|
+
dc.DrawBitmap(self.Canvas._Buffer,xy_tl)
|
|
310
|
+
#self.Canvas.Update()
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
class GUIZoomIn(ZoomWithMouseWheel, GUIBase):
|
|
314
|
+
"""
|
|
315
|
+
Mode to zoom in.
|
|
316
|
+
"""
|
|
317
|
+
def __init__(self, canvas=None):
|
|
318
|
+
GUIBase.__init__(self, canvas)
|
|
319
|
+
self.StartRBBox = None
|
|
320
|
+
self.PrevRBBox = None
|
|
321
|
+
self.Cursor = self.Cursors.MagPlusCursor
|
|
322
|
+
|
|
323
|
+
def OnLeftDown(self, event):
|
|
324
|
+
self.StartRBBox = np.array( event.GetPosition() )
|
|
325
|
+
self.PrevRBBox = None
|
|
326
|
+
self.Canvas.CaptureMouse()
|
|
327
|
+
|
|
328
|
+
def OnLeftUp(self, event):
|
|
329
|
+
if event.LeftUp() and not self.StartRBBox is None:
|
|
330
|
+
self.PrevRBBox = None
|
|
331
|
+
EndRBBox = event.GetPosition()
|
|
332
|
+
StartRBBox = self.StartRBBox
|
|
333
|
+
# if mouse has moved less that ten pixels, don't use the box.
|
|
334
|
+
if ( abs(StartRBBox[0] - EndRBBox[0]) > 10
|
|
335
|
+
and abs(StartRBBox[1] - EndRBBox[1]) > 10 ):
|
|
336
|
+
EndRBBox = self.Canvas.PixelToWorld(EndRBBox)
|
|
337
|
+
StartRBBox = self.Canvas.PixelToWorld(StartRBBox)
|
|
338
|
+
self.Canvas.ZoomToBB( BBox.fromPoints(np.r_[EndRBBox,StartRBBox]) )
|
|
339
|
+
else:
|
|
340
|
+
Center = self.Canvas.PixelToWorld(StartRBBox)
|
|
341
|
+
self.Canvas.Zoom(1.5,Center)
|
|
342
|
+
self.StartRBBox = None
|
|
343
|
+
|
|
344
|
+
def OnMove(self, event):
|
|
345
|
+
# Always raise the Move event.
|
|
346
|
+
self.Canvas._RaiseMouseEvent(event,FCEvents.EVT_FC_MOTION)
|
|
347
|
+
if event.Dragging() and event.LeftIsDown() and not (self.StartRBBox is None):
|
|
348
|
+
xy0 = self.StartRBBox
|
|
349
|
+
xy1 = np.array( event.GetPosition() )
|
|
350
|
+
wh = abs(xy1 - xy0)
|
|
351
|
+
wh[0] = max(wh[0], int(wh[1]*self.Canvas.AspectRatio))
|
|
352
|
+
wh[1] = int(wh[0] / self.Canvas.AspectRatio)
|
|
353
|
+
xy_c = (xy0 + xy1) / 2
|
|
354
|
+
dc = wx.ClientDC(self.Canvas)
|
|
355
|
+
dc.SetPen(wx.Pen('WHITE', 2, wx.SHORT_DASH))
|
|
356
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
357
|
+
dc.SetLogicalFunction(wx.XOR)
|
|
358
|
+
if self.PrevRBBox:
|
|
359
|
+
dc.DrawRectangle(*self.PrevRBBox)
|
|
360
|
+
self.PrevRBBox = ( xy_c - wh/2, wh )
|
|
361
|
+
dc.DrawRectangle( *self.PrevRBBox )
|
|
362
|
+
|
|
363
|
+
def UpdateScreen(self):
|
|
364
|
+
"""
|
|
365
|
+
Update gets called if the screen has been repainted in the middle of a zoom in
|
|
366
|
+
so the Rubber Band Box can get updated
|
|
367
|
+
"""
|
|
368
|
+
#if False:
|
|
369
|
+
if self.PrevRBBox is not None:
|
|
370
|
+
dc = wx.ClientDC(self.Canvas)
|
|
371
|
+
dc.SetPen(wx.Pen('WHITE', 2, wx.SHORT_DASH))
|
|
372
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
373
|
+
dc.SetLogicalFunction(wx.XOR)
|
|
374
|
+
dc.DrawRectangle(*self.PrevRBBox)
|
|
375
|
+
|
|
376
|
+
def OnRightDown(self, event):
|
|
377
|
+
self.Canvas.Zoom(1/1.5, event.GetPosition(), centerCoords="Pixel")
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
class GUIZoomOut(ZoomWithMouseWheel, GUIBase):
|
|
381
|
+
"""
|
|
382
|
+
Mode to zoom out.
|
|
383
|
+
"""
|
|
384
|
+
def __init__(self, Canvas=None):
|
|
385
|
+
GUIBase.__init__(self, Canvas)
|
|
386
|
+
self.Cursor = self.Cursors.MagMinusCursor
|
|
387
|
+
|
|
388
|
+
def OnLeftDown(self, event):
|
|
389
|
+
self.Canvas.Zoom(1/1.5, event.GetPosition(), centerCoords="Pixel")
|
|
390
|
+
|
|
391
|
+
def OnRightDown(self, event):
|
|
392
|
+
self.Canvas.Zoom(1.5, event.GetPosition(), centerCoords="Pixel")
|
|
393
|
+
|
|
394
|
+
def OnMove(self, event):
|
|
395
|
+
# Always raise the Move event.
|
|
396
|
+
self.Canvas._RaiseMouseEvent(event,FCEvents.EVT_FC_MOTION)
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#----------------------------------------------------------------------------
|
|
2
|
+
# Name: NavCanvas.py
|
|
3
|
+
# Purpose: Combines FloatCanvas with Navigation controls
|
|
4
|
+
#
|
|
5
|
+
# Author:
|
|
6
|
+
#
|
|
7
|
+
# Created:
|
|
8
|
+
# Version:
|
|
9
|
+
# Date:
|
|
10
|
+
# Licence:
|
|
11
|
+
# Tags: phoenix-port, unittest, documented, py3-port
|
|
12
|
+
#----------------------------------------------------------------------------
|
|
13
|
+
"""
|
|
14
|
+
Combines :class:`~lib.floatcanvas.FloatCanvas.FloatCanvas` with Navigation
|
|
15
|
+
controls onto a :class:`Panel`
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
In the following very simple sample ``self`` is a frame, but it could be another
|
|
19
|
+
container type control::
|
|
20
|
+
|
|
21
|
+
from wx.lib.floatcanvas import NavCanvas, FloatCanvas
|
|
22
|
+
|
|
23
|
+
#Add the Canvas
|
|
24
|
+
self.Canvas = NavCanvas.NavCanvas(self, -1,
|
|
25
|
+
size=(500, 500),
|
|
26
|
+
ProjectionFun=None,
|
|
27
|
+
Debug=0,
|
|
28
|
+
BackgroundColor="White",
|
|
29
|
+
).Canvas
|
|
30
|
+
|
|
31
|
+
# add a circle
|
|
32
|
+
cir = FloatCanvas.Circle((10, 10), 100)
|
|
33
|
+
self.Canvas.AddObject(cir)
|
|
34
|
+
|
|
35
|
+
# add a rectangle
|
|
36
|
+
rect = FloatCanvas.Rectangle((110, 10), (100, 100), FillColor='Red')
|
|
37
|
+
self.Canvas.AddObject(rect)
|
|
38
|
+
|
|
39
|
+
self.Canvas.Draw()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
Many samples are available in the `wxPhoenix/samples/floatcanvas` folder.
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
import wx
|
|
48
|
+
from . import FloatCanvas, Resources, GUIMode
|
|
49
|
+
|
|
50
|
+
class NavCanvas(wx.Panel):
|
|
51
|
+
"""
|
|
52
|
+
:class:`~lib.floatcanvas.NavCanvas.NavCanvas` encloses a
|
|
53
|
+
:class:`~lib.floatcanvas.FloatCanvas.FloatCanvas` in a :class:`Panel` and
|
|
54
|
+
adds a Navigation toolbar.
|
|
55
|
+
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(self,
|
|
59
|
+
parent,
|
|
60
|
+
id = wx.ID_ANY,
|
|
61
|
+
size = wx.DefaultSize,
|
|
62
|
+
**kwargs):
|
|
63
|
+
"""
|
|
64
|
+
Default class constructor.
|
|
65
|
+
|
|
66
|
+
:param wx.Window `parent`: parent window. Must not be ``None``;
|
|
67
|
+
:param integer `id`: window identifier. A value of -1 indicates a default value;
|
|
68
|
+
:param `size`: a tuple or :class:`wx.Size`
|
|
69
|
+
:param `**kwargs`: will be passed on to :class:`~lib.floatcanvas.FloatCanvas.FloatCanvas`
|
|
70
|
+
"""
|
|
71
|
+
wx.Panel.__init__(self, parent, id, size=size)
|
|
72
|
+
|
|
73
|
+
self.Modes = [("Pointer", GUIMode.GUIMouse(), Resources.getPointerBitmap()),
|
|
74
|
+
("Zoom In", GUIMode.GUIZoomIn(), Resources.getMagPlusBitmap()),
|
|
75
|
+
("Zoom Out", GUIMode.GUIZoomOut(), Resources.getMagMinusBitmap()),
|
|
76
|
+
("Pan", GUIMode.GUIMove(), Resources.getHandBitmap()),
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
self.BuildToolbar()
|
|
80
|
+
## Create the vertical sizer for the toolbar and Panel
|
|
81
|
+
box = wx.BoxSizer(wx.VERTICAL)
|
|
82
|
+
box.Add(self.ToolBar, 0, wx.ALL | wx.ALIGN_LEFT | wx.GROW, 4)
|
|
83
|
+
|
|
84
|
+
self.Canvas = FloatCanvas.FloatCanvas(self, **kwargs)
|
|
85
|
+
box.Add(self.Canvas, 1, wx.GROW)
|
|
86
|
+
|
|
87
|
+
self.SetSizerAndFit(box)
|
|
88
|
+
|
|
89
|
+
# default to first mode
|
|
90
|
+
#self.ToolBar.ToggleTool(self.PointerTool.GetId(), True)
|
|
91
|
+
self.Canvas.SetMode(self.Modes[0][1])
|
|
92
|
+
|
|
93
|
+
return None
|
|
94
|
+
|
|
95
|
+
def BuildToolbar(self):
|
|
96
|
+
"""
|
|
97
|
+
Build the default tool bar, can be over-ridden in a subclass to add
|
|
98
|
+
extra tools etc.
|
|
99
|
+
"""
|
|
100
|
+
tb = wx.ToolBar(self)
|
|
101
|
+
self.ToolBar = tb
|
|
102
|
+
tb.SetToolBitmapSize((24,24))
|
|
103
|
+
self.AddToolbarModeButtons(tb, self.Modes)
|
|
104
|
+
self.AddToolbarZoomButton(tb)
|
|
105
|
+
tb.Realize()
|
|
106
|
+
## fixme: remove this when the bug is fixed!
|
|
107
|
+
#wx.CallAfter(self.HideShowHack) # this required on wxPython 2.8.3 on OS-X
|
|
108
|
+
|
|
109
|
+
def AddToolbarModeButtons(self, tb, Modes):
|
|
110
|
+
"""
|
|
111
|
+
Add the mode buttons to the tool bar.
|
|
112
|
+
|
|
113
|
+
:param ToolBar `tb`: the toolbar instance
|
|
114
|
+
:param list `Modes`: a list of modes to add, out of the box valid modes
|
|
115
|
+
are subclassed from :class:`~lib.floatcanvas.GUIMode.GUIBase` or modes
|
|
116
|
+
can also be user defined.
|
|
117
|
+
|
|
118
|
+
"""
|
|
119
|
+
self.ModesDict = {}
|
|
120
|
+
for Mode in Modes:
|
|
121
|
+
tool = tb.AddTool(wx.ID_ANY, label=Mode[0],
|
|
122
|
+
shortHelp=Mode[0],
|
|
123
|
+
bitmap=wx.BitmapBundle(Mode[2]),
|
|
124
|
+
kind=wx.ITEM_RADIO)
|
|
125
|
+
self.Bind(wx.EVT_TOOL, self.SetMode, tool)
|
|
126
|
+
self.ModesDict[tool.GetId()]=Mode[1]
|
|
127
|
+
#self.ZoomOutTool = tb.AddRadioTool(wx.ID_ANY, bitmap=Resources.getMagMinusBitmap(), shortHelp = "Zoom Out")
|
|
128
|
+
#self.Bind(wx.EVT_TOOL, lambda evt : self.SetMode(Mode=self.GUIZoomOut), self.ZoomOutTool)
|
|
129
|
+
|
|
130
|
+
def AddToolbarZoomButton(self, tb):
|
|
131
|
+
"""
|
|
132
|
+
Add the zoom button to the tool bar.
|
|
133
|
+
|
|
134
|
+
:param ToolBar `tb`: the toolbar instance
|
|
135
|
+
|
|
136
|
+
"""
|
|
137
|
+
tb.AddSeparator()
|
|
138
|
+
|
|
139
|
+
self.ZoomButton = wx.Button(tb, label="Zoom To Fit")
|
|
140
|
+
tb.AddControl(self.ZoomButton)
|
|
141
|
+
self.ZoomButton.Bind(wx.EVT_BUTTON, self.ZoomToFit)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def HideShowHack(self):
|
|
145
|
+
##fixme: remove this when the bug is fixed!
|
|
146
|
+
"""
|
|
147
|
+
Hack to hide and show button on toolbar to get around OS-X bug on
|
|
148
|
+
wxPython2.8 on OS-X
|
|
149
|
+
"""
|
|
150
|
+
self.ZoomButton.Hide()
|
|
151
|
+
self.ZoomButton.Show()
|
|
152
|
+
|
|
153
|
+
def SetMode(self, event):
|
|
154
|
+
"""Event handler to set the mode."""
|
|
155
|
+
Mode = self.ModesDict[event.GetId()]
|
|
156
|
+
self.Canvas.SetMode(Mode)
|
|
157
|
+
|
|
158
|
+
def ZoomToFit(self, event):
|
|
159
|
+
"""Event handler to zoom to fit."""
|
|
160
|
+
self.Canvas.ZoomToBB()
|
|
161
|
+
self.Canvas.SetFocus() # Otherwise the focus stays on the Button, and wheel events are lost.
|
|
162
|
+
|