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,1232 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#----------------------------------------------------------------------------
|
|
3
|
+
# Name: aui_switcherdialog.py
|
|
4
|
+
# Purpose:
|
|
5
|
+
#
|
|
6
|
+
# Author:
|
|
7
|
+
#
|
|
8
|
+
# Created:
|
|
9
|
+
# Version:
|
|
10
|
+
# Date:
|
|
11
|
+
# Licence: wxWindows license
|
|
12
|
+
# Tags: phoenix-port, documented, py3-port
|
|
13
|
+
#----------------------------------------------------------------------------
|
|
14
|
+
"""
|
|
15
|
+
Description
|
|
16
|
+
===========
|
|
17
|
+
|
|
18
|
+
The idea of `SwitcherDialog` is to make it easier to implement keyboard
|
|
19
|
+
navigation in AUI and other applications that have multiple panes and
|
|
20
|
+
tabs.
|
|
21
|
+
|
|
22
|
+
A key combination with a modifier (such as ``Ctrl`` + ``Tab``) shows the
|
|
23
|
+
dialog, and the user holds down the modifier whilst navigating with
|
|
24
|
+
``Tab`` and arrow keys before releasing the modifier to dismiss the dialog
|
|
25
|
+
and activate the selected pane.
|
|
26
|
+
|
|
27
|
+
The switcher dialog is a multi-column menu with no scrolling, implemented
|
|
28
|
+
by the :class:`MultiColumnListCtrl` class. You can have headings for your items
|
|
29
|
+
for logical grouping, and you can force a column break if you need to.
|
|
30
|
+
|
|
31
|
+
The modifier used for invoking and dismissing the dialog can be customised,
|
|
32
|
+
as can the colours, number of rows, and the key used for cycling through
|
|
33
|
+
the items. So you can use different keys on different platforms if
|
|
34
|
+
required (especially since ``Ctrl`` + ``Tab`` is reserved on some platforms).
|
|
35
|
+
|
|
36
|
+
Items are shown as names and optional 16x16 images.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
Base Functionalities
|
|
40
|
+
====================
|
|
41
|
+
|
|
42
|
+
To use the dialog, you set up the items in a `SwitcherItems` object,
|
|
43
|
+
before passing this to the `SwitcherDialog` instance.
|
|
44
|
+
|
|
45
|
+
Call :meth:`SwitcherItems.AddItem` and optionally :meth:`SwitcherItems.AddGroup`
|
|
46
|
+
to add items and headings. These functions take a label (to be displayed to the user),
|
|
47
|
+
an identifying name, an integer id, and a bitmap. The name and id are purely for
|
|
48
|
+
application-defined identification. You may also set a description to be displayed
|
|
49
|
+
when each item is selected; and you can set a window pointer for convenience when
|
|
50
|
+
activating the desired window after the dialog returns.
|
|
51
|
+
|
|
52
|
+
Have created the dialog, you call :meth:`~Dialog.ShowModal`, and if the return value is
|
|
53
|
+
``wx.ID_OK``, retrieve the selection from the dialog and activate the pane.
|
|
54
|
+
|
|
55
|
+
The sample code below shows a generic method of finding panes and notebook
|
|
56
|
+
tabs within the current :class:`~wx.lib.agw.aui.framemanager.AuiManager`, and using the pane name or notebook
|
|
57
|
+
tab position to display the pane.
|
|
58
|
+
|
|
59
|
+
The only other code to add is a menu item with the desired accelerator,
|
|
60
|
+
whose modifier matches the one you pass to :meth:`SwitcherDialog.SetModifierKey`
|
|
61
|
+
(the default being ``wx.WXK_CONTROL``).
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
Usage
|
|
65
|
+
=====
|
|
66
|
+
|
|
67
|
+
Menu item::
|
|
68
|
+
|
|
69
|
+
if wx.Platform == "__WXMAC__":
|
|
70
|
+
switcherAccel = "Alt+Tab"
|
|
71
|
+
elif wx.Platform == "__WXGTK__":
|
|
72
|
+
switcherAccel = "Ctrl+/"
|
|
73
|
+
else:
|
|
74
|
+
switcherAccel = "Ctrl+Tab"
|
|
75
|
+
|
|
76
|
+
view_menu.Append(ID_SwitchPane, _("S&witch Window...") + "\t" + switcherAccel)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
Event handler::
|
|
80
|
+
|
|
81
|
+
def OnSwitchPane(self, event):
|
|
82
|
+
|
|
83
|
+
items = SwitcherItems()
|
|
84
|
+
items.SetRowCount(12)
|
|
85
|
+
|
|
86
|
+
# Add the main windows and toolbars, in two separate columns
|
|
87
|
+
# We'll use the item 'id' to store the notebook selection, or -1 if not a page
|
|
88
|
+
|
|
89
|
+
for k in range(2):
|
|
90
|
+
if k == 0:
|
|
91
|
+
items.AddGroup(_("Main Windows"), "mainwindows")
|
|
92
|
+
else:
|
|
93
|
+
items.AddGroup(_("Toolbars"), "toolbars").BreakColumn()
|
|
94
|
+
|
|
95
|
+
for pane in self._mgr.GetAllPanes():
|
|
96
|
+
name = pane.name
|
|
97
|
+
caption = pane.caption
|
|
98
|
+
|
|
99
|
+
toolbar = isinstance(info.window, wx.ToolBar) or isinstance(info.window, aui.AuiToolBar)
|
|
100
|
+
if caption and (toolBar and k == 1) or (not toolBar and k == 0):
|
|
101
|
+
items.AddItem(caption, name, -1).SetWindow(pane.window)
|
|
102
|
+
|
|
103
|
+
# Now add the wxAuiNotebook pages
|
|
104
|
+
|
|
105
|
+
items.AddGroup(_("Notebook Pages"), "pages").BreakColumn()
|
|
106
|
+
|
|
107
|
+
for pane in self._mgr.GetAllPanes():
|
|
108
|
+
nb = pane.window
|
|
109
|
+
if isinstance(nb, aui.AuiNotebook):
|
|
110
|
+
for j in range(nb.GetPageCount()):
|
|
111
|
+
|
|
112
|
+
name = nb.GetPageText(j)
|
|
113
|
+
win = nb.GetPage(j)
|
|
114
|
+
|
|
115
|
+
items.AddItem(name, name, j, nb.GetPageBitmap(j)).SetWindow(win)
|
|
116
|
+
|
|
117
|
+
# Select the focused window
|
|
118
|
+
|
|
119
|
+
idx = items.GetIndexForFocus()
|
|
120
|
+
if idx != wx.NOT_FOUND:
|
|
121
|
+
items.SetSelection(idx)
|
|
122
|
+
|
|
123
|
+
if wx.Platform == "__WXMAC__":
|
|
124
|
+
items.SetBackgroundColour(wx.WHITE)
|
|
125
|
+
|
|
126
|
+
# Show the switcher dialog
|
|
127
|
+
|
|
128
|
+
dlg = SwitcherDialog(items, wx.GetApp().GetTopWindow())
|
|
129
|
+
|
|
130
|
+
# In GTK+ we can't use Ctrl+Tab; we use Ctrl+/ instead and tell the switcher
|
|
131
|
+
# to treat / in the same was as tab (i.e. cycle through the names)
|
|
132
|
+
|
|
133
|
+
if wx.Platform == "__WXGTK__":
|
|
134
|
+
dlg.SetExtraNavigationKey(wxT('/'))
|
|
135
|
+
|
|
136
|
+
if wx.Platform == "__WXMAC__":
|
|
137
|
+
dlg.SetBackgroundColour(wx.WHITE)
|
|
138
|
+
dlg.SetModifierKey(wx.WXK_ALT)
|
|
139
|
+
|
|
140
|
+
ans = dlg.ShowModal()
|
|
141
|
+
|
|
142
|
+
if ans == wx.ID_OK and dlg.GetSelection() != -1:
|
|
143
|
+
item = items.GetItem(dlg.GetSelection())
|
|
144
|
+
|
|
145
|
+
if item.GetId() == -1:
|
|
146
|
+
info = self._mgr.GetPane(item.GetName())
|
|
147
|
+
info.Show()
|
|
148
|
+
self._mgr.Update()
|
|
149
|
+
info.window.SetFocus()
|
|
150
|
+
|
|
151
|
+
else:
|
|
152
|
+
nb = item.GetWindow().GetParent()
|
|
153
|
+
win = item.GetWindow();
|
|
154
|
+
if isinstance(nb, aui.AuiNotebook):
|
|
155
|
+
nb.SetSelection(item.GetId())
|
|
156
|
+
win.SetFocus()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
import sys
|
|
162
|
+
import wx
|
|
163
|
+
|
|
164
|
+
from . import auibook
|
|
165
|
+
from .aui_utilities import FindFocusDescendant
|
|
166
|
+
from .aui_constants import SWITCHER_TEXT_MARGIN_X, SWITCHER_TEXT_MARGIN_Y
|
|
167
|
+
|
|
168
|
+
if sys.version_info >= (3, 11):
|
|
169
|
+
from typing import Self
|
|
170
|
+
else:
|
|
171
|
+
from typing_extensions import Self
|
|
172
|
+
|
|
173
|
+
# Define a translation function
|
|
174
|
+
_ = wx.GetTranslation
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class SwitcherItem(object):
|
|
178
|
+
""" An object containing information about one item. """
|
|
179
|
+
|
|
180
|
+
def __init__(self, item=None):
|
|
181
|
+
""" Default class constructor. """
|
|
182
|
+
|
|
183
|
+
self._id = 0
|
|
184
|
+
self._isGroup = False
|
|
185
|
+
self._breakColumn = False
|
|
186
|
+
self._rowPos = 0
|
|
187
|
+
self._colPos = 0
|
|
188
|
+
self._window = None
|
|
189
|
+
self._description = ""
|
|
190
|
+
|
|
191
|
+
self._textColour = wx.NullColour
|
|
192
|
+
self._bitmap = wx.NullBitmap
|
|
193
|
+
self._font = wx.NullFont
|
|
194
|
+
|
|
195
|
+
if item:
|
|
196
|
+
self.Copy(item)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def Copy(self, item):
|
|
200
|
+
"""
|
|
201
|
+
Copy operator between 2 :class:`SwitcherItem` instances.
|
|
202
|
+
|
|
203
|
+
:param `item`: another instance of :class:`SwitcherItem`.
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
self._id = item._id
|
|
207
|
+
self._name = item._name
|
|
208
|
+
self._title = item._title
|
|
209
|
+
self._isGroup = item._isGroup
|
|
210
|
+
self._breakColumn = item._breakColumn
|
|
211
|
+
self._rect = item._rect
|
|
212
|
+
self._font = item._font
|
|
213
|
+
self._textColour = item._textColour
|
|
214
|
+
self._bitmap = item._bitmap
|
|
215
|
+
self._description = item._description
|
|
216
|
+
self._rowPos = item._rowPos
|
|
217
|
+
self._colPos = item._colPos
|
|
218
|
+
self._window = item._window
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def SetTitle(self, title) -> Self:
|
|
222
|
+
|
|
223
|
+
self._title = title
|
|
224
|
+
return self
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def GetTitle(self):
|
|
228
|
+
|
|
229
|
+
return self._title
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def SetName(self, name) -> Self:
|
|
233
|
+
|
|
234
|
+
self._name = name
|
|
235
|
+
return self
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def GetName(self):
|
|
239
|
+
|
|
240
|
+
return self._name
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def SetDescription(self, descr) -> Self:
|
|
244
|
+
|
|
245
|
+
self._description = descr
|
|
246
|
+
return self
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def GetDescription(self):
|
|
250
|
+
|
|
251
|
+
return self._description
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def SetId(self, id) -> Self:
|
|
255
|
+
|
|
256
|
+
self._id = id
|
|
257
|
+
return self
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def GetId(self):
|
|
261
|
+
|
|
262
|
+
return self._id
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def SetIsGroup(self, isGroup) -> Self:
|
|
266
|
+
|
|
267
|
+
self._isGroup = isGroup
|
|
268
|
+
return self
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def GetIsGroup(self):
|
|
272
|
+
|
|
273
|
+
return self._isGroup
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def BreakColumn(self, breakCol=True) -> Self:
|
|
277
|
+
|
|
278
|
+
self._breakColumn = breakCol
|
|
279
|
+
return self
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def GetBreakColumn(self):
|
|
283
|
+
|
|
284
|
+
return self._breakColumn
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def SetRect(self, rect) -> Self:
|
|
288
|
+
|
|
289
|
+
self._rect = rect
|
|
290
|
+
return self
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def GetRect(self):
|
|
294
|
+
|
|
295
|
+
return self._rect
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def SetTextColour(self, colour) -> Self:
|
|
299
|
+
|
|
300
|
+
self._textColour = colour
|
|
301
|
+
return self
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def GetTextColour(self):
|
|
305
|
+
|
|
306
|
+
return self._textColour
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def SetFont(self, font) -> Self:
|
|
310
|
+
|
|
311
|
+
self._font = font
|
|
312
|
+
return self
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def GetFont(self):
|
|
316
|
+
|
|
317
|
+
return self._font
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def SetBitmap(self, bitmap) -> Self:
|
|
321
|
+
|
|
322
|
+
self._bitmap = bitmap
|
|
323
|
+
return self
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def GetBitmap(self):
|
|
327
|
+
|
|
328
|
+
return self._bitmap
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def SetRowPos(self, pos) -> Self:
|
|
332
|
+
|
|
333
|
+
self._rowPos = pos
|
|
334
|
+
return self
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def GetRowPos(self):
|
|
338
|
+
|
|
339
|
+
return self._rowPos
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def SetColPos(self, pos) -> Self:
|
|
343
|
+
|
|
344
|
+
self._colPos = pos
|
|
345
|
+
return self
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def GetColPos(self):
|
|
349
|
+
|
|
350
|
+
return self._colPos
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
def SetWindow(self, win) -> Self:
|
|
354
|
+
|
|
355
|
+
self._window = win
|
|
356
|
+
return self
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def GetWindow(self):
|
|
360
|
+
|
|
361
|
+
return self._window
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
class SwitcherItems(object):
|
|
365
|
+
""" An object containing switcher items. """
|
|
366
|
+
|
|
367
|
+
def __init__(self, items=None):
|
|
368
|
+
""" Default class constructor. """
|
|
369
|
+
|
|
370
|
+
self._selection = -1
|
|
371
|
+
self._rowCount = 10
|
|
372
|
+
self._columnCount = 0
|
|
373
|
+
|
|
374
|
+
self._backgroundColour = wx.NullColour
|
|
375
|
+
self._textColour = wx.NullColour
|
|
376
|
+
self._selectionColour = wx.NullColour
|
|
377
|
+
self._selectionOutlineColour = wx.NullColour
|
|
378
|
+
self._itemFont = wx.NullFont
|
|
379
|
+
|
|
380
|
+
self._items = []
|
|
381
|
+
|
|
382
|
+
if wx.Platform == "__WXMSW__":
|
|
383
|
+
# If on Windows XP/Vista, use more appropriate colours
|
|
384
|
+
self.SetSelectionOutlineColour(wx.Colour(49, 106, 197))
|
|
385
|
+
self.SetSelectionColour(wx.Colour(193, 210, 238))
|
|
386
|
+
|
|
387
|
+
if items:
|
|
388
|
+
self.Copy(items)
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def Copy(self, items):
|
|
392
|
+
"""
|
|
393
|
+
Copy operator between 2 :class:`SwitcherItems`.
|
|
394
|
+
|
|
395
|
+
:param `items`: another instance of :class:`SwitcherItems`.
|
|
396
|
+
"""
|
|
397
|
+
|
|
398
|
+
self.Clear()
|
|
399
|
+
|
|
400
|
+
for item in items._items:
|
|
401
|
+
self._items.append(item)
|
|
402
|
+
|
|
403
|
+
self._selection = items._selection
|
|
404
|
+
self._rowCount = items._rowCount
|
|
405
|
+
self._columnCount = items._columnCount
|
|
406
|
+
|
|
407
|
+
self._backgroundColour = items._backgroundColour
|
|
408
|
+
self._textColour = items._textColour
|
|
409
|
+
self._selectionColour = items._selectionColour
|
|
410
|
+
self._selectionOutlineColour = items._selectionOutlineColour
|
|
411
|
+
self._itemFont = items._itemFont
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def AddItem(self, titleOrItem, name=None, id=0, bitmap=wx.NullBitmap):
|
|
415
|
+
|
|
416
|
+
if isinstance(titleOrItem, SwitcherItem):
|
|
417
|
+
self._items.append(titleOrItem)
|
|
418
|
+
return self._items[-1]
|
|
419
|
+
|
|
420
|
+
item = SwitcherItem()
|
|
421
|
+
item.SetTitle(titleOrItem)
|
|
422
|
+
item.SetName(name)
|
|
423
|
+
item.SetId(id)
|
|
424
|
+
item.SetBitmap(bitmap)
|
|
425
|
+
|
|
426
|
+
self._items.append(item)
|
|
427
|
+
return self._items[-1]
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def AddGroup(self, title, name, id=0, bitmap=wx.NullBitmap):
|
|
431
|
+
|
|
432
|
+
item = self.AddItem(title, name, id, bitmap)
|
|
433
|
+
item.SetIsGroup(True)
|
|
434
|
+
|
|
435
|
+
return item
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
def Clear(self):
|
|
439
|
+
|
|
440
|
+
self._items = []
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
def FindItemByName(self, name):
|
|
444
|
+
|
|
445
|
+
for i in range(len(self._items)):
|
|
446
|
+
if self._items[i].GetName() == name:
|
|
447
|
+
return i
|
|
448
|
+
|
|
449
|
+
return wx.NOT_FOUND
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def FindItemById(self, id):
|
|
453
|
+
|
|
454
|
+
for i in range(len(self._items)):
|
|
455
|
+
if self._items[i].GetId() == id:
|
|
456
|
+
return i
|
|
457
|
+
|
|
458
|
+
return wx.NOT_FOUND
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
def SetSelection(self, sel):
|
|
462
|
+
|
|
463
|
+
self._selection = sel
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
def SetSelectionByName(self, name):
|
|
467
|
+
|
|
468
|
+
idx = self.FindItemByName(name)
|
|
469
|
+
if idx != wx.NOT_FOUND:
|
|
470
|
+
self.SetSelection(idx)
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
def GetSelection(self):
|
|
474
|
+
|
|
475
|
+
return self._selection
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def GetItem(self, i):
|
|
479
|
+
|
|
480
|
+
return self._items[i]
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
def GetItemCount(self):
|
|
484
|
+
|
|
485
|
+
return len(self._items)
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
def SetRowCount(self, rows):
|
|
489
|
+
|
|
490
|
+
self._rowCount = rows
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def GetRowCount(self):
|
|
494
|
+
|
|
495
|
+
return self._rowCount
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def SetColumnCount(self, cols):
|
|
499
|
+
|
|
500
|
+
self._columnCount = cols
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
def GetColumnCount(self):
|
|
504
|
+
|
|
505
|
+
return self._columnCount
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
def SetBackgroundColour(self, colour):
|
|
509
|
+
|
|
510
|
+
self._backgroundColour = colour
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
def GetBackgroundColour(self):
|
|
514
|
+
|
|
515
|
+
return self._backgroundColour
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def SetTextColour(self, colour):
|
|
519
|
+
|
|
520
|
+
self._textColour = colour
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def GetTextColour(self):
|
|
524
|
+
|
|
525
|
+
return self._textColour
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
def SetSelectionColour(self, colour):
|
|
529
|
+
|
|
530
|
+
self._selectionColour = colour
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def GetSelectionColour(self):
|
|
534
|
+
|
|
535
|
+
return self._selectionColour
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
def SetSelectionOutlineColour(self, colour):
|
|
539
|
+
|
|
540
|
+
self._selectionOutlineColour = colour
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
def GetSelectionOutlineColour(self):
|
|
544
|
+
|
|
545
|
+
return self._selectionOutlineColour
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def SetItemFont(self, font):
|
|
549
|
+
|
|
550
|
+
self._itemFont = font
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
def GetItemFont(self):
|
|
554
|
+
|
|
555
|
+
return self._itemFont
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def PaintItems(self, dc, win):
|
|
559
|
+
|
|
560
|
+
backgroundColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DFACE)
|
|
561
|
+
standardTextColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
|
562
|
+
selectionColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)
|
|
563
|
+
selectionOutlineColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
|
564
|
+
standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
565
|
+
groupFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
566
|
+
groupFont.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
567
|
+
|
|
568
|
+
if self.GetBackgroundColour().IsOk():
|
|
569
|
+
backgroundColour = self.GetBackgroundColour()
|
|
570
|
+
|
|
571
|
+
if self.GetTextColour().IsOk():
|
|
572
|
+
standardTextColour = self.GetTextColour()
|
|
573
|
+
|
|
574
|
+
if self.GetSelectionColour().IsOk():
|
|
575
|
+
selectionColour = self.GetSelectionColour()
|
|
576
|
+
|
|
577
|
+
if self.GetSelectionOutlineColour().IsOk():
|
|
578
|
+
selectionOutlineColour = self.GetSelectionOutlineColour()
|
|
579
|
+
|
|
580
|
+
if self.GetItemFont().IsOk():
|
|
581
|
+
|
|
582
|
+
standardFont = self.GetItemFont()
|
|
583
|
+
groupFont = wx.Font(standardFont.GetPointSize(), standardFont.GetFamily(), standardFont.GetStyle(),
|
|
584
|
+
wx.FONTWEIGHT_BOLD, standardFont.GetUnderlined(), standardFont.GetFaceName())
|
|
585
|
+
|
|
586
|
+
textMarginX = SWITCHER_TEXT_MARGIN_X
|
|
587
|
+
|
|
588
|
+
dc.SetLogicalFunction(wx.COPY)
|
|
589
|
+
dc.SetBrush(wx.Brush(backgroundColour))
|
|
590
|
+
dc.SetPen(wx.TRANSPARENT_PEN)
|
|
591
|
+
dc.DrawRectangle(win.GetClientRect())
|
|
592
|
+
dc.SetBackgroundMode(wx.TRANSPARENT)
|
|
593
|
+
|
|
594
|
+
for i in range(len(self._items)):
|
|
595
|
+
item = self._items[i]
|
|
596
|
+
if i == self._selection:
|
|
597
|
+
dc.SetPen(wx.Pen(selectionOutlineColour))
|
|
598
|
+
dc.SetBrush(wx.Brush(selectionColour))
|
|
599
|
+
dc.DrawRectangle(item.GetRect())
|
|
600
|
+
|
|
601
|
+
clippingRect = wx.Rect(*item.GetRect())
|
|
602
|
+
clippingRect.Deflate(1, 1)
|
|
603
|
+
|
|
604
|
+
dc.SetClippingRegion(clippingRect)
|
|
605
|
+
|
|
606
|
+
if item.GetTextColour().IsOk():
|
|
607
|
+
dc.SetTextForeground(item.GetTextColour())
|
|
608
|
+
else:
|
|
609
|
+
dc.SetTextForeground(standardTextColour)
|
|
610
|
+
|
|
611
|
+
if item.GetFont().IsOk():
|
|
612
|
+
dc.SetFont(item.GetFont())
|
|
613
|
+
else:
|
|
614
|
+
if item.GetIsGroup():
|
|
615
|
+
dc.SetFont(groupFont)
|
|
616
|
+
else:
|
|
617
|
+
dc.SetFont(standardFont)
|
|
618
|
+
|
|
619
|
+
w, h = dc.GetTextExtent(item.GetTitle())
|
|
620
|
+
x = item.GetRect().x
|
|
621
|
+
|
|
622
|
+
x += textMarginX
|
|
623
|
+
|
|
624
|
+
if not item.GetIsGroup():
|
|
625
|
+
if item.GetBitmap().IsOk() and item.GetBitmap().GetWidth() <= 16 \
|
|
626
|
+
and item.GetBitmap().GetHeight() <= 16:
|
|
627
|
+
x -= textMarginX
|
|
628
|
+
dc.DrawBitmap(item.GetBitmap(), x, item.GetRect().y + \
|
|
629
|
+
(item.GetRect().height - item.GetBitmap().GetHeight())//2,
|
|
630
|
+
True)
|
|
631
|
+
x += 16 + textMarginX
|
|
632
|
+
#x += textMarginX
|
|
633
|
+
|
|
634
|
+
y = item.GetRect().y + (item.GetRect().height - h)//2
|
|
635
|
+
dc.DrawText(item.GetTitle(), x, y)
|
|
636
|
+
dc.DestroyClippingRegion()
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def CalculateItemSize(self, dc):
|
|
640
|
+
|
|
641
|
+
# Start off allowing for an icon
|
|
642
|
+
sz = wx.Size(150, 16)
|
|
643
|
+
standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
644
|
+
groupFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
645
|
+
groupFont.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
646
|
+
|
|
647
|
+
textMarginX = SWITCHER_TEXT_MARGIN_X
|
|
648
|
+
textMarginY = SWITCHER_TEXT_MARGIN_Y
|
|
649
|
+
maxWidth = 300
|
|
650
|
+
maxHeight = 40
|
|
651
|
+
|
|
652
|
+
if self.GetItemFont().IsOk():
|
|
653
|
+
standardFont = self.GetItemFont()
|
|
654
|
+
|
|
655
|
+
for item in self._items:
|
|
656
|
+
if item.GetFont().IsOk():
|
|
657
|
+
dc.SetFont(item.GetFont())
|
|
658
|
+
else:
|
|
659
|
+
if item.GetIsGroup():
|
|
660
|
+
dc.SetFont(groupFont)
|
|
661
|
+
else:
|
|
662
|
+
dc.SetFont(standardFont)
|
|
663
|
+
|
|
664
|
+
w, h = dc.GetTextExtent(item.GetTitle())
|
|
665
|
+
w += 16 + 2*textMarginX
|
|
666
|
+
|
|
667
|
+
if w > sz.x:
|
|
668
|
+
sz.x = min(w, maxWidth)
|
|
669
|
+
if h > sz.y:
|
|
670
|
+
sz.y = min(h, maxHeight)
|
|
671
|
+
|
|
672
|
+
if sz == wx.Size(16, 16):
|
|
673
|
+
sz = wx.Size(100, 25)
|
|
674
|
+
else:
|
|
675
|
+
sz.x += textMarginX*2
|
|
676
|
+
sz.y += textMarginY*2
|
|
677
|
+
|
|
678
|
+
return sz
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
def GetIndexForFocus(self):
|
|
682
|
+
|
|
683
|
+
for i, item in enumerate(self._items):
|
|
684
|
+
if item.GetWindow():
|
|
685
|
+
|
|
686
|
+
if FindFocusDescendant(item.GetWindow()):
|
|
687
|
+
return i
|
|
688
|
+
|
|
689
|
+
return wx.NOT_FOUND
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
class MultiColumnListCtrl(wx.Control):
|
|
693
|
+
""" A control for displaying several columns (not scrollable). """
|
|
694
|
+
|
|
695
|
+
def __init__(self, parent, aui_manager, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
696
|
+
style=0, validator=wx.DefaultValidator, name="MultiColumnListCtrl"):
|
|
697
|
+
|
|
698
|
+
wx.Control.__init__(self, parent, id, pos, size, style, validator, name)
|
|
699
|
+
|
|
700
|
+
self._overallSize = wx.Size(200, 100)
|
|
701
|
+
self._modifierKey = wx.WXK_CONTROL
|
|
702
|
+
self._extraNavigationKey = 0
|
|
703
|
+
self._aui_manager = aui_manager
|
|
704
|
+
|
|
705
|
+
self.SetInitialSize(size)
|
|
706
|
+
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
|
|
707
|
+
|
|
708
|
+
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
|
709
|
+
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
|
|
710
|
+
self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouseEvent)
|
|
711
|
+
self.Bind(wx.EVT_CHAR, self.OnChar)
|
|
712
|
+
self.Bind(wx.EVT_KEY_DOWN, self.OnKey)
|
|
713
|
+
self.Bind(wx.EVT_KEY_UP, self.OnKey)
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
def __del__(self):
|
|
717
|
+
|
|
718
|
+
self._aui_manager.HideHint()
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
def DoGetBestSize(self):
|
|
722
|
+
|
|
723
|
+
return self._overallSize
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
def OnEraseBackground(self, event):
|
|
727
|
+
|
|
728
|
+
pass
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
def OnPaint(self, event):
|
|
732
|
+
|
|
733
|
+
dc = wx.AutoBufferedPaintDC(self)
|
|
734
|
+
rect = self.GetClientRect()
|
|
735
|
+
|
|
736
|
+
if self._items.GetColumnCount() == 0:
|
|
737
|
+
self.CalculateLayout(dc)
|
|
738
|
+
|
|
739
|
+
if self._items.GetColumnCount() == 0:
|
|
740
|
+
return
|
|
741
|
+
|
|
742
|
+
self._items.PaintItems(dc, self)
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
def OnMouseEvent(self, event):
|
|
746
|
+
|
|
747
|
+
if event.LeftDown():
|
|
748
|
+
self.SetFocus()
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
def OnChar(self, event):
|
|
752
|
+
|
|
753
|
+
event.Skip()
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
def OnKey(self, event):
|
|
757
|
+
|
|
758
|
+
if event.GetEventType() == wx.wxEVT_KEY_UP:
|
|
759
|
+
if event.GetKeyCode() == self.GetModifierKey():
|
|
760
|
+
topLevel = wx.GetTopLevelParent(self)
|
|
761
|
+
closeEvent = wx.CloseEvent(wx.wxEVT_CLOSE_WINDOW, topLevel.GetId())
|
|
762
|
+
closeEvent.SetEventObject(topLevel)
|
|
763
|
+
closeEvent.SetCanVeto(False)
|
|
764
|
+
|
|
765
|
+
topLevel.GetEventHandler().ProcessEvent(closeEvent)
|
|
766
|
+
return
|
|
767
|
+
|
|
768
|
+
event.Skip()
|
|
769
|
+
return
|
|
770
|
+
|
|
771
|
+
keyCode = event.GetKeyCode()
|
|
772
|
+
|
|
773
|
+
if keyCode in [wx.WXK_ESCAPE, wx.WXK_RETURN]:
|
|
774
|
+
if keyCode == wx.WXK_ESCAPE:
|
|
775
|
+
self._items.SetSelection(-1)
|
|
776
|
+
|
|
777
|
+
topLevel = wx.GetTopLevelParent(self)
|
|
778
|
+
closeEvent = wx.CloseEvent(wx.wxEVT_CLOSE_WINDOW, topLevel.GetId())
|
|
779
|
+
closeEvent.SetEventObject(topLevel)
|
|
780
|
+
closeEvent.SetCanVeto(False)
|
|
781
|
+
|
|
782
|
+
topLevel.GetEventHandler().ProcessEvent(closeEvent)
|
|
783
|
+
return
|
|
784
|
+
|
|
785
|
+
elif keyCode in [wx.WXK_TAB, self.GetExtraNavigationKey()]:
|
|
786
|
+
if event.ShiftDown():
|
|
787
|
+
|
|
788
|
+
self._items.SetSelection(self._items.GetSelection() - 1)
|
|
789
|
+
if self._items.GetSelection() < 0:
|
|
790
|
+
self._items.SetSelection(self._items.GetItemCount() - 1)
|
|
791
|
+
|
|
792
|
+
self.AdvanceToNextSelectableItem(-1)
|
|
793
|
+
|
|
794
|
+
else:
|
|
795
|
+
|
|
796
|
+
self._items.SetSelection(self._items.GetSelection() + 1)
|
|
797
|
+
if self._items.GetSelection() >= self._items.GetItemCount():
|
|
798
|
+
self._items.SetSelection(0)
|
|
799
|
+
|
|
800
|
+
self.AdvanceToNextSelectableItem(1)
|
|
801
|
+
|
|
802
|
+
self.GenerateSelectionEvent()
|
|
803
|
+
self.Refresh()
|
|
804
|
+
|
|
805
|
+
elif keyCode in [wx.WXK_DOWN, wx.WXK_NUMPAD_DOWN]:
|
|
806
|
+
self._items.SetSelection(self._items.GetSelection() + 1)
|
|
807
|
+
if self._items.GetSelection() >= self._items.GetItemCount():
|
|
808
|
+
self._items.SetSelection(0)
|
|
809
|
+
|
|
810
|
+
self.AdvanceToNextSelectableItem(1)
|
|
811
|
+
self.GenerateSelectionEvent()
|
|
812
|
+
self.Refresh()
|
|
813
|
+
|
|
814
|
+
elif keyCode in [wx.WXK_UP, wx.WXK_NUMPAD_UP]:
|
|
815
|
+
self._items.SetSelection(self._items.GetSelection() - 1)
|
|
816
|
+
if self._items.GetSelection() < 0:
|
|
817
|
+
self._items.SetSelection(self._items.GetItemCount() - 1)
|
|
818
|
+
|
|
819
|
+
self.AdvanceToNextSelectableItem(-1)
|
|
820
|
+
self.GenerateSelectionEvent()
|
|
821
|
+
self.Refresh()
|
|
822
|
+
|
|
823
|
+
elif keyCode in [wx.WXK_HOME, wx.WXK_NUMPAD_HOME]:
|
|
824
|
+
self._items.SetSelection(0)
|
|
825
|
+
self.AdvanceToNextSelectableItem(1)
|
|
826
|
+
self.GenerateSelectionEvent()
|
|
827
|
+
self.Refresh()
|
|
828
|
+
|
|
829
|
+
elif keyCode in [wx.WXK_END, wx.WXK_NUMPAD_END]:
|
|
830
|
+
self._items.SetSelection(self._items.GetItemCount() - 1)
|
|
831
|
+
self.AdvanceToNextSelectableItem(-1)
|
|
832
|
+
self.GenerateSelectionEvent()
|
|
833
|
+
self.Refresh()
|
|
834
|
+
|
|
835
|
+
elif keyCode in [wx.WXK_LEFT, wx.WXK_NUMPAD_LEFT]:
|
|
836
|
+
item = self._items.GetItem(self._items.GetSelection())
|
|
837
|
+
|
|
838
|
+
row = item.GetRowPos()
|
|
839
|
+
newCol = item.GetColPos() - 1
|
|
840
|
+
if newCol < 0:
|
|
841
|
+
newCol = self._items.GetColumnCount() - 1
|
|
842
|
+
|
|
843
|
+
# Find the first item from the end whose row matches and whose column is equal or lower
|
|
844
|
+
for i in range(self._items.GetItemCount()-1, -1, -1):
|
|
845
|
+
item2 = self._items.GetItem(i)
|
|
846
|
+
if item2.GetColPos() == newCol and item2.GetRowPos() <= row:
|
|
847
|
+
self._items.SetSelection(i)
|
|
848
|
+
break
|
|
849
|
+
|
|
850
|
+
self.AdvanceToNextSelectableItem(-1)
|
|
851
|
+
self.GenerateSelectionEvent()
|
|
852
|
+
self.Refresh()
|
|
853
|
+
|
|
854
|
+
elif keyCode in [wx.WXK_RIGHT, wx.WXK_NUMPAD_RIGHT]:
|
|
855
|
+
item = self._items.GetItem(self._items.GetSelection())
|
|
856
|
+
|
|
857
|
+
row = item.GetRowPos()
|
|
858
|
+
newCol = item.GetColPos() + 1
|
|
859
|
+
if newCol >= self._items.GetColumnCount():
|
|
860
|
+
newCol = 0
|
|
861
|
+
|
|
862
|
+
# Find the first item from the end whose row matches and whose column is equal or lower
|
|
863
|
+
for i in range(self._items.GetItemCount()-1, -1, -1):
|
|
864
|
+
item2 = self._items.GetItem(i)
|
|
865
|
+
if item2.GetColPos() == newCol and item2.GetRowPos() <= row:
|
|
866
|
+
self._items.SetSelection(i)
|
|
867
|
+
break
|
|
868
|
+
|
|
869
|
+
self.AdvanceToNextSelectableItem(1)
|
|
870
|
+
self.GenerateSelectionEvent()
|
|
871
|
+
self.Refresh()
|
|
872
|
+
|
|
873
|
+
else:
|
|
874
|
+
event.Skip()
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
def AdvanceToNextSelectableItem(self, direction):
|
|
878
|
+
|
|
879
|
+
if self._items.GetItemCount() < 2:
|
|
880
|
+
return
|
|
881
|
+
|
|
882
|
+
if self._items.GetSelection() == -1:
|
|
883
|
+
self._items.SetSelection(0)
|
|
884
|
+
|
|
885
|
+
oldSel = self._items.GetSelection()
|
|
886
|
+
|
|
887
|
+
while 1:
|
|
888
|
+
|
|
889
|
+
if self._items.GetItem(self._items.GetSelection()).GetIsGroup():
|
|
890
|
+
|
|
891
|
+
self._items.SetSelection(self._items.GetSelection() + direction)
|
|
892
|
+
if self._items.GetSelection() == -1:
|
|
893
|
+
self._items.SetSelection(self._items.GetItemCount()-1)
|
|
894
|
+
elif self._items.GetSelection() == self._items.GetItemCount():
|
|
895
|
+
self._items.SetSelection(0)
|
|
896
|
+
if self._items.GetSelection() == oldSel:
|
|
897
|
+
break
|
|
898
|
+
|
|
899
|
+
else:
|
|
900
|
+
break
|
|
901
|
+
|
|
902
|
+
self.SetTransparency()
|
|
903
|
+
selection = self._items.GetItem(self._items.GetSelection()).GetWindow()
|
|
904
|
+
pane = self._aui_manager.GetPane(selection)
|
|
905
|
+
|
|
906
|
+
if not pane.IsOk():
|
|
907
|
+
if isinstance(selection.GetParent(), auibook.AuiNotebook):
|
|
908
|
+
self.SetTransparency(selection)
|
|
909
|
+
self._aui_manager.ShowHint(selection.GetScreenRect())
|
|
910
|
+
wx.CallAfter(self.SetFocus)
|
|
911
|
+
self.SetFocus()
|
|
912
|
+
return
|
|
913
|
+
else:
|
|
914
|
+
self._aui_manager.HideHint()
|
|
915
|
+
return
|
|
916
|
+
if not pane.IsShown():
|
|
917
|
+
self._aui_manager.HideHint()
|
|
918
|
+
return
|
|
919
|
+
|
|
920
|
+
self.SetTransparency(selection)
|
|
921
|
+
self._aui_manager.ShowHint(selection.GetScreenRect())
|
|
922
|
+
# NOTE: this is odd but it is the only way for the focus to
|
|
923
|
+
# work correctly on wxMac...
|
|
924
|
+
wx.CallAfter(self.SetFocus)
|
|
925
|
+
self.SetFocus()
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
def SetTransparency(self, selection=None):
|
|
929
|
+
|
|
930
|
+
if not self.GetParent().CanSetTransparent():
|
|
931
|
+
return
|
|
932
|
+
|
|
933
|
+
if selection is not None:
|
|
934
|
+
intersects = False
|
|
935
|
+
if selection.GetScreenRect().Intersects(self.GetParent().GetScreenRect()):
|
|
936
|
+
intersects = True
|
|
937
|
+
self.GetParent().SetTransparent(200)
|
|
938
|
+
return
|
|
939
|
+
|
|
940
|
+
self.GetParent().SetTransparent(255)
|
|
941
|
+
|
|
942
|
+
|
|
943
|
+
def GenerateSelectionEvent(self):
|
|
944
|
+
|
|
945
|
+
event = wx.CommandEvent(wx.wxEVT_COMMAND_LISTBOX_SELECTED, self.GetId())
|
|
946
|
+
event.SetEventObject(self)
|
|
947
|
+
event.SetInt(self._items.GetSelection())
|
|
948
|
+
self.GetEventHandler().ProcessEvent(event)
|
|
949
|
+
|
|
950
|
+
|
|
951
|
+
def CalculateLayout(self, dc=None):
|
|
952
|
+
|
|
953
|
+
if dc is None:
|
|
954
|
+
dc = wx.ClientDC(self)
|
|
955
|
+
|
|
956
|
+
if self._items.GetSelection() == -1:
|
|
957
|
+
self._items.SetSelection(0)
|
|
958
|
+
|
|
959
|
+
columnCount = 1
|
|
960
|
+
|
|
961
|
+
# Spacing between edge of window or between columns
|
|
962
|
+
xMargin = 4
|
|
963
|
+
yMargin = 4
|
|
964
|
+
|
|
965
|
+
# Inter-row spacing
|
|
966
|
+
rowSpacing = 2
|
|
967
|
+
|
|
968
|
+
itemSize = self._items.CalculateItemSize(dc)
|
|
969
|
+
self._overallSize = wx.Size(350, 200)
|
|
970
|
+
|
|
971
|
+
currentRow = 0
|
|
972
|
+
x = xMargin
|
|
973
|
+
y = yMargin
|
|
974
|
+
|
|
975
|
+
breaking = False
|
|
976
|
+
i = 0
|
|
977
|
+
|
|
978
|
+
while 1:
|
|
979
|
+
|
|
980
|
+
oldOverallSize = self._overallSize
|
|
981
|
+
item = self._items.GetItem(i)
|
|
982
|
+
|
|
983
|
+
item.SetRect(wx.Rect(x, y, itemSize.x, itemSize.y))
|
|
984
|
+
item.SetColPos(columnCount-1)
|
|
985
|
+
item.SetRowPos(currentRow)
|
|
986
|
+
|
|
987
|
+
if item.GetRect().GetBottom() > self._overallSize.y:
|
|
988
|
+
self._overallSize.y = item.GetRect().GetBottom() + yMargin
|
|
989
|
+
|
|
990
|
+
if item.GetRect().GetRight() > self._overallSize.x:
|
|
991
|
+
self._overallSize.x = item.GetRect().GetRight() + xMargin
|
|
992
|
+
|
|
993
|
+
currentRow += 1
|
|
994
|
+
|
|
995
|
+
y += rowSpacing + itemSize.y
|
|
996
|
+
stopBreaking = breaking
|
|
997
|
+
|
|
998
|
+
if currentRow > self._items.GetRowCount() or (item.GetBreakColumn() and not breaking and currentRow != 1):
|
|
999
|
+
currentRow = 0
|
|
1000
|
+
columnCount += 1
|
|
1001
|
+
x += xMargin + itemSize.x
|
|
1002
|
+
y = yMargin
|
|
1003
|
+
|
|
1004
|
+
# Make sure we don't orphan a group
|
|
1005
|
+
if item.GetIsGroup() or (item.GetBreakColumn() and not breaking):
|
|
1006
|
+
self._overallSize = oldOverallSize
|
|
1007
|
+
|
|
1008
|
+
if item.GetBreakColumn():
|
|
1009
|
+
breaking = True
|
|
1010
|
+
|
|
1011
|
+
# Repeat the last item, in the next column
|
|
1012
|
+
i -= 1
|
|
1013
|
+
|
|
1014
|
+
if stopBreaking:
|
|
1015
|
+
breaking = False
|
|
1016
|
+
|
|
1017
|
+
i += 1
|
|
1018
|
+
|
|
1019
|
+
if i >= self._items.GetItemCount():
|
|
1020
|
+
break
|
|
1021
|
+
|
|
1022
|
+
self._items.SetColumnCount(columnCount)
|
|
1023
|
+
self.InvalidateBestSize()
|
|
1024
|
+
|
|
1025
|
+
|
|
1026
|
+
def SetItems(self, items):
|
|
1027
|
+
|
|
1028
|
+
self._items = items
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
def GetItems(self):
|
|
1032
|
+
|
|
1033
|
+
return self._items
|
|
1034
|
+
|
|
1035
|
+
|
|
1036
|
+
def SetExtraNavigationKey(self, keyCode):
|
|
1037
|
+
"""
|
|
1038
|
+
Set an extra key that can be used to cycle through items,
|
|
1039
|
+
in case not using the ``Ctrl`` + ``Tab`` combination.
|
|
1040
|
+
"""
|
|
1041
|
+
|
|
1042
|
+
self._extraNavigationKey = keyCode
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
def GetExtraNavigationKey(self):
|
|
1046
|
+
|
|
1047
|
+
return self._extraNavigationKey
|
|
1048
|
+
|
|
1049
|
+
|
|
1050
|
+
def SetModifierKey(self, modifierKey):
|
|
1051
|
+
"""
|
|
1052
|
+
Set the modifier used to invoke the dialog, and therefore to test for release.
|
|
1053
|
+
"""
|
|
1054
|
+
|
|
1055
|
+
self._modifierKey = modifierKey
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
def GetModifierKey(self):
|
|
1059
|
+
|
|
1060
|
+
return self._modifierKey
|
|
1061
|
+
|
|
1062
|
+
|
|
1063
|
+
|
|
1064
|
+
class SwitcherDialog(wx.Dialog):
|
|
1065
|
+
"""
|
|
1066
|
+
SwitcherDialog shows a :class:`Dialog` with a list of panes and tabs for the user to choose.
|
|
1067
|
+
``Ctrl`` + ``Tab`` cycles through them.
|
|
1068
|
+
"""
|
|
1069
|
+
|
|
1070
|
+
def __init__(self, items, parent, aui_manager, id=wx.ID_ANY, title=_("Pane Switcher"), pos=wx.DefaultPosition,
|
|
1071
|
+
size=wx.DefaultSize, style=wx.STAY_ON_TOP|wx.DIALOG_NO_PARENT|wx.BORDER_SIMPLE):
|
|
1072
|
+
""" Default class constructor. """
|
|
1073
|
+
|
|
1074
|
+
self._switcherBorderStyle = (style & wx.BORDER_MASK)
|
|
1075
|
+
if self._switcherBorderStyle == wx.BORDER_NONE:
|
|
1076
|
+
self._switcherBorderStyle = wx.BORDER_SIMPLE
|
|
1077
|
+
|
|
1078
|
+
style &= wx.BORDER_MASK
|
|
1079
|
+
style |= wx.BORDER_NONE
|
|
1080
|
+
|
|
1081
|
+
wx.Dialog.__init__(self, parent, id, title, pos, size, style)
|
|
1082
|
+
|
|
1083
|
+
self._listCtrl = MultiColumnListCtrl(self, aui_manager,
|
|
1084
|
+
style=wx.WANTS_CHARS|wx.NO_BORDER)
|
|
1085
|
+
self._listCtrl.SetItems(items)
|
|
1086
|
+
self._listCtrl.CalculateLayout()
|
|
1087
|
+
|
|
1088
|
+
self._descriptionCtrl = wx.html.HtmlWindow(self, size=(-1, 100), style=wx.BORDER_NONE)
|
|
1089
|
+
self._descriptionCtrl.SetBackgroundColour(self.GetBackgroundColour())
|
|
1090
|
+
|
|
1091
|
+
if wx.Platform == "__WXGTK__":
|
|
1092
|
+
fontSize = 11
|
|
1093
|
+
self._descriptionCtrl.SetStandardFonts(fontSize)
|
|
1094
|
+
|
|
1095
|
+
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
1096
|
+
self.SetSizer(sizer)
|
|
1097
|
+
sizer.Add(self._listCtrl, 1, wx.ALL|wx.EXPAND, 10)
|
|
1098
|
+
sizer.Add(self._descriptionCtrl, 0, wx.ALL|wx.EXPAND, 10)
|
|
1099
|
+
sizer.SetSizeHints(self)
|
|
1100
|
+
|
|
1101
|
+
self._listCtrl.SetFocus()
|
|
1102
|
+
|
|
1103
|
+
self.Centre(wx.BOTH)
|
|
1104
|
+
|
|
1105
|
+
if self._listCtrl.GetItems().GetSelection() == -1:
|
|
1106
|
+
self._listCtrl.GetItems().SetSelection(0)
|
|
1107
|
+
|
|
1108
|
+
self._listCtrl.AdvanceToNextSelectableItem(1)
|
|
1109
|
+
|
|
1110
|
+
self.ShowDescription(self._listCtrl.GetItems().GetSelection())
|
|
1111
|
+
|
|
1112
|
+
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
|
|
1113
|
+
self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
|
|
1114
|
+
self.Bind(wx.EVT_LISTBOX, self.OnSelectItem)
|
|
1115
|
+
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
|
1116
|
+
|
|
1117
|
+
# Attributes
|
|
1118
|
+
self._closing = False
|
|
1119
|
+
if wx.Platform == "__WXMSW__":
|
|
1120
|
+
self._borderColour = wx.Colour(49, 106, 197)
|
|
1121
|
+
else:
|
|
1122
|
+
self._borderColour = wx.BLACK
|
|
1123
|
+
|
|
1124
|
+
self._aui_manager = aui_manager
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
def OnCloseWindow(self, event):
|
|
1128
|
+
|
|
1129
|
+
if self._closing:
|
|
1130
|
+
return
|
|
1131
|
+
|
|
1132
|
+
if self.IsModal():
|
|
1133
|
+
self._closing = True
|
|
1134
|
+
|
|
1135
|
+
if self.GetSelection() == -1:
|
|
1136
|
+
self.EndModal(wx.ID_CANCEL)
|
|
1137
|
+
else:
|
|
1138
|
+
self.EndModal(wx.ID_OK)
|
|
1139
|
+
|
|
1140
|
+
self._aui_manager.HideHint()
|
|
1141
|
+
|
|
1142
|
+
|
|
1143
|
+
def GetSelection(self):
|
|
1144
|
+
|
|
1145
|
+
return self._listCtrl.GetItems().GetSelection()
|
|
1146
|
+
|
|
1147
|
+
|
|
1148
|
+
def OnActivate(self, event):
|
|
1149
|
+
|
|
1150
|
+
if not event.GetActive():
|
|
1151
|
+
if not self._closing:
|
|
1152
|
+
self._closing = True
|
|
1153
|
+
self.EndModal(wx.ID_CANCEL)
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
def OnPaint(self, event):
|
|
1157
|
+
|
|
1158
|
+
dc = wx.PaintDC(self)
|
|
1159
|
+
|
|
1160
|
+
if self._switcherBorderStyle == wx.BORDER_SIMPLE:
|
|
1161
|
+
|
|
1162
|
+
dc.SetPen(wx.Pen(self._borderColour))
|
|
1163
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
1164
|
+
|
|
1165
|
+
rect = self.GetClientRect()
|
|
1166
|
+
dc.DrawRectangle(rect)
|
|
1167
|
+
|
|
1168
|
+
# Draw border around the HTML control
|
|
1169
|
+
rect = wx.Rect(*self._descriptionCtrl.GetRect())
|
|
1170
|
+
rect.Inflate(1, 1)
|
|
1171
|
+
dc.DrawRectangle(rect)
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
def OnSelectItem(self, event):
|
|
1175
|
+
|
|
1176
|
+
self.ShowDescription(event.GetSelection())
|
|
1177
|
+
|
|
1178
|
+
|
|
1179
|
+
# Convert a colour to a 6-digit hex string
|
|
1180
|
+
def ColourToHexString(self, col):
|
|
1181
|
+
|
|
1182
|
+
hx = '%02x%02x%02x%02x' % tuple([int(c) for c in col])
|
|
1183
|
+
return hx
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
def ShowDescription(self, i):
|
|
1187
|
+
|
|
1188
|
+
item = self._listCtrl.GetItems().GetItem(i)
|
|
1189
|
+
colour = self._listCtrl.GetItems().GetBackgroundColour()
|
|
1190
|
+
|
|
1191
|
+
if not colour.IsOk():
|
|
1192
|
+
colour = self.GetBackgroundColour()
|
|
1193
|
+
|
|
1194
|
+
backgroundColourHex = self.ColourToHexString(colour)
|
|
1195
|
+
html = _("<body bgcolor=\"#") + backgroundColourHex + _("\"><b>") + item.GetTitle() + _("</b>")
|
|
1196
|
+
|
|
1197
|
+
if item.GetDescription():
|
|
1198
|
+
html += _("<p>")
|
|
1199
|
+
html += item.GetDescription()
|
|
1200
|
+
|
|
1201
|
+
html += _("</body>")
|
|
1202
|
+
self._descriptionCtrl.SetPage(html)
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
def SetExtraNavigationKey(self, keyCode):
|
|
1206
|
+
|
|
1207
|
+
self._extraNavigationKey = keyCode
|
|
1208
|
+
if self._listCtrl:
|
|
1209
|
+
self._listCtrl.SetExtraNavigationKey(keyCode)
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
def GetExtraNavigationKey(self):
|
|
1213
|
+
|
|
1214
|
+
return self._extraNavigationKey
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
def SetModifierKey(self, modifierKey):
|
|
1218
|
+
|
|
1219
|
+
self._modifierKey = modifierKey
|
|
1220
|
+
if self._listCtrl:
|
|
1221
|
+
self._listCtrl.SetModifierKey(modifierKey)
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
def GetModifierKey(self):
|
|
1225
|
+
|
|
1226
|
+
return self._modifierKey
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
def SetBorderColour(self, colour):
|
|
1230
|
+
|
|
1231
|
+
self._borderColour = colour
|
|
1232
|
+
|