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,1202 @@
|
|
|
1
|
+
#----------------------------------------------------------------------
|
|
2
|
+
# Name: wx.lib.gizmos.dynamicsash
|
|
3
|
+
# Purpose: A Python port of the C++ wxDynamicSashWindow from the
|
|
4
|
+
# old wxCode library.
|
|
5
|
+
#
|
|
6
|
+
# Author: Robin Dunn
|
|
7
|
+
#
|
|
8
|
+
# Created: 30-Oct-2017
|
|
9
|
+
# Copyright: (c) 2017-2020 by Total Control Software
|
|
10
|
+
# Licence: wxWindows license
|
|
11
|
+
# Tags:
|
|
12
|
+
#----------------------------------------------------------------------
|
|
13
|
+
"""
|
|
14
|
+
A window which can be dynamically split to an arbitrary depth and later
|
|
15
|
+
reunified through the user interface.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import wx
|
|
19
|
+
import wx.siplib
|
|
20
|
+
|
|
21
|
+
#----------------------------------------------------------------------------
|
|
22
|
+
# Styles
|
|
23
|
+
|
|
24
|
+
# DS_MANAGE_SCROLLBARS is a default style of DynamicSashWindow which
|
|
25
|
+
# will cause it to respond to scrollbar events for your application by
|
|
26
|
+
# automatically scrolling the child view.
|
|
27
|
+
DS_MANAGE_SCROLLBARS = 0x0010
|
|
28
|
+
|
|
29
|
+
# DS_DRAG_CORNER style indicates that the views can also be resized by
|
|
30
|
+
# dragging the corner piece between the scrollbars, and which is reflected up
|
|
31
|
+
# to the frame if necessary.
|
|
32
|
+
DS_DRAG_CORNER = 0x0020
|
|
33
|
+
|
|
34
|
+
# Default style
|
|
35
|
+
DS_DEFAULT = DS_MANAGE_SCROLLBARS | DS_DRAG_CORNER
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#----------------------------------------------------------------------------
|
|
39
|
+
# Events
|
|
40
|
+
|
|
41
|
+
wxEVT_DYNAMIC_SASH_SPLIT = wx.NewEventType()
|
|
42
|
+
wxEVT_DYNAMIC_SASH_UNIFY = wx.NewEventType()
|
|
43
|
+
|
|
44
|
+
EVT_DYNAMIC_SASH_SPLIT = wx.PyEventBinder(wxEVT_DYNAMIC_SASH_SPLIT, 1)
|
|
45
|
+
EVT_DYNAMIC_SASH_UNIFY = wx.PyEventBinder(wxEVT_DYNAMIC_SASH_UNIFY, 1)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class DynamicSashSplitEvent(wx.PyCommandEvent):
|
|
50
|
+
"""
|
|
51
|
+
DynamicSashSplitEvents are sent to your view by DynamicSashWindow whenever
|
|
52
|
+
your view is being split by the user. It is your responsibility to handle
|
|
53
|
+
this event by creating a new view window as a child of the
|
|
54
|
+
DynamicSashWindow. DynamicSashWindow will automatically reparent it to
|
|
55
|
+
the proper place in its window hierarchy.
|
|
56
|
+
"""
|
|
57
|
+
def __init__(self, arg=None):
|
|
58
|
+
super(DynamicSashSplitEvent, self).__init__()
|
|
59
|
+
if isinstance(arg, DynamicSashSplitEvent):
|
|
60
|
+
obj = arg.GetEventObject()
|
|
61
|
+
else:
|
|
62
|
+
obj = arg
|
|
63
|
+
self.SetEventObject(obj)
|
|
64
|
+
self.SetEventType(wxEVT_DYNAMIC_SASH_SPLIT)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class DynamicSashUnifyEvent(wx.PyCommandEvent):
|
|
69
|
+
"""
|
|
70
|
+
DynamicSashUnifyEvents are sent to your view by DynamicSashWindow whenever
|
|
71
|
+
the sash which splits your view and its sibling is being reunified such
|
|
72
|
+
that your view is expanding to replace its sibling. You needn't do
|
|
73
|
+
anything with this event if you are allowing DynamicSashWindow to manage
|
|
74
|
+
your view's scrollbars, but it is useful if you are managing the
|
|
75
|
+
scrollbars yourself so that you can keep the scrollbars' event handlers
|
|
76
|
+
connected to your view's event handler class.
|
|
77
|
+
"""
|
|
78
|
+
def __init__(self, arg=None):
|
|
79
|
+
super(DynamicSashUnifyEvent, self).__init__()
|
|
80
|
+
if isinstance(arg, DynamicSashUnifyEvent):
|
|
81
|
+
obj = arg.GetEventObject()
|
|
82
|
+
else:
|
|
83
|
+
obj = arg
|
|
84
|
+
self.SetEventObject(obj)
|
|
85
|
+
self.SetEventType(wxEVT_DYNAMIC_SASH_UNIFY)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
#----------------------------------------------------------------------------
|
|
89
|
+
# The public window class
|
|
90
|
+
|
|
91
|
+
class DynamicSashWindow(wx.Window):
|
|
92
|
+
"""
|
|
93
|
+
A DynamicSashWindow widget manages the way other widgets are viewed. When
|
|
94
|
+
a DynamicSashWindow is first shown, it will contain one child view, a
|
|
95
|
+
viewport for that child, and a pair of scrollbars to allow the user to
|
|
96
|
+
navigate the child view area. Next to each scrollbar is a small tab. By
|
|
97
|
+
clicking on either tab and dragging to the appropriate spot, a user can
|
|
98
|
+
split the view area into two smaller views separated by a draggable sash.
|
|
99
|
+
Later, when the user wishes to reunify the two subviews, the user simply
|
|
100
|
+
drags the sash to the side of the window. DynamicSashWindow will
|
|
101
|
+
automatically reparent the appropriate child view back up the window
|
|
102
|
+
hierarchy, and the DynamicSashWindow will have only one child view once
|
|
103
|
+
again.
|
|
104
|
+
|
|
105
|
+
As an application developer, you will simply create a DynamicSashWindow
|
|
106
|
+
using either the Create() function or the more complex constructor
|
|
107
|
+
provided below, and then create a view window whose parent is the
|
|
108
|
+
DynamicSashWindow. The child should respond to DynamicSashSplitEvents --
|
|
109
|
+
perhaps with an OnSplit() event handler -- by constructing a new view
|
|
110
|
+
window whose parent is also the DynamicSashWindow. That's it! Now your
|
|
111
|
+
users can dynamically split and reunify the view you provided.
|
|
112
|
+
|
|
113
|
+
If you wish to handle the scrollbar events for your view, rather than
|
|
114
|
+
allowing DynamicSashWindow to do it for you, things are a bit more
|
|
115
|
+
complex. (You might want to handle scrollbar events yourself, if, for
|
|
116
|
+
instance, you wish to scroll a subwindow of the view you add to your
|
|
117
|
+
DynamicSashWindow object, rather than scrolling the whole view.) In this
|
|
118
|
+
case, you will need to construct your DynamicSashWindow without the
|
|
119
|
+
wxDS_MANAGE_SCROLLBARS style and you will need to use the GetHScrollBar()
|
|
120
|
+
and GetVScrollBar() methods to retrieve the scrollbar controls and call
|
|
121
|
+
SetEventHandler() on them to redirect the scrolling events whenever your
|
|
122
|
+
window is reparented by wxDyanmicSashWindow. You will need to set the
|
|
123
|
+
scrollbars' event handler at three times:
|
|
124
|
+
|
|
125
|
+
* When your view is created When your view receives a
|
|
126
|
+
* DynamicSashSplitEvent When your view receives a
|
|
127
|
+
* DynamicSashUnifyEvent
|
|
128
|
+
|
|
129
|
+
See the dynsash_switch sample application for an example which does this.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
def __init__(self, *args, **kw):
|
|
133
|
+
"""
|
|
134
|
+
Create a new DynamicSashWindow.
|
|
135
|
+
|
|
136
|
+
Both the normal constructor style with all parameters, or wxWidgets
|
|
137
|
+
2-phase style default constructor is supported. If the default
|
|
138
|
+
constructor is used then the Create method will need to be called
|
|
139
|
+
later before the widget can actually be used.
|
|
140
|
+
"""
|
|
141
|
+
if not args and not kw:
|
|
142
|
+
self._init_default()
|
|
143
|
+
else:
|
|
144
|
+
self._init_full(*args, **kw)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _init_default(self):
|
|
148
|
+
super(DynamicSashWindow, self).__init__()
|
|
149
|
+
self._init()
|
|
150
|
+
|
|
151
|
+
def _init_full(self, parent, id=wx.ID_ANY,
|
|
152
|
+
pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
153
|
+
style=DS_DEFAULT, name='dynamicSashWindow'):
|
|
154
|
+
super(DynamicSashWindow, self).__init__(parent, id, pos, size, style, name=name)
|
|
155
|
+
self._init()
|
|
156
|
+
self._post_create()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def Create(self, parent, id=wx.ID_ANY,
|
|
160
|
+
pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
161
|
+
style=DS_DEFAULT, name='dynamicSashWindow'):
|
|
162
|
+
super(DynamicSashWindow, self).Create(parent, id, pos, size, style, name=name)
|
|
163
|
+
self._post_create()
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def _init(self):
|
|
167
|
+
# set default attributes
|
|
168
|
+
self.m_impl = None
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _post_create(self):
|
|
172
|
+
self.m_impl = _DynamicSashWindowImpl(self)
|
|
173
|
+
if not self.m_impl.Create():
|
|
174
|
+
self.m_impl.Destroy()
|
|
175
|
+
self.m_impl = None
|
|
176
|
+
return False
|
|
177
|
+
return True
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def __dtor__(self):
|
|
181
|
+
# break possible cycles and etc.
|
|
182
|
+
self.SetEventHandler(self)
|
|
183
|
+
self.m_impl.Destroy()
|
|
184
|
+
self.m_impl = None
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def GetHScrollBar(self, child):
|
|
189
|
+
return self.m_impl.FindScrollBar(child, 0)
|
|
190
|
+
|
|
191
|
+
def GetVScrollBar(self, child):
|
|
192
|
+
return self.m_impl.FindScrollBar(child, 1)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def AddChild(self, child):
|
|
196
|
+
super(DynamicSashWindow, self).AddChild(child)
|
|
197
|
+
self.m_impl.AddChild(child)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
#==========================================================================
|
|
202
|
+
# Just internal "implementation details" from here down
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
# DynamicSashWindow works by internally storing a tree of Implementation
|
|
206
|
+
# objects (_DynamicSsahWindowImpl) and Leaf objects (_DynamicSashWindowLeaf).
|
|
207
|
+
# The DynamicSashWindow has a pointer to one implementation, and each
|
|
208
|
+
# implementation either has a pointer to a one leaf (_leaf) or a pointer to
|
|
209
|
+
# two children implementation objects (_child[]). The leaves each are
|
|
210
|
+
# responsible for drawing the frame and decorations around one user-provided
|
|
211
|
+
# views and for responding to mouse and scrollbar events.
|
|
212
|
+
#
|
|
213
|
+
# A resulting tree might look something like this:
|
|
214
|
+
#
|
|
215
|
+
# DynamicSashWindow
|
|
216
|
+
# |
|
|
217
|
+
# +- _DynamicSashWindowImpl
|
|
218
|
+
# |
|
|
219
|
+
# +- _DynamicSashWindowLeaf
|
|
220
|
+
# | |
|
|
221
|
+
# | +- user view window
|
|
222
|
+
# |
|
|
223
|
+
# +- _DynamicSashWindowImpl
|
|
224
|
+
# |
|
|
225
|
+
# +- _DynamicSashWindowLeaf
|
|
226
|
+
# | |
|
|
227
|
+
# | +- user view window
|
|
228
|
+
# |
|
|
229
|
+
# +- _DynamicSashWindowLeaf
|
|
230
|
+
# |
|
|
231
|
+
# +- user view window
|
|
232
|
+
#
|
|
233
|
+
# Each time a split occurs, one of the implementation objects removes its
|
|
234
|
+
# leaf, generates two new implementation object children, each with a new
|
|
235
|
+
# leaf, and reparents the user view which was connected to its old leaf to be
|
|
236
|
+
# one of the new leaf's user view, and sends a Split event to the user view in
|
|
237
|
+
# the hopes that it will generate a new user view for the other new leaf.
|
|
238
|
+
#
|
|
239
|
+
# When a unification occurs, an implementation object is replaced by one of
|
|
240
|
+
# its children, and the tree of its other child is pruned.
|
|
241
|
+
#
|
|
242
|
+
# One quirk is that the top-level implementation object (m_top) always keeps a
|
|
243
|
+
# pointer to the implementation object where a new child is needed.
|
|
244
|
+
# (_add_child_target). This is so that when a new user view is added to the
|
|
245
|
+
# hierarchy, AddChild() is able to reparent the new user view to the correct
|
|
246
|
+
# implementation object's leaf.
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
_wxEVT_DYNAMIC_SASH_REPARENT = wx.NewEventType()
|
|
251
|
+
_EVT_DYNAMIC_SASH_REPARENT = wx.PyEventBinder(_wxEVT_DYNAMIC_SASH_REPARENT, 1)
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
class _DynamicSashReparentEvent(wx.PyEvent):
|
|
255
|
+
def __init__(self, arg=None):
|
|
256
|
+
super(_DynamicSashReparentEvent, self).__init__()
|
|
257
|
+
if isinstance(arg, _DynamicSashReparentEvent):
|
|
258
|
+
obj = arg.GetEventObject()
|
|
259
|
+
else:
|
|
260
|
+
obj = arg
|
|
261
|
+
self.SetEventObject(obj)
|
|
262
|
+
self.SetEventType(_wxEVT_DYNAMIC_SASH_REPARENT)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
# enum DynamicSashRegion
|
|
266
|
+
_DSR_NONE = 0
|
|
267
|
+
_DSR_VERTICAL_TAB = 1
|
|
268
|
+
_DSR_HORIZONTAL_TAB = 2
|
|
269
|
+
_DSR_CORNER = 3
|
|
270
|
+
_DSR_LEFT_EDGE = 4
|
|
271
|
+
_DSR_TOP_EDGE = 5
|
|
272
|
+
_DSR_RIGHT_EDGE = 6
|
|
273
|
+
_DSR_BOTTOM_EDGE = 7
|
|
274
|
+
|
|
275
|
+
_isMac = 'wxMac' in wx.PlatformInfo
|
|
276
|
+
|
|
277
|
+
#----------------------------------------------------------------------------
|
|
278
|
+
|
|
279
|
+
class _DynamicSashWindowImpl(wx.EvtHandler):
|
|
280
|
+
def __init__(self, window):
|
|
281
|
+
super(_DynamicSashWindowImpl, self).__init__()
|
|
282
|
+
self.m_window = window
|
|
283
|
+
self.m_add_child_target = self
|
|
284
|
+
self.m_container = None
|
|
285
|
+
self.m_parent = None
|
|
286
|
+
self.m_top = self
|
|
287
|
+
self.m_child = [None, None]
|
|
288
|
+
self.m_leaf = None
|
|
289
|
+
self.m_dragging = _DSR_NONE
|
|
290
|
+
self.m_split = _DSR_NONE
|
|
291
|
+
self.m_drag_x = -1
|
|
292
|
+
self.m_drag_y = -1
|
|
293
|
+
if _isMac:
|
|
294
|
+
self.m_overlay = wx.Overlay()
|
|
295
|
+
self.DrawSash = self.DrawSash_overlay
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def __dtor__(self):
|
|
299
|
+
# break possible cycles and other cleanup
|
|
300
|
+
if self.m_leaf:
|
|
301
|
+
self.m_leaf.Destroy()
|
|
302
|
+
self.m_leaf = None
|
|
303
|
+
if self.m_child[0]:
|
|
304
|
+
self.m_child[0].Destroy()
|
|
305
|
+
self.m_child[0] = None
|
|
306
|
+
if self.m_child[1]:
|
|
307
|
+
self.m_child[1].Destroy()
|
|
308
|
+
self.m_child[1] = None
|
|
309
|
+
|
|
310
|
+
if self.m_container != self.m_window and self.m_container:
|
|
311
|
+
self.m_container.SetEventHandler(self.m_container)
|
|
312
|
+
self.m_container.Destroy()
|
|
313
|
+
|
|
314
|
+
self.m_add_child_target = None
|
|
315
|
+
self.m_top = None
|
|
316
|
+
self.m_window = None
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def Create(self):
|
|
320
|
+
if not self.m_container:
|
|
321
|
+
self.m_container = self.m_window
|
|
322
|
+
|
|
323
|
+
self.m_container.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
|
|
324
|
+
|
|
325
|
+
self.m_leaf = _DynamicSashWindowLeaf(self)
|
|
326
|
+
if not self.m_leaf.Create():
|
|
327
|
+
self.m_leaf.Destroy()
|
|
328
|
+
self.m_leaf = None
|
|
329
|
+
return False
|
|
330
|
+
|
|
331
|
+
self.m_container.SetEventHandler(self)
|
|
332
|
+
|
|
333
|
+
self.Bind(wx.EVT_SIZE, self.OnSize)
|
|
334
|
+
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
|
335
|
+
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
|
|
336
|
+
self.Bind(wx.EVT_ENTER_WINDOW, self.OnMouseMove)
|
|
337
|
+
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)
|
|
338
|
+
self.Bind(wx.EVT_LEFT_DOWN, self.OnPress)
|
|
339
|
+
self.Bind(wx.EVT_LEFT_UP, self.OnRelease)
|
|
340
|
+
|
|
341
|
+
return True
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
def AddChild(self, window):
|
|
345
|
+
if self.m_add_child_target and self.m_add_child_target.m_leaf:
|
|
346
|
+
self.m_add_child_target.m_leaf.AddChild(window)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def DrawSash_overlay(self, x, y, mode):
|
|
350
|
+
if mode in ['press', 'move--']:
|
|
351
|
+
# these are not needed for this implementation
|
|
352
|
+
return
|
|
353
|
+
|
|
354
|
+
if mode == 'release':
|
|
355
|
+
dc = wx.ClientDC(self.m_container)
|
|
356
|
+
odc = wx.DCOverlay(self.m_overlay, dc)
|
|
357
|
+
odc.Clear()
|
|
358
|
+
del odc
|
|
359
|
+
self.m_overlay.Reset()
|
|
360
|
+
|
|
361
|
+
if mode == 'move':
|
|
362
|
+
dc = wx.ClientDC(self.m_container)
|
|
363
|
+
odc = wx.DCOverlay(self.m_overlay, dc)
|
|
364
|
+
odc.Clear()
|
|
365
|
+
|
|
366
|
+
penclr = wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DDKSHADOW)
|
|
367
|
+
dc.SetPen(wx.Pen(penclr, 1))
|
|
368
|
+
bshclr = penclr.Get(False) + (0x80,)
|
|
369
|
+
bshclr = wx.Colour(*bshclr)
|
|
370
|
+
dc.SetBrush(wx.Brush(bshclr))
|
|
371
|
+
|
|
372
|
+
self._doDrawSash(dc, x, y, False)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def DrawSash(self, x, y, mode):
|
|
376
|
+
dc = wx.ScreenDC()
|
|
377
|
+
dc.StartDrawingOnTop(self.m_container)
|
|
378
|
+
|
|
379
|
+
bmp = wx.Bitmap(8, 8)
|
|
380
|
+
bdc = wx.MemoryDC(bmp)
|
|
381
|
+
bdc.DrawRectangle(-1, -1, 10, 10)
|
|
382
|
+
for i in range(8):
|
|
383
|
+
for j in range(8):
|
|
384
|
+
if (i + j) & 1:
|
|
385
|
+
bdc.DrawPoint(i, j)
|
|
386
|
+
bdc.SelectObject(wx.NullBitmap)
|
|
387
|
+
|
|
388
|
+
brush = wx.Brush(bmp)
|
|
389
|
+
dc.SetBrush(brush)
|
|
390
|
+
dc.SetLogicalFunction(wx.XOR)
|
|
391
|
+
|
|
392
|
+
self._doDrawSash(dc, x, y, True)
|
|
393
|
+
|
|
394
|
+
dc.EndDrawingOnTop()
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
def _doDrawSash(self, dc, x, y, useScreenCoords):
|
|
398
|
+
if (self.m_dragging == _DSR_CORNER
|
|
399
|
+
and (self.m_window.GetWindowStyle() & DS_DRAG_CORNER) != 0):
|
|
400
|
+
|
|
401
|
+
cx = cy = 0
|
|
402
|
+
if useScreenCoords:
|
|
403
|
+
cx, cy = self.m_container.ClientToScreen((cx, cy))
|
|
404
|
+
x, y = self.m_container.ClientToScreen((x, y))
|
|
405
|
+
|
|
406
|
+
if cx < x and cy < y:
|
|
407
|
+
dc.DrawRectangle(cx - 2, cy - 2, x - cx + 4, 4)
|
|
408
|
+
dc.DrawRectangle(x - 2, cy + 2, 4, y - cy)
|
|
409
|
+
dc.DrawRectangle(cx - 2, cy + 2, 4, y - cy)
|
|
410
|
+
dc.DrawRectangle(cx + 2, y - 2, x - cx - 4, 4)
|
|
411
|
+
|
|
412
|
+
else:
|
|
413
|
+
body_w, body_h = self.m_container.GetClientSize()
|
|
414
|
+
|
|
415
|
+
if y < 0:
|
|
416
|
+
y = 0
|
|
417
|
+
if y > body_h:
|
|
418
|
+
y = body_h
|
|
419
|
+
if x < 0:
|
|
420
|
+
x = 0
|
|
421
|
+
if x > body_w:
|
|
422
|
+
x = body_w
|
|
423
|
+
|
|
424
|
+
if self.m_dragging == _DSR_HORIZONTAL_TAB:
|
|
425
|
+
x = 0
|
|
426
|
+
else:
|
|
427
|
+
y = 0
|
|
428
|
+
|
|
429
|
+
if useScreenCoords:
|
|
430
|
+
x, y = self.m_container.ClientToScreen(x, y)
|
|
431
|
+
|
|
432
|
+
w = body_w
|
|
433
|
+
h = body_h
|
|
434
|
+
|
|
435
|
+
if self.m_dragging == _DSR_HORIZONTAL_TAB:
|
|
436
|
+
dc.DrawRectangle(x, y - 2, w, 4)
|
|
437
|
+
else:
|
|
438
|
+
dc.DrawRectangle(x - 2, y, 4, h)
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
def ConstrainChildren(self, px, py):
|
|
442
|
+
layout = wx.LayoutConstraints()
|
|
443
|
+
layout.left.SameAs(self.m_container, wx.Left)
|
|
444
|
+
layout.top.SameAs(self.m_container, wx.Top)
|
|
445
|
+
|
|
446
|
+
if self.m_split == _DSR_HORIZONTAL_TAB:
|
|
447
|
+
layout.right.SameAs(self.m_container, wx.Right)
|
|
448
|
+
layout.height.PercentOf(self.m_container, wx.Height, py)
|
|
449
|
+
else:
|
|
450
|
+
layout.bottom.SameAs(self.m_container, wx.Bottom)
|
|
451
|
+
layout.width.PercentOf(self.m_container, wx.Width, px)
|
|
452
|
+
|
|
453
|
+
self.m_child[0].m_container.SetConstraints(layout)
|
|
454
|
+
|
|
455
|
+
layout = wx.LayoutConstraints()
|
|
456
|
+
layout.right.SameAs(self.m_container, wx.Right)
|
|
457
|
+
layout.bottom.SameAs(self.m_container, wx.Bottom)
|
|
458
|
+
|
|
459
|
+
if self.m_split == _DSR_HORIZONTAL_TAB:
|
|
460
|
+
layout.top.Below(self.m_child[0].m_container, 1)
|
|
461
|
+
layout.left.SameAs(self.m_container, wx.Left)
|
|
462
|
+
else:
|
|
463
|
+
layout.left.RightOf(self.m_child[0].m_container, 1)
|
|
464
|
+
layout.top.SameAs(self.m_container, wx.Top)
|
|
465
|
+
|
|
466
|
+
self.m_child[1].m_container.SetConstraints(layout)
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
def Split(self, px, py):
|
|
470
|
+
self.m_add_child_target = None
|
|
471
|
+
|
|
472
|
+
self.m_child[0] = _DynamicSashWindowImpl(self.m_window)
|
|
473
|
+
self.m_child[0].m_container = wx.Window(self.m_container)
|
|
474
|
+
self.m_child[0].m_parent = self
|
|
475
|
+
self.m_child[0].m_top = self.m_top
|
|
476
|
+
self.m_child[0].Create()
|
|
477
|
+
if self.m_leaf.m_child:
|
|
478
|
+
self.m_leaf.m_child.Reparent(self.m_container)
|
|
479
|
+
self.m_child[0].AddChild(self.m_leaf.m_child)
|
|
480
|
+
|
|
481
|
+
self.m_child[1] = _DynamicSashWindowImpl(self.m_window)
|
|
482
|
+
self.m_child[1].m_container = wx.Window(self.m_container)
|
|
483
|
+
self.m_child[1].m_parent = self
|
|
484
|
+
self.m_child[1].m_top = self.m_top
|
|
485
|
+
self.m_child[1].Create()
|
|
486
|
+
|
|
487
|
+
self.m_split = self.m_dragging
|
|
488
|
+
self.ConstrainChildren(px, py)
|
|
489
|
+
|
|
490
|
+
self.m_top.m_add_child_target = self.m_child[1]
|
|
491
|
+
split = DynamicSashSplitEvent(self.m_child[0].m_leaf.m_child)
|
|
492
|
+
self.m_child[0].m_leaf._checkPendingChild()
|
|
493
|
+
self.m_child[0].m_leaf.m_child.GetEventHandler().ProcessEvent(split)
|
|
494
|
+
|
|
495
|
+
self.m_child[0].m_leaf.m_vscroll.SetScrollbar(self.m_leaf.m_vscroll.GetThumbPosition(),
|
|
496
|
+
self.m_leaf.m_vscroll.GetThumbSize(),
|
|
497
|
+
self.m_leaf.m_vscroll.GetRange(),
|
|
498
|
+
self.m_leaf.m_vscroll.GetPageSize())
|
|
499
|
+
self.m_child[0].m_leaf.m_hscroll.SetScrollbar(self.m_leaf.m_hscroll.GetThumbPosition(),
|
|
500
|
+
self.m_leaf.m_hscroll.GetThumbSize(),
|
|
501
|
+
self.m_leaf.m_hscroll.GetRange(),
|
|
502
|
+
self.m_leaf.m_hscroll.GetPageSize())
|
|
503
|
+
self.m_child[1].m_leaf.m_vscroll.SetScrollbar(self.m_leaf.m_vscroll.GetThumbPosition(),
|
|
504
|
+
self.m_leaf.m_vscroll.GetThumbSize(),
|
|
505
|
+
self.m_leaf.m_vscroll.GetRange(),
|
|
506
|
+
self.m_leaf.m_vscroll.GetPageSize())
|
|
507
|
+
self.m_child[1].m_leaf.m_hscroll.SetScrollbar(self.m_leaf.m_hscroll.GetThumbPosition(),
|
|
508
|
+
self.m_leaf.m_hscroll.GetThumbSize(),
|
|
509
|
+
self.m_leaf.m_hscroll.GetRange(),
|
|
510
|
+
self.m_leaf.m_hscroll.GetPageSize())
|
|
511
|
+
self.m_leaf.Destroy()
|
|
512
|
+
self.m_leaf = None
|
|
513
|
+
|
|
514
|
+
self.m_container.Layout()
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def Unify(self, panel):
|
|
518
|
+
other = 1 if panel == 0 else 0
|
|
519
|
+
|
|
520
|
+
if self.m_child[panel].m_leaf:
|
|
521
|
+
child = self.m_child[:]
|
|
522
|
+
|
|
523
|
+
self.m_child[0] = self.m_child[1] = None
|
|
524
|
+
|
|
525
|
+
self.m_leaf = _DynamicSashWindowLeaf(self)
|
|
526
|
+
self.m_leaf.Create()
|
|
527
|
+
self.m_leaf.m_child = child[panel].m_leaf.m_child
|
|
528
|
+
|
|
529
|
+
self.m_leaf.m_vscroll.SetScrollbar(child[panel].m_leaf.m_vscroll.GetThumbPosition(),
|
|
530
|
+
child[panel].m_leaf.m_vscroll.GetThumbSize(),
|
|
531
|
+
child[panel].m_leaf.m_vscroll.GetRange(),
|
|
532
|
+
child[panel].m_leaf.m_vscroll.GetPageSize())
|
|
533
|
+
self.m_leaf.m_hscroll.SetScrollbar(child[panel].m_leaf.m_hscroll.GetThumbPosition(),
|
|
534
|
+
child[panel].m_leaf.m_hscroll.GetThumbSize(),
|
|
535
|
+
child[panel].m_leaf.m_hscroll.GetRange(),
|
|
536
|
+
child[panel].m_leaf.m_hscroll.GetPageSize())
|
|
537
|
+
self.m_add_child_target = None
|
|
538
|
+
|
|
539
|
+
event = _DynamicSashReparentEvent(self.m_leaf)
|
|
540
|
+
self.m_leaf.ProcessEvent(event)
|
|
541
|
+
|
|
542
|
+
for i in range(2):
|
|
543
|
+
child[i].Destroy()
|
|
544
|
+
|
|
545
|
+
self.m_split = _DSR_NONE
|
|
546
|
+
|
|
547
|
+
unify = DynamicSashUnifyEvent(self.m_leaf.m_child)
|
|
548
|
+
self.m_leaf.m_child.GetEventHandler().ProcessEvent(unify)
|
|
549
|
+
|
|
550
|
+
else:
|
|
551
|
+
self.m_split = self.m_child[panel].m_split
|
|
552
|
+
|
|
553
|
+
self.m_child[other].Destroy()
|
|
554
|
+
|
|
555
|
+
child_panel = self.m_child[panel]
|
|
556
|
+
self.m_child[0] = child_panel.m_child[0]
|
|
557
|
+
self.m_child[1] = child_panel.m_child[1]
|
|
558
|
+
|
|
559
|
+
self.m_child[0].m_parent = self
|
|
560
|
+
self.m_child[1].m_parent = self
|
|
561
|
+
|
|
562
|
+
self.m_add_child_target = None
|
|
563
|
+
self.m_child[0].m_container.Reparent(self.m_container)
|
|
564
|
+
self.m_child[1].m_container.Reparent(self.m_container)
|
|
565
|
+
|
|
566
|
+
child_panel.m_child[0] = child_panel.m_child[1] = None
|
|
567
|
+
child_panel.Destroy()
|
|
568
|
+
|
|
569
|
+
size = self.m_container.GetSize()
|
|
570
|
+
child_size = self.m_child[0].m_container.GetSize()
|
|
571
|
+
|
|
572
|
+
self.ConstrainChildren(child_size.GetWidth() * 100.0 / size.GetWidth(),
|
|
573
|
+
child_size.GetHeight() * 100.0 / size.GetHeight())
|
|
574
|
+
|
|
575
|
+
self.m_container.Layout()
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
def Resize(self, x, y):
|
|
579
|
+
h_parent = self.FindParent(_DSR_BOTTOM_EDGE)
|
|
580
|
+
v_parent = self.FindParent(_DSR_RIGHT_EDGE)
|
|
581
|
+
h_unify = -1
|
|
582
|
+
v_unify = -1
|
|
583
|
+
frame = self.FindFrame()
|
|
584
|
+
|
|
585
|
+
if x < 0:
|
|
586
|
+
x = 0
|
|
587
|
+
if y < 0:
|
|
588
|
+
y = 0
|
|
589
|
+
|
|
590
|
+
if h_parent:
|
|
591
|
+
_, y = self.m_container.ClientToScreen(0, y)
|
|
592
|
+
_, y = h_parent.m_container.ScreenToClient(0, y)
|
|
593
|
+
|
|
594
|
+
py = int((y * 100.0) / h_parent.m_container.GetSize().GetHeight() + 0.5)
|
|
595
|
+
|
|
596
|
+
if py < 10:
|
|
597
|
+
ho_parent = self.FindParent(_DSR_TOP_EDGE)
|
|
598
|
+
if ho_parent:
|
|
599
|
+
if self.FindUpperParent(h_parent, ho_parent) == ho_parent:
|
|
600
|
+
h_unify = 1
|
|
601
|
+
|
|
602
|
+
else:
|
|
603
|
+
py = int((ho_parent.m_child[0].m_container.GetSize().GetHeight() * 100.0)
|
|
604
|
+
/ h_parent.m_container.GetSize().GetHeight() + 0.5)
|
|
605
|
+
h_parent.m_child[0].m_container.GetConstraints().height.PercentOf(
|
|
606
|
+
h_parent.m_container, wx.Height, py)
|
|
607
|
+
|
|
608
|
+
h_parent = ho_parent
|
|
609
|
+
h_unify = 0
|
|
610
|
+
else:
|
|
611
|
+
h_unify = 1
|
|
612
|
+
|
|
613
|
+
elif py > 90:
|
|
614
|
+
h_unify = 0
|
|
615
|
+
else:
|
|
616
|
+
h_parent.m_child[0].m_container.GetConstraints().height.PercentOf(
|
|
617
|
+
h_parent.m_container, wx.Height, py)
|
|
618
|
+
h_parent.m_container.Layout()
|
|
619
|
+
else:
|
|
620
|
+
do_resize = 1
|
|
621
|
+
h_parent = self.FindParent(_DSR_TOP_EDGE)
|
|
622
|
+
if h_parent:
|
|
623
|
+
py = int((y * 100.0) /
|
|
624
|
+
(h_parent.m_container.GetSize().GetHeight() +
|
|
625
|
+
y - self.m_container.GetSize().GetHeight()) + 0.5)
|
|
626
|
+
|
|
627
|
+
if py < 10:
|
|
628
|
+
h_unify = 0
|
|
629
|
+
elif y < 64:
|
|
630
|
+
do_resize = 0
|
|
631
|
+
|
|
632
|
+
if do_resize:
|
|
633
|
+
size = frame.GetSize()
|
|
634
|
+
frame.SetSize(size.GetWidth(), size.GetHeight() + y - self.m_container.GetSize().GetHeight())
|
|
635
|
+
|
|
636
|
+
if v_parent:
|
|
637
|
+
x, _ = self.m_container.ClientToScreen(x, 0)
|
|
638
|
+
x, _ = v_parent.m_container.ScreenToClient(x, 0)
|
|
639
|
+
|
|
640
|
+
px = int((x * 100.0) / v_parent.m_container.GetSize().GetWidth() + 0.5)
|
|
641
|
+
|
|
642
|
+
if px < 10:
|
|
643
|
+
vo_parent = self.FindParent(_DSR_LEFT_EDGE)
|
|
644
|
+
if vo_parent:
|
|
645
|
+
if self.FindUpperParent(v_parent, vo_parent) == vo_parent:
|
|
646
|
+
v_unify = 1
|
|
647
|
+
else:
|
|
648
|
+
px = int((vo_parent.m_child[0].m_container.GetSize().GetWidth() * 100.0)
|
|
649
|
+
/ v_parent.m_container.GetSize().GetWidth() + 0.5)
|
|
650
|
+
v_parent.m_child[0].m_container.GetConstraints().width.PercentOf(
|
|
651
|
+
v_parent.m_container, wx.Width, px)
|
|
652
|
+
|
|
653
|
+
v_parent = vo_parent
|
|
654
|
+
v_unify = 0
|
|
655
|
+
else:
|
|
656
|
+
v_unify = 1
|
|
657
|
+
|
|
658
|
+
elif px > 90:
|
|
659
|
+
v_unify = 0
|
|
660
|
+
else:
|
|
661
|
+
v_parent.m_child[0].m_container.GetConstraints().width.PercentOf(
|
|
662
|
+
v_parent.m_container, wx.Width, px)
|
|
663
|
+
v_parent.m_container.Layout()
|
|
664
|
+
else:
|
|
665
|
+
do_resize = 1
|
|
666
|
+
v_parent = self.FindParent(_DSR_LEFT_EDGE)
|
|
667
|
+
if v_parent:
|
|
668
|
+
px = int((x * 100.0) /
|
|
669
|
+
(v_parent.m_container.GetSize().GetWidth() +
|
|
670
|
+
x - self.m_container.GetSize().GetWidth()) + 0.5)
|
|
671
|
+
|
|
672
|
+
if px < 10:
|
|
673
|
+
v_unify = 0
|
|
674
|
+
elif x < 64:
|
|
675
|
+
do_resize = 0
|
|
676
|
+
|
|
677
|
+
if do_resize:
|
|
678
|
+
size = frame.GetSize()
|
|
679
|
+
frame.SetSize(size.GetWidth() + x - self.m_container.GetSize().GetWidth(), size.GetHeight())
|
|
680
|
+
|
|
681
|
+
if h_unify != -1 and v_unify != -1:
|
|
682
|
+
parent = self.FindUpperParent(h_parent, v_parent)
|
|
683
|
+
if parent == h_parent:
|
|
684
|
+
h_parent.Unify(h_unify)
|
|
685
|
+
else:
|
|
686
|
+
v_parent.Unify(v_unify)
|
|
687
|
+
|
|
688
|
+
elif h_unify != -1:
|
|
689
|
+
h_parent.Unify(h_unify)
|
|
690
|
+
|
|
691
|
+
elif v_unify != -1:
|
|
692
|
+
v_parent.Unify(v_unify)
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
def FindParent(self, side):
|
|
696
|
+
if self.m_parent is None:
|
|
697
|
+
return None
|
|
698
|
+
|
|
699
|
+
if self.m_parent.m_split == _DSR_HORIZONTAL_TAB:
|
|
700
|
+
if side == _DSR_TOP_EDGE and self.m_parent.m_child[1] == self:
|
|
701
|
+
return self.m_parent
|
|
702
|
+
if side == _DSR_BOTTOM_EDGE and self.m_parent.m_child[0] == self:
|
|
703
|
+
return self.m_parent
|
|
704
|
+
|
|
705
|
+
elif self.m_parent.m_split == _DSR_VERTICAL_TAB:
|
|
706
|
+
if side == _DSR_LEFT_EDGE and self.m_parent.m_child[1] == self:
|
|
707
|
+
return self.m_parent
|
|
708
|
+
if side == _DSR_RIGHT_EDGE and self.m_parent.m_child[0] == self:
|
|
709
|
+
return self.m_parent
|
|
710
|
+
|
|
711
|
+
return self.m_parent.FindParent(side)
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
def FindUpperParent(self, sash_a, sash_b):
|
|
715
|
+
win = sash_a.m_container.GetParent()
|
|
716
|
+
while win and not win.IsTopLevel():
|
|
717
|
+
if win == sash_b.m_container:
|
|
718
|
+
return sash_b
|
|
719
|
+
win = win.GetParent()
|
|
720
|
+
return sash_a
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
def FindFrame(self):
|
|
724
|
+
win = self.m_window.GetParent()
|
|
725
|
+
while win and not win.IsTopLevel():
|
|
726
|
+
win = win.GetParent()
|
|
727
|
+
return win
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
def FindScrollBar(self, child, vert):
|
|
731
|
+
if self.m_child[0] is None and self.m_leaf is None:
|
|
732
|
+
return None
|
|
733
|
+
|
|
734
|
+
if not self.m_child[0]:
|
|
735
|
+
return self.m_leaf.FindScrollBar(child, vert)
|
|
736
|
+
|
|
737
|
+
ret = self.m_child[0].FindScrollBar(child, vert)
|
|
738
|
+
if not ret:
|
|
739
|
+
ret = self.m_child[1].FindScrollBar(child, vert)
|
|
740
|
+
|
|
741
|
+
return ret
|
|
742
|
+
|
|
743
|
+
|
|
744
|
+
def OnSize(self, event):
|
|
745
|
+
self.m_container.Layout()
|
|
746
|
+
if self.m_leaf:
|
|
747
|
+
self.m_leaf.OnSize(event)
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
def OnPaint(self, event):
|
|
751
|
+
if self.m_leaf:
|
|
752
|
+
self.m_leaf.OnPaint(event)
|
|
753
|
+
else:
|
|
754
|
+
dc = wx.PaintDC(self.m_container)
|
|
755
|
+
dc.SetBackground(wx.Brush(self.m_container.GetBackgroundColour(), wx.SOLID))
|
|
756
|
+
dc.Clear()
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
def OnMouseMove(self, event):
|
|
760
|
+
if self.m_dragging:
|
|
761
|
+
self.DrawSash(self.m_drag_x, self.m_drag_y, "move--")
|
|
762
|
+
self.m_drag_x = event.x
|
|
763
|
+
self.m_drag_y = event.y
|
|
764
|
+
self.DrawSash(self.m_drag_x, self.m_drag_y, "move")
|
|
765
|
+
elif self.m_leaf:
|
|
766
|
+
self.m_leaf.OnMouseMove(event)
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
def OnLeave(self, event):
|
|
770
|
+
if self.m_leaf:
|
|
771
|
+
self.m_leaf.OnLeave(event)
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
def OnPress(self, event):
|
|
775
|
+
if self.m_leaf:
|
|
776
|
+
self.m_leaf.OnPress(event)
|
|
777
|
+
else:
|
|
778
|
+
self.m_dragging = self.m_split
|
|
779
|
+
self.m_drag_x = event.x
|
|
780
|
+
self.m_drag_y = event.y
|
|
781
|
+
self.DrawSash(self.m_drag_x, self.m_drag_y, "press")
|
|
782
|
+
self.m_container.CaptureMouse()
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
def OnRelease(self, event):
|
|
786
|
+
if ((self.m_dragging == _DSR_CORNER) and
|
|
787
|
+
(self.m_window.GetWindowStyle() & DS_DRAG_CORNER) != 0):
|
|
788
|
+
|
|
789
|
+
self.DrawSash(self.m_drag_x, self.m_drag_y, "release")
|
|
790
|
+
self.m_container.ReleaseMouse()
|
|
791
|
+
|
|
792
|
+
self.Resize(event.x, event.y)
|
|
793
|
+
|
|
794
|
+
self.m_dragging = _DSR_NONE
|
|
795
|
+
|
|
796
|
+
elif self.m_dragging:
|
|
797
|
+
self.DrawSash(self.m_drag_x, self.m_drag_y, "release")
|
|
798
|
+
self.m_container.ReleaseMouse()
|
|
799
|
+
|
|
800
|
+
size = self.m_container.GetSize()
|
|
801
|
+
px = int((event.x * 100.0) / size.GetWidth() + 0.5)
|
|
802
|
+
py = int((event.y * 100.0) / size.GetHeight() + 0.5)
|
|
803
|
+
|
|
804
|
+
if ((self.m_dragging == _DSR_HORIZONTAL_TAB and py >= 10 and py <= 90)
|
|
805
|
+
or (self.m_dragging == _DSR_VERTICAL_TAB and px >= 10 and px <= 90)):
|
|
806
|
+
if self.m_child[0] is None:
|
|
807
|
+
self.Split(px, py)
|
|
808
|
+
else:
|
|
809
|
+
# It would be nice if moving *this* sash didn't implicitly move
|
|
810
|
+
# the sashes of our children (if any). But this will do.
|
|
811
|
+
layout = self.m_child[0].m_container.GetConstraints()
|
|
812
|
+
if self.m_split == _DSR_HORIZONTAL_TAB:
|
|
813
|
+
layout.height.PercentOf(self.m_container, wx.Height, py)
|
|
814
|
+
else:
|
|
815
|
+
layout.width.PercentOf(self.m_container, wx.Width, px)
|
|
816
|
+
self.m_container.Layout()
|
|
817
|
+
else:
|
|
818
|
+
if self.m_child[0] is not None:
|
|
819
|
+
if ((self.m_dragging == _DSR_HORIZONTAL_TAB and py <= 10)
|
|
820
|
+
or (self.m_dragging == _DSR_VERTICAL_TAB and px <= 10)):
|
|
821
|
+
self.Unify(1)
|
|
822
|
+
else:
|
|
823
|
+
self.Unify(0)
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
if self.m_split == _DSR_HORIZONTAL_TAB:
|
|
827
|
+
cursor = wx.Cursor(wx.CURSOR_SIZENS)
|
|
828
|
+
elif self.m_split == _DSR_VERTICAL_TAB:
|
|
829
|
+
cursor = wx.Cursor(wx.CURSOR_SIZEWE)
|
|
830
|
+
else:
|
|
831
|
+
cursor = wx.Cursor(wx.CURSOR_ARROW)
|
|
832
|
+
self.m_container.SetCursor(cursor)
|
|
833
|
+
|
|
834
|
+
self.m_dragging = _DSR_NONE
|
|
835
|
+
|
|
836
|
+
elif self.m_leaf:
|
|
837
|
+
self.m_leaf.OnRelease(event)
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
|
|
841
|
+
#----------------------------------------------------------------------------
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
class _DynamicSashWindowLeaf(wx.EvtHandler):
|
|
845
|
+
def __init__(self, impl):
|
|
846
|
+
super(_DynamicSashWindowLeaf, self).__init__()
|
|
847
|
+
self.m_impl = impl
|
|
848
|
+
self.m_hscroll = None
|
|
849
|
+
self.m_vscroll = None
|
|
850
|
+
self.m_child = None
|
|
851
|
+
self.m_viewport = None
|
|
852
|
+
|
|
853
|
+
|
|
854
|
+
def __dtor__(self):
|
|
855
|
+
if self.m_hscroll:
|
|
856
|
+
self.m_hscroll.SetEventHandler(self.m_hscroll)
|
|
857
|
+
self.m_hscroll.Destroy()
|
|
858
|
+
if self.m_vscroll:
|
|
859
|
+
self.m_vscroll.SetEventHandler(self.m_vscroll)
|
|
860
|
+
self.m_vscroll.Destroy()
|
|
861
|
+
if self.m_viewport:
|
|
862
|
+
self.m_viewport.Destroy()
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
def Create(self):
|
|
866
|
+
self.m_hscroll = wx.ScrollBar()
|
|
867
|
+
self.m_vscroll = wx.ScrollBar()
|
|
868
|
+
self.m_viewport = wx.Window()
|
|
869
|
+
|
|
870
|
+
add_child_target = self.m_impl.m_add_child_target
|
|
871
|
+
self.m_impl.m_add_child_target = None
|
|
872
|
+
|
|
873
|
+
success = self.m_hscroll.Create(self.m_impl.m_container, style=wx.SB_HORIZONTAL)
|
|
874
|
+
if success:
|
|
875
|
+
success = self.m_vscroll.Create(self.m_impl.m_container, style=wx.SB_VERTICAL)
|
|
876
|
+
if success:
|
|
877
|
+
success = self.m_viewport.Create(self.m_impl.m_container)
|
|
878
|
+
|
|
879
|
+
if not success:
|
|
880
|
+
return False
|
|
881
|
+
|
|
882
|
+
self.m_impl.m_add_child_target = add_child_target
|
|
883
|
+
|
|
884
|
+
cursor = wx.Cursor(wx.CURSOR_ARROW)
|
|
885
|
+
self.m_hscroll.SetCursor(cursor)
|
|
886
|
+
self.m_vscroll.SetCursor(cursor)
|
|
887
|
+
self.m_viewport.SetCursor(cursor)
|
|
888
|
+
|
|
889
|
+
self.m_viewport.Bind(wx.EVT_SIZE, self.OnViewSize)
|
|
890
|
+
self.Bind(_EVT_DYNAMIC_SASH_REPARENT, self.OnReparent)
|
|
891
|
+
|
|
892
|
+
if self.m_impl.m_window.GetWindowStyle() & DS_MANAGE_SCROLLBARS:
|
|
893
|
+
for sbar in [self.m_hscroll, self.m_vscroll]:
|
|
894
|
+
sbar.Bind(wx.EVT_SET_FOCUS, self.OnFocus)
|
|
895
|
+
sbar.Bind(wx.EVT_SCROLL_TOP, self.OnScroll)
|
|
896
|
+
sbar.Bind(wx.EVT_SCROLL_BOTTOM, self.OnScroll)
|
|
897
|
+
sbar.Bind(wx.EVT_SCROLL_LINEUP, self.OnScroll)
|
|
898
|
+
sbar.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnScroll)
|
|
899
|
+
sbar.Bind(wx.EVT_SCROLL_PAGEUP, self.OnScroll)
|
|
900
|
+
sbar.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnScroll)
|
|
901
|
+
sbar.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnScroll)
|
|
902
|
+
sbar.Bind(wx.EVT_SCROLL_THUMBRELEASE, self.OnScroll)
|
|
903
|
+
|
|
904
|
+
layout = wx.LayoutConstraints()
|
|
905
|
+
size = self.m_hscroll.GetBestSize()
|
|
906
|
+
|
|
907
|
+
layout.left.SameAs(self.m_impl.m_container, wx.Left, 10)
|
|
908
|
+
layout.right.LeftOf(self.m_vscroll)
|
|
909
|
+
layout.bottom.SameAs(self.m_impl.m_container, wx.Bottom, 3)
|
|
910
|
+
layout.height.Absolute(size.GetHeight())
|
|
911
|
+
self.m_hscroll.SetConstraints(layout)
|
|
912
|
+
|
|
913
|
+
layout = wx.LayoutConstraints()
|
|
914
|
+
size = self.m_vscroll.GetBestSize()
|
|
915
|
+
|
|
916
|
+
layout.top.SameAs(self.m_impl.m_container, wx.Top, 10)
|
|
917
|
+
layout.bottom.Above(self.m_hscroll)
|
|
918
|
+
layout.right.SameAs(self.m_impl.m_container, wx.Right, 3)
|
|
919
|
+
layout.width.Absolute(size.GetWidth())
|
|
920
|
+
self.m_vscroll.SetConstraints(layout)
|
|
921
|
+
|
|
922
|
+
layout = wx.LayoutConstraints()
|
|
923
|
+
layout.left.SameAs(self.m_impl.m_container, wx.Left, 3)
|
|
924
|
+
layout.right.LeftOf(self.m_vscroll)
|
|
925
|
+
layout.top.SameAs(self.m_impl.m_container, wx.Top, 3)
|
|
926
|
+
layout.bottom.Above(self.m_hscroll)
|
|
927
|
+
self.m_viewport.SetConstraints(layout)
|
|
928
|
+
|
|
929
|
+
self.m_impl.m_container.Layout()
|
|
930
|
+
return True
|
|
931
|
+
|
|
932
|
+
|
|
933
|
+
def AddChild(self, window):
|
|
934
|
+
if self.m_child:
|
|
935
|
+
self.m_child.Destroy()
|
|
936
|
+
|
|
937
|
+
# Since the parent's AddWindow is called during the construction of
|
|
938
|
+
# the C++ part of the child, there isn't a proxy object created for
|
|
939
|
+
# the child window yet. When we later try to use the widget object
|
|
940
|
+
# given here then it will come up as being already deleted (because
|
|
941
|
+
# the real proxy exists now.) So instead of saving the `window` here
|
|
942
|
+
# we'll just save the object's address instead, and then use that to
|
|
943
|
+
# fetch the real proxy object when it's needed later.
|
|
944
|
+
self.m_child = None
|
|
945
|
+
self.m_child_ptr = wx.siplib.unwrapinstance(window)
|
|
946
|
+
|
|
947
|
+
# Delay the reparenting until after the AddChild has finished.
|
|
948
|
+
event = _DynamicSashReparentEvent(self)
|
|
949
|
+
self.AddPendingEvent(event)
|
|
950
|
+
|
|
951
|
+
|
|
952
|
+
def _checkPendingChild(self):
|
|
953
|
+
if hasattr(self, 'm_child_ptr'):
|
|
954
|
+
self.m_child = wx.siplib.wrapinstance(self.m_child_ptr, wx.Object)
|
|
955
|
+
del self.m_child_ptr
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
def OnReparent(self, event):
|
|
959
|
+
self._checkPendingChild()
|
|
960
|
+
if self.m_child:
|
|
961
|
+
self.m_child.Reparent(self.m_viewport)
|
|
962
|
+
self.ResizeChild(self.m_viewport.GetSize())
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
def GetRegion(self, x, y):
|
|
966
|
+
size = self.m_impl.m_container.GetSize()
|
|
967
|
+
w = size.GetWidth()
|
|
968
|
+
h = size.GetHeight()
|
|
969
|
+
size = self.m_hscroll.GetSize()
|
|
970
|
+
sh = size.GetHeight()
|
|
971
|
+
size = self.m_vscroll.GetSize()
|
|
972
|
+
sw = size.GetWidth()
|
|
973
|
+
|
|
974
|
+
if x >= w - sw - 3 and x < w and y >= h - sh - 3 and y < h:
|
|
975
|
+
return _DSR_CORNER
|
|
976
|
+
if x >= 3 and x < 10 and y >= h - sh - 3 and y < h - 2:
|
|
977
|
+
return _DSR_VERTICAL_TAB
|
|
978
|
+
if x >= w - sw - 3 and x < w - 2 and y >= 3 and y < 10:
|
|
979
|
+
return _DSR_HORIZONTAL_TAB
|
|
980
|
+
if x < 3:
|
|
981
|
+
return _DSR_LEFT_EDGE
|
|
982
|
+
if y < 3:
|
|
983
|
+
return _DSR_TOP_EDGE
|
|
984
|
+
if x >= w - 2:
|
|
985
|
+
return _DSR_RIGHT_EDGE
|
|
986
|
+
if y >= h - 2:
|
|
987
|
+
return _DSR_BOTTOM_EDGE
|
|
988
|
+
|
|
989
|
+
return _DSR_NONE
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
def ResizeChild(self, size):
|
|
993
|
+
self._checkPendingChild()
|
|
994
|
+
if self.m_child:
|
|
995
|
+
if self.m_impl.m_window.HasFlag(DS_MANAGE_SCROLLBARS):
|
|
996
|
+
best_size = self.m_child.GetBestSize()
|
|
997
|
+
if best_size.GetWidth() < size.GetWidth():
|
|
998
|
+
best_size.SetWidth(size.GetWidth())
|
|
999
|
+
if best_size.GetHeight() < size.GetHeight():
|
|
1000
|
+
best_size.SetHeight(size.GetHeight())
|
|
1001
|
+
self.m_child.SetSize(best_size)
|
|
1002
|
+
|
|
1003
|
+
hpos = self.m_hscroll.GetThumbPosition()
|
|
1004
|
+
vpos = self.m_vscroll.GetThumbPosition()
|
|
1005
|
+
|
|
1006
|
+
if hpos < 0:
|
|
1007
|
+
hpos = 0
|
|
1008
|
+
if vpos < 0:
|
|
1009
|
+
vpos = 0
|
|
1010
|
+
if hpos > best_size.GetWidth() - size.GetWidth():
|
|
1011
|
+
hpos = best_size.GetWidth() - size.GetWidth()
|
|
1012
|
+
if vpos > best_size.GetHeight() - size.GetHeight():
|
|
1013
|
+
vpos = best_size.GetHeight() - size.GetHeight()
|
|
1014
|
+
|
|
1015
|
+
self.m_hscroll.SetScrollbar(hpos, size.GetWidth(),
|
|
1016
|
+
best_size.GetWidth(), size.GetWidth())
|
|
1017
|
+
self.m_vscroll.SetScrollbar(vpos, size.GetHeight(),
|
|
1018
|
+
best_size.GetHeight(), size.GetHeight())
|
|
1019
|
+
|
|
1020
|
+
# Umm, the scrollbars are doing something insane under GTK+ and subtracting
|
|
1021
|
+
# one from the position I pass in. This works around that.
|
|
1022
|
+
self.m_hscroll.SetThumbPosition(hpos + hpos - self.m_hscroll.GetThumbPosition())
|
|
1023
|
+
self.m_vscroll.SetThumbPosition(vpos + vpos - self.m_vscroll.GetThumbPosition())
|
|
1024
|
+
|
|
1025
|
+
pos = self.m_child.GetPosition()
|
|
1026
|
+
self.m_viewport.ScrollWindow(-hpos - pos.x, -vpos - pos.y)
|
|
1027
|
+
|
|
1028
|
+
else: # not DS_MANAGE_SCROLLBARS
|
|
1029
|
+
self.m_child.SetSize(size)
|
|
1030
|
+
|
|
1031
|
+
|
|
1032
|
+
def FindScrollBar(self, child, vert):
|
|
1033
|
+
self._checkPendingChild()
|
|
1034
|
+
if self.m_child == child:
|
|
1035
|
+
return self.m_vscroll if vert else self.m_hscroll
|
|
1036
|
+
return None
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
def OnSize(self, event):
|
|
1040
|
+
self.m_impl.m_container.Refresh()
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
def OnViewSize(self, event):
|
|
1044
|
+
if self.m_viewport is not None:
|
|
1045
|
+
self.ResizeChild(self.m_viewport.GetSize())
|
|
1046
|
+
|
|
1047
|
+
|
|
1048
|
+
def OnPaint(self, event):
|
|
1049
|
+
dc = wx.PaintDC(self.m_impl.m_container)
|
|
1050
|
+
dc.SetBackground(wx.Brush(self.m_impl.m_container.GetBackgroundColour()))
|
|
1051
|
+
dc.Clear()
|
|
1052
|
+
|
|
1053
|
+
highlight = wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNHIGHLIGHT), 1)
|
|
1054
|
+
shadow = wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNSHADOW), 1)
|
|
1055
|
+
black = wx.Pen(wx.BLACK, 1)
|
|
1056
|
+
|
|
1057
|
+
size = self.m_impl.m_container.GetSize()
|
|
1058
|
+
w = size.GetWidth()
|
|
1059
|
+
h = size.GetHeight()
|
|
1060
|
+
size = self.m_hscroll.GetSize()
|
|
1061
|
+
sh = size.GetHeight()
|
|
1062
|
+
size = self.m_vscroll.GetSize()
|
|
1063
|
+
sw = size.GetWidth()
|
|
1064
|
+
|
|
1065
|
+
dc.SetPen(shadow)
|
|
1066
|
+
dc.DrawLine(1, 1, 1, h - 2)
|
|
1067
|
+
dc.DrawLine(1, 1, w - 2, 1)
|
|
1068
|
+
dc.SetPen(black)
|
|
1069
|
+
dc.DrawLine(2, 2, 2, h - 3)
|
|
1070
|
+
dc.DrawLine(2, 2, w - 3, 2)
|
|
1071
|
+
dc.SetPen(highlight)
|
|
1072
|
+
dc.DrawLine(w - 2, 2, w - 2, h - sh - 2)
|
|
1073
|
+
dc.DrawLine(w - 2, h - sh - 2, w - sw - 2, h - sh - 2)
|
|
1074
|
+
dc.DrawLine(w - sw - 2, h - sh - 2, w - sw - 2, h - 2)
|
|
1075
|
+
dc.DrawLine(w - sw - 2, h - 2, 2, h - 2)
|
|
1076
|
+
|
|
1077
|
+
dc.SetPen(highlight)
|
|
1078
|
+
dc.DrawLine(w - sw - 2, 8, w - sw - 2, 4)
|
|
1079
|
+
dc.DrawLine(w - sw - 2, 4, w - 5, 4)
|
|
1080
|
+
dc.SetPen(shadow)
|
|
1081
|
+
dc.DrawLine(w - 5, 4, w - 5, 8)
|
|
1082
|
+
dc.DrawLine(w - 5, 8, w - sw - 2, 8)
|
|
1083
|
+
dc.SetPen(black)
|
|
1084
|
+
dc.DrawLine(w - 4, 3, w - 4, 9)
|
|
1085
|
+
dc.DrawLine(w - 4, 9, w - sw - 3, 9)
|
|
1086
|
+
|
|
1087
|
+
dc.SetPen(highlight)
|
|
1088
|
+
dc.DrawLine(4, h - 5, 4, h - sh - 2)
|
|
1089
|
+
dc.DrawLine(4, h - sh - 2, 8, h - sh - 2)
|
|
1090
|
+
dc.SetPen(shadow)
|
|
1091
|
+
dc.DrawLine(8, h - sh - 2, 8, h - 5)
|
|
1092
|
+
dc.DrawLine(8, h - 5, 4, h - 5)
|
|
1093
|
+
dc.SetPen(black)
|
|
1094
|
+
dc.DrawLine(9, h - sh - 3, 9, h - 4)
|
|
1095
|
+
dc.DrawLine(9, h - 4, 3, h - 4)
|
|
1096
|
+
|
|
1097
|
+
cy = (h - sh + h - 6) / 2.0 + 1
|
|
1098
|
+
cx = (w - sw + w - 6) / 2.0 + 1
|
|
1099
|
+
sy = cy
|
|
1100
|
+
while sy > h - sh:
|
|
1101
|
+
sy -= 4
|
|
1102
|
+
sx = cx
|
|
1103
|
+
while sx > w - sw:
|
|
1104
|
+
sx -= 4
|
|
1105
|
+
|
|
1106
|
+
for y in range(int(sy), h-2, 4): #(y = sy; y < h - 2; y += 4)
|
|
1107
|
+
for x in range(int(sx), w-2, 4): #(x = sx; x < w - 2; x += 4)
|
|
1108
|
+
if x - cx >= -(y - cy):
|
|
1109
|
+
dc.SetPen(highlight)
|
|
1110
|
+
dc.DrawPoint(x, y)
|
|
1111
|
+
dc.SetPen(shadow)
|
|
1112
|
+
dc.DrawPoint(x + 1, y + 1)
|
|
1113
|
+
|
|
1114
|
+
|
|
1115
|
+
|
|
1116
|
+
def OnScroll(self, event):
|
|
1117
|
+
self._checkPendingChild()
|
|
1118
|
+
nx = -self.m_hscroll.GetThumbPosition()
|
|
1119
|
+
ny = -self.m_vscroll.GetThumbPosition()
|
|
1120
|
+
|
|
1121
|
+
if self.m_child:
|
|
1122
|
+
pos = self.m_child.GetPosition()
|
|
1123
|
+
self.m_viewport.ScrollWindow(nx - pos.x, ny - pos.y)
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
def OnFocus(self, event):
|
|
1127
|
+
self._checkPendingChild()
|
|
1128
|
+
if (event.GetEventObject() == self.m_hscroll or
|
|
1129
|
+
event.GetEventObject() == self.m_vscroll):
|
|
1130
|
+
self.m_child.SetFocus()
|
|
1131
|
+
|
|
1132
|
+
|
|
1133
|
+
def OnMouseMove(self, event):
|
|
1134
|
+
if self.m_impl.m_dragging:
|
|
1135
|
+
return
|
|
1136
|
+
|
|
1137
|
+
region = self.GetRegion(event.x, event.y)
|
|
1138
|
+
|
|
1139
|
+
cursor = wx.Cursor(wx.CURSOR_ARROW)
|
|
1140
|
+
if region == _DSR_HORIZONTAL_TAB:
|
|
1141
|
+
cursor = wx.Cursor(wx.CURSOR_SIZENS)
|
|
1142
|
+
elif region == _DSR_VERTICAL_TAB:
|
|
1143
|
+
cursor = wx.Cursor(wx.CURSOR_SIZEWE)
|
|
1144
|
+
elif (region == _DSR_CORNER and
|
|
1145
|
+
self.m_impl.m_window.GetWindowStyle() & DS_DRAG_CORNER != 0):
|
|
1146
|
+
cursor = wx.Cursor(wx.CURSOR_SIZENWSE)
|
|
1147
|
+
|
|
1148
|
+
elif (region == _DSR_LEFT_EDGE or region == _DSR_TOP_EDGE
|
|
1149
|
+
or region == _DSR_RIGHT_EDGE or region == _DSR_BOTTOM_EDGE):
|
|
1150
|
+
if self.m_impl.FindParent(region):
|
|
1151
|
+
if region == _DSR_LEFT_EDGE or region == _DSR_RIGHT_EDGE:
|
|
1152
|
+
cursor = wx.Cursor(wx.CURSOR_SIZEWE)
|
|
1153
|
+
else:
|
|
1154
|
+
cursor = wx.Cursor(wx.CURSOR_SIZENS)
|
|
1155
|
+
|
|
1156
|
+
self.m_impl.m_container.SetCursor(cursor)
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
def OnLeave(self, event):
|
|
1161
|
+
cursor = wx.Cursor(wx.CURSOR_ARROW)
|
|
1162
|
+
self.m_impl.m_container.SetCursor(cursor)
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
def OnPress(self, event):
|
|
1167
|
+
region = self.GetRegion(event.x, event.y)
|
|
1168
|
+
|
|
1169
|
+
if region == _DSR_CORNER and (self.m_impl.m_window.GetWindowStyle() & DS_DRAG_CORNER) == 0:
|
|
1170
|
+
return
|
|
1171
|
+
|
|
1172
|
+
if region == _DSR_HORIZONTAL_TAB or region == _DSR_VERTICAL_TAB or region == _DSR_CORNER:
|
|
1173
|
+
self.m_impl.m_dragging = region
|
|
1174
|
+
self.m_impl.m_drag_x = event.x
|
|
1175
|
+
self.m_impl.m_drag_y = event.y
|
|
1176
|
+
self.m_impl.DrawSash(event.x, event.y, "press")
|
|
1177
|
+
self.m_impl.m_container.CaptureMouse()
|
|
1178
|
+
|
|
1179
|
+
elif (region == _DSR_LEFT_EDGE or region == _DSR_TOP_EDGE
|
|
1180
|
+
or region == _DSR_RIGHT_EDGE or region == _DSR_BOTTOM_EDGE):
|
|
1181
|
+
parent = self.m_impl.FindParent(region)
|
|
1182
|
+
|
|
1183
|
+
if parent:
|
|
1184
|
+
x = event.x
|
|
1185
|
+
y = event.y
|
|
1186
|
+
|
|
1187
|
+
x, y = self.m_impl.m_container.ClientToScreen(x, y)
|
|
1188
|
+
x, y = parent.m_container.ScreenToClient(x, y)
|
|
1189
|
+
|
|
1190
|
+
parent.m_dragging = parent.m_split
|
|
1191
|
+
parent.m_drag_x = x
|
|
1192
|
+
parent.m_drag_y = y
|
|
1193
|
+
parent.DrawSash(x, y, "press")
|
|
1194
|
+
parent.m_container.CaptureMouse()
|
|
1195
|
+
|
|
1196
|
+
|
|
1197
|
+
def OnRelease(self, event):
|
|
1198
|
+
pass
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
|