From ca4746f13c3b8dcb4f13857e2bcc404fdb3bb1ad Mon Sep 17 00:00:00 2001 From: Andrea Gavana Date: Fri, 30 Dec 2011 19:17:09 +0000 Subject: [PATCH] - Initial commit of the Python scripts to ReSTify the XML documentation. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@70205 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- TODO.txt | 69 +- build.py | 87 +- docs/sphinx/Makefile | 130 + docs/sphinx/_static/css/basic.css | 510 +++ docs/sphinx/_static/css/default.css | 227 ++ docs/sphinx/_static/css/gallery.css | 47 + docs/sphinx/_static/css/phoenix.css | 640 ++++ docs/sphinx/_static/css/pygments.css | 61 + docs/sphinx/_static/css/tables.css | 57 + .../overviews/evthandler_unlink_after.png | Bin 0 -> 12337 bytes .../overviews/evthandler_unlink_before.png | Bin 0 -> 12581 bytes .../overviews/overview_events_chain.png | Bin 0 -> 12581 bytes .../overviews/overview_events_winstack.png | Bin 0 -> 25506 bytes .../images/overviews/overview_sizer_00.png | Bin 0 -> 328 bytes .../images/overviews/overview_sizer_01.png | Bin 0 -> 386 bytes .../images/overviews/overview_sizer_02.png | Bin 0 -> 387 bytes .../images/overviews/overview_sizer_03.png | Bin 0 -> 453 bytes .../images/overviews/overview_sizer_04.png | Bin 0 -> 666 bytes .../images/overviews/overview_sizer_05.png | Bin 0 -> 389 bytes .../images/overviews/overview_sizer_06.png | Bin 0 -> 908 bytes .../images/overviews/overview_sizer_07.png | Bin 0 -> 540 bytes .../images/overviews/overview_sizer_08.png | Bin 0 -> 478 bytes .../images/overviews/overview_sizer_09.png | Bin 0 -> 608 bytes .../images/overviews/overview_sizer_10.png | Bin 0 -> 720 bytes .../images/overviews/overview_sizer_11.png | Bin 0 -> 631 bytes .../images/overviews/overview_splitter_3d.png | Bin 0 -> 2130 bytes docs/sphinx/_static/images/sphinxdocs/api.png | Bin 0 -> 2077 bytes .../_static/images/sphinxdocs/appearance.png | Bin 0 -> 1893 bytes .../_static/images/sphinxdocs/available.png | Bin 0 -> 4477 bytes .../_static/images/sphinxdocs/background.png | Bin 0 -> 1302 bytes .../sphinx/_static/images/sphinxdocs/base.png | Bin 0 -> 1513 bytes .../_static/images/sphinxdocs/cell_blue.jpg | Bin 0 -> 17943 bytes .../_static/images/sphinxdocs/cell_grey.jpg | Bin 0 -> 15354 bytes .../_static/images/sphinxdocs/cell_grey.png | Bin 0 -> 11025 bytes .../_static/images/sphinxdocs/central_bar.png | Bin 0 -> 54324 bytes .../images/sphinxdocs/class_hierarchy.png | Bin 0 -> 1373 bytes .../images/sphinxdocs/class_summary.png | Bin 0 -> 2401 bytes .../_static/images/sphinxdocs/description.png | Bin 0 -> 2935 bytes .../_static/images/sphinxdocs/events.png | Bin 0 -> 4354 bytes .../images/sphinxdocs/extra_styles.png | Bin 0 -> 1179 bytes .../_static/images/sphinxdocs/file_info.png | Bin 0 -> 3443 bytes .../_static/images/sphinxdocs/globals.png | Bin 0 -> 833 bytes .../_static/images/sphinxdocs/indices.png | Bin 0 -> 1314 bytes .../sphinx/_static/images/sphinxdocs/info.png | Bin 0 -> 1135 bytes .../_static/images/sphinxdocs/layout.png | Bin 0 -> 2074 bytes .../_static/images/sphinxdocs/license.png | Bin 0 -> 1649 bytes .../sphinx/_static/images/sphinxdocs/link.png | Bin 0 -> 2831 bytes .../images/sphinxdocs/method_summary.png | Bin 0 -> 2362 bytes .../_static/images/sphinxdocs/minus2.png | Bin 0 -> 48703 bytes .../_static/images/sphinxdocs/navigation.png | Bin 0 -> 218 bytes .../sphinx/_static/images/sphinxdocs/note.png | Bin 0 -> 1118 bytes .../images/sphinxdocs/orange_gradient.png | Bin 0 -> 1535 bytes .../_static/images/sphinxdocs/other_info.png | Bin 0 -> 2217 bytes .../_static/images/sphinxdocs/overload.png | Bin 0 -> 769 bytes .../images/sphinxdocs/phoenix_main.png | Bin 0 -> 27938 bytes .../images/sphinxdocs/phoenix_small.ico | Bin 0 -> 2238 bytes .../images/sphinxdocs/phoenix_small.png | Bin 0 -> 1115 bytes .../images/sphinxdocs/phoenix_title.png | Bin 0 -> 5702 bytes .../_static/images/sphinxdocs/phoenix_top.png | Bin 0 -> 90998 bytes .../_static/images/sphinxdocs/platforms.png | Bin 0 -> 2119 bytes .../_static/images/sphinxdocs/plus2.png | Bin 0 -> 48663 bytes .../images/sphinxdocs/property_summary.png | Bin 0 -> 2489 bytes .../_static/images/sphinxdocs/python.png | Bin 0 -> 1818 bytes .../_static/images/sphinxdocs/seealso.png | Bin 0 -> 1437 bytes .../_static/images/sphinxdocs/settings.png | Bin 0 -> 2023 bytes .../_static/images/sphinxdocs/styles.png | Bin 0 -> 1883 bytes .../_static/images/sphinxdocs/sub_classes.png | Bin 0 -> 1998 bytes .../images/sphinxdocs/super_classes.png | Bin 0 -> 2498 bytes .../images/sphinxdocs/table_contents.png | Bin 0 -> 2467 bytes .../_static/images/sphinxdocs/ticks_green.png | Bin 0 -> 1099 bytes .../_static/images/sphinxdocs/ticks_red.png | Bin 0 -> 1064 bytes .../sphinx/_static/images/sphinxdocs/todo.png | Bin 0 -> 1800 bytes .../_static/images/sphinxdocs/todo_big.png | Bin 0 -> 2706 bytes .../_static/images/sphinxdocs/usage.png | Bin 0 -> 2027 bytes .../_static/images/sphinxdocs/viewmag.png | Bin 0 -> 2282 bytes .../_static/images/sphinxdocs/warning.png | Bin 0 -> 1195 bytes .../_static/images/sphinxdocs/whatsnew.png | Bin 0 -> 2413 bytes .../sphinx/_static/images/stock/gtk-about.png | Bin 0 -> 704 bytes docs/sphinx/_static/images/stock/gtk-add.png | Bin 0 -> 260 bytes .../sphinx/_static/images/stock/gtk-apply.png | Bin 0 -> 1002 bytes docs/sphinx/_static/images/stock/gtk-bold.png | Bin 0 -> 649 bytes .../_static/images/stock/gtk-cancel.png | Bin 0 -> 1067 bytes .../sphinx/_static/images/stock/gtk-cdrom.png | Bin 0 -> 894 bytes .../sphinx/_static/images/stock/gtk-clear.png | Bin 0 -> 728 bytes .../sphinx/_static/images/stock/gtk-close.png | Bin 0 -> 889 bytes .../_static/images/stock/gtk-convert.png | Bin 0 -> 677 bytes docs/sphinx/_static/images/stock/gtk-copy.png | Bin 0 -> 498 bytes docs/sphinx/_static/images/stock/gtk-cut.png | Bin 0 -> 876 bytes .../_static/images/stock/gtk-delete.png | Bin 0 -> 866 bytes docs/sphinx/_static/images/stock/gtk-edit.png | Bin 0 -> 755 bytes .../_static/images/stock/gtk-execute.png | Bin 0 -> 902 bytes docs/sphinx/_static/images/stock/gtk-file.png | Bin 0 -> 569 bytes .../images/stock/gtk-find-and-replace.png | Bin 0 -> 875 bytes docs/sphinx/_static/images/stock/gtk-find.png | Bin 0 -> 788 bytes .../_static/images/stock/gtk-floppy.png | Bin 0 -> 652 bytes .../_static/images/stock/gtk-go-back-ltr.png | Bin 0 -> 579 bytes .../_static/images/stock/gtk-go-down.png | Bin 0 -> 598 bytes .../images/stock/gtk-go-forward-ltr.png | Bin 0 -> 580 bytes .../sphinx/_static/images/stock/gtk-go-up.png | Bin 0 -> 551 bytes .../_static/images/stock/gtk-goto-bottom.png | Bin 0 -> 647 bytes .../images/stock/gtk-goto-first-ltr.png | Bin 0 -> 632 bytes .../images/stock/gtk-goto-last-ltr.png | Bin 0 -> 653 bytes .../_static/images/stock/gtk-goto-top.png | Bin 0 -> 630 bytes .../_static/images/stock/gtk-harddisk.png | Bin 0 -> 832 bytes docs/sphinx/_static/images/stock/gtk-help.png | Bin 0 -> 1002 bytes docs/sphinx/_static/images/stock/gtk-home.png | Bin 0 -> 735 bytes .../_static/images/stock/gtk-indent-ltr.png | Bin 0 -> 611 bytes .../sphinx/_static/images/stock/gtk-index.png | Bin 0 -> 753 bytes docs/sphinx/_static/images/stock/gtk-info.png | Bin 0 -> 879 bytes .../_static/images/stock/gtk-italic.png | Bin 0 -> 665 bytes .../_static/images/stock/gtk-jump-to-ltr.png | Bin 0 -> 811 bytes .../images/stock/gtk-justify-center.png | Bin 0 -> 393 bytes .../_static/images/stock/gtk-justify-fill.png | Bin 0 -> 358 bytes .../_static/images/stock/gtk-justify-left.png | Bin 0 -> 378 bytes .../images/stock/gtk-justify-right.png | Bin 0 -> 400 bytes .../_static/images/stock/gtk-network.png | Bin 0 -> 623 bytes docs/sphinx/_static/images/stock/gtk-new.png | Bin 0 -> 569 bytes docs/sphinx/_static/images/stock/gtk-no.png | Bin 0 -> 952 bytes docs/sphinx/_static/images/stock/gtk-ok.png | Bin 0 -> 963 bytes docs/sphinx/_static/images/stock/gtk-open.png | Bin 0 -> 492 bytes .../sphinx/_static/images/stock/gtk-paste.png | Bin 0 -> 561 bytes .../_static/images/stock/gtk-preferences.png | Bin 0 -> 1014 bytes .../images/stock/gtk-print-preview.png | Bin 0 -> 733 bytes .../sphinx/_static/images/stock/gtk-print.png | Bin 0 -> 525 bytes .../_static/images/stock/gtk-properties.png | Bin 0 -> 794 bytes docs/sphinx/_static/images/stock/gtk-quit.png | Bin 0 -> 647 bytes .../_static/images/stock/gtk-redo-ltr.png | Bin 0 -> 790 bytes .../_static/images/stock/gtk-refresh.png | Bin 0 -> 926 bytes .../_static/images/stock/gtk-remove.png | Bin 0 -> 210 bytes .../images/stock/gtk-revert-to-saved-ltr.png | Bin 0 -> 800 bytes .../_static/images/stock/gtk-save-as.png | Bin 0 -> 770 bytes docs/sphinx/_static/images/stock/gtk-save.png | Bin 0 -> 652 bytes .../_static/images/stock/gtk-select-all.png | Bin 0 -> 547 bytes .../_static/images/stock/gtk-select-color.png | Bin 0 -> 735 bytes .../_static/images/stock/gtk-select-font.png | Bin 0 -> 706 bytes .../images/stock/gtk-sort-ascending.png | Bin 0 -> 333 bytes .../images/stock/gtk-sort-descending.png | Bin 0 -> 331 bytes .../_static/images/stock/gtk-spell-check.png | Bin 0 -> 641 bytes docs/sphinx/_static/images/stock/gtk-stop.png | Bin 0 -> 769 bytes .../images/stock/gtk-strikethrough.png | Bin 0 -> 656 bytes .../_static/images/stock/gtk-undelete-ltr.png | Bin 0 -> 962 bytes .../_static/images/stock/gtk-underline.png | Bin 0 -> 645 bytes .../_static/images/stock/gtk-undo-ltr.png | Bin 0 -> 784 bytes .../_static/images/stock/gtk-unindent-ltr.png | Bin 0 -> 594 bytes docs/sphinx/_static/images/stock/gtk-yes.png | Bin 0 -> 1044 bytes .../_static/images/stock/gtk-zoom-100.png | Bin 0 -> 784 bytes .../_static/images/stock/gtk-zoom-fit.png | Bin 0 -> 750 bytes .../_static/images/stock/gtk-zoom-in.png | Bin 0 -> 785 bytes .../_static/images/stock/gtk-zoom-out.png | Bin 0 -> 772 bytes .../images/widgets/fullsize/no_appearance.png | Bin 0 -> 29496 bytes .../widgets/fullsize/wxgtk/bitmapbutton.png | Bin 0 -> 532 bytes .../images/widgets/fullsize/wxgtk/button.png | Bin 0 -> 1610 bytes .../widgets/fullsize/wxgtk/checkbox.png | Bin 0 -> 1816 bytes .../widgets/fullsize/wxgtk/checklistbox.png | Bin 0 -> 2931 bytes .../images/widgets/fullsize/wxgtk/choice.png | Bin 0 -> 3072 bytes .../fullsize/wxgtk/collapsiblepane.png | Bin 0 -> 7031 bytes .../widgets/fullsize/wxgtk/combobox.png | Bin 0 -> 3476 bytes .../fullsize/wxgtk/dataview.dataviewctrl.png | Bin 0 -> 6527 bytes .../images/widgets/fullsize/wxgtk/gauge.png | Bin 0 -> 583 bytes .../images/widgets/fullsize/wxgtk/listbox.png | Bin 0 -> 1982 bytes .../widgets/fullsize/wxgtk/notebook.png | Bin 0 -> 6535 bytes .../widgets/fullsize/wxgtk/radiobox.png | Bin 0 -> 2679 bytes .../widgets/fullsize/wxgtk/radiobutton.png | Bin 0 -> 2110 bytes .../widgets/fullsize/wxgtk/searchctrl.png | Bin 0 -> 2029 bytes .../images/widgets/fullsize/wxgtk/slider.png | Bin 0 -> 493 bytes .../widgets/fullsize/wxgtk/spinbutton.png | Bin 0 -> 402 bytes .../widgets/fullsize/wxgtk/spinctrl.png | Bin 0 -> 691 bytes .../widgets/fullsize/wxgtk/spinctrldouble.png | Bin 0 -> 1023 bytes .../widgets/fullsize/wxgtk/staticbitmap.png | Bin 0 -> 253 bytes .../widgets/fullsize/wxgtk/staticbox.png | Bin 0 -> 1699 bytes .../widgets/fullsize/wxgtk/statictext.png | Bin 0 -> 1281 bytes .../widgets/fullsize/wxgtk/textctrl.png | Bin 0 -> 2623 bytes .../widgets/fullsize/wxgtk/togglebutton.png | Bin 0 -> 2735 bytes .../widgets/fullsize/wxmac/bitmapbutton.png | Bin 0 -> 1894 bytes .../images/widgets/fullsize/wxmac/button.png | Bin 0 -> 2805 bytes .../widgets/fullsize/wxmac/checkbox.png | Bin 0 -> 3650 bytes .../widgets/fullsize/wxmac/checklistbox.png | Bin 0 -> 3596 bytes .../images/widgets/fullsize/wxmac/choice.png | Bin 0 -> 2376 bytes .../fullsize/wxmac/collapsiblepane.png | Bin 0 -> 10932 bytes .../widgets/fullsize/wxmac/combobox.png | Bin 0 -> 2700 bytes .../fullsize/wxmac/dataview.dataviewctrl.png | Bin 0 -> 13115 bytes .../images/widgets/fullsize/wxmac/gauge.png | Bin 0 -> 591 bytes .../images/widgets/fullsize/wxmac/listbox.png | Bin 0 -> 2595 bytes .../widgets/fullsize/wxmac/notebook.png | Bin 0 -> 9213 bytes .../widgets/fullsize/wxmac/radiobox.png | Bin 0 -> 3393 bytes .../widgets/fullsize/wxmac/radiobutton.png | Bin 0 -> 3683 bytes .../widgets/fullsize/wxmac/searchctrl.png | Bin 0 -> 2315 bytes .../images/widgets/fullsize/wxmac/slider.png | Bin 0 -> 1338 bytes .../widgets/fullsize/wxmac/spinbutton.png | Bin 0 -> 875 bytes .../widgets/fullsize/wxmac/spinctrl.png | Bin 0 -> 1313 bytes .../widgets/fullsize/wxmac/spinctrldouble.png | Bin 0 -> 1686 bytes .../widgets/fullsize/wxmac/staticbitmap.png | Bin 0 -> 1269 bytes .../widgets/fullsize/wxmac/staticbox.png | Bin 0 -> 1086 bytes .../widgets/fullsize/wxmac/statictext.png | Bin 0 -> 1523 bytes .../widgets/fullsize/wxmac/textctrl.png | Bin 0 -> 3629 bytes .../widgets/fullsize/wxmac/togglebutton.png | Bin 0 -> 3726 bytes .../fullsize/wxmsw/aui.auimdiparentframe.png | Bin 0 -> 11847 bytes .../fullsize/wxmsw/aui.framemanager.png | Bin 0 -> 68931 bytes .../widgets/fullsize/wxmsw/bitmapbutton.png | Bin 0 -> 1657 bytes .../images/widgets/fullsize/wxmsw/button.png | Bin 0 -> 1228 bytes .../widgets/fullsize/wxmsw/checkbox.png | Bin 0 -> 1428 bytes .../widgets/fullsize/wxmsw/checklistbox.png | Bin 0 -> 1601 bytes .../images/widgets/fullsize/wxmsw/choice.png | Bin 0 -> 2570 bytes .../fullsize/wxmsw/collapsiblepane.png | Bin 0 -> 5976 bytes .../widgets/fullsize/wxmsw/combobox.png | Bin 0 -> 2438 bytes .../fullsize/wxmsw/dataview.dataviewctrl.png | Bin 0 -> 2659 bytes .../images/widgets/fullsize/wxmsw/dialog.png | Bin 0 -> 6656 bytes .../images/widgets/fullsize/wxmsw/frame.png | Bin 0 -> 5516 bytes .../images/widgets/fullsize/wxmsw/gauge.png | Bin 0 -> 661 bytes .../images/widgets/fullsize/wxmsw/listbox.png | Bin 0 -> 1183 bytes .../widgets/fullsize/wxmsw/miniframe.png | Bin 0 -> 3787 bytes .../widgets/fullsize/wxmsw/notebook.png | Bin 0 -> 4445 bytes .../widgets/fullsize/wxmsw/radiobox.png | Bin 0 -> 2527 bytes .../widgets/fullsize/wxmsw/radiobutton.png | Bin 0 -> 2029 bytes .../widgets/fullsize/wxmsw/searchctrl.png | Bin 0 -> 1222 bytes .../images/widgets/fullsize/wxmsw/slider.png | Bin 0 -> 838 bytes .../widgets/fullsize/wxmsw/spinbutton.png | Bin 0 -> 627 bytes .../widgets/fullsize/wxmsw/spinctrl.png | Bin 0 -> 867 bytes .../widgets/fullsize/wxmsw/spinctrldouble.png | Bin 0 -> 696 bytes .../widgets/fullsize/wxmsw/staticbitmap.png | Bin 0 -> 1178 bytes .../widgets/fullsize/wxmsw/staticbox.png | Bin 0 -> 1487 bytes .../widgets/fullsize/wxmsw/statictext.png | Bin 0 -> 654 bytes .../widgets/fullsize/wxmsw/textctrl.png | Bin 0 -> 1969 bytes .../widgets/fullsize/wxmsw/togglebutton.png | Bin 0 -> 1947 bytes .../fullsize/wxmsw/wizard.pywizardpage.png | Bin 0 -> 31427 bytes .../wxmsw/wizard.wizardpagesimple.png | Bin 0 -> 44921 bytes docs/sphinx/_static/javascript/header.js | 50 + docs/sphinx/_templates/gallery.html | 196 ++ docs/sphinx/_templates/indexsidebar.html | 15 + docs/sphinx/_templates/layout.html | 22 + docs/sphinx/_templates/main.html | 84 + docs/sphinx/availability.py | 198 ++ docs/sphinx/conf.py | 278 ++ docs/sphinx/make.bat | 176 + .../overviews/app_overview.rst | 58 + .../overviews/bitmap_overview.rst | 103 + .../overviews/bookctrl_overview.rst | 48 + .../overviews/common_dialogs_overview.rst | 226 ++ .../overviews/config_overview.rst | 44 + .../overviews/dc_overview.rst | 38 + .../overviews/dialog_overview.rst | 101 + .../overviews/dnd_overview.rst | 70 + .../overviews/events_overview.rst | 311 ++ .../overviews/font_encodings.rst | 57 + .../overviews/font_overview.rst | 55 + .../rest_substitutions/overviews/index.rst | 146 + .../overviews/log_classes_overview.rst | 229 ++ .../overviews/printing_framework_overview.rst | 155 + .../overviews/refcount_overview.rst | 72 + .../overviews/scrolling_overview.rst | 68 + .../overviews/sizers_overview.rst | 331 ++ .../overviews/splitterwindow_overview.rst | 69 + .../overviews/standard_event_identifiers.rst | 24 + .../overviews/stock_items.rst | 240 ++ .../overviews/validator_overview.rst | 108 + .../overviews/window_deletion_overview.rst | 95 + .../overviews/window_ids_overview.rst | 30 + .../overviews/window_sizing_overview.rst | 70 + .../overviews/window_styles_overview.rst | 22 + .../python/converted/AcceleratorTable.1.py | 10 + .../python/converted/App.SetTopWindow.1.py | 2 + .../python/converted/Bitmap.__init__.1.py | 3 + .../python/converted/BoxSizer.AddSpacer.1.py | 9 + .../snippets/python/converted/BusyCursor.1.py | 7 + .../snippets/python/converted/CloseEvent.1.py | 15 + .../python/converted/CollapsiblePane.1.py | 12 + .../snippets/python/converted/ConfigBase.1.py | 14 + .../snippets/python/converted/ConfigBase.2.py | 23 + .../snippets/python/converted/ConfigBase.3.py | 10 + .../snippets/python/converted/ConfigBase.4.py | 11 + .../snippets/python/converted/ConfigBase.5.py | 21 + .../python/converted/ConfigPathChanger.1.py | 21 + .../converted/ConfigPathChanger.__init__.1.py | 2 + .../converted/ConfigPathChanger.__init__.2.py | 2 + .../converted/Control.SetLabelMarkup.1.py | 7 + .../snippets/python/converted/Cursor.1.py | 40 + .../snippets/python/converted/DCClipper.1.py | 13 + .../snippets/python/converted/Dialog.1.py | 13 + .../snippets/python/converted/Dialog.2.py | 11 + .../snippets/python/converted/DirDialog.1.py | 4 + .../python/converted/Event.Clone.1.py | 4 + .../python/converted/EventBlocker.1.py | 14 + .../python/converted/EventFilter.1.py | 43 + .../python/converted/EventLoopActivator.1.py | 11 + .../converted/EventLoopBase.Dispatch.1.py | 3 + .../converted/EvtHandler.QueueEvent.1.py | 10 + .../converted/EvtHandler.QueueEvent.2.py | 10 + .../converted/EvtHandler.SetNextHandler.1.py | 3 + .../snippets/python/converted/FileDialog.1.py | 27 + .../snippets/python/converted/FileDialog.2.py | 17 + .../snippets/python/converted/FileDialog.3.py | 2 + .../snippets/python/converted/Frame.1.py | 2 + .../python/converted/GraphicsContext.1.py | 25 + .../python/converted/GraphicsRenderer.1.py | 3 + .../python/converted/HeaderColumnSimple.1.py | 6 + .../python/converted/IconBundle.GetIcon.1.py | 2 + .../converted/Image.ComputeHistogram.1.py | 10 + .../converted/Image.GetImageExtWildcard.1.py | 4 + .../python/converted/Image.LoadFile.1.py | 3 + .../python/converted/Image.LoadFile.2.py | 3 + .../python/converted/Image.SaveFile.1.py | 3 + .../python/converted/Image.SaveFile.2.py | 3 + .../python/converted/Image.Scale.1.py | 14 + .../python/converted/Image.__init__.1.py | 3 + .../python/converted/KeyEvent.GetKeyCode.1.py | 24 + .../converted/KeyboardState.GetModifiers.1.py | 5 + .../converted/KeyboardState.GetModifiers.2.py | 4 + .../python/converted/Log.LogRecord.1.py | 11 + .../converted/Log.SetComponentLevel.1.py | 2 + .../snippets/python/converted/LogChain.1.py | 7 + .../snippets/python/converted/MemoryDC.1.py | 8 + .../snippets/python/converted/MemoryDC.2.py | 2 + .../python/converted/Menu.Append.1.py | 2 + .../python/converted/Menu.Append.2.py | 2 + .../python/converted/Menu.Append.3.py | 2 + .../python/converted/Menu.Append.4.py | 2 + .../converted/MenuItem.GetLabelText.1.py | 2 + .../converted/MenuItem.SetItemLabel.1.py | 5 + .../python/converted/MenuItem.__init__.1.py | 11 + .../MessageDialog.SetYesNoLabels.1.py | 3 + .../MessageDialog.SetYesNoLabels.2.py | 6 + .../converted/NonOwnedWindow.SetShape.1.py | 7 + .../snippets/python/converted/Notebook.1.py | 2 + .../snippets/python/converted/Notebook.2.py | 6 + .../snippets/python/converted/PaintEvent.1.py | 6 + .../snippets/python/converted/PaintEvent.2.py | 21 + .../python/converted/PlatformInfo.1.py | 2 + .../python/converted/Point.SetDefaults.1.py | 5 + .../converted/Scrolled.DoPrepareDC.1.py | 16 + .../converted/Scrolled.SetScrollbars.1.py | 2 + .../snippets/python/converted/SearchCtrl.1.py | 2 + .../converted/SingleInstanceChecker.1.py | 14 + .../python/converted/Size.SetDefaults.1.py | 5 + .../python/converted/Sizer.AddSpacer.1.py | 2 + .../converted/Sizer.AddStretchSpacer.1.py | 2 + .../snippets/python/converted/SizerFlags.1.py | 2 + .../snippets/python/converted/SizerFlags.2.py | 2 + .../snippets/python/converted/SizerFlags.3.py | 6 + .../StandardPaths.MSWGetShellDir.1.py | 6 + .../converted/StandardPaths.UseAppInfo.1.py | 2 + .../snippets/python/converted/StaticBox.1.py | 9 + .../snippets/python/converted/StaticBox.2.py | 6 + .../python/converted/StaticBoxSizer.1.py | 12 + .../python/converted/TextCompleterSimple.1.py | 29 + .../snippets/python/converted/TextCtrl.1.py | 7 + .../snippets/python/converted/TimerEvent.1.py | 19 + .../python/converted/Validator.SetWindow.1.py | 3 + .../converted/Window.DoUpdateWindowUI.1.py | 13 + .../snippets/python/converted/Window.Fit.1.py | 2 + .../converted/Window.HandleWindowEvent.1.py | 2 + .../python/converted/Window.Move.1.py | 2 + .../python/converted/Window.Move.2.py | 2 + .../python/converted/Window.Move.3.py | 2 + .../python/converted/Window.ProcessEvent.1.py | 2 + .../converted/Window.ProcessWindowEvent.1.py | 2 + .../converted/Window.PushEventHandler.1.py | 3 + .../converted/Window.SetMaxClientSize.1.py | 2 + .../converted/Window.SetMinClientSize.1.py | 2 + .../python/converted/Window.SetScrollbar.1.py | 2 + .../converted/Window.UpdateWindowUI.1.py | 6 + .../WindowModalDialogEvent.Clone.1.py | 4 + .../converted/dataview.DataViewModel.1.py | 7 + .../converted/dataview.DataViewModel.2.py | 6 + ...iew.DataViewRenderer.DisableEllipsize.1.py | 2 + .../converted/functions.DirSelector.1.py | 6 + .../converted/functions.FileSelector.1.py | 2 + .../converted/functions.FileSelector.2.py | 8 + .../python/converted/functions.Kill.1.py | 20 + .../python/converted/functions.Kill.2.py | 9 + .../converted/functions.MessageBox.1.py | 5 + .../tables/ColourDatabase.1.rst | 22 + .../rest_substitutions/tables/Sizer.1.rst | 49 + .../tables/VScrolledWindow.1.rst | 18 + etg/app.py | 18 +- etgtools/extractors.py | 100 +- etgtools/generators.py | 4 + etgtools/sphinx_generator.py | 3088 ++++++++++++++++- etgtools/tweaker_tools.py | 8 +- sphinxtools/__init__.py | 0 sphinxtools/constants.py | 142 + sphinxtools/inheritance.py | 212 ++ sphinxtools/postprocess.py | 566 +++ sphinxtools/templates.py | 243 ++ sphinxtools/utilities.py | 589 ++++ src/app_ex.py | 263 ++ 385 files changed, 11733 insertions(+), 85 deletions(-) create mode 100644 docs/sphinx/Makefile create mode 100644 docs/sphinx/_static/css/basic.css create mode 100644 docs/sphinx/_static/css/default.css create mode 100644 docs/sphinx/_static/css/gallery.css create mode 100644 docs/sphinx/_static/css/phoenix.css create mode 100644 docs/sphinx/_static/css/pygments.css create mode 100644 docs/sphinx/_static/css/tables.css create mode 100644 docs/sphinx/_static/images/overviews/evthandler_unlink_after.png create mode 100644 docs/sphinx/_static/images/overviews/evthandler_unlink_before.png create mode 100644 docs/sphinx/_static/images/overviews/overview_events_chain.png create mode 100644 docs/sphinx/_static/images/overviews/overview_events_winstack.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_00.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_01.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_02.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_03.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_04.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_05.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_06.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_07.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_08.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_09.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_10.png create mode 100644 docs/sphinx/_static/images/overviews/overview_sizer_11.png create mode 100644 docs/sphinx/_static/images/overviews/overview_splitter_3d.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/api.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/appearance.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/available.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/background.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/base.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/cell_blue.jpg create mode 100644 docs/sphinx/_static/images/sphinxdocs/cell_grey.jpg create mode 100644 docs/sphinx/_static/images/sphinxdocs/cell_grey.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/central_bar.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/class_hierarchy.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/class_summary.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/description.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/events.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/extra_styles.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/file_info.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/globals.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/indices.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/info.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/layout.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/license.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/link.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/method_summary.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/minus2.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/navigation.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/note.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/orange_gradient.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/other_info.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/overload.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/phoenix_main.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/phoenix_small.ico create mode 100644 docs/sphinx/_static/images/sphinxdocs/phoenix_small.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/phoenix_title.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/phoenix_top.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/platforms.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/plus2.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/property_summary.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/python.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/seealso.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/settings.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/styles.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/sub_classes.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/super_classes.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/table_contents.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/ticks_green.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/ticks_red.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/todo.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/todo_big.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/usage.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/viewmag.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/warning.png create mode 100644 docs/sphinx/_static/images/sphinxdocs/whatsnew.png create mode 100644 docs/sphinx/_static/images/stock/gtk-about.png create mode 100644 docs/sphinx/_static/images/stock/gtk-add.png create mode 100644 docs/sphinx/_static/images/stock/gtk-apply.png create mode 100644 docs/sphinx/_static/images/stock/gtk-bold.png create mode 100644 docs/sphinx/_static/images/stock/gtk-cancel.png create mode 100644 docs/sphinx/_static/images/stock/gtk-cdrom.png create mode 100644 docs/sphinx/_static/images/stock/gtk-clear.png create mode 100644 docs/sphinx/_static/images/stock/gtk-close.png create mode 100644 docs/sphinx/_static/images/stock/gtk-convert.png create mode 100644 docs/sphinx/_static/images/stock/gtk-copy.png create mode 100644 docs/sphinx/_static/images/stock/gtk-cut.png create mode 100644 docs/sphinx/_static/images/stock/gtk-delete.png create mode 100644 docs/sphinx/_static/images/stock/gtk-edit.png create mode 100644 docs/sphinx/_static/images/stock/gtk-execute.png create mode 100644 docs/sphinx/_static/images/stock/gtk-file.png create mode 100644 docs/sphinx/_static/images/stock/gtk-find-and-replace.png create mode 100644 docs/sphinx/_static/images/stock/gtk-find.png create mode 100644 docs/sphinx/_static/images/stock/gtk-floppy.png create mode 100644 docs/sphinx/_static/images/stock/gtk-go-back-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-go-down.png create mode 100644 docs/sphinx/_static/images/stock/gtk-go-forward-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-go-up.png create mode 100644 docs/sphinx/_static/images/stock/gtk-goto-bottom.png create mode 100644 docs/sphinx/_static/images/stock/gtk-goto-first-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-goto-last-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-goto-top.png create mode 100644 docs/sphinx/_static/images/stock/gtk-harddisk.png create mode 100644 docs/sphinx/_static/images/stock/gtk-help.png create mode 100644 docs/sphinx/_static/images/stock/gtk-home.png create mode 100644 docs/sphinx/_static/images/stock/gtk-indent-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-index.png create mode 100644 docs/sphinx/_static/images/stock/gtk-info.png create mode 100644 docs/sphinx/_static/images/stock/gtk-italic.png create mode 100644 docs/sphinx/_static/images/stock/gtk-jump-to-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-justify-center.png create mode 100644 docs/sphinx/_static/images/stock/gtk-justify-fill.png create mode 100644 docs/sphinx/_static/images/stock/gtk-justify-left.png create mode 100644 docs/sphinx/_static/images/stock/gtk-justify-right.png create mode 100644 docs/sphinx/_static/images/stock/gtk-network.png create mode 100644 docs/sphinx/_static/images/stock/gtk-new.png create mode 100644 docs/sphinx/_static/images/stock/gtk-no.png create mode 100644 docs/sphinx/_static/images/stock/gtk-ok.png create mode 100644 docs/sphinx/_static/images/stock/gtk-open.png create mode 100644 docs/sphinx/_static/images/stock/gtk-paste.png create mode 100644 docs/sphinx/_static/images/stock/gtk-preferences.png create mode 100644 docs/sphinx/_static/images/stock/gtk-print-preview.png create mode 100644 docs/sphinx/_static/images/stock/gtk-print.png create mode 100644 docs/sphinx/_static/images/stock/gtk-properties.png create mode 100644 docs/sphinx/_static/images/stock/gtk-quit.png create mode 100644 docs/sphinx/_static/images/stock/gtk-redo-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-refresh.png create mode 100644 docs/sphinx/_static/images/stock/gtk-remove.png create mode 100644 docs/sphinx/_static/images/stock/gtk-revert-to-saved-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-save-as.png create mode 100644 docs/sphinx/_static/images/stock/gtk-save.png create mode 100644 docs/sphinx/_static/images/stock/gtk-select-all.png create mode 100644 docs/sphinx/_static/images/stock/gtk-select-color.png create mode 100644 docs/sphinx/_static/images/stock/gtk-select-font.png create mode 100644 docs/sphinx/_static/images/stock/gtk-sort-ascending.png create mode 100644 docs/sphinx/_static/images/stock/gtk-sort-descending.png create mode 100644 docs/sphinx/_static/images/stock/gtk-spell-check.png create mode 100644 docs/sphinx/_static/images/stock/gtk-stop.png create mode 100644 docs/sphinx/_static/images/stock/gtk-strikethrough.png create mode 100644 docs/sphinx/_static/images/stock/gtk-undelete-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-underline.png create mode 100644 docs/sphinx/_static/images/stock/gtk-undo-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-unindent-ltr.png create mode 100644 docs/sphinx/_static/images/stock/gtk-yes.png create mode 100644 docs/sphinx/_static/images/stock/gtk-zoom-100.png create mode 100644 docs/sphinx/_static/images/stock/gtk-zoom-fit.png create mode 100644 docs/sphinx/_static/images/stock/gtk-zoom-in.png create mode 100644 docs/sphinx/_static/images/stock/gtk-zoom-out.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/no_appearance.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/bitmapbutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/button.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/checkbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/checklistbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/choice.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/collapsiblepane.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/combobox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/dataview.dataviewctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/gauge.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/listbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/notebook.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/radiobox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/radiobutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/searchctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/slider.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/spinbutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/spinctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/spinctrldouble.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/staticbitmap.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/staticbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/statictext.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/textctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxgtk/togglebutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/bitmapbutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/button.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/checkbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/checklistbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/choice.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/collapsiblepane.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/combobox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/dataview.dataviewctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/gauge.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/listbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/notebook.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/radiobox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/radiobutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/searchctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/slider.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/spinbutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/spinctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/spinctrldouble.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/staticbitmap.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/staticbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/statictext.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/textctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmac/togglebutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/aui.auimdiparentframe.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/aui.framemanager.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/bitmapbutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/button.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/checkbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/checklistbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/choice.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/collapsiblepane.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/combobox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/dataview.dataviewctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/dialog.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/frame.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/gauge.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/listbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/miniframe.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/notebook.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/radiobox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/radiobutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/searchctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/slider.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/spinbutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/spinctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/spinctrldouble.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/staticbitmap.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/staticbox.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/statictext.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/textctrl.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/togglebutton.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/wizard.pywizardpage.png create mode 100644 docs/sphinx/_static/images/widgets/fullsize/wxmsw/wizard.wizardpagesimple.png create mode 100644 docs/sphinx/_static/javascript/header.js create mode 100644 docs/sphinx/_templates/gallery.html create mode 100644 docs/sphinx/_templates/indexsidebar.html create mode 100644 docs/sphinx/_templates/layout.html create mode 100644 docs/sphinx/_templates/main.html create mode 100644 docs/sphinx/availability.py create mode 100644 docs/sphinx/conf.py create mode 100644 docs/sphinx/make.bat create mode 100644 docs/sphinx/rest_substitutions/overviews/app_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/bitmap_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/bookctrl_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/common_dialogs_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/config_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/dc_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/dialog_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/dnd_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/events_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/font_encodings.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/font_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/index.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/log_classes_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/printing_framework_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/refcount_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/scrolling_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/sizers_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/splitterwindow_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/standard_event_identifiers.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/stock_items.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/validator_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/window_deletion_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/window_ids_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/window_sizing_overview.rst create mode 100644 docs/sphinx/rest_substitutions/overviews/window_styles_overview.rst create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/AcceleratorTable.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/App.SetTopWindow.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Bitmap.__init__.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/BoxSizer.AddSpacer.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/BusyCursor.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/CloseEvent.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/CollapsiblePane.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.3.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.4.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.5.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Control.SetLabelMarkup.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Cursor.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/DCClipper.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/DirDialog.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Event.Clone.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/EventBlocker.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/EventFilter.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopActivator.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopBase.Dispatch.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.SetNextHandler.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.3.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Frame.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsContext.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsRenderer.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/HeaderColumnSimple.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/IconBundle.GetIcon.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.ComputeHistogram.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.GetImageExtWildcard.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.Scale.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Image.__init__.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/KeyEvent.GetKeyCode.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Log.LogRecord.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Log.SetComponentLevel.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/LogChain.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.3.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.4.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.GetLabelText.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.SetItemLabel.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.__init__.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/NonOwnedWindow.SetShape.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/PlatformInfo.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Point.SetDefaults.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.DoPrepareDC.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.SetScrollbars.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/SearchCtrl.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/SingleInstanceChecker.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Size.SetDefaults.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddSpacer.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddStretchSpacer.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.3.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.MSWGetShellDir.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.UseAppInfo.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/StaticBoxSizer.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/TextCompleterSimple.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/TextCtrl.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/TimerEvent.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Validator.SetWindow.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.DoUpdateWindowUI.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.Fit.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.HandleWindowEvent.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.3.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessEvent.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessWindowEvent.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.PushEventHandler.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMaxClientSize.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMinClientSize.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetScrollbar.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/Window.UpdateWindowUI.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/WindowModalDialogEvent.Clone.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewRenderer.DisableEllipsize.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/functions.DirSelector.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.1.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.2.py create mode 100644 docs/sphinx/rest_substitutions/snippets/python/converted/functions.MessageBox.1.py create mode 100644 docs/sphinx/rest_substitutions/tables/ColourDatabase.1.rst create mode 100644 docs/sphinx/rest_substitutions/tables/Sizer.1.rst create mode 100644 docs/sphinx/rest_substitutions/tables/VScrolledWindow.1.rst create mode 100644 sphinxtools/__init__.py create mode 100644 sphinxtools/constants.py create mode 100644 sphinxtools/inheritance.py create mode 100644 sphinxtools/postprocess.py create mode 100644 sphinxtools/templates.py create mode 100644 sphinxtools/utilities.py create mode 100644 src/app_ex.py diff --git a/TODO.txt b/TODO.txt index af9fc370..64ce94fb 100644 --- a/TODO.txt +++ b/TODO.txt @@ -129,11 +129,6 @@ build.py unnecesary rebuilds. -Deprecated C++ items ---------------------- - * Does Doxygen have a standard way to mark items as deprecated - that will also be tagged as such in the XML? - wxProgressDialog ---------------- @@ -141,6 +136,25 @@ wxProgressDialog * and wxProgressDialog inherits from the generic version +Generated Unitests +------------------ + * Autogenerate a skeleton unittest module for each etg module. + * It can traverse the items in the module object and use a test + template based on what kind of item it is. Templates could + include toplevel window tests, non-toplevel window, event + binder, event class, etc. + * If the file already exists then don't overwrite it. Or perhaps + we could have a "# AUTOGENERATED" tag in the file that means that + it can be overwritten. If a human wants to take over the file and + add additional tests then they just need to remove that tag. + + + +Deprecated C++ items +--------------------- + * Does Doxygen have a standard way to mark items as deprecated + that will also be tagged as such in the XML? + other dev stuff --------------- @@ -160,48 +174,10 @@ other dev stuff * Word-wrap the briefDoc strings used for %Docstring directives - * For full coverage of what was in the Classic core modules we'll need ETG - files for the following: + * It looks like the code that is flattening the element nodes to + extract the briefDocs is not getting some spaces that should be in + there, probably where some tags are being removed. - * filesys, fs_mem, fs_inet, fs_arch (with wxZipFSHandler typedef) - * taskbar - * all missing common dialogs - * print (as in print framework classes) - * mdi (die mdi! die!) - * scrollbar - * toolbar - * listctrl - * treectrl - * dirctrl - * cshelp - * dragimag - * datectrl - * hyperlink - * pickerbase, clrpicker, filepicker, fontpicker - * filectrl - * infobar - * commandlinkbutton - * axbase - * settings - * sysopt - * tipdlg - * check for items missing from _functions.i and _misc.i - * joystick - * sound - * mimetype - * artprov - * datetime, or make it be a MappedType for Python date objects? - * clipbrd, dnd, finish dataobj - * power - * about - * uiaction - - - - * Divide Phoenix core into multiple modules. Perhaps using the same - divisions that a wx multi-lib build uses would be a good idea. - - @@ -291,6 +267,7 @@ way: * The tool should be able to be used to answer questions about the data for a single scan like: + * number of classes * list of all class names * list of methods in class Foo diff --git a/build.py b/build.py index 5583db8b..21da3ecb 100755 --- a/build.py +++ b/build.py @@ -19,6 +19,9 @@ import urllib2 from distutils.dep_util import newer, newer_group from buildtools.config import Config, msg, opj, posixjoin, loadETG, etg2sip, findCmd + +from sphinxtools.postprocess import SphinxIndexes, MakeHeadings, PostProcess, GenGallery + import buildtools.version as version # defaults @@ -36,11 +39,11 @@ unstable_series = (version.VER_MINOR % 2) == 1 # is the minor version odd or ev isWindows = sys.platform.startswith('win') isDarwin = sys.platform == "darwin" -sipCurrentVersion = '4.13.1-snapshot-7ab562ae0e39' +sipCurrentVersion = '4.13.1-snapshot-98421b9cc511' sipCurrentVersionMD5 = { - 'darwin' : '2da0cc2ba853b2787499da0596b4e8ac', - 'win32' : '45673b36d6885632ad0f273c496a1383', - 'linux2' : 'f7971044b97f7fc7650fef2189517937', + 'darwin' : '1d5ae7c54b768a77d951df3bae15a33e', + 'win32' : 'abe8ff9ff1804f9cf6def83712643187', + 'linux2' : 'fbab55f36f05dfbf31d4968ce187abb8', # TODO: linux build needs updated!! } toolsURL = 'http://wxpython.org/Phoenix/tools' @@ -59,6 +62,8 @@ Usage: ./build.py [command(s)] [options] next build etg Run the ETG scripts that are out of date to update their SIP files + sphinx Run the documentation building process using Sphinx (this + needs to be done after dox and etg) sip Run sip test Run the unit test suite test_* Run just one test module @@ -108,7 +113,8 @@ def main(args): testOne(cmd, options, args) elif cmd in ['dox', 'doxhtml', 'etg', 'sip', 'touch', 'test', 'build_wx', 'build_py', 'build', 'bdist', - 'clean', 'clean_wx', 'clean_py', 'cleanall']: + 'clean', 'clean_wx', 'clean_py', 'cleanall', + 'sphinx']: function = globals()[cmd] function(options, args) else: @@ -424,7 +430,7 @@ def dox(options, args): def doxhtml(options, args): msg('Running command: doxhtml') - #_doDox('html') + _doDox('html') _doDox('chm') @@ -432,6 +438,11 @@ def doxhtml(options, args): def etg(options, args): msg('Running command: etg') pwd = pushDir(phoenixDir()) + + sphinxDir = os.path.join(phoenixDir(), 'docs', 'sphinx') + + clean_sphinx(sphinxDir, full=True) + etgfiles = glob.glob('etg/_*.py') for script in etgfiles: sipfile = etg2sip(script) @@ -448,7 +459,65 @@ def etg(options, args): if newer_group(deps, sipfile): runcmd('%s %s --sip' % (PYTHON, script)) - + # Copy the rst files into txt files + restDir = os.path.join(sphinxDir, 'rest_substitutions', 'overviews') + rstFiles = glob.glob(restDir + '/*.rst') + + for rst in rstFiles: + rstName = os.path.split(rst)[1] + txt = os.path.join(sphinxDir, os.path.splitext(rstName)[0] + '.txt') + shutil.copyfile(rst, txt) + + SphinxIndexes(sphinxDir) + GenGallery() + + +def clean_sphinx(sphinxDir, full=True): + + sphinxfiles = [] + + if full: + sphinxfiles = glob.glob(sphinxDir + '/*.txt') + sphinxfiles += glob.glob(sphinxDir + '/*.inc') + + pklfiles = glob.glob(sphinxDir + '/*.pkl') + lstfiles = glob.glob(sphinxDir + '/*.lst') + + for f in sphinxfiles + pklfiles + lstfiles: + os.remove(f) + + +def sphinx(options, args): + + sphinxDir = os.path.join(phoenixDir(), 'docs', 'sphinx') + + if not os.path.isdir(sphinxDir): + raise Exception('Missing sphinx folder in the distribution') + + textFiles = glob.glob(sphinxDir + '/*.txt') + if not textFiles: + raise Exception('No documentation files found. Please run "build.py touch etg" first') + + todos = os.path.join(phoenixDir(), 'TODO.txt') + migration_guide = os.path.join(phoenixDir(), 'docs', 'MigrationGuide.txt') + + if os.path.isfile(migration_guide): + shutil.copy(migration_guide, sphinxDir) + + if os.path.isfile(todos): + shutil.copy(todos, sphinxDir) + + MakeHeadings() + + pwd = pushDir(sphinxDir) + runcmd('make html') + + buildDir = os.path.join(sphinxDir, 'build') + PostProcess(buildDir) + + clean_sphinx(sphinxDir, full=False) + + def sip(options, args): msg('Running command: sip') cfg = Config() @@ -894,7 +963,7 @@ def bdist(options, args): if environ_script: tarball.add(environ_script, os.path.join(rootname, os.path.basename(environ_script))) tarball.close() - + if options.upload_package: print "Preparing to upload package..." configfile = os.path.join(os.getenv("HOME"), "phoenix_package_server.cfg") @@ -917,7 +986,7 @@ def bdist(options, args): ftp.close() print "Upload complete!" - + print "Release built at %s" % tarfilename diff --git a/docs/sphinx/Makefile b/docs/sphinx/Makefile new file mode 100644 index 00000000..68b138ec --- /dev/null +++ b/docs/sphinx/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/wxPythonPhoenix.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/wxPythonPhoenix.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/wxPythonPhoenix" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/wxPythonPhoenix" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/sphinx/_static/css/basic.css b/docs/sphinx/_static/css/basic.css new file mode 100644 index 00000000..a4ebd156 --- /dev/null +++ b/docs/sphinx/_static/css/basic.css @@ -0,0 +1,510 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +.align-left { + text-align: left; +} + +.align-center { + clear: both; + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.refcount { + color: #060; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} diff --git a/docs/sphinx/_static/css/default.css b/docs/sphinx/_static/css/default.css new file mode 100644 index 00000000..59dad367 --- /dev/null +++ b/docs/sphinx/_static/css/default.css @@ -0,0 +1,227 @@ +/** + * Sphinx stylesheet -- default theme + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} \ No newline at end of file diff --git a/docs/sphinx/_static/css/gallery.css b/docs/sphinx/_static/css/gallery.css new file mode 100644 index 00000000..ed4d3f9e --- /dev/null +++ b/docs/sphinx/_static/css/gallery.css @@ -0,0 +1,47 @@ + \ No newline at end of file diff --git a/docs/sphinx/_static/css/phoenix.css b/docs/sphinx/_static/css/phoenix.css new file mode 100644 index 00000000..9ae04ea7 --- /dev/null +++ b/docs/sphinx/_static/css/phoenix.css @@ -0,0 +1,640 @@ +@import "default.css"; +@import "tables.css"; + +img { + border: 0; + max-width: 100%; + horizontal-align: center; +} + +/** + * Spacing fixes + */ + +div.body p, div.body dd, div.body li { + line-height: 125%; +} + +ul.simple { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} + +/* spacing around blockquoted fields in parameters/attributes/returns */ +td.field-body > blockquote { + margin-top: 0.1em; + margin-bottom: 0.5em; +} + +/* spacing around example code */ +div.highlight > pre { + padding: 2px 5px 2px 5px; +} + +/* spacing in see also definition lists */ +dl.last > dd { + margin-top: 1px; + margin-bottom: 5px; + margin-left: 30px; +} + +div.quotebar { + background-color: #f8f8f8; + max-width: 250px; + float: right; + padding: 2px 7px; + border: 1px solid #ccc; +} + +/** + * Hide dummy toctrees + */ + +ul { + padding-top: 0; + padding-bottom: 0; + margin-top: 0; + margin-bottom: 0; +} +ul li { + padding-top: 0; + padding-bottom: 0; + margin-top: 0; + margin-bottom: 0; +} +ul li a.reference { + padding-top: 0; + padding-bottom: 0; + margin-top: 0; + margin-bottom: 0; +} + +/** + * Make high-level subsections easier to distinguish from top-level ones + */ +div.body h3 { + background-color: transparent; +} + +div.body h4 { + border: none; + background-color: transparent; +} + +/** + * Scipy colors + */ + +body { + background-color: rgb(100,135,220); +} + +div.document { + background-color: rgb(230,230,230); + position: relative; + z-index: 0; + top: 30px; +} + +div.sphinxsidebar { + background-color: rgb(230,230,230); + z-index: 1; + left: 0; + top: 30px; + bottom: 0; +} + +div.related { + font-size: 1em; + position: fixed; + line-height: 30px; + position: fixed; + height: 30px; + z-index: 1; + left: 0; + right: 0; + top: 0; +} + +div.related ul { + background-image: url('../images/sphinxdocs/navigation.png'); + height: 2em; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + color: rgb(100, 100, 100); +} + +div.related ul li { + margin: 0; + padding: 0; + height: 2em; + float: left; +} + +div.related ul li.right { + float: right; + margin-right: 5px; +} + +div.related ul li a { + margin: 0; + padding: 0 5px 0 5px; + line-height: 1.75em; + color: #EE9816; +} + +div.related ul li a:hover { + color: #3CA8E7; +} + +div.sphinxsidebar h3 { + color: rgb(0,102,204); +} + +div.sphinxsidebar h3 a { + color: rgb(0,102,204); +} + +div.sphinxsidebar h4 { + color: rgb(0,82,194); +} + +div.sphinxsidebar p { + color: black; +} + +div.sphinxsidebar a { + color: #355f7c; +} + +div.sphinxsidebar ul.want-points { + list-style: disc; +} + +.field-list th { + color: rgb(0,102,204); +} + +.floatleft { + position: relative; + float:left; + text-align:center; +} + +.floatcenter { + position:relative; + float:none; + text-align:center; +} + +.floatright { + position: relative; + float:right; + text-align:center; +} + +/** + * Extra admonitions + */ + +div.return { + color: rgb(0,0,255); +} + +div.tip { + background-color: #ffffe4; + border: 1px solid #ee6; +} + +div.availability { + background-color: #e8f7c4; + border: 1px solid #adff2f; +} + +div.plot-output { + clear-after: both; +} + +div.plot-output .figure { + float: center; + text-align: center; + margin-bottom: 0; + padding-bottom: 0; +} + +div.plot-output .caption { + margin-top: 2; + padding-top: 0; +} + +div.plot-output p.admonition-title { + display: none; +} + +div.plot-output:after { + content: ""; + display: block; + height: 0; + clear: both; +} + +.doctodo { + background-color: #ccccff; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #cc99ff; +} + +.docwarning { + background-color: #ffe4e4; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #f66; +} + +.doccaution { + background-color: #ff9900; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #f66; +} + +.docimportant { + background-color: #ffcc33; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #f66; +} + +.doctip { + background-color: #ccff66; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #f66; +} + +.docavailability { + background-color: #e8f7c4; + padding: 10px; + margin: 0 -20px 0 -20px; + border-bottom: 1px solid #adff2f; +} + +div.admonition p { + display: inline; +} + +div.admonition { + background-color: #98F5FF; + border: 1px solid #00B2EE; + text-align: justify; + background-image: url('../images/sphinxdocs/todo.png'); + background-repeat: no-repeat; + background-position: 5px 5px; + padding-left: 33px; +} + +.admonition tt { + background: #98F5FF; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; + text-align: justify; + background-image: url('../images/sphinxdocs/seealso.png'); + background-repeat: no-repeat; + background-position: 5px 5px; + padding-left: 33px; +} + +.seealso tt { + background: #ffc; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; + text-align: justify; + background-image: url('../images/sphinxdocs/warning.png'); + background-repeat: no-repeat; + background-position: 5px 5px; + padding-left: 33px; +} + +.warning tt { + background: #ffe4e4; +} + +div.todo { + background-color: #ccccff; + border: 1px solid #cc99ff; + text-align: justify; + background-image: url('../images/sphinxdocs/todo.png'); + background-repeat: no-repeat; + background-position: 5px 5px; + padding-left: 33px; +} + +.todo tt { + background: #ccccff; +} + +div.caution { + background-color: #ccffff; + border: 1px solid #99ccff; + text-align: justify; +} + +.caution tt { + background: #ccccff; +} + +div.important { + background-color: #ffcc33; + border: 1px solid #ff9900; + text-align: justify; +} + +.important tt { + background: #ffcc33; +} + +div.tip { + background-color: #ccff33; + border: 1px solid #33cc33; + text-align: justify; +} + +.tip tt { + background: #ccff33; +} + + +div.note { + background-color: #eee; + border: 1px solid #ccc; + text-align: justify; + background-image: url('../images/sphinxdocs/info.png'); + background-repeat: no-repeat; + background-position: 5px 5px; + padding-left: 33px; +} + +.note tt { + background: #eee; +} + +div.availability { + background-color: #e8f7c4; + border: 1px solid #adff2f; + text-align: justify; + background-image: url('../images/sphinxdocs/available.png'); + background-repeat: no-repeat; + background-position: 5px 5px; + padding-left: 33px; +} + +.availability tt { + background: #e8f7c4; +} + + + p.admonition-title { + margin: 10px 10px 5px 0px; + font-weight: bold; +} + + .gallery_class table { float: left; + margin: 0 5px 20px 0; } + .gallery_class table { border-collapse: collapse; } + .gallery_class table td { padding: 0; } + .gallery_class table caption { font-size: 80%; } + .gallery .caption { height: 4em; vertical-align: top; } + .gallery table { width: 200px; } + + +/** + * Styling for field lists + */ + +table.field-list th { + border-left: 1px solid #aaa !important; + padding-left: 5px; +} + +table.field-list { + border-collapse: separate; + border-spacing: 10px; +} + +/** + * Styling for footnotes + */ + +table.footnote td, table.footnote th { + border: none; +} + +pre { + font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', 'Trebuchet MS', monospace; + font-size: 0.95em; + letter-spacing: 0.015em; + padding: 0.5em; + border: 1px solid #ccc; + background-color: #f8f8f8; +} + +cite, code, tt { + font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', 'Trebuchet MS', monospace; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + + +a em { + color: #CA7900; + background-color: transparent; + font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', 'Trebuchet MS', monospace; + font-weight: bold; + border: 0; + letter-spacing: 0.01em; + font-style: normal; + font-size: 0.95em; + letter-spacing: 0.01em; +} + +a em:hover { + color: #2491CF; +} + +a:hover { + color: #2491CF; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +a tt { + background-color: transparent; + font-weight: bold; + border: 0; + color: #CA7900; +} + +a tt:hover { + color: #2491CF; +} + +.panel { +position: fixed; +top: 60px; +right: 0; +display: none; +background: #000000; +border:1px solid #111111; +font-family: 'Calibri', 'Deja Vu Sans', 'Bitstream Vera Sans', 'Trebuchet MS', monospace; +-moz-border-radius-topleft: 20px; +-webkit-border-top-left-radius: 20px; +-moz-border-radius-bottomleft: 20px; +-webkit-border-bottom-left-radius: 20px; +width: 200px; +height: auto; +padding: 20px 30px 30px 30px; +filter: alpha(opacity=85); +opacity: .85; +} + +.panel p{ +margin: 0 0 15px 0; +padding: 0; +color: #cccccc; +} + +.panel a, .panel a:visited{ +margin: 0; +padding: 0; +color: #CA7900; +text-decoration: none; +border-bottom: 1px solid #CA7900; +} + +.panel a:hover, .panel a:visited:hover{ +margin: 0; +padding: 0; +color: #2491CF; +text-decoration: none; +border-bottom: 1px solid #2491CF; +} + +a.trigger{ +position: fixed; +text-decoration: none; +top: 80px; right: 0; +font-size: 20px; +letter-spacing:-1px; +font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', 'Trebuchet MS', monospace; +color:#fff; +padding: 20px 40px 20px 15px; +font-weight: 700; +background:#333333 url('../images/sphinxdocs/plus2.png') 85% 55% no-repeat; +border:1px solid #444444; +-moz-border-radius-topleft: 20px; +-webkit-border-top-left-radius: 20px; +-moz-border-radius-bottomleft: 20px; +-webkit-border-bottom-left-radius: 20px; +-moz-border-radius-bottomright: 0px; +-webkit-border-bottom-right-radius: 0px; +display: block; +} + +a.trigger:hover{ +position: fixed; +text-decoration: none; +top: 80px; right: 0; +font-size: 20px; +letter-spacing:-1px; +font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', 'Trebuchet MS', monospace; +color:#fff; +padding: 20px 40px 20px 20px; +font-weight: 700; +background:#222222 url('../images/sphinxdocs/plus2.png') 85% 55% no-repeat; +border:1px solid #444444; +-moz-border-radius-topright: 20px; +-webkit-border-top-right-radius: 20px; +-moz-border-radius-bottomright: 20px; +-webkit-border-bottom-right-radius: 20px; +-moz-border-radius-bottomleft: 0px; +-webkit-border-bottom-left-radius: 0px; +display: block; +} + +a.active.trigger { +background:#222222 url('../images/sphinxdocs/minus2.png') 85% 55% no-repeat; +} + +.columns{ +clear: both; +width: 330px; +padding: 0 0 20px 0; +line-height: 22px; +} + +.colleft{ +float: left; +width: 130px; +line-height: 22px; +} + +.colright{ +float: right; +width: 130px; +line-height: 22px; +} + +/** + * Code block. + * The border colour should be a darker shade of the background colour. + * The hex code #E8D898 used below is a pale, light grayish amber. + */ +pre { + padding: 5px; + background-color: #FFFFE5; + color: #333333; + line-height: 120%; + border: 1px solid #E8D898; + border-left: none; + border-right: none; +} + +/** + * Commands or code within text. The hex code #EAEAF8 used below is a + * pale, light grayish blue. + */ +tt { + background-color: #EAEAF8; + padding: 0 1px 0 1px; + font-size: 0.95em; +} \ No newline at end of file diff --git a/docs/sphinx/_static/css/pygments.css b/docs/sphinx/_static/css/pygments.css new file mode 100644 index 00000000..79da57be --- /dev/null +++ b/docs/sphinx/_static/css/pygments.css @@ -0,0 +1,61 @@ +.hll { background-color: #ffffcc } +.c { color: #408090; font-style: italic } /* Comment */ +.err { border: 1px solid #FF0000 } /* Error */ +.k { color: #007020; font-weight: bold } /* Keyword */ +.o { color: #666666 } /* Operator */ +.cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.cp { color: #007020 } /* Comment.Preproc */ +.c1 { color: #408090; font-style: italic } /* Comment.Single */ +.cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.gd { color: #A00000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.gi { color: #00A000 } /* Generic.Inserted */ +.go { color: #303030 } /* Generic.Output */ +.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.gt { color: #0040D0 } /* Generic.Traceback */ +.kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #007020 } /* Keyword.Pseudo */ +.kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #902000 } /* Keyword.Type */ +.m { color: #208050 } /* Literal.Number */ +.s { color: #4070a0 } /* Literal.String */ +.na { color: #4070a0 } /* Name.Attribute */ +.nb { color: #007020 } /* Name.Builtin */ +.nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.no { color: #60add5 } /* Name.Constant */ +.nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.ne { color: #007020 } /* Name.Exception */ +.nf { color: #06287e } /* Name.Function */ +.nl { color: #002070; font-weight: bold } /* Name.Label */ +.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.nt { color: #062873; font-weight: bold } /* Name.Tag */ +.nv { color: #bb60d5 } /* Name.Variable */ +.ow { color: #007020; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #208050 } /* Literal.Number.Float */ +.mh { color: #208050 } /* Literal.Number.Hex */ +.mi { color: #208050 } /* Literal.Number.Integer */ +.mo { color: #208050 } /* Literal.Number.Oct */ +.sb { color: #4070a0 } /* Literal.String.Backtick */ +.sc { color: #4070a0 } /* Literal.String.Char */ +.sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.s2 { color: #4070a0 } /* Literal.String.Double */ +.se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.sh { color: #4070a0 } /* Literal.String.Heredoc */ +.si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.sx { color: #c65d09 } /* Literal.String.Other */ +.sr { color: #235388 } /* Literal.String.Regex */ +.s1 { color: #4070a0 } /* Literal.String.Single */ +.ss { color: #517918 } /* Literal.String.Symbol */ +.bp { color: #007020 } /* Name.Builtin.Pseudo */ +.vc { color: #bb60d5 } /* Name.Variable.Class */ +.vg { color: #bb60d5 } /* Name.Variable.Global */ +.vi { color: #bb60d5 } /* Name.Variable.Instance */ +.il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/sphinx/_static/css/tables.css b/docs/sphinx/_static/css/tables.css new file mode 100644 index 00000000..38ebf751 --- /dev/null +++ b/docs/sphinx/_static/css/tables.css @@ -0,0 +1,57 @@ + +.pretty-table { + font-family: verdana,arial,sans-serif; + color:#333333; + border-width: 1px; + border-color: #999999; + border-collapse: collapse; +} +.pretty-table th { + background:#b5cfd2 url('../images/sphinxdocs/cell-blue.jpg'); + border-width: 1px; + padding: 8px; + vertical-align: middle; + border-style: solid; + border-color: #999999; +} +.pretty-table td { + background:#dcddc0 url('../images/sphinxdocs/cell-grey.jpg'); + border-width: 1px; + padding: 3px; + vertical-align: middle; + border-style: solid; + border-color: #999999; +} + +.pretty-table caption +{ + caption-side: bottom; + font-size: 0.9em; + font-style: italic; + text-align: right; + padding: 0.5em 0; +} + +.pretty-table tr:hover th, .pretty-table tr:hover td +{ + background-color: #632a2a; + color: #0000ff; + background:#b5cfd2 url('../images/sphinxdocs/orange_gradient.png'); +} + +.pretty-table tr:hover th[class=head] +{ + background:#b5cfd2 url('../images/sphinxdocs/cell-blue.jpg'); + color:#0066CC; +} + +.pretty-table tr:hover tt, .pretty-table tr:hover tt +{ + background-color: #632a2a; + background:#b5cfd2 url('../images/sphinxdocs/orange_gradient.png'); +} + +.pretty-table td tt +{ + background: #E0E0E0 url('../images/sphinxdocs/cell-grey.jpg'); +} diff --git a/docs/sphinx/_static/images/overviews/evthandler_unlink_after.png b/docs/sphinx/_static/images/overviews/evthandler_unlink_after.png new file mode 100644 index 0000000000000000000000000000000000000000..f96ffcc7dfb9d61eadea10c731d4b464e62005f8 GIT binary patch literal 12337 zcmd6NWmJ`Ix9*|@Q6vOZ5D)|bDQQLNE&(MLu_y^ik(LxesTWbYyCfGS9TG|-9TFGoM#M%tjEO@_dVw|uX$ZFQ1!7a5g`>J0)Zfsmy>#eKwy1< zpKtBh`{-07b`n8xLDd~r-TNereC?5gzhRFn=s1_pRpS(h+H4Kjv46Lx(x z$esCa>Ow_C(67sv)N`t<4|_$=Ol%WGy-!;Lua=s1|Nh6-S-7}*hlV0a(h3S}%+0US z(42Um?Rmp{lFt~GT|lJZ6&n55av)T3eDDy1V*j*4|2WmiJgHssYHPl~|4CsUVs2n$ zgqWCkp_)+Hr_s1MOF7=GM^~)lPu+BsTmuC?Zfxrn4}O0l0Re$fT49FNNg;rRZ zxw*IS1$2-|a!N{jRFF*L4a(pw&N~GhRh-xn%TA;Z&>t}jd<2};IRCjn|Nepg#WVhk zQ$K@Sf8XFWvqN2QZ)$2fJ~^o>OdGSzZLcW3kC|-tznt7*8T!p7tc+aKJz{sxjp6%3 z{@z|hLPD+82xnoQp^Bbf!u$7Eytnr^WUt)(S$%!?_~p@VHNRC(JG&Z<{AiQ*`rM1L zEBTm)k5_B7SJiaXFLU@rhK2Dg1alQ;XW63&-1Y0dXc}J7owfPk=;-LM85>s?`V)Qg zK0VM;=r}pr`*e|Af`H!5%?*Odde?R4Ylw2ZK=D|5nZ-cX&SIZ$H|;`KtmMcGDpPZF z0~O_+wJFd2#Xh}}rgw9fuHCsQq+a1Jm`u_%&`_JCrxpETT3>Q^;zj*oE=23kw1)^)+=jRT?6-b? z*RNkEc-u6Pt#a+!wY~M}vu||Xhy$gGZ+|EPE|ou^fVjf3N|Heq3D z+2Mpr@wne?8T)%?hK7cww6t_YI5;?5A|#|0@wiSy)9oak zLPn4u)jl@%swd&WBii24QP-2horRvn&bGFn)hra7ySwlI`fGOUKqA#{bGF^QH)*b# zLG>c8X6NkE5^L4!{Crk=dU#S&kCAZh{Ol}am5rt4;qnmMm0+wPal>+@^78Vq9}FMm z7|C8DFJE$fl(da1Ms{g1r97!zEG$eCW~ho~WK*s;&(6vk9vZT+vbrkqCH6bLbm0?9VeZkhCSembjC-7{ zo&|E@OiWC_e*Jw)x(K=csj+Sjz}|_{6}&h`VWXbMyD_-^Rwq+uPgfeIi37 z$g|sQY*s6y#qfkyBZV3YzQ)D-8#CV`BP0DtN_H=8G8$+;;y&{ArM6g?5g{RykkfeU z;nO;^p;@F~=eA>shska#e)cV6{oUL1qkTYiwxZ<^js(H0t)ST{rmEQ4qMF$vC2dl( zfh3YADAdWHU(L>|;~NpAMl=tdAGzL%AZeyU5q&1*ipy+oV%P$e|r`cF)a$(+KO_i?)ZLn7wf z!9r9G0|SGCqGEbl+N_mNV0Kqm7a%sz*>s)z-VUZ=W@&rcfak^CBr)ad@nM`^8Nt)u z*=>KJwTkq|#>c6sscWkKK5A-s&pK(0#KpzAxw!$Af1r(U9!__pnO11D-_VqnZvBXZ z|5Z65C+MrjukLt3Uh|%b25(UZK^B&r2fc2xk50P#`%5Y-D|2&$x&rAF-5HW{2G#vc z^>16v!+w6Yojhz0XZ{4oliMt9G)7;(e1ZFznwmb%etfdma8~zf%k1jas~YT4e0QC7 zBXNf_mIf+3&Q5Y(&g4`&yF#kHocVgPGh)z%;^i%c&EQWcIM`qu6N(MdU?CqL9ew1s z9dP;L?E(&s`bR`l3_c3?Naue_40rMK^LrleZ$OeV{GeMe_naS_C_}%8mXYQ@pg@wJfN%w=zxxT(W9i806 z6-J7hf?UpO*{;MRQm$*ovpGuzYcjhQRn-m936bXiY)q9-UU<-pKTQI|Enr_)n*j*b(b zZQ?5`T=FyvkevCfb8~Y(K0emFqt7Es&4zL{!dxU*T({FCQ+VV-88+R|~)7IAyuZ|}k?2PnzhtfW<`}4DV+IxL*g`JQ0 zVQdWYLo~BC7vPwNhQ`^az+Q8P+P=V`JSgOo)jPr0xTrk&n3)%v-d=);*Hkc2P}9=d z`|+aTB?`|yhV7l6)|Xh#0-cl7qxFz1isr7a{KCS=(sg;OwnxbqB1bhPlY0{%YFjd9 zy$Zfor2m<{(x9QF|B1O^1)a+ppVegCtLO6>@?m53??Y(#ZS|gBr4Y28sAPSbHBtL& z3$P*EWe-qSYBSc z+R>tUDN)FY@XD1dgoMk(1wWF6-8uCtQ_`>p9V$%!5YUf%c$ta&kWp*scBZ8huZ@*D zVTM0FJ*&}zkfIayf?%GJmzNI{y#`Sad#I~@t>AR4_+6>W=m8Q3z2HQ8@wttW5d>FG z!mfV9?&fAkXXmrE%>xf_Z|^(VH*el#EL{ac_q!#KF7!s}6M2JnRR@%iV@`g4er|4) zmP0^You|p)hrE0{BrT++O0vi~lzn=deTR|J4n^}ks#oNQ9T-(x+w<=!fEnVx_{3k6 z-7@IWr=2Y=CKHvAts!}Zh4ro*0KdPv8jg9aNADG4u$5mf53)XeI&hx$GjwMp1h{(9 z>F-I9A>W6FXzm#{zQ)3-{PEB-Jo7xSwiijWBhfaeVN4LW#?Hb3 z6EWI$b&DxfbTJf^lqI#&kjIHkhJ!W_u z`Za|CvUz?!pV&)9PFfo8+xqpH^L_}vamjjCQyA8xGvr3YZqGD-DNthCOpcK?{iPR6xO@k!Zn7Tw^ zcL5fbMX2emt*uaVYaJHe*VH_OmZSjM3MD0_`L5VfsN{uKsfa?Ox(X;|p;Y_|EaXB$ zLc6O!T(;)B^|Wxw*`TcD=L2n+ttJt=g`QF|GBScV?uzA&tvN4!rRFNIsTCSn&k1mc zkH$XR=-Sv6G&G1N_bzN5q|1hKva$kRE>v@-L?$LCCMD^gw?%KiV~wDveB~G|r|VB* zxSs(NXS_O6WZ(^jVs_T#$|am!<(PZF;B}XlmY|44Dz!-O$OM8Jm%-m zTd^^5apR@tz3_C86NO$PslQ|9I-|Y3yZ|1d)=bv8ENr*}FMS^ztXpDoQDj(^7#kz( z=jZnbumd(|C+p$;`Y|{fPD#(<;GT4KVXq| zkIre6mzT)V3HGH6L{!^f@ab6k-yHkw?5^t0%;~m|bCEC64r(nVX?f|*U@&=xys#Kn zr-JSd_V!UNX9{Z>cSl)sK0V-O>dayb)86#%7iMGY92<+h?j?5Y-!>_n^Qj4cc6bh0 z+1hl2!IvoDrfKQvBL%u62^`%W9m@bl95UkKGwSWl6W zsQFM)L~adh;zI<`2gU99Pcw0RoKNq)X6Ml&7eu zi1E~E8XtG-O%m48872QUY4;BAZcBm&1bCh2QPj5?JUl!ORP{Cl0S^8Z6Ej0jRBU{_ zgD&%TY=3^$KsR%Z^M|yZkW*4x886SE{#8 zCE!H)=#d~(aMvj`aH9*w^r7!=JCdQmf!{?4*gu4Os7VvNbaGmqZV0!A#p^dD$nWd{cUAG>1ilnS4lynz->2MM%f2*eI7@dEZ`jv* zb6s-6QJG+g->=fOczouRDC3wTPgo(QoT)jxey_A+noPp$U@qFv57#nndH>4hF}ENJ zQ^7Ekj$Gw_n5ZYzV;S0i7{a*AnXuiZW=Ju?e5TW+JmN=E`q>(Pc#VH{>^3yBb~|1T zjczC@=OU(~;j0o59g6{XzxL|NyAcYa;gzJYru_e$%>k_x|XxBV_t@v(4ot7+_f`U-hl zke`pl6sD#9u34{tR#4+sTU-0a*LQ4X1Bz#CY^?Pzk~rFDZe^v`ap{SGJ3Bl3>^<~+ zPokBDMZ1oRg@r{oQNEkn5OaXz#%*d!Nb}rEnYnl&r`*s`Vyj6C3W}H1NcMGcxKbQ7 zva#-+8viramrDvgwDZ+GuVrqb`81xY;iY_iPMH7U0|^cePO7Raw7c+5rzb~e`!k^c zlbC9C21dq~wzeEpjq}m&s{78ehN0n4;F*zIv_xtGt<=8)>d5nOS3<51Gvf^v-0jjx%WzxE^Zo}09x=GNA=!2W>Cnwpr{p(1i!-Q8tnWPqTgs@{LK zISbI%F-@74dy%SKnsm-qT`z?l{YY4tsbX?s0@}|0fq@74vY81935*rW%E|_HVHhn3 zj3ucC&+|b_>4~?hvPV3f&I=kvbO77Pd+ex zD=n7pdt1_YmzDJ*F>!BiZv%9A|JmeLaw^n4a4S2`IsE-BEK+7)$iB>nBZxBsZx}-0 ztwd^QsEU}_>%2TGKonR^VH#8+o2rkSnyINulr??flzo}s`PWg+zc*Z=XE|?lM&9O3 z{8Q8UQsXZw(%|+NvhDK}jBFt!68S6b5z;23QfcXmWG-!eN%Pif8PeA35qOl(Id7=p zQGt|YNvwwFoz9A0PW&#>nf*JbiBg&-4*L=xK~HW9H>9{|>_~edQi_7F#nf=J_LW1E z-$f8%AT$JO@|byeo){P;m#^g<4ZlUQd;R%|MenyVEf$cVR&G7U!^_J%L_Qjjn|pWo z(2@np-kk8_c)69e^9V__&knpaFep1DqVxUD2Te{FEfv@)>4e=JTZ1Sd-2F(5Egv&z zcDQIdZO+QijbsZ=ai*sCOw2t#6RWWiR zREloI;iY(jyBAUm{nHzHDj0lcL*k=V+Kb!+ee;ev&|I&F3T-aN7?eF%d-9|o zsB++Ez4$r*lSsWZp;G5t!&mG@1etyHlo)$Z&&PdFWyZ7|2K&?%P+A-D`jNJ{U_=J8GMpnpq2W?gcBD^%pqxGvkHyW^n>`ntTg1< zJ`lh4X-(PM|IX8uENZa(&6`BSGGtyd6Ii`5(- zAFGI-l=T^KHkRMD{O<8i`k5h?U~XO>h*Z>G(xhs5`KkBNrw*>!oBLwrc$X*#kJi}I zf*zBfjRiF|VsrAZ`?9yNwd0%)zph5Ypj5fQ+=mlYKm3812cd)V@+ z)ZWU?|C&l$seeWYzs11&Aus+8jPd5ZAJFdQUgR~DW_+22_Tl6vIx%({KqBl z%l^l`ScF9oITsbquMoTpH(+^F-)OAr=7IQmbIAL18b2B#hVzf7_{X1Mz5bfUh0YNX zLD;=t7S;XaZpg&U94wXQ(sPF_5E6)(av3Y76M8CYNeE(}axz?hXwN>3+6e8ZDjy^|`jL?xE9ii_Is5JiEv?Jd8zwiYxAE{~1<@Vng%#TG$ z=sTf*fGY#n6#ICU`SE3Hf&4yyTx@Y?=g%P_M4e3SvXezd+-|!o51`?ep`+rrB=08_ z`%EwS&Jiq`KL0GGSP4ZPQk@<&0X_IWQ2lrA@MslHOibKoz4)4;;doO~RaLbv5ZmV# zGjlfNY(fMhzR>x%>+9qSrxLmiSi{H zkxIDjEDu$@FnBY-hN!~D!vnF6R02#J8I%qwUN0INME!b?Pc4>lGf=_OWkQ5NJWEf% z-HFmgBL5tCL_K^{bE2xrNl0#y5Oj5Q zN7kq>FTFA{vazuNqbxl9>PWem;)f3({%m}s!(cG+aj`E^m#7JoACU%1NlQyhq^hpT zkbC+L41F{AH}eR6At%;oFgB*Ag~g#P*5F08`M9-rpj7S`n_L9S5g(xpj@|$4+Wti& z_xGtBHAA95JF7FRC={xD;>2y^cX^&BcLgfHz`?>`VO){2mnp}+an@G=#=jZ%hh39^=~if)}Pgby@HWIDDm(gcAq4_&s-Xc=Jnl104OtB&^jZWG;@Cl|ZI;Y$4ETjTOCjMZe}WUPUA zq|%N1u7Bp&8@N0U%fKic{nZQ+aEgW1C3&tbdgtZkg>#dNNtXQ-mZQN5CfPigs47xa zV02mF&|iW4wrlW0B_`}zPoK{8B$^fI@)CC^@U@qEy3ZRlP5bf-3XzIAlnn~Y_0gp+ zj^#zmge<+MOGTI(dHMZLH)`gyRC2-d_LETVMI#VY|Lnc~FLkZ+w%oVq=Te3?!bE!)kZUDDFj^agV`Wv&uL$j>%EfSCzT zdmR;|rlvA*u#h7W2v*igQr4^K@#E_7X z?Z1n6|>B||JO!kY2GD9^rwS$8LLV>jBhVUJ* z3t2`95M{2NQ5;WeN%bJ#{)a&FFJAJ?OG9ZXsXux%RayuHaogXs0JR`kD5`+n2LvN* zf`gMYN$^EddV0Fpt$Vz@)B@H>s9*FMWn~c~xbE)m@-sVNBA3(zAX4~(y!ufu4-XH) z{Q*hYIhqqiC35(?^^$>sfkayn1sn8G2K63QU|s{IT?YyT7!6TiY<6_AH+}o|?NB<= z9*?3YT3XSuwl7|IZ!fAXU4SJi7@xyJME(*%3puYmx3M{Cy=DOJdi}3-1CNbXs6)Iw zJV0!lm6iswLkkPnpbI|QTjy%8lntdNmC!?>zy{4s<|HAY>J~?&eALlv4hjjWb6n~_ z=e^2Bxw%3f`+p)>pE6psB5PeYz)%Ifd2Ve3-1|qg>mbS5S0E58PlFrn9UNdu#*YuS z0MRqEuaT3hYifdFJRCm_HL9^O<-yDkU{4Ld$~hzgR9UvSws`sY)ceU02lvK3tz&uhMR;#1!lz=|2i5!s z?B8&KZg*GL)R>uu#?a~+aOlSb@{b>{ftLFC@q5B(d_;sYYKn~KYY26PQS&?41jQ^Q z5~P6klbG2tRU5dE9kh<_HU zcZQ1$xNZnAv$N+;!sxEfSGFA6K}?OGrL^Q%UkDO1@CmfU1F$2Nl0{HUt*TO<`r?#!9`7i~$auhx z2?!vNm6c6Zy-r1?qom~NP zcT0+kV};#6XW*H!b69wYcmo3jf(L*ZHU^x|(AHM}=~G^(& z7{npJqN1XYA3r7~C4uSV)sizS6BD;?R0RspnK;g9vU13mL|(W4o<5| z9G`r3jN51HvETFacSs1vKig1KP-tjtvsyf2XSbfJeFe%o=)RujiNIgN?MyOTJ_RZc-LG-cUeruvf%OOT)DWOhw9U;I zlD!V)dAvbF06mn+1$1Vv1H9KDUOTRiYuqAP#9-WAT_MM=`L`54aEAR91mGzB*fwQl?f4tR8-Lt;1kX=xa7!e^wQ02ChD|V}`tIOkHlZk#7 z+&74u!oosG{^@EbD+vi~dJ`B|n4h07E-o&~qj_MTA;)N()HDk1(`fNCAjang|M&Al zwHV1x87%w$=0T4s?DgShC)WUs`S9?(yL^L;oID~rnz;@(=)dMBSjNUE*^y|_P9b0b z%tpq>9^AQ;)%SHIU%M2ZCz4GICLwMWzX@4k!a2h1c3dRZB|?RD|q|jC{SSC%a)Cu8|mxe)Tb);aW#o1J4}|Yip2D ztzfJJrcrnu=DWaQXe%rzD{};Xk8|Pj{#LIj{O2=c<2X_0&xf^d;w0F)%;cN|1qG{g zNrGF!_3q~YYmGz#?loZ7bB#-X!lG&BTPU^7qg%Ib0hX{+azXC_R9IhMAA*i7xD_rN z5D;KEe*o>VGWZw0$uFKikBN+AdS%;8QU*7pr4se>Xz)78xK#gg=7NKk5Sq%ykCdAF z$MY``oSG<=**#lpEDH}aKS_32Z1>LzxsnTaX~ z@IrvaDb2v2_oED|>|1+#xgI{O>8pX~2kSDd>ycSk3}BR&h6c9_)Fw|44=NNx`#`)K zEEhw~O4e|#$tN~8HloXyhx4^>zdAHe_MHFyyJ=!~YfBex=rfxNY{F^ryEr@L!otGe z^Cnc9kNeniPGc(WpUd-nO(*>9OVcrS4h{o-eex4q2%}U%+NLkhJ;L3Ib?^2hi?zWQxSWCbL4x0$nAK) zxV(G^wD*b0$-26__}tWAZ_%{EZgRF~2MfstpgDt*uBf2UV$4lH3so&lHWS0m&u==V zIy*b7uCBhlHmSS$p`pRMd3vU;rw6PaBW!iIL%@9C?HB2HhVAOa*QnpW;yU5cMj~M( zLQXRPhDBz(A3rsz?dXqe<2*{V5`o64wpPz=4zA`7rc+7L=IGd1$jt{l5C`|}eV?8d z1(|keNMn?ELnz+ef$L?c|RlutsB~Nk1G{jW zIJ6>03vK#SqI$gWt7aGcM8t zM_8V!JAx2}$*I^IFnr_*Qa$_-(FpN@-oVbTbU4BpM@5`O!UF>&F!2K_-8N>V7u2dv za>!I58X!QPGaD_fPJPHChg8+J+R2>4!uLTz#-~}V@kvQj@Tgk($c@?ds}gNs?PBVT zj9>!MbPjWQ#p6Z2MYf&;9+6$WN+;qWM__d7)~M6~3k}<7J5>ugaX!ui;c#eWzt|hda}Qu7CVU1O&Gdl_Y%B=z~LK9vl?JBPeJ9mkVQ3 zgrL&X)1yiXlN+R-)n9rxC3vP0g@Sd^HwMlHv>Vs}ICP~I6`{ew@jRx4TdLsunVFfv z;z0pFIXQuH)or2)BQu5ib%)KwqQG_~Sjd4`Y$u-`n?tx1=!+A5*@#(#;(zDP9niTV zYVcIOT_b%Am0S?t`9P~-ph)m!p{mG~gyYGT8g<#3fZVr=Z{jdXZw}@oL31k0~<~)5gJZviGSrJ0&r- zKv!p{B2Umf;MCg6$^?20EL9l3T$!rV2hf-aHtx70)r0mn1+XVdR!#>e6RP~v@GXKb@D zj)I5BKMw`(cSB0B^WsZz^RV-?@Jg2n)9#>WuU@~7)YWAZma>OAhi#H}(Ua|PlK>N4 z-5(dP-jSOky(h`2sHmc1PHTK&8BA&Cx;Xw#-ssj)Fs!Dk-Q2*cI_Wz~8BJCf| z%Ekt1nD9ga>ouhk>up;$DkPZgpm1u{UO~Ke2@^%@lw0!K{S;%0!bWf;ovR`$XWrTi WT-3Cmid4@h{pF<}OBG5OzWG1OE~?iK~ieFrT%8D{Ku-(E|o=yqBJh{b@ z(GiF=1Qsd$gS?{9*qCqTBeU=99&eyHFvdp;_BjZc5(K17!Ny*y}PF; zGb6*?!lL}2m;X)b`nNr?cvl_jq4tQ8t;y0{rBso&wlG6J&%2u$ z8m_Lb$p{LN{k*%TJs_Sw(A|AcNJxm2^Y>J_+1iifOv+ngd47I=$&YMSelg7)&s0;)>aul~_dJGiw(ev1rBBC)*LIu|tsg;4zGIy&F7v&+rK z3!8i}t{3t)Ha7M>R@Uw9Z4(S}FK(uVjEsz>j&LIb1Fq6k*ZnT$R96B@%D%OO>*vte za%hA-xqJ6+dV0FEvvV}FQVt~vf>()*aMxkpO-)S=p3k@ z>P_G?>jh^|5g#un!_`r>Ll?`C3&`RqQxoUbW7D?lCc~t`BB9IXMYY z^^cA5)6gs|g^TV?d|zeJzK;3`j3<97xghR^#Qtj%Fz7;JU`Kc&ArLI^!HM1ea@X>* zL2>FD3QH2CKyG%n>dTiyc&N)b?jKP1Hz!Mt3JVJzc4juF%JT{ew$mQ_m|w}LseQ7y zMX-PT_;F=*_2u*DL#0MaIVe2IP794*8X6j9nJA`?;_2_<+}YXLW%NiJ2Zx7R#d>Jl zEK@6sE&e}#{5Ux|$p{sq`sVO^F5|9KqbCxai}Eb}QMdWdOck~3F4Fa(-5*)0sHkq= zzMT;YK^hwyn{jt?XlQ@6FY#clKle6sr;4p@*}55KKx!)WGqqfjo1IaQzblDesC-^1 zDJ`vW_|0)52Fr7wZ*4UT8BO@KwWDKrCvf}Ev}FTC$P*D|IQ39ZRAMwX(W?oqTF1z3 z0@F{NI!xu|2AlnoGU4{dG^(F|L|jSF);NUQQ*6IAF>yLQG0?#7~X$RO(pge6V)4{l}Gpy4^Qc! z-LdN>a5~C}%m(G&QGNT9!uh)Yke_jmA}; zJ)5j|JDaJpxhsWDBL|^rZEdZm_p>XS85XOZ_YNs(2({>Czvz|0Yr3xWkuSr0OC7>O zLM&3)BQ!`pS}YtKB2cR!oHmAYb?ThkcoPy5oL&BTIXW7fm{e6(7H#I`<^7)iZV9;^ z^ApWj3sUI$^=qigX6LeR3k zP;q(r*ticIg)lHMEG;dmsZ(hsKI}RQ4StNrQc&pg^+knu1sHywq52Nfc89>~SW#NYVf(3Z3^er+qwur16V!x}a>*Dm!5{F&{51c15mMEUlHHqvJ zR_c7ehx58-(CK-$mt}RbEiTC`?TmlZfhGMtS63B4x_p~}tMg@EP%nXjp8JX*DGz`7Nz9`KRYN+Xyx6`edIf(7lf9B{93U=X;YN9{L@Z_KNi2^1;bnwLB$+1!ivC=qLUhn7;5PC2~-2+N-HZ&z=-Q z9cQKc7Y+|k9Qkrxl9r@PEUl|$V*S`B*)P8PW^|s9mE$nz5tP?`n^3IHfsbzLKUeG7 zpi*C&qi1!Hb<1PnZm_c@nJn?0n$z#U#VWXCuNEhPydfNAzjKcOfAF#osuPaivZ~1$ zy>aH(Cxw5HtCObo>fIUJLeo3h3JYTml?n?Mox@k&64`fuc4q&Nw{wEv?QcuA4#-G- zJ_TQ*x(%nMA49zX48s0VS;Kg`!lEaZeaSjJgG0O8KwrOQa_8NAJ$nJk&9qLo_?ntC z2>hxUeOcK~h}No^%+G4yURyb}g;P8tprDw!+)nG9$uBA@T32@wr`oBhsqL9& zXr#?8Eg$PTXON+UQv5Zrv$NxHV9v2w`=Q083*m16j+T|xY_&JO`?bM4B=|JUr6ec_ z`%?|!G+ze>>nuk6UG+d|xftST9OkZcODtLlS$Iiy1^1?aEX zzN*}*hm3@4Ly@^|ob2p>4i9JQ-CShc?n9YQ4GRkk43rZW7nhR@gmp*}b}?`)dZf<4 z9+;%W5dSGKEyaX~m-oEk>P(a$9agwTSDn47Hmi=HU2vDnL1CVA-YGIh{!fk{l_QXH*;Sa#|-7E1jcn zQTcw8a=-ARm}N|!eXKtao$Yy-J5`BJtv@p1y90N$$VFiAO{+a7AIiY5cP1;m&+X*} zYJA$$n1{t_k*24oONV{XZ#;kYtjg)YP^NBzn3#C0tiIme#N=!z(ejnS>K^nT_=W630TKxpTR~7!a>9B&1 zT51qayh&9piuLZYD}mfox_+uUi>)jP=>`dB^$1}Lr?MN))_I{6GRPzYaA4g%MzV&e z5r(MCp80+~-gW6DCIZ#l`@;?v6AagZLjVaJ92T~E{KiCuLhvYD^8v~~FB7!PtT?)Z z6G>}EKb1PCX=78xq`JVon`Em`M)*2^HWVv!CFA_`sp?l3Yk*10X)y(8}Gql0}_M<0m3+l)y{ z6t2utYrn0br>6&f8_>hmC1YxW0G4_%9S=(oV4lN6+Z^WkI#z3D8xo2AF4%ZMAqHJ# zQUEc)5PAhCsD+(14aNosoz{{aAi)7G$wFF2uSRPlX=Id@9ggdGC_H&`y7Eb9g89DP z=9tCL)WpI9o0P?t=gt5AcJ2E`#igVe0iz|m+~wq4t7Hbg@V-j$8IVj0>McNC z*_Gu-Obb9Rk9KA?@1?V#a&mG`(X#kS2lqnd)^87aGl$0d2LmlDJNvGx5Aq>5V9no>Xx|NX7GcJ_6$ zvOOP*vA&p?PgZp=K3FLUoUJ7J(v^Py{6+}CK#$;obq&1ZA23a2k6|HqoGgXu2|(TVQy<+c|Yqw%C=c(({!)15m|sk=RNsk9gEK=CpI*1T zYNr%KP&7j!`aVQ4l1yxBohbfs(6TOSz%8!#Ue@r=6Bam5zX_An0PR1Z#?Jd?Mx-~W zxX(Y(@z~wj147v9+)J>!>huc+}I4^~4fD(t64AV52@(v@Fn zYZrX^GFcIx*_j`*oQ4{FtLV9Az3WMt$?(?Jmd2mEaQ(uOkr7lhG!P2Pk9=6TS?|83 zM(XL?V`cXe!>6LEhyDwJ|9zL9h1-Y185noW-4{UkPR?UR0s&3ZpwjC;dg#8Q0>syB zEFU_{^u&bhj|4bc$mL`|8}`Z%ha?9Ytdjy!{Gz2b4{|H!s|`3@DUmFqxF0aTG-e;y&_Aj&C{*M+XOjHmkTig2n?hgV}KA49DZ$^iQA0 zx2M0ys~4k&KsKU=cz%>sSD$PRB;?`do*)Lg4bQf?yt)b`eRXA}m>n99cqExdkerw` z*Y!Q93xNQV>@Zj5eo<|_1RO#_T%1bOy|*``6L+7Jm9?j*XA=m4IZkT7PL=h_w}#6g zxDN3-uH0S7ML26o3-Z`a(Q`4tgKc|fzZ=4VGPDJgWQ2k~Ag?41*OGqyq)6rI04b6U zouJ_K@Nj8bTG}F=jm-g2t~V_otf+5`nSsplqoX4iG>63uK<(55wx5mqQ)Xn)u!G%^ zPj!&%Z4+#FnrGixUOdL6Wt0N^QImWxQE(iS78olB2ZxlDRA^z;r%xoeZ~qxq68(~w zXG5N3KBAH-V<+Y}=^G*Fup=oYrK+mRr}blLkK=W1C9r*kM1Cu(B=ZvJue z(2g@#Eq`%*s;rDZXuNTA;&GEL&-Q2@$+xN}EhArEZ2tP?8?*(HV9+Z#lcbW?*!vag zW?x~s^B>bG;o`cIl9GT6QoJ8518)TP!$mK3IUgvo5dBDcRGOb3(nA^)6m$(R_4K%{ zmt{Hr=9z10Ytz%wLA?ODnGEGJK0f}M`h8S=^@^opHR+L!{m#s!`PW#ZZ?Ee>pUI#^ z>ufy)wk03`{PpXUKcezR@a)8zHV}}vZrxJxj)~3B&;Q7(HWZdY&&tLIy2ID__{j)b ziHCE4f^M@?P*6;$r$n@KdJ_;5GAktT0?Eph3Ab)=U}0q?ykL#}`0>xrwqQU>t|u#> zKyfklg92CL_K=6?0CwK_;?&OEd@EnQ)Yu<=-)z3#?eXKsrAGZ>p`qF2Sba5Vx1DRV z2M!Mplm2;4#DeDb_U&6>?d4em7&Ocwz{EmBJ3`4jda?bQYinyYzrTYh`SN9vnTqE3 z`r)&CE$<>4ArVJLV(f_!+s#XRr_jc~Tk1@Cd1~nsLJ8mKnPh=-$8u#Cy!<#D0M%N_w@=9ab$%HtX-_SNg*>%yuRwL@Yot?1#R$Nup2?%F8^{#T4@t&rprl2j3LhLZMz_RKk()r`Jo~fx0C4sB`FTJ<06gM*N^&Eej_RtaWKoZl_?ItU0R0CE z_qrAY$HtC9VFcRsLjg7+jloxZ5hC;5Ol4EAsj)F^dH@rRo7)8_6+47n4iDZyP8SaY z!|}yGTEL>E_Bg*^!ihl0Qu1IL8kw1zc8U@Xc%$J|_SgIN+~T5b9UbL^cKxOXD*wB8 z90YKQPH$xv3L(eczQhOQ9Nb)7ojpCnqoXS#_Y^%oFbH50`z^xxI>RPtUX8$sJ{#yX z?_tK_10{)yjb)n3C@27i;s!06qXl+6n+_in{U%jXeEi)hS*zoxl^*yqEsx&=x4FKn z&X}N}ZqUEl?vQY3$+Dgi?8r3w;u{&Q;gE1}4JQlOReM~ye}6aoFbp<4CRB{3===Bn z?ruFp&_oaR_ib%$joTy^pT%VOEJQ@$8|WYq3!W1+j*HEHM5UbR+{jG64<9|s&dt?7 z#z7#o2ryCY?d{=ozoyDJVNExfbOku|b-$g^NERxJf)^a zN~teZRcDW89c){EwvUrPczw1M{`05alote44Y18JkS_*DLr+f4ri$Ocxk%t^(5Y^% zjSNhe#$4QU)E5@skZMataXA{mgXOx+fyZLNTA%JqY|~hu@kN8+S^l>q3jh4eF!-Oe z(*OR02zTV8J3Q@uP3aXCvGJiA)rWbU^}0D2aS3z%U2n#5lljd4dR+CmW-T66l3So6 z5XM1zj5P5fp7XU%Hpl+d2E}h77_f*~kh&O^R37}wuNW~5P{^}SuK+Z0xy2_3|s%ncG&`tB3tC{<*tmGz015tXeg8X+oZ z6(yy}UY@z$(?v)Ku>>MUq%U3XhSPC~&y5B%o`r>(2d764M$3e=<>$vucHE?fp+;dh@Y$&w|rw}a#D3-T++#(agYAErn1_Dof^T4cja62 z^Nj;sd+US#etuzvg}oVorFJHcXUlbI4?`R_J=3NhNY_lu}oHNsGFfR;~k!>B48m$S2Qx%tLOih{T>y5Ry z${q(SORoTUersqbEr^YXFoPQ`lSor4CcxkE0@vvOY1hS&caDJsI10`6#`8##g98BI zdvX$72sVwf&gN$C{x$MDcN7zNLHU2`8v%mKYr<1-58i3@f^=OaEQvt0(ND`f^G+HV z8k+iU3Bhmx#bD;WiIvq}+du@OYa(P_53_I30<`V69K_!{I=L?sU6@d zkh#EeFk+Y)7=az6DXwJFNOjM z1Y%uQ+508k=2$^#Ny$`|jghQu0MP^1BTBB+ej_F=Ev-1gD%dp85*df;T>f@;b^?mR zKu0eLH3T^{A>qNhnK-8XpYr0J00lu9KKuK7e#>wVED7nW2;uf+o*BL@MpiNHPFW_>B-dRzp% z2R8tT2-xgh7y7}$fj=%8-4rBKgW$u5;0u5bqo$%Fdjbn8F)%#L>bjd|IbUCfviJj3 zb)Yl=@|0P!NN>p6ulACG1&Bq+lqBR7WzUA78IR@Ep`xUuBqS_#+|!#X77Jc5l7;F; zL<1-Yq3n5$eZ-KiyC(uow(-CDK9njFYR?cDbChVb+W`gui=N+<_Ui1v?Hh(lzYx~n-~Zd^rU>SZ8|7tXyu7?g z{1(?caP}ZEDk`I}@b&B0ikPr!gJWY<{N|*k>!2*I?Ky&D=eGA#3J^3XtMNxsQBkk! zoB&{e z9UjAwurR#T{%eU4aJW=|FTinndiuV;K0qoL=jRhVFElmDZ{2#MtDBaWM@~V(wiq}D z?4zurV)fvJiHQjSL4IMO;R7mse0(^})N~3EwBgd>!2u2)-s>8Bi@!UwcDA-4xk5Rv zu$+fFLCwz2?&0AvNI10KkyzawDm`R8LGYv2c(S6tUgX}ruh7sz_y-&?Uv5THQy(2Y z3{`A$5=`cj%xQ2GZcqxu^skwjm`qMh)(-DE5j0QcP{40yoe z;^ONY#KgqM_5(kCe!gK+|66`On0tG$MV7PGeD7u+>gdb^C>-R`fAc0XF;P=l8TJK* z--%7VWVz7`Wp8iKNjQE`?n^w9wY7&dQ&`ARAlm%kK;-gCg1z>r@W%V&?vs)7`We!aW)Q)ALh-V z0gxB|UR~w)xO7cdt_1i^#$yQOc^&F4__Q;XR*Q>^Tc%KK!35H&b+iJ5|MzT7M}_}~ z4?%yV0k|1H6BBE!v|5VW0KrxKy4J?452DVjOOulGn;RdR!&aGtPAbd;0{>P9aJ#9Q z87&qfKy8pv7Sk1>+RG~|jCZDi^ZJRufiZ@ZlsWK9Cr6{Aqd`*xY!Dv`0(S7u>G{b4 zy-b)vzvo2$w{PE)lPPOT8X6jki>)jy*m-J<0k>pI^EpdyT}Q57q%2;|7oL79ySHz% zferuzp9lvbc)Gp)L%hAMtyYNvR*f+r1c+r4Y(F$KG~Wow#t)I-e_>ZF?_<5SM_ZXG zdE0|Yd;k9ZG8C`aW{1WnO>=W8$yB_?(6zfEW-Kf$+Fot~2LkV2vtHf7;V;}CzBr5l zoGtoOLm^HABN+5Wz)Tq}0nigu1?)`Wl2%q$FRxtpawi-bT}4vkF|o1lh`OIc1(sJ( zfW0&`GZVC3AINDoK9<^tZJ68uJOQN5z`y`_8y2cJQ`MYU|(Hd|9YZTkOh3n`P~YG560qet7>Wh z%zz}b0PJPwpBHGh@G$vbzF67V=&P~byH{GJI1Ahb5Qg6M|4KM>b7>u0syT@urYo{g?7t{oe z>XHH0<>mjXe`!xBK5;lHo?-dx-NWe-Reib2?u_eDQ8lWkEk5Yl3XY73fS!-0rZx_} z5vmw;hG^}Pk=y3|EA+gDG-7#aE_eN&e&Q%bi2KoJ|N%+q-HG%$YZf&uhyZ|c)-~puc z*w~nS&ou!pG=!MX%X2wD-h&$Wor@~obWt^yqQaM_zo@KiWN4@w$;SY!ja6L@LIc+3A|e8+8mn3%;FQXm zng<%1@SM{NOmPVb{8~EN+Ou6EUOb`dCsHuN1E%AVH z0*?0-{-!6|Ba}gp&{^&asX(e9+$N_Inw)H zfSrGBY%nr05r~82K+N`P7bFWqrB69It1w+~oro$bl9+OGa<^C`xS?^sEYSD^V*j-z z`smRk7(4)>NW0AV*^5Mlr%z#1y5V+hD=st~KPKL|t``djCqMxqqc6Znr2 z-oUsEIy!m_OpFQI1MJ=gA2F-^EfkFFR8fXxq7_Jtj4TGoJTdVqCx?WRau&+L!h&vv zN?dBH=yK}2+3Gg763`pozpn)O^wn)%28LGHCm^_;o$G+JqgsXs1|Hh3D~pSJ7Z>j> zH2Jt3t}m{yPed&R1qSZz?iN8kC@Y((wlixF+8s-`Z*b@((2JRyztZG94WqG$KH%ljcd_*uxwlq{H@HT}@b+ zqO7beq&O(0Fz}X{oxSq=H>b1sor_A}ycy#N1?^=1B!i5HYh+^XG*B%h{PEOZy#hyo zn1~26Nf#JzXdy8nVdj|c2hM0KTU#h>3JMC0zJS4CVCW3sR4?^dObih@IXP%yC@4Na zgsxMpcev8ZPAQnG_OYQc~RinVeg`hTl33 zulFPQ?bsC1CPzk1TI6E$4sg@Bd}%rW++fiXGRYhFOS`(c0dSj~{10eUJIDtlk0){W zcyH;$W=&O9U#h4M3sIp)xhaflf~O*2y&M2yO}bXTmWhf1z1^w@vZ;-QZ;n z1V&TzNuWXow)5NlQUNbZQ!_6&*Wq~gjeR)`0^Yb03J}9^>FDSvqejHz^86Z_@X+uB z05JoNuW;-4Z%cD?EltgyUJi{iO4Pkr=ux4^n(u5RDAwtsXo%Q|r!2u&M55-)Mw#W`H^}*vBvts zY$afaV6h3!Y#kiJgMwg$v=WdDI9qAozEP8rIqm&yOGvl_vxN5L;8Fpj194=o#zDy( zr`MtJhQr$8;u}3ZYZ$16yYJ}efO@6VJjgeL=~CN#b>pl3@3~nRx&&<%$P5TRAIwTN zONW5~g({Y!A|uf<(9`Q5t`CNyx99W|!$e3V*EJ5}b7t#9zq|M=V1ou-CuX1t}vN1Itd;Pmv*CNMb>5fSjRaBy*f2pN8QsivlLm3tlFgWya+ zyDc~9B7ibYNJw}@54sT`iy9DOK%xUbfPp#^wlF2-wVoawZB|Z>VUsr+r%t{3kr0Rv zU{yE(XaPLn8v(Vfc!*U(LPCG^tE!Is$qI>%Yb0>JPoErM3t+^OuY3{+Av1F>0C;Jm zx02S^Mf7E|0i6--!ZR8qi5kFISENZ|9yLm6DP93z7ctVO)V2 z42$19$%R&XKN#=@B?UzxU@amdhUyN`_(3!PPC-wfNyw}yi>D+Zu>_;sSXfxVqhS(h zXE4)0GgJR*7%LM~JK#_V{-GgjSj`)j$VO}+)bsNn0i3A#$1MUG(FA%@!jvI2Cue7Y zv!~?6>XRn-AmDRVnd3VrozRtuY7HA+AqRnUxU{kH=uNXPOqvaap&^#10IFrerS$ZO zIbX{Q5*y$8cdJ$=1$1^JHKlK9?^?d~M@JNVs7XU2`jDN?SkHsJ&c*eA7*+n?_WA#d z4{F1dkpL92^73B$fHdQP&Lss=jVT#)(SZ8?iK~ieFrT%8D{Ku-(E|o=yqBJh{b@ z(GiF=1Qsd$gS?{9*qCqTBeU=99&eyHFvdp;_BjZc5(K17!Ny*y}PF; zGb6*?!lL}2m;X)b`nNr?cvl_jq4tQ8t;y0{rBso&wlG6J&%2u$ z8m_Lb$p{LN{k*%TJs_Sw(A|AcNJxm2^Y>J_+1iifOv+ngd47I=$&YMSelg7)&s0;)>aul~_dJGiw(ev1rBBC)*LIu|tsg;4zGIy&F7v&+rK z3!8i}t{3t)Ha7M>R@Uw9Z4(S}FK(uVjEsz>j&LIb1Fq6k*ZnT$R96B@%D%OO>*vte za%hA-xqJ6+dV0FEvvV}FQVt~vf>()*aMxkpO-)S=p3k@ z>P_G?>jh^|5g#un!_`r>Ll?`C3&`RqQxoUbW7D?lCc~t`BB9IXMYY z^^cA5)6gs|g^TV?d|zeJzK;3`j3<97xghR^#Qtj%Fz7;JU`Kc&ArLI^!HM1ea@X>* zL2>FD3QH2CKyG%n>dTiyc&N)b?jKP1Hz!Mt3JVJzc4juF%JT{ew$mQ_m|w}LseQ7y zMX-PT_;F=*_2u*DL#0MaIVe2IP794*8X6j9nJA`?;_2_<+}YXLW%NiJ2Zx7R#d>Jl zEK@6sE&e}#{5Ux|$p{sq`sVO^F5|9KqbCxai}Eb}QMdWdOck~3F4Fa(-5*)0sHkq= zzMT;YK^hwyn{jt?XlQ@6FY#clKle6sr;4p@*}55KKx!)WGqqfjo1IaQzblDesC-^1 zDJ`vW_|0)52Fr7wZ*4UT8BO@KwWDKrCvf}Ev}FTC$P*D|IQ39ZRAMwX(W?oqTF1z3 z0@F{NI!xu|2AlnoGU4{dG^(F|L|jSF);NUQQ*6IAF>yLQG0?#7~X$RO(pge6V)4{l}Gpy4^Qc! z-LdN>a5~C}%m(G&QGNT9!uh)Yke_jmA}; zJ)5j|JDaJpxhsWDBL|^rZEdZm_p>XS85XOZ_YNs(2({>Czvz|0Yr3xWkuSr0OC7>O zLM&3)BQ!`pS}YtKB2cR!oHmAYb?ThkcoPy5oL&BTIXW7fm{e6(7H#I`<^7)iZV9;^ z^ApWj3sUI$^=qigX6LeR3k zP;q(r*ticIg)lHMEG;dmsZ(hsKI}RQ4StNrQc&pg^+knu1sHywq52Nfc89>~SW#NYVf(3Z3^er+qwur16V!x}a>*Dm!5{F&{51c15mMEUlHHqvJ zR_c7ehx58-(CK-$mt}RbEiTC`?TmlZfhGMtS63B4x_p~}tMg@EP%nXjp8JX*DGz`7Nz9`KRYN+Xyx6`edIf(7lf9B{93U=X;YN9{L@Z_KNi2^1;bnwLB$+1!ivC=qLUhn7;5PC2~-2+N-HZ&z=-Q z9cQKc7Y+|k9Qkrxl9r@PEUl|$V*S`B*)P8PW^|s9mE$nz5tP?`n^3IHfsbzLKUeG7 zpi*C&qi1!Hb<1PnZm_c@nJn?0n$z#U#VWXCuNEhPydfNAzjKcOfAF#osuPaivZ~1$ zy>aH(Cxw5HtCObo>fIUJLeo3h3JYTml?n?Mox@k&64`fuc4q&Nw{wEv?QcuA4#-G- zJ_TQ*x(%nMA49zX48s0VS;Kg`!lEaZeaSjJgG0O8KwrOQa_8NAJ$nJk&9qLo_?ntC z2>hxUeOcK~h}No^%+G4yURyb}g;P8tprDw!+)nG9$uBA@T32@wr`oBhsqL9& zXr#?8Eg$PTXON+UQv5Zrv$NxHV9v2w`=Q083*m16j+T|xY_&JO`?bM4B=|JUr6ec_ z`%?|!G+ze>>nuk6UG+d|xftST9OkZcODtLlS$Iiy1^1?aEX zzN*}*hm3@4Ly@^|ob2p>4i9JQ-CShc?n9YQ4GRkk43rZW7nhR@gmp*}b}?`)dZf<4 z9+;%W5dSGKEyaX~m-oEk>P(a$9agwTSDn47Hmi=HU2vDnL1CVA-YGIh{!fk{l_QXH*;Sa#|-7E1jcn zQTcw8a=-ARm}N|!eXKtao$Yy-J5`BJtv@p1y90N$$VFiAO{+a7AIiY5cP1;m&+X*} zYJA$$n1{t_k*24oONV{XZ#;kYtjg)YP^NBzn3#C0tiIme#N=!z(ejnS>K^nT_=W630TKxpTR~7!a>9B&1 zT51qayh&9piuLZYD}mfox_+uUi>)jP=>`dB^$1}Lr?MN))_I{6GRPzYaA4g%MzV&e z5r(MCp80+~-gW6DCIZ#l`@;?v6AagZLjVaJ92T~E{KiCuLhvYD^8v~~FB7!PtT?)Z z6G>}EKb1PCX=78xq`JVon`Em`M)*2^HWVv!CFA_`sp?l3Yk*10X)y(8}Gql0}_M<0m3+l)y{ z6t2utYrn0br>6&f8_>hmC1YxW0G4_%9S=(oV4lN6+Z^WkI#z3D8xo2AF4%ZMAqHJ# zQUEc)5PAhCsD+(14aNosoz{{aAi)7G$wFF2uSRPlX=Id@9ggdGC_H&`y7Eb9g89DP z=9tCL)WpI9o0P?t=gt5AcJ2E`#igVe0iz|m+~wq4t7Hbg@V-j$8IVj0>McNC z*_Gu-Obb9Rk9KA?@1?V#a&mG`(X#kS2lqnd)^87aGl$0d2LmlDJNvGx5Aq>5V9no>Xx|NX7GcJ_6$ zvOOP*vA&p?PgZp=K3FLUoUJ7J(v^Py{6+}CK#$;obq&1ZA23a2k6|HqoGgXu2|(TVQy<+c|Yqw%C=c(({!)15m|sk=RNsk9gEK=CpI*1T zYNr%KP&7j!`aVQ4l1yxBohbfs(6TOSz%8!#Ue@r=6Bam5zX_An0PR1Z#?Jd?Mx-~W zxX(Y(@z~wj147v9+)J>!>huc+}I4^~4fD(t64AV52@(v@Fn zYZrX^GFcIx*_j`*oQ4{FtLV9Az3WMt$?(?Jmd2mEaQ(uOkr7lhG!P2Pk9=6TS?|83 zM(XL?V`cXe!>6LEhyDwJ|9zL9h1-Y185noW-4{UkPR?UR0s&3ZpwjC;dg#8Q0>syB zEFU_{^u&bhj|4bc$mL`|8}`Z%ha?9Ytdjy!{Gz2b4{|H!s|`3@DUmFqxF0aTG-e;y&_Aj&C{*M+XOjHmkTig2n?hgV}KA49DZ$^iQA0 zx2M0ys~4k&KsKU=cz%>sSD$PRB;?`do*)Lg4bQf?yt)b`eRXA}m>n99cqExdkerw` z*Y!Q93xNQV>@Zj5eo<|_1RO#_T%1bOy|*``6L+7Jm9?j*XA=m4IZkT7PL=h_w}#6g zxDN3-uH0S7ML26o3-Z`a(Q`4tgKc|fzZ=4VGPDJgWQ2k~Ag?41*OGqyq)6rI04b6U zouJ_K@Nj8bTG}F=jm-g2t~V_otf+5`nSsplqoX4iG>63uK<(55wx5mqQ)Xn)u!G%^ zPj!&%Z4+#FnrGixUOdL6Wt0N^QImWxQE(iS78olB2ZxlDRA^z;r%xoeZ~qxq68(~w zXG5N3KBAH-V<+Y}=^G*Fup=oYrK+mRr}blLkK=W1C9r*kM1Cu(B=ZvJue z(2g@#Eq`%*s;rDZXuNTA;&GEL&-Q2@$+xN}EhArEZ2tP?8?*(HV9+Z#lcbW?*!vag zW?x~s^B>bG;o`cIl9GT6QoJ8518)TP!$mK3IUgvo5dBDcRGOb3(nA^)6m$(R_4K%{ zmt{Hr=9z10Ytz%wLA?ODnGEGJK0f}M`h8S=^@^opHR+L!{m#s!`PW#ZZ?Ee>pUI#^ z>ufy)wk03`{PpXUKcezR@a)8zHV}}vZrxJxj)~3B&;Q7(HWZdY&&tLIy2ID__{j)b ziHCE4f^M@?P*6;$r$n@KdJ_;5GAktT0?Eph3Ab)=U}0q?ykL#}`0>xrwqQU>t|u#> zKyfklg92CL_K=6?0CwK_;?&OEd@EnQ)Yu<=-)z3#?eXKsrAGZ>p`qF2Sba5Vx1DRV z2M!Mplm2;4#DeDb_U&6>?d4em7&Ocwz{EmBJ3`4jda?bQYinyYzrTYh`SN9vnTqE3 z`r)&CE$<>4ArVJLV(f_!+s#XRr_jc~Tk1@Cd1~nsLJ8mKnPh=-$8u#Cy!<#D0M%N_w@=9ab$%HtX-_SNg*>%yuRwL@Yot?1#R$Nup2?%F8^{#T4@t&rprl2j3LhLZMz_RKk()r`Jo~fx0C4sB`FTJ<06gM*N^&Eej_RtaWKoZl_?ItU0R0CE z_qrAY$HtC9VFcRsLjg7+jloxZ5hC;5Ol4EAsj)F^dH@rRo7)8_6+47n4iDZyP8SaY z!|}yGTEL>E_Bg*^!ihl0Qu1IL8kw1zc8U@Xc%$J|_SgIN+~T5b9UbL^cKxOXD*wB8 z90YKQPH$xv3L(eczQhOQ9Nb)7ojpCnqoXS#_Y^%oFbH50`z^xxI>RPtUX8$sJ{#yX z?_tK_10{)yjb)n3C@27i;s!06qXl+6n+_in{U%jXeEi)hS*zoxl^*yqEsx&=x4FKn z&X}N}ZqUEl?vQY3$+Dgi?8r3w;u{&Q;gE1}4JQlOReM~ye}6aoFbp<4CRB{3===Bn z?ruFp&_oaR_ib%$joTy^pT%VOEJQ@$8|WYq3!W1+j*HEHM5UbR+{jG64<9|s&dt?7 z#z7#o2ryCY?d{=ozoyDJVNExfbOku|b-$g^NERxJf)^a zN~teZRcDW89c){EwvUrPczw1M{`05alote44Y18JkS_*DLr+f4ri$Ocxk%t^(5Y^% zjSNhe#$4QU)E5@skZMataXA{mgXOx+fyZLNTA%JqY|~hu@kN8+S^l>q3jh4eF!-Oe z(*OR02zTV8J3Q@uP3aXCvGJiA)rWbU^}0D2aS3z%U2n#5lljd4dR+CmW-T66l3So6 z5XM1zj5P5fp7XU%Hpl+d2E}h77_f*~kh&O^R37}wuNW~5P{^}SuK+Z0xy2_3|s%ncG&`tB3tC{<*tmGz015tXeg8X+oZ z6(yy}UY@z$(?v)Ku>>MUq%U3XhSPC~&y5B%o`r>(2d764M$3e=<>$vucHE?fp+;dh@Y$&w|rw}a#D3-T++#(agYAErn1_Dof^T4cja62 z^Nj;sd+US#etuzvg}oVorFJHcXUlbI4?`R_J=3NhNY_lu}oHNsGFfR;~k!>B48m$S2Qx%tLOih{T>y5Ry z${q(SORoTUersqbEr^YXFoPQ`lSor4CcxkE0@vvOY1hS&caDJsI10`6#`8##g98BI zdvX$72sVwf&gN$C{x$MDcN7zNLHU2`8v%mKYr<1-58i3@f^=OaEQvt0(ND`f^G+HV z8k+iU3Bhmx#bD;WiIvq}+du@OYa(P_53_I30<`V69K_!{I=L?sU6@d zkh#EeFk+Y)7=az6DXwJFNOjM z1Y%uQ+508k=2$^#Ny$`|jghQu0MP^1BTBB+ej_F=Ev-1gD%dp85*df;T>f@;b^?mR zKu0eLH3T^{A>qNhnK-8XpYr0J00lu9KKuK7e#>wVED7nW2;uf+o*BL@MpiNHPFW_>B-dRzp% z2R8tT2-xgh7y7}$fj=%8-4rBKgW$u5;0u5bqo$%Fdjbn8F)%#L>bjd|IbUCfviJj3 zb)Yl=@|0P!NN>p6ulACG1&Bq+lqBR7WzUA78IR@Ep`xUuBqS_#+|!#X77Jc5l7;F; zL<1-Yq3n5$eZ-KiyC(uow(-CDK9njFYR?cDbChVb+W`gui=N+<_Ui1v?Hh(lzYx~n-~Zd^rU>SZ8|7tXyu7?g z{1(?caP}ZEDk`I}@b&B0ikPr!gJWY<{N|*k>!2*I?Ky&D=eGA#3J^3XtMNxsQBkk! zoB&{e z9UjAwurR#T{%eU4aJW=|FTinndiuV;K0qoL=jRhVFElmDZ{2#MtDBaWM@~V(wiq}D z?4zurV)fvJiHQjSL4IMO;R7mse0(^})N~3EwBgd>!2u2)-s>8Bi@!UwcDA-4xk5Rv zu$+fFLCwz2?&0AvNI10KkyzawDm`R8LGYv2c(S6tUgX}ruh7sz_y-&?Uv5THQy(2Y z3{`A$5=`cj%xQ2GZcqxu^skwjm`qMh)(-DE5j0QcP{40yoe z;^ONY#KgqM_5(kCe!gK+|66`On0tG$MV7PGeD7u+>gdb^C>-R`fAc0XF;P=l8TJK* z--%7VWVz7`Wp8iKNjQE`?n^w9wY7&dQ&`ARAlm%kK;-gCg1z>r@W%V&?vs)7`We!aW)Q)ALh-V z0gxB|UR~w)xO7cdt_1i^#$yQOc^&F4__Q;XR*Q>^Tc%KK!35H&b+iJ5|MzT7M}_}~ z4?%yV0k|1H6BBE!v|5VW0KrxKy4J?452DVjOOulGn;RdR!&aGtPAbd;0{>P9aJ#9Q z87&qfKy8pv7Sk1>+RG~|jCZDi^ZJRufiZ@ZlsWK9Cr6{Aqd`*xY!Dv`0(S7u>G{b4 zy-b)vzvo2$w{PE)lPPOT8X6jki>)jy*m-J<0k>pI^EpdyT}Q57q%2;|7oL79ySHz% zferuzp9lvbc)Gp)L%hAMtyYNvR*f+r1c+r4Y(F$KG~Wow#t)I-e_>ZF?_<5SM_ZXG zdE0|Yd;k9ZG8C`aW{1WnO>=W8$yB_?(6zfEW-Kf$+Fot~2LkV2vtHf7;V;}CzBr5l zoGtoOLm^HABN+5Wz)Tq}0nigu1?)`Wl2%q$FRxtpawi-bT}4vkF|o1lh`OIc1(sJ( zfW0&`GZVC3AINDoK9<^tZJ68uJOQN5z`y`_8y2cJQ`MYU|(Hd|9YZTkOh3n`P~YG560qet7>Wh z%zz}b0PJPwpBHGh@G$vbzF67V=&P~byH{GJI1Ahb5Qg6M|4KM>b7>u0syT@urYo{g?7t{oe z>XHH0<>mjXe`!xBK5;lHo?-dx-NWe-Reib2?u_eDQ8lWkEk5Yl3XY73fS!-0rZx_} z5vmw;hG^}Pk=y3|EA+gDG-7#aE_eN&e&Q%bi2KoJ|N%+q-HG%$YZf&uhyZ|c)-~puc z*w~nS&ou!pG=!MX%X2wD-h&$Wor@~obWt^yqQaM_zo@KiWN4@w$;SY!ja6L@LIc+3A|e8+8mn3%;FQXm zng<%1@SM{NOmPVb{8~EN+Ou6EUOb`dCsHuN1E%AVH z0*?0-{-!6|Ba}gp&{^&asX(e9+$N_Inw)H zfSrGBY%nr05r~82K+N`P7bFWqrB69It1w+~oro$bl9+OGa<^C`xS?^sEYSD^V*j-z z`smRk7(4)>NW0AV*^5Mlr%z#1y5V+hD=st~KPKL|t``djCqMxqqc6Znr2 z-oUsEIy!m_OpFQI1MJ=gA2F-^EfkFFR8fXxq7_Jtj4TGoJTdVqCx?WRau&+L!h&vv zN?dBH=yK}2+3Gg763`pozpn)O^wn)%28LGHCm^_;o$G+JqgsXs1|Hh3D~pSJ7Z>j> zH2Jt3t}m{yPed&R1qSZz?iN8kC@Y((wlixF+8s-`Z*b@((2JRyztZG94WqG$KH%ljcd_*uxwlq{H@HT}@b+ zqO7beq&O(0Fz}X{oxSq=H>b1sor_A}ycy#N1?^=1B!i5HYh+^XG*B%h{PEOZy#hyo zn1~26Nf#JzXdy8nVdj|c2hM0KTU#h>3JMC0zJS4CVCW3sR4?^dObih@IXP%yC@4Na zgsxMpcev8ZPAQnG_OYQc~RinVeg`hTl33 zulFPQ?bsC1CPzk1TI6E$4sg@Bd}%rW++fiXGRYhFOS`(c0dSj~{10eUJIDtlk0){W zcyH;$W=&O9U#h4M3sIp)xhaflf~O*2y&M2yO}bXTmWhf1z1^w@vZ;-QZ;n z1V&TzNuWXow)5NlQUNbZQ!_6&*Wq~gjeR)`0^Yb03J}9^>FDSvqejHz^86Z_@X+uB z05JoNuW;-4Z%cD?EltgyUJi{iO4Pkr=ux4^n(u5RDAwtsXo%Q|r!2u&M55-)Mw#W`H^}*vBvts zY$afaV6h3!Y#kiJgMwg$v=WdDI9qAozEP8rIqm&yOGvl_vxN5L;8Fpj194=o#zDy( zr`MtJhQr$8;u}3ZYZ$16yYJ}efO@6VJjgeL=~CN#b>pl3@3~nRx&&<%$P5TRAIwTN zONW5~g({Y!A|uf<(9`Q5t`CNyx99W|!$e3V*EJ5}b7t#9zq|M=V1ou-CuX1t}vN1Itd;Pmv*CNMb>5fSjRaBy*f2pN8QsivlLm3tlFgWya+ zyDc~9B7ibYNJw}@54sT`iy9DOK%xUbfPp#^wlF2-wVoawZB|Z>VUsr+r%t{3kr0Rv zU{yE(XaPLn8v(Vfc!*U(LPCG^tE!Is$qI>%Yb0>JPoErM3t+^OuY3{+Av1F>0C;Jm zx02S^Mf7E|0i6--!ZR8qi5kFISENZ|9yLm6DP93z7ctVO)V2 z42$19$%R&XKN#=@B?UzxU@amdhUyN`_(3!PPC-wfNyw}yi>D+Zu>_;sSXfxVqhS(h zXE4)0GgJR*7%LM~JK#_V{-GgjSj`)j$VO}+)bsNn0i3A#$1MUG(FA%@!jvI2Cue7Y zv!~?6>XRn-AmDRVnd3VrozRtuY7HA+AqRnUxU{kH=uNXPOqvaap&^#10IFrerS$ZO zIbX{Q5*y$8cdJ$=1$1^JHKlK9?^?d~M@JNVs7XU2`jDN?SkHsJ&c*eA7*+n?_WA#d z4{F1dkpL92^73B$fHdQP&Lss=jVT#)(SZ8Cw7 ziG*~cfW(>jd*AcNH_kX`oNtWppYML2F`kFod*9c!uC?ZzYp&Z*K~CZTDGe!sKsX>J zNxVTIY=2B3Z1dQ&9pAZ};4z8+?6A8crLwwWPWo{`>FRHf}(jL?E0X zND(h9ImJx&I;&CsT0K82NVew$@xg-={(Bxj*uyr>sHV{KZZ?hf@R9KcW))NKRfNSg z!yo7QGdRAr*9}bmxm|)POV3|rr_xUGZRBK~mwz+O9B&!9-dUhevFx6qQ^LaASZ~+J zG$Io#Yj{B~D}oTe?ctT%rlzKbhK3Ff4({&mm+z78+ow6(AO7mqt4EJ^1y!|t`}R~e zB`q!O`@`~q?-$DQ!{`pa&d$EUO2xAoF016+@zgIQB&7M@71m|*=<(yn`T6-@`>a9zs#Vki7M z*!(mH9~KoAJ#o;w_C?QTte@$=_PxaXWM*dOii!&F8}sw?QEP_DZ{NOE4G=q#BJx_h z*nz{9ju5qfZofsv-#;@qZ){x@l$1F+IcZ5&w{PDr(frob#C`7ExAv_oll$(9oBQA2 zQ_L+7ETg2X+}hqg^Zm`U`}Z%umV3cO8RE0Lx+;DC$F|42=JreD zm2tgw*>7ZM*tQ%pVtrxPu3d&6E%=+B!W^c1f{xQqGEd+4#jaUgjtvbBeeq&_y0^H# zzW&LRCq?}iFVY2KRbu<`k$L$3UHtqNzpPR;qy2xqlnBCG85$WCSoOz7@>>7+=yT|J zsmEsNRiA_PF}KSf9iyd<6ZMEK;ThPZB=we(l4^_-4f6MQ-B`QG8~p6q%{zClU%$?K z29Xi6*X_4=7$b#W#Ee8=iEGtPhb6xv`M{fsietDnKR>^$tSmo2snES{9NWL|8oYS% zVrNg!TDY$J-0bX$#19`n1kwxA(9-VSxl=ZZ&(9Yjx3swUd%AaGVxrC=%ROi6b?jERYPEgvWC zV`FQZEy)yO`7$w4@AmDc93y!%vx!(?S02icgoA{N@1^$;FWs8z>aFjU*r~BK_=W)g z)|FRF#JRzB_wL=L!>!-H7uio#?#%c07H=;*cI?=|p%#@_4HdlPg+)b=9zEh|!H3}d zcb!#9e_GFd{(Ql^cegS>wxz#+e}RpSjfZFclh^J;3__B!vgz~3uH3xYQd=v1>B-yl z^mA>y-|qJ*zg_xxx;;~ODH$P^$Lxsc()xFWDr2|n8ybpLPLb^y%D(z-zN_bl0Qn11 z5BKr!Z^p*P@b&@%0-6Pu^cQWDVq^Oz+B316e;3DiZ+-Mc1Y~I&o>f#=Um2>QWO;Jx z)Tua;dm8HMXVg;@6M2lk#p{%~NPX_;>CqAw_pW%bjY{3XU^q=R6UV!yxmo9f)7+|+ ziHQk+Y2?KCxJskBot@oUP1(xaQE-tS8IwcjotP9-S!Fva>21If3!$*$Dgv~n%xw`({wqw_Rx(n7HJ+}$F zEQ%f7!KaJ2v$dU{Ff|qQYp$+NQO(q;tgIB?Ff=gm?&o5Co`2zeZ`K_N{OPxE3JD6v zR#us>UrP|N_}GJbelIO;?amCv8ed|fudnaZr%$V^t7m7e$8?XTrKEIpbV$y3^z|{6 z?Itm{p`oFXtyPJPi;L40&OyW>?r;pL#weB?aqT=|_1wL#vQ+MHP{co51zEN#eLvB`tw~f@W)LEBo&UpQ&Z!$>j3VNo_wme*s&>5yjf;*ZK09! zv|Nm^s{k+WGheJ0QYn%ci(E_xV%>pl7r_AaZ+^0qS4yL*vXaN@3;k$9>g1o1&PR({3RSNQAc z=`o#-p$Gd17=;+`O zd(mzrN$Q#PFd0FC%-PvFByCaDY4!vM$90!CZ{J#MZmeU&aTPmE)v5&BdOBIIKk)ME z?d?srBAy%=9bN9<+&H2twS(Xt8WqLnH;%BEb{~==0!e-S`t{VcC)N%Q`MJ6JS(55v zLIt)s%=DM;rYs&lpZ4zEyFH|&*$65lWdh;)!enO-zJO;rtl) z?AI59f)_7xA5V8(98E}aT>9~iDsjPFbsLYKyjf*>Q)_EOrugN{+j!kR58HYy5BQMm zqkgB&O%S`u#Ka_-c!{51nMYSfrmnl&^;`VqXQ$;=GM<@VAQDrFMjf0xHF_8l_Y`3> zPRF_3(4@>#(^614AvJOG>Z2d^76b(c)P7kx6y0PTC0?KrFR$|Dxj`%&Jslm@<|%$3 zU&(-!n5irA70%=@(oV;2BWM($p5ZUFOI((^^2|asn`mih0%^~G?d`qyJw=h!HB|45 z-GsN(F2b@V_Q}b~NkQRTYnm$a`SRg8C#-e7gz3J0`y9@uZ=dUNIf+*^r8s`PacI%1 zY@Ma>R%Bit|Ff3zM+a^`q}5}L)#UoZOAvc8zp#J^%S2UMU$w7k%)R6=dBLFe`B=+q z6yJ!7%oOs*w?}>+BgEe(GBzFeSR<$UcTrN7*H5;+?Oq&fDJdx_wx3|x3?cik-<kFvlvB)mZ&)ghxuCV&An=od}Qgiz=-HV0Qd2fA^iz~?Yduwae zlViO1Ru}hDvKRwB77-4sJAxO)-@QN=`0QB=FaatKm(GXLfq~1!vW?XVye5Ks8M8LbXJB_}8M`}c3r&9$7xhEz>5 z+!-O>9RaEK-g=Ds&uKzT$&1P;B1hQ_X)JHOlfN_cfyXa|A7_aGr*;MMhL zz-svyms)X*&Rg}RYvk3|*PAy)@gu=lywM?R#77RO9JYOZJ^J@()632E84utS0AIv* z?z?x(lR1rBxn^zZ6gG(vWr>6P>C-1gMa7oa@<;qDs)CLeS)2V`gDNM!g{+@e4(5>txy3IIk_+vWwt_J@Wq|hIedY>@#Fbfe z=f8jd{>{zTVWFXKwFz)8Az~f%Q?p$L2kh z&^K@1fJjXsI^Ny(LXz6icJma)*+vhMY>_8yr%iVDQn0gq-v1+v{aV%^Ut6aEA3?)$*HN*MC=^$Y+AAKU&k2BD1>!e zOUq5mUhoSIP0hNug2rYMnXmf5s*sZYw8)DZ6w`TLo9N1$z>WHjmirt+fqcPz=Mf;| z%a^CR?az=MI1qp}mW$#useE#*si_Ib@YmNDcJ}sf-!qpL&8c04 z%>8&Jd#C=;$NM{OzLorc+z+Mj?FfuYm_@D@B0sX7$-m4g#>)_ZQuLu$nITKq~ zTYKf|)nAQqnQ3Vg)6-uav`HJv%LhRLSB9R+udS~~#!1U?i3{aS$tP}-_cE>qNUrX) z_x42l`V0#gEc%U8=f^z^1^yr{!ab5)z_e^9XbDV8m&3bhN*J9Wq=) zeSK7$D-st1IXZ90+lt^*5^QJB`s_c(7>Ock^WZ2e{n$+G)YKHRRf+wC$``wmp59)h zv!$`uaai)UuU{?eBe+AveT@W^DAun~N#6Bl-JFSJBmO3q`^Nav`F8w$Qu`&}-+$kN z0uu!=85bMdIM^==w==Q`wn6U2C2=Ck7>%IABw|ZQNazBc+>Qd>8#j17HrCFnW>lN* ze(od5bjfXbHj3Zum3$m$|3Y%xvHPHGtdRQZ zejW>psm>guEzEc&;awj`(yLb#O(<}h`R5GoE{!WQqV(l0))za@P$;^&3CW0WWt4V2DQ|as?vK z0O)(E64lGF3p;)FVBR(YtGCDI-+tmEVu0t6jm-XI)u&ctQ;r1lHgP9XFj^(vA$k)f zd|#29WNY7+q1>|*6yo0U>}_DXva+(+SekF4JUq*(UMpbd_zo)98Aa-L;mbj0aot2GEFH?s=5WlUjzc^QQ zJUl#{S5(pL>KxtS!^5MaDM*HTdh_LnM001`;>g#JD;`R`M?CJ^ANcije{Fgj zib%kgX=(K!+xGPIK=Q%4DKw~~9upAVSRO>W?Mx*jh}oPwvS^_>7ZVrfG5RfGW#LzG z;Z~WfudW_Nif-sNW(_{o#FuEDc#yb3JVO+vu($GitVw>*hu2}Uxd$)sADoa^OiCrUi zv|ZQ3pwe_)K}Saf%ZOYpUX~}orwo~j)_qu2{EnU;k74~$h$;yRlEm%zw02hF0$%52B7?9C+0R0oT3;pK5ef_D@h=YCwPFZf zC~RQN6#f-Ja~C(Czj(p1e(vm9nZaUR?-@Rc}zBZ;vCFOOj`T1=Kw)7bjval5A zaY2Xl>}=cG=V$6~?bi_wNboZcD>?actXQ{`bGt^=Gf&cm4$ef9t@sud^*~0-<5w%R z9iA!M+?eha>~i!n-(8y{@U+lQwE1_VLGBcgvD-q!c_OG9qoG{%1%7iJEnt9VJIkK; z_v@s#i@kgv7N!H)T3A?H;`K<59IBz?R2TEF)Oh>ZrKN_(#y|7(Gy>*Fd3VPFD36B( z2iri*K>6tT;G9#byNiMx5CAF%GRm+PZSKJ>8P{g;(f#}P7Y}og1BEO5Rs2LD$6xFu zArW?4M!6yne*C!h>B*}od5|qt)74Izq^G93Ae9|Ie!Q)g#J~YWXe2NOd}0e@>5G6O z{NRGTftpYH?+VeP(~*!cLJ0u1KYHFW=KlR{;_}12X!L1kQ4jkuwadFU5?gv$aQUxCKLwk7>-n?-JT5NhLQCF;I ze0T#Ti~CL`)sZ6}I4zKil*1Tfx5aa$x-PqXez+HboMF+6aAN$qu!6w0zkBz&Zqv8N zkOB;$2cS~`(QS3Qcqa9{n9vR}+UAb~6Ga8H^TRUt?yZAfEKan`|7N~wc8bEUbor-0 zg2cb#CqCE~<8dlv0PV3Ml9Ei9OQKcI|wiKjc~c0fAe{d*_u91hy%?7)toD$P>2l}86?@7mkb7SrP%SvmLX zdQm_(+EP()rlTXbRKi!Xk=YjA0{iy)zp^-h4^6teyggnkJ0}On<1Yl8lhE#c@iNHH zS!h(8H;S&MX_Su@S^-x%T`*l+S2x^tgs-BzeQ|`@tmMz}%Ub*^_TkT@_BPE=WROO0 zd^u8W+Fnxi)s-t1E9@}ca}hZvR#kv#EBR!4Qnf;n%j3`Pw{<>#QGQuVYGpM8 zX{0v6;|p)Dc5H0yrAwC(_E^N)uU{SP?R(2S%EV5jwS;sIkBz-aOEW|JVBoVi#OffC z)lo=IJe{4B`-@ydr?nD9EpOE5mbWJ*USVtkL)xl{`*jQ0KRnTNGOEyXncuA~c>Uxr z*3-{?eajO{%T0RtRu#lt+wMZaVJ=R4@z||sn}RGE@FX(txq4(HB)+hhllgmSfvbtZB--)rEJz0D*cj#;p+106KA|F;; zKZpH?K@X2kRa0L8Ujl6d-4!E`_!!x7O9}VxF%1g(1Fxm_NnXu(y?d~QH`fHrTqcbD zBqKfj3mn^}v6j=EoL{>%O3OB$heHYV_D>nbd8PJfvIpcVg1a^z~J* zYrzXUZRsRjj+Tb){_rGvSeuO`E_vehnDcjCyGzk65%MOJeB*}QJpt!;{5;l`3tS`l z3ibsw?=<^l7~GD*`A0xT7L0>^7d=m)h6377C$TBbE8T^zwmS2`!l4rV>P}ASERM}bAHsv# z`YuIH+0%LJCJ0`pqW`qU8M758l^%3o>fSe9a!mHmdK_6xv3!1)Mb}WxGkbe`G@rrr zeojyKZGRn^>r%4oM09jU_5%j*n@(iCg;(DAc{B`}G>aXvjTH+V92>N}{(eLNpRcWk z_$eontnpi=&4n01-N}wmy}A$n+Y6B8HFZUQ8nijseROc^D!;*D5wtjKuehPhyCm2$ zJ2x~W=XFhB;fSEqu>xsdBLbl_MZ~RPK%vpy`GciD*aAzeqF+gU;ij9Ay=)cw!5@u>ssB9t?=3MuI5)>MUzN-aJOOk6_1YHTU1 zQLLPt(@+n zu$sH;xQH8TL20TW8aZhB^%S|HWxpOkbrtUznle01)og4yAMlG*#nFM|XW?Z_8vf|>`f`e>_epRn9~@}IH!>F2lg zE9J@pnzqla&3J4UGqahbKy1$csebk9)vtoI&=Q<1pSsI^Z+zo7AriEDHr6M=qA5!M zRT@9X^7(G@+$-~Rr5UXs0(fSw*vQ5-I*^bac>QRbSafAAP(sNTOdEN3(e1#ubMt{l z^78WZ^z={>02U04jEakjru)luPmom??q8W*Tm9SO%+1e-cpR|ZQspdriy-T=0IV@HztwI0xzbOt zPy#yy@qG~!1H%R1oysQ=4USMz0k2sBc5ijXuU{92V1Nqv#C(_c=g&X#0|FXCm}Pt= z0ZiL7w82OH{QbAubso&N=bUD5>FVk-LabVtoBI^dM;O`xY%;0l`|JOi=>`im3pO`3 z>F`NL>bkOBg>P)X8cp=6dyXtGG>W335tYyR zwe(S&kGGTI#(GL>Dn%2j=oh^#w2jv42!x6(_jMP}@a`0+%31zgOZG2za&li2#r@mf zYKBKf7J?t3{Ro>uZP|W;!cNBEQM_tDz!g|8Z8Jl8`?qWF$Qn@$+ge+vV49JV@+&SD z{2I31I0wR(=-0fEgEAEXxd{M2bl-zb-5xlnyFP6rdGm#>RXJRY$mV_-=Cy|DN3T*7)byRKHk}6O5PM zhjP+~n3Y*b*X(8lutsW6x4Gz3zIV@_Z>_ECKmECeG$ZRL)vvns#Aet#|COHBP9^uF z-PBF$nRxDyEyaI+rA!YA!Qz=|tTYi_F6OKdfMWU;OT8sAFZPx6xrGH<_$Lw)ZqvUl z-P~}^*Y#_#M+=6hDmhH!%&)ybw!w}2-W-dIEv6*lx7X%wawMMj%k^FJi<*_5zUlES zEU7Q)#kyE-Fzfy52xHn{otv%&=Hrj0D?Wbw(HmBANQ8m)mwSPE=RAVk4dm*2=?`AM zFF>5kqAzM|Yaa&$Z1ozj@p^aeK#9;$Q25A>X4c@s3P_J$X7h;c-Med3LjxZ^2<7j) zA7*4}*_WouwX#@olJUkVws3jJ8$_a=Zy@EIpC#FWVApNgVe&)QsHF78??$KO^z55u zyd(ix&2+xtkOfkBRc6_S3uHV*RJOJZEi<)0+RIG$>5m-wGaRm4R9u{+eS{F*A;>T5 zJ-UaSoc=UT%Q!{UlKCzL2K1d_!+|s(OoX>auYifr_U2vB3OVEP#O+Xd|4e9KmO2r= zElNV%yS0FYK=Sc-+5NWgZ`FqA=m_KwMrx>DITgK)5YNmiCUnzG%2*%Wpj@&FU!xlv z53dRAAc)l|MmVt;$o=OBtm2Q2ZhZaE4`gn>!w+Qs{h-?OX9e#W`F}4ZCP2j#D|L*5 zrW5@jo|h?evX5Wxel6cv6vZ%(kgA*OG zsK~D^+f+|EM{6y|H<;_7N@YiLvO^YJ}5apaKsXX(h&CP9;qCfpZ^ z^NYi=06REpu3v9JDUy#Cn5qn*z4~Z>u%g7u$_jd!HcCp*Lql7^9RwXKk9@_g9g?;+ z?GSyFl0tXU_DfaO>-hLv&`1Bw)D0H(?pJU_B=+O7f9Oj3jtRcXzwS8Sv}4rl6%oM@IGyl9jNquru{8!inpJgOTGh zqxdsO-SC37zn{iyY@G#B56(z0bIT<(lXS}5h4sGpj-PDUnd9wUk*b`A)+IXTuKAC5 z5>D8pouDGU=jP_?+xSa@NIb_IC*=HjauBwS)Xb1)&t7I^$PuAA)W-nn-`}yDA{c80 zQar3GT-}bZnKC!YPhHzjEAYe@?bov_d%eU?RM*wrDV8M|w`fQS`I||PHbkH2oymtx zlG3+c+L&)uyx6IWRahBSZCR24AG+_`fHsKu9i zD*vjs_C1iwJdVSAcH$g`8VM5!tu|luxV!mtnSv$xKufT@X8+Ka)JWU~8$ERLLVVD+ zgVa4dJY0X3lJeR2?@Ic1-HJLomIel)F)>>Ag3HP_5e>t-6a>%QwuQ0Cgv7-8!5~q1 zbYzTprS7S0iMi6*k-iWmmzI{c{D0<_r%eA60)oC0;!kME3mu`R-f~VLM>oMsxseme zHrU<@WF@h2JC!$+xjn9C{z{h;(pEhWH0n&1WkaIR%RpM+TF%(cXtsgnrK9XWgxu_z(9pw z)qA}2l8nWI(+9_yzC5dbl(sp1;V+1Pcw8ut% zUAC*}woOk@H=pX392StXB|R_Ku?zaIhLFedYyx~-Z6(mF`ad}H!l?uuJSj;ZN*T6D zH{bl2Px)AP!3;9G5YR97SUo%;Bcm_j>TdNv&7?Ss!$U*Wg)Mk@_oY@<2m|1}^OLG* zfqeWZ7Aw5nlj8R2SW&>(PyL(4F9e7C`OmKYo;hy2?ot&<-^oc#KquJUWA+D)sA&Ga zV9Fg=%STgK0SNQ=Z6k<(krSFh_|E;Tn99vtvG|czI-i|Ana-}N+8%x0DqGwC%D#gK z8F&q!Aa3FhJmK5p{TW_Tl;l#ErN>hm1Tk_O^-0&C-``BEudB0*i7;%;RV~Vk+%6_f z=GI@H-J}!!>TsARJUCV)(ZeG@4XCG;#$65R=v(cHtu{Z^!7a0a*uekQ7jkF)j0zI2 zN-WOkDk^>w>iOU>6|`+z{ayJxgU^$gr0Pg`jTm~%;?$XcPWO&?zY(E)PNj305dQ(^ zj}qq5xe8vRj*RV8`?kKBgsA<;#R%#n2#Wx`Ptz)G`c@ zzvvxSRxS+RmHuh#B^41Sj2fTaltNZBvb;*&ySfWPd`ztRfyaUanmzfQlnI{ACKhu- z-)p4$KmHgApbfeBvMQi^v)A$1*ceXik;a%BNg3La$$IwG^c2>=(F&~TBG0_(3CBKe zy}q28KVCmuPuyK6c4#2=0BzCTsc~-GB(Koc&Nz>a#<{`m!or5ZGf$5FrlzjG`zs%O_0 zQ5@qZ|9Lq`cLS~w;;sL`_`;`7uRjRANyPJ3R5kaP8Wis|m|q>P%b!hMR#5ulu$K`3 zt;6pZL=F!=)9+K8>s%vqcT`B9^4{dlf%=`J?VUK$SMqoBdaT>ZXYWn7KlI&s)m{hV z%1m3?w&IYag519%{qEYYI1f;}XQ3IxjrH}DkXa3iNtvHUL^#d;6bIX*gyRDo=0AU- zv1N7TjN+5WC{$~kcr30n?|L+%^-6Wojw$|2?a&m^nqy%HS{}^WT(>%lOJ3XQq z8XgAq%K^OLlY?ihn_0{svd&wO7DGL~&klzP3T5a^@29`?e2Oie`DAQ@3dB03FNm## zCG<+^@fZ8b-`oZc`oD-Ko-F+u3bgdB`h>?O0a zv&*PlzHnXo-t-5ZloHSpS5XOz`9n?+bFfyYczPHJ2)$Ea&|KvD)^J$e-O*Fj%W|p< z;{Z}YqVFko%zXKB5QIxuNC?vi5r&{&I$3%ZQ2Zcy$`XYbf+DRfE!|h<4aN?T?%aNC zhK%63b|Ut&3jCXw?vB2L?2fMExQuFsR%Cei5n5W1lWIN&ZoMzBR7dOI{U1iE>y z0izEQ$?!8ar!6=MNzt0%BWXj`Y!uzx>WGH*og@%eKK&4={)W`MrA5HJ%eDX)1xgm2 zOmr;K%x#&vad-%L_EYzm zht9+@_ru?qd(hYDDaX~TDxEoz`)<2^prg|-5Of~ahEo!O`i6$m1wHu|(HR-j5N?KbP7yryE(>|p z15VyU{evMPEEcYakG~cmKQzW%q=XxRfnj=h*nVSe1uu{bLBG!e<}Bfj*C8Pkj78`N zVH3B|Wgd>I?fp*{PkqprcKg%o7^2Hd37d$!zWxv_DtQ=k04Bn)hJ-{F-sd2L(EF3L zveMGy-36J8F)*Dk&h#HQvfLpy@e#?xydBN^=H_|aIP6$(nVGk5CoK76x}l%|Hug>U z`#Lg6Gg?BYDKXdT)ETZ*IRibb&j?JC}El9GhEO z(tdB9;O2t<&0$h+bf)Ud0cha_i;RjwyE{7arkdK(W5+H+k-m6j*GJATywyZ!=M}(r zjACGT2Z}Ou3g(yoP?te1HL~=)G1M^>)rVEe&B_{>b3!Wv9meN@Q(e?>;;t?)r|Xmy z;mo^<^p}^P0%@q!`=U1o%N`8fFyEcGA6Js%O;C96ykH16WN*KOc%c(X}1{OVdj0b)npQ^zFN6(#LVoItsw5R*Xa{Sq)w$%A2O2@8> zxGh^lgm4y$6+3ZM)ZGpJl2B7XA53DvVGvoHmzxXOEQ%@bnnk$-{ zF&^_=or;>e4JiWHUwQ;|7o#CObL`q`^n#j-iUYrXRne88(#Z5PCg-0n>C>*Rtxa8$ zB6&)}Eyj;VHt{)T0fso1S5}VE&;UKXdi@$7MH8Xb+#I4lG%$cUqI?LQ7+HdNnWeUd z7C-EjxT{ym$>K!f;&^LadwaNvRu$u+Lx->)=pX@oVPD~qgDF=j^GkX8RZUG-@Fc|F zq2nT0cN;sqJJfGA@}y6YZN1Q|SJ33*>V_Ev9iFIDF)(}`w%xH~hd5&soan32qjhw2 z?hQf@O`FmUgZ&~vVgwru^%k!OJ1M%KTrh1QHPP4;q8((%b<%2if5M=Rtuh>g6bIQB zD;I}fzyt!aEv9Nz-sC4GJ**mpK7%eZjLR_6L;4yS8uG39iH=BDXJ_j@N%+}ec8C~b zM)N{FdkFgpvEFEeUAGk8kC@0X&h)?+Xh34F>CoQ2Qu6ZsS$BLEo6@GFtg1O#vqwjb z8OQs}M7zEJm74=m#~L9MVq6Ozgphh0N5}9$quslA*CalEOscKj3pOY@vSpsA8pK3Y zYnE>(Ota7Qo6v7$wi<1Q4U3(f{o$393$yqRaS`tLSJiM)sx;do&%&-1BGi*@fH?01 zQ(Si2fRJU@(}Mgg-pYsxpOaO!ZEe5d_s`_X3Ea_dG)3OcfA_Vg2n?ZfZ6gFezoF4VO2EaGJ!$nFR#G z&e(RmyB%VPKBLF)$w&oOeFm5>`YJ08!G+K(&B@J8x2ePE**(+S=H^<1Z0L+cpS%44 zxd2PaaK8iiNUfZzsh34qP=YNb0*T*I2afG->1P9Np zt=NG`q55^@=c5qGaiGqrl$0p2(t+~?27bj7L?-ltJ4$VwF!p^#|IDR5#Qj=SWkto7 zJ`K=;K{HtH@Fh+PBO^e<726DZ3!hvV^I*({T!9P!6aqBWVNqdDU0eUt&uoV#mZ@0}yn`Zf$B!QEND&X1M}+aN5Q#W%@Iqsv zthdO%1-}ma3{%7B@^Ty}3=jHAGErQQ6DdKzVaqhII+4lz>#!;}YDU+tg3YB&4`r)O zm}R!y*=kvzKYxBuH;gkY;<53;CFjz?t=)PS#FXy;IMN9xXOm$gwW>?@)qLbO# zxdN^ZmlW_I_Cu-vq=85(5}UNhYo0g*+}qUTslU*`M=$o)>#=5~dK7RhcOA`gyb(bT`onIlx0(&Zy zP#iiGgawATs|c-ncwcY6l7;iwkXl(q#j-26=F1l%Ffb+vZQ0t;nRu_oX{SM!!-a!} zH9O)*ye@Kr0-=(dpWoKrUXY&;T<{mZ)wXo?nyWiDRCEYjk+jQO)rpDe^V5N&J zP^guG3w;Q?E9&;RGp0mnG`xo}!XZyQdGh4XU3ASTcBmVi;hJh{tex@Co>7vcbN#jw zxvdl9VgS5a0GP0QwY1nF#zS~1akeLVNl1KdmTMdje7{Y%{j%mA6O$DPHqW0^)y#xM z*K~ImW4H&Uiz7QvV9#!{acWA+J62X(lf-}{@3i;j?%!|eB@68m`_KEjdTSsNN)rm5 z`H^H z=WkLI!rW>#g{-CgM+4;k9S8EG( z?d%p1!!nKJdv@ApTs|04UgvN)zGrsqm_EkVppNx@{1}f_h6T9+4v)UdrY0N6_8~qH z+CnyN-JSh$87^vuAeg;#ZHH^I4VAx{sYtQ+=BB2p(4qi>kO(Oi<>Uh4{lr2?3ZRg{ zUJrzqUfcpyCpCTgwwakL;?a=)MH#v=yMythc1=aq&8HwuJ^hzJHl zr@Qjb#x?$#oqa0u!9JZI(S7)=3e4QRsy8!v%w3_!K@$ZNx-W)~@G|NbTPre6>YF!* zsi}EF;R(EW;leq8fSb(3M1T*4sw`$khM@LeaY%we^n$NmzPzcW#co1PMs~~CSWR91 zA{s~7ShPf<>V`pgFqN0rca`So(F^+3WZ)5?AD9D!L#ih6QlKV=SmWZ3FA(cvg^Mc% z{rG>+){gS;upmi0KSUsDT@zHnm=QYLT;N{J%)?+=uwh`7rJivt`k->5Zp-<8x0aU@ zhiY;$oSZI%*C8)a`4PeH z?pV&KNxTM(00C3sv-v&R!~(Hwf^C$z*_(HYkp3S=DS;$ueL$P?M9ISD#ip$=r27;uXs1~ z^5pSul9J0X4kPKMDQVugfvzB04EU64YHEO4SZ0`AfZtK1k@m+gY=HM3JH0{{lyVfw6J1pL7(q6@fn8Y_yzt5$>Yh7j`!^0wjQuVSibi1UD+y1X(SXxtL>-8H ze|t_#Q86Jc4TzYeCJ}@WGA@mkftsf7f8b$=qeYgQ5b`kQy0}|3^Ua%DS~T-a563ln zfWY^@U^#u7a;rr<-Z$|-;hl@?t1Dx!H0WjVzESwIwUXAhwju0YST=YMXtTpm67Fsb z`Gu+Vn8sfoAgJ~;@oMZ~_&X_MFlHJB*CAkkWH)ik1g)9>#N_6B2M;xuj@ED{_1K>0 zYl?8NixY#6iyAVh1pT7fB!svpCU$@jDBd@hTl<8wVJ<=r3K zWo0f46^JZPAJaF0Kc0=vX)P7Mu=SREw9WtSQzdDE>n9THw^a`3G(yuM)R430G;}hpNe_$0v#5! z9&(U}9Xq@pO`bT#&7B1e8}A-+5w#`2-`}j7{3*kZBYSq%pRgz~!ws~l)u1rL8+t8} zPTi^jn6CaFhgEM8o{AtOEL;N67jRrugppCNGuuEmdb~;{vDUFMgv;0n6Jt?j8yHG`@g=!^Nw?l1#$n)YK|$$y<5O-13%gJ!8#X81<1K zVE0BxoVIxkT_Z&4dDL>4rval!%qH3Lq5Z7a>px;DqDkpHr7--ByI5sLL(9@`lMw?j zfZkF_k58W5MJw9IW-n%_e7Dr6r!hNq);pw?R;JZM)KD9d#sHxxNWC$@9m{W~LeHKae`iA8 zm*C+H;0kz|huyPoFhYP}_HC0*G zt1FNrCpSHP63DNacCzWE&#PA~xbcFSC|;x@wNdFkl? z#JR7NfOFFW?cQw>78IoQ^>z4BB6*iMLB7#_V{4$XccNX6+Lm&7U%#W*XS3j&<%k0C z;BioSV-phyO3Z?S(dtb1Ox2(W!4?G#2~bZ6jvTJiR5#3XnhzpDb~X?05x3+|OzgUJT~3bSpL_g1>}aK>8(2Eb z2}HYDCjk?2sAuCL1*)*~0ED7Hm7kaQ_Rk*7{9*z_qIt{OvNc&asqxc8lWWe_={$XIp!?TvIC-VHZVxuQZ(*Vp}Sk|ph);A zf^I}Kis8y=)2XeVg}2vn6{wH@`z}TG!`H7*+cilH^WR&&3-?`RMxIe4!d1c;z=Qf7x_6p z&PGMb{6_)SZVaFY15Uze5P8wt+Z&zDdW#@PL+Ha+tGxM`h``8~A&3civ0L;OwZdb7 zA+Yjtufmyoyx#u}1}PMsoeRNXy}WkhjA9WnVTlL>FNgMp#<;=A)&oXpY2jE5@x`go zGcf_>t7V7!H_`O63VDFp4(u6#Khi0TfePB@;@q5iiHkjijup4k#c6mIq2OU}@feMN zV&8EoRw@Yaoe+w(wM!tFhIFqB=yOf?l>lxn!+B`v9_j;}3u{K_2WLARM`%U}5>6^o zOw;e?<>dwE0yt`SjeZ3v*VWN6>m-Cq2V+0a{kxML+_3Wg{HZ6Eq)xUzIE)NNvYP>t48NiZfOJHfjQynoY{sLaj$g1AW2M4_hG5N=a;R!- zl-Jc2#XPRC@I9n4bcaF&>Hn7!X8L_s8vr#%xSR|Gl!p_1d?dg(&{{c$Ar&gBq~zo+ z;DGsbbX53+guo*={kck020K?qqOI^)itRggVB7*JAGvIJV&W{d|2|SujKX6q|BQ)= zk&+{n*`g<7~qHN2-^}%>C3zjWsF`?9VQs{d8f!Iipt=yMc{8?}aPF z36y-sCrID_xKKJm9-}x!{)lk4b5tx}yRxb1a`yM4>~mPyvn;I!gI`Z14{vO|U+L`` z8_a*=kg~eI*6KP_=rgmzFf}IpC*KH(itqKe)2Gj$SLF=9xtZIt^a?3!V?Ml0_WE_? z${7q;p)19EbU#e~!*ccQPbUKXd%Q@LMN+A`POLr2|!BaEB>slw4 zhBg8N4?g^c9BxCW3#|nh2s4nnySy&*32<}I9r9S-q1bHdBzOHf^Vy3wKX*38batvA z^s)OrsXnjZ;&O@m9GOqG;_j+B5Kib~9I1!-#zG~Th79qL0X4OVPIDH4Q0ZaVOz2+- zii*z6%=9A+rVCw`*rFR)!h)XH4I|gG{D$Uz>S3-1$NHJT5HG=_u~Y6;FIgT-vs1@i zvVUy8r02Tr_2SDG6@{CtUH1o88g@ME{;1uSp)FH7vak}!QUEyHeu<2M!BUf<{9K+! z0NIVSR-Q;%mS=BT#|sND23+&HeN-KTT{oC0V3k6jMeYQdf;=Xx@Ov1OFT+zu072es zWe^!xCUiGV`DpAfy^v+ep*_9iJc*;3co9GmsQQb`&4-X7etJ(OIQBV%Kts}f-$zQb zckkZsbWjPokM7swWnw~CtFp-ti~&kiaNTg-hAu`#u@tdEH(9CJLdQ}4_9USF2ip=< znbn(g%vHfDDXeLYxAlkiBy45IdRc~`Ul>mw9$tc%-_FG)N~owq$GT)-&&ez`SxNyy z*}0>!_luoeH-~hOOy4q?D=NCgwfnhrvW4^h^1GLM(P;ef!CkyV4__Nhv2dLQoc2|>8HXnN4UBKvO_=@Qiu z&CBI%C7gz|C-K|{PcqPGr^~kmqF3BRu1K;xLvDtCt-&6apD*BjWnhtt7)_^XF3>%0 zchtFBFAF#c8TG({1LS{Bp>yDSh)-_wX^W0^7by#6*q-eSJ2x&qUwa5gR!16ds?Hf zt*uS%@BKlp;+$-P!t&}W3lmev`pdvQJGUcPe|@D7mLyI#jotmSFF~Ptz#3Sf6n0#_ zM(B@3Msl0vQR%ZiOe`#q>V_%gZ*?*({r-)K{o=c0A(BiyGy#wh#?J5^-M@>QwFvG@ z3Am40IXIXtGr?u`u%ca#4o!>OTN^D&2r}ClLt(<6KgW3J%O**N&>H<+UJ1p;(L!LY!w`+I>4BUt=+%L(k+2~L`t4N< zl@=E&_a@WJ=>&>@gI4L-7#eqYeohaV3u>U2Im!C7Zmx2;^`N7oGgn%wli3bItgN`W z7*v)0Xc1_7bVN`dKj>I$M)^Mboe6q#@HhH zU1Ik>f71&D29ifcv#X!Z)td`EJB2g#($bVK3Y}NTkmA>_F+MakGs83V;0L%!4mqJ# zFAKRIEj>SBx`RegHeee&U3w#r6}oJAjXn;_m4sQ~x9@vbkn=DcgzAS4tHBdwes>yu z(aJje)(NBmWv2R5jp+h2U?5lsruxuOLc;*k)QvJ}CJMi#8*fz78X6lN=cptA9ic4{ z8PRh1hQb;X_GfNx3}VFC*h!IGJY3>5Gjm}xW0X$(s`FdIEh(p_e&+2~ry(|Rb93|a zlUV5xK2YDiq^+lysKkbc0kqwy+OBipy$h_J1fhfb8wnpG7hOtve+>Y*hh5?$c-qYl z2@tGU5)}3nWDuP0eQHIcnef8~`S`#80v?g7`vb5#5oRx(+p>`m7~sxD z6cjGd%hKGrwRxQhm8*a5hwm)sbt(o$_sQ2Kd9}e<@D?!X*YL2qGKO!=l%Le-<5?;5 ztrBb0GS{!$+pK4Z-=E%*NwVC>>okETjygvq85!9-rBCl0dwS@i8+685$z1#-9cKF0 zYrUMco#g)9Pu{ND_>lvncpm?wwkwZ^dSAn$V>ts~QZNtmgwQCnP9{e1?xGFmIx}^?hS9&Xn{EJMrrRDR!ZjP=Ju-XwXi4&S^NZj4_Y=9Arc7+*k?KM1g-Cv zUkp;eQN~K5wpl^IQTbe-z&faoi;Z4C?u9DaVxX-YMN)rP$Wo5%!*f=xY zj-^+KL0YP+@eR*V2Q?3!3C&J+UtcO&M!l8BBu%$(KN8LG0^W~|02hoG;qb?ZgM zeO(Vkh}R1e&Vk>FKz4H?9);3gvQPw;mltO%YuhR#pKkBx8zAA1`nY;{APo^bY85^L zxPPhs0G!pb1y%xR+=@}54VyNpNt_2&N(cjfqy^4T0mO^Fj&&>70w=1h9M?F6Mbe=6 zBRR+p(!8*F#X0C#DB|y3Dna&@l<42h$7DT#whlkaAf|9E16^j4%6dNx082ck;1j^U zf>r^zKthpqcE%`WrG{{e#>U3wyrK0DV2ovFkrx6v5o2s12qqK;_&6z>JzQKcnqgmV zeG+4AbacI5v`8Y%uc&X1g4y=-h{G9;z_uoqW}mQFwI8NnoPPja%cEvK8Om5sXdxk#1S^2=R#f3ohOfBg7P+=mrLAZm+IRAq{n;3wj*z0kCx$51 zSdgF3akvi+VFSfes_~B@4aPv5kE=xZm(mHegEbiLp3h89DjOIUbUxR-mX@|Txg}4f z$J*c>JVWE89bZ7k15-CQdB2yK5l|I0FSI^<=%slDpC>*7#AIG6!rPu}5`RZ9;#Hp! z3|Dj86?pld+BmY zO8p5bg1WA*ne+ykmp}43j~2%e%B89+mK4|~k`z<{KornVke*1RBvIgH6= zYCbS5&PIWqYh3huT=3LJt@0 zvBvMmBcse|?yOs`dnuG{^R2I$FNu?+&?fh%O7!s^XBm$5YZY2ca+}=4M8c0~T|JI8 z4^K~#24%qp0GeG?@HaU`wl;`NEv;q;Wr!Cy+)D1unbtVBINf~o=uuafbu{B~S68-$ zoQvJj0G_lbJ?GC0B54J&ehE!sL%vp4@eD`8GGDOe1(~F9hGTD#nVpS|K0i47>YtU< znDjJlgZmV_%i)!k8q92}5;b$gSylA?1U$o&B?jbDiEc)+%S(qOea z!qvTK6cd?kF84LII-b4gU${$NLE)4-?U1GAkpscVCc_Ow%L7M`SkRtZt_g>WJ>1=a zsShe8%OM;t4z@3BWI`|l1A-Uc&ke!(3tF+Vw@+_#0j8!01HcD0`n>ubtQ-RKozN5r z(jIvr?PW{3mqaw6N(<3;=d|~NRgHS)MFaUk(Uq?B%1ZwH$jbi)mG(@~DC4Qn*p;q= zKgwJ69{0cFWR{gH1Y4+g*gfOOXxi>=2Rei566z-f``8$s@t?e*M?5`Ca&ujv0$12? z!{fupSM0q`N2jks=XZD%euST(l)U+(;e9g$clSc;0ywge-=l!IsTOvJ$F^1`(>276 zLP^rR^zSIfU(c}tx z_n(c8H3uOG?{!d+?i>1EA0LP!G^(5HwZ7mD2S=Q9R9I%(E7O<*$bQ8tr@4767(84o zxbO6X{TG-X!Dx!G!~7)j3Iol{m+NL1F*HD~ns3zmq=H8d;hmbAxBX|_aula>CwM&6 zI9MI6=-tACN!DYquH7hf0D8swB*BIUB(?3*El#ShvUgEA1}tDFCns5hTr94&{tAO% zTtXbKW4}2wjt3M048wc&*N=fD|IB%C!;<>i*AR zvI;A{)k91Z5{S-U;YG@kKb&-8$i8c603L!^VKO#1GxKp_a1lo<33mh0G(K2XDEcrN zx!YUDH_eac6(CUUz7#wxosJ9H8a#CW;X`1L>%rSsR{Q;&tQ)Z>$HdeW!wW2scCT#e z3YP5Wq{n@MP*39y7gsJ=1c6esir}r26q0_8teOvgTE>9&sloIj~YC}R! zol;M3fztk65+le+KJgsGQ8(n16alXWc}(e|VdM^It<$r!+t$QD;arE_pv#WRqP415m2KaaGT%JOm*&TtE%WYqWy$NJG(9E@*m zB$YvW9~>NfZA=^MnKhP!C{NE4NWVDTmI1^dZn}dqPsvYLeYUuaBhaeR>lc%`B@* z7?W$QFygIS%c*LQ2L`}=eT6`79Uxnd>Y_3J5g4leOTmy9(-b8L4HFX4++c`|q~rm6 zdymQ~G(*fOfLfvTkFY+{-Mw4LcPAUc3cR6bBtl1$>Bz2o|13hLW?`ZVm6ekffb2LI zmzQZCH6yQIFV3<&u5OIUR-|yQ0t^g+rGAuS@gr}^iB4R7+fJYxB0@rXmE;`9%XPsJ#v>QrrMnl{sqHdW=)6E;20 z;{%#I^Z0Y2;5&Yn2`qlXf8khaUE4R_gqArCms)5&3=U=a09d7&1l-MX#6&oSTls^MmKC4!c%2FiK z{$^l0{2lQm9_sck#Y`#}7Y~8+Hv-67uT^!-t{~7zw4|3Rz?`;#BuJ4n-O5~0avHKUrvf3`u*m-N7 z$>f_idHMNnWb%#T;_lHI*zaCXOek&H;vA-f^ETW`hc{j61U!32SyqMC zaBrJ`qQOB3*6X4n0%cFJn^)#Mn}7H26jtb`r$y3rGO1J~j30FE22giawM7WNg`CdG z;q(2ppfGGC*`mh44vnzi=xA;KX*p(hz{~VLicHlHkA0Y#Q)3gd+HSu%dU4g6yzyes ziu$tn;k1j2%FFxSSC9K?`OobmNN@$!1D|e^miVOG*9}zjdiUr!aUYynH#;(xOooRR z^Ko%WLC5x7Ty}cH*ZuiFC=Tp@4&kz(efvsDa8|y!VtE?=EI;x`KfKJCI|7)-PiMet z_YyA83EX6pwcNf8v>PFgM(E9tcaU`U+3KEBI6A3qw>vDkxWtcQeCK?d^C#h1H|{pd Tyweok3YXE3dv+EXIGp__-n*%W literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/overviews/overview_sizer_00.png b/docs/sphinx/_static/images/overviews/overview_sizer_00.png new file mode 100644 index 0000000000000000000000000000000000000000..26750c3590855394f8ac7b79d64b387ae977bb5a GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^5kPFj!VDy}t}t2yDaPU;cPEB*=VV?2IR*hfA+GoC z-2*a{l9G-dJ<7n){Qv*|;^N|aK>}B=UY#;!3Q!6SEamTas2ERN4`S} z0;~aF*ftv^Mz42RCB8!4pny^M-9f&-2f3vj+*>pM+K0W(zqFxZ?g0i+Zy@fvpa>v5ldJlVUeySSD`OFL|Zyu%N@?1yc&XI0)M>)!bg+1~E?#;N9oTgNQr zw)}B=UY#;!3Q!6S|z?bkw;Ja@Xe_2j!RkY-ivMmdIcs5@2zg%LtzW#@UHcPO!o`RI3 ziod*YZcMl87M|@K3mFzjXJ4KBV(A?|P5v48_>>#3dZ=(1RNmAm)eu-q>5S0Zth%~fH>NGpLyQ?5=-6n?HReC%k_nzf%f*Bqbdn~<41 zPxqeiv7*jX)82O(f1V(!es_ahTIB8}9EB$ZRewC6fN}V{HZeV46fn)aU=>NM!COWdsm^<_MpJ^>tkvH?Y zp0IMfoy32-_jb(fe+6L{-nZVodE+nXd!}P>ZQQrN?z1m5rBwE3&vf6Z2M* zwNxtKa-QSn=E;(b+MNw|mrP&wU&8fQe$C!Uh26#}wtP%4-LG}KXejaNb?Ou|hVL#( zFkF&-J4{LZ<#BDcZCRDBeP#cDhl%;m*gfaZ{vU7Uy|(;sKC%4N6bGMq9~yN8LTyV6< zXNQ!pTo*9<((%1W)==+T&w-kwPI`K^DP~jmz3=7|b-q2l;^?wWt7)b8>m2$|&hMY1 q@Abb*a{tl&MPEZ!>Px#Fi=cXMc&@t0001DVq(R`#Q*?<|NsAUb93HO5Y^Syl$4ZKoEv$-++)!+M|7ghS0u1eSl3FgW+i6d-Tvm zj~;vU(4^_D2Ts0RXBR{Z2<-eMR>QAZAi5tjyE6m3o`>lM?C(uHFN8ES;H8(Y127AV zrUgK(@*=JR7GW4IJ1m&SO{Y1)bT*JqfH8t7=5J*TW(#XT0U)aez%(|W1`F5(Yd`^b zHK$Lf0MrBsXUn5mm@SQ-8vw?3cB2b$at!j06nDAM2CySg2mBqx)>)X^nTQ3`*cyp_ z0tpS}3r*)U)x;H`5l{lwA8z{2^>qOFPEyGF5&g8;se0DQ%F*4lPfG7C(j ze6~cB9AI5hLI6K8EI^ak0@B41b3qEQvrxElk)b>S#(Ge#2R>R4q!#S!0pP;E9w@XP zD6AgH;$TdsYpVz1hifTWHXiDMMjr2`9%%IaKuG~bJ|+V1Vi_jyqtE0v^L* z0e4P&fDO4oZu-m*$+)LF9N^r0>$eY(CY}%K7y9i=_aOiz+5i9m07*qoM6N<$f>yf_ AiU0rr literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/overviews/overview_sizer_05.png b/docs/sphinx/_static/images/overviews/overview_sizer_05.png new file mode 100644 index 0000000000000000000000000000000000000000..4066f51b12b9f16d342148573bb3fe0f4cc7bd60 GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^NkDAF!VDzy`HOY|DaPU;cPEB*=VV?2IR*hfA+GoC z-2*a{l9G-dJ<7n){Qv*|;^N|aK>}B=Ufr@~3s4FT9C`dZ5NHmwr;B5V$ML6AFY+Ez z5NNx|TcPlA>pF)ktO*QB{j9S}`0vLYVBh}LA;XaM@Y2l7FZ?f?@W%h&{dhr-;MT=V zYZ84fnamET%$>Hu=#EhfTZ7rTtIQWYD_?ob8Pv%tJxsG+<&m+)(Rfdi+_ukRjSTCj zFxU(6n|u^&+_CHU=a!6Mr(1R_r@o!5r`h;$#|f_^Cj1rQYb8SaE_kh+^5cw6y!MB$ zt5)Teo!!4qVXODH>udBvJk+N&pXYy7m)`&WTk@G%63bt) XzN(Isj%Ve~1BH;MtDnm{r-UW|@eiF1 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/overviews/overview_sizer_06.png b/docs/sphinx/_static/images/overviews/overview_sizer_06.png new file mode 100644 index 0000000000000000000000000000000000000000..e24a67e6f27a25a4ebfe4be27774766524338cee GIT binary patch literal 908 zcmV;719SX|P)Px#Fi=cXMc&@t0001DVq(R`#Q*?<|NsAUb93HO5Y^Syl$4Zw{KvKVS7y9pqOo6p!)!#*5cq}VBbTB zfPLI!jyV)UZaw(4FIP!+wr;CfmS!YR8_kCOAt8K>{>Fnh%c#aXva;+Z%POMr@6f(( z9EtY-(T>&hghk^rt{-X;?XIf!C(NuJYSUW}nqny)E=?tl^IHBu=GyU2CvBo}9Z=e# zRu5>_WZHDnCfYak_A?5NgK5?AG+Uv^lZr1;ni@$tsHilYxi*q`jXI!cG(FRRwBMHj z-U>bFRa%qUJn&8f^eva}L6s^GnzVFnu$tD9j6_Sc$h7{!63=5it^Bw5d?|KLw0t?r z$MLmUOI!RcD((JJRs(XYL80}Iw98WbP_(8e zydC&u7*xtkw5IC|FPeg>2PkW;d}{fCOH-zum~R-qG(E5e+Ft(g*`FqWbB*(0w7i36 z?eZ$EQO8w5azGn-CVT+UV9P+S(AQ{VP3*ryA)ANgG|(kO0od0>Fq%dcB+pQV>bIfU zilXgkS zB25o$NscBjg*A0M1gh6CdM)1d8odF%)@zPgi?9q{>b3PW?_P_4y;eHzYa-TwI?$q= z2D5r?{l1pY&_oMML+G^xqG9w}wrgU&8QQEUBG`_(M$W1B*BH$vma5kn-Tqq1sP@-b zlx1LT>X_;^X6Y0m(QHi}a{(SDYqpcvSg%o|#Xb$*2F>ZV07sg!sk54<3!YFkV^e1} z&F!`TH=4Nzuzo=0^KB85CVc0bx;sV$%~}qjooNoJQWaro!k^ZMqM4gI>uGyA)vB=j zn((HbgVA88f!iIXk!iPdX`iY@`-5ibRD?J~ZB3mQ8n?vv@dc4)ZR(_NX(U>rb?G~M ip0xKLiN;NqlZ~G$g?_CWRjVWb0000Qkp(W6Hh7@Gh8|6g2Od@o4g>eZ`Lrc41!p@ID1AJc&5%<^<`49U3n_Lg_v zVFdw(fLGERlB44px9)YQZCI61Du43(3|H0ao2mKH{0Cp2-zZ@d5@6h^J;S%KJax$E@w*8@E9JH#@sVt^bu2w-?c^|J+whu~@9g#&yXw z#PP!GlZgS>!~W*TvmKrH@Vcenl_v%(oK`o@Sa{s6*jtq4uE#QmP#Y09CXr*c0Xvzs zG%s9D`LlOn$HM&E1sPY8KGia_?%Fj&>d>n8AEEL)Y-9cTnt#=n>|S#Fw?@FXz>c=G zg49(P4m;m3KYrig=ewE9He6n$w%J)Ra8tWj!S0xa?QPFw&OTirlW`eHe=1+(c4E!r a%{}r9m6BUO{99KHia1YKKbLh*2~7ZWF6|Kj literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/overviews/overview_sizer_08.png b/docs/sphinx/_static/images/overviews/overview_sizer_08.png new file mode 100644 index 0000000000000000000000000000000000000000..63a50a681ab649da5c3429bc6796f7876a3357a4 GIT binary patch literal 478 zcmV<40U`d0P)Px#Fi=cXMc&@t0001DVq(R`#Q*?<|NsAUb93HO5Y^Sy?(XiSq@TYt+FYX}sl+5q6XS?S;NB@k_ zlBVTI07=gg@oFhDY~t;Y2_q|OtgYw-#^WLr7+RTAi|d53TteFXS#c^4z2bB??1!1x zDak^-Qxp^Yd(I~A_gD0Oi9Kx^z<5gbL<2T)xH&?*%cFgzR0891kqHc4>QjsBgzmY7 z?DJ>EsXX+G)7`Ki`qs}?4&v}ZQkfrxDD$Jtk1{{X{3!F|cZmG|kv%-}v=Wl5BMH*d UUPh7@fdBvi07*qoM6N<$f^AURzyJUM literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/overviews/overview_sizer_09.png b/docs/sphinx/_static/images/overviews/overview_sizer_09.png new file mode 100644 index 0000000000000000000000000000000000000000..943d2ee1a9c5ca2022954b937322588388a68c34 GIT binary patch literal 608 zcmV-m0-ybfP)Px#Fi=cXMc&@t0001DVq(R`#Q*?<|NsAUb93HO5Y^Syl$4YJ000000000000000 z000000B=+HmH+?&-bqA3RA}Dq+DmSOFc1Jx+8cQ1ZF&XN_5yH#sxeB}k#dh&RI-;{ zbir-w0hEsdVkUOV5X~e)BpSqvKf^CYAuygKqKZvXl=5N~s%p7V)dQ%Sa#&^khle5xGd%Js7`V-Mz0)m2rcsV+x*t~uzsc_^kbWUB3% ztEj{yj-E5fQR#X6jLJ(3RjEon-40h$^(dgUXw@ z^3^UFyOYZ8P=x~?Ro`yGI8*J09`uX%U>H%^INGJD`Z)+zkV;6XN>!>-)ml|xXwj8^ z>H(ace5Imo`qA%*_|w_RS1MXJ0%u2ooqVI}M^&p);nfZd19nz5o*dZ8vnt#Yt}YKJ zRO88kojj+)jqpm0q?$+$>|~k>JVOPZp#p!q%5YSMqcZ-{dXPBUCz1m@nK%cDm0>(N zu#>6v3OMx&IQ0tjh@+~-RHVCJ|E*%3w+GstJ9cuC>Tbz;J*X;GscMa?R!*E$i$1uS ue2yb5RHdrBsr3I>RMqo~yx0^*V*CLE@MRg+LP^2^0000h_KR~8kYX$ja(7}_cTVOdkYf=7bI}?>eYAe-Yr?OWXhB&Km~AMeD$Xy0|S$vr;B4q z#jUruZSxKph_HXyV*VjPQ}U(gqHW?0%nKf^uon7$qCuon)4BZ%M-Goq%)0Y_9zP0V zZW}r-{m=f$`N8+g#q)euc!~5%_$Mb_RO!0(@zJ_lCN&P+D^fFyAFnyvBGCPG%Q;U^eW|iOBv{Y;D#TKq=-xb}Zxgm3a9J?on&E0bo*Dt;K zYKi*hsXgV@y~_g5Et~(W>W<6Zx$}%)t~)v#8)QDqMMKEqnv zj`_`&c58jjV_X>*7TE4P)*~3@t>rxB!h*ZO$!oN%H8x(zXnk^b^9{G(lj2utn0t24 z-8M}bNN?PH?a8#4r;S#6xuvRYy|dVKXX-DT{_Z(ujAHXoy1o6qV&X!DUEV#no`D(N zv0GPNT(RerpSD!*DQz2*V=<=3{%qZqxF$X5>awWInQE`+z3GeoxjO87O8K3bT}$Hf zQ*TdR<*_(y{q{X?Pu?>vSXG<9{q~Vm{m6X2cIP+Sr%(A5eA)B#(+-KhCt(LJb<}znrPI-CtnN3UCMA!9!KN+{Y z*0J5%sbH*`lRoL*srK_vQpKG8KPlLryjg#DCz9PjN6cFP?1O(g;})fkG?|N;)ei;s y-nwVORDZOMjW^2RZDIZPAAgMEe3Z=6{xGy{NeI%?ocJD;%sgHFT-G@yGywqZa$JxA literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/overviews/overview_sizer_11.png b/docs/sphinx/_static/images/overviews/overview_sizer_11.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f353c490de82adeccfea7995d5aac8f6905d04 GIT binary patch literal 631 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/appearance.png b/docs/sphinx/_static/images/sphinxdocs/appearance.png new file mode 100644 index 0000000000000000000000000000000000000000..2e807159c74656526699547b154fc1d4d9f50dd3 GIT binary patch literal 1893 zcmV-r2b%baP)GVIRmeBPOR?|J>>&dv^HH^#;kPcoUC zn{(gindf=l_uNq;!mV8TmZJYZ5OCg0uupBXC=H@0>fg`?PVK2WmAx+cK^741j75;dj3G!}%i8`M(4&6-RYBck%1fXUur;(xtcY zDqc<-v-X+iUidpSS@7M*fAr9*mG6J9ea3Wc#bUHU5L#PW-!*t9Gt4W;4&ySNf&TNP zTc+{Jhd%ediJ${blIyQRuB=i(YUery8<7$aE^0ty-7AZ!j;Px znLVe6O@g zVAbmT$mOfJu{ag4*2rEH0ZpY+Wy_{s;_*1vTJrfKRv;F0X>CbO3aFH7T$jrwp84g^ zs1&a=IM`3QRN|4HySVTEk2lD@^yic0aueBa5Qw=kj4?Q_i?zZlC;BkPMJZw4oZCpJ z63wu6@Te%jwc)Eg{qvtt^*s9f|3xeoXV14EXX&yPGzUGINMMY6GXZT3TIU zT7!Tw8m%?f3Sk&BmdlbG9i^kAlU%NfwR3MM1YkqU$o10iQ8@e{pjP$hnb$?JSYqMAZfxC0B|@!M zBcIPvE|)of{yf$SkA3U=%$(WYu&|-jO+2PlK%y)hkmdj4?Pk zNH&{g`SLrMJ!ftsJ5ftcpb8KM0mg9}WR%jATVU#4@J{On2F`QpBWT}LXFj(`M8r6Ny0`2>Z0p1bc^&9-gZ8R+ll(XZ@c-AC5(r7!OynM~cJfSw@W zMDt%F>LPIZjlXi__b)JXrF8_3(AW1CPyKj5p$)m7xrXoiEL^mN^&3A1 zsCp)(AyqOF86|4QBwrH=a67Pggq^ zhex@1ElYcwM@zb&Y%a^}R42kLF|`8P7>qF_lPMN0UP>4Sb;T4~8+_lVSS*l8 zBuJ)Gh)fW$2!0S!ELA90JbXVO>9o?-I*XB!5iXAn(UNY96wrDq1)?qhg;EN~iA{`L zYYBpYL?VgS8o%b(+g8lxEZH(IW-njDDQu!OZ1YeR~~5|v5?5lhlZaL4jhjk?h&p5!=2#A6cR6!LjSvsqeOS_p!G=`(I43@sv&RS4rpP`$-q;vgM>q2M0>xs988c=QOIR)s7l9(6h{xj;3Yo)=63s6Q2M--zq(pVr z1yP~3%36z9t3n&9FbtJgtE@!728mk1HIgO_TCu+sIzC!vVZ@6ee&cerfR ziYkB)-gRf&M>lTR5Kku3S}Egso}bO;E-hTRAaVNin}=UK_`4y;aRS$MgLFC_baizF zn>TL`_w3mtYVY2?>cD{m&hYTC>v^8*`@Up&^x8)JOeb^TN-RhvJ5ez0%fzTgH6cJJP;Pn|lYu3o*Wi^Zb$ zJkR*PuY({kBBHIeT12!&L*She6|J=$|JGWEj^l)`>)J#jVcXi;Y literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/available.png b/docs/sphinx/_static/images/sphinxdocs/available.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc42aaf83aacc9cb6999ab95f4b7f6ea317de95 GIT binary patch literal 4477 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 P00000NkvXXu0mjfDC~T- literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/background.png b/docs/sphinx/_static/images/sphinxdocs/background.png new file mode 100644 index 0000000000000000000000000000000000000000..284ae3fcdd261bedfb73d5998ee733835f50c334 GIT binary patch literal 1302 zcmeAS@N?(olHy`uVBq!ia0y~yU~U1jwK$l8GZx^prwfgF}}M_)$< zhK>E)e-c@Nsu==&LR_a#ojPsWwCU5Q&zLb|=FFM1XV0E9XU@EN^A;{#xOnm6B}>1E8qhK@y215uW zdwjkCbO&dFM`SSr1K(i~W;~w1A_XWYS>hT|5}cn_Ql40p$`Fv4nOCCc=Nh6=W~^tb zXX@GY=K(N>Re8ENhE&A8y?xP7Dv-hTVslhr^h(jF)oX8EJN3VQ(P5q$TRM-a`z2lT zI}tOZ@wAR!3;T(s90Du2p7evr6kR5kRZRC0pk7C29cElj7*`8f5gC~ z5Qx0f&Cs~Y;hjr^L#V=bC5HuC6Xt_Sc`zw0s1P7}Vk_9_-C)v-g(HOZlP{PI1(BPg z)*YL6xJ<^5-zBIhG_T4Gl1C~uqxqe%qNDu5>u%j)7K~9|00dnFqu!EAp z4w?vdiUY`cBd`*nicJn*l@B~&;W$$xyOo1u3TqL>+X^7l>I{Sbu5CHVdFHvLD9FSb ru-AG1uMlTsa&4>;1c}9fY&jt8E7o^IdaA$*P&)E-^>bP0l+XkK@+}n0 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/base.png b/docs/sphinx/_static/images/sphinxdocs/base.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdf637129b3b4b541ebd41a5904626b88d8c9a3 GIT binary patch literal 1513 zcmVCVpyL@)MtYahL~VN(o94jgb+pKBN&Aj%n%bO7D}nmkKOI= z&fI&C4@}$HvMmLyH~Htz?A$s3-#KSy?t+LgmD;&?L42a?3Z`&awz-t4xNh0zOXIDX zG62gq7brSTHLb0vQ6ucAWt*-48-Qh-a}*uFF5Xg=oVzl?mhDKy6b;8L+gvy00G4ge zRCSy+H&&%)%r_VSRL|70WP3cWX!y~x&E-=DVA*D^s^d)a`l`Cd#fg&GHH{h;ZL3Hq z8h)~DbJ2eeVA*C;)p5G1CE3upB&kUONC`+Ws+!q4o4+Yqsc87cvdwu91h8y#^(4*X zs*axX0Wn&EYo}!{Kgb=)@eTltRKRLCU#+f6ef`{vYYg2`M>3JbAxWa^RwsTx zc{L*iHYpnRRHrK6Skc-PV+w&n>m}`I| z_rwcM+VzL4&UWryuz7l_{`+TI*BW{Zqdf}+8VO7SJw3fh)+C^6Z1frgeCfdxId~!u zPZYq(1Cay(+`deO>}_0>9GjiATL`yZV+%9DW9NDH^_7zj1kNM$Md(HgM_T zPQD9$`CBORvN6hz!EWOHU38NKRyk?6cf55YZ$VqTxtpo@V#Bj7vD#!kxbV=M>qJlX zTA6Go9@$}#?o&}p+UKO*&mYJ9p#TDi8pd#*fNz`w?kA6H zUIM@v(*Z;QL;~r7w2+iUDiY7$^$G|!OaKyq0KfzJfxNJ2cyBHT5SUj2hykbwK*Fjh zbL;~s0w@G?ah&s#-^PNJw1D0F;%Gqy!kL$?Mj#o=)DO+W;s6AV)9Zf$w#b^`Y4{jq P00000NkvXXu0mjfiYBX= literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/cell_blue.jpg b/docs/sphinx/_static/images/sphinxdocs/cell_blue.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1debb906d792670f3119f696e83d0c9d89fde36 GIT binary patch literal 17943 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/cell_grey.jpg b/docs/sphinx/_static/images/sphinxdocs/cell_grey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dac9e16efc1281c24f42f1e710b821fd8f3e6ee GIT binary patch literal 15354 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≧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 JPDHLkV1iwaJz)R< literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/class_hierarchy.png b/docs/sphinx/_static/images/sphinxdocs/class_hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..8be401484f21ff5edc05c1f1de514946f6077ced GIT binary patch literal 1373 zcmV-j1)}rse3lKbfNAr5zrVH zH8C#SNZhm-B9b60MMzMA1}Y-Oc9`k+e7=wC;=P&9w9|ydrffW!^XARVedqk{Isg0K z9bt^&Nt%43+5ZOs6u{Wnn4X=T9g|WX*p8&W@Bi*N&L=ia*O4R>)}7squQahoQTRILDRE2@BezQBbG z7s%xvke^2r6k**QcMU)Yfe-@U_W&pq^5hEzdNUai zfes9SSl6CLf~I69019AC{mxc^dIf}7OD=@K^Mk>@F<^XrW5~VtHqo7X(CI!_uKh&E zk=IEaeWQh7ed1$wOakU}D508sDO#fulYbLS4pWRfFD22Pv;pmXRjb3dG; z`sfjp=g&8nfTOP+C7sT+B=`N+iZuWP0?+f2QiOmKDZ?27XV08z+;sWXU39+xCUz!4 z<=zd-JV)XFecl~A-V%Iba*|9s)2atH0SM@P1QH|b!~);*0XTi;Ed4uoA%!6Im? zRzTZCqY<>$6uvo&lbZnqSeoRaVd5{nvH?U0K_p@$r9=qP&>Eu6G6aFv3avGE=n>mS z>tIN!RHRTSAf=>q<$HF2{4Ko0wI>a{EA!2=Wug%*HRDuvw?V@>F7H2_+v5JF+w z0fg2XfRT}r#<NQgnnwBEk6hIOTE~$8iA2 zX0t3VF4EoI9kkKbxUSp20)jxvN?9R@g;t8b{ys)WN12utP?X!Ht zhrVZtMx%_5jxs+#PqA2RByiWgUxIeD)c{zQ#FAFz+J+4Ec?d!Ky~Y+>eNQ-5t5x~p^G}gdV1=z{et>MHt*orzy58LeKyPpFS95c7 zT@Pnw4sCh1Hs*TXZ+||>eFqrPyyG1h9C`}q+71YUSJHx5zvUhn9FlBH_c7BqfAu#2 fY_~n}|AzkpbvZ@L3kEc?00000NkvXXu0mjfH>rT= literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/class_summary.png b/docs/sphinx/_static/images/sphinxdocs/class_summary.png new file mode 100644 index 0000000000000000000000000000000000000000..ac1ce5c8a7ca408d66eeb3fb4f61cb30d0e2bb1c GIT binary patch literal 2401 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 L-mZ_FS;_wgthsiU literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/events.png b/docs/sphinx/_static/images/sphinxdocs/events.png new file mode 100644 index 0000000000000000000000000000000000000000..871385f4f8eff2e4ba8a5409bf3646bdaf8d8871 GIT binary patch literal 4354 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/extra_styles.png b/docs/sphinx/_static/images/sphinxdocs/extra_styles.png new file mode 100644 index 0000000000000000000000000000000000000000..607f76fd295f86becf7cfc9533e1930f7fc728ea GIT binary patch literal 1179 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 Vfy<_oKt2Ef002ovPDHLkV1nAG&H4ZU literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/globals.png b/docs/sphinx/_static/images/sphinxdocs/globals.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea95e90b32f2b0d41c3e2edc23e86a720405918 GIT binary patch literal 833 zcmV-H1HSx;P)f8)wUg$X8*D>Q7E4 z6J4L=ZdU+KJ!|Nxr3Tcp$-HdhTaAmd0~1>3{K2#gQqJSJVUkt_e;m3fD(A# zrSJufI@lXi;O^Y+#QaL#KCm1EWB{Fx%0}Ne0|ax8DO}e9#qg zh9yAE06}rUrscD(3G}9rt?~50P*|x{ymQ4iKoAg?P5gUw&$8nRzEREAY&L+W0VDq% zL9n&S0B<~ZarfREeU>uP$AG*3StFXG;h{PuFaa}oU^Hg%XPy%9uIIx$XJ&?Tlckpo z*ythu!Je7k5@2c;%d7QVNNJ0rJz!E&die4C*lk#Czz|lpfyWo>hTGv$1Uh{nFZ!2E zjcU=btrjOoWtePyjydWC83na*@ z$&$+jPpAPwvTFa5%lC!2IwY4+4|vGx``klTO_p3@O(;&*KLQK@)7?lhW{ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/indices.png b/docs/sphinx/_static/images/sphinxdocs/indices.png new file mode 100644 index 0000000000000000000000000000000000000000..f802ab70d3545da9ed296e569a913aa81d0f270a GIT binary patch literal 1314 zcmV+-1>O3IP)GDISRaIFkpv8i)=JeV4M}K7nm|coYPMvXy)>K4?#`U! zL%JbN_iFQp!*J%D@B9Df|9x|qfgQlXS3muz`$9bQ+!sqzwQu#GW8cC0oyc1(+=t)! zW#p?_rQV-V>g6$|0^cu(>@82X7ZYsT0Rb|m><#Lv7dy>z*yDp;Ek=35s_;dJzUeO% ztnYvT%kx;fU)kZ-$}*}Hidt7=4%>)XPQ>G8*(-1Y&y4?i&3QK* zSvM_9N@?;!Bq-mPTQUp|# zm6bI@=_SaJXPK)9Hs=yhQ&aPZ5Mpmh%xt`l8PcsIAF>K)Y;0`wcszC~Wl;`nCCcMK z@d8>~TU&K~W2umUYy>%;K5L?^t=`tw){>XCfS9cUG)*I!Oj_x5+R7G_O@Obtxj9%0 z>DH%}QsQ(vaXOti91dc!7(+utKLVkm1k~5p2Lge>e$zA&LgXFUAf-e~NjjY-7K_o- z)ARelz`)03Iffxi545(nwpCVE8k(l%ZJ=!52udkZsT4{n!r?G;b8`$25BC9o0mYRd z6bhyK`ub*oq^4;F9oRb02$-FnB@&5HQBe_ISXj84i#(SgKXCNSnKPGE39u|n&Ck!P zD_5?lk&zLllv4fu{eJ_#e1zLeAb~qTY;tmP=HkVR9cycAo1fU3g9bJ`Ubx+EhtKD8 zm6esDX&S*`5Wn9Kz}VQ>bs%1ffX)1agM*(B4h|0Ab0t?Z2*B-dI4TbuI8fKw*;#+= z*s=QN=H`7(O--KB(a{MC{F>!DWyC#kHVXf|Xn+B@fC^v_P+MDDyEht*URqsU9nTm1 YA0uad`OpZl3IG5A07*qoM6N<$f&$-e82|tP literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/info.png b/docs/sphinx/_static/images/sphinxdocs/info.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6e1072d5e6a03465d5117633a06924097492b2 GIT binary patch literal 1135 zcmV-#1d#iQP)FVU=g##jss#)7IqSdHpY^fVRwBaxDgMm@U;E~0u(EGqFDS1RS4z*XUQxRlKXttf zwjVs?Z&)<=WTzi&(@L)a=>*c9+ zWX@t6SgjO+*5tH@Af?G9dHJd3OWwa}g7;1iKiAXIu{*Vn%UOyDC%rAtW)iOgR%kZ=YKtxc$(BeM&!W>`yI>Ja~DRkuV zm7+VJ=TegF+`ekrt25*2nIA75K2{8aV9!L7G8QMKB1Fa#8A~}e^mm4=oY%$tLI+#! zSVC!Xf>dBC%eW9l+Qj*{)1@4M1wT@rP6-r6UynK$I z{~9Or0&1B-#8J%*B2e&yH-MqG5^ekPh<|r?_xa4pKx{2)8UcxQ%n5vo`G8O>s%grF zT1pTEFr&ntQgjBsT#VwuUF+8jw`5QZ!@H`+4%Cck=}BxI8y57iabYk0ogvmaK0kY& z)1@+VwQeDBfJKy6>LFmbr3X$}T23=+*0!icI5s}X&Y#XQT8;6vX4CBhki=B2Yr#gg z-mA#k!L}a6)^-_p^*b?=8LSf=b^BzJP;o+FEy}qTY>Wk%(?(D+cFbMl(xuihFsHzR zLI(h+FP11-;TB_BO4JmEDzy=$&YjDw6S&gfrj*l+M;7;?Ro(R6=tW}fk;}|%C;(ci zlhfzsVc(_)My$vQBf@NTzYm{Xy3PkR^$iZ*5*Isgsz;=)};&R$>;cUs>0W!V~nO|dRH}SzvbX#5AMA# z0lA_9C*lkp!6t)kagbQiQ%wpr*@`cv?SmaPzuPX2-hbd$8%qsbVx$ep5uA zM(I2VO{{86Q)9#K4|4e(2Ohrn%+=y35y4lg02F}`$N|0u15_71zV)8&``163o8Q06 z>j-;M%5zCFkxi7&lu!J4;J1%<9|p7sdB6fG5CIcLq}C+JQ@?$AAOJkT6VMKlhJ)82 zSB)SB$SDYQy;8QJ8FinE5lOE5CjS?rZw&c&@;82iBF{NF6X5^=002ovPDHLkV1oZX B7fb*E literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/layout.png b/docs/sphinx/_static/images/sphinxdocs/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca50bc99cd495b2436e6f41f006a898dd272162 GIT binary patch literal 2074 zcmV+#2<7*QP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$BHmT?0B>(^ibV)=( zR9HvFms?ER*B!_I(>iIYJZV$2YMPp9(~!14R8!Z7RcfF5vPON_Q#NhWrcK=@ZD}qf zYsjrxNCE)@;gYLq%W{K~gi8W}5QlplZngn~4Yo11F&7)(jm@3pvvUlgTHF6q)$~YT z`L84E_xYalKj(Y?=NntDzOGRelM) zD0PDo>INd*83=R76ymlqz->c-+P+z8d;PSU+{6~bsk%~}TFq3#ie#u72rOC9yC!h>m+75^!*@d{{~SQsWkE?FMcHRZ z+3!R-=uWA@wg_*06W-ClpT7_3KjKM!CVy%FBX2dn#?yAb#>^c{CEmF~BtzAJe`%0T zrwhAp3F9;zZ49HlH-xfh1m*oPlmjl5Lmre5CQ*(~p>r;?cJr)&UW5l9f>Wc zQSZIEY2aMd0JX#AxaW*WhN^+-MFZ_)cI-2Yn0;`pDT1=wx;}CVKRl5FE15o&6SK5= zR&d;Tl}X*JEQR!&z|TIMy=9_$_zL6kZX`q1z~n*~tu_m`sd=oka6%VdpL#j%a^w;& zz)H4wHMvnbCs*;dZX?vQjn$Yz)j)A&FSmw1!V&90GE@zC<~wK}8N@c3MC>xMnq%vu z&lq2yb~*B_AWEL-FG$ciwMJiG-xtbkHg6g#D(~ioS&J>&LW-f5gzoufbXFsy-UN;i z9QUJ~66-?1mEuJ@ryrx$YQIpGm6e+Y3a{y@G@oZA(u8EF8W>C7p>}D|B%W$-h#A=MB=vxSMiuKU> zf3KwAay#V%MGS@OkPKA=_Cy^G=7)@U;;AI;FxpZ9Q*=(txeHn@UDD$5dHD9n&+&tD z4L`4Xfj1ksvaKZzQ@DfSYZ{z46sGGGV*0er8OZ;*h3fQBD0o8&-FW zsW^=LlMFe$*v7rMJYKwBFAGZxG)>;4Wm-q4znPw3TM8auiI5O|^S(xw0*$OiJ2nmE zmFl?KpTj`t29lv_z!I+%Cz=kcD~c}x7lyC#!jYSTdO#d}=tKZ!AT9m!BNFciN=t)UUi zc!b#`=q7sD`DhOZdiRmppFz&hAquTWx#&1f*?1QIMK8(@^QT!McZ*EPBVN)9MUZT? zQ|IndW;#Z1unfsiH82<}qq?sSi!)467?^Rl;%eQFzk54T({`4Fjr8>N@ZiCNl%nG3 zP6gFo+oxF}cgwLE($0!~ywS2t?(mW62;G5FBtzAJDOSp@o*IV7LgE_$rtMXX)uu76 zOCu^4)r#*5O-)V6EhZHR1lEH}#`M#ml3P_|McO5?iZ@zTVGX6mgXm|^BN?g&4AJvc zcHLme9!#C(NvDI=`v1cHtI&EKIxC<{>~G^O7^oJ15TW!mrp2_Uf=Z^O2&%L)F@lYD zBL5bb4DZu9TZCk&8t9D_^NGHkR&f-Dl22HyDT6nkgSVfD?camHz6d+Fiepl2v8^zmn&g@)vX65kS$y4k&k;<6L~Y4XHSjQ$MSI`` zRn81f>)+)A-5)r7|My=?vWBcBYs%V^@i_xeFD4zKOgcixY4-nzT6YE&_H@c^Urw@y ztR-v8+LH0vi^MReDB}EXmaT4~*BF|BsG|G5`Po07*qoM6N<$ Eg7EO_c>n+a literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/license.png b/docs/sphinx/_static/images/sphinxdocs/license.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbfe439e600e139b8fb52520c75dbf8395afda1 GIT binary patch literal 1649 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/minus2.png b/docs/sphinx/_static/images/sphinxdocs/minus2.png new file mode 100644 index 0000000000000000000000000000000000000000..cf72f391937f7a54c495d15d25bd33ac67b327ff GIT binary patch literal 48703 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/orange_gradient.png b/docs/sphinx/_static/images/sphinxdocs/orange_gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1a4169cf4abcc09b3924968d4dc27fb8380ea5 GIT binary patch literal 1535 zcmeAS@N?(olHy`uVBq!ia0y~yV2S{;PjD~;NoL3V79hov?&#~tz_78O`%fY(P?RCS zC&cxCHq-wc=Kp!@|BHD4mx=tZl=@$z@V{R5f0Ne#R{j4SCjYxF|M%JbpXl;`is%37 ze*b3${hu5De?jd3MM?jcrvG1=^M6gz|MlhnH&*}O((r$K>;GL{|M&L&KQQ_K;hF!B z&HI0H@&7X`{-0m_|I()aSGWJavFHEoga7Xx`~Tqd|0fszKfn6_)vf=p?*g4S3PwYK z{vq(Kr%@GXt3-)wL`iUdT1k0gQ7S_~VrE{6o}X)oLYc9ivDwP!kAP~J+B{txLn`9l zUWim;VqjoBAg-i4E$8H{DP6zkuMf6~H+G-#Cvkzngm@kiwxR(Lqd;x?AZ?vM;dvlo zCZIMOkZO03>IR_jJCLv}Q1#4Ypl~$E+Ge2eI*_m^NEoDA6U0aWG7N!?okxJiDuWb) zY&!>1C;&8e4oG1zNVo|o%m%cUg_(^R9J<@ms^ZoRT;;B-&$+$bDimQ7&>ifr%+2Ea%+u79uxy8 zkS2n+!~j7hhQvq=J{TX2F;UR?;*-XtK0rb=8WLi_c;hAnF_9n7$|6Tsy7FFf{x!jIjyYHXqv?fH}9|Nk88E{4r z5d?^;#H1WpD1tk>(BCDO626?A|eI>k|sb<9XlXGRSn6qjFglR0*yw_$K{z`mTNKC~DbGo6 z4UP zpxRgpmw__~icN~ugi8sh=@bePNC`oR<7>O!rYK8L#Ttvqh$&48V=a;r#*Vv%=ajvQg=PX&ClTspvK)c-@QLKl~bOxh}8+#u`ND>j7NFt!47&_+wFh+Hkj>XY@1y}cXEej2Oy(!HI+@XSJjM;1Esf43hr8$U zy?v8>=g+UOZmP?XBZmpWV~xR$BuG(|=|+ZcHPIAVssdJon3N(Vh!IR6iDE?Xz9Msu zm;dzwxBl!={FPr~>-tF+jvnQL=8$iG@e086)P1k85Hltkj=K-7!96<9U02Vs|Ii_t z&AAZ()kFd&8jh6ZXpA@!f+|Ib3_>Is4`NUf3K%hTo0i*mJ;407tJv1gD2tNrM2F?` zF5@5jPjY0r;>b`4F%V*8B2#|4J8;7Xhiq+I-aLF5XOvM5tI}|WiDrhc1s|2=I?%L& zGeRu}R;odjJkNRVnSb)&K}&Y|2FjwuwVR{^^Vn9#ZNEH#x{Q2gma>iv>Ocq)f??Ow z$Jq7hb9nu4yKw?&Qj(@o+q9No(nu-9pkhvIKoAvD8nxbM_Pk1wufv3zK7jG`mImB7 zTXFN}wzE_Wx#p3$}?8TNF5$}mU;FA#YKpGa5<$zcWU?}9lW2>6FH(=wGV{O~<=Yxx5 z04bp=^!lTRjJ4w-NYIpUS;kU-fQYbmYKnHJL$6=)kxS2KQ}#5+7yGz&hN(S10TVT4 zQ8E||$od1aA-LdiK2RR-aqY)1MB;!W1Ba1u6{MupwI8Wfj3ZW3!dgoV0cS0pP8(xJ z`w$|tv+KC^lUo@ce4V_k$@(RxKO|J1qAV%P66u#@y^_2bkQV!_q2?Q(zm!+!53+s7 z_7w&qAwZ|oS)J!r#;O&eX}8;$@i5}Or`>LG^u%%QxaB(j`ocZ@W$z(o&Yr zG8^bN66>YrwVp@4r*~|bd+*#y$MiTHBHPY87v}_LMKMI$&1^K|oo0MxKpiDkVjLMn z43nKUMN#mZAAgzKesCYZdul)Jrln&y^22+dM>TOyK4j0q1txRL-QT^28?V{IqmMks z2R`%(_8eKt;^x6e8ZrX^j^7fVZuNYgsKW!0BFu1Ubq2l(*SSP z0dLm;aMl2F*a33c0C(LlX1M@)-zjRq0D9m6dgBXs+5mjw0Da{Md)@$n=N@&|0D|ZQ zg605(>i~u80EX-UhwTD~?Es1I0E+McjPd}D^BsfU0FLxQcEl5i=m3%T0Fw9slKB9X z`W1}qAB*Jxm;C^j{s5T$7?SV>n*J`1l+8q=@=T-YP^0c=o7_FE|751*f}zz= zv;ShQ^M|C=ShxRLw*O$Y`+2YBkE`2oz5j={>UzBKiMZ&Sv)gvS|98Rvc)|alwcD7z z>VC=pkI4U%$^WOr>6Od>waMtO&+w?#_{P`p(&P5l>;2&E;pFP|?(+KY_3!ld`}z6( z`~Cj^|NnYNrJ*`c}$sUH`B`pwv>bRK5P+wO&OMMmN z)MlVSNPSIVW^OHi=8sXS1?C#S5oro19A$w^;JM-C_u5S5nOSz~2T)2XJcstpu~ z@bZuCY}3_f>r{}Db_5Ez0ssI2PVcik00004XF*Lt006O% z3;baP00009a7bBm001r`001r`0jlENk^lez2XskIMF-Ud6ci&m`Zmq`0000PbVXQn zQ*UN;cVTj608n9RZgehAMN}YmGcGkQI5#_hT>t=Vj7da6RCr$PeFc0J$NTr3$KBls zAwh$aU?I4>yGwD00;Mf(#ogWA-5r9vhq(L6&imb4xGtAVa*_Vqx4+(JKXBQbogMkk zQ~tj)|AQk?Kv1ews`Ka116v@F zhYufS7)JlG%gD%>Hf@@tqvOhzE0s#6{ty0F@_%Fm3J6L7(Za%_diCm0o;)eQNCCu~ zH*YpJHeR)ARRJFV?~#A^2ow;MZQHgTJ$iI{dOCk}AW$YICZ?sO=`&=&<)urP`uFeu zAFKSQmLt_2M!$Q(4hmA7++uCQl(0D?%a9n)~zWiDO>@$Tz>4> zF{nY^x^-*ZxN*~_O?&j{F?H(HEnBucdh`gY(*M+m|JT_(N1%Y9C=oEGaMWo zghHW{lT({EZKhA34%Nrr-X3>cU0v6#Spx>`=H`Y!2_Z6>%+}V{)6=t9v0^A=U|=8? zi;EX8{@ZWAK_CB*Wac?r|04wo2ug73wQJV`c7U3{zyI>(%fEj8s-c|#>)yS4D^#d} zU-1F*+O=y3wdUTvdmlc0NJvNk5k;9hckaxaH?L;Rnj(?N$jAt^_T$Ho|0Co6UpI3Z zfr5Y%z^Y%rK1U0eEnAkAm8J6qM~)l;+MuC7efl&P^&C)s`}XaK5hElL35e*MH*fx% zu>bK9$Tuht9y|zkED#79Hf#tmeZ`o+dO~%9NG_bb089wGB!3=pAm#iIeGGA zz#Zt+r~H3q{;eaB4^TpbHZ?T`*9Ic9tIQ`)o`e#^36aoX%9bs=V8H@-6hT&_qoV<6 z$dP&4*kMkB@@{Eq85I@vZyoXf`jzJh=nKl2m>5p2>D{|`b|Df*A1KsPM@O&Ov&&w- z9B|-(L$6*EOG}VF7Z(?(IF%|@GBP%1*bg9ip)UU#D z^WU}0ymDpu7<0iTEb4$VH1U7yi2v8GJV!t;P`-Ng%Erb9O!@Tb)7fiGPEM{?t(r+- zVD042pS9ErY5K^APMr zc{cr@Qviz=!U-G-2sgo^)tJWq_7({S`-3?Oy-`*Jg8=w~`=gyrAoWU8R)B5xB zkTU7bsz-0ZWCVqq7B2N}$a+4IEg5VNA=H*MO3vmnF7r5s1a#6d*UZYSGc&3l`+U zojFjpZ{Pl}=xx!~2`?152fx4k?=Ww*Y}xW}j2s2eF*G#PH0jr0e=XYX|8=$H4N7ol zxCaqwmXnbjrkqx-S{ZnHRtXOW%Z6~N83?y=L&Ybzz^|`2O{`u#hb3&x%J}e2)?TYG+`Kkvj8*x~gmSB$Z_4wadIB!rse*736 zLl|!^t-N;a8tj+AT(!73zfGGo15teK+8Qbq^c$C9!@OqA3Q9~Yv15mmvvV%2q-W2b z041c@zj09Xd^JL)@&qLcfLy_(pl6+W7Q+BSNPwUZ7X~bDI-i2$4FxnU3a zSl*yKapD9zmZw1*#!DF0P0Ez9@77H-5a8xP@$rx~aaGUEgbr@v;<9hwzMQ&^ofSYN zVu=3sanYv%jT$x5^c3+Z2!p~XjT|{LFfb6(4j-?OxnI0^p--K9mTBI+xu*WHW5?=z zDl#$>_Bc(kiWMvBS^3{yEN@Wm-@hLnn=@xl?rnvsa?zqiTr?075XV3gJeCM01lqUj zm@y7Ldm8%q*gHCcm+3U2Lt{k@hn=0BmzNio_}@M*`ZNHvN;Bo<%a_+Yf@l>uW1;cz zafxugJbefHyp$^grHcP*ostz~ea^JZePAKczy80sWZs~>a^(uTgn+c%8w$}AVQgUH zC|tH185>I`XOU{7iH2mr#(Dq#{p^)ss&KzouU?Q`L2EBwy!iKyi2iS{QKN=t$`MPd z^&plO^gm4jd@n*b75rZOnsst;?4W`spegqMi$Md!s2h|33fK*|H4z;~$Dm7Y+qNxx zR5`R9j6UE9qXWpKfdvVjNq&}-sg%8bR+2_biLu)I2t~DO)vBcqyuV_UxISLG1d&NM}iO7RJRqV~s(}5uT@s&;w_HQ6hIbG<)`J zO#y7LD?$#AHK3^(Q7?#n$=)>t2ZHlxiq)-Kw~zy+&*PxkFpd^7G*$;FQ7;10V8LFo zVg+o%&^)+~fs8>efj|(Mx;b5GT;FT9?v?B5O4|2344I5RH=e6VXaLUnxXmfmx!`KJe*HR3w%C1u#%T5(AQlloLdz#in6Q2Oc70y= z11RC(-nelipaA^Ama%i^PMFO>|2%3ETmL^{ggf|XWO+j?QoJeYc9u-e{1J{EC@Gng zPKG=sy{?du=_H^nu`i{*N)zw8q{?v8Vgnief&8psOOE(Nq((yQDMS1($NTUi*rg$@ zf<$S+1VHrd+ZWn{nVA`;fluTB7f@fYEy$)I#{A)iyQOvO*60`9^jKG1ZHEpW`X&d% z&TngrC?}mWgkjN`Bq5@lJ$n|lA^KA@D2Tex{vb>ingXaCAF&Xv@mVN>dnnQLx%Ep{N$xBsYEN3zQ)k2XbN* zxQ}hC7;S`dLzl+_z~itkAr?%F9AZ2%=9<@m4I(-Ws|8kP4OGwt)N}Xl-Q1VKH&7zv z5j$ple0;d)@i1s1m;#2+%!Q2nLdL|9+P@ITazv~)$AT^zm=m7{q~2UI^fe2+Z*=iH z5Vihr0Yo*d=rzt|qP5Z&}eF!KJIt-DB&wWalF0F~P1llw+1d7f# zP-84K;{w#85>5YCuU@Sg9c;$nqTI0)gFnYmqO%X#o;`c`20yG=_z|>p+w49n;G1t+ z$5ICh0W!_&MvWSk6FJAGc>c4XYJ7g3J1Ft%#EBEpHJH_~Xf=hgAR#_!nFY9CAZ=gg6un4ejI3GZR1`Pm< zp+kp?B&5yGZ@6K(a1T;>5UDZ{lOBs#!E?q1!U-(JU|JIqFBd6WW+}noz2#e z>Jv$+j-*UiZTi~(K9L#=jvqe`vds+#*d@dU%({kBE?l^f-$|g2>l2BE>+(7+p{ z<@W>6;(h|4`51ypMI+omz~bBUP$8V05T5V>$>Hn?nh#h%;Fz5`Vi|+QBl-dJgjiB7 z1b_v>I)SG^tN68nmt|Mxups%w39J^T@&^wdAhQU74uvT@yif)_4a^$Dg)VcFpBAOe z9n+|j&sESWz7;m7XVFf+i=Xe+)OrLBLnAdeA;IUu!L=0~Fg3Ifn1Fklou2)=N#Llj zq|0&AY%Lk_Id2-thaE82^Af2ykJOz*20haKZ16Y&;)G?2mOz@!-ujz2Z-R$vdZ_U> zLGjWW3#j&-t^lUY|EYWT?)++jOFpMVX6`HB~)LvU~~zuGQcx^T~;Bd`)cmWAp7{Zdl~QZj66Si0OtBOT@hO3)gJ-4F`L zjT^^*k*1M&7x)9e@AwV{6r>8w6U>+Y6#V-dAq2EP`+$H|Bb&U1#oR^7g8d4(Ynl!wp1s{#B0R)3t_)NntwDiQ3Z{vl0B-(I*+nQY zdOm&9;y(Bjv=D&MGzO|VM6oho@jjA$xFx2BU%I zb=Z~-_7OB231qVKHFV_m z?c0C?-!BI~lHHaB0@JTwKb;`sW<@Ky8N?}fDGhuUL@s;YFK9@7mo(l8Qw}#hXoDu$ zjB5$DChN5ML4?&bH75&bc2EK|yLRo;Kmj5FzrV;I!TrPuPMQz64G1tFK=7t&e#PLR zJbvZu*;*g?u{2gK@C41T8Yt^UDN%?M;iV>Iz{9@>ln^wn)sV|2Q4sFg#XAQ!(J3}E~rz%T)7{N=0p z4$B3Mx_l`c_Gg_ljgD(+;-~~7fzI8S2%hJ^4#qqb!v|D6Pv;PdL1N~&AF357qQ+0b z{RAC6CwDoY>VO;QjN0TPQ#EhFcTSSgd^iWP<^#7J_Y33yd#y-Kh>UnjOKL~8 zTCQn6b3!TvCZXz&+-+oX#+~Jc+bO$k0In}_I&p=SYh_jc3J_OxB z^A>2+T4l6A2}Oh}zz;M*4cX-fSkw4Th1~{E!8ye55p)v7m+{}oS9BoS=917<2c^WK zw=O1_qWU{QSz{vGL1@`I&59QHOjG9` zJxx9QRfp#3r2UBh$i3qL4Ih*mQVO=qAHD48fyAsS0E*5D4_dSzaZFm7QDF4dJOzHG zb0KjZ)B#HP102fy{h$Qj)VZBkGcmA8Ymqek2~`8$NPKdFEZ>O&0~=IMzTkx#u!ynf zp&Mx#n4rP%^KbD%nUkuKJ4~UL!egGj3%CPfpL?JULLB%H>huh0FQ(|JDHzUqZ;!H-)5vK1`^2kpg=L#qE)b;X(S;yptU?b2nEux{=$P2 za|We5yRj3?DVN}UZl<+xvwQdM>_-P(8r-R!5)b) z0GP4)!;XzgTx~G)^6$gEuhk^@3;6{g7U#5Rb$}9lN-Ps}!nsuVbz;Qe-C!6MF8Cw(KV{#r3L6ODki_?!Yc)&aA;X@5SF5u zPBv)=&lSlwQX+v{SyLNAHu-}H#}^dv?C*jRj!$n;Cue{xDo{co({fkBd7-n*sbBuw zOvl&0u~eX&W`9J>i3LKHy$pg~_=5mK$d!S+MayWFeT7440Y%3W&5GNR8TSZd%P*s0 zS(=w>Ic8y3&j+Q19|>%$*VWuGRAB(=c7}`$C#K)y?aTN5p*#p@>CS9~8@pep92@+m zKd%RoHno#zDHho~fZ>3g#2<*IOP6YjLC`^91pimqwE3bpbX!=9xWG_Isyf~R1ZxN_LwaVV4!$`$g=%(p$GA79m4A--3 z`OpV{I?LdM4b41Zg=oU?_=OdjsS#m!Gq#j?>)9wCei2|~E4z+1Ar z?9m=X2Xh6m4t4gFt5f$L9VlF7y5)wU-q%To1FV?X<02{9j@`xp;gXLzK+v-`5vhZf zEIrw+4hTEf2b3U_0qxirN|02UsW+5dSe} zTHYFH(1qELf|=usSs;_ymj`+gdGD8q+gFrf)s%{F5h1vVH3rWrcy#XRKha=~_gQDh z!KvY3gwCgBR^$rfMJRwk{l$wH<6RJ1pqy#e0Hac6yjzmA+zszQVHl6##eg)QlRXPe z7zNP62BD#G2vIZ{eQi8{GDVB1YDFoFW!^)w4Lgrg$@vfo{8U-^*d#IFS_dP2*= zt}ztO6O_O=wmu>xr|{$T&#wUnKTVoh@Ds=e*=dzZDaU+ApQs-3^pbL$Pg?3JOij@u zpuhtKp(5?$Lgt`T)T&{i$61*f=@GiKP389$Iqv%gne}UyH;i(}83-!qWtWqr`?tWe<*0Zeh;moYG_=Jn~lOoS3Cb-0Wot|@poDN!C8!c~jy%a*Q5C?BAF)h;{Wt#*O7NG? zF8au~xj-|}Y1WB9TP7psa_sR2SrOB+`dZ7A#zKtyOB<$V<%+b=%7n#qtw;PEkJQ(% z6d7spPr9bx{?p>7XFWQL<(44>nwL{~GAiQ#0+%4DVDWIj{&OfnVTLu&XW;|nTU($4 zYi;lYYN4)XZMIH+HZtvWPkD5csK%Dem#*otI*h5@>tKBN`uS6Q#1HXldA6hg1(aFI zSywvKdmZSn7U5$WC1VrSopq{HzKVElU9$j{=O|NhY8Mw=10^~aji*S+BsN1rugY$c z(7#LPZ+sdx`_h;>m;b!x^1k!$>;HZ3<>`ygs8snlpjZC}V~ZJ|cV`dr%t%kil{L#g z>$ZRNi7Cueug{H4>4|z7ar2rauv@Rz+3C^y)?2vM>yCx9>6 z`oO8iO1Ijp-DhvxIbBOz=JGcly9_4nQo&RYb8H3N~QeaoK_BYP}0M0T)MurX*wGE$zy!CX15E>&iF>irq2q1$-`n~F@bNrRdY!oeJswGZYsdutxF~FTW7f$S1{L7o??D=lMXlhi{^WD2{jvT%} zsLCEsw=K5TYfX)p%Opz;B#Vv2i!98SIXf;c?z_2l>$9_FeYk%=^T#uZv(JSxGd=le z4<@0t>fmzuc)PTrrq=@v;%2(i_oXuSm(Gazpv=ts6fb?II7d(djxf6;f(zZ_EcGH8 zYjlJoyJ$!zL*U7@aA%GCs6042Ka}H1U**0(5 zt8H6ucWQpbQhGol*efBsC1ksVY?Y8r60%NAR!hh-5&1(*7D>nqA^Al}CJV?of#5fP z|9#`fe|r2_r&&8I=1az&W;8K~o*knKF=u|UP_#2u&32-X{pl<3lodUp3_O}Q1@fgn zu**Fh>0A*TzrbRm&io_Shw2QJ(;NX~{NL^xju`|BX`XLpt6 zt8W}At99HS^)*(Rnxafg`F+K87nXLeaj&!Hp9#v`J19^5^mSH=v=;{ymnzd=Dl7k} zt{CW|Xegsy44A9_UmqQg{c-a#ye!AJta`bj;+c}>r(}XhHHBAP$Z;7tA|(f;1kl_i zW1+cOLe@*jDlu6mCQHO*j*$E=B=fCAznTfh2!$iX;;~j%E84Vq_uv6XjPWl%Nl$L3 z?x{s1E6{TdXj5}lM`Jp|k}kHVXFcdiXJ()4mjfG<-`%;}w`la#96^cjJ9xn1GllCD zx}lY!;qAVC2UV;HXab-%#Yx@SWZ2u>BGz=ryk)TjviSF{^w{Q%KI0XIG?;Us4DPf& zCL&gqo}x-moxS>|OD!OBwMU)R`DWZ4um3CAw?0cQE3rrB(Q3(08`63HbWnL_v0p|7 z8SP|D$Gasz9rpJAZ4F6NDirUxZ@uL2{k*35Z8hOV19Hn%aM75YHzLmi4bPg96DH)O z1vz0!j$4sK7G$3}*=`R8`m%I z*!Xel_>2p6X+(c|ER@zUWSSZ>zuVB`9(1J(9cD#0IVN>?*)eX&`w7L~E}E)Ozw#`T zBPg+z4nZ^snEU0IUp(C0)--EIr%qM={PU8=jmwrU4ZI@O!N{7`&4ErNy+9BUd^|`< z$;M5pLnrYCu|gnLKzuBlN!Y|6=V*7B|BAgvoBI+4x+QS6~!UKx`nsisUh-@SW> zMvb_*1Z+vhuZW>X>?im;vawnFuox}Tl6A~f9LPoiW1lWiXyU*IuyG$`8E`1gmca*( zdC*9N(If8)!fguN2R!)i17%X|CwW#%>c{5vl098(mC;(3@`qDaQ?sm+2DG6go!Bbt z`S8T#Zp zCxW&lHXz6b0Z|e$b_nN2kbPnL^X~(tBIRL5%=YxeJIXDt^njJTwKQR}m1>l|s=66d z%bGS1pvMO!9GmgDgzHlaVR(q;BV!U~M4noZ_iiLAfJ9XieDEgke1z{yTD&di_@acx zlVaj9FEuVb$Teqj$%$O@k({(A7mEoLJ4#0mvOVlA*ySWR;Uj%o#Xe(MHTq&C-B~Sb zs-wKRrK-3|f{!@4g<*6taY_|Krkz<CC&Y7!_GZlRELK@EDx7F8#GkV}E3$3aE#8c^ zO(HuFppTs*kP`~ijej2~<;h>u!s^H~Kc$~uNC(Ljy-ZT-7%G;#(z@ofu?=nSK)Y6^ zZ&#-NG2^AJ?7frdg(-RONFsblLK#9Addu4xeJMsh`Us=y`zW?fP8t;YDcJ3)ui-;? z0r>b$H*&@48xy}&Oeo)3`BO*pJr2T?UgG!>q4fPO8uL(fqGS3nYgHdZri>`jLzLXv zjM?C%Y+^=xo6AFGsb!_A)ovNRfJj%>5!Vk>S|&{|rIcqCW)kzDl-Qz*^9`Va)UQ+L zdhgz!MvSOax^ymxM0K1J-L0F0M=|LXJyL5xg$Hp3C=n`)2eGZLFh?5x`#^~yO%0n8 zA69?+#NMB~+tR)UDUD4s*10G{&E$bbOj8Tm(pfdCIrHRJ+VD1?JPaZ|NvxkR##fM7 zk}!iU<;@JDiVGr&3zCD36qBpdJKGd{Cw;Er_RLrIz>D1RAUE8|B}a1Bfn4wqy=>-m zs+i%qx@E)H{6ZsV(T@`ptE*?s_fD&CNLxu#t4I>O#Hwb-%I0Rw3MWNNTH&^ykyqP95?Cb7pb}VzOgg6y1RSU^Op10NBjI>(MXi0V*uAeHKq4Lhgq{VPG4nUS1!v+S!C77yx4RlN*U{Y>K9 zm?{=HruoWJy(G#~Mri?VsRMd2FV88@3`=j~o>AE_wY))MfGE*lkP>8^(!e^QlzTbL+DSt>i4C3%V!ZA~(~jbeSA(|(=Eyj;ON7^LW1GOLzZ zS_Pw|62g><21ykS69Nd+RzlA-rJuIZhliN?t(EOu-W3--a3i-}ze$#79Ryc`y)wfO zFfniGgN1aiKkaRi11uOA&%2tZ zKj^PW`I_?VQdXjlq>cK_UG_3Lf)e=%OZxjqjTtkdYE^7O%CmO(%HjA439+b9$s`w0 z0*kG-kh0y0Uvt)Y&TaLA-w3AA0wkHxwCZ08N|uAaod0!wotP13s__oY5Rq>4olgmy7YWTCC0+|;*X;=qle>r)3^VF)+ST}LJmo%xA zVOCR1WnWu)s3p_hQCZDYQOS@FGN&g!_+5^B^i53Fpgd(Sw-?hv;_vN0S1)1DA)A(9Z}-sNh; z?hWqPo`QY;3Q&6d-Nthag(Bmv{9MJ%VP>?o5p8M8tg}mPXPi_;ChuyNURjdtB~I~> zM0*=5e)ngdx1fprl+%2&LX6T&2~+$?55Rh6U~(kEU5 zsNpcMbLvjy&U*CeY}L78X?^Sxd_@Vxr77jilY$L0n;E55HO}yp(mF*vEY~pl2l_MyT@~f_o&--D++Gb02ptB+vFA>~d zuAE7U3bO3dB#i3y=My1LdFll}Hz7zAFo+Oml0CCe!TMGhP{I!h#}D_fSLjObdMmig zr|yc1P3L7~B*?Q83wbFNDFy2no=X3)UA3b)onS>fo6`QKs{SVOwnnN(1{s}AQ_6`` zi;Drx^lB!mtBvS~x~jV!!Fi zCV1#hUImN8>RMcO7bu?8q&GUqhqz`mGK}+=Bo;SFEN>VeYWdYy8t*ApRWqO+O=vqa z+Sp7DN)tNLLjH?Qd`lDgCg-fn9?xgyxP!Z3z0MJokoI~9211~0+p?uTRU@|qjO`&I zmgO2swL!^{1`CPUk`UySoI*%V9IAngsDuO%oyX7U^E$0Eg#u;h8ZLChxyGtre`#`i zPx)KiwY&VCJ>}kCt@i#}wNF=r3w(XN8XWO_NC7&XWtkU!l#l;k)g737LG`j6C`H7nu|&AvkrV1i|ju0ymxiU?D;2 z9)%;+%HHV@{oGo53l>S2;qT^8*kN+>5*c9Nw9 zh?6`;nInp+-Zi1OLg>rBifI;^q2jdC!psUnriGX}R*(MXK$pAFL-m-ofvR?fu|qsw zHZZ;CCAjWP-i)cPTIa0V=&2mz5?5N17G#tdAdN2}%P42S)H9;3O_=ghm7j!Gl~K67 zn}b-I(|(rpcUx@F_)uN8cSPgY7Z=EjC}@ovB^{uIcvri2?ND#;_;KUDjvD1?h8g?5@}uq4M>K5(wN zGN|JYLv zRz}MHcFek(bVhNy#81^s^f`dsbt4aJSj+c#Fq5s7b&M5t3{%QTlgmg_0^zVRfT>bh z&4|`Dq4i9dR;H?s=BgT|bf6{eU_o1%(*fpmwmIEkowc#NA}y*g`z!PUB|Lt0y}bcP zfD%{V^5wY`taAS#b6@e|MxA@vBAA@dz7aZPhl50Vs6mPJ`d_|-@&gV-{1KE46LbCQ zmqQ1_aUIt8`ht>&4ov@fyK}A8!5!Jqwfut8qwYG7I_m&RXALMX`^zKNvvHZJDe^B% zvo4h=BrXfdz7xNOC-w7THrdl-j`Y4eGuv9#-6Xw+RM9}jgczx+8YwFqWt5X<)-q-$ z2GBFrY4T9j;b1z;oNlzI2Rvvu)2xcpxQ-60#Z~E8OS-KLo#L1lBzWjS!sk_`mt0lz z{S<9X(>s{Pmykv{i{kyHX{BW;#U!d)#Mu1q3pfzYbZA@uPb2`|8IoR~+ zV2>Aze*q%@a!?|b+3dP?JCrIlx>~igi4%Vf2|?QT+z|;QC47cMhdP&QD$%kB!7z#F zAy(H0C~=4|;Fc*I?m*{tiKbebv@@eQ=XI+pQ zl&ZA+#Z&44<@K_P#4u%QDnO}-znOKl)ZYurPZ!U`RS?r|=JZ5+I@OtuH)Z;pW>l4> zmzFTK43$Af(cZFz;ts@wO{H?#}eFWV%>_amV|J6a1xF6%Cmh#!L+(+SrJxB~#WgR^fYn zQ`**oPOzqP?3gV+s#Og>)N;D)CcaR`{pG$N4ra}ZeC7SS4)zUD&a7M4P$nzx>$|*h zV_bReRe+-$@j zBa60{Mq5enU46--Z47e0WHC0a0~$${1y8G9u4sufE|@OTA48alX0k(a{ac z1b~u_U{}W9`rAPnv2$})V-ekJO{d$?QC4)SIsMg)jy9tmjhK3ds#-?r%r&L)T-gXm3Gh;ohu z%g0(@DPeGL*S7US_2dc<|@`seQN~IcnAE^T7U_^_a~mBrW@W-HCgcw0Oj+c{nBCCS#8K% zbf&l6!Eh1pO(#KWG*Q(uR8=uzsu@Q*i9VVNKbs2^eWgqrBRbZK&M3vSH>Yikl;xyy zXED>vkiKk8Gw0Bwjp%_I%FBc3-CFdr3!Q4ijI~NAC;etc4tA zpn7Jsp&4xi>%AFm1!8GNC%e)OPV|jCz2=%e#Nx`#vH9H+nI|%JfU!o@l64 zwab@p8xX)hrYd`l$cY2uI(V>i%Z^q$9gIlc;*O}^F=|{w`yQq?Se9T<%K0J5yBd^H z*3uX+yQ~Lyl}U+Nj~>JZ`sEHv7OXZh4wRKzZ~6E!iUnnQ>gbv0TxxN9bn-(fzk^bl z_>hxLl?k`9uKmsI`(CSNh}(^^BWXSYrnwOvZ$TH>(_gGurMSMSq9Ux42J$LKpDl$S zj09iI1Sx?MRXY6Ro;MBF{BNQRKbQ!s3GlaM5mb2g=WlrQ#r(jHfHIqO){65GyRRe z21!2LxR@u%@>@U$DBHGei@;k>bZytFm7}RC|8&9ZFMz91EEeqF9}wJMoKs{FGFf`U zi!)LUNOdrmt(4@%p6#QpCAm<_7?x6g10`(Wokt!y zb>Zd0bvJ$LuKT{lmfbkU@@V$bvDa43zF7sFRdoJ&pu|L+2rPX@My?o_zX zf|(XXd)Uz~7PO-|9b!Qn7^enEQc6fcFT<^bUrmJZwxaaPGDU48Wr#smS;H)Qq1;Kt zRFtub%Mfd3ls#Q!PbXN?CPt~n#F5s*2wP!NfFz^5EIm*LA(f?(@NQQ(qCHI+F!5?q z+S!=yvSl{8(3OsKl^NY(sJLK!sgCIU%&CzdKI9j6xtG@gN+fwlW?Swtoc0P0hJWa; zR&|Km0Jf@DHCwl?c-vjMg{zHAAb}%@2)^&8gdi!kFG0G|A8J!7<3T9_%DTa7P$sjW z?A0N6P=de5SW8FwHgT=99w-DZU27p9ftp6Dw=!y7**B57hpNkju%KN3&jTffXrGJy z2^l$OKyF)*)S6N{)rc;4q<8AkmzC&RTiVT-h8ShlGGwY6rIeCIIf`PPM6q_FL?=;J zRRiEjUO|>_EtI>8lztLbWkV)drmSPCs%Jv$8Y{}mG6D_4Ernl<1rQ~(AU>8iV5%4@ zD;qGOMoeQ9*vT`eSw&QreW)P*(%$s*`1-M3N`0TULEtjp|+owSiap>;V-vS zA_xtqvT<<1E*ucEfb6SArWxD`4E-}F>uyWm?RR8J}yy~9-O0B%9pp-kU z%&=4TlmWSGO_cr2=|Knjr5JtRkRI`%gUo1i6Ixqs;tn-oY8$8cNpK|{j#Zss!E>Q*=FhMeTpd<~y+KXZ>g)uflDBa1vl2i|II`o@TQW_+qZH;Lo z_!S|Nnr00&Q_QmZJjnEGThs6^E>|1)-7FzmV?lnE2^QE%Zw##Z{sNo%ya2IgRK>}L4 zjWOR_tB68cRYM4Q8f zV@%taP;3qBW+882Lc5sKsit(PC0*gBI_;6P*Zf2U;Uoc>K*+_pbBh*{fJAOVzW5p8 zWY`*(6DYAOoHI{Oo95o*Lf+BloWzMdlui{0QYmYPnt!8|`2!^=Wvq>KvUf=7;5lW3 zXO+u#l?|R*uHNF{PCJ4-?F{a$`wGHOopw}ivu*3*dYtxMNJZzsENA$)eBGoGM||`L zC72)tbcj#<0mqc@@N(ZHAqS=8q!D@INnZJos8WQPX-1!V(ACa#BK~!!JuHDpRYe0; zbwe6r!UP#*RWMBSkt8^aQc6g^7zx5n1W_h}40n;-RVZ&{qHJcGRazG3E{ZQEj`I=4 zdy3LZN|~ClM;fz%7itxXHZWx-ny7Zy${b{!)yPEA!j$P`MtfK&*P4a(kuDSw94&Ds z=i_h+Ogr-cW$yJhYt{@yfBSY|oi--=A9*|C6EU_U9Xoc^uDoENw1pv4^2WySk&Ve? zUDp#EldHY^q^8MJ((|~IQnI2R3@#E-zT4~N=OKk)vk6-Z^rn=sV`O)p0h9--Ro)>X zz~vzsx$j285OwB5GWr;@X3Mn|Y2tXg)rW5NprK~0g3`?rMjWQLNop}kVhKrtlPJA` zNw~G}y-e`QKoD&vNc9vYIg2uC876s%q1j|sHOi`FnCZ{@yXBQ+Y!C*>WDiqX2lgP- z%*H0E>t@Qss@x70o%Inus4TkcFFxffT4GA3A%6iO>jn)fF!*wMu;8FX9vsA~)vj%E z_H5~pse)W~?8ZD?IHB{+Cz_@*u4l7ag%y{s&)luWU;M0x|m55|J`hJr{NVL~xc znwKbZm{lsGE-D%zx`JtH3Sm@*@QV;5MW8IMoHVPgv9hr#Z2_6mTrtQxwYl-rj?z6Y zWS^_xLG;tbg zDz9RwYGkUKXro&15a%a(Zz70r5XKY}r2$H$<&7Fv zHBNipo!?*VNy?5t96^%ZbH>FwygGb%m55E4hO}u%EZHsFz$IdQ-uRG|iUPXBik^3) zd%Wl@4?4zz{^CHf|25c{_P1i{o6*5GbVE7SQXfStv(NUzNH0;8rzplp6k{utA1F)b zIxvtOCwS3u9#CtTo))RCOyimxr_Xar+2Wqu$1J&}X`CYUm6Q_1a{nx6Q)A(yi=FrrfXTz5h&Vcle-not<>aJ@diip>rNs&n zSpz0+$Zqw*hA$)(c^4-e!tE7MaUjQVx4% zUGRzTVIJAQ@NzL}WIu1_evhnsZMK(_&9N0eURddOTj?()N?h1l#E$QRQ%W4e2Ht)B zdbz#>9dgQ8i36a-;M$;(5Ix}O#$mwk2sy!8D0Ms2|8*Xw&`@434J-ia! z+3lJSf(>+tH0qy`RBdZemBk`9ujFbmIc`ht`H-&-B`@3s&x#9}-_6)K%aIM})BSXH zF&gGe$2-tpY-u0!%)XY2rT%o0JF~qaecDPn%@#~N!b9}lOqk#+%xGjpKMkkpLuphA zy48Um^rG_vnAIMcEsT^uTPF=Rd0$7CIM^a%mVH=N<6C8H-Zr;PUs7&O4cie`77JX& zGff2#4<1A!t|Fn1{7MQaQ^KO|<6{^VRkguj!<88b8t`eS3Af$dPU0gsv4$l+fu#uEs_NT1Hu%gP}DJ zu&?D}5>AMWoMR|Mj?)Dqa@3qKzuGW|{6Cf#oOU7?J%u-XMc2z3$p7%751KL`4t(ll zow3uOF1A$+GgED@4g)yd?M%1$(yWQ}PF-xzjj$6&+6k2HB+OuI=3ppInn2$K(%ZFF zcjkX-=SS~$N|{|UVR{YKy?T$Dn}mf(6@OUAjken2AXsK2+*`q9pohl{U)%S``aisW z^+^BHTc;0?`Yu@(2|5b`N*p!~-o0~Yi5c@eaFDldN~t0ePxZc>p9q=#9g%=$ErR6! zy3ghNCxG(vgse-xtnr+UrvxYw-#)B1^mug)06Fg`pO&uV;6eM0~Cyg8`8sXwF$jj^P%^N%BPP;V6VQoi; zONWZm)0l5iVnDIVjg3W5pH}QT+Hz8wZcrj+zt~ahXX-DS`veb+4x) z1!bh2!804#IZNpdbIH6qwQ)iv0`LF=r0K$5&73@Af7&S%!c>SnPb-3W%FK(!+to2e zkbtJw@RK3r1+q2&Bv+i+ocqDOA8+5DWo9x%M2=aK^eMi{-K@^KlfBmDfP-Ma4LRr} zxZA<_MFrW1QD&+gE|CMRqB|8+Jvv6WHlmHJl;bU5cQd{pWSI4NCOuP*>1dkiAyicr z(N(Zh&t^iZrR$voT6yqOU_%Oi4-2R-2t_q*v12XeByWU-rgfscW5 zr{q@;>m_~qfU@jgHuuN@wk%20So__>olo!FT!hZXe1noZwb|R-FgCVYg9(xxZRQMd zzWOcb5~e-v zOZWQH88%Af@+%{vLuJ@yp_=Qbnj4^)YRfFOrXMQMn-giw_Sip)Kd5RH(_W@rZ*o0E zG}BNt!pv;6z15)_hU0uZ!Y*CH(t7>m@!B!HH%uDzA=^1A`u8h)$$WznW(y>vs#(+G z^XDqf*X8E##u2tc1gdcX=M@NPL&$bQoCtDn{1ue)i>++0g`}NKXe7|&4bBEh-VOA^ z)zuX{JrEV8S>^H%lUa`ryK!t48#|Ypob_pD)+N6}?$OD3){Rd{;0!}pG}`jhPe0{r z@?t-Ko?>P7vpPlj6aiUcLN-~DEtX`P71?S@wpft8wj^tJCuIO!|TiI$eNsxp+!veI?)QNc3 zB4SfExSc?*g}EL=?M8US2-!u*QuStxo`e{DL#VsEJEUYTt(^ShL=JzM*UHLY43@tb zkXh(mW7&P*I5HdgIPv-(J@TET;L?f}V_I?7ny(>ki7bJ{ff)a{LqxRII0f=LeMgIrw)dU@fR5FDHs7Z>sFOF5{P{8m4+p@hop%z-;)HZogA(+z6q_hD$J7S-2PLTER&z-? znZU}O1hgg1){-GF2wF8Ug^2ytY8E87sPAePmjr>k&Jp6KPPL`}aJjURdFC6XEb1f~ zTA^z=6N5XLu>hdNhL{aqyN-}ZaJC1Ej1UM3=n)7ZE~foa3d1yy9)P}5bbgn z>~|({!;MtCy`EPTg_RcEt8JY1wLiVxmpS7{ms+v79A}|wB%yzp(8*TxUPZdZg5E04 z9Pz(aR&>=*^l6N*>UQY0%7QT#rsF*92f4cgk;6-sdV1}e28BT6i?9dRP9BPmESggp zIb7x&lp!G@*ti%M7qnr&cb=J1Q2?PBGIK&ex7-OaX174(Na{5~zV+C6%I}fqIR^P& zu#|>MS?cIom5h!1VR_(aJp!2x6dDfqgStT3myiyu$P1s7Z(|~ou+T(;u9KS)y5?I* zW}W?U`O9v6HjR^dxy4WbP@Y5l@>e?meBP6bY)fgupE8jLHF3xN$_Z!(rHF?n>D=@cWUv9p^taio!BEMVUk_HR4Crq820 zw~O$k*L;H#%&uffV}_}@V2_JFpv1u?$bUZYAxp!2>XVWsOXes=aeH*Im9cCw#n&&& zv{XezcwA@@8^-(NZpLTUvVn#o$c{)RNV*b1eS%||wK5<`TnQOR$Y6C82r$Ygld$A_ zu)cUf8`AX@o01*z@WmRjX9L(+36E}Ss`xrn5k9L3FJ;1?*&HybI8uXC!3unOP{ixk z)5???VIUhJlZ`ZxjWLjH@)RBp5N`7lE;1$aWMrNJS!hglI+M3GB)3WmUIq*0!;I)> zaA!AqygGed3`q^>Iak`#n9en!XU*v%TQ(=#76>K2yQztv6vPQr8=K6q=U#8~I z#NXdPcTh&zN)UXW(7ayi{22*tnzEa|d0T8FZ4EY?OWZ{Qf=R8y=Gb7p>XV6WFu@)m z{<}(H8&ESfv4rpdCccc2TZBAN6V3oaTCh)<)g_>*+*61L?R=b=yR!81+O=!>(m(Q5 z7$HK?u?#F&P>vZhCST9;3x9d>Vyb_Mp~l8TOigj&%OnHI923E8Lo!oJX3E%Wp*gwJ z(dljlaqM6zz2!>xIMU%R^gu0o$A>=jrSFR|{Y;p77WB3Sau(22CF!-Y^pOvJSw?=g z-kbJz_p6FFIFg}eW<$-*woIOUWW~Ij7tV7O5yUd`>(`{jMDAeI0{24agZZYE;J=e5 zxuvECxBl5Ezo5kVPGX5Dd(_sqmT{DlO+A3E-`EZ&!6q{PzVCb1(&jQD%V{AGEK*xN zk?9Q^$)^%g8Pf0051>R&bz`S*;A4}<0GHTrj_v0#nu3BNWT_en8vE@WDosa*JSUc( z1X{U1>5~dJ69_C9%h&^4@cI4s-wRd=_f+KDw=+UQ23c8+F*DllE7v@Pz9gMsLFf3>W#wpC3978j9CD@`ZJ9yFG}DuwcA*;_ z=+_YXpe$7dGM9YQPE`o+X1T^qG~CL3LDw$N9zHz1W!&*~i*Tek_x8A$n0wc+!7%iX z0Og!HUWti8EhgsZ_09>bV`GV1FngwxZheiDDQ&(b#)x7=%4OK?0807MRyNy2>?~9t z5miQQ_2m4P_!l$}7V|1(U$WjfJTV&nCymuNg34gst_BYUD~KGSbX+kfY-e zJG-$KMhiWK4`;c59O3<`g(!Wvl)kFZto2~_RiPU^Xks~<6~t_Fpkc0bk{M0+qZvS| zCyfuH7X#?mk~GahdD1dvOYt|oP5%fm`n67lEpum|-M{_lxH{)|Z-77vAmZO!XHVYT zzeWSoLiVLl>>Hp=NC;{+KHs2(^j3Eck;!C7j~><00f4e?i)ec@Tu}~Y(dz4ywc%=G zQGi&jtvV7ipOAQ-fCx}xVh4r5j-7h{;`EriOg6_J!ss|^l=EY+K*oMqggd+con+Y zo`!p|NwX4sDD6hm188Ph`no3F=S07H(T~=u8&-(ZSr^o19_=t48RD4jr=R+Ong(^}GlPV}ffz2QPH z+tRR#Su>rZcLweMsqFd@ol+7LVf~4Vjm1kpJh^*w&!U@WPkj0C{%-~)g2oXa1VyJs zKQsMhN*pH&J0h!LApKfpb~^;DAv*V?VBAwvQ{gwl5u#G58p4nwv57(xXQa`im4y8I ztwNs$>?TS5+mpQ{kZM|24N55Hmk9Zw7C?oha^=dJ4afR}PiIMx7H4N?2(nd?DTEL| zKR?{jvrf#qmdyqF@3m8hukD@?8UBScVkgH(JwLf}Xxt?0etls2I9b~L6jeNvGg0a5g%42)K*Da8qyy=X#Xy1|Yfw5La$ z=mtmCgLZLSLhi0;d~D79Yx}pnfAI`%QoJrPA>q@rdl4Vr#>d8Rnz){Q$+K9#DP`%> zrEx9^r8RpGve$D5BWP6se2iA=Xx|Ym4<$w{F6-5+r{&#&7`J4}5?D;Y+Q6@o*piLv z=%@BlA}KW=mvEzV>9RTyLpw6yVWAKSj1CMVV!Q=)LLUO$IZr)=Q8B@hy~u8y=TPQZ z04fgj8yx5hnG&Bu=6iqt`qi2BHIFP0dHw7O2Z;34MObbfuqL(oME> zyDeRAlQzO4^K|gnRsKh2c8~b*4$?ySr%zyXPz*q-KfiilYWHWSMVJ0!fyZ zV!6D=+__$uNPUP?-`jxTci|5q=!XbFa!L?RL)Mm#pdsu*n>~9r0t#^;B)}>&V~@G* zbdG9~yp2qch=pZXD*6KTI+uV&=lRP22dmR0LOXrcVOoPgk_ zb%dC(;dX`8dyp{9!^5M&BGLm|np$Cl2|Z67=Taad{LAhoW9JTPd1%AJsITED$@lo- z`>Ug?UM{Qu>EVjVD;=`l4^>2ur^;6Jh$n+B6HjZ2w=VEUvgy-}RL2%w7QlrE!m zE>$(9%y7#5LZds;9d>lJb>goUZ^oIu8gCnavEBNX{&$Y;1uj7vxjmWD5fP`>biTc> z`0exiipt-ZZ%_h57|^?S%ip~l*kpxXXy^)KHCQk*t-%cqg(E{f<(O~W2e8!M6wRkx zFEaS~pO%_RNRy5ia#}M2;XrYN)oH4sj`Sr0The^JwpmA?b&|adXsrl2T|p^fNZRtF zE`^lT92ZYY3?fqG!~zO2ozO)|NfNz|Jy(otjJ{ z3LP;Jd{A=V!7gjDgiz?qdRDYB#H!CvNyv2eNPE|6>;;_(d~j?`-mlgNj+!#i&;_t* zLkocdj$N17#ernl_rPe?XHr?PV1kzwp?CUE0FZ~cDqC*@PU>yFosDC{N9PuA{gIiK znR$QL@3)tgT|c_U$?a>>)6%$SvBm8DiwAEX-;!r#KDlw=?d|pH2byKR9F~4&TH?i4 z^g@Z0^)3;+T;qSXOh4+LvEPk8twJxj(8wT4=ToLH%`8vjO3+s&>3J7=$BUkHQr&H= zdRQfWG7fYyrhN<(I#}Nt(IoN9yNoZdlit0+IAnbNko*EilSf3neI5Jb{!IP5qg68B zpu}-^P{0iggh*=j=y8R%YjVs<`6nP4;snbd7%?a%Nant5xCEtyNqjOfE}a`M233ZN zjVn*;2n*%pMB&t@Mt|I}`)#|!*yXkZ=3BH{C~3ckjEW#Q{!AxW@l@4OL;y+#l02Lc z5Kin5##(|_ai5~D{T6>{R!aDb zhzI9V-jsptcyo5GbDQQI>s$Wo7Q0=|W#LDwW<4&ejIB6Ff+bQ-0dsj4A;@5$Wu zO8m{@U^~lGzqvnO=yhv&g~;JHszD|hih9IS+NlxHq3su`uEhh z*!=b@d-;5W5>;S(DAszfUJfc%jS2G{VSvn&Ahp>^gkaE+3$ecu!EASUxIC{WLNNLa zB2Lxvt}4%W{q%y2-D~mSWmyOquo7?=B1od5s%_rv*KeqOgW(39j}e4>X0Hl2>&#Fe zj)w4}9)$E!yCoYCffw;>K_;e=c6+|*&SlG%MF_oC+CI(rzJC3B%9JVAHrAdYWZ3&} zFM`5Xwwwuu4jXjzIqp(xws6FIW=f7zo)8xk9~+&5$cT9MG}+A5h?M8YlHcA>j{XX2 zeRyc&uUlQyw*_RzyuhFDPRxII%=6uHtBpNte7V0rIr?r|?9;=`F3stEY3I6E8z+9b*e1P=5i`$4HP<=wez){TM>TvSJti{t z%Qq)vVW3$MP$KOr(>wh!sz-Mh+b*7zdtHBKQfU*0r0*nIS8*NYd+ zynkPL{U+ZAeT{ox)h#Xby+z=3G527NO*los+?~{$OC}_LYuo4uQf)Mmny|_Wc7`DF z@r)TWwrtsgw23gU!lc!tNfQ{x@oTxBtY)JL_~yv(V77k7hG9*=hOwe&((B{l501sWzZd`fboiTR znHj82UYVH~|K?iir)$YyZhXDJ^~0q_nFzd>XMVkNY~QkJM^}!2`|?Sq+8CLEOtuei zMD3pZWMj$KI~*g{TgQg2|I1Gt%X7To^ek2kN8*s)y;&>zlC2&+6tp+7E=fj5hfW@F7bI2H+QV**q zKHt9!u)zpt20VRQVbK!r24kg~Kp|~eR!N{{;m8%8%3Lj+E`Z>1ILc+;OgvouthooT zf=jasu?zUqnc3%>VEoT6FpWXQDFB(wX;L6WM!r9qn)of*MrKCZ!`r)JqVK6xY%CA= z0g^txdzGA=#QmA{?tILvtDL=Et6J_(Mp{zL>jx=O-)J6M3ujVdJnO~bmscp{Uq3y& zbM4U0^Lt)BxvRgNohQHwLMc({s#U8n&8DUzB*}=64;sG7JWn}~6{?g3<{=w@B7|WG zK5Ott*ok_xT8`L`HB9D-Y@G#wsw%xjzt8jt53e$RzPG!(3r4KgM}5TX^6b3)NdbRArrC!aJ3Ux}EI$MPl zo9yl%5O@S|@B>6(Nk~^)Qt=aXCIM?IM-AZPKOCXTI3uQ(^er2s!ttK0dACE96(z2A=VK|mpR1r{VSb|A9z)~#FUJ|gt6n~&AX-@QZ9bv*m!%NKrX9Y7y% z#J?zp5k{S;nJbJ}FI%<@riOnCDA6Xk!ZF-jqDq)x#{XeI>`mS?n&*_~QULN<)78Yu zQ+(t|$v1B*l`CfgYK>hMr%s*9bINrN97Y+0L@Jd)H+t}({NNFeZFdOr6p{PgBgU|8 z0elGB06GyGf{{Q-2YmWHiNJytPGCanxL>ev5yV^r7Z(?pE%ThY9-`(P6o zHEI;@V0SrUmQetOf%20lPXdnk6M+W<1`I&p5`M)Ogu$b7xI+PM~i)3g`$+G4(k|k2EZkDlf8IRF)1l%#IN>+ zkJ-ryl-P&^VYEg~7Cjp_6!-8j!0uQau!1zC1?W8g5hTpOlzVv@VE6Fi72d5^i1Nf` zuPemb4x93AwXHJS~Vy`g9i@= z8Eer3VLKFOyWj(mA$0<{0hh@VXh5A1j#1#qks~l3gVZ7IC45f!0DSO>Le)cxB2e5C zB}(kvxf52^N|h>sYHr`Y9Z<%LkgE*V0A#a4gewq z3Ih2ck%QwS0vd;VAo(7e3b5+aHT}yJ7L<4swzC8TAW{;pVG|?=gn@AQB*&KP1O<~6 zbAlrv0`p<9>Y~X%yGKV?oj%<|Dis(T8!uY4NJqS|{sZv6B&aMX4KkrY9of3o@7VE@ z?UzdPRDIw{-Q8n=CZe?>svKxk6*n zL{ML?wnigHxF9YRA$fT!UYf>3Wr5fS%OGYN-?{i=P&gn1poI9y4_1Hh-~kvnKALTA zcoF=-U|(El8J@+12%6S-o=^jKFcK<9F%VZsFDQw?Ry=|V@h=2Q2&OCCA6Ho;dju))^Sp5!=?dm1U&?fZf zGtuzjE`5gB*PAJTHk~6b8FrsTsWyW84Xn7Mn6iWrpWI;Inp3<@CU z3bwbG_UPe&1E8P-A*u)>_4e&0AhES>Ytyi$MWgPfZO52)oNU_l7qcO=t*6X)Ub(v1 z&70-0ul(V|@?h3LHdhbK7O;a9tvf5vi9)Ijh?t=Lett&Pt6O+f5Y?YghQ9qFb`D7G zex6hrO1w(QYSgd*h*2KrsTH0}=GnY|Yk{H%B{xz?!3ayux9x}sT965Gu4t=PHlUrS zPL)P@QF?lHT*$P+ec>)dmq8w#Hq8S;#3m*zxy8An&^Mub{#|nnMFD0%NU=!kg)YET zU}i6H4<>=VN!1agOecYBS)qR^Be;c(jM&X?Mn*A~iH*02%3vp#II%48A1wn5H4x6%R=ZU9p zVqUzD|GTc|@8a$~eA%f}XD)dkK6Z9e1am-S^!GQeRLLwb&=gU8nr1@-yL{zF*wYWs z-^Tu3ZT_p@`#CZN355Q-)lxK|R47%4&c6$)*W1XUY!5tG1(GQr_{Dk%_(WG0T)vY#SfMD|1 z2!z--0E8SwzDnO&#}UI%&S|C`Tw^wfsU+jtFgc(=y%786YR?jw(;v?;n~>Cr6$^j zwI?(4!1B{-yu`>3_YJKBOq{A&dN+40KgK;|+5c^`*ZtqTu2hRHpCVFGlWwJ0+TI zT(;@*D4Bgo~=d`q$HU%2^~OC|X<=7L+qq-_fT7zpuOrF8}0p?2!v^6OuDO zMI;Az+2v7p9WH$y*S}1kpU+@`uHFydcly=yw{g(DM$f&3$;JWmGgsfzSx=2_yAx9~ zr!T*OU#oZBm5`Kq_1>2`>+Te9R5YOUuD5>SrhDm`it7);u~eSCioy4Z3$J*Dt{XG= zGQ_fWBadPr8S$P0NrUzxrynU6szv?a5?uGus(VkPPF{VF?vI^!1+8sAiluP) zbLj6E@Mn(+r`+qT#Um%L`~XTUGqjBlO5cVXrY*aHUf|idgbYyPzCWM-b;XTVLl0vm zVCVq-ZsSkPU3X{9+)G$vRXXfIJJI*K>+hn2cxjEUyTG{6BXkpkId*0&& zcb^jhmy5SQN5-atg@KeleG^-<+2)}$E+i&r&R%mHBq1g~4YZ-}l+$+jxq5{Z|VZ?hHkV6xwSNSJ84XNpJEX%Sjw|@GX%(WJ+3hKP`@v9gxD1~vBAHd^J%aFG!?77(SQSGT5RD!iDyA+ z{**JN#It-#$yE-~JT@U?$<_xPrNlDEkb-;yWY_M8L%fE>f9G)oq-t*1=dQnl(Lnb% zA9@OD3dC~aLiRXe3@j%PfXoAn7_KQxuA@6(T>5~rMmN1eMfHd1UkggEOQ11Wj_5h} zCq@m#34DhG<%R=KxDlDOh#jC>-S^--)Q-5sjKy0YlxVUE`~{c*H19o)1YHCP#MC}` z9)&w$FQcn<+yQP2DGe6@$AR*v8%?HoDiH=JTY_k=h+qcasApCx`4k{VFOht#bPvZHHrXJ_W45fwJzp zX-lu881AE3!~Xk6&A9}uWBHY6ylLcYHj^)K%q>^^#Qm9_ed`0tJttpsFTHU4^Q#Z> z94Pmke8t_wXs_G%7<~s7xN`3c7A=+#2g-WASpfhSh8GJSE9z$0*F)#u=z~aSI|FjRa_9Bu=-mMJ&e^1CJW$#W&p><8gAgrl$tTsfD!~1Xn01zxkMOE9@)K8PIIg+fRv@NRCo&IPjDYN;HoL%I$4O{0PcW z$Zfl$ShUc_aDnt{ zQA)68h`FU(Yz~i30VOWingu0fA+EKMckwQW!r)yHR4|xWv>YgFcHhlS0j|U6-+;4Y zf*_3Q3Chr3`}BdD{$&aU%Ba|M(1zTb4p8EPAPBwy4e>*G5{Bc_ozMPFHUX6AJd_x2 zI3S5b!Gr{P^B|=Euad`c>OWq=*73UA4e#as$nxO;O6IuWL(hMTMRjrk)?oyfXAU= zK_G*e_3TY7#I<%Kjs~{g_Bk>c8Z=jVrS{wLu0J;4M+0^pe;E;z3ZS$edIW%jTFq|& z+x^50$OBlJkn^yXU>HIHue$3Go_meu2Zjr272*We8}5TrVx7QJ@r~T7#|PL24MzJ> z6|Rq8lQ0_5@##?Q@hfm29+iUn;TOfTSi_JhQ3jGCM~0#0;64Bc>HN-<2&GEZZ|WJf zOvwP^Tp9d};l;3Eh)S!Oj6PRCHFqk)PoY2wc(oq(&76@->(#hiSE0>TP(JXrb|a2x zjP0{w^odB2Th6!R2lt*Yh00DOgN)ohn=ucpvd_>|WF!!H+I}h5% zZx3GAZ^{`?B?7gEk*NEGlc>Mz_!Fp8O(6F{>j!PX&4It11>NEvN87+s@gnY7aDO}q zC}=7NaM1?*S-bn59urQY02(ml*YhA(S_1-k7h(*$4>3k#m_*~TGMf%M2oPf>H0pl< zHE<6?7vvOV4KASwV#&eg#a)mGKzDJcvbqak`e+z*JJeIV#~wA}*_%*VxFN#7;23xj zZi3JBn0OMM0(n+T>fZ{WOr2hPq17$ka$g@fa%I-+c~XRkL{)_XC7##QPWiouYrX2N z^{k6at%iU9qJRJYEBP0V0N@B)$AXRbU}}I^3EraTi}2L*cSW3Dp|GHgiO+zLq-O{I zEA~$w0SHv{Hr$0=(Rs{q{o6TW_T?gv7%D6%K`i&4dRwNf>GrR?>;3-J+tpK&BUa9{vlz!upG17->2sXnE3AU(Sbscj z(`B`Ij4SD>@n~3S9W1k5!?&=PAI8cGJ%;e`0)?7WuQtpFnl!$l1FTKNiTH?5_OoHE;GX{M$WagAT`Grq?aE^&eL4~MU>%ZQkjDRUm(JtmCA|JqCmca9Nw7d$L|OzDewmM(pc1{t3kjLyq= z8j6?V+3w|d?8TS0y>1?;nUC4vT1VFg`ZKet73Di|m)@c1-#jrDIF&bsxhK&OP^R z{b)UH&ga^X4lk5W6CUh5g%4i)CM!?-Lmc({SRuZ<|1^%Udho9UzVKe(^fflPjjtvB yh2MU8SpELCAH8~e|IzW^H%F(p@v7foGdNa~oEm>QxN-j{zE#@$!?Af!d;b@cUgxL) literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/phoenix_small.png b/docs/sphinx/_static/images/sphinxdocs/phoenix_small.png new file mode 100644 index 0000000000000000000000000000000000000000..087d1a7e90ef7675ab3a22e9ed4352e3babcc20a GIT binary patch literal 1115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1lA?V8Ecyz+i9Bps%lQ52P3z7#QLi;ushb7!>>zz#Ik#J%;#r1_uX+`1p8-Jcs&v zAgTu%%)s!Up@)H?pMhaF1H*m>hq(+6XF#I+85pL=$8W2z|Ifhiw!VJ-Ki)8xP4VKVnGw$d!&5{n_U6V7*b-RLvGV8A?yPVyB z+{u1_qrtmw=0W4s`TVCQI%}8w7THk$oWpuT?zcY%aVAHswy?T9E3BC*7L$JA*8ht_ zTEY>T6AsFR1$Z~{&N*%88NPGcRNHw8S6L^V%DdV(%S|DE?`z3tm;W6T2L-ODtDnm{ Hr-UW|6rQCY literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/phoenix_title.png b/docs/sphinx/_static/images/sphinxdocs/phoenix_title.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf83d85cfa8f0fea11a236a0eab7d2c91772c9a GIT binary patch literal 5702 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/phoenix_top.png b/docs/sphinx/_static/images/sphinxdocs/phoenix_top.png new file mode 100644 index 0000000000000000000000000000000000000000..5faccd0d8eacb4f2fae3bbc46e42ae75fb240bdf GIT binary patch literal 90998 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/property_summary.png b/docs/sphinx/_static/images/sphinxdocs/property_summary.png new file mode 100644 index 0000000000000000000000000000000000000000..9d8565af1a6f39b1aec96059530c74db6c0139ae GIT binary patch literal 2489 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 IM6N<$g3mvFTmS$7 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/seealso.png b/docs/sphinx/_static/images/sphinxdocs/seealso.png new file mode 100644 index 0000000000000000000000000000000000000000..59845270090924839adb9ffd54b8c74ecb899aff GIT binary patch literal 1437 zcmV;O1!DS%P)OmRr7$e=)h77C@5UTNw5-a=cTytHrsJMU{qG@(`Bcku4HC@@LQvePh7Cfne z*^6F<9e=49v;`9wjsXfLf%YjDA_6^}X3;szqTAv{V?!U+%LTVP%meo9NdY)?=p1Db zqvASnN9so1WE_%c0ydfvc7pWIBp_P=23bH(?JTFYwSRZfdKbLj2wg-i0Sc2_R91G5 zuYs1j<%Z0UdTSg)KZ~Im7Sg!{6mdXHFvC-7yx&i?aPb$hr$_7FwJQanwDhcCfud57 z|2GEQJfPVThbYMMk?ZMT6Uj+(ksL^%_I4+=t{cJNEH|47@Llo@H~=$G8E9;{)ir^7 zTLKNX7~0A65we5>I7ri^S&}Uj!KF*BG&;O=`Q{*zJO@xxaz+r1QVlc?{M$B&T4ezD zsbe06SPT<@vxbX&jsrv)vj62 zH?9{SZlKxi+#n0`HD>Wu~XU^TCeyR&4F9 z-YH^S*C~@9&|mc-^X9s>??3ky`Z5dlZdtjx=UPF(`cVaYqpBjje*N29US|Ibtv$GV r!`8AdcAWey|I2S*U9sww#ZCVMu7S$8vz;V;00000NkvXXu0mjf{;QjH literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/settings.png b/docs/sphinx/_static/images/sphinxdocs/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..1f04d857b331b6e37cfccf3d9f393c1e8cec365b GIT binary patch literal 2023 zcmVUI|-P^_7tT}07U7j@ljOGI%u1=cH5vf#TB|DEFcu!g1QYjtT+?|#sTIBGw;27`-cpHVMN@f?MY7F z%RTp;^SS4~bKfP5G5kM;`)>q2apJ_Bm)8OFHdi1X#DKKg9rQP z?8F$G)Z*gec{gs{xHFFQqbUM*ydvyKWxpR&n zyJo?H1=s89>PWEfG=Td0`d_uSwv9@XAF?FFXf!SyaXNEe2B6Vs-bqMEh#DXFqNSzf z55e}x$f$R6a&~U6s;Zi?m}vlK&YbzGrsl6^hvOM2rEoYLNJ>gdFDWTe%?1z?6SE2c zC}q&;bP2)s)YQ~{ixw>cfY*a2!V~2*R3zg2Jt1V`E^9d4he(Z0A6J zetw+EWcn<|Xk7M>j*j+@j*ho27E6Edyn=!PQ*LhVZM{AMgb;8X0iz6$dwUTc9*(G} zNOW{`_^({K5^b?qhNk+?+OHOix`txKW`HSwE!YW!WV0x+lFW?o+2Hxd&Q8#6OAcZs41N-6Yu zJ+$^~h)e1Lrv?_qK(!)Gy7bAmdHPoYcwq(h@86$hFc>yzwc3dI`1t+t@$ouJDX5}M zesoWpt==TvuYLM>gfj_XK47>Hw#Rq)+^qBR?XLxJ;J|?eYu2P(ShFU1mtL=jEX$B2 z2|l0i`2nLSP$-4nZuiySx|Ngl;zJu+&7N8!$?+5K|Cgr{D+K+Z!bvfq@ zaOu(|LMi=AR@SEMKwHVO{9GjoUatpUuNT9^!>FyR%RPDWq!j?F-!-U=-|D{}Yr;mA z9`HW}2oDV0NB^T++>cg#xBT+T9fcuFJ?$H4Y;4@Je*K1Ql}d&2@o@kQDwPUql?p1g z8rrZhP)gC%-2C%Easb$IFNY+Mp2eNmUsl}TLE@y!)?m5>$C>-9?*V`yq>I#F3!S##>t zsXy-9x9`2nmoG1GZf<(0nKutnk&$4GEeo}p%(KePuUg1S>I0-9fY$=zVn7}R7AHcJ z{5@8tTX?Vf&%0k!hXha*rKhK-hjw>&Uz$2zQBm=9Y|Pc9R;%Imc))R-Jrn={^xa$d zVgHx7Pd$L-1PB3CQGommAPNwdhOMG7^!<T11Kvi`=YhAb#HJ` zx7(eya^)(+!-o%?x9V^G@I}c3vh8>Q;^xhp zq^+%u*lad#WMqVRJRair`?=)gJfWm!-ZMWB=ljIn_700hPu zKk?2_RE`4>xaTtfbV3zEh(ZWa0LT;X^71f7o{S4#p66vz6eX=zD@Q~`D7;3a5xrio zAW4#-D2fS6jF(v{K0jQ=brBuZjQvnbNAptlZ0LK_36M%#*ahtA1BK)uP6#fDdibs+=NaB4cY<*fDuAyKsk=1 zJkL{66cx2vO|@DrjfjY#t5>h4yLazq+1c4M_ws)&{|4HS3W~y!TCD&8002ovPDHLk FV1g~^*;4=j literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/styles.png b/docs/sphinx/_static/images/sphinxdocs/styles.png new file mode 100644 index 0000000000000000000000000000000000000000..2e29a93a06d65952ed31885a575242fdbf878854 GIT binary patch literal 1883 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/super_classes.png b/docs/sphinx/_static/images/sphinxdocs/super_classes.png new file mode 100644 index 0000000000000000000000000000000000000000..f35fc53b1dfd5ccb801ae1815c8ac86bca868204 GIT binary patch literal 2498 zcmV;z2|f0SP)wQ4E5@ATFa35!r+Wn$2brl|>p5P!Js&M8$nW zF)ne7B1klX3lc?)3o4+ZfD0nsG)?b&zwMjT)WnK2QS&GHm99E<-|PF%x!?Kj*<4(H z|NRUDf*`!f3&Q8L`a1={7qq_fn~+5Z4dn%XiCM4iYP(deyMLuxr|<9WVH~ys+8g$( zgP_B|uo(23eX>lX`nf?G=#Djsv(V90?H~YUB!BwVKoHe$5cLUnub#7Q&JM!*>|m5- z2cj%10Od>Oz@~rV1TpKE0-$e)kbJ-j!k>9y=xg=PzKQI^vi&qQkhmRF3%lf`l zmjJx$;IZ@O-h3EqqhYJ@hw&>ndS1Q2qjx(IV4SAUn^6)M4G~RBuSavK( zMUuNG;>M0c!h}gUn3e&PO4aDRmY-#U75Mi#fj{-b-cqOz2Ee$>6B^kk(B%CM-%Ez$ z`oYbxnRI&kCYKY0_x=|I1@JI3EK@&|+pZoyj$*%1WKNlZP3{v=Jb4-lgQL;ee9KH% za@@|dlU~rbQ=YRtlVwueus%7y5SEi-7`~ncZP_TOSAGV?8h6}UITN=I$zW7IGBQ?e z4QE#u^00-`eNSWr{v%@MA9kztT19R?cBL=H`lw`V@STI!X})L(m98*>$0J}^7mnMd0l2**8eLUc z=&37!q3by87A4O?=qCnlavY~Uy}2C45%aJsLV~lRSjfZUa4#wztHMMmjY-7aGYznF z-1g@H=+}aB~W}5 zgNGHNXj~nKYn!*BZQlX3pQ^>P<`!H%coY}sFM={f3T0v{6lqy#`FAnSm#u|PsS@lw zFCGNo3>rIY+aYh-jwiHp(zc6x;PY?A`vttA?V-c zhsQ+|@F3d_>b0I|%y7f4xxSFcCZRVv5l_OR@ideqC<4l;1gO)pF_4l;K$bwAm5)2i z3Zd`q2Sz;Y1@0gw?Z1VEMVk9(VA zaIq`{rx$smE^!1Z6UX4xf=JYo*EO>PQ8i^c8fMN$ub3Dh`qe2}7+6TmCZ*zjbUeBf zQ_y+%5Gb1(U5v^u+qI1mu-DIrg;@I^NXO(Ercc`58noa z;Ep&BH#4$e=u^N&e*Y%gw}--76%5^OAKZ_1$J6+!7+4WPhlfE$hxg})K%O=W^7&KH zli-Qln-{=gH6Eq9F_L1)je>Z*L*RYv0_R6-O@G%Tp);od8ah$}Ti8tgKeoz+#LX|ZG3W*1vMUBJL z2v=NR77B-1S4RL|sD^Y6UM7RVawS!Yfs7oe7B7Kj>59R?8_3LqDm@#j>}9A;N=8Rj zHO$%pxO6mBqA7O*T2}f{aVf>NAP+Rp9EpygvFJ_oAq79EGN$8c)Od7zjP=l1LRbIl(F+6r@|zscV|s#&dh<`Y_bRtYF%tb zeN*STV}ic(s?yN^#JE~C3Exfr3>~vaq9@voyq|`F9AES;^crNKN9>9_>!QKf40Y6W zo&%tW{?NfV+OBNcf-Wk#eWEyY&kDw4-vB(C?vJj?U*hr1Id~Qvfy+^`uo?6^ilNyq zEYEvTAQh3ZNj78O=|g!U>~`?v|X=jt)Ic6d$21%H1UZq!C%Y?h0a zVcy_)ez3oDtbN7h{iRs$_7Sd58jg0K;pm(@5;w(O=!qK#Wzu*kGkx&5YK=1u4-n`< zJzn765d?mVS)=C9rAcw}U%og(9k9V;BJPfHL+i-VxH)1J?$C3y`#(`RXErQ)wUz)( zf1x9iLEpZPAM87$C!osnW3)~G7}sWgipp?rv?RHrEq^jvioQf|{W|cRZR?N99M8N* z0QNJiU2o{=bv(P+$koeAuz!*_%3a-1KgJaY+}v!nc)RZ89@(9R89@rf|8W+DV#wy8Fl;s6uQ+5CzG*y8*U*S)col_G1_ZNx ziz;E)B^)SC!B;CI@y&)*49Fi+85PoAHWks8{GASHKC)^(Hb~O2J1rB3O3Sb#aWT4^ z8aVPjAb zO7hmLjL>xC&M|C(RjVt6z!vg$dm(3c6aqr70A|GNrt07Ke=`RD14uNBl|1jXo&W#< M07*qoM6N<$f?a`|A^-pY literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/table_contents.png b/docs/sphinx/_static/images/sphinxdocs/table_contents.png new file mode 100644 index 0000000000000000000000000000000000000000..2e86079c02a3058e58637fcbb7cb1de1343bbf67 GIT binary patch literal 2467 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/ticks_green.png b/docs/sphinx/_static/images/sphinxdocs/ticks_green.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e499130bca35cce3922efa457baf0d31aad210 GIT binary patch literal 1099 zcmeAS@N?(olHy`uVBq!ia0vp^%s_0%0U~b-1^xq4jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCbY>@Ck8Moyn&%gI{$vkIF1wwK+UmbGTKe3#v>PQk^cWI$cC{hJeZpQI#2D zsx!q^XGy5emQ`^2W1xtY+}oE)Z5=O3Hxm|a!I8m1LGPmVibH|1Dj*A_gmpVHycXeLr?z-O7b-lOiMsN46zV6%o-FGK+ z-<#O*wyWpCq~1r9`<_hce?GPU<@Em7(|g`d1v-8djD`R$Lg2H92P4p2&H|6fVg?4j z!ywFfJby(BP*AeOHKHUqKdq!Zu_%=xATcwqM9r#B-8D zmr_e&hXTig-*!2-+fpM9e1+Q*9j=#V%wh`--QTsyVOpxkBo;@31D|ay`j}5|5^xn{ uajf|tAo6v-isuCr-nPUC7JM<+|1!Eh6L#_wSo0g`bOujXKbLh*2~7Y}hQpZv literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/ticks_red.png b/docs/sphinx/_static/images/sphinxdocs/ticks_red.png new file mode 100644 index 0000000000000000000000000000000000000000..9754ef6da5aae5821fc9ec91077aed26c5952421 GIT binary patch literal 1064 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/usage.png b/docs/sphinx/_static/images/sphinxdocs/usage.png new file mode 100644 index 0000000000000000000000000000000000000000..db6bdeb7c2edf35cc63ee3cc30512ddb977830be GIT binary patch literal 2027 zcmVcdI--jd^AgcM$wiM(8PBB6NtMB!&`}0tO)`Rfi2M8*16eh4p4k ztrpTecZT%X4EatVb_6gxi}RHTuQ#L={Q`qx+zIjbK1?t?W=x?AF~({dlU5gr zuY9c8+MKmqu`a7wgS9B2cDX|H=y9^`Kx_+OdK&XwAKu6SoqoW8u?!f)A*cA|DfT?| zbp{_R(s@7lU9A*(0*wWzd<@tAe9l(hJYlo7w-lDMjKwIT`tfBN$7aaB2mm?t67GQx zItl^94%{QgKkD><`vu02kI{D+j0c(m`K>hKwbpnQ=Kqk{i@$tD(~GZIxR_=vtjARU zULc;Dy15Ae_x9>6atSP14G8`d6I$e{(wWzcTwnq<^qTX(M|Z<%-S}PecyDA z*YQ1j{-t4)eDo{Vp&1rPj$9)H>}DyP+q?hickp_9==1`Hjkrgp=jorw__KZDq>!xw zb0ZgTNs#~#dOBFu1_dR zzqt23C4&zSidGO00{tHqSH{dJm~S=bCf z2G1bHgZRdyLmY1(GV&;%Lb3pE-YTx`z2Tv5YZed_>65}{{A_Stvaq&zqb_LDtrs6qb+5k2)UHn9$UQiCxTL{IOVbr_ENI>?Zd-@YwB@+bJ%Wg!;2#NzzKqJVO!4+DT%R%xMAh*qmw7Q2j?U>efb-?PdU2-crCqhzotCR$A*pnt(W9@-@ZAD&$#lD~v4w z;tFc_lPM%B(RmndisuK|>tHhwOLQeB+;3q-+h&s1ZBhq500vV?T*w7X4>-MG7UwZk z)R5X}>pU=tYkyeZN-F*;r0^N`fkS+}qjvoP?06PRWK$p(N9;Sn)1HpZe9bjnm5y<;m|Jgw#I*nfbOGWd_A2sKC4l9i{qW6|bXJ+oa z3AVq8Ko{O6?|q03uSCUx5KZ6FrB5G6uKUvcB;m;8P#A~i`$U(jgiV3^+i2xOsLO}y z+H;yv$sB4GpXAKk_V0vuNN^+eJptom5M~%7xT01h?R-EA@gUhHHm;WO!zxsN0p$g} z;1bmTi>~`hqjAET>~x;8)Ud4ovrhBH7q`0ycaQ*JW(Iq@PS(hX@|22&c@sD1WMc?1 zhrl|JE<;p?W)snSk?cN9m8(kgeYLEnhFTe#Q&Za)-<1J?i3wz)fcS!zEYj3`<%7>g zk9jd+N!O9uDl|fT(?z}xaeRc8RH`PnR^ywM`v9Hq6vzKK39MSp`HSHsaeto*H$(41V^m2vf)bX8*!!8os zh+{M4=gyF_L=>?8Sx_1(_l$jwq+^n*?4_dpT&nl75D!sj6r{5(QbcFtaA&Oy0sT9)P)61Sc zqtxor{NFB2esniEcXh#b5!K4CpFMllE-o%UQ7)I6pP%RK*|WU%+H3DOqU2l0fAq73 zyUDlf*YR%qCMG6+e)#a=?-vRMe|dTNlT)Woy-=xC?y7r${{fAps7_tQ!4?1j002ov JPDHLkV1j}D;uQb@ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/viewmag.png b/docs/sphinx/_static/images/sphinxdocs/viewmag.png new file mode 100644 index 0000000000000000000000000000000000000000..de5ef3a1b43713864c5fdfadff14b383d6d0370b GIT binary patch literal 2282 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 JPDHLkV1jwjBWwTw literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/sphinxdocs/whatsnew.png b/docs/sphinx/_static/images/sphinxdocs/whatsnew.png new file mode 100644 index 0000000000000000000000000000000000000000..b7bfad2e7f1c0c97e332a5a5ec6c42ad72e8bf0f GIT binary patch literal 2413 zcmV-z36l1SP)KeR=P`zOuP<$$p;K>ucV#+P>2GuMTg%z2BADO5=TwZ@p`2YHt1M z8@ckT=jXrpQlG^PyE5qYHH2qgP&$gE0#TY z@Zi6z$hDid_4#f=YgcbR)cnpaCtQrkK#N+7?%qLkYZpxO_3yv_KWV+QTZe?SB5d93 zf>oOi_UyCudV64WO8+~n(LX%#ob}NQW=0=4+%mKBKvr%k>YF-H*Qh4z;I8YNJJCR< z?&`;V$}1b7sA@z-brV|JwHTea`p7DkE!@2_@?pL# zhQ%_B{Gv)&9Q1~Xh1-2Ad!PLUWwrm=7pDRee{ae2y|UBN0~dmlkeye8ocvOVCFRH~ zRG>gsiNfM)$V!xuQ&y^m4ywQmX9Hx#WwqQr=EHnhj95~}VKA)d1QB*xdSXA%_YTiB z@U6$H5R@oh!gmiBT04c|fZb^%q~s$hO@fq+LZoNQkSV@QKxN34D7b7S@+wp+ThTu> z#aZ9L6eO}L?jG}Dq%4NTresJtti;p;*g5&Z`dAq3UBl!@&qghIB*M`<^37BJ>0j6$ z4+GEH7m=}9q&Nq0$+<{Qmmn=mh73_LL?j}wumVzfH5Ap&9C7c!B(%B-PC%Y?ft>lK zWfgI;41-}s5a#idA+S9j3a^X8uMVELXvhiRd4?=LaXQ*7Fjfk_YZx3|0uUIUhS2B? zu57Ft3zaCQu9hP*u?PWCQbY?%q1KF`ovg7{2fy%qgvS-qBUpr#OgRL?Lc|O55gjk$ zuo&hi9-%ZZLczG4ydpzQK6cgD+iQRNXWjtM?4Y&}R4$t#(IPISV-!LIU;_`@C zhNK(?GNdYqOPV09R70-nMzKnZ$(b9NoW21~|1@Mu4I~w6&POOwA}PBZ(J4g;iOuD( z7^cU$IGhhog`~8e3FtNc@aW5W^tH_OTugzgu?q?5RKAc@_=gJ-7N3iFp$zE-704~A zgRG_%3i45^`_Rxmh zR?i98&p#VR+%M>@-eJ3FqdEUiajAvZ)tUk1N~!b4Nh+u?7OwbuHjk)W0 z$vz`7x6n*^Wde4E<(xnEXICaj}-80SJ#$BoSSZp88Gst*o7`Q>EQw!_qr4$If> z;vKN$`;=zpSA5>n&zf$QGMJ<$97UIQgn-965gPjKCR5WR*-7LY?I;Nz=X{xXmUUi{ z@}9M`Ukza%ChS+%Y`6XXHzRU~DcSH7wuxc2X9of8Qhn>s&R<7Ac z+=A6KHK(%jE9WWef3OkUtRCb9FmXkt4fmbABQ-nz=AOG|hwVvfHWR}5?RskRry~ER z^SWI;62f0fd-pnt*|N@*XT9}+OH^y;2nk^QF-WIjA2RbQzB0G*%w!!-zANZC|HXQ< zBTxTE{9Q^{{@HrbKK_~I(a8l3t(0|5y#|FP4Q$Nb*=FS`pl#bouAwTq5&0ht&G}D$;rxGyFxu<*n|CaZ{pDQ? zry%1!{P=Y{?flp7wBxa6rG5UDfhq6%yZc#$5XnzjQ*PYt@EVo*ckCpi!{qtZ+iiYW f;%5>4qlo<{d&OGmIC6$a00000NkvXXu0mjf{}!N7 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-about.png b/docs/sphinx/_static/images/stock/gtk-about.png new file mode 100644 index 0000000000000000000000000000000000000000..010d294a76ee9e4964f6246a37ab502f359fd6c2 GIT binary patch literal 704 zcmV;x0zdtUP)n@p#t8el~qE?<5kzoM$CSi<_~RJutag6g=ezsNX# zanyhRptG4Jk!W!)k^#vOi5BN}HnZgaEjVn7S8R9e*fXrxOT2uWgTtoDq^j$ZK4L@; zib&|shsCuI2&tEd1Q-_3)4Jy0?V6)>G-HgP5)l#Oe-IOV6l+GsW(Orm?-M^+FV;_p z36f&`K{5XOacxREnlY|&oVNb1UF%9$-i{z?%(p9O9Yt&!BnvWzpFRL;8UXI}z2L@4 zJl-*;9NP8QAyb!pd*^I-OM&l=BygwiN9-tKzW=Ir3?u+F;n*>}kp$h>3;b07-LqeZ zsQVqwql;_+b!%SbAtyF>tD7Ba00fZ$u^!>V)LC+cT5m}lSTMtAC&p1UYaW$JvT+2pgo(7deUTgy*EbTc%{zRWULA)Gl zVslmp+MVS}bS-`DRo?KY7fFE61MNi>RX1~VC{AqlsvtdZzXoXe+k!AZC$Aus&Ag_! zb)i3;eBKoCq%7h|*>LhjQ*Y}cKghfx6wM7G%>R9f6XfA}O0>%p1Z^yPR_&toPp=Oy mQ0r*Up|Cbf<;vY80Db~kBt4yIiLCMf00002?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4xItjS z4F)kbwlfTe**2`)xqoYupd9xPCT)!?%+5J?U&(Ta8yE=i>BKPPF`RM9F-xB8Y{(F; vw9v~*iH&CuqlK|BGxNU#&5Ukdn~fR7K5DkFJQH#Y=oki1S3j3^P6F#3cAXC>M*>I!?t!N+*jbfk$)$>PW!K6lLY0xqWQKxp>LKNI;Epw48ym!mJI5u3@ z&HFre&vTyV^hfu~lTGm+_`*4yb3UB&JBJ7%kZud9>=}uXuK`S1Tr`Ijempft(gi~* z^HN3zU#@O`Kq3-4E_|hpOkNqaxOhIS@ZV{=r=t>SDGjWh|KP#`nBMDnrTQIT`BNJT zBu3r1g_;dKups>-F78p`lP42>_j|U%GM+f6QFol79c_of?w&|8BwuKcg?imcJEQ3m9 zf9<+P|B&8;Nh5+4^S7d_zumZ*hZs%H-JV6d~NgcLj7Xf(Fw#A33D}+>5?3XjPS3ObZxg0-(X=?&cFW7;$j=h>? z*^Oa^PdhiB}RX#t7 zDiYPY!Kep$o)Uc1^_gy&cHLa%VFd8GW#*!SLAPQUh<}ITWhKAa`jN;j>T{zwM#jI}3w1yS_$6O#a4Xgg-+4d_Zdk-cG<+bq91&AchBksC}n)03U z3>m|a{v&d{k0GI(IQQ$RX^V@NJ3Sx~LLj6vkHl!}{aH(Dc5ZB$CtR}_h<^`_$1p2y zg4?sGy6-J~e5_f!Iv#m3tnd?e1ye1gvdwO{`@l=jHToY}QcAmH2Qg_x@MLB!Caz7{ z?VYVZoN6*E?u7jhOrrS`qbEuNtMj*%y(*6x{m7=vvFC7urYE#OSmA%&4TKQlR#J5> zs-|+K>e^rXX-@pxp*`ZYqd~pmUA7m148RM(1Hg@c|1otsL3F>IlKEGpQz5n2$9LBa-tMK>4{zkcm?QTmCo8a%7H_nbL7let$W zCdd0+n@dL3XaEon2JhNjF{(zR&b7JZ;*s;%kKtrxlGbU)o38m+t1qi zC!%@{6#)?hLF88;?>!z5-ecxS^!AfZrv_XzcHP%8HADmvMFa$CupT@f@4@>z^?E%{ z;+mDJp{je$!u`n9VZ>*)c3)z#1B3$y$PL$dh- zw?=NXGJsTS8UQon-rYNN9_d6>+1S`1Uzi2pd3uK1BR79D@PMcq&z?-}t;#TSAcBh0 z-QCUGxtG*x5w%*a@uVB@E(n6+%7^8_6UR^TH#l=RbHJhaZsp^9f*>f$#N>Ei5Cq9E j4FBsp2SHE_!*KK`x_-SM6DuBH00000NkvXXu0mjfr63uq literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-cancel.png b/docs/sphinx/_static/images/stock/gtk-cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..0a395c0991030c0c0fbd21095c97462fd5ce91a4 GIT binary patch literal 1067 zcmV+`1l0S9P)4tg*M@{h4omsP7B#LxKyJJf$g_r} z{7gBWQ}uzs{?1dUyh5q3Orp0p)&z+@7DRDF%8*G^n!EoGXc8%#`FuxTpZm?mM(Ol; z&~WgeQ%QM#Lrtx6I)CXrc~b4^?yitRjGIJNdBI-htQ2BlH5vtyNpK>8ves7NC@gF< ziCRn|uOa2gyT^`soE{I#nw#a`o}OYu%4>N+0I;+^aqsfwCG6M%&SXIGIGO?hmm%d( zO3I;{&d%3;m6gQFBsiT03JL&VbxW|9`S_h^^yLZ#J^787U>gx8L ze!s(h@&sVUaw>&8gM&#+>%#y*%$(1JNwm*fRCL3C`m~#8X90%;@c9740K#E#A_2Ru z4uACbFR#R6AN4Zd*z$$zuN+IqVz(oA?=swOAe90l5%7Zt(BUvdLj!IP3@oJ+iT)h+ zQqUywGVqq+^#aV`Oa^u&0v!rLwYOvP>ebcg?Ci}Rt-smWmlrgN$dK~4oqm7mYZVn_ z&(DKnG1zl+5I!H`i;D=4jlHn6?%CX%7nD+dTfA%6z8b&ZVNXl|D=UCffDmBIg1fK~ zLaA2)6#Xw46r$VX^L_r#(W7pAd>pJbWJ?RO)zwfP9pJ@9$Y>OG2M!p9ls~)_G>Ph! z%XRU+@Hf3VM7T6>V+G@Obu{M9o`*$}rCE>FRP9 zq|?w3A40XZB69z}9lCjQ9>6E}E?ruZ4GrMcRUjNj)1gC7L&||IL7Vw{XmoT%Z{H5p z(Sc+tg*(Au+|v4e02gDA9?dI#2=Md>;CiO@i9fGgSrIig5M^b6)+nj1brR9ue~{c917HAf0eEGA z=*uC)nEjsUQvh!OD9hznDMv$rfR3Iy!=p`2%Rwps>H{hP7|gu(>k*LxusMzmXJh?q z><@vG!$JfBI9@P+_cim+PuB)R7ChJ&n literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-cdrom.png b/docs/sphinx/_static/images/stock/gtk-cdrom.png new file mode 100644 index 0000000000000000000000000000000000000000..922f452f1072a090ab0e026f71798fc453a370fa GIT binary patch literal 894 zcmV-^1A+XBP)NlbOlRnl9=>3{^11v`io% ztt+#O=?}qD(qInh%Ocv7Vqtx zXDnH-^0np8+FEHnj^nZ7!eYz;fOCHGz0uKqh5h4d zrz9eRu?C&6gL zF@|=~g4Pj;2msKR?#KFH_nftMl@rmq<*Q4P=LzJqgU=NZsR#tvkY1bR|iTz^*;T$381du{PNd+ksq*UOHLrEXK z$rM(8{65^+*!b$(Z;F=$09b3kzJ2@GNxlk-Q9e5`i8wu>ixAJ!5qS=4G(clP|*s9LSg8)IG$)BlO{Q(dC5 UEQ>+UXaE2J07*qoM6N<$f&k;BoB#j- literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-clear.png b/docs/sphinx/_static/images/stock/gtk-clear.png new file mode 100644 index 0000000000000000000000000000000000000000..1556dfee864119079f78ef57e98e95265846db29 GIT binary patch literal 728 zcmV;}0w?{6P)5(o0BGQ5**F@7_D!x%0S= zPC8{-Mm0f^Eix%9!-Aj(K_JbdqK%6Pp==|x2?+`!h@P~ZAi+(wDX^5G(adn;V91ya zqt^IHnQ>;k^Emf)PKz+o>0xL6eLwhr91j2S9-OmY<}CbGT~$4zRl45%B-h5Tw0!@J z^^(mY-`G{(xcb!D7LI7F6#!NQJUow8u;6A*{YgiEuoGV*gCLw71pv!R0LsLR73-=5 zkxZd(=X$&u_?*iaQp-PqPwz_mDC3?7I*ewQn3v+Q5c;BGR@H=icV2uA{PhHXn_n^w z%YM0}`qm+zbxm1y9#MtY7KjiU6JpmEbHbm1#v^+lO+=2?sKhIHDr?~^%fRZI;;S~3 zj=V(;1cP7zz%4J1zlEe*JWmZ~JD#3DA&m}i?&*lU{XE+OoIrlR;~nCJHSt|%XV&3*^gPaMnm?hR`I0000< KMNUMnLSTY{uuTa7 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-close.png b/docs/sphinx/_static/images/stock/gtk-close.png new file mode 100644 index 0000000000000000000000000000000000000000..52f58630f44970f2befa4df1419e9a724322b167 GIT binary patch literal 889 zcmV-<1BU#GP)rAVqCd&!%E#~;?B4+An{QX4N;2~5e212Ow@qdaw%YKOB?9D_qY%m zFz%dWGMoAT$;>w-rNsY)006h{A~J{b{?^^f*qDLh;^pYP7tDMe{uZ<>>ns4!90j-T;hgjK+M4R- zmS(S-Nc==eNePG%CMPGbbV(69A3VwqkBmGtP3y?qk!e0gx9$;~^Y)tR$|iraS4}1p z03?cvmg9c#advp*ThKJE!}AG=f1oAHwvo%tz%)%rX=8eN8jLYOg8pu13#YS=)fF!9 z_6A*z$Kz0(PH3uz@$opeHRwu3g{y`0g@{Q?`A5uHhs#yo*r0FL(&-eIEi1yaP&i9O zvT?^&^=Bf1#f6IzdigpNjm92ZwtZ-zx5u2rc%yt}Y2(HX^;$eW2B)H+>sfa;W{f?F zjv8H0o_1%Q1x`#%jzizHK`kv^;bV+l%da4%JW^G;N=v0uC@65^d8j878#TIyB7?_= z2Hzi#Mq|&PhQb-n1d_>LsH$+OQp%%w10uRI@cu(8nMx!4sxK3b#X^y{Z_Z`X=~bDj zsnwDG{tMr~|9Bk=zsgQbB=9csaSGDDN<>6bN)Qpbx9DxQ#3{?n-5rVyUb0M60iev1 zvN`9u+V%Ap`67pp5nUgA+jky-mHz`GA^?0=un2%-wlV-VfZShcODXN&T~$u`4TxGOx2jAeR;>B?^P3r zMh{%L=i}brz27;9m>B?|=|%`dMKE8fnAtpf4B>7_c%F=&JnB;v`MIVWXa5PH=|-`Yr1j5J#$xePZt7XS5l|%@-?tmzYgK#Z z-Q22WS)&y*`_}os1z;S&D*)q84sz#U;Pltx4m|-zz7|166 zkYwiHljugp%r?3;uMnxhU{Kl>3Snq?7$f1Z>Lp46fOjj8*r*_CFQyTUM8NGf@Q3Z5 z02Xt`ER`nMwpF%m%$Cbdi#gLXfPq}C)xztgrIZU~AP01H;eX;6>6G^J`p&^r00000 LNkvXXu0mjfl*+}S4tk-SEw(HMMH$UOFgT8OyWIuox(>z|!eNT?Q)#FJN+p=4fyzsz3(&M5 z1Oj8QEH>2c<<$iq9`D@|1fH*+ou9fEhcV03wkV2NSzd)@nNYt}lHgoRaN9}vHG1pg5Cj3DD1s1zdc6*S;N$b%7N-)ik literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-cut.png b/docs/sphinx/_static/images/stock/gtk-cut.png new file mode 100644 index 0000000000000000000000000000000000000000..ff87558fcd35f349b780860523ce96b53759faae GIT binary patch literal 876 zcmV-y1C#uTP)AuWe|tY!nn9ih}c9Q5XFhrB19&V?p{fe6q}jQmIxM3`yIEW`mYQ7-UU? z`~C4{8SQZA@xZy~+;cBkYZ2tKhluD`YweSnk@4$z0D@e$pNM|5)*j1@jIRO!1ArsW zyIz~;iby`lWkU}TheRab-rnvyjx*Wh82~_ddT?Nn;_-MFGr#?R1DN?8&-0Rx9~>Y6 z$L{e#F3Vc$M9UUI~ac_wLMu*4pTI&xBON+HgB!Z5PjuvMAxwWk= z8V-k1SX$iCTD`wpyeB~uU(HO<#A5LmcXn>OLxYE~`sW{rx^BHuuU~re_0h5WuR|Zb z#7~LHC8gA3yA!qSe*unv0{Wk8sQrF%x5kLb-%6?1&VQ$uMMS>s?(W_{bmBY+z}D(z zD5bEpdG1Kt%J&WYVcrDu!V406;MLN~L0w$)rO>^NB=aPl+rd>*aD8zVC9lyB=afpNx>70t0Hst=DwXP<=Q-(gT72IRm&;{{$T|Sf$1jJ@F!QI@+J~*R%*?lp zF;nMe)fY{dPhN4xi0Fbb<{=_7L{u@xOq`olbN>O!rz@5M5>JZ&0000Ae4sIc0F;a?HN0^XFT(=LKdE2IR6?Y}+QE zFL3SZHG~jUYc;|!K+`n_{XTxzr#~1F$FT{ZpY9^|IzGqEV@%5;ozCDm4igiTlu9M$ z=3d2;CNEnps?TaDrO-4j1~34GuHQR+eDu!3!WC4k=y+{9UK`){X|-B-o`>)I^twG# zucUZb*+)uw?|cdugswLyCnmUl{WVHg=E>!92wlVTJsOP$wOWJUpFX8pcj@(djH2jb zWvl!`8{fg&`i6S@tv6}@@selNIvvkvI2>@A5~h@>c*N3Ti66Hgvh&lnb~eJeW~QfD zSeR#WGRyONot@oXY}@A7!$YKL;<_#~GgIh7oH2hB2*bd(Z5+oTj$>-|I+;wGcB@4y zm15BElSm}aBWEf6B{(&YMj?hFNZ2;1R0`8FF{FVZC5B=AzhFFXx7!84KJ8{%767?i z7EROsTOfpZuy^pYavX<5B8h356bg9^!=N}@B%94qoGo(r_=%EIKKR!TqA0rc-4Eq2 z>J4{dWqBz%SDY1>E?z*_1nrJbt?ov@9UYwvbH-aEs sMJaS49))4}rBdoX@O5RYd@^SK1iCmsGH{F4_W%F@07*qoM6N<$f@vg@9RL6T literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-edit.png b/docs/sphinx/_static/images/stock/gtk-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..c5da3f9fb1e5aa8de4a0c8a485f966a8e44db34f GIT binary patch literal 755 zcmV zAo#clf(K957buZ3J^No)w#HkxF|Lo_vp zb}j?E>^Hyt&5RNeTFIA-FPBWnXW* zIO&o5@)eJx``08{rT;2XO8vAKOM=Uo!gcH4 z?=eEu9KyGZRRSD-b0kzSICWa%vXEruDmODGV)^D9C$YV&r%D8uzTXg+uO zye?OusIRYQ-TJkxS-S?`+-hX-E}_O1c=Ns3_8XqqU)XZ&F}d0$08}W5cH1Np39{+; z%DYnm@caGTXg|cl znk1L(54dK`W9#u-Os?@_OmVQr1pxdU$ER96&+|9v^<%yiDozyukTnly}-3f^tSXn|U# zXku#8A|Ww^AU>%vRg}imXB8w(y!5HDM6s44FUG_aXM7Ts`T!z$K{TRr8=VWJac0i2 z_t||ZjZMM-ajmRxCF}neQA*)`s;sJ@hGF#DwhVBtT{+*uTI*PW_bToQITBh3Rzqi}tpTVLr!jCZ+V+w>!SkMn^`s2Nnf1kH>>8Tg!PO zktidC(5|jqodEJ@1pt`j8XpqV(*<8{+NjMG*L=E~0-&MbjT97a0>J+Ol~om*uIqhJ z$n$1o0027w2qy3M-B(+-mK)2KFJ(TTk4q`5Yig^te{axu@)!Z&kWvm04nD~~+)xh? zz_KhfooKd|QhR+qU*o?0dprOTi9~Vk=U>7U0GgVQR}n%iO6gUv*W++F9XNgJEZ)3{ zz%UFH78Y2HvD0gdK63)VK>vWcmODRieiT>~aFmo3qo=1A zSy@@g&Yp)Q1xvJ&(qfkTVJ-uJ?(VzR_}F;sudTmTQUGDb*su@+i$7jWy%}C4Q%OW) zQJAI+cW!rMVj>Ixcsle91N{%w{P})^aaINZoH6#2F_!5vT>yaIo_lX!hhMYO(h}`r z>m}y*`&Hk)K2o=P7k+PRPjk*6Nh$M$5ZeKOGR87Df3?YFnkLfeG{(oqbs@wdrPSLa zKYWkcx*C#7rEubS6Leh*xmnE~ShHJ41Bc`XZ;>?Z$%K1y*<>+#Cqx zaY`v(48IWhpX5tQ=;itY4b}g+EoN-zQp!9KJWnQ)3*BxvR<2rMzMG49d~%wA{8)dW z;pl9MqX7KMR({4Ao(v9&si`Rdz{tp`diC;^ZJMS|Dcv?lV!?vfZ~S%Z_RWW5qhnvk zWARWd7SHkL_>DjB+)YIy(Fd_;j0z#jKHpG0IUC?V-`IHan3FN~*tYFl&iRFd-yPmH c*X9}h4P=xv{q{-Ks{jB107*qoM6N<$f+RAV*Z=?k literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-file.png b/docs/sphinx/_static/images/stock/gtk-file.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd94435abf3f38568ec2fc61a266bc9612da367 GIT binary patch literal 569 zcmV-90>=G`P);xHwN%j!L(h?is2uS1vY}jxC zkPs3F2n0jK0+B=_2yqK?kKBM?<9~-A$@Y6J#vVLzOiQgd)2*tms@H81!S1WZ{fO8d zkH;5SGRo!hr_pG1`|+bE$AyiEpz-qAu=(SAxO*%cM@L7of3Wvwr?GuEBA879OeT}n z^wK)Ne*a`J?9m%^>Gs;RyDeIsCe7A2s?`cNZ`?X}-!nVP?}RWQJ*4 zO-Q2C?NG1Rxw?7ne43_vJB{t@0Li=^GeZ*YAOaW29Y=im`k6QTuL*Z1?v*4-J^~vB z0-11pO5zA*BoS=g*n0wZlxhz$1nxt?S+zA9p_I?TkNs^rO`~B5g zt+qe{P@>ef0}nhi9QebJ9Du>VoW*4aM!={EaYci3E;B)xnGoiIF^n!*hgzl*VJ3ji zRS;Id8SBzur^=g%?s*Bq^_t<=@t8H`4wdwVmxlfVrJ3w%8`#=0lFxTC(2>yAU?UCnIh z>Sp}JIJRx`-oAGcV{nbJEz3FzEZ0l3$mgf1tEtx-xdaeR zTco92o&TMq-xYZ5z7?cj`iywP!-xo2H#*}Huq^9Ju~@7Ohr^2tQ z_;cSqJUEBWP)w?R zMaUp3D6$qP`54rL2{!6sWtkLFLV{2arILh55t@cM7g}ifr_^+FOPfpGbf#I(-Me2e zfu@t}zlDHmLupyb5rl|` zEUULEm1?O_z)1W{oY(2JyV|T4O)$t86crZNh5|@|kWL^7vMD#$=pA)?WA9Wv4m_x? zn{V&z=2c3S*pPE*uCK56r1g!ZR-d)ow;CV-;HsY0+ddB31-I^2&K8_GPS-uEh%#R> z@$VheeO=xCCt*g5Iz*``RcxqSW) zNl6+h0O-~Ol;Pn_%s1E9d8u4sA0GEu-hOs9xF%`BvXbxI-`GPYL0^Anu7o!dl1JxV+`HHGmMR3AMidcsaqpDudORD-z{-xhIZA)IV?d`DtL_Ss=ij+Axrokx5Wg zSXH!GY&d#2C$hDzeZlVdQng`VC9*kMY)DH@j%;qR{`xOq8KLg;JZ~gPvivvvX)@1# Ss3xue0000sGy?vvKuzZMtAStd8D|>?h4C728Ll6 z&iQ^b--u(Av#*p=<9C*Cv6pdsVg}o`pF2va3pcNibMgDao&!a`H}+&&$aow zva%;Zk7ol22f!G^8Do%2QZAReg8hB{q*7_#EENH80F>G}HK4WbD$vIKw#vN^8;^AGvzvG9x30F~;C| z9=`84XYoss2XhYzYe#8F)eWdTHA>n;VtwT8q9`H=0xFeC0@)UEEZY(^6jEtCAeBlXMC%Eo zD56v<5r$#2h$RG#Sho^v{j1~H3FP}exqJ?_x=3H&AeBmmAP5M=x1_Y7zm8~`f3$LHJCm@KlUpaTa zHvjOMC#6OI0@x?T?qH?%tc052p05}RF-F>PQb1xnzO8_94xg#z)UTya7g6oz% zIMPEx2VFv9gT~HFtW{SLhpFh?Ac(ZDmEL?b`P8)?!uO*(m~IneD?L4!S*v!?YPhdZzyA?emIr zsjTG?z8yBeL?B`iF*xr^Xr!gA3-GrGca*JOO^iM$XZVd_=L!U5J1}${oG-uL%_?qPkf RO3VNN002ovPDHLkV1mbr{A~aL literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-go-down.png b/docs/sphinx/_static/images/stock/gtk-go-down.png new file mode 100644 index 0000000000000000000000000000000000000000..dcde30f02b35a7c8e4d9f5473a549f3309afc985 GIT binary patch literal 598 zcmV-c0;&CpP)p>{|RtT#x4$*aU^#N?XV4NBYaqWjd!1G z4*>K4IL+3XgO{-tui{O83dvY}D5=yEqwk zlIW7rcCIJvw7*cPs=*+q=1V8f7MI>Hgi#z_G1|_gU1KWX2ZWejij$j0+vlkw01%PP kRUQutf9s1#wuAqz@6>YMO+e4{>Hq)$07*qoM6N<$g8U){cmMzZ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-go-forward-ltr.png b/docs/sphinx/_static/images/stock/gtk-go-forward-ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9e3f0d1ea918fa197ce4375ea0ce42d48f9a34 GIT binary patch literal 580 zcmV-K0=xZ*P)?jN<1)UNUBGEf7 zX-Fuxq_MFvu{D;)ii5_6j$|7`kRSpHAqIjW(3xmF3;vwq?k#sO`}RGHQ^Rq$cYMj0 zX}Cck9SM2d>P3>&z0M$ zvy)CMA@)jZ$XFe4tPCt+!xA=#7%?Qi;xoE0-$7r`Kz4I?bunMCZ`1)~HG(qBCvxa`MT4STNK zJex@+HUE<_nsLFE=td zcNA743sMRRm>@-XV2{B~4`brdoSjPYk3#Ziw;n7NOdr4}0N%gDmE}!*yFS6M%kL;x zzhK;3M0i~2ZhQq`HVmSY5eCr_fNa-O2mpu(&2}B6I{OBIFo@Vd6T8&`#88SrigalM z0E*CPU3UQb`u+e#ZN%+5ZsH4=%mzVe0Y<;(rRolQ$e&- zeR=M=?>$F~qF|$j$Nj6;79+IlS{Rto)}qr|u(lXEbNnnj-3oD|j!9DHK2Py}{`CmZ z22dStqIcVQRUu~k`@LL`8NQ7D8YA2C?$UcI74He z3+Ofg;A#(1f~YmX(3t0Muw-FiG6ft&_##NGl@n?0*tHH6uJ+bDP@=689SITx3&36g z6$a)d1;-r6solJAPv5#Yp?pI)>ciYP^nL6l-S`NV4D8?P3gR&$#ThJl%F3o#7L%xb)J^v`apEAV5Pdb;{?rK=5)IT^-FF`Jt-%NfR`m_|x7YcTckApnln hYVPiX(f@h^z;_s%*MiY^L(l*K002ovPDHLkV1iQo7B&C? literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-goto-first-ltr.png b/docs/sphinx/_static/images/stock/gtk-goto-first-ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..689ba0a96aa4a5f8ec5e16c2af3c57b4fad72cc7 GIT binary patch literal 632 zcmV-;0*C#HP)h%L=vIt|LM7S^g`yBh#fXDL1sxnzLX*7r^4`72A#K{GiFn|0 z;Qr3}?)lw&)%>&MC#_8mz_zW%(t>}If$)m%X<(yN2%|yG(%R(i%-`eu)fsj`1I>99 z6~G?U04xAUjSbWAif-OXIIBujW@y0{wFgbn;wpE-Ux9VyMq z$LGd~9`@vmeG8qfpubxxglk^Wz4YPh%A1*^a~VK@u~H!n1_@TrLe#gg2l8Hzgkzq5&F1ARE9e5Dx<=5g7&lulNhm(eaYi Sr^>Ma0000ke literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-goto-last-ltr.png b/docs/sphinx/_static/images/stock/gtk-goto-last-ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..a653e10ed6873da7a1ab826b9dac5b253e66593c GIT binary patch literal 653 zcmV;80&@L{P)rl8qlbVi`ZhdQq)*S z2NB^84i$73x=P2?E$ZOnCSGt5EKQ1qC|GHW=~9GB+rerowKqSfx%V80v^LF;;0qt$ z@bW%9Kf<`W^NfGs)!XbX_i(vNPuj2-Ff&9;L8bc{ZWjA?CB%_E?DA~Eg_ zPeh-*eV9$AodM5PpPK+$o7BkART4+9BZYNfh_c?oatwEe#-mT)jc1c-XP^lHaNLfw zw3#Jhbt9xe076QHsP$u!6Wkhn5PdQAIHRhn8Bi)0$rs+!Z679LcVk-)w&fs%Bt)^o z0)0JaIo*FQ_F-X$a!C<%1p5G0sS=dnr`bSCfsg{ZTS7|uq6vN!zB9L!^MRhSuTV~P zACO9d=T}&;nE*?Ciu=McB z+fr8!G5ht+b`VxaJXg&o(+)*nu@l=}!E@ClFj*f?rkx1jZ~R(ker@`9sDsO%t3K}e zrR@qz)veG<#%MXeHoX<<;G*ZMxq7eUS5V~|pzTXEn9WcJ7aGHR+6l`41O&jK=cJP)jK~y-6osvCk6j2n0pZRh&Ze|E1s71iSE-QYlih@-HMa4Lz zu(7gmI}N0?^bc5AsYCvPxEg{;LKY&V2!V)+T}T=c4N*d7cjxY%xyM2bo8675Z*{om z+~<5+<5PvzJU1o&U2D~fI_c)QDcu`?h-dY6MP#iEr8KJ9qLu!(HLa}4;^wOofD5qR zTjzugUzuBendnU4s8-bbPJrF{Ip`ax-M{)c2>U}e zlVviy&gGF?{jTH9M6rMIKtL4x<$=RPwFlRq1VJ(6TWcK$kImf`Gzk|@TnilAeHX?4 zxh_By`(@Ad<|l7H3xQd_XuR2)W4sngC)9 zI#(DYhzLe<8)(0_48W~clm>L$EC3Kd=L#``m|vT!R@DA0>fA!R#0aUb?^SS+dIF5( zqX6^Ih-veyhnwXiLehSl_u8CfNpC3i*f#7&( Q4*&oF07*qoM6N<$f&_sXi2wiq literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-harddisk.png b/docs/sphinx/_static/images/stock/gtk-harddisk.png new file mode 100644 index 0000000000000000000000000000000000000000..b714d86e2762724cd2349309e789b117987842ce GIT binary patch literal 832 zcmV-G1Hb%rjxC&J_Fs0ve1O6@;j(qKP1j z(Zm@30Ds;*cr@;1*Mt}^?rFVpF!AQmkYKb2;%*{Zjgi$|iMm8XI-SzeX(_aJ-q(X` z4eK8CJw17!T#-@=zTxS*{=qcO%To^~uWL#vdVknoI(Mzl z(hZ41p_D`cN=X2ulK=jF>QObh_45n=@gENw1wgf0wWL;N{Mi_2Usm($f}jqdHgZ*dARMv?i#pm$g9Mod%Dy5bDjeT>o6TFdQSzTNoM|P} zbc&l?(pCVZlI)9~#(%Mz&W;X#92q7YGI=*OLd05wl7EqLbwY-PP^)S_YJdawDeg?( zV{qUw+qdliApP3gYZ*MKuY@hdU^Et z5r5CT;^@#Yj_sgpI;B#HyZ0yfXLgpJo^F&3YB34`VHiuE=UK6)Cl?7+HhcH%Mkz&RejdXxmTCY)h|$rjzkbg-S4~rl0(=C8<1=~-{`kxQ0000< KMNUMnLSTXiP8q7Sogp$O1UPl&VCbxF!`e zLb5T!G!ePrLYA0Kr=kRdnPgswOEhHah3>{^)QvHdZDA%8vXPA?PNH#iM6)s&t~G6` zMd%++`}KT3Z+4;RbN{>-Z}PD5Ua1G41lA`UD>EZX-k$oebiGMIP*fV9WIxfIh+oFfOtIC5?%^FK6&bE zme)$pRf+jF8O1jN472fGDWOAYOVbjBBDpOG-=dil1(-nXkh_- zbQA}sr^u1}sarBv?|#PLx(mv#09boFR^xG;yS*Y7?Y8lIt>)Sio2C9vsr}ejtE&R( zH1uE)qH7Pj_C8Bdsj*oxs;a-#c^?B~$Q?O?lbxN#h3XyePn?}P{Er9T*x&oyR>N9q z$UF9)k?BR0x!saUH3g+2=hY6U0|1arr7&l=F|wGBVH+DnpC7OA=sFQN=TKD>3cTP| zw0s^!1OSj_8AMgCgu>#qhkvoM@L539w3JwBgoi`*GMUgr7; z0QG4cK1r5nW*QrII}#NY`1y}jc0Yx#vGHE%+gp-f?lRVNK2=_6q!TB=TU(L+@B?f?J) literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-home.png b/docs/sphinx/_static/images/stock/gtk-home.png new file mode 100644 index 0000000000000000000000000000000000000000..fadd43dc350346d56640aa767e4b3fd885bbc991 GIT binary patch literal 735 zcmV<50wDc~P)zvtfT9HhI>7Nks2GQ?s~^MQKRiwu_F z6RxR?VNXb4n!Isj6zl*vQ8~x*AFZyr`s& ziOI=jf#>&pcsJ}#1#n3;jz@W|6K=5rv6$BJxUZM4Ub#%RBURg?s`}GbQ&ak1fXaZL zF&_fiW;}V=M+F6D_=7&Qoj=Ptn~&)wd1<1iq2XX!fW5gX@1=MMS%oDScyJ#fWjSe5 zwXF)LT3x(95d2hcw^t_tT3p8~eg1%F@BVUhUF(EiuZJ3oCISA)LD(DW=~8^$R$Mw=Chp$r2NBWS-25Hx+m}&tI_h!&AgV?H03Pr3mXSbU z0Cw*xG=BX&!U^kOcGBgD0MPw7eIRLK>EIY1^$$RjWQd{xJ>A!F=0uAs%d(QV1;!Yo z3_%9~uvklAv6cV;ip<53BpGF8R!EWzeWo6?)7#iEIXF znuc6)I{+Y-@C%E~#YmN+C>sFkewvvNCbUw_bb|>Cn~Kwk)SY1bVizbp_!rH=1AmuE RE4csw002ovPDHLkV1mm%OH}{> literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-indent-ltr.png b/docs/sphinx/_static/images/stock/gtk-indent-ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..b00e218407f0af2e315cb2990bf41ba40ba8032c GIT binary patch literal 611 zcmV-p0-XJcP)2e>1zc>21}*^MZ<=mjjEtMu_oGZ`AXI zNQ8(a79s}x1c8voMo&l-LW&4tz(Oz}Db(gV5z#0TPrt@{`|eu2xqo=YxiB!r&TpQ1 zW>=P1mL_b@HhkMx0AaKfZO%4*+b>v~vyJmp7pkRVdBj=(lfKh{pAfkxC)~l_d?WeCyca_*q zrfN{t{bE5xsMTsc1sxSJqS~{n3ovT%Y0CQ#AGvgK3PE_Wxj9t9^?LnZfKO9`4?J$H za`@0eP8UxxGjns$gBXc1AfkhSBuThdpUpttv%0p<(KQq5scXc(~b=NgpQ|QfIMKQV+(V;?# zPQ60bL5MD0EfR_ddZFwP)uBrS1rpJr{~)cPBI@EPC~~t}cUN0U-M8P&bWk^A%Lj(} z9_IPZ^Z7C(u3f(zQp&kvj6H6Q@v%xtDf2>#N7~ir&JGS`0F z$;tA{7jh&SEN@p!5bLLh{w zH24<+0M-C7e!B~gzmbn~DO#PLN`q87iM5tme;t{(clq)99ss741EA~ZecnGfM9+y4 z+=s__aWOn6rE{~K!E`pmOf~}ozP-G~<~@Up1L#EqRTEg;y?(HU_P+CeYxK}R5v+Ep zZQi;x!8}bJeVF`DBJo~IvtRHxv{Ku=6^l?62*E%IDHYbZgg5TM8}1@v!KrB^65CBx z!xrk-b(8~FQp&v6+Bct@qfjVNU0s7Ow1L9xB$3!&a)~j7<0bd?CDv*dCdLRfcc9%o zU|nZ#@18cLRCm0+Q%1sT@p-Gklt_<1BNW>QMxzU}ST~1t^9bwW32q`g@y5(fei#w| z`;GC!Gu8&Yv~D|$KN1JAl#kW?`udK~qqi5_;(WKTD<03v8oLk_AO;-eIb)38@W%lo j9XYPu;;EgNW?ugWCTka{fQ6k400000NkvXXu0mjf@;OWS literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-info.png b/docs/sphinx/_static/images/stock/gtk-info.png new file mode 100644 index 0000000000000000000000000000000000000000..df87def2f2c16b1159902f980bdeae40a45bd007 GIT binary patch literal 879 zcmV-#1CacQP)De4O=g03H9?lWYIS$6$a<>V*CZ#wlgggh}oc+;ScMZ7O>$Lj^_2Qtx+;aC-PpMB& z9Gxg1nQT-hTUCJ&?CcKR)}#IC_PxENFy`%Er~S=i1~0w4@=2rWFU_Ah8Puu)d10{* zqyX(nd`~h6W4>S8jQ7Lz^PfI`>mq<0PhOm;mzQ3de>y0H$Ic)nH|BiXEn^4jctt3hc;>>{bn4OslfJ>fI zYT)sek7xuMYaP}(9HV|e%sAYtX{F?X=bSs;YF60Z3Mp$vVJvxJ znSW}M=T9^#`-%_0xV>f+xna5y;2ftVP|=>kSjdedEi7qnxqAIR+LHhblY%HS zq`4jU9a2evij-1p48w$a;F0DdQIwexuqixIK$2E(`@ zN)3Upm~ND~@yEl&I=3Qwo%ULkno~#X zZ2W#diPQW_uhU-h0F1GhZ{FU1!`JG_GqcA^fAv$o{bh?U*Y4pQXispgRbjg6v%a~N z-uiRe#rIT?!<#A`@$IeUa!+0 zJob%aqw}7p-gnNO@jclB$O^kFg!s8A%m=+r`@4hse*iK2i9)~$Yl{E?002ovPDHLk FV1mT_oWKA8 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-italic.png b/docs/sphinx/_static/images/stock/gtk-italic.png new file mode 100644 index 0000000000000000000000000000000000000000..867df5dedf3d1d13af0422baee018c6e60393655 GIT binary patch literal 665 zcmV;K0%rY*P)88>3KAkT%7_**L{SmyN*JFEpjK74%FJ3ak0 zV}p&Lr@J#vVKGk-R#6cUK@db5f}C?W95{zDmhR3pQ&W>Ywk|t#Aw~@%f`}plf<(Ix z91iEexsWgnV6rKN9NxOj;-Z{Kgq$946hrdM#otB@spX^ zT%1>J5ZHzSMb)5Mw;()!@se`6%(0_=NOhJImf= z65s!fF($@sL!hw*Rm1p=TO3Svk?QIqncPFEw8rxC$`%WM5k#}_Ws!#yk7#Rc<<8xE zyvn`?!1oI=W($Fc)cgyVuUzF&I!zFUd@UCFwYo}sdm9VBUn6MTfo%{dBFf~GXM8Uf zxqtg6P0h`S2+ldmzsuwo{2I<}rvOT&HAb$DF>vNIP0dXh)!Nf39Uc3a&o4xc#%2W$ z5LH7<%WfV|Jg7BF)Y2+SRUD`KPtt$lIMr$uHSxL5dY+e^%gyxe?>NA}hBX#zEU+ui z&3&51^SrDK4G*R~&&yOQmH+zAp66vNmCC>$=E<<@EYi1)ViuxIP81;N~hxJId*;>zU_KMVp-M}gUW{O~Xtw-W^9 zNj7EK|3Q&2MvjtAcd_%8-UY$d(9S$Py|1PI{(bz21}M+|&z)e57B_>4LMaeYbfnf% zc>f^7U!SJUZLqDo4HGqJ)=Q*XGXmr_z??tN#KT*(xUHlUD{yrJC5i`Xk`39{$?xdr z#P>h(?I&+gtyHO2W{7ziYsqNLxH(5(Bsy7FyA6rw;W!BLvoW`!TGf5(R#)3nZ4xOXq0UT>iEYT~&^ zR$yGbqk7a@@&d7la)ekbM|iV;FJm`&LSe|>Ubcywl0+Z% zt#UH$DQRg<;5Pzl72i(&^~krzTr`GaVaP^Hwor~G0xoTr=-l0jhld67#z@X_?39IZ p6Y=~lc!RD3sL@klxY+zzcnq{h7%;&UbTj|}002ovPDHLkV1lthbtnJ; literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-justify-center.png b/docs/sphinx/_static/images/stock/gtk-justify-center.png new file mode 100644 index 0000000000000000000000000000000000000000..57d6a0e35a69e1b3434d6f6474ab114e990f7ec6 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4r_c<%l+Z#B%Wm2FwQO;)gxxuG~u z$))T4{OmIf91|bq>+&<6b#Gpl$v$_MrjFRs<7})|>lQw@%IZ~L;cwbw$^KAh_Ck&B zLdQTcxsuCF32?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4$DFKKP8>aG5cF|jd{n;!)IeBom5EpzvcMv!wENM6rXan zBkw*-HglB`Tw8)+@#s|E{qyW zZ>{4NUORc(#C6;nOAo0tB!1m-d)}^d*BRbFo6)$C)#ceLpm!NOUHx3vIVCg!0QO;$ Ac>n+a literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-justify-left.png b/docs/sphinx/_static/images/stock/gtk-justify-left.png new file mode 100644 index 0000000000000000000000000000000000000000..9a7abf7fffa3eb72a1206f8d026d87f7b3078940 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4iL z&tCV#9US>z(-_;z-`DoFq(qi6Ziunn|IX3n#n=s50)`Lw`ddzX z{94N>*w`T#m(tT{SZ2*V@$vC#-@l%@c;MFM!*i#whAd^f&B?GTXup^`Bj5b?0}t-G z_?OBAywoyy@!wG-p{Lb!8+)immlAKlG@+ojqp{a{XQ@aY@j0ZqLda`sbHlgTe~DWM4fdytr6 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-justify-right.png b/docs/sphinx/_static/images/stock/gtk-justify-right.png new file mode 100644 index 0000000000000000000000000000000000000000..15b5073326e204e66fcabb76aa9e90018e686b16 GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4kfR#Tl>{eao+P-hBfo$wXSX^DupDkE+cZTe=+tlCPkS6D zikq)hi*;PN;mo@bU{RxthE>J-YGt9dDnq1j-4G#4W=_)#uXn*?^4tEr;EUmmVm}~ zBQ==LFmmG|UsvmhXe8LFglK|5Gmz}%cJ2g??Z%!h1wbi{bHcgo5cRcBRNg7NlvxN7*1C&zL#d7K3lc_NPE?vF|fH97hN)2l**1DF8an2#u+DC;#VZ1-tkBHE& zWZbS{XFCKqdp@7bv$6Rd?>#fq4_cHuarAHqfcGBp&L^TMB9lG_z~k9D7Rx1KrTthe zmrzPo)#)?C*NibY>OI_dn&#{%<$-`Mn0EM z#7dn|O3~MQh^bpsO=)koEA7XZ<=G`P);xHwN%j!L(h?is2uS1vY}jxC zkPs3F2n0jK0+B=_2yqK?kKBM?<9~-A$@Y6J#vVLzOiQgd)2*tms@H81!S1WZ{fO8d zkH;5SGRo!hr_pG1`|+bE$AyiEpz-qAu=(SAxO*%cM@L7of3Wvwr?GuEBA879OeT}n z^wK)Ne*a`J?9m%^>Gs;RyDeIsCe7A2s?`cNZ`?X}-!nVP?}RWQJ*4 zO-Q2C?NG1Rxw?7ne43_vJB{t@0Li=^GeZ*YAOaW29Y=im`k6QTuL*Z1?v*4-J^~vB z0-11pO5zA*BoS=g*n0wZlxhz$1nxt?S+zA9p_I?TkNs^rO`~B5g zt+qe{P@>Fo!6iR}@ zg&s^Vz4q=?|A9a#r38BDf8bN^IhEpD4aTJuTpBgBhf=UCx44eutfZACOWt3v2ki<+ zNp2nZ?vHtIKfIauomC>j|2f<@1s*DOU&Dq2>nYp?aG;*TUIx35MD}0zotmuhfl?I< z+g_=(xwO1&W~){At+_b>E`oqgyPY%}jW`+%cCKLSYmxRFfnO-~A@Kdm%F5JxckWmX zcyn`TV-OLtI3{kj$duyGr%$gMjm9PL$yXvjy#jooRK>vI+S*#BR;i#%CCv2nC`$wp zfn0GIB56v{ZgX&O(2n7DQK>G-7Pgme-I}VF%M4CVkR%~$wTOb?6=iYE<#m0m^j=pFH86)m3Y(-F&Fj z{c)EyY`nd&V3N~Q2t#xjq8taEFHsfyEJ7xNWEnb1kT4`VJ>}+&8|Lu%cmvpXb33fh zmP)Sbbg+OrJ45?EI?GVkfSCwn*@zuQqufr1ndxcQf%S2P8Qh)qeVmgMT)^%1aQb~5 z5fq^E{gF{FX+EcbtlMQ~VS&P{V`J+i!HA&qNmm3X-{kASG*^n02MF;7;EYD`*8|; zV_*im&2BfrT3l;!@@1O|XaRH!`99+NG{Z2-V0R3BB(fhT$}ry=|?3uUz&@QG}Z$BNGGSy2QpX@H~F(_v6FiaQHiX{vG@PybzJ- zI&cQ4EyD7r@MTr0wRb(wS+mz;zbqf*z0000J@o>_mt~a1n4JLM-A&bXuhg(QzSKELay7@c}LrS0<}Mjao^4v@|gt^P2hQ zyZ5-rmyk)OVlVu;FV63td(SynRFxZPyN6F4LwQ}nf=X&G0M6ReawEV}xe|%U(yPxN zupPN9UWFt;Q21vt;rP4f)cp_0y}WE+Qq^l#xw-ZyuL1-k<@WLazZU+$aU$FjX zP8<>8hZF{&pb`|C0pdhydZn2t^|*-1rr*rO$zT%eWM~4sP*KMl;L6;%1hq;A18qaahw#@*o9+t|L?bh0_ z_VxGOHn?|ZCL7t6^_IxJ@Wy8VSSuVH=wtNh{Y=;9TY;r=<$$yH%;AH3HtoFgR+;>3 zp8L0TadPwtoB?NrjD>7u$vQ(m8_`+FA_6nDMZ6CH-Yq}=$rn5FxmS)p_E4d-kmu(= z=gBxYKUE{+gvdbTAnSz43R$~6FZSMov%=)1t8DGL2|!){@Y|<*du|>&a_E7=d?WDN z)g=lUL5x9+tb~@JiVt8!Nd$}sMNt);H8h$D)=J$0Srh`$^h)dl&KorL)D{v1#Tg|Z z3AsqfMP_xZLBT*S8*zDNj>y?b^W%HZJ$_|+_Ohh^~KK^DAKtv)D$)vp#5i25X4_QrY5ivlNt~p@r?!zx%$aHqU32a_t6H<8* z@j#NQsj5L#6%lbjCIz;r_~29bO@062Pw8#KT0k2$R)FR@KnK`V!g7xLRO_J)AZ`gt l`YtAwZ3Fae6o9b8`4=@dXE|PZi0J?T002ovPDHLkV1lE6xRL+> literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-open.png b/docs/sphinx/_static/images/stock/gtk-open.png new file mode 100644 index 0000000000000000000000000000000000000000..476185370c944b25a92e886bf92cb7bdb0880321 GIT binary patch literal 492 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 P00000NkvXXu0mjf+;`pJ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-properties.png b/docs/sphinx/_static/images/stock/gtk-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..65d22e4fbfbd62cbfdabe6bd90f4aca9afd65bcb GIT binary patch literal 794 zcmV+#1LgdQP)em{Gx9e_YNffNIp^$k zYhq%;Zr>SyF`6I#*v#123Xmj8Yo;SheRYMU+5!tpRjLc~%vZ~lDk@IQ0JE z)V{sl_paZ#c48xdZX85py(%h#=z0}JRjE`f^z`(wzx%+BOeQlvnjd}_K+KGh>sKv~ zljcaL1_m)RzPt4;W(Giedpjb6IY;6gNfOVU9{i%y2WW&LpPlHZ>#esrf8i{uigS+T zm1VxZc!lW)_bC(#^!D}wu=~vnKmT$s+Z>_3vO-(yE-KYBtE;O#d-j~!;w-gVjfej| z!1Fx{4-4cvb7Zqwa=Bdd5qyARu>?5cDB}3BV_X}#iimLh!=r>zgHowPakhx4;+bIB zR)DHfuh&5w`?~isI5a?<#5k7_Mh&K>?sM?qd#DJ8Ae%H$fUd4C@;7f#tt`;Ca~DAn z5GN6hu)#lnPcbw7FCQE^f~X>*unFMt@YVT?OioS$5Jn+S9zW&sr7P^&^A5V+T}59F*e+BUHURK^ zf0I!162RXM_-m<;zE6Hw16dy`ic?VMFcf^6ay1k9zQ4Szu8UN*nc9DN;mafZ?Qs*^&p-^sufD1 z(Bf6;Nu-BdL@YUa@UHh_E&jiF6ugAkq6AlnX=7-*rAcW?YRzu4$?kY)lQtw4#0PVE z!+gwp^BWP9+pdsV z+v4T(c>vB|yaa%96d>T!tPs}#0@?r_onBlV$`zB6xyNcceS8E7-P+L5yE8jG3}_lw z#RTC}b8SqsvuzY5D#YHLs#*_K)e?%rbR^=ts=)HoX9yvhRy%nl^xTO?;ovotT#o6f zDHazNFp^15PmJ+m@dINwuK-Z3*-bDHfEABpXEF$nr_u0@!9m`~;`}hynHV3XVwVBP zZl&n(`kDc??QJYwKQ#S*6t5T8aX^BqC`k5ixRy`RbK+!ciQOY34YO?9yv=0jx*X>0 zWv>9j^TkZo0~w>SL#uj_{Ex?~LledRksm1OfNR7L$O z;QA9OKL$f#HgkDCFMlQRO~>(;2%Phw^!)-=<^Y`_Zx$uu=;C9`F} huEbJYv<3W&{s1cy;T8ImU}69O002ovPDHLkV1i109?1Xz literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-redo-ltr.png b/docs/sphinx/_static/images/stock/gtk-redo-ltr.png new file mode 100644 index 0000000000000000000000000000000000000000..f7923083ba51d21499a743a149a4ea2924ad4bdb GIT binary patch literal 790 zcmV+x1L^#UP)%FH%IcSN{ zxm?cTJiiAH=K&GnsNde5cJrt?BO)ACfgauDjP)o*H;kb5kC-1x17HlKyVAP2VEuuR z?)Yy5fXR-tS6!vvQ*B(Zr-6{3abUWCg+NHJ1aLuUtPOyd2yP{*u&ebJ%S!WLIMQ!L z=EkO#q$VS1t)&bCA>G3TyPxm!Hdgp*gg3uL&vLpUgn$qNy5_=%p9cJy=Mi2QwcmUm zT2hkE89^(`+Pl-T7-usLRV{fH$E&qP^Ak4hWhCS}h!p70vsDrfo{rPGomgI3lEdT1 zhLp0Ab@b|YDod-c)l}3uKW;vTt<2O)N&>V?zqf$EB1lM$me#fiS$Xu~h2Hb#q@%K5`wUm|vPQ z$5+ObWhb~)($QLfQTRO#h%AoEiJ5SW6g3(_D*^yqNqRWDFrCcPi&2zaj%V+Tor&n! z?YJ4MvZd_7GVeTfHjG*=6Flc}M0!k@z UFK0KWI{*Lx07*qoM6N<$g3;4sH~;_u literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-refresh.png b/docs/sphinx/_static/images/stock/gtk-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ea8c4e51700a235c1b33b0c3be2e525f7f27d6 GIT binary patch literal 926 zcmV;P17ZA$P)3YFT(9a2m`cCM6(dNZmm6+NhQAi zd$-pZbAlQNVuw#2*P2ES?%VC_?ut1r%|SF7jY6r4<${al+eLhzzFJvWUj4y(_VZB4 zIaMyN1xZ8@J3KPDt!=~Uw~qDtBkLU0Jw~Nwv9MA>vEm`SQi0>s=(s{ehiZ0$mSoHS_r@exAxB zwzR2>&V~ z@7yEYXy#eJ<2&)(p(g_X;gRhT0DxtN2tXo&Xgo;(?q#dBz97Q;wN?xPu?UF>L_kW> zP1<>6WU)!BO++L_fKo~TNVQg1B9yk)9sr;L$iJOQC4_eL4a>))$FNpsc$T3RVKHCA z$9bKJD)6-0FMc z;i&m-p^R(UGS+Ww(R((utTUQW^BA=nxQ&*y{E28Ch;`IRE(=5uatanTdT(2cR74*-DL`$sQ&o;Tb87L6wl zXsurbQKyJ(XXcGWR3uU}!uB%}c`uVnxDB9x0bvh>an_|@#{d8T07*qoM6N<$g6jIJ Ay8r+H literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-remove.png b/docs/sphinx/_static/images/stock/gtk-remove.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed9c22105c87dbc237d00099bbde2a2ccb21451 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4JL`A=E4>QjkP<6zBkG)=p&3nA7tY+cK`Pc7pTeA`yT*{f|E zbwDu!6(yom~J}Qy|;?O!VpJK){@OS^z{ysNF3qo=T|JR-Vea!SSf~K z;)!9wisDvEjUgHumSY$?p6e418$==|u~;E9XGJ;Hc!!Fmb?zy1 zeX|oG93o*2JDnq+%acw!q*4xLWfPe;CBnWvyNKrBlC>QiPmE^4iESpCR%vN&qJB#y ztyf;4n-LT#sN1rbczi0!pI?ZUMDcP%XsR+IPyt*|kg`_sEwhMQH#*UDlP@!_(Q7Z` z;e&UWhKB1p^!N7%kf!3g-l)KF1fKB8`ZHKvdj?M^0OVzieBR;v_Y_DN92^WFMZt0X zQ9(MJL)QXmVdX~DXf5LXb&86LDV-MQTvI!`X^j+@0_2Bppew3+`pw(-JK_tLI^xBfQl!C8A|5@nUs>*8yYW4-`}xxQWpsOU;Pu5uoB{B eYGD8?%CSF$-Y&8Aj@21&oTQNKg#v z@(|ja`6mRumzId2JqA%q4?aXHT~z3yhYG2L3da6mW#BCIGL%{W#x8_7+u7bo^Vh*0!P9#c`FqYG=I3dB zJ=$OgG^fMHm)Y6>!oQnK@m}eqAmHcKz&H!VZtMU`DGn-yDNMrQ(6+E|q8G1c7nP20 zJn@aPbg6-X$Qg71A=bJSNGbo3Z?cbqd=KUNJR@U|@E&O+-a3FnUo()(dK_IRJ3D)e z!gDXk%gx2BeP(2AleYWrjS-&MN_xBeEu~4 z&?<{RKj2z;hfKu)$YceDP6C%TEyGPDvkqrr4Toxqxj#Hjln(@uh+kb~(tdgWDHdaWQ0wE+Sxk`C?1@{IY5cuWCF!H$7)s0~oq*5t7 z1s=@!GB#aH8|di-Yqzx7Y%DDoAP@);jYciVrjtsUn-U}irjR&+ ztgI|FO-o-Pkw_2r1S@~y*liYM7zUm~4`S{iIXU@6qfr8Z0Ks4o zDP{UXiS-1UuJ?cZG}p0je@!-k%jM$s%`W2c7_nH4a5#d);h?Cf2-CEnd?SsGy?vvKuzZMtAStd8D|>?h4C728Ll6 z&iQ^b--u(Av#*p=<9C*Cv6pdsVg}o`pF2va3pcNibMgDao&!a`H}+&&$aow zva%;Zk7ol22f!G^8Do%2QZAReg8hB{q*7_#EENH80F>G}HK4WbD$vIKw#vN^8;^AGvzvG9x30F~;C| z9=`84XYoss2XhYzYe#8F)eWdTHA>n;VtwT8q9`H=0xFeC0@)UEEZY(^6jEtCAeBlXMC%Eo zD56v<5r$#2h$RG#Sho^v{j1~H3FP}exqJ?_x=3H&AeBmmAP5Maa9IOgA(p#A59vsQz~S)F>LO0{00QY%xg{9<%;goh6v-I$)5DZYO5>O~L0^a2q9 zpc5!Tpada=VYfHNP^;I-<#ODexp&j|{oT#N#(e-AKaPknzj{1y{^R@;e*FB-&fYfa z9HDa~*4od&WWvBm7wF{u^Jr{#@rd@nkh!_1T(nyl5yo%(9DXcL3=$Xe`j;sF zlz)srJ{jeG1TsJn*X-gEp7BuhYJ)U_M2#3EmJhvyegY8#F^hp$7)oH0`IQFO5tu#) zn^u^np$75YopY!vP91s~Bi;X#FtFC1H=E6|Y&M(R?ebMTyl6~Ssn#lZo;{BYL}cm1 l!Tz=1Ie~3$%NSV(_zy*<$(UR9b$tK;002ovPDHLkV1mGN^i=== literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-select-color.png b/docs/sphinx/_static/images/stock/gtk-select-color.png new file mode 100644 index 0000000000000000000000000000000000000000..2c764b374ab408fcb8e0981100ffdf2ebf5a5277 GIT binary patch literal 735 zcmV<50wDc~P)K%FHB0x~G17BR7Ek-1KzUOWk?9U5?v|53aD$qPqGfsi z6)1>C(FWthj$R}E<~G3s^KVlKxqp9)u`t32?#%z9Skpk-czhv{Hs8OG%i2h;2!~AJ z(KYR>VdevqM)(c{BH&cJ7Y(mPNvs*KPlH}S!RUk}^k}b^{xw4)-=w~D2bXSkPA)hI zg~7kd704}WV)#`bpL?$|Iw4U`nvA2UZ0z9SmBZ{ibC1-mWAt1soDsTlJu3s5deehHY? zDc7P=gt;=v+|&?d6$eSazmL##rurYC9Gm33IQ}&el(bPw+J=A=A9|m)E9riw;td|G zXe~pp+gZE&ESbbd>~z9?4(XtzO^!c8YOGJ`n)X~Qw?wK1?K#0GD?*$0lvbV0GYiT< zX!Eue(_{S%bYDr$*~zWT3bPv~2zX1%`<+%Md R9~J-r002ovPDHLkV1k6SRWbko literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-select-font.png b/docs/sphinx/_static/images/stock/gtk-select-font.png new file mode 100644 index 0000000000000000000000000000000000000000..2514b61671097fc1733e9e0d1802b4497ffd4f6f GIT binary patch literal 706 zcmV;z0zLhSP)8##_pxzqMV$ml8uOA&1uL?4n+ zi#9<*RM-d6Mz8^qplC6FLoM1AqC}q)NN;f){Eu5%k-nqBMj4z5V?84<9 zE}ZB5&X03sU@+NeA|@3SgJwY3-ti`4(m^rkF(zVCogGIK@rI^t<^mv@x#`5n$cvN- zia~R{p^5C*&jhZ75&;neK}6`ic8mJDIxb(jfX9RPXl;l$G%-9p)NIydJMYj+BO-_> zL_iR-UlveGqqW9+@ZRB^3ze9)NGXj{s*+r;9vULTtJmX9Ois~~I7nM-OW2EA3$)VZ zN|kEmx6IFGvkX6bNq#lYz56L1JbV-a)+taG6|zAEKqM03?wtXga~$tFLwf4XRsdar zs7fnkBLQk+HCSu$-cuc|VrAtg-usP!d_GTqa*#qXpgI=i#Id8aBoY8D=W;xLGKBMv z?>|=P>}U_wg@9-@O7eCev1pXl{4aWM+@$r;VF32l*E2dc&U9v$#&`p#yH0Ly!CK4H zq36tG=2*?Ivb>aIX?dB+(GdWgbCp}7M@I$LYgg+ig{A3xmDuoq}Q0000007*qoM6N<$f)E`)(EtDd literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-sort-ascending.png b/docs/sphinx/_static/images/stock/gtk-sort-ascending.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8fd257ffc2ba8925372a40065b0ed05ea48d43 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)3lay$l_uzjxXKMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`!yC;0R@B9X&>UY{vW&JZ$VU<~Fn#$fTvQeVB2V;jHMgXq-H-BBRdHJ%G#CvPpWdqNY)hI^JnVea4DdGgn6wWnFT327`u31sH{{IA) zjjPvsHr=>-y4ZVv+ZE2Kj&HK+Z@6f-+UMN!Ej`0%f_>|Z--Wa5|1_~!^yoj@ zarUDP|5A~+d5eppr?n}0J2Sc*)hIf%Sg|r)FK|tRq(Ew>Mfs`LyB}W9W<0X|P+rP= b>m5wdjZxe(`{ud>eaYbI>gTe~DWM4fRQi4A literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-sort-descending.png b/docs/sphinx/_static/images/stock/gtk-sort-descending.png new file mode 100644 index 0000000000000000000000000000000000000000..a8aa70584eb0b2c005060c729487d035faddf1e3 GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)3lay$l_uzjxXKMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`!yC;0YzEMpqpAip&Onqjv*GO_fAseJ7gfy8b3Rh z;p=U-&5x$kNH&;xZhmY8lZD(hG*SqNtkB` ZbDM3f`~mF_cc32`JYD@<);T3K0RYRsehUBq literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-spell-check.png b/docs/sphinx/_static/images/stock/gtk-spell-check.png new file mode 100644 index 0000000000000000000000000000000000000000..32dcc2e63fc7af1d597b1b115884e3255bdad645 GIT binary patch literal 641 zcmV-{0)G98P)YqdsgC<=NHB#7b!-hSX?nL`{>|B=MP5r% z5YKWy&iVh&Irko+wdQ}!sBL`yKr1j0IDyOYSTt zon!;RGBD=z2X@s13<6o;9&p^}4|F!Dx(xj7TUupy0lmOu;1M8zi))0VzzN_T;0T6Y zA{chbS_K2vdJq@}s&(2pV6_==wJ(iJhxjBN;;CT+inZ~-_aor;b# zbH_HdxHta%QILieLoQdNBg zpl$`hu&YT(X4<#5?(E)kSR_AuEPh?g7$=XObw*RqD*5@+^U0yoxrP7>vQJ16^XzrI zdpb_zSl+;_`I5w&&qby5{z%A7!RkR;Ws#7X)JmVv&J>D?#aDcj?@6b=lz@qvcwK-6 zd7+iQkxt|b>4hY}zLzUX>09=gbpZfRE}3_$W&JRd_^r@-BoZ?7c7MZPu$xl)Dl79p bw$}FtfH}mK+b+DX00000NkvXXu0mjf1zsNn literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-stop.png b/docs/sphinx/_static/images/stock/gtk-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..d88fed703b231867ec9e0471e0e9c246f97e30a5 GIT binary patch literal 769 zcmV+c1OEJpP)*}ALAz^QHvmp!WL3$R3Pe9 zNI{7$`cEo%xv`JYS_GA0CB;A`q0pkzO0!mB)GABJ+hC$I-Wi?iz4x>zKPKJuEYCU5 zkC*p6kC0NbqTXuJBw#>-#wHTrNjQFPLJqB-tpIwfMN=qj#OtH&rd1Hx%ujl5hLLCY zGj4Y2)CxpMDRa$+1sMmSDmiB92VmxtUP|Xc#GPFA$ry{!(mddK9HK2q~gqB z)V%N?v+FS(AI8`kp|J4)nQWHfXZJF0cIlKNV4%LG-L!O_)Qfk_f0`oi*a@Z|zQj*C z$V`Um_%M3yK{ECNb3<>ibe;N^c2mHBB0;kXBgh$>)WkQeXq2MPPOQ^y{Cx5j`{^j5 zLq~}8^k5!4f%9bwnfQTK7(s%zwr$_1yrl;F>0{ zt$}qvw+axRi>5<)<8JH+eGmi`bX)`=+1*X@>J=)R_o5jpcrNl^0Lv}_s`ODp8vd`D z)vI9U7pf6L;IF>hFo9flk)DtJ`YU?FQHoBp%19sN1#%5a6X}6Iy=Nc8t%{IOF5YU+QGx z)=esFD?w4P`+8w{nZ>a&!i5H6+YX%B1Ohy@wS@OSCcm64-?>lUQdLIqeG+GQl*;|3 zs38SKNUV}P=AVxe)?FekbvTB}$Y6iQ_r2EKC^xs6`HN|S&mU3r+$aZLfUL?XTvMX3b4=I`i zAxZ;>L6aZ^K@%M`yF?K+h(-;?N1l6Cinxs;qAVIj10Qp*4X)>$-Qe7F6fLkd*^Bk~ z*0?)TROD@`p zI@?-1`1$JxQ4*sfAc7!>>=N?c7eh#;bffFNnsgU91N zc%P6YNzTM&o~og$jplUv-Fx=|cr-nM&sccH`y2qx98*KpFg47KwY3elw|}#-zRBA9 zW**P#4gjcXqbNPY@)E^!J#=@UW-+Yf%~}300O=L9v4^m-Lb11(p0j5N%gcxeW|r4w z=JqmBHTo`G&XczWhjYK!pT;W-GwhYiJ^*ETahB1s30j&@a${hC1kd=xDZn!}`hX;f z@p}Z31BeK!!d9)u`|1Z)-oE3>vloq*NhfaAY8*dyG}XgFfb`_k3Ye2RaWGlw$=9LZy=-@g(BK~*NF q#@mA+DAnur|N72B5LD~+`p6#-{i<^UWHZ|U0000Fq6m=MepWp1v?6KP}-O}A2sM}DQhBl>Y3z&Mm z@X~mtge#($cnpa_g~Y@g4Hs%m#Dow*lwgz_!-Y3C@dSn1R4WT@krK7-_P9;k-R{iJ z?(EF`ymDQ?Kj8hIym?+BrKI-y2lpp{Bf((cO~3B1k3_*0xqso%iwUaB$^X!Y;2ItX4%ef<2o*n3?HCeDj}s*fBXIRQ`Gx|)}L|bbg1N#OD1w+^so7L4d6raGdEDS}#G>Zt3N)3UtT`*W$xXtAEZxId$NhFdq zHpXdc+DT_Bg*Fun8gx?VX(EeMLxfc zQ7B-T2Eky6={vLdRCT;s;>(8u&xAwr^3fL_;eLT z7cwj^uTU_Gp5r)sg_M#vj`*I_b@lX%uRa!PZ{NYnat_n9+1xZ4`EHh(xe&8!9cY?{ zkS<-jJ4sL7ElVjA>WSyIwSs7wQ}m+5rpPpi#Y4+S(3>F z(|`O)rBXq4J?VNLa(UHaGw0!Y9*QFHDT0Q2op@t_Lx=C@;-$M-!3VKzn_wVNeW1L5 z!8v7`rIVMxyl#4Kg=jl1(+|#9E`L)l_ zU87`KocVZ!v!DFH`7>9UnO>nT8o=`^ARQVSVrZ&{lv1JAgAXry7p5}FsZY<2q6op0 zhrglc;0eCHlBQB|QB{>#eT0sV4(8?;5rRy5Vmx1~GMUY$ryWnf)|0rG932~TQ>ooP ze<;R!wt(k(tgdf(f6c9#t7}=y^}J{Qx5k<|`}gdee|<66QimEn*x!;K4*GH`z}Vjd kA6d5cBk*&2VtgCmA0MTHx`fpq6#xJL07*qoM6N<$f;4Q(c>n+a literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-underline.png b/docs/sphinx/_static/images/stock/gtk-underline.png new file mode 100644 index 0000000000000000000000000000000000000000..35bcc8127f8980c572f1bfa7467cfdf51bcf1223 GIT binary patch literal 645 zcmV;00($+4P)3y#ZPZF77QtGPkgPAVXf#hB2!bgr zY=oc)>BY*rK|ExGGBwqERfw!o<{W1n=IxpG9(SqJ|KsnPKM4 z;S4h)!y`j&F6WAIJ#GhtjhS~jSBdNKpmRA_?Ct3*w6^3o*b9KnyqhkBVX5fidfeXH zlIP3U&%{Xs6#)?hL1aac_a2W2?=f?(}sj zya(?Sk|fELXd0;+W`>!=%$S>7U~%y$^YaUQoBN*SQ=j#vfvGK#EE9!cnVznr6bc6k zC(2nq#r;E|s>>in5W?~l-QArW={QU{@e~os>b5q4p{l4F)#_WeZ`;bw=4KA;%kwLW zs8**jvkbSUf^>xOCn233hp5-;wrt*nUv&@}fry|ggcD_UG&OPm-knTpk|gw>Jx3T$(tqak(mnh=!qV=QhvOxV zAM0J&iaDIiaq8p=9*jNCaBC<4LAX776Ej0pFjYhqpCnwmIKYL0^E4U_WYxNWC^uQfp7!724Rzr$yilQ!;PNPH$4CZ0PDXTmDfnys2*u_BMB)bz12saCmhHo`v8Xf(zK?4dgcB<@I>PDrBM& z!EssBWt4=6(L^aiOV`mlU8WfU%6z%vjI}zUIK+|Ph2pmhTF3)|Ne^F#ef)Hs7VYk@j zOm}K^?#}YebKB|g!R6_}T5KuLZ9Lp|@COgiTpqPApSGNuE?K2EHOdw{gXaUqT*i(? zLeqld~!Tkt%O5E2L-d_g&?;Dz#q{NK`RS)oMWi O0000!dXFO!HCT0(HW*3Ipo#%VscV=XJ zXKT^sY&RN46+pOI^EPMu(J*RSo3q`A50V)=$^0g&%!->SXdr>>2LQKeKYb9McT ztLxtg!sr?Gv}DrpP$(2A70aBQe5ly5Z08+w`8h-c5k(RR0;6>v@4;JqiGzn#vd0HcON;SMT_XkuW3;(cPmd7O8%098fRpgOi793LNLCb+Wl zBnw~?$mkUj8qe1L$-v{>R0h)uPCxdj*B&9Ns0i;44>A?3u0EXwoSk2=yMMrPy_Q;e z-dvx^z~P+7xtKUh!Cv=}D2lkhR0H7ammYijyO|0ajkQ_8M!Q94^A(>@-(!rysNrS1 zgNTfFz&Te8s@PMcqmg|oveiu3$ zn;12JE5{K4YBY_;20_rj{Bd5Lzq^p>7r+{eH5Ry)&RzbzAP9oKZ0~F>20_pb!|=bZ ga}WgmFbtc206HGBp(xo<)&Kwi07*qoM6N<$g5DVaH2?qr literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/stock/gtk-yes.png b/docs/sphinx/_static/images/stock/gtk-yes.png new file mode 100644 index 0000000000000000000000000000000000000000..e562366386ccdf43bf9e9fc8d2042c6334778c8d GIT binary patch literal 1044 zcmV+v1nc{WP)OAbtdQ?i{Qf_z#d1I3$q}5(%*ggxHBgkPrS`?}ztuc4xXc%&u_~a-*d> zb@kI#?_1rXs{EhJy=dd@D{=|Ul6AVMsayaMt7~Z@H^8sny{fnV>zq7W;knPH6eY4U zR+#v7{_KLAoILF&Cr$xSt{qS=?j}!AGT$Qb=GU^1&!x zJ&M90Pf@!4CSEcG*4pi?HaKo1ZU4iL4AcW@tbmH+p$)VK#braEHJ}H2W3WX@yo=rQ>UK ze2rFGqnT7`_9_@-d3bP#xrN!NkQ=?6nRx87S(=`i4i39p^l1_65ve*rK@8=d5sZP1nE9d}yeNX=#L(9!rSaDo&Z=XO z?@b?T1&qNu!8$=~1{4u=K=dj2R7tHOMll{d{o$Ph4Xv!z>-9^ysT?seHq4;L3C3nX z0QH)|5)cC-5NV$JehsXw9lM++dZSu7>PKM?8yIXLxKIcpA&3k??%!~c!G$Kvb3zp6 zs8t&MG|?L;=FqS1JgOv)h`k^Z0LrS`I|&>ICP!Xj=FFmenJ?OlQwup;d^xnm z(*XcS`+bhKdwy@do3^Uy+T-i`Rp)@efikfD6mS470+T@L)pvM*C^>_Rg>T4Ag-GU{6((r&>O_M8pF56A=yOKLNUfXali61NaAKo62^xM@5$PwB8rHq-?CZUEswf!zWB4nN}zogJOl zK}UN#09boAn;i~^gHlT6P&nc%1{ULq)iuU);M}x;LIqa0Z8qdKm=Hp604v47)ZF|+ zoO6b>k@~9w3y|!X`8fMc2r;RtiZwhW*wA>eqN4n1?EZiogiwdUC z{Q3R6x6w^=ke|dd0C%dZeW#+mT{fT3Tj?lsP?lq2W_IrTwHvo{X(RK&DVH{7jExn> z`3X%`rY)e5P&m?>|L3qQ%W^iG#Emr7k18G4tPmg-|*HK>H0UHY&EeiVmLu O0000beo~aE3kr4b{{_Mel!G2u3 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 WBF=3iaL&X400006GcvX@CeO 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 H-jlxoWvX?{ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/checklistbox.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/checklistbox.png new file mode 100644 index 0000000000000000000000000000000000000000..9d008c3272b22620fc8f1a1ba3278785ff3368e6 GIT binary patch literal 2931 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/collapsiblepane.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/collapsiblepane.png new file mode 100644 index 0000000000000000000000000000000000000000..950f6cb1a95b734d55d61fc73eca908200f6ca72 GIT binary patch literal 7031 zcmd6scT`i~md8<4q^n4WAR@g=l`bM6U1|tO?@dZ5fl!p*gVLmhPC$^}tMn3zw9rea zQbP+}7=H8S&6=6_=KV2$&0Xu>^Uq!PoPE#PpZ(o?hrd@-ASR$8z`?;GR($tX^L8A* zy_+6BxP2~)T=3lv_rPxywIAMIJ`XLzaBygO6yM5dL(+EVy*_ATuX_$AaVm%c1;g$} zaC(v77xe6_F0o2Usdp2a90*n-6sr9YKKg-^yS6ITULR!TJt(O9r?5WvbHw`B#!pLS z#Nug-3?2C-xO9}`=MoICBM1?A=-jW>+H3e6@C_ql&PVk$h>fMzbuVS~V@FPVeiiMr z&K0G0rXZy!07mVv`wz3e1}QvDcp>qo;05~e8)kgiBM!+FwBnS~hF$t}igVAl!eGvv z@WD^XpZmEkE@KuAl3Mu9Mlk3PkEk<_sLmZcV9q1bF@qL6vP?ScJEvx38Cvc*`(~HaUM9-(d5DXzT$Q z^!>0F%*Z(SCnG08d}>>D2J2WgeABMr)V5>avgciIGflqXI^wkP(Ndv8Y3bXQmJC-m zo*T_VD)kDpcVLcf>~G2KG4pkRS!G1yX=hx1ClGFSpAGBe@nJvTK9XQ6#qe1;Zk+dH z*B`V+>V_*bg*tAHH0?!kq+cxx=You>g>7&@GPN*C@Q0)(k@ENWv$nMv)Fne>SmnyL zER-o2T8FS<*d`i!B}`!`-(4zFejy0cf|lozy2aBZzspY#tc9N>6220ABd_PY>fiDm1Q{us8T|-@=F*$*S zk6V(**hP`A&iM{ko~1y=(5usFnXu61DsIFFRqC`I{_s|h&&ncWzjPh@eu*-CD+yso z7th%sX)6_eHB^w`P0k#Dqf_bf-B#UZ39a-_O*9p?Or4Pkpow8#@Lk5wx`6kXeR4>5 z@l;_HD~y#=wW0&Y%^zT$d!fj-N|Lp>QnTJFZF`EB(2bX6I@}Ui?_+PtkJTaIeR;v~ zdYx%tW=*K?0?i4arH+<2wSPj`>S8j-Wl=QRh`8uI+L)K`B$P83*P_!Ey=7}9c*N(v zdF(y+N5SP-{slhhb^d40Zr9p`-6c@y-PC8rQCs^|L?P|gVyM+~8sPcn%||m~DGzn@ zk7&l{9Nd^6RlQoBHq9fmpaQ{jzOhj59=|gYx@M}rL4yZoOcbNvo9EK< z=`5&ve)Z`)Q_Cm|wu~#tCjpTXu!A3cO*APw_A%RvybuQGO^p1l;~gRlq({oROc00) z@D9DD!g~|4paczaKxEsUGHmYHnc9_r3tweT1~U&gaYwx&7mZ}Nui_^ZY+?5ai2vhb zyc|u%XtAH!<;w3ICQ}>q3D-ENb1i0;et$@;(5KZb-P=IAFw${D7QeW{?~^6DvWX>( z|CZ%SuX}2KIk`V}HylcJx=vREZ&0+;6}G{VleyzeVDkRdjpD(ubq@&Fmb&k4u%ng7 zuU988QfB55zE6~o`mY1KRw$hrbp`=X)dQY{B6^o_GTW-xh=d32e`b~cDA?On98_a? zj9!fN*2kf|E8B|pg<&=gX9-JZe9so_`L|_pUCOnK!CLtP4(gpy)dJ0|y9ov{W=_#Y z<0IsH@*B#FGmX?wmV$vlfO^5FnJ7*LGKXA@n z2x2&U&KJebd$t71dV;<5S9I9^EXemmr83q%YO*xjfSb4JZb$_}P1?uZYKFZyU_G2B zB)u$Q=uYHAf?0c&{Nl~Rh4iabwsiP|5yAeLW15a{%b=1 zzkOxY#=$|kk@$^7;%fiDWc>fhf^HK&w!Ha=i~t4Kwf~3}|LQw`4|T^+d_NJ^7EEo<;fGx0+fYu2wWN$vd%e; z!D}d8F(8S>RVQHlXgp^U$mrZlphg33^-GFAn6t`vFH(?e1~j)ww9qeFZ%3<)?F9XB zD;fP7n;dAXG4EDgG+xI*c%$;7_Ffm{E4gfn7N}GK1IhphoIXm`$@H~NI^X=ma}TmL zvduYChe6OqAcs;7S1;P_B(C!%01}StqA05i9pJ86Sf)I*;hcUTi#Y9d6JI%nb z20&W~{L6r!J-hYTohZ7LnbcpuZ^{^##U^9?Wg_&2M`Z|p&nt_t5DTta?)KZgPk7fi{T)@0^MA&*?OwuIT^$0RG_#plTgiUQ0<@}tQ?ecEXX^Gh?ScrYYBr-jclwJW(i^)d-q2;>e zUea^PK$=xwO9Ew8ziUjItv2p=t$6=y2dG&US(bKK4gY*^kVb~MC(T`}9aKM(C}IW6 zbho4@DXHFkDf%tq5|z5eYv*gK6X8C5%fNvLT_$`_TfTNd;jZ^i4p%ak4x*mJV`wvE z5Piv(#-C>ZCtk`k(6i-_5@C#F&mzAyXYjB8VRj&dv2c4bswzJLH>%a}K;j2)fL~~! z3Of~JeRq2WoxAj6{3+QMZvzQ{RyDtv0lQH`J>eb>+pcUH|^J=TyV$0n4C;H5p(vQtZk%2U@S1@O(E5q6Q1mGMF4eeX zdT`s(v8~-?V2=wXyHOSx=tZ%ldctk2Xr=+)vv&+6yI~ z7PF*J;=hy5>uZm(diROasM^T1+V8HtY)Uq+^T+=9C~+*qbm!0c77QPA?lq3{|8H9x8M!y3H#vn-`Fa# zX;HR-YwnH)&9r4)8<_PnSj4IhBwn9+>UDQTX*zs^?C2RnE>yN(ckU#lA^&*mUx>EA z$z?(}eG7E+wNqID0=kp{!xaqv_mw!9(-KmV``vS%wgx((IjIbi2sM`XJG;|GutbVTsz2i;+gd=gQsO%O=_! zg&KHzf*$zcyWUzr!dJQ*Aea`{#TJf+Ej3l?p7kb_;fcqjsvHTc|Ao8S267~$;xgh( zl>zIy@Qe6AigTBrq`+K%?NdPmcXeaI=K$Sz?YN%^KW8oOxAdGIm+S@uccpwVLdn>y z&viIclNP@z%?~bWD61tom*!o$6t=KErN3mH^=Z`Rf2u5|6FDtKTmM+_*%&1;<~}uj zok5-W;1Pwk#XQA~;p%IdZKlQVesg^|?V3#gDHkR@W=ZJrSAKmd8~xaAUaFXblOjmK zwrdqnP;@1({?R#vWKU~G)oX{_u!Z6$2d+iJe2uI^JH-ABr-EEAADXs6BlXj+bV=81 ztuN2Qz!Ii2$BLo{$h9+#S8nZFC__3W%eMA=6BOnMw@F}gM`2Kt3AER0qhomMFL7t; zQp`<^2T$HSl?!Xpm5w`)oCYAB-ITWZPh+Jd`s6fgbz5SfF9n26*!UuL7GdTs|2aE$ zk_(I>&$S;;X`L}An3A8?}6uP6Aiop(|R=G=or8^UG+rv8yx3 z;{&JRopYzr!WI#!iRJ_79&sYQ`m>ep+GG3CKz5wCZtrW%3ZWq)5Tgq-7+0dZJ&~2l%E&-){6!UrN^|SiUQ^% za_LyW` zQ6?)<^o1*SZouOd6Opd0LjLp-dZ-h1)b9A`_7Py*x%YXxzMGflBm0;u7ic>3s?kup z|6BidkUK<>MseFU?&4@|d zEPD<6KHShtpVYQvnOfQvwer9kz9(0<@PL+S$_7W3aXT3bdt;PpfI^Y0JJL}SCr|xW zg~<={rLhXH#JImL2Vr@}Y#fxNzNqTw6Q2x~)Y%|oDZJvHtcNzrTB>nK*Mv;;O3TXNk{sIns;XNJMKY?O01G6yr^NL zwl(d9%dFSusQ&M@3-USa=c{wEo-9@9t5ABIkxU+LZ?zTY37&B`VfPFb%F4OP`Z0P; zLgAZ@Huri8>YvCvJo%?p*T-I6$rF-WW0^+&ej*fz;`Uo(bQL;ABB}BXhWBf*HYig; zyzd@)Atgi}b|^kw;wI>x8s=|_#ms!5w9Qgq2V|kOC zd}X*gqaAwUV4-d+Wyp-8`MlwygkmuX8lhIcI?8ZyswoIns7p5b8zx!v2N7xY{h?}` zm4-CW*_d^uhQzHKztnSc+AQeQB^uv!0$uJkCDLR$TX{GjOS8d{GYnws7EAl4JW=&I)qxy>8)f^|X=w_uYpz7ldGW_bS>&U{5Hzhar$nyp}OsiHmnL_Rk(I<=m?Rh78n z42z(IUselb6a;?l55{!=8d3lud)z;|Dhm`$_Yazix5)MgUGnr1@~2U5 zbPR^XUS1apUr`}4*+9A7bm+>T9Zj=f62vIrwIM9_tFhOz$Ox)hiVT6xho^3i$pg2^ z*8yt1=ed1L{iNoQmWE9-(8@yWH6iR##-L$_pOPk3q|s4Mv3y{6;R9Z^%jj>#cd_|~ ztCt$X8iR^~@;N!WwV)l5rzazD)zL*->d6wZAsS*DRcelEny!5NWKZ4{*Px{o_iuC` z#TuwL)|W9tx?LhB2$8nOcNVFti6+F z>O{pfN_3$Cl!JNE%GWjA)W2{%X^ClQJ!y#a-sov+WOT_n$lm_-MC?ZT5{b6wc;-mm z^36>4-8BmT#W?Z~r!fM~4U#S?65&_zM|sHKBWH5g3^%zH=1?xUGIQZ2TFY}d?u-%{ zBVvv|xHlR#IdwSWE=5)KX>9ZLs8lzxfqFu+LR~_N{2W?TFy<`8+|&0tYq|diN*1{j zYorj9;>L~g_KLCV^Ov4}1PX|j-qfB9>+{Wfn#BHmil_IR<*y^Ad7pMUo2w0sugN)s zm;z&B&cmd?;;fijHBol^uVWE*-L^I9MQ>oj@TrtVnH~E1aD1TmLC3_4uO%OIC)esI(VBWd#W)E=w+t8a@Xx6JIxtgFBI;Fxrmk;(y&GHSgsEa#TX%~ zob5{;Vzizz+m;@B%c-xeO{XU0BrPWp$-OjI8#P+P_PfX1vW^~FAwtwO;2!RwygOaEeUv>mtW(TF_+o> z>~#(rJ&bz_dBoq~mxKhbI2H!+IFap75_XmyV0qw8sWjZv4m<&hxrE1oZJ7m)hf|4N zNTC}6pgAVU&_fJ_Gc=ft-F@5dM62GDQZfaVK!y<~9cC0Ka~@G7eVw}%q#37)vU2`S zbgq8AVd$N;IF%pUv7Q2UK%p?%$r7>*cWYA|(A*sMv1GMDqb*Bg}37EtO>?zR;u#!Fvn+9POH9a{!}hO>%B{i z?1CgLAUoID@+PSXT`H@Uwp;GTlW;}{sRR5h{qD$4`6?h!T97RJ0|+ANZK`ZfK z?HfW*Z#1u8XCw!tZNDtj zdQKQXStiXN9N&AhGUmDN%)@NmazY()s%E`cMty}D;2!0VntN6Ah4ewxYVAD%EXQpk zJhfB+?wXiRj7LJxd{*y~kbA_LZp)+&m6=^&;xRJ>q)<|Q4;SmnYDBRD~7q$SZ-^++&tH9jPd#E;K+`epyTW(O0qMD zRo0!xFK_yzn|=6~1)dnuz5Y}g>+iaU<0RgDtWJi zuf^YpH_f`Yi6i4EXLPcNEDL6??@LrPZ5}!~?eO#LFP_$FNxRWSr{8gu?H;yo&p&Nh z&rl&&uTCEx>WZG0UZ$R-OE384&Cj}Zn)g}YHAsJOegMyC`?sb>WQ`dRrE?LRu~Cy< zocEW_&Ic>lhSo!UA#VLrNsGzK_@D@`HNN@R&Z|;!8$8ajK8#;WZOd==n(X_QiexLzVz#itqES94wZO5y13UTdATSu_00Op|Jw_tGdd7(e*Z+ z`CE(0LRdnT=KiXr(A$Uhx>Fs}ui>*SL2`-kS*vPwBJyRUKFQnm(|;=|UiiDpe}~i| TWe#sUX*h~1vtLG?q4! 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 V#a?mMht_5RdfLWXlgKAWXVT)FC0l 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/listbox.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/listbox.png new file mode 100644 index 0000000000000000000000000000000000000000..ff8edfddd5dfd9531446d3914092715c471e5124 GIT binary patch literal 1982 zcmb7FX*AS}8~!2LvXr$2$x<0%NQs<#6vmpNv5lpP+%awpBZ{$PH;ii;%aocGPS9fRHsK}^ zXWrw4ht$jvHkqpMQv`z2P@x72CtC3!LW^a(mQLT`#*v8Q8z~LLK2Ha%+^Fh7fV9E& z146}m&=5b4*(SdazAZ53{xN}@Gm05OE9@7`E8|ho{p?A0!1P=3N{0XA%=_=|@I?uc zvlU?K;HTE!V|4+VXU{sEkukYptrOSJ77`S6I}az{-aK;z7eOX_;XJg30I`BR%>t7M zEOyJovsvnus}`YK3pVKU&j4s{=VMKrsnd~ovf4pZF1%sD?#yV|*kIc_yg|yOEgHJ! zfhy^pZSCERK1WLNLszKJZ)#ySE}}2NMU)4sL<8&E8YoDj*QE4eJ;oaqLG^FT zX_qED9EpXb?3K4>)~~Xbeb1T57GuDzB6s>%L@pT`pLcf2nU0=$r+f-OarOY>Q^vOCpU70<9KuT%Pb27Gjm$E=>maT5D23VXQt_w%>u-sk( zi5`+n|LNo7^Yg=?sHO}Jz1=Sn%$JAddbIVT^R;;v=ipLwbH%VurElNut(00Q5wuap z$8Wv$cw_Np?GZi8V8Sf#oy_WM5|(ZYr2CVYs%s><>({(Y<2UGw792R=h4PSGzgFS{ z9nW4vHPF$^`nUbYY?TwW&XsZJpMnLXh=Gcecfg3=Ev$5S@R z>em+`JKwH#G}b7U2H8XUgNG)+jVL1Qj<2GUYg+=wcKnzl3N5YbgIhM)j;V`Ai;#Q} zZtA3t!_kL5_W|8506|my%zX)S8+F#WK&CwD=6x1vDg?&jh~15f*~@~t2d~aIEC(Ck zA^32=Xv-n~7_Q2)Cdtam)*EyU)>1jS30DNV#-PMC(RELE|4#Aw2?*BC#A7@K+{Ied zdess%T1De^Xpt27tc!(`ri3{8|+XYT1PLNdPdv<*z&PI^u2G z9{xq2%f*{`@P#Fcb(!FP!UV=~ip-5db_Iz+k_cUeCytegMz;<#%Soh<{UBo!mFlHI zFo!_)TC$ji|2Wji>d-Im|DSb#5znF9YV1YBq}t*Nk#jhvmjY2Cmr{Be|4KtYj@C*K zNM>l(E(=z5#YB5um~}!XNYT(;qw>S7Jatcg_24X~gmAE+ScVMpMGX zTu>DBcSD($xyFyq?(K&Cui{5#SMBO{%^ELbbVqUWy2v?l{x?alAprn5y-{P}&@tr^ zS<%Z5vFLnJXf*tevDZ8{o1qQDcEi#F*G`BuRg!JPqwd}x%D0DSLMNI8YQ|Ph$N?v5 zJc-ROv0rEzy&8@2bpx7yp$dk>$j^DzNfirOm+Hhq;&)DXI-m}}-c)Yjb|mGPcUPcc z$L)6LrDaP#Y7L4#eVnB`=IYoSvz{ppM2%}NGKf7B>bBdS=8O+rWxo#(VD*vTCzg1C zc2HDGB&+ioQ&b%NRzMsbAoff3{V4wTbL8y6PJzdi4{l5r z=}AhLRkI@31AQ$AzZU$p(};EZAoRl!+eKMt>JV^iBl7{{-NRgzYO`lyp^ymcwyQKW zZ0BIv4X;!DbF)?3v)eaTwy&)(*$0&oW5?IzmUxzbX2YVZ?|#)yX8(nk=R4Rj(Itd* zw!>XAKC22+8EDw`ZPL}1WgeqT^oXTVxho&Pe4h=BnoGs+FMGaivRwoQz5d#O9Kp|j z7td(5z2_bh7V5}TWh{{RwV(NhA;w~No9C0=i$(sE0ROIxR)x&kc4UKxwp`lL%JRCC zgl=vm)x6C2lkkS}x95+iVtW37sFSb*|NE!DDmzucgOjVEX8R8rurj}9M!ABB`x|?@ B$)o@P literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/notebook.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..47af972109066625438680e52abeb6a5ae1f328b GIT binary patch literal 6535 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/radiobutton.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/radiobutton.png new file mode 100644 index 0000000000000000000000000000000000000000..32a2ffb3fd772c10e41a0a1e9e5698cc6b010824 GIT binary patch literal 2110 zcmaKuXHXMr7KSqdp@NP+WF@?B3nEbI;5<@4PeT%=eu?&zvMH3!@W!VtfDq-~__h z(B??}j?#t)cvKNPz4J%H8E$~E<2ecf4>}P5;NC_U-mr@*SSg6MvSUbe>0xne_o9S5 z>L5Ijw@_yv@V2UxJdMVgva5eam+qZUOFn2t_>?OA6zJ|HrH|@TDW;1~{0I59{ip__I@^%4Bqk zsHu$%Fz(R3e;t`Z>#ulWZ(Flo{o>VxsBX}?++01cVOjr%i3xBNQ`v5!vPmzU_8JYz z==nlh&3-jsx5jb}ZhKr{g1o{K8l_s8U66)k4J8SrldqAd+sl$3rd)`gvokS)j45=# zYb?|@vlL6LtTgPj@NGLQ&iH)&I|485&eAHpd`>}08Umr*Zzx%ws!#EE&Lv7}W*tev z(<=F^kqVX{`n?#dF<&EIMpcaU%u6cC1`Jt~Jr4e%o~;}jHlQ~1Bzd>K-gC;Uxffhr zF5^$kU1;No!bVH$6sE-=7cQ;*4PctptREVxIs^rJBGhc%tyzsuMiSAEtI|5b$KRiq zj1>bBLp$W|Hu`c^lz32>L9b9WXT84^nzm=s&odGd3!mMQwQvYe)h zuD&#lc|cqGbouD7iuIm6E71FN<@osc95eZ+4vNX8#R{5NT{ky22ERqfbzC=dZtM%E zkEMf(L=7DF3%l4MQW;u|*42K)7B}#%!P>D&rdij8W}0UN=d@E{7klo`17dOn%}V#aZ;@+>>rIdGhY7AsYy7u{+@k5VTTvlxjkQp z>{2-6zX;G-F2L?Et!)Pj1DY_n04DF-xs|y_`eI-3qv}^$4PS|0xeqv+PIBd*UXYCF z-t=3MZjQ8g{?6YT5(J%?rY{?DZtn5*2U)yxZ*P1n%vVm0QP=cbJN8}`qV9bY$K3=mNMRso0gQp|C z-C{D^5}puj7-RO8RnHQ11cFD>qcXh_Ce-J{o!et))zs8#T&mm(y*0$>E>+aWkHdF9 z<9ZcuIgw9a7v5A?_4x+sZ`sm#@(Y&?&pzJu?FWwebLu-OYg@PDgQed~y62EfvZZ!N zUA>jxC-cL7VQ?exzMPt7ZK`Hb{YD$tMWyH~YnMFQN{|?C*gz?2O3dq}k9zp%w74cm z%i^NZI1<&CP$%ZHrGq)~`f9qlch-ek7^pim0;eF{l01T}FUVm9p%WV${9V zslyNvT6rw-XHUMXdH#b7AbrcQAVEc@z(#@3DcVQvTLSrJ`;Hjylax009S5%z3JU*4 z`dpC5ZK!DdeqdH*j5mH60L+Q8K)iLGfd&_OT9)0!B@_=k^i5$`yU1wyP`h)}(|2yR z%yl^2zE|cWWLA{bCbHQbt@nwWxC((5BTja|u4|fZ=^+vB%#LWj{wvo03%u45?sq*% zgtG4bzr^wXu=#I{!1Lq8<^MzZf7{VS>YKzfvg2-ePkz=x3TaEDWG^H8r_{`C=RFT1 z8iVN*HasPf~cxq~(OvGH3%r>Op zn=|`T7&e4gq)4o8>f;pWy|=!uwsYiimb@j@jyg{laOY<+l1W=~@S|;F*A71@AQGBNEtf)T|}&m@JEjm?5iT hllI0~`%h+HcqwEL<)OzQ9vuV#1kA$lnE~qFKLOr02p#|c literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/searchctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/searchctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..429478d597427f006427b6099a12e3d1be2276f3 GIT binary patch literal 2029 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/spinctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/spinctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..50e1b432a3c58b2bb24920e043865d2c88a3432f GIT binary patch literal 691 zcmV;k0!;mhP){{F)%o}Cdtb;d%XLU4qGzkmOdq<%C6(ZOFFX%H6}t&7pY zUl>r7m->qYaH$^+L3Hr`!>9KjKB*|lGB7ZxD9J*&?>~IPrG7L7(E$rHv#F6boNH>N z&BDyg!pw|QJpuDRZgdm~IDp_gZ1}L>pPxcU4r;*6!hGrKZQ|7vQIiNbY-LusfXE_TnlI_Al4W`amNU9cMb1@?ekCahZ+tQbN&8MC2b9Ut= z)uN#R@brsWSy{1$FKOiH5jSOS9Nge94uDHNp%COXOLKWQJy@BCjYG&ddyh)z?zz4q!@3#%_wPTf z2$y<7xtNhhJGyUIbRU(SIf%jEzkeZJIyksS%7bo$&?IQR6qtE2s5 z(g36veE#AM1_p-n7jHng6!eQn9$;pH1{RUMo@Mu*36-j zlZF_;)i1_6&BVaKz=(D2*64gOCcrgcj6DQL0r6n8HA5*F4M9r5Xb4gYMnjNNFdBlC Z0swbj^)w<+d{qDd002ovPDHLkV1iR3Iv4-| literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/spinctrldouble.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/spinctrldouble.png new file mode 100644 index 0000000000000000000000000000000000000000..d37b9a3a1846ab747a8dd9e4490db7eba4da180b GIT binary patch literal 1023 zcmVJprH4%(}2 zxURzm4vDI&5u^#IQX)To3|dBo7?GfW1`rnj?xqX-c@w627HX!%Mnckfyo8&#E1~nw zTL<=w6-a49l@bUB=y5~@yJf>Pi2i)=27tJkl>|HarG zHJ_&Y8+~oJ=Bij+SVZ~SET9OKugzj{VG+0Hsyi7967F&Jdv)kJ9qSwGSbx2aLZN{A z{d#QqG}2sdqBPUHoGQ(f&|Gfr-%x3{Y)nm0K?ngM1d8X2c-46oTRxpTBmHiH#P~Dk zjRP&C?Oe+diH+AAvE@^@97uq^dYsqwAVx%we$V$}%QFe}xLE#4Nq=#P2+L0!q4Vas zVzT8M9U0vo0+esV!KfUKEuSXL^WkM6=~<mg>p0_-0qdy+A_4-ydS+p=Fd17ub(50-C{9nI@vzaeH`#dDKyiAich53OapjpZ z?3XsQoQ7;J3;TtQ*&DMxncdH$!sOGvZvs^A)=-_Vq5fbA9&MriU_Gbb#LVQ~zLV{r_NV_4jO%NMXrn<4^ZaZ3OI002ovPDHLkV1nX~+UEcO literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/staticbitmap.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/staticbitmap.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2c86f828e4b7e534b6718df8fe206ced5024d6 GIT binary patch literal 253 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/textctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/textctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..dfbd84866e26da8c8d816500235a54f3c3501885 GIT binary patch literal 2623 zcmb7`XH*kd7J!3D@5q3lf&vl*QK}fKAOfL>7Dz-uBs3wEpwa?JFH%Q}BOpZ}l+Z#V zNDoLap-3Bg37w^wjDWJ4Gkf;T{@UGl&VBdCy|4WFzW3tHO!PQdg;)Uq00&rK$DEd7 zv`A%Uq|Faws{Co`qMtU{l9@JwnV-c104x-+j+W)C_q#bEmX^-K-I^~ES#*v7B?x!@ z2tWK{XK;d2B<`)9@$ed@u9skm6+Zr%c9_4?} zsC@E5X`h!Cs&JKQG<1EgPeo9@@T3N{$!kUOP5N`2SbnbP!R&_Mbi(#OJZi~ve#Fxh zF&Otx;LJ!uKwUamkr`c)>EpHq7!eGTLk~PK_mbnSxQ|goI#TD6(=apRoP2>J^c7;s z{?3i6q2JaT!}BIq-?@4+zjS6tj9}CV?o*71b_aFR>uQhjMuV@ zQiB9cV4!V83coA8WW*6hZ+HOyDvsm-Pe~7&$_;c!b+TXUtMDPDwBi8? z5B1J}T{4or>eMw01Q}m09MhAvMOsa#X0-H*y^>s3ES|8puo39oefh>g_ubn}-#gyZ zIW9Bq#+B3+mdC1>RqoV;tSFxWt3}2{z%FY|D1Kw1p2ZPodw$E_aK zq3p%I;}JT#eDQ^+E@T(ree2yeYr8K)zl#o)H~Ti4>2|5~&Otg!2C9@ssg|EjVeuOp zI!vFw8^Oza(|_Q?`k5XEO$7LAfJ`|*Z1eUlE`iSi3v$vz`F;0h-sHTfz>CcL4ly!u z#1|h}O>AuPJFIy76S+>Y*n&}?v2Qu<-*hg&DKfe;oD8k~c+t%j=FGkV1Uz1?wCaYT zFH}y9TWbopIgFE zmm-Fztw|qh!=u&)O^ex^&4!0&J`AG0u1-F=8^R?I{Nm%Xz@4bV(b&el976$?H6|uh zntYWShaRpS07i8ejEn?i=-TbT#=EAGGlpJ-+U?Tl&)u93W|IJvkc=ZwYNDx#PR0Bn z8vgKsCiaahTyQoS<@D4*-a?Gswb~+ZOYwZhQYVhM)~x7Q;ytOM@%=k@ZkAw7JA{~e zHf9sZ;P=DE*Q|*w{WUSx7Ekt`CB{pr=ttZrQgt#%N|gR_ z`zBg)+5)%j@QOGNO|usuIwebx9(s@;JJN;D+UZuB#`8oN7O3-F!dq(((-GuC+dQA_ z5UGFI2Tp=h3mEcM{An=rk8RZ-CvE{7b2*JyqNZ!gJj?o3Q}VW5xhg}jg^x(Q!=hwY zEq&7KlmdnuG%r9D-L+ZxIEFi4p&l%m6|mtn9fJ2`a9qrx!%1HPN-U=9fqZTjAap zGThL`O&Gx@6$jikdzS{gPk1U5@bAE5?qKwGr;=vm^6K(B(`Fem2B74F?b~S^ofRg% zW8`e5Kq+?a6wO(Pb@Qie)|i+w=6(m4?#Uu~4tQ z95$;797<4!=c4aERm|j!K7p6WDIcmonL=gwoj-}Z_3WO)@`YwQ_-rJ*<3W6PLtPb5 zNT#GYLLD63dnewV26+HkU8W8?SNk+yDI876{%2b5P_&wdE6d0f#*MOK#_7>-st;+K9-URb z9g$-KG$C`C$k5HjZT{Ao$M)R#)cwR`YAHPev%S61CjJxkd)!f{G&@UUu}rCEq1aJ? zOpx-;`frb==DW6&&r|6$Eh&Xcy!owdOUwPQ{L6OIItMWKo`gIX1TDOUK<$lt!?|qL zJnyJVHBZ;5XqB!c6EBP#v^FK^)HD3!gQg#XsDmh3)VptE0mLDHF#jkxIoB~x%o|as^NU`Gz+)I zmf7(i397z2rnfsiDIPtYqnVmrGn;cwo66r>KyI8sy<1Q+u^JDt#@`O;@V zgf+o0rl*NM+l0g84<4F}lQjqFS-9xeO3AYFM}~Xfy{{x#G`?u`FWGk*jb?3uQ4IHN z9M&+`;IA}5O=Doj&{%M}#>#Y5!(+8P;-xrUMd+zuuaF_RAxzrIoJ-WnT=T*Iq^AF0 zX8*C`8{C#AudG2tZEda2n*QS{QhRY15J0X Ws?GA;qbAyq5CDE;qJ!0Tc>Pb%<^0e9 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxgtk/togglebutton.png b/docs/sphinx/_static/images/widgets/fullsize/wxgtk/togglebutton.png new file mode 100644 index 0000000000000000000000000000000000000000..2790f5de923826bcb961c0ce75b3dd25786a3c44 GIT binary patch literal 2735 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/button.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/button.png new file mode 100644 index 0000000000000000000000000000000000000000..78755128badaf8877f9046d4550a99d760897fc6 GIT binary patch literal 2805 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%0A}DtLQdsB1y-^9`@Rez3fx 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 CnrN*6 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/gauge.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/gauge.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e69ac22e22d7b2f687fe15fcf2a2b2c980174c GIT binary patch literal 591 zcmV-V09iSB zDHN_7qh?IzJ@MXWN^T4Q{JF5vs1%&*_kSyT#{ zaR}Ubj$)S2Qn$G(XsOVyVg(t%jNQP@$AJ!DcgUv&O&8j7@_lO zH$Wf2YH${W>(;Kdl)Yran7W2)0~-T<0NX?FpkmMjm6fh%TY*)hUk;*)K}8@06@eHi zf{I}D3iR{&yi^|F$W!yb^&%h1G);3lotmauV0G`6x~>n0L$<-pjR_&NZ5u+EcWv() zW6W;1%j$3$VhW|4#|WhuBa~u{PzdB5-jx6-&0j2~lnJF6Bb4%&jL?A6V}w#lnNW%` dLMg@w%zBnk+}Esq94# zRq3V{yp2k=qrDiRs>(nbnv4`iG^qhionbGGR${G%7d5Jcs|p+$l^9hf%ejith*ywm zZ-WLaz6hJ1+uvRsP;kH@{zH7^`Ml!J&;9bV^5l4Ozu#kXi9`Z~XvZD^jIqo?6hHyR z6Ts13mT1eK`#k|d?hU0Z(HI?LjN`bqW2e)Z7LgWkCkmi|ya&Ag`s-W0s!O~0(4j-e zjvdP|93ffw_~VZa27|$1c<7;r3+=rG-b$sNjtpPBo!a~oAT>4A>l&Y1JN}QiZ{UBAyzuPPGZ#A> zYxyQuxM1@o#b{d#wt1u9?4+Txmr1W3{N8tGQpsd;ErnB`b)2ogdUO31LhY-z-~C}M z?iYZWuWoI;Fu7&&6Ya>5lY0PUen_^d3pHHx&@=!bIn-8DW$9f20K}$xtExJr&s|j< z*X9bU!O`&^j;kAsZjnpLppD~Q(`sR`Fw|k;^hTpm&(-zIK(POfvl7r$&2e0_YkK99 zWdMLt{THAB0OYaWW=?NZuXIgC0U#A_tKn*F{p#ExPc>I@%|moo)__bonb>GzVuEeM zpcN1ti;S_jUjP8OBMM`R+X`6S3R6by0su!K&K7+dLZFjgXP61W&x zWQ-*w2LPx4#{8`0^Mw+O#b9g1iPdOVdQ?uW6JJfSrxL6AFdT3UH<3v`1_rr(?4qG`#!lAzB1xP z!|Cc$06?kjk4`}H0)ySQ((Mgvs{FOjajvha_CT4wu5D-m0F-55^|wC&AP&JXFm{b4 zB0lTD+5JE7jR644A6~1J_y1IccT7?rOdLGZW(OoM8ZN#2(&M@;-YnT+nR9Ya7KJPT zlpgw(i1rh|6#LL19DVlW8T5%SpJ?G*8xO8zMfAcOjq2U-mGiFkkF`ql#;wOS9Jjs0 zlz8A$tGn|R=cJmAxS3QoL@fh=;ql|PZUNr+|0M%J{MK4b(=bwb>CqEMa3Ha@+&jJ8aV;!|EUNJB^cG=g3 zzIsc~1L8`_7ogcMAH7HkQ*KeA5Q+rw>^wxQ{}2i}WhY;N4+y3kx#W$Bmi9!?%a z+23WO9}RpISptAmbf~9iJer5b!RvoJeWJGh(nYrvS@lCX@0OU06w3PHpxxfFo~CDvZ7F6mfHt3kg9UYT4v;v!0iLmTEJ{S*BzFvgd+@ zGaAiCeO<@!%J27Nu(_(HXLzW&iZhzc`kJ1(*j%rLGn&nMu5NgGwF=M~bbzuP&vjO0 z_sV&})^Nb)bMnAB=SU#%cDWIgJz{N(?3N<4fx&pY_?Frps3>1a-X`%CG>`g6x_NKY zfwBYd{=n(?yRC4GfB!5`Z-?v>8FEsGTo-H&2ai>k1Lf5xk5n3v4F09biw5V9%?j{D z6>xE2{Lg2eGU*`$t?t?Lr=LV>9}l2)Byj#E9g-mteg4m5sM%(-4S5h`$jN+cK1?Zb z07?Q_-TF7sSTO(qJkJY{?p4plfyc_r)OZ;vfAWVqV6~~Mr1&;Lk|LG2R4LJ~8>)4b zov+y>NcrynT5)r@W;c$2^mh0Sz1{Hq6*7VHVcG2BZyT9y(fQ%!y_eQ&|o%JX7mzC|W zsIGMe)J`4q+MQUhe-tp6tn_f3On`Z%FqrwEsiLAnZ1+Oytgfi2X#9W{6dpjCb24we zUr9NZfU(qMSa+P#8BHeY!y?7m`<32zMSWPLFlbv0(HKfuqA`@RL}RGKmJ}oEuq7Hp z9kyimpp+#VLmjrH=oDzdwgA0fsRdVug5*M0_nlmM@BKYTYfoKYs0~?Y+_Ew@%fc z=u}^AaK>vYO?UKuVSVoxN_2pte)Xrf{giiQ;4c4SX;3 zU)Qf+KXT;ARzvCXweygAzev8&M()9^M9jC!``LKKY{=N002ovPDHLk FV1h!X21@_{ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/notebook.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..99de7c10ba7a70b0187b47bd72c5a2f69a090a16 GIT binary patch literal 9213 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 Y%-E%T_l~;-8g*bmQc98);zoi01;BkW_y7O^ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/radiobox.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/radiobox.png new file mode 100644 index 0000000000000000000000000000000000000000..09d7886e0ec3f05647896a9d3566357935ac25d6 GIT binary patch literal 3393 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 X6Ou$ZS^4UK00000NkvXXu0mjf%G+O@ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/radiobutton.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/radiobutton.png new file mode 100644 index 0000000000000000000000000000000000000000..bda87e9c4ca22baaacca15959ced4241add2ecdc GIT binary patch literal 3683 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 aFocJ)Y&&PF-=EkulE74TR4SB^;r|D22P7{5 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/searchctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/searchctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..8088f713943efb75bf6b57ee4c1fcde491d00dea GIT binary patch literal 2315 zcmV+m3H0`fP)&Nv2>^fkaWJp5|BhsidqK-73W;d%gS$ElVnQhlq*Hw4j z_D?{ql#WK~s$GnNTBKA>BN0$YBSXPp{JPin#rM?(;~PjI&7-3{xW5hZ<=94?pTF~+ z@1D@XgeN#+oxms^lcB@4O7kIh$;(Wszgc? z#8iQ*NdJEk_siF@T-tpP)AH!8QlQ$;PoPPavPNqE4I;bj05_q2X$PoT0Bq^*Sy$C#N4v#{X zAQ6Fx4l&=uGac4e*SWpcX7Y_$APHEMCo*WldO8t*YYq6dZqu*-N0{=Lkp zu@O>w0!fk(;@NYfKNX8B(&i<@<#!o-EOn9vqPiNz%)$&lF1~QOom)8M?N<~ zG#W+IG?c|9mhY~hM$h56KB?q@$?Q``#9G^?+O#nno8;3G-u>GfOituUCSnL7`0>Xd z`RS*hSXo&C;OyD6oIih_x8Hs{oYhy1_4Re`-Mfcrng}6+l&jHb&}=r@-rlBEDls-T z#-uFc`##O?FRZVx(;hiNA#1a8>lgm@k2fD*MBDNB_kV98jZD$qb?LTu_~(VQoE{$y zB>d)^Z}{q~uW(&A2|eBVdc zbt;t#rBW&QeW_HUQmLTpdJq}w^*XXFb7CYxv5-Y_y0m&OmLt)z4&S&+het$@U00$v z@Q^&46S*|$L^KG?w{PFZ_kHH(=FoMWSS*I7Y3RDn+}vC+CgkO((P#uquwfW1EiF+l zmnoG>lu9Mamv)FWLzT} zQ4m7ld0r6dqR}Xda{nb{Sw_>epcLSF9=C4Y;>$0;eCR!{T)7e~=^-yJ!`<_uqfdwQJYd+}vbiV}onguJPS>-vyVfyE?&GyDwPUk3?+Q|$Y!%No6SJ5>FMc* zmg91{Osmxj^2AIg13-7zrD<4r(%x<0sP7R|rN@tmDNUd$9+|j|Ei|^9U3QE?P(Ml} z61@NZ`+V@h2h7aO5Q#*HL?X=0%y9YgWeSA?)oPW`KmYtd5*teR@{!Bsf~aU11`7)d z2PCXkt1K)mU>F9z?~_O*$mjF;zR!*^V7uAH78;qjjHY;`v?q#)g1F)$#T1l?##XCE zt!Z*9A14~w%NccD=bd-nVQy{?$8qp|A5~RR6ot3mdW$c<_=45dRX+RdGd}+K;~-pz zyj-NyX-=Lz85Fc1tRW5s9quPiojOG-m11|`P-~iOwfZQL4C$DH*LR7j;t6s@MIt79 zbP$)1mGD13?W_)~{t5>g*%jLLt?;gv` z%i)Z^#1xA~rlzJI$`^+WBjME46vbkZf$g&0wz#w2z?Y-MBNBOC;qtq)N1jbQayt`O zTncHGQdXs7rP$bMar5prZ=NZTOGSyOa&X|`!JFlprco>wxq9^~ckbL_dU`rM4)zMj zsOviQdObMwFf4Lsvsv=_JgHQQf$dW7>~iz&HXA!VQmG6nO`?!ifunD5h(|TpTfWB9 zTI>EkU@*XST{KM#k9r*g_DlHloh?ukjObA&vdXg^1Ixr^ zCNlSjGz|E8b%%yI_``#-LI|SKXc!5PfqaJ@jNLEc`H}`$k9?g+ifHw_q+`;7VU4cB z%0`d1dOvIx2sxxxz$X?!o5KDCy4l? lC}K!RC}Kz`Vo1n?{0{nZ2tst+C2Ifx002ovPDHLkV1n*ZYvTX_ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/slider.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..3098582478d1990968c5232d4cf75a3e2e5ccd11 GIT binary patch literal 1338 zcmV-A1;zS_P)0018d0ssI2?=ex@00003b3#c}2nYz< z;ZNWI00i<$L_t(&f$f?>Ya2%tfZuyNyIN^i_R70fv71u`IXJH6r~#Ygl2bs2_S8de zJ-O{EZSxaCAmma?P65+Puj!$b)+){=z61(Qh)r=#aO{v$(_$%>ilw!+JM(&2Vp1is zi)&lbTHk5WJfSyyyxEzj!A7Hji122ZxfjsA0qFbw9$)Cu?NGZD=yA041jn3x1T%9l zpsNGo`3`1grIb=C48!R8)fgf|L?HwbMbF2d=P@AKoxtJ4%u>n+50>uU{q4@3#mA4g z03vyj=G{e$PoK7@rcPhJJbC6!PSdnlI*wrlODXI1`pug^&HpSu`gnZuy|-R3j^V+t z8$W)xGTi^ywQKKNmZfRhap!vU#IS;uQngy`+qv542L;Neep#<00$}uxLIhBX5fOov zVeQ)ZGTH9j4@ek> zJ3Bke%gcsgvM$6czP;rnYN{CBuFDfQj83M%z!AR)KCRV+DWl3xv$yhx~^^8?auvx1VPYf zGyvf2*|RM}t%4^fCq2(Am&=IQrAwBS(lpJt9ouy*!w{qiK%om#%tWM^37{Fsgib*a zY;XI+lFdysnM`)+iUk0^@9Vmr%jI&pT+2|a;Gv6}>{Ea24-U%!odIkaQD ztZxc145M1D4yX-xa5P~MBM1!;K`}6cRHSR56aZVH1ldgBp9{5G%`l9;f2Gr=`5)=Z zee&KA(Zs~W^HOPt#w=%05J(BS0ZIWPAObTWLl{CcghplaonUcdqS&Qp!hMP1tb`Db z#o5`}4{zVz@gWF6CkPk>0wMqb1N`vCr&Ci?V`F2k>k83&VvGkd6bt~&9QCsv zJ$h6sl|Gr7*#eLXlma3E0t?{l>FHvzI6gk^x~^duv9t?u6$~#Nm&@gag@sb7^!d!p z7C;C<05-s_>FHvzn9t{<4rN^J0swWw-tQ;^5K-54&-3#6e6d*kYI-^iU<363+pezb zk=@Rm#s3e8Z3RatrGg-c>iFKhdslDW`tr(^ix)5M+Kubxd6$?Ah8K=2mCDM>%KiKI zM@L5sg@Wt4C&4b91i=6hUCyf4>+9?5p66vUndmB3yYo5@_7U769k@g3;VGq}$XBn} wbx4v&5pW_Z_#|^8mZ_6WPjJlX3644c05x&@pMtG_J^%m!07*qoM6N<$f(L|-y#N3J literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/spinbutton.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/spinbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..f3dd7ab46ff6dc6e3a4c902ed95731cc5b53e2c0 GIT binary patch literal 875 zcmV-x1C;!UP)l>Wb`u_et z%d+F+W6$#d3pj!_A;iPOLy{z?r>7<1f4DLIBg?YUXtcGprL`792qC1DH#av@N-3of zLMi3@ejLYHmQ}L*4X3qElEiVGm6a7jh%rWM-Rt$PudjQ(9&|=)%{g~nH%SsO^e1+c z$)r}RS(XLGPft(nc6&4$wcG6|ii|PF7|XIa=ab1~0Xu|{5W=!7Fv}PdhGCK<2%#iN z!Y~B;5JHaQ2qB;Zc8d7jAkbplcCpjxbUK|5tTDz)DM)i12k4{!bjS*JQcCk@OeY8- zFvehRC0zM6VvI4yX_`tY;q@1Cj4@J5LP+uA77rO?j4@_e7W4!vp-d?Soh|&G9kMbU zrL?$wdJV-|YeI-+S(QrX!U4f)T>wWZ1vlowl{;(OHX(#k${4%6ybOY%Uatp1aB*<~ zcVLX?&3_pV=oI#~S}o2wLWpzTYPEoxWm$}|%K85W2gZMWeZc}_+-x?(FkD?-4a0D6 zZx37}gp9{yNLawmw(a3?XpAZJ9v&WEU0od=9l;Jl$QUyi42tH?9WsQF=Xr4)E2TgV zs5?JDhtoXIDWy`%IF3EfD>PNJBZP3ygCOX3y9go2aTsHCDjdhb7$G8}NsvTQsar)esL$n%^rX504C($ezsvg^9@ zUP(1v0Sb#B{%2=n{`+23SzYxHYW}Zqr5Re7@C(I1sDI@@GUWgO002ovPDHLkV1lIE BkP-j@ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/spinctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/spinctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..94c8660d2798d9967fc85a251316df9f2c98867c GIT binary patch literal 1313 zcmV++1>X9JP)oua91n#S1h>ex655=4wa08k7Rq8hSfXs)Bqo`3CYjg6!!)=t z8595G@AT%)H!t5W-|ze0_hz7?DB#usU9|%j0z?R@Z*db15QMP)12@s&mMZY79k>uQ zV08_1#)v@!R@X3Rj2JNWAGmzzx=sg#kcztqoh?)9u?mO77K?@BxaRz82vt?H+3do? z0=+Dk%d4xasZdVmh7f>FLpR zT~$?8RW(gpTwK&NP17`0Rm$zNx=Xs08f)FBv=(-+@ z#pdVdW3ia7>vTqvBta1J`Fy3ERO8GY(aWgM`8cHiTP&_K4^{0|4>zxWm%d?gb-Pl^Z7gg zAfM06vK)y-XefA|rzzJEMp+c%G-hY`CW3U6=*n!>8Xqdm^0K?FMK)v8(rMiZj)~e_Qj_}Mw;7{<5~is~^qmMB7qWsR1oCVKWxcL0FBHwpmf z&Wgt5gxDa27-K3?gR2=;;L+}@*Z;gN7LQ*2zVyW(VB+CN9cT8u9ypFe2vM zX|vg!PUr0GETsw|G}zh#;~mpqzdY=Dztd#0^p1Tw@y&Dj$zTf z005FC1%p8vD4J%c6^tf3ropFw9v_x>~1l3@Wgrqa(@hJIO`FwV} zo!(6*lks>w9*=i-cY8b@L8!5tT+??<2qBxz76=5kx3}Z*_{PQtJ@yKMV6|FZE|=Hq z?d$8a*=z=zrpBx;=dg@1?&|9D`~4n|M^O}2RZFE3ZJkUeli6$*1i^S8SdUeqP}teo zu~;nU;dTvVv)SsiEkZ~X#frvSc^?SxzRKMg+{>fmiLoh2ZY1+|4n#oeKO9 X#hE3l2I2Q=00000NkvXXu0mjfC!u?+ literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/spinctrldouble.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/spinctrldouble.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4d62b58828a3eab6834033cf2924517abeeb80 GIT binary patch literal 1686 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmac/staticbox.png b/docs/sphinx/_static/images/widgets/fullsize/wxmac/staticbox.png new file mode 100644 index 0000000000000000000000000000000000000000..be20e09534075ac8ec9a5ca27e3a0080fc3f7135 GIT binary patch literal 1086 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/aui.auimdiparentframe.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/aui.auimdiparentframe.png new file mode 100644 index 0000000000000000000000000000000000000000..57b8ff49accb5d51faf656fdddfba98168144274 GIT binary patch literal 11847 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 X=N*$f%!1bq;sC7|dcaDxHxd5_IG;ui literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/aui.framemanager.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/aui.framemanager.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f2fa4bbc8be6e46176ff4cba2820a130d743fc GIT binary patch literal 68931 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�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 b2lj8}9F&(pEH|HDe(nH>k(FWnZCJuTt1#0( literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/collapsiblepane.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/collapsiblepane.png new file mode 100644 index 0000000000000000000000000000000000000000..17f093d6801b43ab720bbab99a524118ac2eb48e GIT binary patch literal 5976 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 ZL4)(n(L<#}TSSW$aOM=;mTHas>mL;f#3}#) literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/dataview.dataviewctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/dataview.dataviewctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..01828e6d40430458dc12213cacded4d66a0d0168 GIT binary patch literal 2659 zcmZvec{mi>8^;eSjA+QUHI|XJG+HzbGQ?P>tb>qcx*^*P5~jpZ5-HSB(!|_Lmd0%~ zgDE6J*@}>*aVuL4V@)L6-09x?{O&)$=RD_p&+|U#Jm z4F(5*kd$Cf5!)shE6!->3S`@v6V@2O|Ji=4EzT5J#KUbo&I2H^^JfY;%UUFuqZh>e=9jI3DZ4sU$rwlV>DMsej=ZOk0`whf?|_VNHU2mvuspauhp zU&cCjUgRedjf96mf?v{Tcb|WZ5*T)rFke#q9RyBTJi;dwSiu(K@ymVljm^pK$~V)| zae;*m=Yn{wgWVb|o;((DXu#y0!Ky)jRs^AnU1dfv6BP{d~H; zy+40EFS>c~yVT7FCY!CLuI}%l)Nb2UQt*N{hX&AdbewEsjnnonz=e;zgEX;j9iYg}F*6Ak@Vk7p&TqOZAcf)Cq;bAdei;&#H}GI69em(C)-N7Kq#jYd4n*8^`HM z-1h$^NzZS1VZYa6a9FBFEbp|Ph}yB?mc=T)RIi6n-7x}(C98Wk$h4>X0Yyy>m_VA> zmmZBRuIq77@=~oxj9=s6?LmwTyaSKlA(WtU)i;2>ZwJ}*v3S$#q&eplJ(q^lr`8Fx z76!tCyDUcsJPw^dXsO8HK@m~hO_|Y}9pG8xz6r2jZ+NI}hafILv*=$DB-8e5L!{>D z9B#m!&Ybz15@yK_UC1tnk50U%NRF%}`1J}_B3Zm2W9n_}lq!`PSU;9jV3)7z*7eTB zEq~8&YEb*3SVtZWbE81f#Ecb;H{U;^Qb{aFYLl?bhd~kt5*k7xy>ZW zrm+j~RC)&PPUcmK{`3$mu@+V6+!;VnV(NYqvg^OG=I9L z&SzsEp3l})t*eI9Hdo=EY{Cbnry&_CpY${GVD0kd6JNimn!*dg5Zd*a0jT#xk$-Ua z#)yCv6gc^|yr$pkqK}8kh>g?H`^xc4eG7h^rRmv9zYh6tqoz#=gxVrcbvV1wT3bByN|Z6lIUMo`B6(1PQLQ+`KnVn9sSYdCo$A%)}Ot7 zu}St{ESBad_|b6J@ps(c>`H=g-v;2*?(!c}9IH#4wNwzog{ARO>118M)VMn-hdcdi zMXD=Is6+$eq4(s-8QW!a`nZy1o13qv=XLaHS0`IH`3DboOXXV7<9+WpmxPey(0 z&ZXFDBRn^BYTDR}NpK)}WwW2HTlL%Lxngy^wkkmWG=zZRhL`1gN^??$wxdT%niBU3 z!fQ9k??;i>f1nRS09jh}KW5cZ+IaF8B{goo+ScbhJ9JjtjYiDPNNjkQ8{doc`ax^k zVR`CBWQ^wTKGV|l!jS9} zRSXsHn$wkTfgkU2eQX#?oz-bo1DTynZ{B&segapdh_}CYaM&(=oEKYkj6}?Cv+?3x z9)=vJtvzM#&E;nK=WLFY>|t?3d^}8}kK0p&Yt+2lIRnpHRcv{(h^3SKskIFCkrd@B zgJNaioEB~Sf`yhXp4~g;Xm<|xoLZ z-%{bVQzLTcmAb!gb@R`3&Gl&OC|jFm0s2~9#{s+eAaTR=_5+;tyujVcgEw7g&z#VL zhgb5Dn~rhKN}~1k`BYgmlyDh>`5n8Uu-|Lfw314M2)HTπmL1%LqkSebRVJBh{G z5s?w}4YGg?mue2hD1c$q1b573Iczqlt}bq_UI#{0otaSzeIm>?L)pq&4u7l3n!AcI z07f!Wg=TsZt&10VrExu%z13y2w-__T9SE(C0GcjG2o3eox%6Y?VukLNu&>gdSCl^o zi95?B3^XwH{1(n4Ua_DaC!JaZq+1+nxpG)C;kJZzUZ=m)n0k^8JfP=pp$*e(d$96l z4fOxPns0b+S3rYW0v6KTLGV;rC!gAxk|y!FIov0E`!F%-rHei`8mL2>Kh6HpE9t|= zz~RnRckyViWubcq|BR3VqrXToR{#AEfAZ`f>VpR9M8w?6SSYTZ@kw(RuK26AhfOQe zm2}wQl~rc^Rt<;8!fLRt0%>n^Rhq_8BDvs%kt{`i%QXv=56*EsUw!0Sw`SQv&B`fW z6`fF$SR^A(E#Of2E1Rz?$@hw$JR7+2*53EdZkSweXmnP)u#4Lb7o)_>3zo`pAKudm z7v~#(cP4%`&*1G4+`(}QfWMHr;kua1TcBD3W%FPpAH zSx?AFtG=7eaiS?sv*6p!ZE}K{I^XEhyCi=Q|MmE9 zv6T#s53pUUkfa&)CwITJAgNEFpSq4Y$PhRm7Fez^oSBYaIfrH8z4W zLCay?8zD6W8g{<{%(F5r%FTBYSB5ok$){9=M=qeMLuchFK_>$Ht7dfRc=uZC{BLK=f zO_K%e{LYx0?laC`oS#^lqG#YQ9XaeNUn)9kWhLpcPv(Uzf5SWsnjs}~U!i3=j;et` z5a+SquDJi9)#kV_f+J&;#If66Hy`A=vuF<(lKfx&bW1HKrDgN`8g7jLZWkD8I@S8s m7_3;qNaSZ0`XE7`FBHxHRqV!b{~19!2(Xs+7>4=jD}Mpos?k{h literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/dialog.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..f15b7a89b009ba1864a28bb5f7f047035dbfa707 GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/listbox.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/listbox.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a6ed7ed6be6281830c56674532fd6c28489e12 GIT binary patch literal 1183 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 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/notebook.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..16f88dff144f7d03db612250e1f8501acdd44e24 GIT binary patch literal 4445 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 LNkvXXu0mjf=<4zB literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/searchctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/searchctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..045f35a9c5af2bbd9405a2ebc8023bd903cdc237 GIT binary patch literal 1222 zcmV;%1UdVOP)0018d1^@s6U{l7800006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru*a{B`95Z$tJJA3D1XD>w zK~#9!?VGV{8&@31zb+ayWH>>FJE))s3gm?r;=$l2;vokaa^OYap@9xYbST-3#!f|a z68Q&;$(W(w4gqyAT!t3Cf=U!f&;?@p1PSPY1$TqMHwfC{au+GOJIS(K$>#T&#JeXU z-hK4D-|zRHHoVh+{slp-h%aaf2ojJW0SRIi^k){Zro1Gz=z(=-j`tulo(p=A`p? zCzj99jnsM3wZ7`Z`NLUW1aw|FapZga!(-(0`KdY8{VLQ41^HgWId-slcXKIXP&8eA z&iAtOG8W9voqTpc<&~7f>`Z=b6Q@*%*uh z_yZr>O$|rC9-(>MoSJJtuu<8oEEE~XB~2QSL>?D9Z5~D18NuhXU=m3eN$3y#SU%_2 znM&Q3@(9*64ZiQgJN2?fRqE4wK9=K=WaAQA_pLaehkBXJmVHAxC0mtPVf9xhnnANg5mw-{51*5RfC*MoRXVVF0K9@%@3eb4cK<%KG zSpl7=1(TK=emAdQM zU2!Q9jDk4lvvw?)B@>M&4fwtfP16>VkXS#&p8{Psl+Y}h6RnnsF38w5<4Ysl4MBJs z=3K|Ive>-488?}uR?9fGgIX-%qLGkTFZecx=XvO>eyV%`;%f!10PFtjBYhV>j+J!s zLDzNE4rPZL2D$7c;RdNT1~3?WEG6F68xHR8cEp+`c9F#<+BDF;s` z9`p-%@Zdo|0P&{5iwEM#go9EKy=a0VU{Z{+K+9Uc6E!-7NjxgRkV@<{#Z1g;f{`@eHsqPDd7WN8hwI$Zi%8 z>SpxJs`aBw?}L>W6!8q86j^S0)7r@B8HYO6c2{%Bj*D>xP+J3tX8=Oz)xb+a2qA85 zV4G-t~uljeGn|s$9C5JJ6 zZ`yS*Qn(g3uK~-;tKHpQ6B9Q>2x|_D-`D*+fQzKW?TnnVZLafJN1f6Lty9WS{}e7> z>L*S)yuPCbUS#JcLPSh6V2_c4IluA33-|h(Kfp`XJC9|gxznqGB9(c2_s_NL{c)U1*F@_cx4Dk$@ zOvd|-;iNt_m>Qy#nx?6$>gcDjq2kB|9DDZo0kptih-UyoXl6VS!#9%V)L?2z(~92g z_c?>lpFV_^78u3Q|L$+A_Z(1j2Q%i;o`S01jm^$~UW%kXnr~vi5_@N#C7>0jAYOzl zM|;eSCuZl7VeXuDdPQ9O9s*~8$BWnRpWMF{Oh7wjfba%1BA}fN5ONbfPIT0(#raws z{<9?33iThKb(vksU_Gpb&0r?A1IP>jMj8N&GyoWB05H-3V59-SNCSZR2W(YB!s%ao QuK)l507*qoM6N<$f~6IA?*IS* literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/spinbutton.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/spinbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..beeef736abf5e141dd87ed5bc7c097dbad3dd6d3 GIT binary patch literal 627 zcmV-(0*w8MP)F%oXFqsc0y~!{MlEW5t==rBA{p*^po~9%@#Y#-urv|Gb zSkBHNa$5_CjoNb*ZT^Q@$H}jG5C9H-^5HRzVPm8aofLzzcp|nOYpJVh9#9E}Fw31A zotsxXwHZAShsPN7g46}ZmJlpdn*e}FneG@BeVWKh zjLeOt!mZQiFJD=wHFu73N8#BrD5TjLJ(V~*by*p!$B)eyS`}Zv-39PsXJ<5w$CXOx zSqGN}q3^f$-H{Pw_U7I0oXCaN5~3g&4dZO^@qK#^O8%TwpQCR7^Vek1>!88wsFt?b z>p&=zdt1HQ2dfT|{61)izl=q_EAt?tZvV@-$zbyWfdD8pbt-}}PuF+38?+N46hKMR zyIYrPmGE?js;Hw6oEsL}hm6R2s@00I=_!r1878`T>QT*w{bo}&5+$4S07IX)B zjusG=^A!Z~s7`QJdLxJ=rIRrdL#YEZF_R-8Bne@GLVR3V_h=Z;iOfXHI&m^F%^*ZX z#W@k@#4(GoSXHa!6s%Qo`(X^={)1-=Bh@O41}f^?6Q1ta+fVm?q!d!tAOI9kixgK7$G`PvqUa_BiHL~ANfcthLk^3Let+cu1hvjMd+R|y`0J(4zJmAa zy#)h+V9qQvI+6g)oWWFWUt`1W9UFRG^_L+s6tl0eNYn}=dvTH^27C*SNE>UnG$+rG>=Y*K3MJv!tY zYn@NFeR2Qy&X$ip5C{N*X`mVAb>ZM+>t;vr#T*)?NnaRqwOUPP!&}L;kI0T57)0BQyrzx=fSgbz3bT|C~46k*TKjeB-(T#W~rd-HP8y-JJqpgltwR26u2 t6B0}GNDyTh38D-mL6l)6h%$@>{{ZZzs>1dj+*$wt002ovPDHLkV1k%~l>7hy literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/spinctrldouble.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/spinctrldouble.png new file mode 100644 index 0000000000000000000000000000000000000000..73b167de884541138b14d390692eee1a5480dd27 GIT binary patch literal 696 zcmV;p0!RIcP)NIxZmiI|k; z9xdD`Z|j6;B!cI8i>;0Glx~=PjVk-!&ZG9~2%hJWW!Yj|7v!erDcwsDz6my#p|!qznP)QrZ_d$1+MV$)vizy!C0hoac_KMoU>_brP)3yjI zK~L5QcDW8%RZFO^5n2~P*|P|ezj%u6Qiv3I>tvV|QrN06Vs}(WP);yU8 z6*-m}gKW20RQkt@vEk}Q{u$hI#$ep%$!J3n>OYNA`h`CNe`H#_o~QqGQgpGXs0fOR epr{DSI{pGKvjf>&IZX5b0000BO* literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/staticbitmap.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/staticbitmap.png new file mode 100644 index 0000000000000000000000000000000000000000..2e260f2738006934ef6c0097f06919c7af0978ad GIT binary patch literal 1178 zcmV;L1ZDe)P)A|1A;3j=oN85T2HXNSYu&U(Gr z4oXkS=pAO)e(y8y&3kWWSD}m`G^7mQ2@IvpZ{7Z7&%WB(+T$FD8?Px|c&DY(ZtvSB zMt4Iw+WR9spzT+oSS)eQ(UOBbJ@Ju|;m3$yU45{$^iO~P1faSuIEU-*iERtv{{G(k z&rH2=vU{5fBUb2EWZ`knuU%VNShz4U(r*~B?V32w-lSMG@7=q3{i_R_*4C^4QFyDX z57X(1v9bPG43xq!V45(^rirTdyYADO%)>5iqWj=8<_Iz1IPg4Ft1!*5>;8oE7-P=C zpiej((}PLubRg+iegb1C`N zt6$E{Or%mTD+&i}z^RK3IGk74*T4Vi=klu;uR!jdMDkH2xTb;g2Ep4*+BOIQW60%DF4w@mB$MU7zFt597+?XU9ss*B(KLH#$Os2N zbiMZN(xv(NffFa7>#(dwW>+K_lawMJ2c@2tjWzEDMGaY;13&3+Lw6e%l-@8Z&B8E3DPF@j zcg93wm{L=Sb%04(jl>JVb^TZ;yyJi|RI4bJu)Q6@j>1n*FD&1@o=AK*I2czHyN+}l zY|i<{2AA^VR(z8o20+(q8{AUezPOC3PxJ;A`}&gS&wYLC))x|MfT%xdWMkra$)WVS zuU&du%BIs!*!%oTXY+UNj8!Ul^e7U~InR3D^Yil|#i5~*#l=st&(|P@5HonatLw`j zd^mag*B;M<-&_JBU3V*;j(z^wD~oUam&MNbzzcX7?;F_Fb<3Hwn|gCG=i|SjwND|mc+G=xHejCsfI;VT`g4= z##wPSN)%P?bW&YckVIQov_#x#Sh05h+1c4n|M-62A8+QpzdkR+)de9hcR~&T0D0sk zyPx)Te*cg%68oQO!({D?WV8*^LqXMd~@ih)FG zth0n)O4S6?m>}vH@9yGm%_AJ<9`4FHXi@EP?o`tz-p|hq+9O?BRa`Kdkc7`kj9sqQ zzq5^3_Fe7NXWZ|TUP0)Udcsm9Ai8_hY5k%#>6J7x|NUAGYNP4KkEan$xD}K|dNUl|Sey~_p<07pNHWJ* z8DO)LKtSmqD29c5VYsjL%`tD_h0R1PTMf?RPS!v|<*ZDj%QN-0@G`(7h+f!+eg&x- z5(33iDGsxax;uv)VU^-Vs_F7WCzi*WkTW4H#nfvL^|0mic>KS&S`pyRSR zb+fO!-1hV8Ml_&VnNrQ-dOx(9V5QBU9JsDZ7@#_souBLNIj*X%=%;(Z*C#Quli%IA ziHQplS$nd|w=kfMuI%381YuFtpuqV8EE+%hx@wcGn~LD5W1@AjOlcz$e!i`7L_WVx zdq_(kLK|Y_vXarxAmS6RpSi(-ynr01Pb+V1(>ZV7erTil1M#xPd=7QSaNSLBrSZdwG5}KeEC5EunJ+Aur6$G zDM@l=j}5DL!=Ad*RelvpadLl|k*!S6r+X1&@W;fjnf|ajxQkTAA%zqUNjALOczkzT zK%6l?T)+iV5s`+xglRCAI&H4g>!xWQ&_UU5nkaqQtnAsz$mTh8KxH7H4|86tEhY#` z&szj)6Ed7z*dCQ17M_&=BJNIko+29oFZ!P-_Rn|K2{B`;2Xuy8nWy6g%tR1O85(%< zsMO;l%AT}j!kETydCm3$>F4zbCasQ{b>cb#C0z6;sB80dO3lqH@`W^uPJYrv#}?aL zyg~jytY^Frr@f(^`4-3f7H;RLAgc`w?tAmO+{L9Zb~&3B3QkTdd0;UrP{0KLgZuXr zz7zhpmCm0>kk0PGSNuUSOEYk_-55o%qF^LK-&};$`+YKL#DY9~`5PPapHinJ+TO0E zt7Gc5FnF6zZOCg?QZlMfYtp^^tNV^=i|Itq4R;6xx_(>KZmReAom{`D0E)jUS>-c^ zZ}q8Pjbz6ZRn7_2%XI8pRGo*HdTtDw6BY`Wth+k`5h{19I{Ha2GTnhzz5kYqARTsM UrGCKv`u;)#NP8E%1{-YZU)gfbng9R* literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/statictext.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/statictext.png new file mode 100644 index 0000000000000000000000000000000000000000..378f20231465d23ed52ea91a5173879375e17a02 GIT binary patch literal 654 zcmV;90&)F`P)h_YZs&VYn95?(tO2udquJC?XYi_&eY8o>pU zwUI2>@)_b4i|J_Y@iKH_kK?h8Tbf1@h)=VCd2inPKHiV$A!;~Z^xvDn+u|bclyQ-F z${+xH`=<9kMBWBxUcFbyQ)`#>3F#BkcQ>lIao4KDKex8Hsf}BNBDI)*L*sDLf0man zh7X?5h#D~&@8l6r={yYQ)V{h2HKInbVr(T)BkJ&m9(aEY5TC23h%QzP{1`Q&445Bd z!U0$y3kJXfk?_KyJThQKOcqE{egPH;+sb{TA>qb}$8~uoS2akJhLsd8J{nQi<>jPB zz&Q7LtPvA#36=rNGwC>|#uKcvsglc2>=!mFDsQiM}w>FLTq~_F{bH<;3 zDUiFX+1)7Hrl3SN9#R0H^Y6ivLk5rDkGyLpUo@h|Sx88qEYf;cl#}V)Lnc~gL&cA< zx|^+bG(}HX7Zi%NvYfC(~^<8c@f}!c^|Yvw{NsaMcoEvP4Yy*U-|Z z)^0hOFAa7)tg*?k06_hGh|1_uWd%{kgWGQ@90VPXqo#vRqZzh_+Uy}F986osK2&xi_@%07*qoM6N<$f)24NfdBvi literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/textctrl.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/textctrl.png new file mode 100644 index 0000000000000000000000000000000000000000..35df2017f186d99f43accf0209e93fee9fc19273 GIT binary patch literal 1969 zcmb7_dpy(s9>>4#<5#jxC%ODiQ|={qGW;@AY;zk*7a?~Wzx}4kU4^7yp)AW~5o4L< zPHk>QeptB_##*BxMwUy56Y}fqcg}e{&fn*c_xt^Me;&`r`;XV_bIJB}KfPB;T?qhy zy{;}utfauN_139D5 zbD;EqYv}+jl&5ZC>2&sBqzw2{X3jCsNYi%Is;b4wHnn$A@n9K?;K!DE_qlmo<;9RP zi_6Zk((zG{vY4ew?G=*E?QIihuXhGjZ+5PmJed^~ZqI71d|8{yR+E>L+J`uhB12Jt z=~!2Zn@Ur+#L_Fljq$6y)(cQN{};RO!auXvg^KgSitwDp^6RlqE(3cd>~mCg&F%7~ ziiJW<32n?b(@&q_P;fl$pd2aB%;-Qq35k4#!i+ki9-s`eSGu%LQxDt?mdVZ3iGvJ( znkkT5WRyRN;x=;e`vKc!O7n$tMjct=1V(K4GS`u_fk}P3G5B7e-a-mv7JhGKI9VFe zgZCqm%ma|8$>U6Bv}seV-tQW`L`nyPz6g&Kja>fHUrP_CH~i_|7`z%O_f^@zfG%w zR;JNF3&evASZ`Z}J;4pa^s}#S?n_qDaIjh39K084)xMCnyWRh3$ps9dT&u1&TAA*G z!{MfG>Db#Y;ComoFv;GJq>VlQZMKQU${Zd2agm|KCIf`HI5YFF;7T$!U+#nya7}9+ zX<(U~J3Tabtb|H^K4y-P={m}XTZqBMwq{#?O3?w{q(s{?GAewTXvsg$9pTnc2!H;K z%sX7EtKHI4G1jaj4Nv!Vx4E-VqX+)eL#cC}1`1#4#VOG}%nL0=#3xVcmd5ZYc(4i{Keq{K{8`0)BEc>n~% zoIdq*6Y~CwEb!`OrR=S`@O2!~w$&2TQ^FK$;YUZCyZkuo>t^tTtw!a+&h}sJ?UPo& zg~6l>H@=xzTc4AR`4P>ZLh2axsJR&{4OMsdSiu@6vXRTg}^l-WIfl?Fsix zBb6=QwA;k57|LZzw6i@j}BeOW$44t*S)h} z?cG$~^t6Lyn~X1?rXNM)aNec&tWv5@|0oye+c7_hwy`oec4-cnPkG( z`Gvl|UtL~vZV5Uj%}ckoJb=Kkc?R0vk+ME+Bp#xQHa3rR;H}5QBt2 zx$Vpf+R`wiCU?H~e%Qw0|(fu%zXRkfD~`fKak=_>--@I!YWZz z4HJ3LaBV<9qIPoTLQLNP^qyXv_mBvHEF=}1oQj7DWjr$K)Xt!~;SMXPO^=i5t@1_FJ2KS^NC6=z;an+!yrZt)BC(9=pRdaIwiLVMw`2t zcVEN3#+;qn{bDESM(y+(NbREFAUkYVS^CW7#TSD*EVlU!Yo3-hXq@gW`p!`cmnVjc zlAK+p^8bjNIFP$r-b%XDL-iWu^oDdCajgINW#~!RKwPtffy0$Y1X8$&0rAngUI%xY zHY(sNDMZ`78mEE-1LSW}o=rGBDlKBqn3|Kc=4Jg+V0<_9(o0~UWs$yr%dIe#5o-+TnlbiRsk;i+%bA5x59C<177Beh0cXO2Jx z_7LL2Y81~rRD6&AzN1aU%N5rjhGYXLZQ92!ep*q*&t$0Wk@DMhea+|=654bUEikZ3 zkd-h?5318zdwttU#?QDu% jxFt~?fr|N`1wUjyRJRrD+aQ}He=y+c?2fEO1m5@;lUlB4 literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/togglebutton.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/togglebutton.png new file mode 100644 index 0000000000000000000000000000000000000000..b77c07bcc8f3b9700903f42aef06e63810f4808d GIT binary patch literal 1947 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 L6~I-Z27&(zwUr4* literal 0 HcmV?d00001 diff --git a/docs/sphinx/_static/images/widgets/fullsize/wxmsw/wizard.wizardpagesimple.png b/docs/sphinx/_static/images/widgets/fullsize/wxmsw/wizard.wizardpagesimple.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f18a65b8a4edecc1bfe0b55027a48c7789e9a5 GIT binary patch literal 44921 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\/@\\]/g,'\\$&')); + if (!hash_element.length) + return; + if (hash_element.offset().top - $(window).scrollTop() < header_height) + window.scrollBy(0, -header_height); + } + + function check_hash_change() { + if (document.location.hash != current_hash) { + current_hash = document.location.hash; + if (current_hash) + window.setTimeout(on_hash_change, 100); + } + } + + check_hash_change(); + if ('onhashchange' in window) + $(window).bind('hashchange', check_hash_change); + else + $(window).scroll(check_hash_change); + + /* remove CSS trick for fixing the header problem */ + $('div.headerfix').removeClass('headerfix'); +}); diff --git a/docs/sphinx/_templates/gallery.html b/docs/sphinx/_templates/gallery.html new file mode 100644 index 00000000..26405dba --- /dev/null +++ b/docs/sphinx/_templates/gallery.html @@ -0,0 +1,196 @@ + + +{% extends "layout.html" %} +{% set title = "Thumbnail gallery" %} + + +{% block body %} + +

Click on any image to go to the relevant documentation

+
+The gallery is generated by randomly choosing a widget image between the 3 main +available ports of wxPython, namely wxMSW, wxGTK and wxMAC every +time the Phoenix documentation is built. + +
+
+
+
+
+ + +
+ +{% endblock %} diff --git a/docs/sphinx/_templates/indexsidebar.html b/docs/sphinx/_templates/indexsidebar.html new file mode 100644 index 00000000..5a476393 --- /dev/null +++ b/docs/sphinx/_templates/indexsidebar.html @@ -0,0 +1,15 @@ +

Download

+

Current version: 2.9.3.74

+

Questions? Suggestions?

+ +

Send your questions to the wxPython mailing list:

+
+ + +
+

You can also open an issue at the + tracker.

\ No newline at end of file diff --git a/docs/sphinx/_templates/layout.html b/docs/sphinx/_templates/layout.html new file mode 100644 index 00000000..eacf8cd3 --- /dev/null +++ b/docs/sphinx/_templates/layout.html @@ -0,0 +1,22 @@ + +{% extends "!layout.html" %} + +{%- block relbaritems %} +
  • {{ title }}
  • +{% endblock %} + +{% block rootrellink %} + +
  • +
  • Home
  • +
  • Search
  • +
  • Gallery
  • +
  • Documentation »
  • + +{% endblock %} + +{% block header %} +
    +Phoenix Logo +
    +{% endblock %} diff --git a/docs/sphinx/_templates/main.html b/docs/sphinx/_templates/main.html new file mode 100644 index 00000000..073961c5 --- /dev/null +++ b/docs/sphinx/_templates/main.html @@ -0,0 +1,84 @@ +{% extends "layout.html" %} +{% set title = 'Documentation' %} +{% block body %} +

    Welcome to wxPython (Phoenix)'s documentation!

    + +
    +

    SVN Revisions

    +

    “Built with wxWidgets & wxPython SVN revision |SVN|

    +
    + +

    + Welcome! This is the documentation for wxPython {{ release }}, last updated |TODAY|. +

    + +

    + This is the first, very-alpha release of this set of documentation. Documentation TODOs: + +

      +
    • Add the pure-Python classes, methods and functions (i.e., wx.CallAfter)
    • +
    • Find a way to link snippets of code to (almost) every class (maybe from the demo?)
    • +
    • Link the documentation to the wxPython Wiki (a web crawler will be needed)
    • +
    • Add wx.lib and the various other pure-Python third party libraries
    • +
    +

    +

    +
    + Phoenix is the code name of for the new version of wxPython. Robin Dunn called this the Phoenix project + because in the process of doing this project wxPython's implementation will be utterly destroyed and then reborn + in a new and marvelous way, much like the mythical Phoenix rising from the ashes of its former self. +

    + +

    + For wxPython many things about how the wrapper/bindings code is produced will be changing, and we'll also be + eliminating some other crud along the way. +

    + +

    + Some interesting documents about the current status or the Phoenix project and its development: +

    +
      +
    • Migration Guide: the Migration Guide will give you + some hints on how to modify your existing wxPython applications to be compatible with Phoenix +
    • +
    • TODO List: maily for developers, this document explains what + remains to be done in order to complete the Phoenix project
    • +
    • Project Goals: this external link + highlights the project goals and the driving forces behind it
    • +
    • Development Process: this external link + shows the main thoughts behind the project Phoenix implementation
    • +
    + +

    + The Phoenix documentation has been built automatically starting from XML files representing the + wxWidgets C++ documentation (generated using Doxygen). +

    + +

    + I developed a set of Python routines to translate this XML hell into + reStructuredText. Then, Sphinx + has been used to generate the final set of documentation for Phoenix. +

    +
    + +

    Documentation

    + + + +
    + + + + +

    +

    + +
    + + +{% endblock %} \ No newline at end of file diff --git a/docs/sphinx/availability.py b/docs/sphinx/availability.py new file mode 100644 index 00000000..d6d187b6 --- /dev/null +++ b/docs/sphinx/availability.py @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- + +""" +Allow "availability" admonitions to be inserted into your documentation. +Inclusion of availabilities can be switched of by a configuration variable. +The availabilitylist directive collects all availabilities of your project +and lists them along with a backlink to the original location. +""" + +from docutils import nodes + +from sphinx.locale import _ +from sphinx.environment import NoUri +from sphinx.util.nodes import set_source_info +from sphinx.util.compat import Directive, make_admonition + +# ----------------------------------------------------------------------- # +class availability_node(nodes.Admonition, nodes.Element): pass + +# ----------------------------------------------------------------------- # +class availabilitylist(nodes.General, nodes.Element): pass + +# ----------------------------------------------------------------------- # + + +class Availability(Directive): + """ + An "availability" entry, displayed (if configured) in the form of an admonition. + """ + + has_content = True + required_arguments = 0 + optional_arguments = 0 + final_argument_whitespace = False + option_spec = {} + + + # ----------------------------------------------------------------------- # + + def run(self): + env = self.state.document.settings.env + targetid = 'index-%s' % env.new_serialno('index') + targetnode = nodes.target('', '', ids=[targetid]) + + ad = make_admonition(availability_node, self.name, [_('Availability')], self.options, + self.content, self.lineno, self.content_offset, + self.block_text, self.state, self.state_machine) + set_source_info(self, ad[0]) + return [targetnode] + ad + + + +# ----------------------------------------------------------------------- # + +def process_availabilities(app, doctree): + # collect all availabilities in the environment + # this is not done in the directive itself because it some transformations + # must have already been run, e.g. substitutions + env = app.builder.env + if not hasattr(env, 'availability_all_availabilities'): + env.availability_all_availabilities = [] + for node in doctree.traverse(availability_node): + try: + targetnode = node.parent[node.parent.index(node) - 1] + if not isinstance(targetnode, nodes.target): + raise IndexError + except IndexError: + targetnode = None + env.availability_all_availabilities.append({ + 'docname': env.docname, + 'source': node.source or env.doc2path(env.docname), + 'lineno': node.line, + 'availability': node.deepcopy(), + 'target': targetnode, + }) + + +# ----------------------------------------------------------------------- # + +class AvailabilityList(Directive): + """ + A list of all availability entries. + """ + + has_content = False + required_arguments = 0 + optional_arguments = 0 + final_argument_whitespace = False + option_spec = {} + + + # ----------------------------------------------------------------------- # + + def run(self): + # Simply insert an empty availabilitylist node which will be replaced later + # when process_availability_nodes is called + return [availabilitylist('')] + + +# ----------------------------------------------------------------------- # + +def process_availability_nodes(app, doctree, fromdocname): + if not app.config['availability_include_availabilities']: + for node in doctree.traverse(availability_node): + node.parent.remove(node) + + # Replace all availabilitylist nodes with a list of the collected availabilities. + # Augment each availability with a backlink to the original location. + env = app.builder.env + + if not hasattr(env, 'availability_all_availabilities'): + env.availability_all_availabilities = [] + + for node in doctree.traverse(availabilitylist): + if not app.config['availability_include_availabilities']: + node.replace_self([]) + continue + + content = [] + + for availability_info in env.availability_all_availabilities: + para = nodes.paragraph(classes=['availability-source']) + description = _('(The <> is located in ' + ' %s, line %d.)') % \ + (availability_info['source'], availability_info['lineno']) + desc1 = description[:description.find('<<')] + desc2 = description[description.find('>>')+2:] + para += nodes.Text(desc1, desc1) + + # Create a reference + newnode = nodes.reference('', '', internal=True) + innernode = nodes.emphasis(_('original entry'), _('original entry')) + try: + newnode['refuri'] = app.builder.get_relative_uri( + fromdocname, availability_info['docname']) + newnode['refuri'] += '#' + availability_info['target']['refid'] + except NoUri: + # ignore if no URI can be determined, e.g. for LaTeX output + pass + newnode.append(innernode) + para += newnode + para += nodes.Text(desc2, desc2) + + # (Recursively) resolve references in the availability content + availability_entry = availability_info['availability'] + env.resolve_references(availability_entry, availability_info['docname'], + app.builder) + + # Insert into the availabilitylist + content.append(availability_entry) + content.append(para) + + node.replace_self(content) + + +# ----------------------------------------------------------------------- # + +def purge_availabilities(app, env, docname): + if not hasattr(env, 'availability_all_availabilities'): + return + env.availability_all_availabilities = [availability for availability in env.availability_all_availabilities + if availability['docname'] != docname] + + +# ----------------------------------------------------------------------- # + +def visit_availability_node(self, node): + self.visit_admonition(node) + + +# ----------------------------------------------------------------------- # + +def depart_availability_node(self, node): + self.depart_admonition(node) + + +# ----------------------------------------------------------------------- # + +def setup(app): + app.add_javascript('javascript/header.js') + app.add_config_value('availability_include_availabilities', False, False) + + app.add_node(availabilitylist) + app.add_node(availability_node, + html=(visit_availability_node, depart_availability_node), + latex=(visit_availability_node, depart_availability_node), + text=(visit_availability_node, depart_availability_node), + man=(visit_availability_node, depart_availability_node), + texinfo=(visit_availability_node, depart_availability_node)) + + app.add_directive('availability', Availability) + app.add_directive('availabilitylist', AvailabilityList) + app.connect('doctree-read', process_availabilities) + app.connect('doctree-resolved', process_availability_nodes) + app.connect('env-purge-doc', purge_availabilities) + + +# ----------------------------------------------------------------------- # diff --git a/docs/sphinx/conf.py b/docs/sphinx/conf.py new file mode 100644 index 00000000..9a627039 --- /dev/null +++ b/docs/sphinx/conf.py @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- +# +# Phoenix documentation build configuration file, created by +# sphinx-quickstart on Mon Jun 22 09:32:57 2009. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.append(os.path.abspath('.')) +sys.path.append('..') + +# -- General configuration ----------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.todo', 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', 'sphinx.ext.coverage', + 'availability'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.txt' + +todo_include_todos = True +todo_all_todos = True + +availability_include_availabilities = True +availability_all_availabilities = True + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'wxPython (Phoenix)' +copyright = u'2011, Andrea Gavana' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '2.9' +# The full version, including alpha/beta/rc tags. +release = '2.9.3.74 (Phoenix)' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%d %B %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +default_role = 'autolink' + +# If true, '()' will be appended to :func: etc. cross-reference text. +add_function_parentheses = False + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +add_module_names = False + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +show_authors = True + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = {'stickysidebar': 'true'} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +html_short_title = 'Phoenix Docs' + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = '_static/images/sphinxdocs/phoenix_main.png' + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +html_favicon = '_static/images/sphinxdocs/phoenix_small.ico' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +html_style = 'css/phoenix.css' + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +html_sidebars = {'index': 'indexsidebar.html'} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +html_additional_pages = {'gallery': 'gallery.html', 'main': 'main.html'} + +# If false, no module index is generated. +html_use_modindex = True + +# If false, no index is generated. +html_use_index = True + +# If true, the index is split into individual pages for each letter. +html_split_index = True + +# If true, links to the reST sources are added to the pages. +html_show_sourcelink = False + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'PhoenixDocs' + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'PhoenixDocs.tex', u'wxPython (Phoenix) Documentation', + u'Andrea Gavana', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True + +# -- Options for PDF output -------------------------------------------------- +# Grouping the document tree into PDF files. List of tuples +# (source start file, target name, title, author, options). +# +# If there is more than one author, separate them with \\. +# For example: r'Guido van Rossum\\Fred L. Drake, Jr., editor' +# +# The options element is a dictionary that lets you override +# this config per-document. +# For example, +# ('index', u'MyProject', u'My Project', u'Author Name', +# dict(pdf_compressed = True)) +# would mean that specific document would be compressed +# regardless of the global pdf_compressed setting. +pdf_documents = [('index', u'PhoenixDocs', u'wxPython (Phoenix) Documentation', u'Andrea Gavana'),] + +# A comma-separated list of custom stylesheets. Example: +# pdf_stylesheets = ['sphinx', 'kerning', 'a4', "C:\\AGW\\agw\\fonts\\sphinx.json"] +# Create a compressed PDF +# Use True/False or 1/0 +# Example: compressed=True +#pdf_compressed = False +# A colon-separated list of folders to search for fonts. Example: +#pdf_font_path = ['E:\\AGW\\agw\\fonts', 'C:\\Windows\\Fonts'] +# Language to be used for hyphenation support +#pdf_language = "en_US" +# Mode for literal blocks wider than the frame. Can be +# overflow, shrink or truncate +#pdf_fit_mode = "shrink" +# Section level that forces a break page. +# For example: 1 means top-level sections start in a new page +# 0 means disabled +#pdf_break_level = 0 +# When a section starts in a new page, force it to be 'even', 'odd', +# or just use 'any' +#pdf_breakside = 'any' +# Insert footnotes where they are defined instead of +# at the end. +#pdf_inline_footnotes = True +# verbosity level. 0 1 or 2 +pdf_verbosity = 2 +# If false, no index is generated. +#pdf_use_index = True +# If false, no modindex is generated. +#pdf_use_modindex = True +# If false, no coverpage is generated. +#pdf_use_coverpage = True +# Documents to append as an appendix to all manuals. +#pdf_appendices = [] +# Enable experimental feature to split table cells. Use it +# if you get "DelayedTable too big" errors +pdf_splittables = True + +##def process_docstring(app, what, name, obj, options, lines): +## +## if what == "data": +## +## fid = open("autodata_docstrings.pkl", "rb") +## autodata_dict = cPickle.load(fid) +## fid.close() +## +## if name in autodata_dict: +## lines[:] = [autodata_dict[name].strip()] +## +## +##def setup(app): +## app.connect('autodoc-process-docstring', process_docstring) diff --git a/docs/sphinx/make.bat b/docs/sphinx/make.bat new file mode 100644 index 00000000..98ae5c5f --- /dev/null +++ b/docs/sphinx/make.bat @@ -0,0 +1,176 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\wxPythonPhoenix.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\wxPythonPhoenix.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "pdf" ( + %SPHINXBUILD% -b pdf %ALLSPHINXOPTS% %BUILDDIR%/pdf + echo. + echo.Build finished. The PDF files are in %BUILDDIR%/pdf + goto end + ) +:end diff --git a/docs/sphinx/rest_substitutions/overviews/app_overview.rst b/docs/sphinx/rest_substitutions/overviews/app_overview.rst new file mode 100644 index 00000000..5555a4ae --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/app_overview.rst @@ -0,0 +1,58 @@ +.. include:: headings.inc + + +.. _app overview: + +================================= +|phoenix_title| **App Overview** +================================= + + +Introduction +------------ + +A wxPython application does not have a main procedure; the equivalent is the :meth:`AppConsole.OnInit` member defined for a class derived from :ref:`App`. + +`OnInit` will usually create a top window as a bare minimum. Unlike in earlier versions of wxPython, `OnInit` does not return a frame. +Instead it returns a boolean value which indicates whether processing should continue (``True``) or not (``False``). + +An application closes by destroying all windows. Because all frames must be destroyed for the application to exit, it is advisable to use +parent frames wherever possible when creating new frames, so that deleting the top level frame will automatically delete child frames. +The alternative is to explicitly delete child frames in the top-level frame's :ref:`CloseEvent` handler. + +In emergencies the :func:`Exit` function can be called to kill the application however normally the application shuts down automatically, +see :ref:`Application Shutdown `. + +An example of defining an application follows:: + + + class DerivedApp(wx.App): + + def OnInit(self): + + the_frame = wx.Frame(None, -1) + + # Other initialization code... + + the_frame.Show(True) + + return True + + + +.. _application shutdown: + +Application Shutdown +-------------------- + +The application normally shuts down when the last of its top level windows is closed. This is normally the expected behaviour and means +that it is enough to call :meth:`Window.Close` () in response to the "Exit" menu command if your program has a single top level window. +If this behaviour is not desirable :meth:`PyApp.SetExitOnFrameDelete` can be called to change it. + +.. note:: Note that such logic doesn't apply for the windows shown before the program enters the main loop: in other words, you can + safely show a dialog from :meth:`AppConsole.OnInit` and not be afraid that your application terminates when this dialog -- which is the last + top level window for the moment -- is closed. + + +Another aspect of the application shutdown is :meth:`AppConsole.OnExit` which is called when the application exits but before wxPython cleans up +its internal structures. diff --git a/docs/sphinx/rest_substitutions/overviews/bitmap_overview.rst b/docs/sphinx/rest_substitutions/overviews/bitmap_overview.rst new file mode 100644 index 00000000..6c27991b --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/bitmap_overview.rst @@ -0,0 +1,103 @@ +.. include:: headings.inc + + +.. _bitmaps and icons: + +=============================================== +|phoenix_title| **Bitmaps and Icons** +=============================================== + + +The :ref:`Bitmap` class encapsulates the concept of a platform-dependent bitmap, either monochrome or colour. +Platform-specific methods for creating a :ref:`Bitmap` object from an existing file are catered for. + +A bitmap created dynamically or loaded from a file can be selected into a memory device context (instance of +:ref:`MemoryDC`). This enables the bitmap to be copied to a window or memory device context using :meth:`DC.Blit` (), +or to be used as a drawing surface. + +.. seealso:: :ref:`MemoryDC` for an example of drawing onto a bitmap. + + +All wxPython platforms support XPMs for small bitmaps and icons. + + + +.. _supported bitmap file formats: + +Supported Bitmap File Formats +----------------------------- + +The following lists the formats handled on different platforms. Note that missing or partially-implemented +formats are automatically supplemented by using :ref:`Image` to load the data, and then converting it to :ref:`Bitmap` +form. Note that using :ref:`Image` is the preferred way to load images in wxPython, with the exception of resources +(XPM-files or native Windows resources). + + +Bitmap +^^^^^^ + +Under Windows, :ref:`Bitmap` may load the following formats: + +- Windows bitmap resource (``BITMAP_TYPE_BMP_RESOURCE``) +- Windows bitmap file (``BITMAP_TYPE_BMP``) +- XPM data and file (``BITMAP_TYPE_XPM``) +- All formats that are supported by the :ref:`Image` class. + + +Under wxGTK, :ref:`Bitmap` may load the following formats: + +- XPM data and file (``BITMAP_TYPE_XPM``) +- All formats that are supported by the :ref:`Image` class. + + +Under wxMotif and wxX11, :ref:`Bitmap` may load the following formats: + +- XBM data and file (``BITMAP_TYPE_XBM``) +- XPM data and file (``BITMAP_TYPE_XPM``) +- All formats that are supported by the :ref:`Image` class. + + +Icon +^^^^ + +Under Windows, :ref:`Icon` may load the following formats: + +- Windows icon resource (``BITMAP_TYPE_ICO_RESOURCE``) +- Windows icon file (``BITMAP_TYPE_ICO``) +- XPM data and file (``BITMAP_TYPE_XPM``) + + +Under wxGTK, :ref:`Icon` may load the following formats: + +- XPM data and file (``BITMAP_TYPE_XPM``) +- All formats that are supported by the :ref:`Image` class. + + +Under wxMotif and wxX11, :ref:`Icon` may load the following formats: + +- XBM data and file (``BITMAP_TYPE_XBM``) +- XPM data and file (``BITMAP_TYPE_XPM``) +- All formats that are supported by the :ref:`Image` class. + + +Cursor +^^^^^^ + +Under Windows, :ref:`Cursor` may load the following formats: + +- Windows cursor resource (``BITMAP_TYPE_CUR_RESOURCE``) +- Windows cursor file (``BITMAP_TYPE_CUR``) +- Windows icon file (``BITMAP_TYPE_ICO``) +- Windows bitmap file (``BITMAP_TYPE_BMP``) + + +Under wxGTK, :ref:`Cursor` may load the following formats (in addition to stock cursors): + +- None (stock cursors only). + + +Under wxMotif and wxX11, :ref:`Cursor` may load the following formats: + +- XBM data and file (``BITMAP_TYPE_XBM``) + + diff --git a/docs/sphinx/rest_substitutions/overviews/bookctrl_overview.rst b/docs/sphinx/rest_substitutions/overviews/bookctrl_overview.rst new file mode 100644 index 00000000..b8de5b28 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/bookctrl_overview.rst @@ -0,0 +1,48 @@ +.. include:: headings.inc + + +.. _bookctrl overview: + +=============================================== +|phoenix_title| **BookCtrl Overview** +=============================================== + + +Introduction +------------ + +A book control is a convenient way of displaying multiple pages of information, displayed one page at a time. +wxPython has five variants of this control: + +- :ref:`Choicebook`: controlled by a :ref:`Choice` +- :ref:`Listbook`: controlled by a :ref:`ListCtrl` +- :ref:`Notebook`: uses a row of tabs +- :ref:`Treebook`: controlled by a :ref:`TreeCtrl` +- :ref:`Toolbook`: controlled by a :ref:`ToolBar` + + + +Best Book +--------- + +:ref:`BookCtrl` is mapped to the class best suited for a given platform. Currently it provides :ref:`Choicebook` +for smartphones equipped with WinCE, and :ref:`Notebook` for all other platforms. The mapping consists of: + +=============================================== ================================================== +`BookCtrl` `Choicebook` or `Notebook` +=============================================== ================================================== +``wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGED`` ``wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGED`` or ``wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED`` +``wxEVT_COMMAND_BOOKCTRL_PAGE_CHANGING`` ``wxEVT_COMMAND_CHOICEBOOK_PAGE_CHANGING`` or ``wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING`` +EVT_BOOKCTRL_PAGE_CHANGED EVT_CHOICEBOOK_PAGE_CHANGED or EVT_NOTEBOOK_PAGE_CHANGED +EVT_BOOKCTRL_PAGE_CHANGING EVT_CHOICEBOOK_PAGE_CHANGING or EVT_NOTEBOOK_PAGE_CHANGING +=============================================== ================================================== + + +For orientation of the book controller, use following flags in style: + +- ``BK_TOP``: controller above pages +- ``BK_BOTTOM``: controller below pages +- ``BK_LEFT``: controller on the left +- ``BK_RIGHT``: controller on the right +- ``BK_DEFAULT``: native controller placement + diff --git a/docs/sphinx/rest_substitutions/overviews/common_dialogs_overview.rst b/docs/sphinx/rest_substitutions/overviews/common_dialogs_overview.rst new file mode 100644 index 00000000..09a33c72 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/common_dialogs_overview.rst @@ -0,0 +1,226 @@ +.. include:: headings.inc + + +.. _common dialogs: + +=============================================== +|phoenix_title| **Common Dialogs** +=============================================== + + +Common dialog classes and functions encapsulate commonly-needed dialog box requirements. They are all 'modal', +grabbing the flow of control until the user dismisses the dialog, to make them easy to use within an application. + +Some dialogs have both platform-dependent and platform-independent implementations, so that if underlying windowing +systems do not provide the required functionality, the generic classes and functions can stand in. For example, +under MS Windows, :ref:`ColourDialog` uses the standard colour selector. There is also an equivalent called +`GenericColourDialog` for other platforms, and a macro defines :ref:`ColourDialog` to be the same as +`GenericColourDialog` on non-MS Windows platforms. However, under MS Windows, the generic dialog can also be used, +for testing or other purposes. + + + +.. _colourdialog overview: + +ColourDialog Overview +--------------------- + +The :ref:`ColourDialog` presents a colour selector to the user, and returns with colour information. + + +The MS Windows Colour Selector +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Under Windows, the native colour selector common dialog is used. This presents a dialog box with three main regions: +at the top left, a palette of 48 commonly-used colours is shown. Under this, there is a palette of 16 'custom colours' +which can be set by the application if desired. Additionally, the user may open up the dialog box to show a right-hand +panel containing controls to select a precise colour, and add it to the custom colour palette. + + +The Generic Colour Selector +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Under non-MS Windows platforms, the colour selector is a simulation of most of the features of the MS Windows selector. +Two palettes of 48 standard and 16 custom colours are presented, with the right-hand area containing three sliders for +the user to select a colour from red, green and blue components. This colour may be added to the custom colour palette, +and will replace either the currently selected custom colour, or the first one in the palette if none is selected. +The RGB colour sliders are not optional in the generic colour selector. The generic colour selector is also available +under MS Windows; use the name `GenericColourDialog`. + + +Example +^^^^^^^ + +Here is an example of using :ref:`ColourDialog`, which sets various parameters of a :ref:`ColourData` object, including +a grey scale for the custom colours. If the user did not cancel the dialog, the application retrieves the selected colour +and uses it to set the background of a window:: + + data = wx.ColourData() + data.SetChooseFull(True) + + for i in xrange(16): + colour = wx.Colour(i*16, i*16, i*16) + data.SetCustomColour(i, colour) + + + dialog = wx.ColourDialog(self, data) + + if dialog.ShowModal() == wx.ID_OK: + + retData = dialog.GetColourData() + col = retData.GetColour() + brush = wx.Brush(col, wx.SOLID) + myWindow.SetBackground(brush) + myWindow.Clear() + myWindow.Refresh() + + + + +.. _fontdialog overview: + +FontDialog Overview +------------------- + + +The :ref:`FontDialog` presents a font selector to the user, and returns with font and colour information. + + +The MS Windows Font Selector +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Under Windows, the native font selector common dialog is used. This presents a dialog box with controls for font name, +point size, style, weight, underlining, strikeout and text foreground colour. A sample of the font is shown on a white +area of the dialog box. Note that in the translation from full MS Windows fonts to wxPython font conventions, strikeout +is ignored and a font family (such as Swiss or Modern) is deduced from the actual font name (such as Arial or Courier). + + +The Generic Font Selector +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Under non-MS Windows platforms, the font selector is simpler. Controls for font family, point size, style, weight, +underlining and text foreground colour are provided, and a sample is shown upon a white background. The generic font +selector is also available under MS Windows; use the name `GenericFontDialog`. + + +Example +^^^^^^^ + +Here is an example of using :ref:`FontDialog`. The application uses the returned font and colour for drawing text on a canvas:: + + data = wx.FontData() + data.SetInitialFont(canvasFont) + data.SetColour(canvasTextColour) + + dialog = wx.FontDialog(self, data) + + if dialog.ShowModal() == wx.ID_OK: + + retData = dialog.GetFontData() + canvasFont = retData.GetChosenFont() + canvasTextColour = retData.GetColour() + myWindow.Refresh() + + + + +.. _printdialog overview: + +PrintDialog Overview +-------------------- + + +This class represents the print and print setup common dialogs. You may obtain a :ref:`PrinterDC` device context from a +successfully dismissed print dialog. + +.. seealso:: :ref:`Printing Framework Overview ` for an example. + + + +.. _filedialog overview: + +FileDialog Overview +------------------- + + +Pops up a file selector box. On Windows and GTK 2.4+, this is the common file selector dialog. In X, this is a file +selector box with somewhat less functionality. The path and filename are distinct elements of a full file pathname. + +If path is "", the current directory will be used. If filename is "", no default filename will be supplied. +The wildcard determines what files are displayed in the file selector, and file extension supplies a type extension +for the required filename. Flags may be a combination of ``FD_OPEN``, ``FD_SAVE``, ``FD_OVERWRITE_PROMPT``, +``FD_HIDE_READONLY``, ``FD_FILE_MUST_EXIST``, ``FD_MULTIPLE``, ``FD_CHANGE_DIR`` or 0. + +Both the X and Windows versions implement a wildcard filter. Typing a filename containing wildcards ``(*, ?)`` in the +filename text item, and clicking on Ok, will result in only those files matching the pattern being displayed. In the +X version, supplying no default name will result in the wildcard filter being inserted in the filename text item; +the filter is ignored if a default name is supplied. + +The wildcard may be a specification for multiple types of file with a description for each, such as:: + + wildcard = "BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif" + + + +.. _dirdialog overview: + +DirDialog Overview +------------------- + + +This dialog shows a directory selector dialog, allowing the user to select a single directory. + + + +.. _textentrydialog overview: + +TextEntryDialog Overview +------------------------ + + +This is a dialog with a text entry field. The value that the user entered is obtained using :meth:`TextEntryDialog.GetValue` (). + + + +.. _passwordentrydialog overview: + +PasswordEntryDialog Overview +---------------------------- + + +This is a dialog with a password entry field. The value that the user entered is obtained using :meth:`TextEntryDialog.GetValue` (). + + + +.. _messagedialog overview: + +MessageDialog Overview +---------------------- + + +This dialog shows a message, plus buttons that can be chosen from ``OK``, ``Cancel``, ``Yes``, and ``No``. Under Windows, an +optional icon can be shown, such as an exclamation mark or question mark. + +The return value of :meth:`MessageDialog.ShowModal` () indicates which button the user pressed. + + + +.. _singlechoicedialog overview: + +SingleChoiceDialog Overview +--------------------------- + + +This dialog shows a list of choices, plus ``OK`` and (optionally) ``Cancel``. The user can select one of them. The selection +can be obtained from the dialog as an index, a string or client data. + + + +.. _multichoicedialog overview: + +MultiChoiceDialog Overview +--------------------------- + + +This dialog shows a list of choices, plus ``OK`` and (optionally) ``Cancel``. The user can select one or more of them. + diff --git a/docs/sphinx/rest_substitutions/overviews/config_overview.rst b/docs/sphinx/rest_substitutions/overviews/config_overview.rst new file mode 100644 index 00000000..8eaf07a9 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/config_overview.rst @@ -0,0 +1,44 @@ +.. include:: headings.inc + + +.. _config overview: + +================================================= +|phoenix_title| **Config Overview** +================================================= + + +This overview briefly describes what the config classes are and what they are for. All the details about +how to use them may be found in the description of the :ref:`ConfigBase` class and the documentation of +the file, registry and INI file based implementations mentions all the features/limitations specific to +each one of these versions. + +The config classes provide a way to store some application configuration information. They were especially +designed for this usage and, although may probably be used for many other things as well, should be limited +to it. It means that this information should be: + +- Typed, i.e. strings or numbers for the moment. You cannot store binary data, for example. +- Small. For instance, it is not recommended to use the Windows registry for amounts of data more than a couple of kilobytes. +- Not performance critical, neither from speed nor from a memory consumption point of view. + + +On the other hand, the features provided make them very useful for storing all kinds of small to medium volumes +of hierarchically-organized, heterogeneous data. In short, this is a place where you can conveniently stuff +all your data (numbers and strings) organizing it in a tree where you use the filesystem-like paths to +specify the location of a piece of data. In particular, these classes were designed to be as easy to use as possible. + +From another point of view, they provide an interface which hides the differences between the Windows registry +and the standard Unix text format configuration files. Other (future) implementations of :ref:`ConfigBase` might +also understand GTK resource files or their analogues on the KDE side. + +In any case, each implementation of :ref:`ConfigBase` does its best to make the data look the same way everywhere. +Due to limitations of the underlying physical storage, it may not implement 100% of the base class functionality. + +There are groups of entries and the entries themselves. Each entry contains either a string or a number (or a +boolean value; support for other types of data such as dates or timestamps is planned) and is identified by +the full path to it: something like ``/MyApp/UserPreferences/Colors/Foreground``. + +The previous elements in the path are the group names, and each name may contain an arbitrary number of entries and subgroups. + +The path components are always separated with a slash, even though some implementations use the backslash internally. +Further details (including how to read/write these entries) may be found in the documentation for :ref:`ConfigBase`. diff --git a/docs/sphinx/rest_substitutions/overviews/dc_overview.rst b/docs/sphinx/rest_substitutions/overviews/dc_overview.rst new file mode 100644 index 00000000..5f45f494 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/dc_overview.rst @@ -0,0 +1,38 @@ +.. include:: headings.inc + + +.. _device contexts: + +=============================================== +|phoenix_title| **Device Contexts** +=============================================== + + +A :ref:`DC` is a device context onto which graphics and text can be drawn. The device context is intended to represent +a number of output devices in a generic way, with the same API being used throughout. + +Some device contexts are created temporarily in order to draw on a window. This is true of :ref:`ScreenDC`, :ref:`ClientDC`, +:ref:`PaintDC`, and :ref:`WindowDC`. The following describes the differences between these device contexts and when you should use them. + +- :ref:`ScreenDC`. Use this to paint on the screen, as opposed to an individual window. +- :ref:`ClientDC`. Use this to paint on the client area of window (the part without borders and other decorations), but do not use + it from within an :ref:`PaintEvent`. +- :ref:`PaintDC`. Use this to paint on the client area of a window, but only from within a :ref:`PaintEvent`. +- :ref:`WindowDC`. Use this to paint on the whole area of a window, including decorations. This may not be available on non-Windows platforms. + + +To use a client, paint or window device context, create an object on the stack with the window as argument, for example:: + + def OnMyCmd(self, event): + + dc = wx.ClientDC(window) + DrawMyPicture(dc) + + + +Try to write code so it is parameterised by :ref:`DC` - if you do this, the same piece of code may write to a number of different devices, +by passing a different device context. This doesn't work for everything (for example not all device contexts support bitmap drawing) +but will work most of the time. + + + diff --git a/docs/sphinx/rest_substitutions/overviews/dialog_overview.rst b/docs/sphinx/rest_substitutions/overviews/dialog_overview.rst new file mode 100644 index 00000000..0af1caa9 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/dialog_overview.rst @@ -0,0 +1,101 @@ +.. include:: headings.inc + + +.. _dialog overview: + +==================================== +|phoenix_title| **Dialog Overview** +==================================== + + +A dialog box is similar to a panel, in that it is a window which can be used for placing controls, with the following exceptions: + +- A surrounding frame is implicitly created. +- Extra functionality is automatically given to the dialog box, such as tabbing between items (currently Windows only). +- If the dialog box is `modal`, the calling program is blocked until the dialog box is dismissed. + + +.. seealso:: :ref:`TopLevelWindow` and :ref:`Window` for inherited member functions. Validation of data in controls is covered in + :ref:`Validator Overview `. + + +.. _automatic scrolling dialogs: + +Automatic scrolling dialogs +--------------------------- + +As an ever greater variety of mobile hardware comes to market, it becomes more imperative for wxPython applications to adapt to +these platforms without putting too much burden on the programmer. One area where wxPython can help is in adapting dialogs for +the lower resolution screens that inevitably accompany a smaller form factor. :ref:`Dialog` therefore supplies a global +:ref:`DialogLayoutAdapter` class that implements automatic scrolling adaptation for most sizer-based custom dialogs. + +Many applications should therefore be able to adapt to small displays with little or no work, as far as dialogs are concerned. +By default this adaptation is off. To switch scrolling adaptation on globally in your application, call the static function +:meth:`Dialog.EnableLayoutAdaptation` passing ``True``. You can also adjust adaptation on a per-dialog basis by calling +:meth:`Dialog.SetLayoutAdaptationMode` with one of ``DIALOG_ADAPTATION_MODE_DEFAULT`` (use the global setting), ``DIALOG_ADAPTATION_MODE_ENABLED`` +or ``DIALOG_ADAPTATION_MODE_DISABLED``. + +The last two modes override the global adaptation setting. With adaptation enabled, if the display size is too small for the dialog, +wxPython (or rather the standard adapter class :ref:`StandardDialogLayoutAdapter`) will make part of the dialog scrolling, leaving +standard buttons in a non-scrolling part at the bottom of the dialog. This is done as follows, in :meth:`DialogLayoutAdapter.DoLayoutAdaptation` +called from within :meth:`Dialog.Show` or :meth:`Dialog.ShowModal`: + +- If :meth:`Dialog.GetContentWindow` returns a window derived from :ref:`BookCtrlBase`, the pages are made scrollable and no other adaptation is done. +- wxPython looks for a :ref:`StdDialogButtonSizer` and uses it for the non-scrolling part. +- If that search failed, wxPython looks for a horizontal :ref:`BoxSizer` with one or more standard buttons, with identifiers such as ``ID_OK`` and ``ID_CANCEL``. +- If that search failed too, wxPython finds 'loose' standard buttons (in any kind of sizer) and adds them to a :ref:`StdDialogButtonSizer`. + If no standard buttons were found, the whole dialog content will scroll. +- All the children apart from standard buttons are reparented onto a new :ref:`ScrolledWindow` object, using the old top-level sizer + for the scrolled window and creating a new top-level sizer to lay out the scrolled window and standard button sizer. + + +.. _layout adaptation code: + +Customising scrolling adaptation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to switching adaptation on and off globally and per dialog, you can choose how aggressively wxPython will search +for standard buttons by setting :meth:`Dialog.SetLayoutAdaptationLevel`. By default, all the steps described above will be +performed but by setting the level to 1, for example, you can choose to only look for :ref:`StdDialogButtonSizer`. + +You can use :meth:`Dialog.AddMainButtonId` to add identifiers for buttons that should also be treated as standard buttons for the non-scrolling area. + +You can derive your own class from :ref:`DialogLayoutAdapter` or :ref:`StandardDialogLayoutAdapter` and call :meth:`Dialog.SetLayoutAdapter`, +deleting the old object that this function returns. Override the functions `CanDoLayoutAdaptation` and `DoLayoutAdaptation` to test +for adaptation applicability and perform the adaptation. + +You can also override :meth:`Dialog.CanDoLayoutAdaptation` and :meth:`Dialog.DoLayoutAdaptation` in a class derived from :ref:`Dialog`. + + +Situations where automatic scrolling adaptation may fail +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Because adaptation rearranges your sizer and window hierarchy, it is not fool-proof, and may fail in the following situations: + +- The dialog doesn't use sizers. +- The dialog implementation makes assumptions about the window hierarchy, for example getting the parent of a control and casting to the dialog class. +- The dialog does custom painting and/or event handling not handled by the scrolled window. If this problem can be solved globally, + you can derive a new adapter class from :ref:`StandardDialogLayoutAdapter` and override its `CreateScrolledWindow` function + to return an instance of your own class. +- The dialog has unusual layout, for example a vertical sizer containing a mixture of standard buttons and other controls. +- The dialog makes assumptions about the sizer hierarchy, for example to show or hide children of the top-level sizer. However, + the original sizer hierarchy will still hold until `Show` or `ShowModal` is called. + + +You can help make sure that your dialogs will continue to function after adaptation by: + +- Avoiding the above situations and assumptions; +- Using :ref:`StdDialogButtonSizer`; +- Only making assumptions about hierarchy immediately after the dialog is created; +- Using an intermediate sizer under the main sizer, a false top-level sizer that can be relied on to exist for the purposes of manipulating child sizers and windows; +- Overriding :meth:`Dialog.GetContentWindow` to return a book control if your dialog implements pages: wxPython will then only make the pages scrollable. + + +PropertySheetDialog and Wizard +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Adaptation for :ref:`PropertySheetDialog` is always done by simply making the pages scrollable, since :meth:`Dialog.GetContentWindow` returns the dialog's +book control and this is handled by the standard layout adapter. + +:ref:`Wizard` uses its own `CanDoLayoutAdaptation` and `DoLayoutAdaptation` functions rather than the global adapter: again, only the wizard pages are made scrollable. + diff --git a/docs/sphinx/rest_substitutions/overviews/dnd_overview.rst b/docs/sphinx/rest_substitutions/overviews/dnd_overview.rst new file mode 100644 index 00000000..c144b1a1 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/dnd_overview.rst @@ -0,0 +1,70 @@ +.. include:: headings.inc + + +.. _drag and drop overview: + +================================================= +|phoenix_title| **Drag and Drop Overview** +================================================= + + +It may be noted that data transfer to and from the clipboard is quite similar to data transfer +with drag and drop and the code to implement these two types is almost the same. In particular, +both data transfer mechanisms store data in some kind of :ref:`DataObject` and identify its format(s) using +the :ref:`DataFormat` class. + +To be a `drag` source, i.e. to provide the data which may be dragged by the user elsewhere, you +should implement the following steps: + +- **Preparation**: First of all, a data object must be created and initialized with the data you wish to drag. For example:: + + my_data = wx.TextDataObject("This text will be dragged.") + + + +- **Drag start**: To start the dragging process (typically in response to a mouse click) you must call + :meth:`DropSource.DoDragDrop` like this:: + + dragSource = wx.DropSource(self) + dragSource.SetData(my_data) + result = dragSource.DoDragDrop(True) + + + +- **Dragging**: The call to `DoDragDrop()` blocks the program until the user releases the mouse button (unless + you override the :meth:`DropSource.GiveFeedback` function to do something special). When the mouse moves in + a window of a program which understands the same drag-and-drop protocol (any program under Windows or any + program supporting the XDnD protocol under X Windows), the corresponding :ref:`DropTarget` methods are called - see below. + +- **Processing the result**: `DoDragDrop()` returns an effect code which is one of the values of :ref:`DragResult`:: + + if result == wx.DragCopy: + # Copy the data + CopyMyData() + + elif result == wx.DragMove: + # Move the data + MoveMyData() + + else: + # Default, do nothing + pass + + +To be a `drop` target, i.e. to receive the data dropped by the user you should follow the instructions below: + +- **Initialization**: For a window to be a drop target, it needs to have an associated :ref:`DropTarget` object. Normally, + you will call :meth:`Window.SetDropTarget` during window creation associating your drop target with it. You must + derive a class from :ref:`DropTarget` and override its pure virtual methods. Alternatively, you may derive + from :ref:`TextDropTarget` or :ref:`FileDropTarget` and override their `OnDropText()` or `OnDropFiles()` method. + +- **Drop**: When the user releases the mouse over a window, wxPython asks the associated :ref:`DropTarget` object if + it accepts the data. For this, a :ref:`DataObject` must be associated with the drop target and this data object + will be responsible for the format negotiation between the drag source and the drop target. If all goes well, + then :meth:`DropTarget.OnData` will get called and the :ref:`DataObject` belonging to the drop target can get filled with data. + +- **The end**: After processing the data, `DoDragDrop()` returns either ``DragCopy`` or ``DragMove`` depending on the + state of the keys ``Ctrl``, ``Shift`` and ``Alt`` at the moment of the drop. There is currently no way for + the drop target to change this return code. + + diff --git a/docs/sphinx/rest_substitutions/overviews/events_overview.rst b/docs/sphinx/rest_substitutions/overviews/events_overview.rst new file mode 100644 index 00000000..ae180d95 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/events_overview.rst @@ -0,0 +1,311 @@ +.. include:: headings.inc + + +.. _events and event handling: + +============================================== +|phoenix_title| **Events and Event Handling** +============================================== + + +Like with all the other GUI frameworks, the control of flow in wxPython applications is event-based: the program +normally performs most of its actions in response to the events generated by the user. These events can be +triggered by using the input devices (such as keyboard, mouse, joystick) directly or, more commonly, by a standard +control which synthesizes such input events into higher level events: for example, a :ref:`Button` can generate +a click event when the user presses the left mouse button on it and then releases it without pressing ``Esc`` in +the meanwhile. There are also events which don't directly correspond to the user actions, such as :ref:`TimerEvent`. + +But in all cases wxPython represents these events in a uniform way and allows you to handle them in the same way +wherever they originate from. And while the events are normally generated by wxPython itself, you can also do this, +which is especially useful when using custom events (see :ref:`Custom Event Summary `). + +To be more precise, each event is described by: + +- `Event type`: this is simply a value of type `EventType` which uniquely identifies the type of the event. + For example, clicking on a button, selecting an item from a list box and pressing a key on the keyboard all + generate events with different event types. +- `Event class` carried by the event: each event has some information associated with it and this data is represented + by an object of a class derived from :ref:`Event`. Events of different types can use the same event class, for + example both button click and listbox selection events use :ref:`CommandEvent` class (as do all the other simple + control events), but the key press event uses :ref:`KeyEvent` as the information associated with it is different. +- `Event source`: :ref:`Event` stores the object which generated the event and, for windows, its identifier (see + :ref:`Window Identifiers `). As it is common to have more than one object generating events of + the same type (e.g. a typical window contains several buttons, all generating the same button click event), checking + the event source object or its id allows to distinguish between them. + + + +.. _event handling: + +Event Handling +-------------- + +There is one principal way to handle events in wxPython, which uses :meth:`EvtHandler.Bind` () call and can be used +to bind and unbind the handlers dynamically, i.e. during run-time depending on some conditions. It also allows the direct +binding of events to: + +- A handler method in another object. +- An ordinary function like a static method or a global function. +- An arbitrary function. + + + +.. _dynamic event handling: + +Dynamic Event Handling +---------------------- + +Let us start by looking at the syntax: in any place in your code, but usually in the code of the class defining the handler +itself, call its `Bind()` method like this:: + + class MyFrame(wx.Frame): + + def __init__(self, parent): + + wx.Frame.__init__(self, parent) + + # Other initialization code... + + self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT) + + + +Event handlers can be bound at any moment. For example, it's possible to do some initialization first and only bind the +handlers if and when it succeeds. This can avoid the need to test that the object was properly initialized in the event +handlers themselves. With `Bind()` they simply won't be called if it wasn't correctly initialized. + +As a slight extension of the above, the handlers can also be unbound at any time with `Unbind()` (and maybe rebound later). + +Almost last but very, very far from least is the flexibility which allows to bind an event to: + +- A method in another object. +- An ordinary function like a static method or a global function. +- An arbitrary function. + + +Let us now look at more examples of how to use different event handlers using the two overloads of `Bind()` function: +first one for the object methods and the other one for arbitrary functors (callable objects, including simple functions). + +In addition to using a method of the object generating the event itself, you can use a method from a completely different +object as an event handler:: + + def OnFrameExit(event) + + # Do something useful. + + + class MyFrame(wx.Frame): + + def __init__(self, parent): + + wx.Frame.__init__(self, parent) + + # Other initialization code... + + self.Bind(wx.EVT_MENU, OnFrameExit, id=wx.ID_EXIT) + + + +Note that `MyFrameHandler` doesn't need to derive from :ref:`EvtHandler`. + + + +.. _how events are processed: + +How Events are Processed +------------------------ + +The previous sections explain how to define event handlers but don't address the question of how exactly +wxPython finds the handler to call for the given event. This section describes the algorithm used in detail. + +When an event is received from the windowing system, wxPython calls :meth:`EvtHandler.ProcessEvent` () on +the first event handler object belonging to the window generating the event. The normal order of event table +searching by `ProcessEvent()` is as follows, with the event processing stopping as soon as a handler is found +(unless the handler calls :meth:`Event.Skip` () in which case it doesn't count as having handled the event +and the search continues): + +1. Before anything else happens, :meth:`AppConsole.FilterEvent` () is called. If it returns anything but -1 (default), + the event handling stops immediately. +2. If this event handler is disabled via a call to :meth:`EvtHandler.SetEvtHandlerEnabled` () the next three + steps are skipped and the event handler resumes at step (5). +3. If the object is a :ref:`Window` and has an associated validator, :ref:`Validator` gets a chance to process the event. +4. The list of dynamically bound event handlers, i.e., those for which `Bind()` was called, is consulted. +5. The event table containing all the handlers defined using the event table macros in this class and its base classes + is examined. Notice that this means that any event handler defined in a base class will be executed at this step. +6. The event is passed to the next event handler, if any, in the event handler chain, i.e., the steps (1) to (4) are done + for it. Usually there is no next event handler so the control passes to the next step but see :ref:`Event Handlers Chain ` + for how the next handler may be defined. +7. If the object is a :ref:`Window` and the event is set to propagate (by default only :ref:`CommandEvent` -derived events are set to propagate), + then the processing restarts from the step (1) (and excluding the step (7)) for the parent window. If this object is not a window + but the next handler exists, the event is passed to its parent if it is a window. This ensures that in a common case of + (possibly several) non-window event handlers pushed on top of a window, the event eventually reaches the window parent. +8. Finally, i.e., if the event is still not processed, the :ref:`App` object itself (which derives from :ref:`EvtHandler`) + gets a last chance to process it. + + +**Please pay close attention to step 6!** People often overlook or get confused by this powerful feature of the wxPython +event processing system. The details of event propagation up the window hierarchy are described in the next section. + + + +.. _how events propagate upwards: + +How Events Propagate Upwards +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +As mentioned above, the events of the classes deriving from :ref:`CommandEvent` are propagated by default to the parent +window if they are not processed in this window itself. But although by default only the command events are propagated +like this, other events can be propagated as well because the event handling code uses :meth:`Event.ShouldPropagate` () +to check whether an event should be propagated. It is also possible to propagate the event only a limited number of times +and not until it is processed (or a top level parent window is reached). + +Finally, there is another additional complication (which, in fact, simplifies life of wxPython programmers significantly): +when propagating the command events up to the parent window, the event propagation stops when it reaches the parent dialog, +if any. This means that you don't risk getting unexpected events from the dialog controls (which might be left unprocessed +by the dialog itself because it doesn't care about them) when a modal dialog is popped up. The events do propagate beyond +the frames, however. The rationale for this choice is that there are only a few frames in a typical application and their +parent-child relation are well understood by the programmer while it may be difficult, if not impossible, to track down all +the dialogs that may be popped up in a complex program (remember that some are created automatically by wxPython). +If you need to specify a different behaviour for some reason, you can use :meth:`Window.SetExtraStyle` (``WS_EX_BLOCK_EVENTS``) +explicitly to prevent the events from being propagated beyond the given window or unset this flag for the dialogs that +have it on by default. + +Typically events that deal with a window as a window (size, motion, paint, mouse, keyboard, etc.) are sent only to the window. +Events that have a higher level of meaning or are generated by the window itself (button click, menu select, tree expand, etc.) +are command events and are sent up to the parent to see if it is interested in the event. More precisely, as said above, all +event classes not deriving from :ref:`CommandEvent` (see the :ref:`Event` inheritance diagram) do not propagate upward. + +In some cases, it might be desired by the programmer to get a certain number of system events in a parent window, for +example all key events sent to, but not used by, the native controls in a dialog. In this case, a special event handler +will have to be written that will override `ProcessEvent()` in order to pass all events (or any selection of them) to the +parent window. + + +.. _event handlers chain: + +Event Handlers Chain +^^^^^^^^^^^^^^^^^^^^ + +The step 4 of the event propagation algorithm checks for the next handler in the event handler chain. This chain can be formed +using :meth:`EvtHandler.SetNextHandler` (): + +.. figure:: _static/images/overviews/overview_events_chain.png + :align: center + +| + +(referring to the image, if `A.ProcessEvent` is called and it doesn't handle the event, `B.ProcessEvent` will be called and so on...). + +Additionally, in the case of :ref:`Window` you can build a stack (implemented using :ref:`EvtHandler` double-linked list) using +:meth:`Window.PushEventHandler` (): + +.. figure:: _static/images/overviews/overview_events_winstack.png + :align: center + +| + + + +(referring to the image, if `W.ProcessEvent` is called, it immediately calls `A.ProcessEvent`; if nor A nor B handle the event, +then the :ref:`Window` itself is used -- i.e. the dynamically bind event handlers and static event table entries of :ref:`Window` +are looked as the last possibility, after all pushed event handlers were tested). + +By default the chain is empty, i.e. there is no next handler. + + +.. _custom event summary: + +Custom Event Summary +-------------------- + +General approach +^^^^^^^^^^^^^^^^ + +Custom event classes allow you to create more polished-seeming controls by allowing the control's user to process updates +without needing to sub-class the control. However, to effectively use events, you normally need to create custom event classes. + +This recipe gives you some boilerplate code for creating your own custom event classes:: + + import wx + import wx.lib.newevent + + SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent() + SomeNewCommandEvent, EVT_SOME_NEW_COMMAND_EVENT = wx.lib.newevent.NewCommandEvent() + + +You can bind the events normally via either binding syntax:: + + self.Bind(EVT_SOME_NEW_EVENT, self.handler) + EVT_SOME_NEW_EVENT(self, self.handler) + + +You can also attach arbitrary data to the event during its creation, then post it to whatever window you choose:: + + # Create the event + evt = SomeNewEvent(attr1="hello", attr2=654) + # Post the event + wx.PostEvent(target, evt) + + +When handling events with such arbitrary data, you can fetch the data via attributes, named the same as the names +passed in during the event instance creation. That is, given the two keyword arguments passed to SomeNewEvent above:: + + + def handler(self, evt): + # Given the above constructed event, the following is true + evt.attr1 == "hello" + evt.attr2 == 654 + + + + +Miscellaneous Notes +------------------- + + +.. _user generated events vs programmatically generated events: + +User Generated Events vs Programmatically Generated Events +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +While generically a :ref:`Event` can be generated both by user actions (e.g., resize of a :ref:`Window`) and by calls to functions +(e.g., :meth:`Window.SetSize`), wxPython controls normally send :ref:`CommandEvent` -derived events only for the user-generated +events. The only exceptions to this rule are: + +- :meth:`BookCtrlBase.AddPage` No event-free alternatives +- :meth:`BookCtrlBase.AdvanceSelection` No event-free alternatives +- :meth:`BookCtrlBase.DeletePage` No event-free alternatives +- :meth:`Notebook.SetSelection`: Use :meth:`Notebook.ChangeSelection` instead, as :meth:`Notebook.SetSelection` is deprecated +- :meth:`TreeCtrl.Delete`: No event-free alternatives +- :meth:`TreeCtrl.DeleteAllItems`: No event-free alternatives +- :meth:`TreeCtrl.EditLabel`: No event-free alternatives +- All :ref:`TextCtrl` methods + + +:meth:`TextEntry.ChangeValue` can be used instead of :meth:`TextEntry.SetValue` but the other functions, such as :meth:`TextEntry.Replace` +or meth:`TextCtrl.WriteText` don't have event-free equivalents. + + + +.. _window identifiers: + +Window Identifiers +^^^^^^^^^^^^^^^^^^ + +Window identifiers are integers, and are used to uniquely determine window identity in the event system (though you can use it +for other purposes). In fact, identifiers do not need to be unique across your entire application as long they are unique within +the particular context you're interested in, such as a frame and its children. You may use the ``ID_OK`` identifier, for example, +on any number of dialogs as long as you don't have several within the same dialog. + +If you pass ``ID_ANY`` or -1 to a window constructor, an identifier will be generated for you automatically by wxPython. This is useful +when you don't care about the exact identifier either because you're not going to process the events from the control being created +or because you process the events from all controls in one place (in which case you should specify ``ID_ANY`` in the :meth:`EvtHandler.Bind` +call as well). The automatically generated identifiers are always negative and so will never conflict with the user-specified +identifiers which must be always positive. + +.. seealso:: See :ref:`Standard event identifiers ` for the list of standard identifiers available. + + +You can use ``ID_HIGHEST`` to determine the number above which it is safe to define your own identifiers. Or, you can use identifiers below ``ID_LOWEST``. +Finally, you can allocate identifiers dynamically using :func:`NewId` () function too. If you use :func:`NewId` () consistently in your +application, you can be sure that your identifiers don't conflict accidentally. diff --git a/docs/sphinx/rest_substitutions/overviews/font_encodings.rst b/docs/sphinx/rest_substitutions/overviews/font_encodings.rst new file mode 100644 index 00000000..41030391 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/font_encodings.rst @@ -0,0 +1,57 @@ +.. include:: headings.inc + + +.. _font encodings: + +================================================= +|phoenix_title| **Font Encodings** +================================================= + + +wxPython has support for multiple font encodings. + +By encoding we mean here the mapping between the character codes and the letters. Probably the most well-known encoding is +(7 bit) ASCII one which is used almost universally now to represent the letters of the English alphabet and some other +common characters. However, it is not enough to represent the letters of foreign alphabets and here other encodings +come into play. Please note that we will only discuss 8-bit fonts here and not Unicode. + +Font encoding support is ensured by several classes: :ref:`Font` itself, but also :ref:`FontEnumerator` and :ref:`FontMapper`. +:ref:`Font` encoding support is reflected by a (new) constructor parameter encoding which takes one of the following +values (elements of enumeration type :ref:`FontEncoding`): + +======================================== ========================================================= +``FONTENCODING_SYSTEM`` The default encoding of the underlying operating system (notice that this might be a "foreign" encoding for foreign versions of Windows 9x/NT). +``FONTENCODING_DEFAULT`` The applications default encoding as returned by :meth:`Font.GetDefaultEncoding`. On program startup, the applications default encoding is the same as ``FONTENCODING_SYSTEM``, but may be changed to make all the fonts created later to use it (by default). +``FONTENCODING_ISO8859_1..15`` ISO8859 family encodings which are usually used by all non-Microsoft operating systems. +``FONTENCODING_KOI8`` Standard Cyrillic encoding for the Internet (but see also ``FONTENCODING_ISO8859_5`` and ``FONTENCODING_CP1251``). +``FONTENCODING_CP1250`` Microsoft analogue of ISO8859-2 +``FONTENCODING_CP1251`` Microsoft analogue of ISO8859-5 +``FONTENCODING_CP1252`` Microsoft analogue of ISO8859-1 +======================================== ========================================================= + + +As you may see, Microsoft's encoding partly mirror the standard ISO8859 ones, but there are (minor) differences even between +ISO8859-1 (Latin1, ISO encoding for Western Europe) and CP1251 (WinLatin1, standard code page for English versions of Windows) +and there are more of them for other encodings. + +The situation is particularly complicated with Cyrillic encodings for which (more than) three incompatible encodings exist: +KOI8 (the old standard, widely used on the Internet), ISO8859-5 (ISO standard for Cyrillic) and CP1251 (WinCyrillic). + +This abundance of (incompatible) encodings should make it clear that using encodings is less easy than it might seem. +The problems arise both from the fact that the standard encodings for the given language (say Russian, which is written +in Cyrillic) are different on different platforms and because the fonts in the given encoding might just not be installed +(this is especially a problem with Unix, or, in general, non-Win32 systems). + +To clarify, the :ref:`FontEnumerator` class may be used to enumerate both all available encodings and to find the facename(s) +in which the given encoding exists. If you can find the font in the correct encoding with :ref:`FontEnumerator` then your +troubles are over, but, unfortunately, sometimes this is not enough. For example, there is no standard way (that I know of, +please tell me if you do!) to find a font on a Windows system for KOI8 encoding (only for WinCyrillic one which is quite different), +so :ref:`FontEnumerator` will never return one, even if the user has installed a KOI8 font on his system. + +To solve this problem, a :ref:`FontMapper` class is provided. + +This class stores the mapping between the encodings and the font face names which support them in :ref:`ConfigBase` object. +Of course, it would be fairly useless if it tried to determine these mappings by itself, so, instead, it (optionally) asks +the user and remembers his answers so that the next time the program will automatically choose the correct font. + + diff --git a/docs/sphinx/rest_substitutions/overviews/font_overview.rst b/docs/sphinx/rest_substitutions/overviews/font_overview.rst new file mode 100644 index 00000000..11e48b6c --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/font_overview.rst @@ -0,0 +1,55 @@ +.. include:: headings.inc + + +.. _font overview: + +================================================= +|phoenix_title| **Font Overview** +================================================= + + +Introduction +------------ + +A font is an object which determines the appearance of text, primarily when drawing text to a window +or device context. A font is determined by the following parameters (not all of them have to be specified, of course): + +======================== ========================================== +**Point size** This is the standard way of referring to text size. +**Family** Supported families are: ``DEFAULT``, ``DECORATIVE``, ``ROMAN``, ``SCRIPT``, ``SWISS``, ``MODERN``. ``MODERN`` is a fixed pitch font; the others are either fixed or variable pitch. +**Style** The value can be ``NORMAL``, ``SLANT`` or ``ITALIC``. +**Weight** The value can be ``NORMAL``, ``LIGHT`` or ``BOLD``. +**Underlining** The value can be ``True`` or ``False``. +**Face name** An optional string specifying the actual typeface to be used. If ``None``, a default typeface will chosen based on the family. +**Encoding** The font encoding (see ``FONTENCODING_XXX`` constants and the :ref:`Font Encodings ` for more details) +======================== ========================================== + +Specifying a family, rather than a specific typeface name, ensures a degree of portability across platforms because a +suitable font will be chosen for the given font family, however it doesn't allow to choose a font precisely as the parameters +above don't suffice, in general, to identify all the available fonts and this is where using the native font descriptions +may be helpful - see below. + +Under Windows, the face name can be one of the installed fonts on the user's system. Since the choice of fonts differs +from system to system, either choose standard Windows fonts, or if allowing the user to specify a face name, store the +family name with any file that might be transported to a different Windows machine or other platform. + +.. note:: There is currently a difference between the appearance of fonts on the two platforms, if the mapping mode is anything + other than ``MM_TEXT``. Under X, font size is always specified in points. Under MS Windows, the unit for text is points but + the text is scaled according to the current mapping mode. However, user scaling on a device context will also scale fonts under both environments. + + +Native font information +----------------------- + +An alternative way of choosing fonts is to use the native font description. This is the only acceptable solution if the user +is allowed to choose the font using the :ref:`FontDialog` because the selected font cannot be described using only the family +name and so, if only family name is stored permanently, the user would almost surely see a different font in the program later. + +Instead, you should store the value returned by :meth:`Font.GetNativeFontInfoDesc` and pass it to :meth:`Font.SetNativeFontInfo` +later to recreate exactly the same font. + +.. note:: Note that the contents of this string depends on the platform and shouldn't be used for any other purpose (in particular, it is not + meant to be shown to the user). Also please note that although the native font information is currently implemented for Windows and + Unix (GTK+ and Motif) ports only, all the methods are available for all the ports and should be used to make your program work correctly + when they are implemented later. + diff --git a/docs/sphinx/rest_substitutions/overviews/index.rst b/docs/sphinx/rest_substitutions/overviews/index.rst new file mode 100644 index 00000000..ca412d72 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/index.rst @@ -0,0 +1,146 @@ +.. wxPython (Phoenix) documentation master file, created by + sphinx-quickstart on Fri Dec 09 11:27:02 2011. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +============================================== +Welcome to wxPython (Phoenix)'s documentation! +============================================== + + +wxPython +======== + +wxPython is a **GUI toolkit** for the `Python `_ programming language. It allows Python programmers to +create programs with a robust, highly functional graphical user interface, simply and easily. + +.. figure:: _static/images/sphinxdocs/central_bar.png + :align: center + + +| + +What is wxPython +---------------- + +wxPython is a **GUI toolkit** for the `Python `_ programming language. It allows Python programmers to +create programs with a robust, highly functional graphical user interface, simply and easily. +It is implemented as a Python extension module (native code) that wraps the popular `wxWidgets `_ cross +platform GUI library, which is written in C++. + +Like Python and wxWidgets, wxPython is *Open Source* which means that it is free for anyone to use and +the source code is available for anyone to look at and modify. Or anyone can contribute fixes or +enhancements to the project. + +wxPython is a *cross-platform* toolkit. This means that the same program will run on multiple platforms +without modification. Currently supported platforms are 32-bit Microsoft Windows, most Unix or unix-like +systems, and Macintosh OS X+, in most cases the native widgets are used on each platform. + +Since the language is Python, wxPython programs are **simple, easy** to write and easy to understand. + +As an example, this is a simple "Hello World" program with wxPython:: + + import wx + + app = wx.App() + + frame = wx.Frame(None, -1, "Hello World") + frame.Show() + + app.MainLoop() + + +The GUI layouts you can build with wxPython are almost infinite: it has an extremely rich set of widgets (derived from `wxWidgets`) and +greatly extended by a huge set of pure-Python controls written over the years. + + +Prerequisites +------------- + +Like any other complex piece of software, wxPython requires other software in order to function properly. +Obviously you'll need `Python `_ itself, but if you're reading this you've probably already got +Python and are just here looking for the `best GUI toolkit `_ available for Python. +Check out the details for your platform of choice here: + +Win32 +^^^^^ + +* If you have a modern up to date version of Windows and use the binary installer for wxPython found below, you probably + don't need anything else. + +* If your tree controls have strange background colors, try loading this `MS Common Controls Update `_ + as wxWidgets does something that causes a bug in one of the older versions to manifest itself. Another way to get this update + is to install Internet Explorer or MS Office apps, so if the system has those already then you probably don't need to worry about this. + +* wxPython's `wx.glcanvas.GLCanvas` class only provides the GL Context and a wx.Window to put it in, so if you want to use + the wxGLCanvas you will also need the `PyOpenGL `_ Python extension modules as well. + + +Linux/Unix/Etc. +^^^^^^^^^^^^^^^ + +* The first thing you'll need are the `glib and gtk+ `_ libraries. Before you run off and download the sources + check your system, you probably already have it. Most distributions of Linux come with it and you'll start seeing it on many + other systems too now that Sun and others have chosen GNOME as the desktop of choice. If you don't have glib and gtk+ already, + you can get the sources `here `_. Build and install them following the directions included. + +* In order to use the wxGLCanvas you'll need to have either OpenGL or the `Mesa3D `_ library on your system. + wxPython's `wx.glcanvas.GLCanvas` only provides the GL Context and a :class:`Window` to put it in, so you will also need the PyOpenGL + Python extension modules as well, if you want to use OpenGL. + + If you are building wxPython yourself and don't care to use OpenGL/Mesa then you can easily skip building it and can ignore + this step. See the `build instructions `_ for details. + + +Mac OS X +^^^^^^^^ + +The wxPython binaries for OSX are mountable disk images. Simply double click to mount the image and then run the installer application +in the image. Download the image that matches the version of Python that you want to use it with, and unless you know for sure that you +need the ansi build please get the Unicode build. + +These binaries should work on all versions of OSX from 10.3.9 onwards on either PPC or i386 architectures. Since they use the Carbon API + they are limited to running in 32-bit mode. + + +OK, I'm interested. What do I do next? +-------------------------------------- + +You can download the `Prebuild binary of wxPython +`_ which includes +the source code for wxPython. + +Prebuilt binaries are available for Microsoft Windows, Linux and Mac OS X. + +Don't forget to download the wxPython demo and the documentation! + + +Bleeding-edge source +-------------------- + +If you are a very keen developer, you can access the SVN repository directly for this +project in the `wxWidgets SVN `_. + + + +wxPython Documentation +---------------------- + +The new wxPython API documentation is available `in this page `_. + + +.. toctree:: + :maxdepth: 2 + :hidden: + :glob: + + * + + +Indices and tables +================== + +* `genindex` +* `modindex` +* `search` + diff --git a/docs/sphinx/rest_substitutions/overviews/log_classes_overview.rst b/docs/sphinx/rest_substitutions/overviews/log_classes_overview.rst new file mode 100644 index 00000000..219dc56e --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/log_classes_overview.rst @@ -0,0 +1,229 @@ +.. include:: headings.inc + + +.. _log classes overview: + +=============================================== +|phoenix_title| **Log Classes Overview** +=============================================== + + +Introduction +------------ + +This is a general overview of logging classes provided by wxPython. The word logging here has a broad sense, including all +of the program output, not only non-interactive messages. The logging facilities included in wxPython provide the base :ref:`Log` +class which defines the standard interface for a log target as well as several standard implementations of it and a family of +functions to use with them. + +First of all, no knowledge of :ref:`Log` classes is needed to use them. For this, you should only know about :func:`LogDebug`, +:func:`LogError`, :func:`LogMessage` and similar functions. All of them have the same syntax as the Python +`logging `_ module. + +Here are all of them: + +- :func:`LogFatalError` which is like :func:`LogError`, but also terminates the program with the exit code 3 (using `abort()` + standard function). Unlike for all the other logging functions, this function can't be overridden by a log target. +- :func:`LogError` is the function to use for error messages, i.e. the messages that must be shown to the user. + The default processing is to pop up a message box to inform the user about it. +- :func:`LogWarning` for warnings. They are also normally shown to the user, but don't interrupt the program work. +- :func:`LogMessage` is for all normal, informational messages. They also appear in a message box by default (but it can be changed, see below). +- :func:`LogVerbose` is for verbose output. Normally, it is suppressed, but might be activated if the user wishes to know + more details about the program progress (another, but possibly confusing name for the same function is :func:`LogInfo`). +- :func:`LogStatus` is for status messages. They will go into the status bar of the active or specified (as the first argument) + :ref:`Frame` if it has one. +- :func:`LogSysError` is mostly used by wxPython itself, but might be handy for logging errors after system call (API function) + failure. It logs the specified message text as well as the last system error code (`errno` or Windows' `GetLastError()` depending + on the platform) and the corresponding error message. The second form of this function takes the error code explicitly as the first argument. +- :func:`LogDebug` is the right function for debug output. It only does anything at all in the debug mode (when the preprocessor + symbol ``__WXDEBUG__`` is defined) and expands to nothing in release mode (otherwise). Note that under Windows, you must either run + the program under debugger or use a 3rd party program such as **DebugView** (http://www.microsoft.com/technet/sysinternals/Miscellaneous/DebugView.mspx) + to actually see the debug output. +- :func:`LogTrace` as :func:`LogDebug` only does something in debug build. The reason for making it a separate function from it is + that usually there are a lot of trace messages, so it might make sense to separate them from other debug messages which would be + flooded in them. Moreover, the second version of this function takes a trace mask as the first argument which allows to further + restrict the amount of messages generated. + + +The usage of these functions should be fairly straightforward, however it may be asked why not use the other logging facilities, +such as the Python `logging `_ module. The short answer is that they're all very +good generic mechanisms, but are not really adapted for wxPython, while the log classes are. + +Some of advantages in using wxPython log functions are: + +- Portability +- Flexibility: The output of :ref:`Log` functions can be redirected or suppressed entirely based on their importance, which is + either impossible or difficult to do with traditional methods. For example, only error messages, or only error messages and + warnings might be logged, filtering out all informational messages. +- Completeness: Usually, an error message should be presented to the user when some operation fails. Let's take a quite simple but + common case of a file error: suppose that you're writing your data file on disk and there is not enough space. The actual error + might have been detected inside wxPython code, so the calling function doesn't really know the exact reason of the failure, + it only knows that the data file couldn't be written to the disk. However, as wxPython uses :func:`LogError` in this situation, + the exact error code (and the corresponding error message) will be given to the user together with "high level" message about + data file writing error. + + + +.. _log messages selection: + +Log Messages Selection +---------------------- + +By default, most log messages are enabled. In particular, this means that errors logged by wxPython code itself (e.g. when it fails +to perform some operation) will be processed and shown to the user. To disable the logging entirely you can use :meth:`Log.EnableLogging` +method or, more usually, :ref:`LogNull` class which temporarily disables logging and restores it back to the original setting when it is destroyed. + +To limit logging to important messages only, you may use :meth:`Log.SetLogLevel` with e.g. ``LOG_Warning`` value -- this will completely +disable all logging messages with the severity less than warnings, so :func:`LogMessage` output won't be shown to the user any more. + +Moreover, the log level can be set separately for different log components. Before showing how this can be useful, let us explain what +log components are: they are simply arbitrary strings identifying the component, or module, which generated the message. They are hierarchical +in the sense that "foo/bar/baz" component is supposed to be a child of "foo". And all components are children of the unnamed root component. + +By default, all messages logged by wxPython originate from "wx" component or one of its subcomponents such as "wx/net/ftp", while the +messages logged by your own code are assigned empty log component. To change this, you need to define ``LOG_COMPONENT`` to a string uniquely +identifying each component, e.g. you could give it the value "MyProgram" by default and re-define it as "MyProgram/DB" in the module +working with the database and "MyProgram/DB/Trans" in its part managing the transactions. Then you could use :meth:`Log.SetComponentLevel` +in the following ways:: + + # Disable all database error messages, everybody knows databases never + # fail anyhow + wx.Log.SetComponentLevel("MyProgram/DB", wx.LOG_FatalError) + + # but enable tracing for the transactions as somehow our changes don't + # get committed sometimes + wx.Log.SetComponentLevel("MyProgram/DB/Trans", wx.LOG_Trace) + + # also enable tracing messages from wxPython dynamic module loading + # mechanism + wx.Log.SetComponentLevel("wx/base/module", wx.LOG_Trace) + + + +Notice that the log level set explicitly for the transactions code overrides the log level of the parent component but that all other database +code subcomponents inherit its setting by default and so won't generate any log messages at all. + + + +.. _log targets: + +Log Targets +----------- + +After having enumerated all the functions which are normally used to log the messages, and why would you want to use them, we now +describe how all this works. + +wxPython has the notion of a `log target`: it is just a class deriving from :ref:`Log`. As such, it implements the virtual functions +of the base class which are called when a message is logged. Only one log target is active at any moment, this is the one used by +`LogXXX` functions. The normal usage of a log object (i.e. object of a class derived from :ref:`Log`) is to install it as the active +target with a call to `SetActiveTarget()` and it will be used automatically by all subsequent calls to `LogXXX` functions. + +To create a new log target class you only need to derive it from :ref:`Log` and override one or several of :meth:`Log.DoLogRecord`, +:meth:`Log.DoLogTextAtLevel` and :meth:`Log.DoLogText` in it. The first one is the most flexible and allows you to change the formatting +of the messages, dynamically filter and redirect them and so on -- all log messages, except for those generated by :func:`LogFatalError`, +pass by this function. :meth:`Log.DoLogTextAtLevel` should be overridden if you simply want to redirect the log messages somewhere else, +without changing their formatting. Finally, it is enough to override :meth:`Log.DoLogText` if you only want to redirect the log +messages and the destination doesn't depend on the message log level. + +There are some predefined classes deriving from :ref:`Log` and which might be helpful to see how you can create a new log target +class and, of course, may also be used without any change. There are: + +- :ref:`LogStderr`: This class logs messages to a ``FILE *``, using stderr by default as its name suggests. +- `LogStream`: This class has the same functionality as :ref:`LogStderr`, but uses stdout. +- :ref:`LogGui`: This is the standard log target for wxPython applications (it is used by default if you don't do anything) and provides + the most reasonable handling of all types of messages for given platform. +- :ref:`LogWindow`: This log target provides a "log console" which collects all messages generated by the application and also passes + them to the previous active log target. The log window frame has a menu allowing user to clear the log, close it completely or save all messages to file. +- :ref:`LogBuffer`: This target collects all the logged messages in an internal buffer allowing to show them later to the user all at once. +- :ref:`LogNull`: The last log class is quite particular: it doesn't do anything. The objects of this class may be instantiated to (temporarily) + suppress output of `LogXXX` functions. + + +The log targets can also be combined: for example you may wish to redirect the messages somewhere else (for example, to a log file) +but also process them as normally. For this the :ref:`LogChain`, :ref:`LogInterposer`, and :ref:`LogInterposerTemp` can be used. + + + +.. _logging in multi-threaded applications: + +Logging in Multi-Threaded Applications +-------------------------------------- + +Starting with wxPython 2.9.1, logging functions can be safely called from any thread. Messages logged from threads other than the main +one will be buffered until :meth:`Log.Flush` is called in the main thread (which usually happens during idle time, i.e. after processing +all pending events) and will be really output only then. Notice that the default GUI logger already only output the messages when it is +flushed, so by default messages from the other threads will be shown more or less at the same moment as usual. However if you define a +custom log target, messages may be logged out of order, e.g. messages from the main thread with later timestamp may appear before messages +with earlier timestamp logged from other threads. :ref:`Log` does however guarantee that messages logged by each thread will appear in +order in which they were logged. + +Also notice that :meth:`Log.EnableLogging` and :ref:`LogNull` class which uses it only affect the current thread, i.e. logging messages +may still be generated by the other threads after a call to `EnableLogging(False)`. + + + +.. _logging customization: + +Logging Customization +--------------------- + +To completely change the logging behaviour you may define a custom log target. For example, you could define a class inheriting from +:ref:`Log` which shows all the log messages in some part of your main application window reserved for the message output without +interrupting the user work flow with modal message boxes. + +To use your custom log target you may either call :meth:`Log.SetActiveTarget` with your custom log object or create a :ref:`AppTraits` -derived +class and override :meth:`AppTraits.CreateLogTarget` virtual method in it and also override :meth:`App.CreateTraits` to return an instance +of your custom traits object. Notice that in the latter case you should be prepared for logging messages early during the program startup +and also during program shutdown so you shouldn't rely on existence of the main application window, for example. You can however safely +assume that GUI is (already/still) available when your log target as used as wxPython automatically switches to using :ref:`LogStderr` +if it isn't. + +There are several methods which may be overridden in the derived class to customize log messages handling: :meth:`Log.DoLogRecord`, +:meth:`Log.DoLogTextAtLevel` and :meth:`Log.DoLogText`. + +The last method is the simplest one: you should override it if you simply want to redirect the log output elsewhere, without taking +into account the level of the message. If you do want to handle messages of different levels differently, then you should override +:meth:`Log.DoLogTextAtLevel`. + +Additionally, you can customize the way full log messages are constructed from the components (such as time stamp, source file information, +logging thread ID and so on). This task is performed by :ref:`LogFormatter` class so you need to derive a custom class from it and override +its `Format()` method to build the log messages in desired way. Notice that if you just need to modify (or suppress) the time stamp display, +overriding `FormatTime()` is enough. + +Finally, if even more control over the output format is needed, then `LogRecord()` can be overridden as it allows to construct custom +messages depending on the log level or even do completely different things depending on the message severity (for example, throw away all +messages except warnings and errors, show warnings on the screen and forward the error messages to the user's (or programmer's) cell +phone -- maybe depending on whether the timestamp tells us if it is day or night in the current time zone). + + + +.. _using trace masks: + +Using trace masks +----------------- + +Notice that the use of log trace masks is hardly necessary any longer in current wxPython version as the same effect can be achieved by +using different log components for different log statements of any level. Please see :ref:`Log Messages Selection ` +for more information about the log components. + +The functions below allow some limited customization of :ref:`Log` behaviour without writing a new log target class (which, aside from +being a matter of several minutes, allows you to do anything you want). The verbose messages are the trace messages which are not disabled +in the release mode and are generated by :func:`LogVerbose`. They are not normally shown to the user because they present little interest, +but may be activated, for example, in order to help the user find some program problem. + +As for the (real) trace messages, their handling depends on the currently enabled trace masks: if :meth:`Log.AddTraceMask` was called for +the mask of the given message, it will be logged, otherwise nothing happens. + + +For example:: + + wx.LogTrace(wx.TRACE_OleCalls, "Foo.Bar() called") + + +will log the message if it was preceded by:: + + wx.Log.AddTraceMask(wx.TRACE_OleCalls) + + +The standard trace masks are given in the :func:`LogTrace` documentation. + diff --git a/docs/sphinx/rest_substitutions/overviews/printing_framework_overview.rst b/docs/sphinx/rest_substitutions/overviews/printing_framework_overview.rst new file mode 100644 index 00000000..096e6231 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/printing_framework_overview.rst @@ -0,0 +1,155 @@ +.. include:: headings.inc + + +.. _printing framework overview: + +================================================= +|phoenix_title| **Printing Framework Overview** +================================================= + + +The printing framework relies on the application to provide classes whose member functions can respond +to particular requests, such as 'print this page' or 'does this page exist in the document?'. This method +allows wxPython to take over the housekeeping duties of turning preview pages, calling the print dialog box, +creating the printer device context, and so on: the application can concentrate on the rendering of the +information onto a device context. + +In most cases, the only class you will need to derive from is :ref:`Printout`; all others will be used as-is. + +A brief description of each class's role and how they work together follows. + + +Printout +-------- + +A document's printing ability is represented in an application by a derived :ref:`Printout` class. This class +prints a page on request, and can be passed to the Print function of a :ref:`Printer` object to actually print +the document, or can be passed to a :ref:`PrintPreview` object to initiate previewing. The following code +shows how easy it is to initiate printing, previewing and the print setup dialog, once the :ref:`Printout` +functionality has been defined. Notice the use of `MyPrintout` for both printing and previewing. All the preview +user interface functionality is taken care of by wxPython:: + + if printing: + printer = wx.Printer() + printout = MyPrintout("My printout") + printer.Print(self, printout, True) + + elif preview: + # Pass two printout objects: for preview, and possible printing. + preview = wx.PrintPreview(MyPrintout(), MyPrintout()) + frame = wx.PreviewFrame(preview, self, "Demo Print Preview", wx.Point(100, 100), wx.Size(600, 650)) + frame.Centre(wx.BOTH) + frame.Initialize() + frame.Show(True) + + + +:ref:`Printout` assembles the printed page and (using your subclass's overrides) writes requested pages to a :ref:`DC` +that is passed to it. This :ref:`DC` could be a :ref:`MemoryDC` (for displaying the preview image on-screen), +a :ref:`PrinterDC` (for printing under MSW and Mac), or a :ref:`PostScriptDC` (for printing under GTK or generating PostScript output). + +If your window classes have a `Draw(dc)` routine to do screen rendering, your :ref:`Printout` subclass will typically +call those routines to create portions of the image on your printout. Your :ref:`Printout` subclass can also make its +own calls to its :ref:`DC` to draw headers, footers, page numbers, etc. + +The scaling of the drawn image typically differs from the screen to the preview and printed images. This class provides +a set of routines named `FitThisSizeToXXX()`, `MapScreenSizeToXXX()`, and `GetLogicalXXXRect`, which can be used to set +the user scale and origin of the Printout's DC so that your class can easily map your image to the printout withouth +getting into the details of screen and printer PPI and scaling. + + +Printer +------- + +Class :ref:`Printer` encapsulates the platform-dependent print function with a common interface. In most cases, you will +not need to derive a class from :ref:`Printer`; simply create a :ref:`Printer` object in your `Print` function as in the example above. + + +PrintPreview +------------ + +Class :ref:`PrintPreview` manages the print preview process. Among other things, it constructs the DCs that get passed to your +:ref:`Printout` subclass for printing and manages the display of multiple pages, a zoomable preview image, and so forth. +In most cases you will use this class as-is, but you can create your own subclass, for example, to change the layout or +contents of the preview window. + + +PrinterDC +--------- + +Class :ref:`PrinterDC` is the :ref:`DC` that represents the actual printed page under MSW and Mac. During printing, an object +of this class will be passed to your derived :ref:`Printout` object to draw upon. The size of the :ref:`PrinterDC` will depend +on the paper orientation and the resolution of the printer. + +There are two important rectangles in printing: the page rectangle defines the printable area seen by the application, and under +MSW and Mac, it is the printable area specified by the printer. (For PostScript printing, the page rectangle is the entire page.) +The inherited function :meth:`DC.GetSize` returns the page size in device pixels. The point (0,0) on the :ref:`PrinterDC` +represents the top left corner of the page rectangle; that is, the page rect is given by `Rect(0, 0, w, h)`, where (w,h) are the values +returned by `GetSize`. + +The paper rectangle, on the other hand, represents the entire paper area including the non-printable border. Thus, the coordinates +of the top left corner of the paper rectangle will have small negative values, while the width and height will be somewhat larger +than that of the page rectangle. The :ref:`PrinterDC` -specific function :meth:`PrinterDC.GetPaperRect` returns the paper +rectangle of the given :ref:`PrinterDC`. + + +PostScriptDC +------------ + +Class :ref:`PostScriptDC` is the :ref:`DC` that represents the actual printed page under GTK and other PostScript printing. +During printing, an object of this class will be passed to your derived :ref:`Printout` object to draw upon. The size of +the :ref:`PostScriptDC` will depend upon the :ref:`PrintData` used to construct it. + +Unlike a :ref:`PrinterDC`, there is no distinction between the page rectangle and the paper rectangle in a :ref:`PostScriptDC`; +both rectangles are taken to represent the entire sheet of paper. + + +PrintDialog +----------- + +Class :ref:`PrintDialog` puts up the standard print dialog, which allows you to select the page range for printing (as well +as many other print settings, which may vary from platform to platform). You provide an object of type :ref:`PrintDialogData` to +the :ref:`PrintDialog` at construction, which is used to populate the dialog. + + +PrintData +--------- + +Class :ref:`PrintData` is a subset of :ref:`PrintDialogData` that is used (internally) to initialize a :ref:`PrinterDC` or +:ref:`PostScriptDC`. (In fact, a :ref:`PrintData` is a data member of a :ref:`PrintDialogData` and a :ref:`PageSetupDialogData`). +Essentially, :ref:`PrintData` contains those bits of information from the two dialogs necessary to configure the :ref:`PrinterDC` or +:ref:`PostScriptDC` (e.g., size, orientation, etc.). You might wish to create a global instance of this object to provide +call-to-call persistence to your application's print settings. + + +PrintDialogData +--------------- + +Class :ref:`PrintDialogData` contains the settings entered by the user in the print dialog. It contains such things as page range, +number of copies, and so forth. In most cases, you won't need to access this information; the framework takes care of asking your +:ref:`Printout` derived object for the pages requested by the user. + + +PageSetupDialog +--------------- + +Class :ref:`PageSetupDialog` puts up the standard page setup dialog, which allows you to specify the orientation, paper size, +and related settings. You provide it with a :ref:`PageSetupDialogData` object at intialization, which is used to populate the dialog; +when the dialog is dismissed, this object contains the settings chosen by the user, including orientation and/or page margins. + + +.. note:: Note that on Macintosh, the native page setup dialog does not contain entries that allow you to change the page margins. + + + +PageSetupDialogData +------------------- + +Class :ref:`PageSetupDialogData` contains settings affecting the page size (paper size), orientation, margins, and so forth. Note +that not all platforms populate all fields; for example, the MSW page setup dialog lets you set the page margins while the Mac setup dialog does not. + +You will typically create a global instance of each of a :ref:`PrintData` and :ref:`PageSetupDialogData` at program initiation, +which will contain the default settings provided by the system. Each time the user calls up either the :ref:`PrintDialog` or the +:ref:`PageSetupDialog`, you pass these data structures to initialize the dialog values and to be updated by the dialog. +The framework then queries these data structures to get information like the printed page range (from the :ref:`PrintDialogData`) or +the paper size and/or page orientation (from the :ref:`PageSetupDialogData`). diff --git a/docs/sphinx/rest_substitutions/overviews/refcount_overview.rst b/docs/sphinx/rest_substitutions/overviews/refcount_overview.rst new file mode 100644 index 00000000..5b937dda --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/refcount_overview.rst @@ -0,0 +1,72 @@ +.. include:: headings.inc + + +.. _reference counting: + +================================================= +|phoenix_title| **Reference Counting Overview** +================================================= + + +Why You Shouldn't Care About It +------------------------------- + +Many wxPython objects use a technique known as `reference counting`, also known as `copy on write` (COW). This means that when an +object is assigned to another, no copying really takes place. Only the reference count on the shared object data is incremented +and both objects share the same data (a very fast operation). + +But as soon as one of the two (or more) objects is modified, the data has to be copied because the changes to one of the objects +shouldn't be seen in the others. As data copying only happens when the object is written to, this is known as COW. + +What is important to understand is that all this happens absolutely transparently to the class users and that whether an object +is shared or not is not seen from the outside of the class - in any case, the result of any operation on it is the same. + + +Object Comparison +----------------- + +The ``==`` and ``!=`` operators of the reference counted classes always do a `deep comparison`. This means that the equality operator +will return true if two objects are identical and not only if they share the same data. + + +Note that wxPython follows the STL philosophy: when a comparison operator cannot be implemented efficiently (like for e.g. +:ref:`Image` 's ``==`` operator which would need to compare the entire image's data, pixel-by-pixel), it's not implemented at all. +That's why not all reference counted classes provide comparison operators. + + +Also note that if you only need to do a shallow comparison between two :ref:`Object` derived classes, you should not use the ``==`` +and ``!=`` operators but rather the :meth:`Object.IsSameAs` () function. + + +Object Destruction +------------------ + +When a COW object destructor is called, it may not delete the data: if it's shared, the destructor will just decrement the shared +data's reference count without destroying it. Only when the destructor of the last object owning the data is called, the data is +really destroyed. Just like all other COW-things, this happens transparently to the class users so that you shouldn't care about it. + + +List of Reference Counted Classes +--------------------------------- + +The following classes in wxPython have efficient (i.e. fast) assignment operators and copy constructors since they are reference-counted: + +- :ref:`AcceleratorTable` +- :ref:`animate.Animation` +- :ref:`Bitmap` +- :ref:`Brush` +- :ref:`Cursor` +- :ref:`Font` +- :ref:`GraphicsBrush` +- :ref:`GraphicsContext` +- :ref:`GraphicsFont` +- :ref:`GraphicsMatrix` +- :ref:`GraphicsPath` +- :ref:`GraphicsPen` +- :ref:`Icon` +- :ref:`Image` +- :ref:`Metafile` +- :ref:`Palette` + + +Note that the list above reports the objects which are reference counted in all ports of wxPython; some ports may use this technique also for other classes. diff --git a/docs/sphinx/rest_substitutions/overviews/scrolling_overview.rst b/docs/sphinx/rest_substitutions/overviews/scrolling_overview.rst new file mode 100644 index 00000000..76fb329f --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/scrolling_overview.rst @@ -0,0 +1,68 @@ +.. include:: headings.inc + + +.. _scrolled windows: + +================================================= +|phoenix_title| **Scrolled Windows Overview** +================================================= + + +Scrollbars come in various guises in wxWidgets. All windows have the potential to show a vertical scrollbar and/or a horizontal +scrollbar: it is a basic capability of a window. However, in practice, not all windows do make use of scrollbars, such as a +single-line :ref:`TextCtrl`. + +Because any class derived from :ref:`Window` may have scrollbars, there are functions to manipulate the scrollbars and event +handlers to intercept scroll events. But just because a window generates a scroll event, doesn't mean that the window necessarily +handles it and physically scrolls the window. The base class :ref:`Window` in fact doesn't have any default functionality to +handle scroll events. If you created a :ref:`Window` object with scrollbars, and then clicked on the scrollbars, nothing at +all would happen. This is deliberate, because the interpretation of scroll events varies from one window class to another. + +:ref:`ScrolledWindow` is an example of a window that adds functionality to make scrolling really work. It assumes that scrolling +happens in consistent units, not different-sized jumps, and that page size is represented by the visible portion of the window. +It is suited to drawing applications, but perhaps not so suitable for a sophisticated editor in which the amount scrolled may +vary according to the size of text on a given line. For this, you would derive from :ref:`Window` and implement scrolling yourself. +:ref:`grid.Grid` is an example of a class that implements its own scrolling, largely because columns and rows can vary in size. + + +The Scrollbar Model +------------------- + +The function :meth:`Window.SetScrollbar` gives a clue about the way a scrollbar is modeled. This function takes the following arguments: + +=================== =================================== +`orientation` Which scrollbar: ``VERTICAL`` or ``HORIZONTAL``. +`position` The position of the scrollbar in scroll units. +`visible` The size of the visible portion of the scrollbar, in scroll units. +`range` The maximum position of the scrollbar. +`refresh` Whether the scrollbar should be repainted. +=================== =================================== + +`orientation` determines whether we're talking about the built-in horizontal or vertical scrollbar. + +`position` is simply the position of the 'thumb' (the bit you drag to scroll around). It is given in scroll units, and so is +relative to the total range of the scrollbar. + +`visible` gives the number of scroll units that represents the portion of the window currently visible. Normally, a scrollbar is +capable of indicating this visually by showing a different length of thumb. + +`range` is the maximum value of the scrollbar, where zero is the start position. You choose the units that suit you, so if you wanted to display text that has 100 lines, you would set this to 100. Note that this doesn't have to correspond to the number of pixels scrolled - it is up to you how you actually show the contents of the window. + +`refresh` just indicates whether the scrollbar should be repainted immediately or not. + + +An Example +---------- + +Let's say you wish to display 50 lines of text, using the same font. The window is sized so that you can only see 16 lines at a time. You would use:: + + SetScrollbar(wx.VERTICAL, 0, 16, 50) + + +.. note:: Note that with the window at this size, the thumb position can never go above 50 minus 16, or 34. You can determine how many lines + are currently visible by dividing the current view size by the character height in pixels. + +When defining your own scrollbar behaviour, you will always need to recalculate the scrollbar settings when the window size changes. You +could therefore put your scrollbar calculations and `SetScrollbar` call into a function named `AdjustScrollbars`, which can be called +initially and also from your :ref:`SizeEvent` handler function. + diff --git a/docs/sphinx/rest_substitutions/overviews/sizers_overview.rst b/docs/sphinx/rest_substitutions/overviews/sizers_overview.rst new file mode 100644 index 00000000..bd04081f --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/sizers_overview.rst @@ -0,0 +1,331 @@ +.. include:: headings.inc + + +.. _sizers overview: + +============================================= +|phoenix_title| **Sizers Overview** +============================================= + + +Sizers, as represented by the :ref:`Sizer` class and its descendants in the wxPython class hierarchy, have become the method of +choice to define the layout of controls in dialogs in wxPython because of their ability to create visually appealing dialogs +independent of the platform, taking into account the differences in size and style of the individual controls. +Editors such as wxDesigner, DialogBlocks, XRCed and wxWorkshop create dialogs based exclusively on sizers, practically forcing +the user to create platform independent layouts without compromises. + +The next section describes and shows what can be done with sizers. The following sections briefly describe how to program with +individual sizer classes. + + +The Idea Behind Sizers +---------------------- + +The layout algorithm used by sizers in wxPython is closely related to layout systems in other GUI toolkits, such as Java's AWT, +the GTK toolkit or the Qt toolkit. It is based upon the idea of individual subwindows reporting their minimal required size and +their ability to get stretched if the size of the parent window has changed. This will most often mean that the programmer does +not set the start-up size of a dialog, the dialog will rather be assigned a sizer and this sizer will be queried about the +recommended size. This sizer in turn will query its children (which can be normal windows, empty space or other sizers) so +that a hierarchy of sizers can be constructed. Note that :ref:`Sizer` does not derive from :ref:`Window` and thus does not +interfere with tab ordering and requires very few resources compared to a real window on screen. + +What makes sizers so well fitted for use in wxPython is the fact that every control reports its own minimal size and the algorithm +can handle differences in font sizes or different window (dialog item) sizes on different platforms without problems. For example, +if the standard font as well as the overall design of Linux/GTK widgets requires more space than on Windows, the initial dialog +size will automatically be bigger on Linux/GTK than on Windows. + +There are currently five different kinds of sizers available in wxPython. Each represents either a certain way to lay out dialog +items in a dialog or it fulfills a special task such as wrapping a static box around a dialog item (or another sizer). These sizers +will be discussed one by one in the text below. For more detailed information on how to use sizers programmatically, please refer +to the section :ref:`Programming with BoxSizer `. + + +Common Features +--------------- + +All sizers are containers, that is, they are used to lay out one dialog item (or several dialog items), which they contain. Such +items are sometimes referred to as the children of the sizer. Independent of how the individual sizers lay out their children, +all children have certain features in common: + +**A minimal size**: This minimal size is usually identical to the initial size of the controls and may either be set explicitly in +the :ref:`Size` field of the control constructor or may be calculated by wxPython, typically by setting the height and/or the width +of the item to -1. Note that only some controls can calculate their size (such as a checkbox) whereas others (such as a listbox) +don't have any natural width or height and thus require an explicit size. Some controls can calculate their height, but not their +width (e.g. a single line text control): + + +.. figure:: _static/images/overviews/overview_sizer_04.png + :align: center + + +| + + +**A border**: The border is just empty space and is used to separate dialog items in a dialog. This border can either be all around, +or at any combination of sides such as only above and below the control. The thickness of this border must be set explicitly, typically +5 points. The following samples show dialogs with only one dialog item (a button) and a border of 0, 5, and 10 pixels around the button: + + +.. figure:: _static/images/overviews/overview_sizer_02.png + :align: center + + +| + + +**An alignment**: Often, a dialog item is given more space than its minimal size plus its border. Depending on what flags are used +for the respective dialog item, the dialog item can be made to fill out the available space entirely, i.e. it will grow to a size +larger than the minimal size, or it will be moved to either the centre of the available space or to either side of the space. The +following sample shows a listbox and three buttons in a horizontal box sizer; one button is centred, one is aligned at the top, one is +aligned at the bottom: + + +.. figure:: _static/images/overviews/overview_sizer_06.png + :align: center + + +| + + +**A stretch factor**: If a sizer contains more than one child and it is offered more space than its children and their borders need, the +question arises how to distribute the surplus space among the children. For this purpose, a stretch factor may be assigned to each child, +where the default value of 0 indicates that the child will not get more space than its requested minimum size. A value of more than zero +is interpreted in relation to the sum of all stretch factors in the children of the respective sizer, i.e. if two children get a stretch +factor of 1, they will get half the extra space each independent of whether one control has a minimal sizer inferior to the other or not. +The following sample shows a dialog with three buttons, the first one has a stretch factor of 1 and thus gets stretched, whereas the other +two buttons have a stretch factor of zero and keep their initial width: + + +.. figure:: _static/images/overviews/overview_sizer_07.png + :align: center + + +| + + +Within wxDesigner, this stretch factor gets set from the `Option` menu. + + +Hiding Controls Using Sizers +---------------------------- + +You can hide controls contained in sizers the same way you would hide any control, using the :meth:`Window.Show` method. However, :ref:`Sizer` +also offers a separate method which can tell the sizer not to consider that control in its size calculations. To hide a window using the +sizer, call :meth:`Sizer.Show`. You must then call `Layout` on the sizer to force an update. + +This is useful when hiding parts of the interface, since you can avoid removing the controls from the sizer and having to add them back later. + +.. note:: This is supported only by :ref:`BoxSizer` and :ref:`FlexGridSizer`. + + + +BoxSizer +^^^^^^^^ + +:ref:`BoxSizer` can lay out its children either vertically or horizontally, depending on what flag is being used in its constructor. +When using a vertical sizer, each child can be centered, aligned to the right or aligned to the left. Correspondingly, when using a +horizontal sizer, each child can be centered, aligned at the bottom or aligned at the top. The stretch factor described in the last +paragraph is used for the main orientation, i.e. when using a horizontal box sizer, the stretch factor determines how much the child can +be stretched horizontally. The following sample shows the same dialog as in the last sample, only the box sizer is a vertical box sizer now: + +.. figure:: _static/images/overviews/overview_sizer_08.png + :align: center + + + +StaticBoxSizer +^^^^^^^^^^^^^^ + +:ref:`StaticBoxSixer` is the same as a :ref:`BoxSizer`, but surrounded by a static box. Here is a sample: + + +.. figure:: _static/images/overviews/overview_sizer_09.png + :align: center + + + +GridSizer +^^^^^^^^^ + +:ref:`GridSizer` is a two-dimensional sizer. All children are given the same size, which is the minimal size required by the biggest +child, in this case the text control in the left bottom border. Either the number of columns or the number or rows is fixed and the grid +sizer will grow in the respectively other orientation if new children are added: + + +.. figure:: _static/images/overviews/overview_sizer_10.png + :align: center + + +For programming information, see :ref:`GridSizer`. + + +FlexGridSizer +^^^^^^^^^^^^^ + +Another two-dimensional sizer derived from :ref:`GridSizer`. The width of each column and the height of each row are calculated individually +according to the minimal requirements from the respectively biggest child. Additionally, columns and rows can be declared to be stretchable +if the sizer is assigned a size different from the one it requested. The following sample shows the same dialog as the one above, but using +a flex grid sizer: + + +.. figure:: _static/images/overviews/overview_sizer_11.png + :align: center + + + +.. _programming with boxsizer: + +Programming with BoxSizer +--------------------------- + +The basic idea behind a :ref:`BoxSizer` is that windows will most often be laid out in rather simple basic geometry, typically in a row or a +column or several hierarchies of either. + +As an example, we will construct a dialog that will contain a text field at the top and two buttons at the bottom. This can be seen as a +top-hierarchy column with the text at the top and buttons at the bottom and a low-hierarchy row with an ``OK`` button to the left and a ``Cancel`` +button to the right. In many cases (particularly dialogs under Unix and normal frames) the main window will be resizable by the user and this +change of size will have to get propagated to its children. In our case, we want the text area to grow with the dialog, whereas the button +shall have a fixed size. In addition, there will be a thin border around all controls to make the dialog look nice and - to make matter worse - the +buttons shall be centred as the width of the dialog changes. + +It is the unique feature of a box sizer, that it can grow in both directions (height and width) but can distribute its growth in the +main direction (horizontal for a row) `unevenly` among its children. In our example case, the vertical sizer is supposed to propagate all its +height changes to only the text area, not to the button area. This is determined by the `proportion` parameter when adding a window (or +another sizer) to a sizer. It is interpreted as a weight factor, i.e. it can be zero, indicating that the window may not be resized at all, +or above zero. If several windows have a value above zero, the value is interpreted relative to the sum of all weight factors of the sizer, +so when adding two windows with a value of 1, they will both get resized equally much and each half as much as the sizer owning them. +Then what do we do when a column sizer changes its width? This behaviour is controlled by `flags` (the second parameter of the `Add()` function): +Zero or no flag indicates that the window will preserve it is original size, ``GROW`` flag (same as ``EXPAND``) forces the window to grow with +the sizer, and ``SHAPED`` flag tells the window to change it is size proportionally, preserving original aspect ratio. When ``GROW`` flag is +not used, the item can be aligned within available space. ``ALIGN_LEFT``, ``ALIGN_TOP``, ``ALIGN_RIGHT``, ``ALIGN_BOTTOM``, ``ALIGN_CENTER_HORIZONTAL`` +and ``ALIGN_CENTER_VERTICAL`` do what they say. ``ALIGN_CENTRE`` (same as ``ALIGN_CENTER``) is defined as +(``ALIGN_CENTER_HORIZONTAL`` | ``ALIGN_CENTER_VERTICAL``). Default alignment is ``ALIGN_LEFT`` | ``ALIGN_TOP``. + +As mentioned above, any window belonging to a sizer may have a border, and it can be specified which of the four sides may have this border, +using the ``TOP``, ``LEFT``, ``RIGHT`` and ``BOTTOM`` constants or ``ALL`` for all directions (and you may also use ``NORTH``, ``WEST`` etc instead). +These flags can be used in combination with the alignment flags above as the second parameter of the `Add()` method using the binary or operator ``|``. +The sizer of the border also must be made known, and it is the third parameter in the `Add()` method. This means, that the entire behaviour of a +sizer and its children can be controlled by the three parameters of the `Add()` method. + +Example:: + + # We want to get a dialog that is stretchable because it + # has a text ctrl at the top and two buttons at the bottom. + + class MyDialog(wx.Dialog): + + def __init__(self, parent, id, title): + + wx.Dialog(parent, id, title, wx.DefaultPosition, wx.DefaultSize, + wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) + + topsizer = wx.BoxSizer(wx.VERTICAL) + + # create text ctrl with minimal size 100x60 + topsizer.Add( + wx.TextCtrl(self, -1, "My text.", wx.DefaultPosition, wx.Size(100,60), wx.TE_MULTILINE), + 1, # make vertically stretchable + wx.EXPAND | # make horizontally stretchable + wx.ALL, # and make border all around + 10) # set border width to 10 + + button_sizer = wx.BoxSizer(wx.HORIZONTAL) + button_sizer.Add( + wx.Button(self, wx.ID_OK, "OK"), + 0, # make horizontally unstretchable + wx.ALL, # make border all around (implicit top alignment) + 10) # set border width to 10 + button_sizer.Add( + wx.Button(self, wx.ID_CANCEL, "Cancel"), + 0, # make horizontally unstretchable + wx.ALL, # make border all around (implicit top alignment) + 10) # set border width to 10 + + topsizer.Add( + button_sizer, + 0, # make vertically unstretchable + wx.ALIGN_CENTER) # no border and centre horizontally + + self.SetSizerAndFit(topsizer) # use the sizer for layout and size window + # accordingly and prevent it from being resized + # to smaller size + + + +Note that the new way of specifying flags to :ref:`Sizer` is via :ref:`SizerFlags`. This class greatly eases the burden of passing flags to a :ref:`Sizer`. + +Here's how you'd do the previous example with :ref:`SizerFlags`:: + + + # We want to get a dialog that is stretchable because it + # has a text ctrl at the top and two buttons at the bottom. + + class MyDialog(wx.Dialog): + + def __init__(self, parent, id, title): + + wx.Dialog(parent, id, title, wx.DefaultPosition, wx.DefaultSize, + wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) + + topsizer = wx.BoxSizer(wx.VERTICAL) + + # create text ctrl with minimal size 100x60 + topsizer.Add( + wx.TextCtrl(self, -1, "My text.", wx.DefaultPosition, wx.Size(100,60), wx.TE_MULTILINE), + wx.SizerFlags(1).Align().Expand().Border(wx.ALL, 10)) + + button_sizer = wx.BoxSizer(wx.HORIZONTAL) + button_sizer.Add( + wx.Button(self, wx.ID_OK, "OK"), + wx.SizerFlags(0).Align().Border(wx.ALL, 10)) + + button_sizer.Add( + wx.Button(self, wx.ID_CANCEL, "Cancel"), + wx.SizerFlags(0).Align().Border(wx.ALL, 10)) + + topsizer.Add( + button_sizer, + wx.SizerFlags(0).Center()) + + self.SetSizerAndFit(topsizer) # use the sizer for layout and set size and hints + + + +Other Types of Sizers +--------------------- + +:ref:`GridSizer` is a sizer which lays out its children in a two-dimensional table with all table fields having the same size, i.e. +the width of each field is the width of the widest child, the height of each field is the height of the tallest child. + +:ref:`FlexGridSizer` is a sizer which lays out its children in a two-dimensional table with all table fields in one row having the +same height and all fields in one column having the same width, but all rows or all columns are not necessarily the same height or +width as in the :ref:`GridSizer`. + +:ref:`StaticBoxSizer` is a sizer derived from :ref:`BoxSizer` but adds a static box around the sizer. Note that this static box +has to be created separately. + +:ref:`GridBagSizer` is a rather special kind of sizer which, unlike the other classes, allows to directly put the elements at the +given position in the sizer. Please see its documentation for more details. + + +CreateButtonSizer +----------------- + +As a convenience, :meth:`Dialog.CreateButtonSizer` (flags) can be used to create a standard button sizer in which standard buttons +are displayed. The following flags can be passed to this method:: + + wx.YES_NO # Add Yes/No subpanel + wx.YES # return wx.ID_YES + wx.NO # return wx.ID_NO + wx.NO_DEFAULT # make the wx.NO button the default, + # otherwise wx.YES or wx.OK button will be default + + wx.OK # return wx.ID_OK + wx.CANCEL # return wx.ID_CANCEL + wx.HELP # return wx.ID_HELP + + wx.FORWARD # return wx.ID_FORWARD + wx.BACKWARD # return wx.ID_BACKWARD + wx.SETUP # return wx.ID_SETUP + wx.MORE # return wx.ID_MORE + diff --git a/docs/sphinx/rest_substitutions/overviews/splitterwindow_overview.rst b/docs/sphinx/rest_substitutions/overviews/splitterwindow_overview.rst new file mode 100644 index 00000000..e7e1ff2e --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/splitterwindow_overview.rst @@ -0,0 +1,69 @@ +.. include:: headings.inc + + +.. _splitterwindow overview: + +================================================= +|phoenix_title| **Splitter Windows Overview** +================================================= + + +The following screenshot shows the appearance of a splitter window with a horizontal split. + +The style ``SP_3D`` has been used to show a 3D border and 3D sash. + +.. figure:: _static/images/overviews/overview_splitter_3d.png + :align: center + + + +Example +------- + +The following fragment shows how to create a splitter window, creating two subwindows and hiding one of them:: + + splitter = wx.SplitterWindow(self, -1, wx.Point(0, 0), + wx.Size(400, 400), wx.SP_3D) + + leftWindow = MyWindow(splitter) + leftWindow.SetScrollbars(20, 20, 50, 50) + + rightWindow = MyWindow(splitter) + rightWindow.SetScrollbars(20, 20, 50, 50) + rightWindow.Show(False) + + splitter.Initialize(leftWindow) + + # Set this to prevent unsplitting + # splitter.SetMinimumPaneSize(20) + + +The next fragment shows how the splitter window can be manipulated after creation:: + + def OnSplitVertical(self, event): + + if splitter.IsSplit(): + splitter.Unsplit() + + leftWindow.Show(True) + rightWindow.Show(True) + splitter.SplitVertically(leftWindow, rightWindow) + + + def OnSplitHorizontal(self, event): + + if splitter.IsSplit(): + splitter.Unsplit() + + leftWindow.Show(True) + rightWindow.Show(True) + splitter.SplitHorizontally(leftWindow, rightWindow) + + + def OnUnsplit(self, event): + + if splitter.IsSplit(): + splitter.Unsplit() + + + diff --git a/docs/sphinx/rest_substitutions/overviews/standard_event_identifiers.rst b/docs/sphinx/rest_substitutions/overviews/standard_event_identifiers.rst new file mode 100644 index 00000000..3b90402d --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/standard_event_identifiers.rst @@ -0,0 +1,24 @@ +.. include:: headings.inc + + +.. _standard event identifiers: + +=============================================== +|phoenix_title| **Standard event identifiers** +=============================================== + +wxPython defines a special identifier value ``ID_ANY`` (-1) which is used in the following two situations: + +- When creating a new window you may specify ``ID_ANY`` to let wxPython assign an unused identifier to it automatically +- When installing an event handler using :meth:`EvtHandler.Bind`, you may use it to indicate that you want to handle + the events coming from any control, regardless of its identifier + + +Another standard special identifier value is ``ID_NONE``: this is a value which is not matched by any other id. + +wxPython also defines a few standard command identifiers which may be used by the user code and also are sometimes +used by wxPython itself. These reserved identifiers are all in the range between ``ID_LOWEST`` and ``ID_HIGHEST`` and, +accordingly, the user code should avoid defining its own constants in this range (e.g. by using :func:`NewId` ()). + +Refer to :ref:`the list of stock items ` for the subset of standard IDs which are stock IDs as well. + diff --git a/docs/sphinx/rest_substitutions/overviews/stock_items.rst b/docs/sphinx/rest_substitutions/overviews/stock_items.rst new file mode 100644 index 00000000..ec2f5ab3 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/stock_items.rst @@ -0,0 +1,240 @@ +.. include:: headings.inc + + +.. _stock items: + +=============================================== +|phoenix_title| **Stock items** +=============================================== + +The following is the list of the window IDs for which stock buttons and menu items are created. + +See the :ref:`Button` constructor and the :ref:`MenuItem` constructor for classes which automatically +add stock bitmaps when using stock IDs. Also note that you can retrieve stock bitmaps using :ref:`ArtProvider`. + + ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| Stock ID | GTK Icon | Stock label | ++======================================+======================================================================+==========================+ +| ``ID_ABOUT`` | .. figure:: _static/images/stock/gtk-about.png | &About... | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_ADD`` | .. figure:: _static/images/stock/gtk-add.png | Add | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_APPLY`` | .. figure:: _static/images/stock/gtk-apply.png | &Apply | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_BACKWARD`` | .. figure:: _static/images/stock/gtk-go-back-ltr.png | &Back | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_BOLD`` | .. figure:: _static/images/stock/gtk-bold.png | &Bold | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_BOTTOM`` | .. figure:: _static/images/stock/gtk-goto-bottom.png | &Bottom | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_CANCEL`` | .. figure:: _static/images/stock/gtk-cancel.png | &Cancel | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_CDROM`` | .. figure:: _static/images/stock/gtk-cdrom.png | &CD-Rom | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_CLEAR`` | .. figure:: _static/images/stock/gtk-clear.png | &Clear | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_CLOSE`` | .. figure:: _static/images/stock/gtk-close.png | &Close | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_CONVERT`` | .. figure:: _static/images/stock/gtk-convert.png | &Convert | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_COPY`` | .. figure:: _static/images/stock/gtk-copy.png | &Copy | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_CUT`` | .. figure:: _static/images/stock/gtk-cut.png | Cu&t | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_DELETE`` | .. figure:: _static/images/stock/gtk-delete.png | &Delete | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_DOWN`` | .. figure:: _static/images/stock/gtk-go-down.png | &Down | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_EDIT`` | .. figure:: _static/images/stock/gtk-edit.png | &Edit | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_EXECUTE`` | .. figure:: _static/images/stock/gtk-execute.png | &Execute | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_EXIT`` | .. figure:: _static/images/stock/gtk-quit.png | &Quit | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_FILE`` | .. figure:: _static/images/stock/gtk-file.png | &File | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_FIND`` | .. figure:: _static/images/stock/gtk-find.png | &Find | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_FIRST`` | .. figure:: _static/images/stock/gtk-goto-first-ltr.png | &First | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_FLOPPY`` | .. figure:: _static/images/stock/gtk-floppy.png | &Floppy | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_FORWARD`` | .. figure:: _static/images/stock/gtk-go-forward-ltr.png | &Forward | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_HARDDISK`` | .. figure:: _static/images/stock/gtk-harddisk.png | &Harddisk | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_HELP`` | .. figure:: _static/images/stock/gtk-help.png | &Help | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_HOME`` | .. figure:: _static/images/stock/gtk-home.png | &Home | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_INDENT`` | .. figure:: _static/images/stock/gtk-indent-ltr.png | Indent | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_INDEX`` | .. figure:: _static/images/stock/gtk-index.png | &Index | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_INFO`` | .. figure:: _static/images/stock/gtk-info.png | &Info | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_ITALIC`` | .. figure:: _static/images/stock/gtk-italic.png | &Italic | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_JUMP_TO`` | .. figure:: _static/images/stock/gtk-jump-to-ltr.png | &Jump to | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_JUSTIFY_CENTER`` | .. figure:: _static/images/stock/gtk-justify-center.png | Centered | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_JUSTIFY_FILL`` | .. figure:: _static/images/stock/gtk-justify-fill.png | Justified | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_JUSTIFY_LEFT`` | .. figure:: _static/images/stock/gtk-justify-left.png | Align Left | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_JUSTIFY_RIGHT`` | .. figure:: _static/images/stock/gtk-justify-right.png | Align Right | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_LAST`` | .. figure:: _static/images/stock/gtk-goto-last-ltr.png | &Last | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_NETWORK`` | .. figure:: _static/images/stock/gtk-network.png | &Network | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_NEW`` | .. figure:: _static/images/stock/gtk-new.png | &New | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_NO`` | .. figure:: _static/images/stock/gtk-no.png | &No | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_OK`` | .. figure:: _static/images/stock/gtk-ok.png | &OK | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_OPEN`` | .. figure:: _static/images/stock/gtk-open.png | &Open... | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_PASTE`` | .. figure:: _static/images/stock/gtk-paste.png | &Paste | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_PREFERENCES`` | .. figure:: _static/images/stock/gtk-preferences.png | &Preferences | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_PREVIEW`` | .. figure:: _static/images/stock/gtk-print-preview.png | Print previe&w | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_PRINT`` | .. figure:: _static/images/stock/gtk-print.png | &Print... | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_PROPERTIES`` | .. figure:: _static/images/stock/gtk-properties.png | &Properties | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_REDO`` | .. figure:: _static/images/stock/gtk-redo-ltr.png | &Redo | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_REFRESH`` | .. figure:: _static/images/stock/gtk-refresh.png | Refresh | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_REMOVE`` | .. figure:: _static/images/stock/gtk-remove.png | Remove | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_REPLACE`` | .. figure:: _static/images/stock/gtk-find-and-replace.png | Rep&lace | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_REVERT_TO_SAVED`` | .. figure:: _static/images/stock/gtk-revert-to-saved-ltr.png | Revert to Saved | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SAVE`` | .. figure:: _static/images/stock/gtk-save.png | &Save | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SAVEAS`` | .. figure:: _static/images/stock/gtk-save-as.png | Save &As... | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SELECTALL`` | .. figure:: _static/images/stock/gtk-select-all.png | Select &All | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SELECT_COLOR`` | .. figure:: _static/images/stock/gtk-select-color.png | &Color | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SELECT_FONT`` | .. figure:: _static/images/stock/gtk-select-font.png | &Font | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SORT_ASCENDING`` | .. figure:: _static/images/stock/gtk-sort-ascending.png | &Ascending | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SORT_DESCENDING`` | .. figure:: _static/images/stock/gtk-sort-descending.png | &Descending | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_SPELL_CHECK`` | .. figure:: _static/images/stock/gtk-spell-check.png | &Spell Check | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_STOP`` | .. figure:: _static/images/stock/gtk-stop.png | &Stop | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_STRIKETHROUGH`` | .. figure:: _static/images/stock/gtk-strikethrough.png | &Strikethrough | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_TOP`` | .. figure:: _static/images/stock/gtk-goto-top.png | &Top | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_UNDELETE`` | .. figure:: _static/images/stock/gtk-undelete-ltr.png | Undelete | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_UNDERLINE`` | .. figure:: _static/images/stock/gtk-underline.png | &Underline | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_UNDO`` | .. figure:: _static/images/stock/gtk-undo-ltr.png | &Undo | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_UNINDENT`` | .. figure:: _static/images/stock/gtk-unindent-ltr.png | &Unindent | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_UP`` | .. figure:: _static/images/stock/gtk-go-up.png | &Up | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_YES`` | .. figure:: _static/images/stock/gtk-yes.png | &Yes | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_ZOOM_100`` | .. figure:: _static/images/stock/gtk-zoom-100.png | &Actual Size | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_ZOOM_FIT`` | .. figure:: _static/images/stock/gtk-zoom-fit.png | Zoom to &Fit | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_ZOOM_IN`` | .. figure:: _static/images/stock/gtk-zoom-in.png | Zoom &In | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ +| ``ID_ZOOM_OUT`` | .. figure:: _static/images/stock/gtk-zoom-out.png | Zoom &Out | +| | :align: left | | ++--------------------------------------+----------------------------------------------------------------------+--------------------------+ + + +| + +.. note:: Note that some of the IDs listed above also have a stock accelerator and an associated help string. + diff --git a/docs/sphinx/rest_substitutions/overviews/validator_overview.rst b/docs/sphinx/rest_substitutions/overviews/validator_overview.rst new file mode 100644 index 00000000..cc024508 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/validator_overview.rst @@ -0,0 +1,108 @@ +.. include:: headings.inc + + +.. _validator overview: + +======================================= +|phoenix_title| **Validator Overview** +======================================= + + +.. _validator basic concepts: + +Validator basic concepts +------------------------ + +The aim of the validator concept is to make dialogs very much easier to write. A validator is an object that can be +plugged into a control (such as a :ref:`TextCtrl`), and mediates between Python data and the control, transferring +the data in either direction and validating it. It also is able to intercept events generated by the control, providing +filtering behaviour without the need to derive a new control class. + +:ref:`Validator` can also be used to intercept keystrokes and other events within an input field. To use a validator, +you have to create your own sub-class of :ref:`Validator` (neither `TextValidator` nor `GenericValidator` are implemented +in wxPython). This sub-class is then associated with your input field by calling:: + + myInputField.SetValidator(myValidator) + + +.. note:: Your :ref:`Validator` sub-class must implement the :meth:`Validator.Clone` method. + + +.. note:: + + Note that any :ref:`Window` may have a validator; using the ``WS_EX_VALIDATE_RECURSIVELY`` style (see + :ref:`Window extended styles `) you can also implement recursive validation. + + + +.. _anatomy of a validator: + +Anatomy of a Validator +---------------------- + +A programmer creating a new validator class should provide the following functionality. + +A validator constructor is responsible for allowing the programmer to specify the kind of validation required, and perhaps +a pointer to a Python variable that is used for storing the data for the control. If such a variable address is not supplied +by the user, then the validator should store the data internally. + +The :meth:`Validator.Validate` method should return true if the data in the control (not the Python variable) is valid. +It should also show an appropriate message if data was not valid. + +The :meth:`Validator.TransferToWindow` member function should transfer the data from the validator or associated Python +variable to the control. + +The :meth:`Validator.TransferFromWindow` member function should transfer the data from the control to the validator or +associated Python variable. + +There should be a copy constructor, and a :meth:`Validator.Clone` function which returns a copy of the validator object. +This is important because validators are passed by reference to window constructors, and must therefore be cloned internally. + +You can optionally define event handlers for the validator, to implement filtering. These handlers will capture events before +the control itself does (see :ref:`How Events are Processed `). + + + +.. _how validators interact with dialogs: + +How Validators Interact with Dialogs +------------------------------------ + + +For validators to work correctly, validator functions must be called at the right times during dialog initialisation and dismissal. + +When a :meth:`Dialog.Show` is called (for a modeless dialog) or :meth:`Dialog.ShowModal` is called (for a modal dialog), +the function :meth:`Window.InitDialog` is automatically called. This in turn sends an initialisation event to the dialog. The +default handler for the ``wxEVT_INIT_DIALOG`` event is defined in the :ref:`Window` class to simply call the function +:meth:`Window.TransferDataToWindow`. This function finds all the validators in the window's children and calls the +:meth:`Validator.TransferToWindow` function for each. Thus, data is transferred from Python variables to the dialog just as the +dialog is being shown. + +.. note:: If you are using a window or panel instead of a dialog, you will need to call :meth:`Window.InitDialog` explicitly before + showing the window. + + +When the user clicks on a button, for example the ``OK`` button, the application should first call :meth:`Window.Validate`, which +returns ``False`` if any of the child window validators failed to validate the window data. The button handler should return +immediately if validation failed. Secondly, the application should call :meth:`Window.TransferDataFromWindow` and return if this failed. +It is then safe to end the dialog by calling :meth:`Dialog.EndModal` (if modal) or :meth:`Dialog.Show` (if modeless). + +In fact, :ref:`Dialog` contains a default command event handler for the ``ID_OK`` button. It goes like this:: + + def OnOK(self, event): + + if self.Validate() and self.TransferDataFromWindow(): + + if self.IsModal(): + self.EndModal(wx.ID_OK) + else: + self.SetReturnCode(wx.ID_OK) + self.Show(False) + + + +So if using validators and a normal ``OK`` button, you may not even need to write any code for handling dialog dismissal. + +If you load your dialog from a resource file, you will need to iterate through the controls setting validators, since validators +can't be specified in a dialog resource. + diff --git a/docs/sphinx/rest_substitutions/overviews/window_deletion_overview.rst b/docs/sphinx/rest_substitutions/overviews/window_deletion_overview.rst new file mode 100644 index 00000000..b0c2cbf8 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/window_deletion_overview.rst @@ -0,0 +1,95 @@ +.. include:: headings.inc + + +.. _window deletion: + +============================================= +|phoenix_title| **Window Deletion Overview** +============================================= + + +Window deletion can be a confusing subject, so this overview is provided to help make it clear when and +how you delete windows, or respond to user requests to close windows. + + + +Sequence of Events During Window Deletion +----------------------------------------- + +When the user clicks on the system close button or system close command, in a frame or a dialog, wxPython calls :meth:`Window.Close`. +This in turn generates an ``EVT_CLOSE`` event: see :ref:`CloseEvent`. + +It is the duty of the application to define a suitable event handler, and decide whether or not to destroy the window. If the +application is for some reason forcing the application to close (:meth:`CloseEvent.CanVeto` returns ``False``), the window should +always be destroyed, otherwise there is the option to ignore the request, or maybe wait until the user has answered a question +before deciding whether it is safe to close. The handler for ``EVT_CLOSE`` should signal to the calling code if it does not destroy +the window, by calling :meth:`CloseEvent.Veto`. Calling this provides useful information to the calling code. + +The :ref:`CloseEvent` handler should only call :meth:`Window.Destroy` to delete the window, and not use the `del` operator. This +is because for some window classes, wxPython delays actual deletion of the window until all events have been processed, since otherwise +there is the danger that events will be sent to a non-existent window. + +As reinforced in the next section, calling `Close` does not guarantee that the window will be destroyed. Call :meth:`Window.Destroy` +if you want to be certain that the window is destroyed. + + + +Closing Windows +--------------- + +Your application can either use :meth:`Window.Close` event just as the framework does, or it can call :meth:`Window.Destroy` directly. +If using `Close()`, you can pass a ``True`` argument to this function to tell the event handler that we definitely want to delete +the frame and it cannot be vetoed. + +The advantage of using `Close` instead of `Destroy` is that it will call any clean-up code defined by the ``EVT_CLOSE`` handler; for +example it may close a document contained in a window after first asking the user whether the work should be saved. `Close` can be +vetoed by this process (return ``False``), whereas `Destroy` definitely destroys the window. + + + +Default Window Close Behaviour +------------------------------ + +The default close event handler for :ref:`Dialog` simulates a ``Cancel`` command, generating a ``ID_CANCEL`` event. Since the handler +for this cancel event might itself call `Close`, there is a check for infinite looping. The default handler for ``ID_CANCEL`` hides +the dialog (if modeless) or calls `EndModal(ID_CANCEL)` (if modal). In other words, by default, the dialog is not destroyed. + +The default close event handler for :ref:`Frame` destroys the frame using `Destroy()`. + + + +User Calls to Exit From a Menu +------------------------------ + +What should I do when the user calls up `Exit` from a menu? You can simply call :meth:`Window.Close` on the frame. This will invoke +your own close event handler which may destroy the frame. + +You can do checking to see if your application can be safely exited at this point, either from within your close event handler, or +from within your exit menu command handler. For example, you may wish to check that all files have been saved. Give the user a chance +to save and quit, to not save but quit anyway, or to cancel the exit command altogether. + + + +Exiting the Application Gracefully +---------------------------------- + +A wxPython application automatically exits when the last top level window (:ref:`Frame` or :ref:`Dialog`), is destroyed. Put any +application-wide cleanup code in :meth:`AppConsole.OnExit` (this is a method, not an event handler). + + + +Automatic Deletion of Child Windows +----------------------------------- + +Child windows are deleted from within the parent destructor. This includes any children that are themselves frames or dialogs, so you +may wish to close these child frame or dialog windows explicitly from within the parent close handler. + + + +Other Kinds of Windows +---------------------- + +So far we've been talking about 'managed' windows, i.e. frames and dialogs. Windows with parents, such as controls, don't have delayed +destruction and don't usually have close event handlers, though you can implement them if you wish. For consistency, continue to use +the :meth:`Window.Destroy` method instead of the `del` operator when deleting these kinds of windows explicitly. + diff --git a/docs/sphinx/rest_substitutions/overviews/window_ids_overview.rst b/docs/sphinx/rest_substitutions/overviews/window_ids_overview.rst new file mode 100644 index 00000000..22cfc636 --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/window_ids_overview.rst @@ -0,0 +1,30 @@ +.. include:: headings.inc + + +.. _window ids: + +================================================= +|phoenix_title| **Window IDs Overview** +================================================= + + +Various controls and other parts of wxPython need an ID. Sometimes the ID may be directly provided by the user or +have a predefined value, such as ``ID_OPEN``. Often, however, the value of the ID is unimportant and is created +automatically by calling :meth:`Window.NewControlId` or by passing ``ID_ANY`` as the ID of an object. + +There are two ways to generate an ID. One way is to start at a negative number, and for each new ID, return the +next smallest number. This is fine for systems that can use the full range of negative numbers for IDs, as +this provides more than enough IDs and it would take a very very long time to run out and wrap around. +However, some systems cannot use the full range of the ID value. Windows, for example, can only use 16 bit +IDs, and only has about 32000 possible automatic IDs that can be generated by :meth:`Window.NewControlId`. +If the program runs long enough, depending on the program itself, using this first method would cause the IDs +to wrap around into the positive ID range and cause possible clashes with any directly specified ID values. + +The other way is to keep track of the IDs returned by :meth:`Window.NewControlId` and don't return them again +until the ID is completely free and not being used by any other objects. This will make sure that the ID values +do not clash with one another. This is accomplished by keeping a reference count for each of the IDs that can +possibly be returned by :meth:`Window.NewControlId`. Other IDs are not reference counted. + + +.. seealso:: :ref:`IdManager`, :meth:`Window.NewControlId`, :meth:`Window.UnreserveControlId` + diff --git a/docs/sphinx/rest_substitutions/overviews/window_sizing_overview.rst b/docs/sphinx/rest_substitutions/overviews/window_sizing_overview.rst new file mode 100644 index 00000000..c5a6129c --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/window_sizing_overview.rst @@ -0,0 +1,70 @@ +.. include:: headings.inc + + +.. _window sizing overview: + +=========================================== +|phoenix_title| **Window Sizing Overview** +=========================================== + + +It can sometimes be confusing to keep track of the various size-related attributes of a :ref:`Window`, how they +relate to each other, and how they interact with sizers. + +This document will attempt to clear the fog a little, and give some simple explanations of things. + +Glossary +-------- + +- **"Best Size"**: the best size of a widget depends on what kind of widget it is, and usually also on the contents of + the widget. For example a :ref:`ListBox` 's best size will be calculated based on how many items it has, up to a + certain limit, or a :ref:`Button` 's best size will be calculated based on its label size, but normally won't be smaller + than the platform default button size (unless a style flag overrides that). There is a special method in the wxPython + window classes called :meth:`Window.DoGetBestSize` that a class needs to override if it wants to calculate its own best + size based on its content. +- **"Minimal Size"**: the minimal size of a widget is a size that is normally explicitly set by the programmer either + with the :meth:`Window.SetMinSize` method or with the :meth:`Window.SetSizeHints` method. Most controls will also set + the minimal size to the size given in the control's constructor if a non-default value is passed. Top-level windows + such as :ref:`Frame` will not allow the user to resize the frame below the minimal size. +- **"Maximum Size"**: just like for the minimal size, the maximum size is normally explicitly set by the programmer with + the :meth:`Window.SetMaxSize` method or with :meth:`Window.SetSizeHints`. Top-level windows such as :ref:`Frame` will + not allow the user to resize the frame above the maximum size. +- **"Size"**: the size of a widget can be explicitly set or fetched with the :meth:`Window.SetSize` or :meth:`Window.GetSize` + methods. This size value is the size that the widget is currently using on screen and is the way to change the size of + something that is not being managed by a sizer. +- **"Client Size"**: the client size represents the widget's area inside of any borders belonging to the widget and is the + area that can be drawn upon in a ``EVT_PAINT`` event. If a widget doesn't have a border then its client size is the + same as its size. +- **"Initial Size"**: the initial size of a widget is the size given to the constructor of the widget, if any. As mentioned + above most controls will also set this size value as the control's minimal size. If the size passed to the constructor is + the default ``DefaultSize``, or if the size is not fully specified (such as `wx.Size(150, -1)`) then most controls will + fill in the missing size components using the best size and will set the initial size of the control to the resulting size. +- **"Virtual Size"**: the virtual size is the size of the potentially viewable area of the widget. The virtual size of a + widget may be larger than its actual size and in this case scrollbars will appear to the let the user 'explore' the full + contents of the widget. See :ref:`Scrolled` for more info. + + + +Functions related to sizing +--------------------------- + +- :meth:`Window.GetEffectiveMinSize`: returns a blending of the widget's minimal size and best size, giving precedence to + the minimal size. For example, if a widget's min size is set to (150, -1) and the best size is (80, 22) then the best + fitting size is (150, 22). If the min size is (50, 20) then the best fitting size is (50, 20). This method is what is + called by the sizers when determining what the requirements of each item in the sizer is, and is used for calculating + the overall minimum needs of the sizer. +- :meth:`Window.SetInitialSize`: this is a little different than the typical size setters. Rather than just setting an + "initial size" attribute it actually sets the minimal size to the value passed in, blends that value with the best size, + and then sets the size of the widget to be the result. So you can consider this method to be a "Smart SetSize". This + method is what is called by the constructor of most controls to set the minimal size and the initial size of the control. +- :meth:`Window.Fit`: this method sets the size of a window to fit around its children. If it has no children then nothing + is done, if it does have children then the size of the window is set to the window's best size. +- :meth:`Sizer.Fit`: this sets the size of the window to be large enough to accommodate the minimum size needed by the sizer, + (along with a few other constraints...). If the sizer is the one that is assigned to the window then this should be + equivalent to :meth:`Window.Fit`. +- :meth:`Sizer.Layout`: recalculates the minimum space needed by each item in the sizer, and then lays out the items + within the space currently allotted to the sizer. +- :meth:`Window.Layout`: if the window has a sizer then it sets the space given to the sizer to the current size of the window, + which results in a call to :meth:`Sizer.Layout`. If the window has layout constraints instead of a sizer then the constraints + algorithm is run. The `Layout()` method is what is called by the default ``EVT_SIZE`` handler for container windows. + diff --git a/docs/sphinx/rest_substitutions/overviews/window_styles_overview.rst b/docs/sphinx/rest_substitutions/overviews/window_styles_overview.rst new file mode 100644 index 00000000..e3ed8b7d --- /dev/null +++ b/docs/sphinx/rest_substitutions/overviews/window_styles_overview.rst @@ -0,0 +1,22 @@ +.. include:: headings.inc + + +.. _window styles: + +================================================= +|phoenix_title| **Window Styles Overview** +================================================= + + +Window styles are used to specify alternative behaviour and appearances for windows, when they are created. + +The symbols are defined in such a way that they can be combined in a 'bit-list' using the Python `bitwise-or` operator (``|``). + +For example:: + + style = wx.CAPTION | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER + + +For the window styles specific to each window class, please see the documentation for the window. + +Most windows can use the generic styles listed for :ref:`Window` in addition to their own styles. diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/AcceleratorTable.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/AcceleratorTable.1.py new file mode 100644 index 00000000..6d3cd003 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/AcceleratorTable.1.py @@ -0,0 +1,10 @@ + + entries = [wx.AcceleratorEntry() for i in xrange(4)] + + entries[0].Set(wx.ACCEL_CTRL, 'N', ID_NEW_WINDOW) + entries[1].Set(wx.ACCEL_CTRL, 'X', wx.ID_EXIT) + entries[2].Set(wx.ACCEL_SHIFT, 'A', ID_ABOUT) + entries[3].Set(wx.ACCEL_NORMAL, wx.WXK_DELETE, wx.ID_CUT) + + accel = wx.AcceleratorTable(entries) + frame.SetAcceleratorTable(accel) \ No newline at end of file diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/App.SetTopWindow.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/App.SetTopWindow.1.py new file mode 100644 index 00000000..5dd00c7e --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/App.SetTopWindow.1.py @@ -0,0 +1,2 @@ + + wx.App.SetTopWindow(None) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Bitmap.__init__.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Bitmap.__init__.1.py new file mode 100644 index 00000000..f39f3787 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Bitmap.__init__.1.py @@ -0,0 +1,3 @@ + + newBitmap = oldBitmap.GetSubBitmap( + wx.Rect(0, 0, oldBitmap.GetWidth(), oldBitmap.GetHeight())) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/BoxSizer.AddSpacer.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/BoxSizer.AddSpacer.1.py new file mode 100644 index 00000000..f4e9389a --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/BoxSizer.AddSpacer.1.py @@ -0,0 +1,9 @@ + + if boxSizer.IsVertical(): + + boxSizer.Add(0, size, 0) + + else: + + boxSizer.Add(size, 0, 0) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/BusyCursor.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/BusyCursor.1.py new file mode 100644 index 00000000..52ef7fef --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/BusyCursor.1.py @@ -0,0 +1,7 @@ + + wait = wx.BusyCursor() + + for i in xrange(10000): + DoACalculation() + + del wait diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/CloseEvent.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/CloseEvent.1.py new file mode 100644 index 00000000..3b65b602 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/CloseEvent.1.py @@ -0,0 +1,15 @@ + + def OnClose(self, event): + + if event.CanVeto() and self.fileNotSaved: + + if wx.MessageBox("The file has not been saved... continue closing?", + "Please confirm", + wx.ICON_QUESTION | wx.YES_NO) != wx.YES: + + event.Veto() + return + + self.Destroy() # you may also do: event.Skip() + # since the default event handler does call Destroy(), too + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/CollapsiblePane.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/CollapsiblePane.1.py new file mode 100644 index 00000000..578ba92a --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/CollapsiblePane.1.py @@ -0,0 +1,12 @@ + + collpane = wx.CollapsiblePane(self, wx.ID_ANY, "Details:") + + # add the pane with a zero proportion value to the 'sz' sizer which contains it + sz.Add(collpane, 0, wx.GROW|wx.ALL, 5) + + # now add a test label in the collapsible pane using a sizer to layout it: + win = collpane.GetPane() + paneSz = wx.BoxSizer(wx.VERTICAL) + paneSz.Add(wx.StaticText(win, wx.ID_ANY, "test!"), 1, wx.GROW|wx.ALL, 2) + win.SetSizer(paneSz) + paneSz.SetSizeHints(win) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.1.py new file mode 100644 index 00000000..764211e7 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.1.py @@ -0,0 +1,14 @@ + + # using wx.Config instead of writing wx.FileConfig or wx.RegConfig enhances + # portability of the code + config = wx.Config("MyAppName") + strs = config.Read("LastPrompt") + + # another example: using default values and the full path instead of just + # key name: if the key is not found , the value 17 is returned + value = config.ReadInt("/LastRun/CalculatedValues/MaxValue", 17) + + # at the end of the program we would save everything back + config.Write("LastPrompt", strs) + config.Write("/LastRun/CalculatedValues/MaxValue", value) + \ No newline at end of file diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.2.py new file mode 100644 index 00000000..c1818b0c --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.2.py @@ -0,0 +1,23 @@ + + config = wx.Config("FooBarApp") + + # right now the current path is '/' + conf.Write("RootEntry", 1) + + # go to some other place: if the group(s) don't exist, they will be created + conf.SetPath("/Group/Subgroup") + + # create an entry in subgroup + conf.Write("SubgroupEntry", 3) + + # '..' is understood + conf.Write("../GroupEntry", 2) + conf.SetPath("..") + + if conf.ReadInt("Subgroup/SubgroupEntry", 0) != 3: + raise Exception('Invalid SubgroupEntry') + + # use absolute path: it is allowed, too + if conf.ReadInt("/RootEntry", 0) != 1: + raise Exception('Invalid RootEntry') + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.3.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.3.py new file mode 100644 index 00000000..ed3d7f85 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.3.py @@ -0,0 +1,10 @@ + + def foo(config): + + oldPath = config.GetPath() + + config.SetPath("/Foo/Data") + # ... + + config.SetPath(oldPath) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.4.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.4.py new file mode 100644 index 00000000..76dadbea --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.4.py @@ -0,0 +1,11 @@ + + def bar(config): + + config.Write("Test", 17) + + foo(config) + + # we're reading "/Foo/Data/Test" here! -1 will probably be returned... + if config.ReadInt("Test", -1) != 17: + raise Exception('Invalid Test') + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.5.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.5.py new file mode 100644 index 00000000..3808ea40 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigBase.5.py @@ -0,0 +1,21 @@ + + config = wx.Config("MyAppName") + names = [] + + # first enum all entries + more, value, index = config.GetFirstEntry() + + while more: + names.append(value) + more, value, index = config.GetNextEntry(index) + + # ... we have all entry names in names... + + # now all groups... + more, value, index = config.GetFirstGroup() + + while more: + names.append(value) + more, value, index = config.GetNextGroup(index) + + # ... we have all group (and entry) names in names... diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.1.py new file mode 100644 index 00000000..188d190f --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.1.py @@ -0,0 +1,21 @@ + + # this function loads somes settings from the given wx.Config object + # the path selected inside it is left unchanged + def LoadMySettings(config): + + changer = wx.ConfigPathChanger(config, "/Foo/Data/SomeString") + + strs = config.Read("SomeString") + + if not strs: + wx.LogError("Couldn't read SomeString!") + return False + + # NOTE: without wx.ConfigPathChanger it would be easy to forget to + # set the old path back into the wx.Config object before this return! + + + # do something useful with SomeString... + + return True # again: wx.ConfigPathChanger dtor will restore the original wx.Config path + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.1.py new file mode 100644 index 00000000..aef65fb8 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.1.py @@ -0,0 +1,2 @@ + + wx.ConfigPathChanger(wx.ConfigBase.Get(), "/MyProgram/SomeKeyName") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.2.py new file mode 100644 index 00000000..826fcabe --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/ConfigPathChanger.__init__.2.py @@ -0,0 +1,2 @@ + + wx.ConfigPathChanger(wx.ConfigBase.Get(), "/MyProgram/") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Control.SetLabelMarkup.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Control.SetLabelMarkup.1.py new file mode 100644 index 00000000..39c80505 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Control.SetLabelMarkup.1.py @@ -0,0 +1,7 @@ + + text = wx.StaticText(self, -1, 'Hello world!') + + # Some more code... + text.SetLabelMarkup("&Bed &mp " + "breakfast " + "available HERE") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Cursor.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Cursor.1.py new file mode 100644 index 00000000..89980a16 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Cursor.1.py @@ -0,0 +1,40 @@ + + down_bits = [255, 255, 255, 255, 31, + 255, 255, 255, 31, 255, 255, 255, 31, 255, 255, 255, + 31, 255, 255, 255, 31, 255, 255, 255, 31, 255, 255, + 255, 31, 255, 255, 255, 31, 255, 255, 255, 25, 243, + 255, 255, 19, 249, 255, 255, 7, 252, 255, 255, 15, 254, + 255, 255, 31, 255, 255, 255, 191, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255] + + down_mask = [240, 1, 0, 0, 240, 1, + 0, 0, 240, 1, 0, 0, 240, 1, 0, 0, 240, 1, 0, 0, 240, 1, + 0, 0, 240, 1, 0, 0, 240, 1, 0, 0, 255, 31, 0, 0, 255, + 31, 0, 0, 254, 15, 0, 0, 252, 7, 0, 0, 248, 3, 0, 0, + 240, 1, 0, 0, 224, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0] + + if wx.Platform == '__WXMSW__': + + down_bitmap = wx.BitmapFromBits(down_bits, 32, 32) + down_mask_bitmap = wx.BitmapFromBits(down_mask, 32, 32) + + down_bitmap.SetMask(wx.Mask(down_mask_bitmap)) + down_image = down_bitmap.ConvertToImage() + down_image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 6) + down_image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 14) + down_cursor = wx.Cursor(down_image) + + elif wx.Platform == '__WXGTK__': + + down_cursor = wx.Cursor(down_bits, 32, 32, 6, 14, + down_mask, wx.WHITE, wx.BLACK) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/DCClipper.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/DCClipper.1.py new file mode 100644 index 00000000..37242287 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/DCClipper.1.py @@ -0,0 +1,13 @@ + + def MyFunction(dc): + + clip = wx.DCClipper(dc, rect) + # ... drawing functions here are affected by clipping rect ... + + + def OtherFunction(): + + dc = wx.DC() + MyFunction(dc) + # ... drawing functions here are not affected by clipping rect ... + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.1.py new file mode 100644 index 00000000..acffa5bb --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.1.py @@ -0,0 +1,13 @@ + + def AskUser(self): + + dlg = MyAskDialog(self) + + if dlg.ShowModal() == wx.ID_OK: + # do something here + print 'Hello' + + # else: dialog was cancelled or some another button pressed + + dlg.Destroy() + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.2.py new file mode 100644 index 00000000..0d64b1e9 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Dialog.2.py @@ -0,0 +1,11 @@ + + def AskUser(self): + + dlg = MyAskDialog(self) + + if dlg.ShowModal() == wx.ID_OK: + # do something here + print 'Hello' + + # no need to call Destroy() here + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/DirDialog.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/DirDialog.1.py new file mode 100644 index 00000000..7b68c565 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/DirDialog.1.py @@ -0,0 +1,4 @@ + + dlg = wx.DirDialog (None, "Choose input directory", "", + wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Event.Clone.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Event.Clone.1.py new file mode 100644 index 00000000..1fc0e19e --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Event.Clone.1.py @@ -0,0 +1,4 @@ + + def Clone(self): + + return MyEvent() diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/EventBlocker.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/EventBlocker.1.py new file mode 100644 index 00000000..418883a0 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/EventBlocker.1.py @@ -0,0 +1,14 @@ + + def DoSomething(self): + # block all events directed to this window while + # we do the 1000 FunctionWhichSendsEvents() calls + blocker = wx.EventBlocker(self) + + for i in xrange(1000): + FunctionWhichSendsEvents(i) + + # wx.EventBlocker destructor called, old event handler is restored + + # the event generated by this call will be processed: + FunctionWhichSendsEvents(0) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/EventFilter.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/EventFilter.1.py new file mode 100644 index 00000000..a2e6568f --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/EventFilter.1.py @@ -0,0 +1,43 @@ + + # This class allows to determine the last time the user has worked with + # this application: + class LastActivityTimeDetector(wx.EventFilter): + + def __init__(self): + + wx.EventFilter.__init__(self) + + wx.EvtHandler.AddFilter(self) + + self.last = wx.DateTime.Now() + + + def __del__(self): + + wx.EvtHandler.RemoveFilter(self) + + + def FilterEvent(self, event): + + # Update the last user activity + t = event.GetEventType() + + if t == wx.EVT_KEY_DOWN or t == wx.EVT_MOTION or \ + t == wx.EVT_LEFT_DOWN or t == wx.EVT_RIGHT_DOWN or \ + t == wx.EVT_MIDDLE_DOWN: + + self.last = wx.DateTime.Now() + + + # Continue processing the event normally as well. + event.Skip() + + + # This function could be called periodically from some timer to + # do something (e.g. hide sensitive data or log out from remote + # server) if the user has been inactive for some time period. + def IsInactiveFor(self, diff): + + return wx.DateTime.Now() - diff > self.last + + \ No newline at end of file diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopActivator.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopActivator.1.py new file mode 100644 index 00000000..33fee4e0 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopActivator.1.py @@ -0,0 +1,11 @@ + + class MyEventLoop(wx.EventLoopBase): + + def RunMyLoop(self): + + loop = MyEventLoop() + activate = wx.EventLoopActivator(loop) + + # other code... + + # the previously active event loop restored here diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopBase.Dispatch.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopBase.Dispatch.1.py new file mode 100644 index 00000000..1ecec182 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/EventLoopBase.Dispatch.1.py @@ -0,0 +1,3 @@ + + while evtloop.Pending(): + evtloop.Dispatch() diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.1.py new file mode 100644 index 00000000..5cdc5713 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.1.py @@ -0,0 +1,10 @@ + + def FunctionInAWorkerThread(strs): + + evt = wx.CommandEvent() + + # NOT evt.SetString(strs) as this would be a shallow copy + evt.SetString(strs[:]) # make a deep copy + + wx.TheApp.QueueEvent(evt) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.2.py new file mode 100644 index 00000000..e0ec1693 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.QueueEvent.2.py @@ -0,0 +1,10 @@ + + def FunctionInAWorkerThread(strs): + + evt = wx.ThreadEvent() + evt.SetString(strs) + + # wx.ThreadEvent.Clone() makes sure that the internal wx.String + # member is not shared by other string instances: + wx.TheApp.QueueEvent(evt.Clone()) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.SetNextHandler.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.SetNextHandler.1.py new file mode 100644 index 00000000..7d64e380 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/EvtHandler.SetNextHandler.1.py @@ -0,0 +1,3 @@ + + handlerA.SetNextHandler(handlerB) + handlerB.SetPreviousHandler(handlerA) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.1.py new file mode 100644 index 00000000..43fc2035 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.1.py @@ -0,0 +1,27 @@ + + def OnOpen(self, event): + + if self.contentNotSaved: + + if wx.MessageBox("Current content has not been saved! Proceed?", "Please confirm", + wx.ICON_QUESTION | wx.YES_NO, self) == wx.NO: + return + + # else: proceed asking to the user the new file to open + + openFileDialog = wx.FileDialog(self, "Open XYZ file", "", "", + "XYZ files (*.xyz)|*.xyz", wx.FD_OPEN|wx.FD_FILE_MUST_EXIST) + + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return # the user changed idea... + + # proceed loading the file chosen by the user + # this can be done with e.g. wxPython input streams: + input_stream = wx.FileInputStream(openFileDialog.GetPath()) + + if not input_stream.IsOk(): + + wx.LogError("Cannot open file '%s'."%openFileDialog.GetPath()) + return + + \ No newline at end of file diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.2.py new file mode 100644 index 00000000..cf8afced --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.2.py @@ -0,0 +1,17 @@ + + def OnSaveAs(self, event): + + saveFileDialog = wx.FileDialog(self, "Save XYZ file", "", "", + "XYZ files (*.xyz)|*.xyz", wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT) + + if saveFileDialog.ShowModal() == wx.ID_CANCEL: + return # the user changed idea... + + # save the current contents in the file + # this can be done with e.g. wxPython output streams: + output_stream = wx.FileOutputStream(saveFileDialog.GetPath()) + + if not output_stream.IsOk(): + wx.LogError("Cannot save current contents in file '%s'."%saveFileDialog.GetPath()) + return + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.3.py b/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.3.py new file mode 100644 index 00000000..cd5f72e3 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/FileDialog.3.py @@ -0,0 +1,2 @@ + + wildcard = "BMP and GIF files (*.bmp*.gif)|*.bmp*.gif|PNG files (*.png)|*.png" diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Frame.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Frame.1.py new file mode 100644 index 00000000..fa5258dd --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Frame.1.py @@ -0,0 +1,2 @@ + + style = wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsContext.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsContext.1.py new file mode 100644 index 00000000..1c9cdc21 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsContext.1.py @@ -0,0 +1,25 @@ + + def OnPaint(self, event): + + # Create paint DC + dc = wx.PaintDC(self) + + # Create graphics context from it + gc = wx.GraphicsContext.Create(dc) + + if gc: + + # make a path that contains a circle and some lines + gc.SetPen(wx.RED_PEN) + path = gc.CreatePath() + path.AddCircle(50.0, 50.0, 50.0) + path.MoveToPoint(0.0, 50.0) + path.AddLineToPoint(100.0, 50.0) + path.MoveToPoint(50.0, 0.0) + path.AddLineToPoint(50.0, 100.0) + path.CloseSubpath() + path.AddRectangle(25.0, 25.0, 50.0, 50.0) + + gc.StrokePath(path) + + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsRenderer.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsRenderer.1.py new file mode 100644 index 00000000..62df5608 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/GraphicsRenderer.1.py @@ -0,0 +1,3 @@ + + path = wx.GraphicsPath() # from somewhere + brush = path.GetRenderer().CreateBrush(wx.BLACK_BRUSH) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/HeaderColumnSimple.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/HeaderColumnSimple.1.py new file mode 100644 index 00000000..7c017ddc --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/HeaderColumnSimple.1.py @@ -0,0 +1,6 @@ + + header = wx.HeaderCtrlSimple() # Fill in the constructor + col = wx.HeaderColumnSimple("Title") + col.SetWidth(100) + col.SetSortable(100) + header.AppendColumn(col) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/IconBundle.GetIcon.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/IconBundle.GetIcon.1.py new file mode 100644 index 00000000..6653b217 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/IconBundle.GetIcon.1.py @@ -0,0 +1,2 @@ + + GetIcon(wx.Size(size, size)) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.ComputeHistogram.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.ComputeHistogram.1.py new file mode 100644 index 00000000..ec020eea --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.ComputeHistogram.1.py @@ -0,0 +1,10 @@ + + # This is a raw translation of the ImageHistogramEntry + # code in C++, not a real Python class + class ImageHistogramEntry(object): + + def __init__(self): + + self.index = 0 + self.value = 0 + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.GetImageExtWildcard.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.GetImageExtWildcard.1.py new file mode 100644 index 00000000..7c169699 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.GetImageExtWildcard.1.py @@ -0,0 +1,4 @@ + + FileDlg = wx.FileDialog(self, "Choose Image", os.getcwd(), "", + "Image Files " + wx.Image.GetImageExtWildcard(), + wx.FD_OPEN) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.1.py new file mode 100644 index 00000000..4b1a53f5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.1.py @@ -0,0 +1,3 @@ + + hotspot_x = image.GetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_X) + hotspot_y = image.GetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_Y) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.2.py new file mode 100644 index 00000000..4b1a53f5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.LoadFile.2.py @@ -0,0 +1,3 @@ + + hotspot_x = image.GetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_X) + hotspot_y = image.GetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_Y) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.1.py new file mode 100644 index 00000000..6800fb0c --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.1.py @@ -0,0 +1,3 @@ + + image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, hotspotX) + image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, hotspotY) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.2.py new file mode 100644 index 00000000..6800fb0c --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.SaveFile.2.py @@ -0,0 +1,3 @@ + + image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, hotspotX) + image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, hotspotY) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.Scale.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.Scale.1.py new file mode 100644 index 00000000..50facf29 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.Scale.1.py @@ -0,0 +1,14 @@ + + # get the bitmap from somewhere + bmp = wx.Bitmap('my_png.png', wx.BITMAP_TYPE_PNG) + + # rescale it to have size of 32*32 + if bmp.GetWidth() != 32 or bmp.GetHeight() != 32: + + image = bmp.ConvertToImage() + bmp = wx.BitmapFromImage(image.Scale(32, 32)) + + # another possibility: + image.Rescale(32, 32) + bmp = wx.BitmapFromImage(image) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Image.__init__.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.__init__.1.py new file mode 100644 index 00000000..4b1a53f5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Image.__init__.1.py @@ -0,0 +1,3 @@ + + hotspot_x = image.GetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_X) + hotspot_y = image.GetOptionInt(wx.IMAGE_OPTION_CUR_HOTSPOT_Y) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/KeyEvent.GetKeyCode.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/KeyEvent.GetKeyCode.1.py new file mode 100644 index 00000000..66b42cd2 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/KeyEvent.GetKeyCode.1.py @@ -0,0 +1,24 @@ + + def OnChar(self, event): + + keycode = event.GetUnicodeKey() + + if keycode != wx.WXK_NONE: + + # It's a printable character + wx.LogMessage("You pressed '%c'"%keycode) + + else: + + # It's a special key, deal with all the known ones: + if keycode in [wx.WXK_LEFT, wx.WXK_RIGHT]: + # move cursor ... + MoveCursor() + + elif keycode == wx.WXK_F1: + # give help ... + GiveHelp() + + + + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.1.py new file mode 100644 index 00000000..1dc7b175 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.1.py @@ -0,0 +1,5 @@ + + if ControlDown() and not AltDown() and not ShiftDown() and not MetaDown(): + # handle Ctrl-XXX ... + HandleControl() + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.2.py new file mode 100644 index 00000000..0dbccdb9 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/KeyboardState.GetModifiers.2.py @@ -0,0 +1,4 @@ + + if GetModifiers() == wx.MOD_CONTROL: + # handle Ctrl-XXX ... + HandleControl() diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Log.LogRecord.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Log.LogRecord.1.py new file mode 100644 index 00000000..499df34b --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Log.LogRecord.1.py @@ -0,0 +1,11 @@ + + def DoLogRecord(self, level, msg, info): + + # let the previous logger show it + if self.logOld and IsPassingMessages(): + self.logOld.LogRecord(level, msg, info) + + # and also send it to the one + if self.logNew and self.logNew != self: + self.logNew.LogRecord(level, msg, info) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Log.SetComponentLevel.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Log.SetComponentLevel.1.py new file mode 100644 index 00000000..24fa6b4b --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Log.SetComponentLevel.1.py @@ -0,0 +1,2 @@ + + wx.Log.SetComponentLevel("wx./net", wx.LOG_Error) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/LogChain.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/LogChain.1.py new file mode 100644 index 00000000..54f40b3b --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/LogChain.1.py @@ -0,0 +1,7 @@ + + logChain = wx.LogChain(wx.LogStderr) + + # all the log messages are sent to stderr and also processed as usually + + # don't delete logChain directly as self would leave a dangling + # pointer as active log target, use SetActiveTarget() instead diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.1.py new file mode 100644 index 00000000..cad5cfc5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.1.py @@ -0,0 +1,8 @@ + + # Create a memory DC + temp_dc = wx.MemoryDC() + temp_dc.SelectObject(test_bitmap) + + # We can now draw into the memory DC... + # Copy from self DC to another DC. + old_dc.Blit(250, 50, BITMAP_WIDTH, BITMAP_HEIGHT, temp_dc, 0, 0) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.2.py new file mode 100644 index 00000000..62a581c4 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/MemoryDC.2.py @@ -0,0 +1,2 @@ + + temp_dc.SelectObject(wx.NullBitmap) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.1.py new file mode 100644 index 00000000..00e23389 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.1.py @@ -0,0 +1,2 @@ + + self.fileMenu.Append(ID_NEW_FILE, "&New file\tCTRL+N", "Creates a XYZ document") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.2.py new file mode 100644 index 00000000..2e815841 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.2.py @@ -0,0 +1,2 @@ + + self.fileMenu.Append(wx.ID_NEW, "", "Creates a XYZ document") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.3.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.3.py new file mode 100644 index 00000000..00e23389 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.3.py @@ -0,0 +1,2 @@ + + self.fileMenu.Append(ID_NEW_FILE, "&New file\tCTRL+N", "Creates a XYZ document") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.4.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.4.py new file mode 100644 index 00000000..2e815841 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Menu.Append.4.py @@ -0,0 +1,2 @@ + + self.fileMenu.Append(wx.ID_NEW, "", "Creates a XYZ document") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.GetLabelText.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.GetLabelText.1.py new file mode 100644 index 00000000..f92fbf0e --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.GetLabelText.1.py @@ -0,0 +1,2 @@ + + wx.MenuItem.GetLabelfromText("&Hello\tCtrl-h") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.SetItemLabel.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.SetItemLabel.1.py new file mode 100644 index 00000000..f1e4eb06 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.SetItemLabel.1.py @@ -0,0 +1,5 @@ + + self.myMenuItem.SetItemLabel("My &item\tCTRL+I") + self.myMenuItem2.SetItemLabel("Clean and build\tF7") + self.myMenuItem3.SetItemLabel("Simple item") + self.myMenuItem4.SetItemLabel("Item with &accelerator") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.__init__.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.__init__.1.py new file mode 100644 index 00000000..399023ef --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/MenuItem.__init__.1.py @@ -0,0 +1,11 @@ + + # use all stock properties: + helpMenu.Append(wx.ID_ABOUT) + + # use the stock label and the stock accelerator but not the stock help string: + helpMenu.Append(wx.ID_ABOUT, "", "My custom help string") + + # use all stock properties except for the bitmap: + mymenu = wx.MenuItem(helpMenu, wx.ID_ABOUT) + mymenu.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_WARNING)) + helpMenu.Append(mymenu) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.1.py new file mode 100644 index 00000000..a9e57a2b --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.1.py @@ -0,0 +1,3 @@ + + dlg = wx.MessageDialog(parent, message, caption) + dlg.SetYesNoLabels(wx.ID_SAVE, "&Don't save") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.2.py new file mode 100644 index 00000000..c8875dd0 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/MessageDialog.SetYesNoLabels.2.py @@ -0,0 +1,6 @@ + + dlg = wx.MessageDialog(parent, message, caption) + if dlg.SetYesNoLabels("&Quit", "&Don't quit"): + dlg.SetMessage("What do you want to do?") + else: # buttons have standard "Yes"/"No" values, so rephrase the question + dlg.SetMessage("Do you really want to quit?") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/NonOwnedWindow.SetShape.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/NonOwnedWindow.SetShape.1.py new file mode 100644 index 00000000..c4d477c5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/NonOwnedWindow.SetShape.1.py @@ -0,0 +1,7 @@ + + size = self.GetSize() + + path = wx.GraphicsRenderer.GetDefaultRenderer().CreatePath() + path.AddCircle(size.x/2, size.y/2, 30) + + self.SetShape(path) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.1.py new file mode 100644 index 00000000..4c9697ad --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.1.py @@ -0,0 +1,2 @@ + + wx.SystemOptions.SetOption("msw.notebook.themed-background", 0) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.2.py new file mode 100644 index 00000000..423c8b64 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Notebook.2.py @@ -0,0 +1,6 @@ + + col = notebook.GetThemeBackgroundColour() + + if col.IsOk(): + page.SetBackgroundColour(col) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.1.py new file mode 100644 index 00000000..a83661de --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.1.py @@ -0,0 +1,6 @@ + + def OnPaint(self, event): + + dc = wx.PaintDC(self) + DrawMyDocument(dc) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.2.py new file mode 100644 index 00000000..1fa22ada --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/PaintEvent.2.py @@ -0,0 +1,21 @@ + + # Called when window needs to be repainted. + def OnPaint(self, event): + + dc = wx.PaintDC(self) + + # Find out where the window is scrolled to + vbX, vbY = self.GetViewStart() + + # get the update rect list + upd = wx.RegionIterator(self.GetUpdateRegion()) + + while upd.HaveRects(): + + rect = upd.GetRect() + + # Repaint this rectangle + PaintRectangle(rect, dc) + + upd.Next() + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/PlatformInfo.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/PlatformInfo.1.py new file mode 100644 index 00000000..d4639bf3 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/PlatformInfo.1.py @@ -0,0 +1,2 @@ + + wx.LogMessage("This application is running under %s." % wx.PlatformInfo.Get().GetOperatingSystemIdName()) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Point.SetDefaults.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Point.SetDefaults.1.py new file mode 100644 index 00000000..107ffff8 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Point.SetDefaults.1.py @@ -0,0 +1,5 @@ + + if not pos.IsFullySpecified(): + + pos.SetDefaults(GetDefaultPosition()) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.DoPrepareDC.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.DoPrepareDC.1.py new file mode 100644 index 00000000..bc66f2ea --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.DoPrepareDC.1.py @@ -0,0 +1,16 @@ + + def OnEvent(self, event): + + dc = wx.ClientDC(self) + self.DoPrepareDC(dc) + + dc.SetPen(wx.BLACK_PEN) + + x, y = event.GetPosition() + + if (xpos > -1 and ypos > -1 and event.Dragging()): + dc.DrawLine(xpos, ypos, x, y) + + xpos = x + ypos = y + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.SetScrollbars.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.SetScrollbars.1.py new file mode 100644 index 00000000..f0a76730 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Scrolled.SetScrollbars.1.py @@ -0,0 +1,2 @@ + + window.SetScrollbars(20, 20, 50, 50) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/SearchCtrl.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/SearchCtrl.1.py new file mode 100644 index 00000000..cba3b21b --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/SearchCtrl.1.py @@ -0,0 +1,2 @@ + + event.GetString() diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/SingleInstanceChecker.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/SingleInstanceChecker.1.py new file mode 100644 index 00000000..bb4a63b9 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/SingleInstanceChecker.1.py @@ -0,0 +1,14 @@ + + def OnInit(self): + + self.name = "SingleApp-%s" % wx.GetUserId() + self.instance = wx.SingleInstanceChecker(self.name) + + if self.instance.IsAnotherRunning(): + wx.MessageBox("Another instance is running", "ERROR") + return False + + frame = SingleAppFrame(None, "SingleApp") + frame.Show() + return True + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Size.SetDefaults.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Size.SetDefaults.1.py new file mode 100644 index 00000000..d762072b --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Size.SetDefaults.1.py @@ -0,0 +1,5 @@ + + if not size.IsFullySpecified(): + + size.SetDefaults(GetDefaultSize()) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddSpacer.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddSpacer.1.py new file mode 100644 index 00000000..5e416ee5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddSpacer.1.py @@ -0,0 +1,2 @@ + + wx.Sizer.Add(size, size, 0) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddStretchSpacer.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddStretchSpacer.1.py new file mode 100644 index 00000000..ffdb4516 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Sizer.AddStretchSpacer.1.py @@ -0,0 +1,2 @@ + + wx.Sizer.Add(0, 0, proportion) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.1.py new file mode 100644 index 00000000..98ed9811 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.1.py @@ -0,0 +1,2 @@ + + sizer.Add(ctrl, 0, wx.EXPAND | wx.ALL, 10) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.2.py new file mode 100644 index 00000000..2f2d358f --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.2.py @@ -0,0 +1,2 @@ + + sizer.Add(ctrl, wx.SizerFlags().Expand().Border(wx.ALL, 10)) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.3.py b/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.3.py new file mode 100644 index 00000000..b7734172 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/SizerFlags.3.py @@ -0,0 +1,6 @@ + + flagsExpand = wx.SizerFlags(1) + flagsExpand.Expand().Border(wx.ALL, 10) + + sizer.Add(ctrl1, flagsExpand) + sizer.Add(ctrl2, flagsExpand) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.MSWGetShellDir.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.MSWGetShellDir.1.py new file mode 100644 index 00000000..2e965c82 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.MSWGetShellDir.1.py @@ -0,0 +1,6 @@ + + if wx.Platform == '__WXMSW__': + # get the location of files waiting to be burned on a CD + cdburnArea = wx.StandardPaths.MSWGetShellDir(CSIDL_CDBURN_AREA) + + # endif __WXMSW__ diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.UseAppInfo.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.UseAppInfo.1.py new file mode 100644 index 00000000..68ecf065 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/StandardPaths.UseAppInfo.1.py @@ -0,0 +1,2 @@ + + info = AppInfo_AppName | AppInfo_VendorName diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.1.py new file mode 100644 index 00000000..8c3b87d0 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.1.py @@ -0,0 +1,9 @@ + + def CreateControls(self): + + panel = wx.Panel(self) + box = wx.StaticBox(panel, wx.ID_ANY, "StaticBox") + + text = wx.StaticText(box, wx.ID_ANY, "This window is a child of the staticbox") + + # Other code... diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.2.py new file mode 100644 index 00000000..c44137bd --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBox.2.py @@ -0,0 +1,6 @@ + + box = wx.StaticBox(panel, wx.ID_ANY, "StaticBox") + + text = wx.StaticText(panel, wx.ID_ANY, "This window is a child of the panel") + + # Other code... diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBoxSizer.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBoxSizer.1.py new file mode 100644 index 00000000..6786e090 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/StaticBoxSizer.1.py @@ -0,0 +1,12 @@ + + def CreateControls(self): + + panel = wx.Panel(self) + # Other controls here... + + sz = wx.StaticBoxSizer(wx.VERTICAL, panel, "Box") + sz.Add(wx.StaticText(sz.GetStaticBox(), wx.ID_ANY, + "This window is a child of the staticbox")) + + # Other code... + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/TextCompleterSimple.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/TextCompleterSimple.1.py new file mode 100644 index 00000000..3bfe6db0 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/TextCompleterSimple.1.py @@ -0,0 +1,29 @@ + + class MyTextCompleter(wx.TextCompleterSimple): + + def __init__(self): + + wx.TextCompleterSimple.__init__(self) + + + def GetCompletions(self, prefix, res): + + firstWord = prefix.split()[0] + + if firstWord == "white": + res.append("white pawn") + res.append("white rook") + + elif firstWord == "black": + res.append("black king") + res.append("black queen") + + else: + res.append("white") + res.append("black") + + + # Later on... + text = wx.TextCtrl(parent, wx.ID_ANY, 'My Text') + text.AutoComplete(MyTextCompleter) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/TextCtrl.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/TextCtrl.1.py new file mode 100644 index 00000000..37df47dd --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/TextCtrl.1.py @@ -0,0 +1,7 @@ + + text.SetDefaultStyle(wx.TextAttr(wx.RED)) + text.AppendText("Red text\n") + text.SetDefaultStyle(wx.TextAttr(wx.NullColour, wx.LIGHT_GREY)) + text.AppendText("Red on grey text\n") + text.SetDefaultStyle(wx.TextAttr(wx.BLUE)) + text.AppendText("Blue on grey text\n") diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/TimerEvent.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/TimerEvent.1.py new file mode 100644 index 00000000..c8cb533e --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/TimerEvent.1.py @@ -0,0 +1,19 @@ + + class MyFrame(wx.Frame): + + def __init__(self, parent): + + wx.Frame.__init__(self, parent) + + self.timer = wx.Timer(self, TIMER_ID) + self.Bind(wx.EVT_TIMER, self.OnTimer) + + self.timer.Start(1000) # 1 second interval + + + def OnTimer(self, event): + + # do whatever you want to do every second here + print 'Hello' + + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Validator.SetWindow.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Validator.SetWindow.1.py new file mode 100644 index 00000000..7950c113 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Validator.SetWindow.1.py @@ -0,0 +1,3 @@ + + wx.TextCtrl(self, wx.ID_ANY, u'', wx.DefaultPosition, wx.DefaultSize, 0, + validator=MyValidator()) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.DoUpdateWindowUI.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.DoUpdateWindowUI.1.py new file mode 100644 index 00000000..a388a604 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.DoUpdateWindowUI.1.py @@ -0,0 +1,13 @@ + + # do the window-specific processing after processing the update event + def DoUpdateWindowUI(self, event): + + if event.GetSetEnabled(): + self.Enable(event.GetEnabled()) + + if event.GetSetText(): + + if event.GetText() != self.GetTitle(): + self.SetTitle(event.GetText()) + + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Fit.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Fit.1.py new file mode 100644 index 00000000..401ed691 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Fit.1.py @@ -0,0 +1,2 @@ + + window.SetClientSize(child.GetSize()) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.HandleWindowEvent.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.HandleWindowEvent.1.py new file mode 100644 index 00000000..f0c2c6e2 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.HandleWindowEvent.1.py @@ -0,0 +1,2 @@ + + GetEventHandler().SafelyProcessEvent(event) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.1.py new file mode 100644 index 00000000..bdfe9905 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.1.py @@ -0,0 +1,2 @@ + + self.SetSize(x, y, -1, -1, wx.SIZE_USE_EXISTING) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.2.py new file mode 100644 index 00000000..bdfe9905 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.2.py @@ -0,0 +1,2 @@ + + self.SetSize(x, y, -1, -1, wx.SIZE_USE_EXISTING) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.3.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.3.py new file mode 100644 index 00000000..bdfe9905 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.Move.3.py @@ -0,0 +1,2 @@ + + self.SetSize(x, y, -1, -1, wx.SIZE_USE_EXISTING) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessEvent.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessEvent.1.py new file mode 100644 index 00000000..fd31708d --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessEvent.1.py @@ -0,0 +1,2 @@ + + self.GetEventHandler().ProcessEvent() diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessWindowEvent.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessWindowEvent.1.py new file mode 100644 index 00000000..a5d0604d --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.ProcessWindowEvent.1.py @@ -0,0 +1,2 @@ + + self.GetEventHandler().ProcessEvent(event) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.PushEventHandler.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.PushEventHandler.1.py new file mode 100644 index 00000000..acf01b22 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.PushEventHandler.1.py @@ -0,0 +1,3 @@ + + W.PushEventHandler(A) + W.PushEventHandler(B) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMaxClientSize.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMaxClientSize.1.py new file mode 100644 index 00000000..349f9dfb --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMaxClientSize.1.py @@ -0,0 +1,2 @@ + + self.SetMaxSize(self.ClientToWindowSize(size)) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMinClientSize.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMinClientSize.1.py new file mode 100644 index 00000000..bb7ea7b5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetMinClientSize.1.py @@ -0,0 +1,2 @@ + + self.SetMinSize(self.ClientToWindowSize(size)) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetScrollbar.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetScrollbar.1.py new file mode 100644 index 00000000..3ab3016b --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.SetScrollbar.1.py @@ -0,0 +1,2 @@ + + self.SetScrollbar(wx.VERTICAL, 0, 16, 50) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/Window.UpdateWindowUI.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.UpdateWindowUI.1.py new file mode 100644 index 00000000..cfddf366 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/Window.UpdateWindowUI.1.py @@ -0,0 +1,6 @@ + + def OnInternalIdle(self): + + if wx.UpdateUIEvent.CanUpdate(self): + self.UpdateWindowUI(wx.UPDATE_UI_FROMIDLE) + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/WindowModalDialogEvent.Clone.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/WindowModalDialogEvent.Clone.1.py new file mode 100644 index 00000000..1fc0e19e --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/WindowModalDialogEvent.Clone.1.py @@ -0,0 +1,4 @@ + + def Clone(self): + + return MyEvent() diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.1.py new file mode 100644 index 00000000..b8419a77 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.1.py @@ -0,0 +1,7 @@ + + musicCtrl = wx.dataview.DataViewCtrl(self, wx.ID_ANY) + musicModel = MyMusicModel() + musicCtrl.AssociateModel(musicModel) + musicModel.DecRef() # avoid memory leak !! + + # add columns now diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.2.py new file mode 100644 index 00000000..74c8ab57 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewModel.2.py @@ -0,0 +1,6 @@ + + musicCtrl = wx.dataview.DataViewCtrl(self, wx.ID_ANY) + musicModel = MyMusicModel() + musicCtrl.AssociateModel(musicModel.get()) + + # add columns now diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewRenderer.DisableEllipsize.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewRenderer.DisableEllipsize.1.py new file mode 100644 index 00000000..d6cbab59 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/dataview.DataViewRenderer.DisableEllipsize.1.py @@ -0,0 +1,2 @@ + + EnableEllipsize(wx.ELLIPSIZE_NONE) diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/functions.DirSelector.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.DirSelector.1.py new file mode 100644 index 00000000..429c74c5 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.DirSelector.1.py @@ -0,0 +1,6 @@ + + selector = wx.DirSelector("Choose a folder") + if selector.strip(): + # Do something with the folder name + print selector + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.1.py new file mode 100644 index 00000000..b4e63dcb --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.1.py @@ -0,0 +1,2 @@ + + wildcard = "BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif" diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.2.py new file mode 100644 index 00000000..f7571d72 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.FileSelector.2.py @@ -0,0 +1,8 @@ + + filename = wx.FileSelector("Choose a file to open") + + if filename.strip(): + # work with the file + print filename + + # else: cancelled by user diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.1.py new file mode 100644 index 00000000..15f2be95 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.1.py @@ -0,0 +1,20 @@ + + # Signal enumeration + + wx.SIGNONE # verify if the process exists under Unix + wx.SIGHUP + wx.SIGINT + wx.SIGQUIT + wx.SIGILL + wx.SIGTRAP + wx.SIGABRT + wx.SIGEMT + wx.SIGFPE + wx.SIGKILL # forcefully kill, dangerous! + wx.SIGBUS + wx.SIGSEGV + wx.SIGSYS + wx.SIGPIPE + wx.SIGALRM + wx.SIGTERM # terminate the process gently + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.2.py b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.2.py new file mode 100644 index 00000000..b732d472 --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.Kill.2.py @@ -0,0 +1,9 @@ + + # KillError enumeration + + wx.KILL_OK # no error + wx.KILL_BAD_SIGNAL # no such signal + wx.KILL_ACCESS_DENIED # permission denied + wx.KILL_NO_PROCESS # no such process + wx.KILL_ERROR # another, unspecified error + diff --git a/docs/sphinx/rest_substitutions/snippets/python/converted/functions.MessageBox.1.py b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.MessageBox.1.py new file mode 100644 index 00000000..036b36fc --- /dev/null +++ b/docs/sphinx/rest_substitutions/snippets/python/converted/functions.MessageBox.1.py @@ -0,0 +1,5 @@ + + answer = wx.MessageBox("Quit program?", "Confirm", + wx.YES_NO | wx.CANCEL, main_frame) + if answer == wx.YES: + main_frame.Close() diff --git a/docs/sphinx/rest_substitutions/tables/ColourDatabase.1.rst b/docs/sphinx/rest_substitutions/tables/ColourDatabase.1.rst new file mode 100644 index 00000000..aec8b6a6 --- /dev/null +++ b/docs/sphinx/rest_substitutions/tables/ColourDatabase.1.rst @@ -0,0 +1,22 @@ +================================= ================================ ==================================== ================================== +``AQUAMARINE`` ``FIREBRICK`` ``MEDIUM FOREST GREEN`` ``RED`` +``BLACK`` ``FOREST GREEN`` ``MEDIUM GOLDENROD`` ``SALMON`` +``BLUE`` ``GOLD`` ``MEDIUM ORCHID`` ``SEA GREEN`` +``BLUE VIOLET`` ``GOLDENROD`` ``MEDIUM SEA GREEN`` ``SIENNA`` +``BROWN`` ``GREY`` ``MEDIUM SLATE BLUE`` ``SKY BLUE`` +``CADET BLUE`` ``GREEN`` ``MEDIUM SPRING GREEN`` ``SLATE BLUE`` +``CORAL`` ``GREEN YELLOW`` ``MEDIUM TURQUOISE`` ``SPRING GREEN`` +``CORNFLOWER BLUE`` ``INDIAN RED`` ``MEDIUM VIOLET RED`` ``STEEL BLUE`` +``CYAN`` ``KHAKI`` ``MIDNIGHT BLUE`` ``TAN`` +``DARK GREY`` ``LIGHT BLUE`` ``NAVY`` ``THISTLE`` +``DARK GREEN`` ``LIGHT GREY`` ``ORANGE`` ``TURQUOISE`` +``DARK OLIVE GREEN`` ``LIGHT STEEL BLUE`` ``ORANGE RED`` ``VIOLET`` +``DARK ORCHID`` ``LIME GREEN`` ``ORCHID`` ``VIOLET RED`` +``DARK SLATE BLUE`` ``MAGENTA`` ``PALE GREEN`` ``WHEAT`` +``DARK SLATE GREY`` ``MAROON`` ``PINK`` ``WHITE`` +``DARK TURQUOISE`` ``MEDIUM AQUAMARINE`` ``PLUM`` ``YELLOW`` +``DIM GREY`` ``MEDIUM BLUE`` ``PURPLE`` ``YELLOW GREEN`` +================================= ================================ ==================================== ================================== + +| + diff --git a/docs/sphinx/rest_substitutions/tables/Sizer.1.rst b/docs/sphinx/rest_substitutions/tables/Sizer.1.rst new file mode 100644 index 00000000..2508dc3d --- /dev/null +++ b/docs/sphinx/rest_substitutions/tables/Sizer.1.rst @@ -0,0 +1,49 @@ ++---------------------------------------------------------------------+-----------------------------------------------------------------------------+ +| Sizer Flag | Description | ++=====================================================================+=============================================================================+ +| ``TOP`` | These flags are used to specify which side(s) of the sizer | ++---------------------------------------------------------------------+ item the border width will apply to. | +| ``BOTTOM`` | | ++---------------------------------------------------------------------+ | +| ``LEFT`` | | ++---------------------------------------------------------------------+ | +| ``RIGHT`` | | ++---------------------------------------------------------------------+ | +| ``ALL`` | | ++---------------------------------------------------------------------+-----------------------------------------------------------------------------+ +| ``EXPAND`` | The item will be expanded to fill the space assigned to | +| | the item. | ++---------------------------------------------------------------------+-----------------------------------------------------------------------------+ +| ``SHAPED`` | The item will be expanded as much as possible while also | +| | maintaining its aspect ratio | ++---------------------------------------------------------------------+-----------------------------------------------------------------------------+ +| ``FIXED_MINSIZE`` | Normally `Sizers` will use | +| | :meth:`Window.GetAdjustedBestSize` to | +| | determine what the minimal size of window items should be, and will use that| +| | size to calculate the layout. This allows layouts to adjust when an item | +| | changes and its best size becomes different. If you would rather have a | +| | window item stay the size it started with then use ``FIXED_MINSIZE``. | ++---------------------------------------------------------------------+-----------------------------------------------------------------------------+ +| ``RESERVE_SPACE_EVEN_IF_HIDDEN`` | Normally `Sizers` don't allocate space for hidden windows or other items. | +| | This flag overrides this behavior so that sufficient space is allocated for | +| .. versionadded:: 2.8.8 | the window even if it isn't visible. This makes it possible to dynamically | +| | show and hide controls without resizing parent dialog, for example. | +| | Available since version 2.8.8 | ++---------------------------------------------------------------------+-----------------------------------------------------------------------------+ +| ``ALIGN_CENTER`` **or** ``ALIGN_CENTRE`` | The ``ALIGN*`` flags allow you to specify the alignment of the item | ++---------------------------------------------------------------------+ within the space allotted to it by the sizer, adjusted for the border if | +| ``ALIGN_LEFT`` | any. | ++---------------------------------------------------------------------+ | +| ``ALIGN_RIGHT`` | | ++---------------------------------------------------------------------+ | +| ``ALIGN_TOP`` | | ++---------------------------------------------------------------------+ | +| ``ALIGN_BOTTOM`` | | ++---------------------------------------------------------------------+ | +| ``ALIGN_CENTER_VERTICAL`` **or** ``ALIGN_CENTRE_VERTICAL`` | | ++---------------------------------------------------------------------+ | +| ``ALIGN_CENTER_HORIZONTAL`` **or** ``ALIGN_CENTRE_HORIZONTAL`` | | ++---------------------------------------------------------------------+-----------------------------------------------------------------------------+ + +| + diff --git a/docs/sphinx/rest_substitutions/tables/VScrolledWindow.1.rst b/docs/sphinx/rest_substitutions/tables/VScrolledWindow.1.rst new file mode 100644 index 00000000..e52adb49 --- /dev/null +++ b/docs/sphinx/rest_substitutions/tables/VScrolledWindow.1.rst @@ -0,0 +1,18 @@ +======================================= ============================================================================================================================================================================================================================================================================== +`GetFirstVisibleLine()` Deprecated for :meth:`~VarVScrollHelper.GetVisibleRowsBegin` +`GetLastVisibleLine()` Deprecated for :meth:`~VarVScrollHelper.GetVisibleRowsEnd` This function originally had a slight design flaw in that it was possible to return ``sys.maxint-1`` (ie: a large positive number) if the scroll position was 0 and the first line wasn't completely visible. +`GetLineCount()` Deprecated for :meth:`~VarVScrollHelper.GetRowCount` +`HitTest(x, y)` +`HitTest(pt)` Deprecated for :meth:`~VScrolledWindow.VirtualHitTest`. +`OnGetLineHeight(line)` Deprecated for :meth:`~VarVScrollHelper.OnGetRowHeight` +`OnGetLinesHint(lineMin, lineMax)` Deprecated for :meth:`~VarVScrollHelper.OnGetRowsHeightHint` +`RefreshLine(line)` Deprecated for :meth:`~VarVScrollHelper.RefreshRow` +`RefreshLines(from_, to_)` Deprecated for :meth:`~VarVScrollHelper.RefreshRows` +`ScrollLines(lines)` Deprecated for :meth:`~VarVScrollHelper.ScrollRows` +`ScrollPages(pages)` Deprecated for :meth:`~VarVScrollHelper.ScrollRowPages` +`ScrollToLine(line)` Deprecated for :meth:`~VarVScrollHelper.ScrollToRow` +`SetLineCount(count)` Deprecated for :meth:`~VarVScrollHelper.SetRowCount` +======================================= ============================================================================================================================================================================================================================================================================== + +| + diff --git a/etg/app.py b/etg/app.py index 8b116264..84704b80 100644 --- a/etg/app.py +++ b/etg/app.py @@ -127,7 +127,8 @@ def run(): # like normal, their docs will be able to be generated, etc. c.addItem(etgtools.MethodDef( protection='public', type='wxAppAssertMode', name='GetAssertMode', argsString='()', - briefDoc="Returns the current mode for how the application responds to wx asserts.")) + briefDoc="Returns the current mode for how the application responds to wx asserts.", + className=c.name)) m = etgtools.MethodDef( protection='public', type='void', name='SetAssertMode', argsString='(wxAppAssertMode mode)', @@ -135,13 +136,15 @@ def run(): Set the mode indicating how the application responds to wx assertion statements. Valid settings are a combination of these flags: - wx.APP_ASSERT_SUPPRESS - wx.APP_ASSERT_EXCEPTION - wx.APP_ASSERT_DIALOG - wx.APP_ASSERT_LOG + - wx.APP_ASSERT_SUPPRESS + - wx.APP_ASSERT_EXCEPTION + - wx.APP_ASSERT_DIALOG + - wx.APP_ASSERT_LOG The default behavior is to raise a wx.wxAssertionError exception. - """) + """, + className=c.name) + m.addItem(etgtools.ParamDef(type='wxAppAssertMode', name='wxAppAssertMode')) c.addItem(m) @@ -149,7 +152,8 @@ def run(): protection='public', isStatic=True, type='bool', name='IsDisplayAvailable', argsString='()', briefDoc="""\ Returns True if the application is able to connect to the system's - display, or whatever the equivallent is for the platform.""")) + display, or whatever the equivallent is for the platform.""", + className=c.name)) c.addProperty('AssertMode GetAssertMode SetAssertMode') diff --git a/etgtools/extractors.py b/etgtools/extractors.py index 4aa69994..de8244b9 100644 --- a/etgtools/extractors.py +++ b/etgtools/extractors.py @@ -18,6 +18,7 @@ import pprint import xml.etree.ElementTree as et from tweaker_tools import removeWxPrefix, magicMethods +from sphinxtools.utilities import FindDescendants #--------------------------------------------------------------------------- # These classes simply hold various bits of information about the classes, @@ -263,7 +264,7 @@ class FunctionDef(BaseDef): """ Use the given C++ code instead of that automatically generated by the back-end. This is similar to adding a new C++ method, except it uses - info we've alread received from the source XML such as the argument + info we've already received from the source XML such as the argument types and names, docstring, etc. The code generated for this verison will expect the given code to use @@ -278,7 +279,7 @@ class FunctionDef(BaseDef): """ Use the given C++ code instead of that automatically generated by the back-end. This is similar to adding a new C++ method, except it uses - info we've already received from the source XML such as the argument + info we've alread received from the source XML such as the argument types and names, docstring, etc. The code generated for this version will put the given code in a @@ -312,13 +313,13 @@ class FunctionDef(BaseDef): return o return None - + def hasOverloads(self): """ Returns True if there are any overloads that are not ignored. """ return bool([x for x in self.overloads if not x.ignored]) - + def ignore(self, val=True): # If the item being ignored has overloads then try to reorder the @@ -338,7 +339,6 @@ class FunctionDef(BaseDef): idx = parent.items.index(self) parent.items[idx] = first - def _findItems(self): items = list(self.items) @@ -526,6 +526,9 @@ class ClassDef(BaseDef): self.protection = '' self.templateParams = [] # class is a template self.bases = [] # base class names + self.subClasses = [] # sub classes + self.nodeBases = [] # for the inheritance diagram + self.enum_file = '' # To link sphinx output classes to enums self.includes = [] # .h file for this class self.abstract = False # is it an abstract base class? self.deprecated = False # mark all methods as deprecated @@ -553,19 +556,57 @@ class ClassDef(BaseDef): if element is not None: self.extract(element) + + def findHierarchy(self, element, all_classes, specials, read): + + from etgtools import XMLSRC + + if not read: + nodename = fullname = self.name + specials = [nodename] + else: + nodename = fullname = element.text + + baselist = [] + + if read: + refid = element.get('refid') + if refid is None: + return all_classes, specials + fname = os.path.join(XMLSRC, refid+'.xml') + root = et.parse(fname).getroot() + compounds = FindDescendants(root, 'basecompoundref') + else: + compounds = element.findall('basecompoundref') + + for c in compounds: + baselist.append(c.text) + + all_classes[nodename] = (nodename, fullname, baselist) + + for c in compounds: + all_classes, specials = self.findHierarchy(c, all_classes, specials, True) + + return all_classes, specials + + def extract(self, element): super(ClassDef, self).extract(element) + self.nodeBases = self.findHierarchy(element, {}, [], False) + for node in element.findall('basecompoundref'): - self.bases.append(node.text) + self.bases.append(node.text) + for node in element.findall('derivedcompoundref'): + self.subClasses.append(node.text) for node in element.findall('includes'): self.includes.append(node.text) for node in element.findall('templateparamlist/param'): txt = node.find('type').text txt = txt.replace('class ', '') self.templateParams.append(txt) - + for node in element.findall('innerclass'): if node.get('prot') == 'private': continue @@ -596,7 +637,7 @@ class ClassDef(BaseDef): v = MemberVarDef(node) self.items.append(v) elif kind == 'enum': - e = EnumDef(node) + e = EnumDef(node, [self]) self.items.append(e) elif kind == 'typedef': # callback function prototype, see wx/filedlg.h for an instance of this @@ -908,8 +949,9 @@ class EnumDef(BaseDef): """ A named or anonymous enumeration. """ - def __init__(self, element=None, inClass=False, **kw): + def __init__(self, element=None, inClass=[], **kw): super(EnumDef, self).__init__() + self.inClass = inClass if element is not None: prot = element.get('prot') if prot is not None: @@ -1056,6 +1098,7 @@ class PyCodeDef(BaseDef): self.order = order self.__dict__.update(kw) + #--------------------------------------------------------------------------- class PyFunctionDef(BaseDef): @@ -1069,12 +1112,13 @@ class PyFunctionDef(BaseDef): def __init__(self, name, argsString, body, doc=None, order=None, **kw): super(PyFunctionDef, self).__init__() self.name = name - self.argsString = argsString + self.argsString = self.pyArgsString = argsString self.body = body self.briefDoc = doc self.order = order self.deprecated = False self.isStatic = False + self.overloads = [] self.__dict__.update(kw) #--------------------------------------------------------------------------- @@ -1090,11 +1134,28 @@ class PyClassDef(BaseDef): super(PyClassDef, self).__init__() self.name = name self.bases = bases - self.briefDoc = doc + self.briefDoc = self.pyDocstring = doc + self.enum_file = '' + self.nodeBases = [] + self.subClasses = [] self.items.extend(items) self.deprecated = False self.order = order self.__dict__.update(kw) + + self.nodeBases = self.findHierarchy() + + + def findHierarchy(self): + + all_classes = {} + nodename = fullname = self.name + specials = [nodename] + + baselist = [base for base in self.bases if base != 'object'] + all_classes[nodename] = (nodename, fullname, baselist) + + return all_classes, specials #--------------------------------------------------------------------------- @@ -1197,10 +1258,15 @@ class ModuleDef(BaseDef): self.items.append(item) elif kind == 'enum': - extractingMsg(kind, element) - item = EnumDef(element) - self.items.append(item) + inClass = [] + for el in self.items: + if isinstance(el, ClassDef): + inClass.append(el) + extractingMsg(kind, element) + item = EnumDef(element, inClass) + self.items.append(item) + elif kind == 'variable': extractingMsg(kind, element) item = GlobalVarDef(element) @@ -1277,7 +1343,7 @@ class ModuleDef(BaseDef): order ) - + def addPyFunction(self, name, argsString, body, doc=None, order=None, **kw): """ Add a Python function to this module. @@ -1295,6 +1361,8 @@ class ModuleDef(BaseDef): self.items.append(pc) return pc + + #--------------------------------------------------------------------------- # Some helper functions and such #--------------------------------------------------------------------------- @@ -1310,7 +1378,7 @@ def flattenNode(node, rstrip=True): return node text = node.text or "" for n in node: - text += flattenNode(n) + text += flattenNode(n, rstrip) if node.tail: text += node.tail if rstrip: diff --git a/etgtools/generators.py b/etgtools/generators.py index 87862997..891b1365 100644 --- a/etgtools/generators.py +++ b/etgtools/generators.py @@ -31,6 +31,10 @@ class StubbedDocsGenerator(DocsGeneratorBase): pass +class SphinxGenerator(DocsGeneratorBase): + def generate(self, module): + pass + #--------------------------------------------------------------------------- # helpers diff --git a/etgtools/sphinx_generator.py b/etgtools/sphinx_generator.py index 0f3d45c8..e09d23a9 100644 --- a/etgtools/sphinx_generator.py +++ b/etgtools/sphinx_generator.py @@ -1,13 +1,3091 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + #--------------------------------------------------------------------------- # Name: etgtools/sphinx_generator.py -# Author: Robin Dunn +# Author: Andrea Gavana # -# Created: 3-Nov-2010 +# Created: 30-Nov-2010 # Copyright: (c) 2011 by Total Control Software # License: wxWindows License #--------------------------------------------------------------------------- +""" +This generator will create the docstrings for Sphinx to process, by refactoring +the various XML elements passed by the Phoenix extractors into ReST format. +""" -""" -This page is intentionally left blank, at least for now... -""" +# Standard library stuff +import os +import operator +import shutil +import textwrap + +from StringIO import StringIO + +import xml.etree.ElementTree as et + +# Phoenix-specific stuff +import extractors +import generators + +# Sphinx-Phoenix specific stuff +from sphinxtools.inheritance import InheritanceDiagram + +from sphinxtools import templates + +from sphinxtools.utilities import odict +from sphinxtools.utilities import ConvertToPython +from sphinxtools.utilities import RemoveWxPrefix, WriteSphinxOutput +from sphinxtools.utilities import FindControlImages, MakeSummary, PickleItem +from sphinxtools.utilities import ChopDescription, PythonizeType, Wx2Sphinx +from sphinxtools.utilities import PickleClassInfo, IsNumeric +from sphinxtools.utilities import Underscore2Capitals, CountSpaces + +from sphinxtools.constants import VERSION, REMOVED_LINKS, SECTIONS +from sphinxtools.constants import MAGIC_METHODS, MODULENAME_REPLACE +from sphinxtools.constants import IGNORE +from sphinxtools.constants import SPHINXROOT, DOXYROOT +from sphinxtools.constants import SNIPPETROOT, TABLEROOT, OVERVIEW_IMAGES_ROOT + + +# ----------------------------------------------------------------------- # + +class Node(object): + """ + This is the base class of all the subsequent classes in this script, and it + holds information about a XML element coming from doxygen and this `Node` + parent element (another `Node`). + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen. + :param Node `parent`: the parent node, or ``None``. + """ + + self.element = element + self.parent = parent + + self.children = [] + + if parent is not None: + parent.Add(self) + + + # ----------------------------------------------------------------------- + + def Add(self, node): + """ + Adds a node to its children list. + + :param Node `node`: another `Node` class. + """ + + self.children.append(node) + + + # ----------------------------------------------------------------------- + + def GetParent(self): + """ + Returns this node parent or ``None`` if it has no parent. + + :rtype: :class:`Node` + """ + + return self.parent + + + # ----------------------------------------------------------------------- + + def GetTopLevelParent(self): + """ + Returns the top level ancestor for this node or ``None``. If the ancestor + is not ``None``, then it should be an instance of :class:`Root`. + + :rtype: :class:`Node` + """ + + parent = self.parent + + while 1: + + if parent is None: + return + + if isinstance(parent, Root): + return parent + + parent = parent.parent + + + # ----------------------------------------------------------------------- + + def GetTag(self, tag_name): + """ + Given a `tag_name` for the element stored in this node, return the content + of that tag (or ``None`` if this element has no such tag). + + :param string `tag_name`: the element tag name. + + :returns: The element text for the input `tag_name` or ``None``. + """ + + if isinstance(self.element, basestring): + return None + + return self.element.get(tag_name) + + + # ----------------------------------------------------------------------- + + def GetHierarchy(self): + """ + Returns a list of strings representing this node hierarchy up to the :class:`Root` + node. + + :rtype: `list` + """ + + hierarchy = [self.__class__.__name__] + parent = self.parent + + while parent: + hierarchy.append(parent.__class__.__name__) + parent = parent.parent + + return hierarchy + + + # ----------------------------------------------------------------------- + + def IsClassDescription(self): + """ + Returns a non-empty string if this node holds information about a class general description + (i.e., its `element` attribute does not contain information on a method, a property, + and so on). + + This is needed to resolve ReST link conflicts in the :class:`XRef` below. + + :rtype: `string`. + """ + + top_level = self.GetTopLevelParent() + + if top_level is None: + return '' + + xml_docs = top_level.xml_docs + + if xml_docs.kind != 'class': + return '' + + dummy, class_name = Wx2Sphinx(xml_docs.class_name) + return class_name + + + # ----------------------------------------------------------------------- + + def Find(self, klass, node=None): + """ + This method returns ``True`` if this node contains a specific class into its + descendants. + + :param `klass`: can be any of the classes definied in this script except :class:`XMLDocString`. + :param `node`: another `Node` instance or ``None`` if this is the first invocation of + this function. + + :rtype: `bool` + + .. note:: This is a recursive method. + + """ + + + if node is None: + node = self + + for child in node.children: + if isinstance(child, klass): + return True + + return self.Find(klass, child) + + return False + + + # ----------------------------------------------------------------------- + + def GetSpacing(self): + + hierarchy = self.GetHierarchy() + if 'ParameterList' in hierarchy: + return ' ' + + elif not isinstance(self, ListItem) and 'List' in hierarchy: + return ' '*2 + + return '' + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + text = tail = '' + + if self.element is None: + return text + + if isinstance(self.element, basestring): + text = self.element + else: + text, tail = self.element.text, self.element.tail + text = (text is not None and [text] or [''])[0] + tail = (tail is not None and [tail] or [''])[0] + + if text.strip() in REMOVED_LINKS: + return '' + + text = ConvertToPython(text) + + for child in self.children: + text += child.Join(with_tail) + + if with_tail and tail: + text += ConvertToPython(tail) + + if text.strip() and not text.endswith('\n'): + text += ' ' + + return text + + +# ----------------------------------------------------------------------- # + +class Root(Node): + """ + This is the root class which has as its children all the other classes in + this script (excluding :class:`XMLDocString`). It is used to hold information + about an XML Doxygen item describing a class, a method or a function. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, xml_docs, is_overload, share_docstrings): + """ + Class constructor. + + :param XMLDocString `xml_docs`: an instance of :class:`XMLDocString`. + :param bool `is_overload`: ``True`` if the root node describes an overloaded + method/function, ``False`` otherwise. + :param bool `share_docstrings`: ``True`` if all the overloaded methods/functions + share the same docstrings. + """ + + Node.__init__(self, '', None) + + self.xml_docs = xml_docs + self.is_overload = is_overload + self.share_docstrings = share_docstrings + + self.sections = odict() + + + # ----------------------------------------------------------------------- + + def Insert(self, node, before=None, after=None, dontcare=True): + """ + Inserts a node into the root children, depending of the `before` and `after` + input arguments. + """ + + insert_at = -1 + + for index, child in enumerate(self.children): + if (before and child.Find(before)) or (after and child.Find(after)): + insert_at = index + break + + node.parent = self + + if insert_at >= 0: + if before: + self.children.insert(insert_at, node) + else: + self.children.insert(insert_at+1, node) + else: + if dontcare: + self.children.append(node) + else: + return False + + return True + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + if self.is_overload and self.share_docstrings: + # If it is an overloaded method and the docstrings are shared, we only return + # information about the parameter list and admonition sections + return self.CommonJoin(self, '') + + text = Node.Join(self, with_tail) + + # Health check + existing_sections = self.sections.keys()[:] + + for section_name, dummy in SECTIONS: + if section_name not in self.sections: + continue + + existing_sections.remove(section_name) + for section in self.sections[section_name]: + text += '\n\n%s\n\n' % section.Join() + + # Health check + if any(existing_sections): + raise Exception('Unconverted sections remain: %s'%(', '.join(existing_sections))) + + return text + + + # ----------------------------------------------------------------------- + + def CommonJoin(self, node, docstrings): + """ + Selectively join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile but only if they are instances of :class:`ParameterList` + or :class:`Section`. + + :param `node`: either `self` or a child node. + :param string `docstrings`: the resulting docstrings obtained (they will go as output as well). + + :rtype: `string` + + .. note:: This is a recursive method. + """ + + for child in node.children: + if isinstance(child, (ParameterList, Section)): + docstrings += child.Join() + + docstrings = self.CommonJoin(child, docstrings) + + return docstrings + + + # ----------------------------------------------------------------------- + + def AddSection(self, section): + """ + Adds an admonition section to the root node (i.e., `.. seealso::`, `.. note::`, + `:returns:` and so on). + + Admonitions are somewhat different from other nodes as they need to be refactored and + handled differently when, for example, the return value of a method is different in Phoenix + than in wxWidgets or when the XML docs are a mess and an admonition ends up into + a tail of an xml element... + + :param Section `section`: an instance of :class:`Section`. + + """ + + kind = section.section_type + + if kind == 'return': + self.sections[kind] = [section] + + elif kind == 'available': + + if kind not in self.sections: + + text = section.element.text + text = text.split(',') + newtext = [] + for t in text: + newtext.append(t[2:].upper()) + + newtext = ', '.join(newtext) + newtext = 'Only available for %s'%newtext + + if section.element.tail and section.element.tail.strip(): + newtext += ' ' + section.element.tail.strip() + ' ' + else: + newtext += '. ' + + section.element.text = newtext + self.sections[kind] = [section] + + else: + + prevsection = self.sections[kind][0] + prevtext = prevsection.element.text + + currtext = section.element.text + + pos = 1000 + if '.' in currtext: + pos = currtext.index('.') + + if currtext and currtext.strip(): + prevtext = prevtext + currtext[pos+1:].strip() + + prevsection.element.text = prevtext + self.sections[kind] = [prevsection] + + + else: + if kind not in self.sections: + self.sections[kind] = [] + + self.sections[kind].append(section) + + +# ----------------------------------------------------------------------- # + +class ParameterList(Node): + """ + This class holds information about XML elements with a ```` tag. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent, xml_item, kind): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the ```` tag + :param Node `parent`: the parent node, must not be ``None`` + :param `xml_item`: one of the classes available in `etgtools/extractors.py`, such as + `PyMethodDef`, `PyFunctionDef` and so on + :param string `kind`: one of `class`, `method`, `function`. + """ + + Node.__init__(self, element, parent) + + self.xml_item = xml_item + self.kind = kind + + self.checked = False + self.py_parameters = odict() + + for pdef in xml_item.items: + + if pdef.out: + continue + + name = pdef.name + parameter = Parameter(self, pdef) + self.py_parameters[name] = parameter + + + # ----------------------------------------------------------------------- + + def Get(self, element_name): + """ + Returns an instance of :class:`Parameter` if this parameter name (retrieved using + the input `element_name`) is actually in the list of parameters held by this class. + + :param string `element_name`: the parameter name. + + :rtype: :class:`Parameter` or ``None`` + + .. note:: Very often the list of parameters in wxWidgets does not match the Phoenix Python + signature, as some of the parameters in Python get merged into one or removed altogether. + + """ + + name = element_name.strip() + + if name not in self.py_parameters: + return + + return self.py_parameters[name] + + + # ----------------------------------------------------------------------- + + def CheckSignature(self): + """ + Checks if the function/method signature for items coming from pure C++ implementation + matches the parameter list itself. + + This is mostly done as health check, as there are some instances (like `wx.Locale.Init`) + for which the function signature does not match the parameter list (see, for example, + the `shortName` parameter in the signature against the `name` in the parameter list). + + These kind of mismatches can sometimes break the ReST docstrings. + """ + + if self.checked: + return + + self.checked = True + xml_item = self.xml_item + + if isinstance(xml_item, (extractors.PyFunctionDef, extractors.CppMethodDef)): + return + + name = xml_item.name or xml_item.pyName + name = RemoveWxPrefix(name) + + is_overload = self.GetTopLevelParent().is_overload + + if xml_item.overloads and not is_overload: + return + + arguments = xml_item.pyArgsString + if not arguments: + return + + if hasattr(xml_item, 'isStatic') and not xml_item.isStatic: + if arguments[:2] == '()': + return + + arguments = arguments[1:] + + if '->' in arguments: + arguments, dummy = arguments.split("->") + + arguments = arguments.strip() + if arguments.endswith(','): + arguments = arguments[0:-1] + + if arguments.startswith('('): + arguments = arguments[1:] + if arguments.endswith(')'): + arguments = arguments[0:-1] + + signature = name + '(%s)'%arguments + arguments = arguments.split(',') + py_parameters = self.py_parameters.keys() + + message = '\nSEVERE: Incompatibility between function/method signature and list of parameters in `%s`:\n\n' \ + 'The parameter `%s` appears in the method signature but could not be found in the parameter list.\n\n' \ + ' ==> Function/Method signature from `extractors`: %s\n' \ + ' ==> Parameter list from wxWidgets XML items: %s\n\n' \ + 'This may be a documentation bug in wxWidgets or a side-effect of removing the `wx` prefix from signatures.\n\n' + + for arg in arguments: + + if '*' in arg or ')' in arg: + continue + + arg = arg.split('=')[0].strip() + + if arg and arg not in py_parameters: + + class_name = '' + if hasattr(xml_item, 'className') and xml_item.className is not None: + class_name = Wx2Sphinx(xml_item.className)[1] + '.' + + print message % (class_name + name, arg, signature, py_parameters) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + docstrings = '' + + for name, parameter in self.py_parameters.items(): + docstrings += ':param %s `%s`: %s\n'%(parameter.type, name, parameter.Join().lstrip('\n')) + + if docstrings: + docstrings = '\n\n\n%s\n\n'%docstrings + + for child in self.children: + if not isinstance(child, Parameter): + docstrings += child.Join() + '\n\n' + + return docstrings + + +# ----------------------------------------------------------------------- # + +class Parameter(Node): + """ + This class holds information about XML elements with ```` + ```` tags. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, parent, pdef): + """ + Class constructor. + + :param Node `parent`: the parent node, must not be ``None`` + :param `pdef`: a `ParamDef` class, as described in `etgtools/extractors.py`. + """ + + Node.__init__(self, '', parent) + + self.pdef = pdef + self.name = pdef.name + + self.type = PythonizeType(pdef.type) + + +# ----------------------------------------------------------------------- # + +class Paragraph(Node): + """ + This class holds information about XML elements with a ```` tag. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent, kind): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the ```` tag + :param Node `parent`: the parent node, must not be ``None`` + :param string `kind`: one of `class`, `method`, `function`. + """ + + Node.__init__(self, element, parent) + + self.kind = kind + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + text = Node.Join(self, with_tail) + + if 'Availability:' not in text: + return text + + newtext = '' + + for line in text.splitlines(): + + if 'Availability:' in line: + + first = line.index('Availability:') + + element = et.Element('available', kind='available') + element.text = line[first+13:] + + section = Section(element, None, self.kind) + + root = self.GetTopLevelParent() + root.AddSection(section) + + else: + + newtext += line + '\n' + + return newtext + + +# ----------------------------------------------------------------------- # + +class ReturnType(Node): + """ + A special admonition section to customize the `:rtype:` ReST role from + the XML / Python description. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element + :param Node `parent`: the parent node, must not be ``None`` + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + docstrings = '\n\n:rtype: %s\n\n' % self.element + + return docstrings + + +# ----------------------------------------------------------------------- # + +class List(Node): + """ + This class holds information about XML elements with the ```` + and ```` tags. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the ```` and ```` tags + :param Node `parent`: the parent node, must not be ``None`` + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + docstrings = Node.Join(self, with_tail=False) + docstrings = '\n\n%s\n'%docstrings + + if self.element.tail: + spacer = ('ParameterList' in self.GetHierarchy() and [' '] or [''])[0] + text = '%s%s\n'%(spacer, ConvertToPython(self.element.tail.strip())) + docstrings += text + + return docstrings + + +# ----------------------------------------------------------------------- # + +class ListItem(Node): + """ + This class holds information about XML elements with the ```` tag. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the ```` tag + :param Node `parent`: the parent node, must not be ``None`` + """ + + Node.__init__(self, element, parent) + + self.level = parent.GetHierarchy().count('List') - 1 + + + # ----------------------------------------------------------------------- + + def GetSpacing(self): + + hierarchy = self.GetHierarchy() + + if 'ParameterList' in hierarchy: + return ' ' + + elif 'Section' in hierarchy: + return ' '*3 + + return ' ' * self.level + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + spacer = self.GetSpacing() + + to_remove = ['(id, event, func)', '(id1, id2, event, func)', '(id1, id2, func)', + '(id, func)', '(func)', + '(id, event, func)', '(id1, id2, event, func)', '(id1, id2, func)', + '(id, func)'] + + docstrings = '' + + for child in self.children: + child_text = child.Join(with_tail) + for rem in to_remove: + child_text = child_text.replace(rem, '') + + if '_:' in child_text: + child_text = child_text.replace('_:', '_*:') + + docstrings += child_text + + docstrings = '%s- %s\n'%(spacer, docstrings) + return docstrings + + +# ----------------------------------------------------------------------- # + +class Section(Node): + """ + This class holds information about XML elements with the ```` and + ```` tags. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent, kind, is_overload=False, share_docstrings=False): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the ```` and ```` tags + :param Node `parent`: the parent node, can be ``None`` + :param string `kind`: one of `class`, `method`, `function` + :param bool `is_overload`: ``True`` if the root node describes an overloaded + method/function, ``False`` otherwise. + :param bool `share_docstrings`: ``True`` if all the overloaded methods/functions + share the same docstrings. + """ + + Node.__init__(self, element, parent) + + self.kind = kind + self.is_overload = is_overload + self.share_docstrings = share_docstrings + + dummy, section_type = self.element.items()[0] + self.section_type = section_type.split("_")[0] + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + section_type = self.section_type + + text = Node.Join(self, with_tail=False) + + if not text.strip() or len(text.strip()) < 3: + # Empy text or just trailing commas + return '' + + if self.is_overload and self.share_docstrings: + return '' + + sub_spacer = ' '*3 + + if section_type == 'since': + # Special treatment for the versionadded + if len(text) > 6: + version, remainder = text[0:6], text[6:] + text = '%s\n%s%s'%(version, sub_spacer, remainder) + + elif section_type == 'deprecated': + # Special treatment for deprecated, wxWidgets devs do not put the version number + text = '%s\n%s%s'%(VERSION, sub_spacer, text.lstrip('Deprecated')) + + if section_type in ['note', 'remark', 'remarks', 'return']: + text = '\n\n' + sub_spacer + text + + for section, replacement in SECTIONS: + if section == section_type: + break + + docstrings = '' + section_spacer = '' + + if section_type != 'return': + section_spacer = self.GetSpacing() + + docstrings = '\n%s%s %s\n\n'%(section_spacer, replacement, text) + + return '\n' + docstrings + + +# ----------------------------------------------------------------------- # + +class Image(Node): + """ + This class holds information about XML elements with the ```` tag. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the ```` tag + :param Node `parent`: the parent node, must not be ``None`` + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + for key, value in self.element.items(): + if key == 'name': + break + + image_path = os.path.normpath(os.path.join(DOXYROOT, 'images', value)) + static_path = os.path.join(OVERVIEW_IMAGES_ROOT, os.path.split(image_path)[1]) + + if not os.path.isfile(static_path): + shutil.copyfile(image_path, static_path) + + rel_path_index = static_path.rfind('_static') + rel_path = os.path.normpath(static_path[rel_path_index:]) + + docstrings = '\n\n' + docstrings += '.. figure:: %s\n' % rel_path + docstrings += ' :align: center\n\n\n' + docstrings += '|\n\n' + + if self.element.tail and self.element.tail.strip(): + docstrings += ConvertToPython(self.element.tail.rstrip()) + + return docstrings + +# ----------------------------------------------------------------------- # + +class Table(Node): + """ + This class holds information about XML elements with the ```` tag. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent, xml_item_name): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the ``
    `` tag + :param Node `parent`: the parent node, must not be ``None`` + :param string `xml_item_name`: if a custom version of a table has been created + inside the ``TABLEROOT`` folder, the `xml_item_name` string will match the + ``*.rst`` file name for the custom table. + + .. note:: + + There are 3 customized versions of 3 XML tables up to now, for various reasons: + + 1. The `wx.Sizer` flags table is a flexible grid table, very difficult to ReSTify automatically + 2. The `wx.ColourDatabase` table of colour comes up all messy when ReSTified from XML + 3. The "wxWidgets 2.8 Compatibility Functions" table for `wx.VScrolledWindow` + + """ + + Node.__init__(self, element, parent) + + self.xml_item_name = xml_item_name + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + needs_space = 'ParameterList' in self.GetHierarchy() + spacer = (needs_space and [' '] or [''])[0] + + rows, cols = int(self.element.get('rows')), int(self.element.get('cols')) + + longest = [0]*cols + has_title = False + + count = 0 + for row in xrange(rows): + for col in xrange(cols): + child = self.children[count] + + text = child.Join(with_tail) + longest[col] = max(len(text), longest[col]) + + if (row == 0 and col == 0 and '**' in text) or child.GetTag('thead') == 'yes': + has_title = True + + count += 1 + + table = '\n\n' + table += spacer + formats = [] + + for lng in longest: + table += '='* lng + ' ' + formats.append('%-' + '%ds'%(lng+1)) + + table += '\n' + + count = 0 + + for row in xrange(rows): + + table += spacer + + for col in xrange(cols): + table += formats[col] % (self.children[count].Join(with_tail).strip()) + count += 1 + + table += '\n' + + if row == 0 and has_title: + + table += spacer + + for lng in longest: + table += '='* lng + ' ' + + table += '\n' + + table += spacer + + for lng in longest: + table += '='* lng + ' ' + + table += '\n\n%s|\n\n'%spacer + + possible_rest_input = os.path.join(TABLEROOT, self.xml_item_name) + + if os.path.isfile(possible_rest_input): + table = '\n\n' + spacer + '.. include:: %s\n\n'%possible_rest_input + + if self.element.tail and self.element.tail.strip(): + table += ConvertToPython(self.element.tail.rstrip()) + + return table + +# ----------------------------------------------------------------------- # + +class TableEntry(Node): + """ + This class holds information about XML elements with the ```` tag. + """ + pass + +# ----------------------------------------------------------------------- # + +class Snippet(Node): + """ + This class holds information about XML elements with the ````, + ````, ````, ```` and ```` (but only when the + ```` tags appears as a child of ````) tags. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent, cpp_file, python_file, converted_py): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags + :param Node `parent`: the parent node, must not be ``None`` + :param string `cpp_file`: the path to the C++ snippet of code found in the XML + wxWidgets docstring, saved into the ``SNIPPETROOT/cpp`` folder + :param string `python_file`: the path to the roughly-converted to Python + snippet of code found in the XML wxWidgets docstring, saved into the + ``SNIPPETROOT/python`` folder + :param string `converted_py`: the path to the fully-converted to Python + snippet of code found in the XML wxWidgets docstring, saved into the + ``SNIPPETROOT/python/converted`` folder. + """ + + Node.__init__(self, element, parent) + + self.cpp_file = cpp_file + self.python_file = python_file + self.converted_py = converted_py + + self.snippet = '' + + + # ----------------------------------------------------------------------- + + def AddCode(self, element): + """ + Adds a C++ part of the code snippet. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags. + """ + + tag = element.tag + + if tag == 'codeline': + self.snippet += '\n' + + elif tag in ['highlight', 'ref', 'sp']: + + if tag == 'sp': + self.snippet += ' ' + + if isinstance(element, basestring): + self.snippet += element + else: + if element.text: + self.snippet += element.text.strip(' ') + if element.tail: + self.snippet += element.tail.strip(' ') + + else: + raise Exception('Unhandled tag in class Snippet: %s'%tag) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + docstrings = '' + + fid = open(self.cpp_file, 'wt') + fid.write(self.snippet) + fid.close() + + if not os.path.isfile(self.converted_py): + + message = '\nWARNING: Missing C++ => Python conversion of the snippet of code for %s'%(os.path.split(self.cpp_file)[1]) + message += '\n\nA slightly Pythonized version of this snippet has been saved into:\n\n ==> %s\n\n'%self.python_file + + print message + + py_code = self.snippet.replace(';', '') + py_code = py_code.replace('{', '').replace('}', '') + py_code = py_code.replace('->', '.').replace('//', '#') + py_code = py_code.replace('m_', 'self.') + py_code = py_code.replace('::', '.') + py_code = py_code.replace('wx', 'wx.') + py_code = py_code.replace('new ', '').replace('this', 'self') + py_code = py_code.replace('( ', '(').replace(' )', ')') + py_code = py_code.replace('||', 'or').replace('&&', 'and') + + spacer = ' '*4 + new_py_code = '' + + for code in py_code.splitlines(): + new_py_code += spacer + code + '\n' + + fid = open(self.python_file, 'wt') + fid.write(new_py_code) + fid.close() + + else: + + fid = open(self.converted_py, 'rt') + + while 1: + tline = fid.readline() + if not tline.strip(): + continue + + code = tline + fid.read() + fid.close() + break + + docstrings += '::\n\n' + docstrings += code.rstrip() + '\n\n' + + if self.element.tail and len(self.element.tail.strip()) > 1: + spacer = ('Section' in self.GetHierarchy() and [' '] or [''])[0] + tail = ConvertToPython(self.element.tail.lstrip()) + tail = tail.replace('\n', ' ') + docstrings += spacer + tail.replace(' ', ' ') + + return docstrings + + +# ----------------------------------------------------------------------- # + +class XRef(Node): + """ + This class holds information about XML elements with the ```` tag, excluding + when these elements are children of a ```` element. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags + :param Node `parent`: the parent node, must not be ``None``. + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + element = self.element + text = element.text + + tail = element.tail + tail = (tail is not None and [tail] or [''])[0] + + hascomma = '::' in text + + original = text + text = RemoveWxPrefix(text) + text = text.replace("::", ".") + + if "(" in text: + text = text[0:text.index("(")] + + refid, link = element.items()[0] + remainder = link.split('_')[-1] + + space_before, space_after = CountSpaces(text) + stripped = text.strip() + + if stripped in IGNORE: + return space_before + text + space_after + tail + + if ' ' in stripped or 'overview' in link: + if 'classwx_' in link: + ref = 1000 + if '_1' in link: + ref = link.index('_1') + + ref = Underscore2Capitals(link[6:ref]) + text = ':ref:`%s <%s>`'%(stripped, ref) + + elif 'funcmacro' in link or 'samples' in link or 'debugging' in text.lower() or \ + 'unix' in text.lower() or 'page_libs' in link: + text = space_before + space_after + elif 'library list' in stripped.lower(): + text = space_before + text + space_after + else: + backlink = stripped.lower() + if 'device context' in backlink: + backlink = 'device contexts' + elif 'reference count' in backlink or 'refcount' in link: + backlink = 'reference counting' + elif 'this list' in backlink: + backlink = 'stock items' + elif 'window deletion' in backlink: + backlink = 'window deletion' + elif 'programming with wxboxsizer' in backlink: + stripped = 'Programming with BoxSizer' + backlink = 'programming with boxsizer' + + text = ':ref:`%s <%s>`'%(stripped, backlink) + + elif (text.upper() == text and len(stripped) > 4): + + if not original.strip().startswith('wx') or ' ' in stripped: + text = '' + + elif not IsNumeric(text): + text = '``%s``'%text + + elif 'funcmacro' in link: + if '(' in stripped: + stripped = stripped[0:stripped.index('(')].strip() + + text = ':func:`%s`'%stripped + + elif hascomma or len(remainder) > 30: + if '.m_' in text: + text = '``%s``'%stripped + else: + # it was :meth: + if '.wx' in text: + prev = text.split('.') + text = '.'.join(prev[:-1]) + '.__init__' + text = ':meth:`%s` '%text.strip() + + else: + stripped = text.strip() + + if '(' in stripped: + stripped = stripped[0:stripped.index('(')].strip() + + if '.' not in stripped: + klass = self.IsClassDescription() + if klass: + text = ':meth:`~%s.%s`'%(klass, stripped) + else: + text = ':meth:`%s` '%stripped + else: + text = ':meth:`%s` '%stripped + + else: + text = ':ref:`%s`'%Wx2Sphinx(stripped)[1] + + return space_before + text + space_after + ConvertToPython(tail) + + +# ----------------------------------------------------------------------- # + +class ComputerOutput(Node): + """ + This class holds information about XML elements with the ```` tag. + """ + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags + :param Node `parent`: the parent node, must not be ``None``. + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + text = self.element.text + if not text and not self.children: + return '' + + if text is not None: + stripped = text.strip() + space_before, space_after = CountSpaces(text) + + text = RemoveWxPrefix(text.strip()) + + else: + text = '' + + for child in self.children: + text += child.Join(with_tail=False) + + if '`' not in text: + text = "``%s`` "%text + + if self.element.tail: + text += ConvertToPython(self.element.tail) + + space_before, space_after = CountSpaces(text) + + return space_before + text + space_after + + +# ----------------------------------------------------------------------- # + +class Emphasis(Node): + """ + This class holds information about XML elements with the ```` and + ```` tags. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags + :param Node `parent`: the parent node, must not be ``None``. + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + if self.element.tag == 'emphasis': + format = '`%s`' + elif self.element.tag == 'bold': + format = '**%s**' + + spacing = ('ParameterList' in self.GetHierarchy() and [' '] or [''])[0] + + text = Node.Join(self, with_tail=False) + + if text.strip(): + text = spacing + format % text.strip() + + if self.element.tail: + text += ConvertToPython(self.element.tail) + + return text + + +# ----------------------------------------------------------------------- # + +class Title(Node): + """ + This class holds information about XML elements with the ```` tag. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags + :param Node `parent`: the parent node, must not be ``None``. + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + text = '|phoenix_title| ' + ConvertToPython(self.element.text) + lentext = len(text) + text = '\n\n%s\n%s\n\n'%(text, '='*lentext) + + return text + + +# ----------------------------------------------------------------------- # + +class ULink(Node): + """ + This class holds information about XML elements with the ``<ulink>`` tag. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, element, parent): + """ + Class constructor. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags + :param Node `parent`: the parent node, must not be ``None``. + """ + + Node.__init__(self, element, parent) + + + # ----------------------------------------------------------------------- + + def Join(self, with_tail=True): + """ + Join this node `element` attribute text and tail, adding all its children's + node text and tail in the meanwhile. + + :param `with_tail`: ``True`` if the element tail should be included in the + text, ``False`` otherwise. + + :rtype: `string` + + :returns: A string containing the ReSTified version of this node `element` text and + tail plus all its children's element text and tail. + + .. note:: For some of the classes in this script (for example the :class:`Emphasis`, + :class:`ComputerOutput`) the `with_tail` parameter should be set to ``False`` in order + to avoid wrong ReST output. + """ + + dummy, link = self.element.items()[0] + text = self.element.text + + text = '`%s <%s>`_'%(text, link) + + if self.element.tail: + text += ConvertToPython(self.element.tail) + + return text + + +# ----------------------------------------------------------------------- # + +class XMLDocString(object): + """ + This is the main class of this script, and it uses heavily the :class:`Node` + subclasses documented above. + + The :class:`XMLDocString` is responsible for building function/method signatures, + class descriptions, window styles and events and so on. + """ + + # ----------------------------------------------------------------------- + + def __init__(self, xml_item, is_overload=False, share_docstrings=False): + """ + Class constructor. + + :param `xml_item`: one of the classes available in `etgtools/extractors.py`, such as + `PyMethodDef`, `PyFunctionDef` and so on + :param bool `is_overload`: ``True`` if this class describes an overloaded + method/function, ``False`` otherwise. + :param bool `share_docstrings`: ``True`` if all the overloaded methods/functions + share the same docstrings. + """ + + self.xml_item = xml_item + self.is_overload = is_overload + self.share_docstrings = share_docstrings + + self.docstrings = '' + + self.class_name = '' + + self.snippet_count = 0 + self.table_count = 0 + + self.list_level = 1 + self.list_order = {} + + self.parameter_list = None + + self.root = Root(self, is_overload, share_docstrings) + + self.appearance = [] + self.overloads = [] + + if isinstance(xml_item, extractors.MethodDef): + self.kind = 'method' + elif isinstance(xml_item, (extractors.FunctionDef, extractors.PyFunctionDef)): + self.kind = 'function' + elif isinstance(xml_item, (extractors.ClassDef, extractors.PyClassDef)): + self.kind = 'class' + self.appearance = FindControlImages(xml_item) + self.class_name = RemoveWxPrefix(xml_item.name) or xml_item.pyName + elif isinstance(xml_item, extractors.EnumDef): + self.kind = 'enum' + else: + raise Exception('Unhandled docstring kind for %s'%xml_item.__class__.__name__) + + if hasattr(xml_item, 'deprecated') and xml_item.deprecated: + element = et.Element('deprecated', kind='deprecated') + element.text = VERSION + + deprecated_section = Section(element, None, self.kind, self.is_overload, self.share_docstrings) + self.root.AddSection(deprecated_section) + + + # ----------------------------------------------------------------------- + + def ToReST(self): + """ Auxiliary method. """ + + brief, detailed = self.xml_item.briefDoc, self.xml_item.detailedDoc + + self.RecurseXML(brief, self.root) + + for detail in detailed: + blank_element = Node('\n\n\n', self.root) + self.RecurseXML(detail, self.root) + + self.InsertParameterList() + self.BuildSignature() + self.docstrings = self.root.Join() + + self.LoadOverLoads() + + + # ----------------------------------------------------------------------- + + def GetBrief(self): + """ + Returns a ReSTified version of the `briefDoc` attribute for the XML docstrings. + + :rtype: `string` + """ + + brief = self.xml_item.briefDoc + + dummy_root = Root(self, False, False) + rest_class = self.RecurseXML(brief, dummy_root) + return rest_class.Join() + + + # ----------------------------------------------------------------------- + + def LoadOverLoads(self): + """ + Extracts the overloaded implementations of a method/function, unless this + class is itself an overload or the current method/function has no overloads. + """ + + if self.is_overload: + return + + if self.kind not in ['method', 'function'] or not self.xml_item.overloads: + return + + share_docstrings = True + all_docs = [] + + for sub_item in [self.xml_item] + self.xml_item.overloads: + + if sub_item.ignored: + continue + + dummy_root = Root(self, False, False) + self.RecurseXML(sub_item.briefDoc, dummy_root) + + for det in sub_item.detailedDoc: + self.RecurseXML(det, dummy_root) + + all_docs.append(dummy_root.Join()) + + if len(all_docs) == 1: + # Only one overload, don't act like there were more + self.xml_item.overloads = [] + return + + zero = all_docs[0] + for docs in all_docs[1:]: + if docs != zero: + share_docstrings = False + break + + self.share_docstrings = share_docstrings + + for sub_item in [self.xml_item] + self.xml_item.overloads: + + if sub_item.ignored: + continue + + sub_item.name = self.xml_item.pyName or RemoveWxPrefix(self.xml_item.name) + docstring = XMLDocString(sub_item, is_overload=True, share_docstrings=share_docstrings) + docstring.class_name = self.class_name + docstring.current_module = self.current_module + + docs = docstring.Dump() + self.overloads.append(docs) + + + # ----------------------------------------------------------------------- + + def RecurseXML(self, element, parent): + """ + Scan recursively all the XML elements which make up the whole documentation for + a particular class/method/function. + + :param xml.etree.ElementTree.Element `element`: a XML element containing the + information coming from Doxygen about the aforementioned tags + :param Node `parent`: the parent node, a subclass of the :class:`Node` class. + + :rtype: a subclass of :class:`Node` + + .. note: This is a recursive method. + """ + + if element is None: + return Node('', parent) + + if isinstance(element, basestring): + rest_class = Paragraph(element, parent, self.kind) + return rest_class + + tag, text, tail = element.tag, element.text, element.tail + + text = (text is not None and [text] or [''])[0] + tail = (tail is not None and [tail] or [''])[0] + + if tag == 'parameterlist': + rest_class = ParameterList(element, parent, self.xml_item, self.kind) + self.parameter_list = rest_class + + elif tag == 'parametername': + self.parameter_name = text + rest_class = self.parameter_list + + elif tag == 'parameterdescription': + parameter_class = self.parameter_list.Get(self.parameter_name) + if parameter_class: + rest_class = parameter_class + parameter_class.element = element + else: + rest_class = self.parameter_list + + elif tag in ['itemizedlist', 'orderedlist']: + rest_class = List(element, parent) + + elif tag == 'listitem': + rest_class = ListItem(element, parent) + + elif tag in ['simplesect', 'xrefsect']: + if 'ListItem' in parent.GetHierarchy(): + rest_class = Section(element, parent, self.kind, self.is_overload, self.share_docstrings) + else: + if element.tail: + Node(element.tail, parent) + + rest_class = Section(element, None, self.kind, self.is_overload, self.share_docstrings) + self.root.AddSection(rest_class) + + elif tag == 'image': + rest_class = Image(element, parent) + + elif tag == 'table': + fullname = self.GetFullName() + self.table_count += 1 + fullname = '%s.%d.rst'%(fullname, self.table_count) + rest_class = Table(element, parent, fullname) + self.table = rest_class + + elif tag == 'entry': + rest_class = TableEntry(element, self.table) + + elif tag == 'row': + rest_class = self.table + + elif tag == 'programlisting': + cpp_file, python_file, converted_py = self.SnippetName() + rest_class = Snippet(element, parent, cpp_file, python_file, converted_py) + self.code = rest_class + + elif tag in ['codeline', 'highlight', 'sp']: + self.code.AddCode(element) + rest_class = self.code + + elif tag == 'ref': + if 'Snippet' in parent.GetHierarchy(): + self.code.AddCode(element) + rest_class = self.code + else: + rest_class = XRef(element, parent) + + elif tag == 'computeroutput': + rest_class = ComputerOutput(element, parent) + + elif tag in ['emphasis', 'bold']: + rest_class = Emphasis(element, parent) + + elif tag == 'title': + rest_class = Title(element, parent) + + elif tag == 'para': + rest_class = Paragraph(element, parent, self.kind) + + elif tag == 'linebreak': + spacer = '' + dummy = Node('\n\n%s%s'%(spacer, tail.strip()), parent) + rest_class = parent + + elif tag == 'ulink': + rest_class = ULink(element, parent) + + elif tag == 'onlyfor': + onlyfor = et.Element('available', kind='available') + onlyfor.text = text + onlyfor.tail = tail + + section = Section(onlyfor, None, self.kind) + + self.root.AddSection(section) + rest_class = parent + + else: + rest_class = Node('', parent) + + for child_element in element: + self.RecurseXML(child_element, rest_class) + + return rest_class + + + # ----------------------------------------------------------------------- + + def GetFullName(self): + """ + Returns the complete name for a class/method/function, including + its module/package. + + :rtype: `string` + """ + + if self.kind == 'class': + klass = self.xml_item + name = RemoveWxPrefix(klass.name) or klass.pyName + dummy, fullname = Wx2Sphinx(name) + elif self.kind == 'method': + method = self.xml_item + if method.isCtor: + method_name = '__init__' + else: + method_name = method.name or method.pyName + method_name = RemoveWxPrefix(method_name) + dummy, fullname = Wx2Sphinx(method.className) + fullname = fullname + '.' + method_name + elif self.kind == 'function': + function = self.xml_item + name = function.pyName or function.name + fullname = self.current_module + 'functions.%s'%name + + return fullname + + + # ----------------------------------------------------------------------- + + def SnippetName(self): + """ + Returns a tuple of 3 elements (3 file paths), representing the following: + + 1. `cpp_file`: the path to the C++ snippet of code found in the XML + wxWidgets docstring, saved into the ``SNIPPETROOT/cpp`` folder + 2. `python_file`: the path to the roughly-converted to Python + snippet of code found in the XML wxWidgets docstring, saved into the + ``SNIPPETROOT/python`` folder + 3. `converted_py`: the path to the fully-converted to Python + snippet of code found in the XML wxWidgets docstring, saved into the + ``SNIPPETROOT/python/converted`` folder. + """ + + fullname = self.GetFullName() + + self.snippet_count += 1 + + cpp_file = os.path.join(SNIPPETROOT, 'cpp', fullname + '.%d.cpp'%self.snippet_count) + python_file = os.path.join(SNIPPETROOT, 'python', fullname + '.%d.py'%self.snippet_count) + converted_py = os.path.join(SNIPPETROOT, 'python', 'converted', fullname + '.%d.py'%self.snippet_count) + + return cpp_file, python_file, converted_py + + + # ----------------------------------------------------------------------- + + def Dump(self, write=True): + """ + Dumps the whole ReSTified docstrings and returns its correct ReST representation. + + :param bool `write`: ``True`` to write the resulting docstrings to a file, ``False`` + otherwise. + + :rtype: `string` + """ + + self.ToReST() + + methodMap = { + 'class' : self.DumpClass, + 'method' : self.DumpMethod, + 'function' : self.DumpFunction, + 'enum' : self.DumpEnum, + } + + function = methodMap[self.kind] + return function(write) + + + # ----------------------------------------------------------------------- + + def DumpClass(self, write): + """ + Dumps a ReSTified class description and returns its correct ReST representation. + + :param bool `write`: ``True`` to write the resulting docstrings to a file, ``False`` + otherwise. + + :rtype: `string` + """ + + stream = StringIO() + + # class declaration + klass = self.xml_item + name = self.class_name + dummy, fullname = Wx2Sphinx(name) + + stream.write(templates.TEMPLATE_DESCRIPTION % (fullname, name)) + + self.Reformat(stream) + + inheritance_diagram = InheritanceDiagram(klass.nodeBases) + png, map = inheritance_diagram.MakeInheritanceDiagram() + + image_desc = templates.TEMPLATE_INHERITANCE % (name, png, name, map) + stream.write(image_desc) + + if self.appearance: + appearance_desc = templates.TEMPLATE_APPEARANCE % tuple(self.appearance) + stream.write(appearance_desc) + + if klass.subClasses: + subs = [':ref:`%s`'%Wx2Sphinx(cls)[1] for cls in klass.subClasses] + subs = ', '.join(subs) + subs_desc = templates.TEMPLATE_SUBCLASSES % subs + stream.write(subs_desc) + + if klass.method_list: + summary = MakeSummary(name, klass.method_list, templates.TEMPLATE_METHOD_SUMMARY, 'meth') + stream.write(summary) + + if klass.property_list: + summary = MakeSummary(name, klass.property_list, templates.TEMPLATE_PROPERTY_SUMMARY, 'attr') + stream.write(summary) + + stream.write(templates.TEMPLATE_API) + stream.write("\n.. class:: %s"%name) + + bases = klass.bases or ['object'] + + if bases: + stream.write('(') + bases = [RemoveWxPrefix(b) for b in bases] + stream.write(', '.join(bases)) + stream.write(')') + + stream.write('\n\n') + + py_docs = klass.pyDocstring + + if isinstance(self.xml_item, extractors.PyClassDef): + newlines = self.xml_item.briefDoc.splitlines() + else: + newlines = [] + + found = False + for line in py_docs.splitlines(): + + if line.startswith(name): + if not found: + newlines.append("**Possible constructors**::\n") + found = True + else: + found = False + newlines.append(ConvertToPython(line)) + + if found: + newlines = self.CodeIndent(line, newlines) + + newdocs = u'' + for line in newlines: + newdocs += ' '*3 + line + "\n" + + stream.write(newdocs + "\n\n") + + if write: + WriteSphinxOutput(stream, self.output_file) + else: + return stream.getvalue() + + + # ----------------------------------------------------------------------- + + def BuildSignature(self): + """ Builds a function/method signature. """ + + if self.kind not in ['method', 'function']: + return + + if self.kind == 'method': + + method = self.xml_item + name = method.name or method.pyName + name = RemoveWxPrefix(name) + + if method.overloads and not self.is_overload: + if not method.isStatic: + arguments = '(self, *args, **kw)' + else: + arguments = '(*args, **kw)' + else: + arguments = method.pyArgsString + if not arguments: + arguments = '()' + if not method.isStatic: + if arguments[:2] == '()': + arguments = '(self)' + arguments[2:] + else: + arguments = '(self, ' + arguments[1:] + + if '->' in arguments: + arguments, after = arguments.split("->") + self.AddReturnType(after, name) + + arguments = arguments.rstrip() + if arguments.endswith(','): + arguments = arguments[0:-1] + + if not arguments.endswith(')'): + arguments += ')' + + if self.is_overload: + arguments = '`%s`'%arguments.strip() + + elif self.kind == 'function': + + function = self.xml_item + name = function.name or function.pyName + name = RemoveWxPrefix(name) + + if function.overloads and not self.is_overload: + arguments = '(*args, **kw)' + else: + if "->" in function.pyArgsString: + arguments, after = function.pyArgsString.split("->") + self.AddReturnType(after, name) + else: + arguments = function.pyArgsString + + if self.is_overload: + arguments = '`%s`'%arguments.strip() + + self.arguments = arguments + + + # ----------------------------------------------------------------------- + + def InsertParameterList(self): + """ + Inserts a :class:`ParameterList` item in the correct position into the + :class:`Root` hierarchy, and checks the signature validity against the + parameter list itself. + """ + + if self.kind not in ['method', 'function']: + return + + if self.parameter_list is not None: + self.parameter_list.CheckSignature() + return + + if not self.xml_item.overloads or self.is_overload: + self.parameter_list = ParameterList('', None, self.xml_item, self.kind) + self.root.Insert(self.parameter_list, before=Section) + self.parameter_list.CheckSignature() + + + # ----------------------------------------------------------------------- + + def AddReturnType(self, after, name): + + after = after.strip() + + if not after: + return + + if '(' in after: + + rtype = ReturnType('`tuple`', None) + + return_section = after.lstrip('(').rstrip(')') + return_section = return_section.split(',') + new_section = [] + + for ret in return_section: + if ret[0].isupper(): + new_section.append(':ref:`%s`'%ret.strip()) + else: + new_section.append('`%s`'%ret.strip()) + + element = et.Element('return', kind='return') + element.text = '( %s )'%(', '.join(new_section)) + + return_section = Section(element, None, self.kind, self.is_overload, self.share_docstrings) + self.root.AddSection(return_section) + + else: + + rtype = PythonizeType(after) + + if not rtype: + return + + if rtype[0].isupper() or '.' in rtype: + rtype = ':ref:`%s`'%rtype + else: + rtype = '`%s`'%rtype + + rtype = ReturnType(rtype, None) + + if self.parameter_list: + self.parameter_list.Add(rtype) + else: + self.root.Insert(rtype, before=Section) + + + # ----------------------------------------------------------------------- + + def DumpMethod(self, write): + """ + Dumps a ReSTified method description and returns its correct ReST representation. + + :param bool `write`: ``True`` to write the resulting docstrings to a file, ``False`` + otherwise. + + :rtype: `string` + """ + + stream = StringIO() + + method = self.xml_item + name = method.name or method.pyName + name = RemoveWxPrefix(name) + + if self.is_overload: + definition = '**%s** '%name + else: + if method.isStatic: + definition = ' .. staticmethod:: ' + name + else: + definition = ' .. method:: ' + name + + # write the method declaration + stream.write('\n%s'%definition) + + stream.write(self.arguments) + stream.write('\n\n') + + self.Reformat(stream) + stream.write("\n\n") + + if not self.is_overload and write: + WriteSphinxOutput(stream, self.output_file) + + return stream.getvalue() + + + # ----------------------------------------------------------------------- + + def DumpFunction(self, write): + """ + Dumps a ReSTified function description and returns its correct ReST representation. + + :param bool `write`: ``True`` to write the resulting docstrings to a file, ``False`` + otherwise. + + :rtype: `string` + """ + + stream = StringIO() + + function = self.xml_item + name = function.pyName or function.name + + if self.is_overload: + definition = '**%s** '%name + else: + definition = '.. function:: ' + name + + stream.write('\n%s'%definition) + + stream.write(self.arguments.strip()) + stream.write('\n\n') + + self.Reformat(stream) + + if not self.is_overload and write: + PickleItem(stream.getvalue(), self.current_module, name, 'function') + + return stream.getvalue() + + + # ----------------------------------------------------------------------- + + def DumpEnum(self, write): + """ + Dumps a ReSTified enumeration description and returns its correct ReST representation. + + :param bool `write`: ``True`` to write the resulting docstrings to a file, ``False`` + otherwise. + + :rtype: `string` + """ + + enum_name, fullname = Wx2Sphinx(self.xml_item.name) + + if '@' in enum_name: + return + + stream = StringIO() + self.output_file = self.current_module + "%s.enumeration.txt"%enum_name + + stream.write(templates.TEMPLATE_DESCRIPTION % (fullname, enum_name)) + stream.write('\n\nThe `%s` enumeration provides the following values:\n\n'%enum_name) + + stream.write('\n\n' + '='*80 + ' ' + '='*80 + '\n') + stream.write('%-80s **Value**\n'%'**Description**') + stream.write('='*80 + ' ' + '='*80 + '\n') + + count = 0 + + for v in self.xml_item.items: + if v.ignored: + continue + + docstrings = v.briefDoc + name = ConvertToPython(RemoveWxPrefix(v.name)) + stream.write('%-80s'%name) + + if not isinstance(docstrings, basestring): + rest_class = self.RecurseXML(docstrings, self.root) + docstrings = rest_class.Join() + + stream.write(' %s\n'%docstrings) + count += 1 + + stream.write('='*80 + ' ' + '='*80 + '\n\n|\n\n') + + text_file = os.path.join(SPHINXROOT, self.output_file) + + if os.path.isfile(text_file): + message = '\nWARNING: Duplicated description for `%s` enumeration.\n\n' \ + 'The duplicated instance will still be written to its output ReST file but\n' \ + 'Sphinx/Docutils will issue a warning when building the HTML docs.\n\n' + + duplicated = self.output_file.replace('.enumeration.txt', '') + print message % duplicated + + if count > 0 and write: + WriteSphinxOutput(stream, self.output_file) + + return stream.getvalue() + + + # ----------------------------------------------------------------------- + + def EventsInStyle(self, line, class_name): + + docstrings = '' + newline = line + + if 'supports the following styles:' in line: + docstrings += templates.TEMPLATE_WINDOW_STYLES % class_name + + elif 'The following event handler macros' in line: + last = line.index(':') + line = line[last+1:].strip() + + if line.count(':') > 2: + newline = 'Handlers bound for the following event types will receive one of the %s parameters.'%line + else: + newline = 'Handlers bound for the following event types will receive a %s parameter.'%line + + docstrings += templates.TEMPLATE_EVENTS % class_name + + elif 'Event macros for events' in line: + docstrings += templates.TEMPLATE_EVENTS % class_name + + elif 'following extra styles:' in line: + docstrings += templates.TEMPLATE_WINDOW_EXTRASTYLES % class_name + + return docstrings, newline + + + # ----------------------------------------------------------------------- + + def CodeIndent(self, code, newlines): + + if len(code) < 72: + newlines.append(' %s'%code) + newlines.append(' ') + return newlines + + start = code.index('(') + wrapped = textwrap.wrap(code, width=72) + + newcode = '' + for indx, line in enumerate(wrapped): + if indx == 0: + newlines.append(' %s'%line) + else: + newlines.append(' '*(start+5) + line) + + newlines.append(' ') + + return newlines + + + # ----------------------------------------------------------------------- + + def Indent(self, class_name, item, spacer, docstrings): + + for line in item.splitlines(): + if line.strip(): + newdocs, newline = self.EventsInStyle(line, class_name) + docstrings += newdocs + docstrings += spacer + newline + '\n' + else: + docstrings += line + '\n' + + return docstrings + + + # ----------------------------------------------------------------------- + + def Reformat(self, stream): + + spacer = '' + + if not self.is_overload: + if self.kind == 'function': + spacer = 3*' ' + elif self.kind == 'method': + spacer = 6*' ' + + if self.overloads and not self.share_docstrings: + + docstrings = '' + + elif self.is_overload and self.share_docstrings: + + docstrings = self.Indent(None, self.docstrings, spacer, u'') + + else: + + class_name = None + + if self.kind == 'class': + class_name = self.class_name + + if isinstance(self.xml_item, (extractors.PyFunctionDef, extractors.PyClassDef)): + docstrings = self.xml_item.briefDoc + if docstrings: + docstrings = self.Indent(class_name, docstrings, spacer, u'') + else: + docstrings = '' + else: + docstrings = self.Indent(class_name, self.docstrings, spacer, u'') + + if self.kind == 'class': + desc = ChopDescription(docstrings) + class_name = self.class_name.lower() + PickleItem(desc, self.current_module, self.class_name, 'class') + + if self.overloads: + + docstrings += '\n\n%s|overload| **Overloaded Implementations**:\n\n'%spacer + docstrings += '%s**~~~**\n\n'%spacer + + for index, over in enumerate(self.overloads): + for line in over.splitlines(): + docstrings += spacer + line + '\n' + + docstrings += '%s**~~~**\n\n'%spacer + + stream.write(docstrings + "\n\n") + + +# --------------------------------------------------------------------------- + +class SphinxGenerator(generators.DocsGeneratorBase): + + def generate(self, module): + + self.current_module = MODULENAME_REPLACE[module.module] + self.module_name = module.name + self.current_class = None + + self.generateModule(module) + + # ----------------------------------------------------------------------- + + def RemoveDuplicated(self, class_name, class_items): + + duplicated_indexes = [] + done = [] + + properties = (extractors.PropertyDef, extractors.PyPropertyDef) + methods = (extractors.MethodDef, extractors.CppMethodDef, extractors.CppMethodDef_sip, + extractors.PyMethodDef, extractors.PyFunctionDef) + + message = '\nWARNING: Duplicated instance of %s `%s` encountered in class `%s`.\n' \ + 'The last occurrence of `%s` (an instance of `%s`) will be discarded.\n\n' + + for index, item in enumerate(class_items): + if isinstance(item, methods): + name, dummy = self.getName(item) + kind = 'method' + elif isinstance(item, properties): + name = item.name + kind = 'property' + else: + continue + + if name in done: + print message % (kind, name, class_name, name, item.__class__.__name__) + duplicated_indexes.append(index) + continue + + done.append(name) + + duplicated_indexes.reverse() + for index in duplicated_indexes: + class_items.pop(index) + + return class_items + + + # ----------------------------------------------------------------------- + + def generateModule(self, module): + """ + Generate code for each of the top-level items in the module. + """ + assert isinstance(module, extractors.ModuleDef) + + methodMap = { + extractors.ClassDef : self.generateClass, + extractors.DefineDef : self.generateDefine, + extractors.FunctionDef : self.generateFunction, + extractors.EnumDef : self.generateEnum, + extractors.GlobalVarDef : self.generateGlobalVar, + extractors.TypedefDef : self.generateTypedef, + extractors.WigCode : self.generateWigCode, + extractors.PyCodeDef : self.generatePyCode, + extractors.CppMethodDef : self.generateFunction, + extractors.CppMethodDef_sip : self.generateFunction, + extractors.PyFunctionDef : self.generatePyFunction, + extractors.PyClassDef : self.generatePyClass, + } + + for item in module: + if item.ignored: + continue + + function = methodMap[item.__class__] + function(item) + + + # ----------------------------------------------------------------------- + + def generatePyFunction(self, function): + + function.overloads = [] + function.pyArgsString = function.argsString + # docstring + docstring = XMLDocString(function) + docstring.kind = 'function' + docstring.current_module = self.current_module + + docstring.Dump() + + + # ----------------------------------------------------------------------- + + def generateFunction(self, function): + + # docstring + docstring = XMLDocString(function) + docstring.kind = 'function' + docstring.current_module = self.current_module + + docstring.Dump() + + + # ----------------------------------------------------------------------- + + def generatePyClass(self, klass): + + klass.module = self.current_module + self.current_class = klass + + name = klass.name + self.current_class.method_list = [] + self.current_class.property_list = [] + + class_items = [i for i in klass if not i.ignored] + class_items = sorted(class_items, key=operator.attrgetter('name')) + + class_items = self.RemoveDuplicated(name, class_items) + + init_position = -1 + + for index, item in enumerate(class_items): + if isinstance(item, extractors.PyFunctionDef): + method_name, simple_docs = self.getName(item) + if method_name == '__init__': + init_position = index + self.current_class.method_list.insert(0, (method_name, simple_docs)) + else: + self.current_class.method_list.append((method_name, simple_docs)) + elif isinstance(item, extractors.PyPropertyDef): + simple_docs = self.createPropertyLinks(name, item) + self.current_class.property_list.append((item.name, simple_docs)) + + PickleClassInfo(self.current_module + name, self.current_class) + + if init_position >= 0: + init_method = class_items.pop(init_position) + class_items.insert(0, init_method) + + docstring = XMLDocString(klass) + docstring.kind = 'class' + + filename = self.current_module + "%s.txt"%name + docstring.output_file = filename + docstring.current_module = self.current_module + + docstring.Dump() + + # these are the only kinds of items allowed to be items in a PyClass + dispatch = { + extractors.PyFunctionDef : self.generateMethod, + extractors.PyPropertyDef : self.generatePyProperty, + extractors.PyCodeDef : self.generatePyCode, + extractors.PyClassDef : self.generatePyClass, + } + + for item in class_items: + item.klass = klass + f = dispatch[item.__class__] + f(item) + + + # ----------------------------------------------------------------------- + + def generatePyProperty(self, prop): + + name = RemoveWxPrefix(self.current_class.name) or self.current_class.pyName + getter_setter = self.createPropertyLinks(name, prop) + + stream = StringIO() + stream.write('\n .. attribute:: %s\n\n' % prop.name) + stream.write(' %s\n\n'%getter_setter) + + filename = self.current_module + "%s.txt"%name + + WriteSphinxOutput(stream, filename) + + # ----------------------------------------------------------------------- + + def generateClass(self, klass): + + assert isinstance(klass, extractors.ClassDef) + + if klass.ignored: + return + + # generate nested classes + for item in klass.innerclasses: + self.generateClass(item) + + name = RemoveWxPrefix(klass.name) or klass.pyName + +## # Hack for App/PyApp... +## if name == 'PyApp': +## klass.name = name = 'App' + + klass.module = self.current_module + self.current_class = klass + + self.current_class.method_list = [] + self.current_class.property_list = [] + + # Inspected class Method to call Sort order + dispatch = { + extractors.MethodDef : (self.generateMethod, 1), + extractors.CppMethodDef : (self.generateMethod, 1), + extractors.CppMethodDef_sip : (self.generateMethod, 1), + extractors.PyMethodDef : (self.generatePyMethod, 1), + extractors.MemberVarDef : (self.generateMemberVar, 2), + extractors.PropertyDef : (self.generateProperty, 2), + extractors.PyPropertyDef : (self.generateProperty, 2), + extractors.EnumDef : (self.generateEnum, 0), + extractors.PyCodeDef : (self.generatePyCode, 3), + extractors.WigCode : (self.generateWigCode, 4), + } + + # Build a list to check if there are any properties + properties = (extractors.PropertyDef, extractors.PyPropertyDef) + methods = (extractors.MethodDef, extractors.CppMethodDef, extractors.CppMethodDef_sip, extractors.PyMethodDef) + + # Split the items documenting the __init__ methods first + ctors = [i for i in klass if + isinstance(i, extractors.MethodDef) and + i.protection == 'public' and (i.isCtor or i.isDtor)] + + class_items = [i for i in klass if i not in ctors and not i.ignored] + + for item in class_items: + item.sort_order = dispatch[item.__class__][1] + + class_items = sorted(class_items, key=operator.attrgetter('sort_order', 'name')) + class_items = self.RemoveDuplicated(name, class_items) + + for item in class_items: + if isinstance(item, methods) and not self.IsFullyDeprecated(item): + method_name, simple_docs = self.getName(item) + self.current_class.method_list.append((method_name, simple_docs)) + elif isinstance(item, properties): + simple_docs = self.createPropertyLinks(name, item) + self.current_class.property_list.append((item.name, simple_docs)) + + for item in ctors: + if item.isCtor: + method_name, simple_docs = self.getName(item) + self.current_class.method_list.insert(0, ('__init__', simple_docs)) + + PickleClassInfo(self.current_module + name, self.current_class) + + docstring = XMLDocString(klass) + + filename = self.current_module + "%s.txt"%name + docstring.output_file = filename + docstring.current_module = self.current_module + + docstring.Dump() + + for item in ctors: + if item.isCtor: + self.generateMethod(item, name='__init__', docstring=klass.pyDocstring) + + for item in class_items: + f = dispatch[item.__class__][0] + f(item) + + # ----------------------------------------------------------------------- + + def generateMethod(self, method, name=None, docstring=None): + + if method.ignored: + return + + name = name or self.getName(method)[0] +## if name.startswith("__") and "__init__" not in name: +## return + + class_name = RemoveWxPrefix(self.current_class.name) or self.current_class.pyName + + # docstring + method.name = name + method.pyArgsString = method.pyArgsString.replace('(self)', ' ').replace('(self, ', ' ') + docstring = XMLDocString(method) + docstring.kind = 'method' + + name = RemoveWxPrefix(self.current_class.name) or self.current_class.pyName + filename = self.current_module + "%s.txt"%class_name + + docstring.output_file = filename + docstring.class_name = class_name + docstring.current_module = self.current_module + + docstring.Dump() + + # ----------------------------------------------------------------------- + + def IsFullyDeprecated(self, pyMethod): + + if not isinstance(pyMethod, extractors.PyMethodDef): + return False + + if pyMethod.deprecated: + brief, detailed = pyMethod.briefDoc, pyMethod.detailedDoc + if not brief and not detailed: + # Skip simple wrappers unless they have a brief or a detailed doc + return True + + return False + + + def generatePyMethod(self, pm): + + assert isinstance(pm, extractors.PyMethodDef) + + if pm.ignored: + return + + if self.IsFullyDeprecated(pm): + return + + stream = StringIO() + stream.write('\n .. method:: %s%s\n\n' % (pm.name, pm.argsString)) + + docstrings = ConvertToPython(pm.pyDocstring).replace('\n', ' ') + + newdocs = '' + for line in docstrings.splitlines(): + newdocs += ' '*6 + line + "\n" + + stream.write(newdocs + '\n\n') + + name = RemoveWxPrefix(self.current_class.name) or self.current_class.pyName + filename = self.current_module + "%s.txt"%name + + WriteSphinxOutput(stream, filename) + + # ----------------------------------------------------------------------- + + def generateMemberVar(self, memberVar): + assert isinstance(memberVar, extractors.MemberVarDef) + if memberVar.ignored: + return + + # ----------------------------------------------------------------------- + + def generateProperty(self, prop): + + if prop.ignored: + return + + name = RemoveWxPrefix(self.current_class.name) or self.current_class.pyName + + getter_setter = self.createPropertyLinks(name, prop) + + stream = StringIO() + stream.write('\n .. attribute:: %s\n\n' % prop.name) + stream.write(' %s\n\n'%getter_setter) + + filename = self.current_module + "%s.txt"%name + + WriteSphinxOutput(stream, filename) + + + def createPropertyLinks(self, name, prop): + + if prop.getter and prop.setter: + return 'See :meth:`~%s.%s` and :meth:`~%s.%s`'%(name, prop.getter, name, prop.setter) + else: + method = (prop.getter and [prop.getter] or [prop.setter])[0] + return 'See :meth:`~%s.%s`'%(name, method) + + + # ----------------------------------------------------------------------- + def generateEnum(self, enum): + + assert isinstance(enum, extractors.EnumDef) + if enum.ignored: + return + + docstring = XMLDocString(enum) + docstring.current_module = self.current_module + + docstring.Dump() + + + # ----------------------------------------------------------------------- + def generateGlobalVar(self, globalVar): + assert isinstance(globalVar, extractors.GlobalVarDef) + if globalVar.ignored: + return + name = globalVar.pyName or globalVar.name + if guessTypeInt(globalVar): + valTyp = '0' + elif guessTypeFloat(globalVar): + valTyp = '0.0' + elif guessTypeStr(globalVar): + valTyp = '""' + else: + valTyp = RemoveWxPrefix(globalVar.type) + '()' + + # ----------------------------------------------------------------------- + def generateDefine(self, define): + assert isinstance(define, extractors.DefineDef) + # write nothing for this one + + # ----------------------------------------------------------------------- + def generateTypedef(self, typedef): + assert isinstance(typedef, extractors.TypedefDef) + # write nothing for this one + + # ----------------------------------------------------------------------- + def generateWigCode(self, wig): + assert isinstance(wig, extractors.WigCode) + # write nothing for this one + + # ----------------------------------------------------------------------- + def generatePyCode(self, pc): + + assert isinstance(pc, extractors.PyCodeDef) + + # ----------------------------------------------------------------------- + def getName(self, method): + + if hasattr(method, 'isCtor') and method.isCtor: + method_name = '__init__' + else: + method_name = method.pyName or method.name + if method_name in MAGIC_METHODS: + method_name = MAGIC_METHODS[method_name] + + simple_docs = '' + + if isinstance(method, extractors.PyMethodDef): + simple_docs = ConvertToPython(method.pyDocstring) + else: + brief = method.briefDoc + if not isinstance(brief, basestring): + docstring = XMLDocString(method) + docstring.kind = 'method' + docstring.current_module = self.current_module + simple_docs = docstring.GetBrief() + elif brief is not None: + simple_docs = ConvertToPython(brief) + + simple_docs = ChopDescription(simple_docs) + + return method_name, simple_docs + + +# --------------------------------------------------------------------------- +# helpers + +def guessTypeInt(v): + if isinstance(v, extractors.EnumValueDef): + return True + if isinstance(v, extractors.DefineDef) and '"' not in v.value: + return True + type = v.type.replace('const', '') + type = type.replace(' ', '') + if type in ['int', 'long', 'byte', 'size_t']: + return True + if 'unsigned' in type: + return True + return False + + +def guessTypeFloat(v): + type = v.type.replace('const', '') + type = type.replace(' ', '') + if type in ['float', 'double', 'wxDouble']: + return True + return False + +def guessTypeStr(v): + if hasattr(v, 'value') and '"' in v.value: + return True + if 'wxString' in v.type: + return True + return False + +# --------------------------------------------------------------------------- diff --git a/etgtools/tweaker_tools.py b/etgtools/tweaker_tools.py index a5299b21..69500f88 100644 --- a/etgtools/tweaker_tools.py +++ b/etgtools/tweaker_tools.py @@ -30,7 +30,6 @@ magicMethods = { # TODO: add more } - def removeWxPrefixes(node): """ Rename items with a 'wx' prefix to not have the prefix. If the back-end @@ -54,6 +53,10 @@ def removeWxPrefixes(node): def removeWxPrefix(name): if name.startswith('wx') and not name.startswith('wxEVT_'): name = name[2:] + + if name.startswith('``wx') and not name.startswith('``wxEVT_'): + name = name[0:2] + name[4:] + return name @@ -363,7 +366,8 @@ def runGenerators(module): generators.append(pi_generator.PiWrapperGenerator()) # And finally add the documentation generator - generators.append(getDocsGenerator()) + import sphinx_generator + generators.append(sphinx_generator.SphinxGenerator()) # run them for g in generators: diff --git a/sphinxtools/__init__.py b/sphinxtools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sphinxtools/constants.py b/sphinxtools/constants.py new file mode 100644 index 00000000..9b897bc6 --- /dev/null +++ b/sphinxtools/constants.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +#--------------------------------------------------------------------------- +# Name: sphinxtools/constants.py +# Author: Andrea Gavana +# +# Created: 30-Nov-2010 +# Copyright: (c) 2011 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +# Standard library imports +import os +import re +import datetime + +# Phoenix-specific imports +import buildtools.version as version + +# List of strings that should be ignored when creating inline literals +# such as ``ID_ANY`` or ``HORIZONtAL``, with double backticks +IGNORE = ['wxPython', 'wxWidgets', 'wxOSX', 'wxMGL', 'wxDFB', 'wxMAC', 'wxGTK', 'wxGTK2', 'wxUniversal', + 'OS', 'X', 'OSX', 'DFB', 'MAC', 'GTK', 'GTK2', 'MSW', 'wxMSW', 'X11', 'OS2', 'MS', 'XP', 'GTK+', + 'UI', 'GUI', '--', 'OTOH', 'GDI+', 'API', 'NT', 'RTL', 'GDI', '3D', 'MDI'] + +# C++ stuff to Python/ReST stuff +VALUE_MAP = {'true': '``True``', + 'false': '``False``', + '``NULL``': '``None``', + 'NULL': '``None``', + 'L{OSX}': '`OSX`', + 'ctor': 'constructor', + } + +# This is a list of instances in Phoenix (i.e., without documentation strings), and +# For the sake of beauty of the docs they get the inline literal treatment (double backticks) +CONSTANT_INSTANCES = ['NullAcceleratorTable', 'TheApp', 'DefaultPosition', 'DefaultSize', + 'DefaultCoord', 'Coord', 'TheBrushList', 'TheColourDatabase', + 'NullFont', 'NullBrush', 'NullPalette', 'NullPen', 'EmptyString', + 'TheFontList', 'NullIcon', 'NullBitmap', 'constructor', 'ThePenList', + 'DefaultValidator', 'String.Capitalize'] + +# Phoenix full version +VERSION = '%d.%d.%d' % (version.VER_MAJOR, version.VER_MINOR, version.VER_RELEASE) + +# Things to chop away when ReST-ifying the docstrings +PUNCTUATION = '!"#$%\'()*,./:;<=>?@\\^{|}~' + +# Conversion between XML sections and ReST sections +SECTIONS = [('return' , ':returns:'), + ('since' , '.. versionadded::'), + ('deprecated', '.. deprecated::'), + ('warning' , '.. warning::'), + ('remarks' , '.. note::'), + ('remark' , '.. note::'), + ('available' , '.. availability::'), + ('note' , '.. note::'), + ('see' , '.. seealso::'), + ('todo' , '.. todo::')] + + +# List of things to remove/ignore (there may be more) +REMOVED_LINKS = ['Library:', 'Category:', 'Predefined objects/pointers:'] + +# Dictionary mapping the etg module name to the real Phoenix module name +# This needs to be kept up to date when other stuff comes in (i.e., wx.grid, +# wx.html and so on) +MODULENAME_REPLACE = {'_core' : '', + '_dataview': 'dataview.' + } + +# Other C++ specific things to strip away +CPP_ITEMS = ['*', '&', 'const', 'unsigned', '(size_t)', 'size_t', 'void'] + +# Serie of paths containing the input data for Sphinx and for the scripts +# building the ReST docs: + +# The location of the Phoenix main folder +PHOENIXROOT = os.path.abspath(os.path.split(__file__)[0] + '/..') + +# The location of the Sphinx main folder +SPHINXROOT = os.path.join(PHOENIXROOT, 'docs', 'sphinx') + +# Where the snippets found in the XML docstrings live (There are C++, unconverted and +# converted Python snippets in 3 sub-folders +SNIPPETROOT = os.path.join(SPHINXROOT, 'rest_substitutions', 'snippets') + +# A folder where some of the difficult-to-translate-to-ReST tables are. There are 3 of +# them up to now, for various reasons: +# 1. The wx.Sizer flags table is a grid table, very difficult to ReSTify automatically +# 2. The wx.ColourDatabase table of colour comes up all messy when ReSTified from XML +# 3. The "wxWidgets 2.8 Compatibility Functions" table for wx.VScrolledWindow +TABLEROOT = os.path.join(SPHINXROOT, 'rest_substitutions', 'tables') + +# Folder where to save the inheritance diagrams for the classes +INHERITANCEROOT = os.path.join(SPHINXROOT, '_static', 'images', 'inheritance') + +# Folder where to save the images found in the wxWidgets overviews or in the XML +# docstrings +OVERVIEW_IMAGES_ROOT = os.path.join(SPHINXROOT, '_static', 'images', 'overviews') + +# Folder where to save the widgets screenshots (full-size, no thumbnails here) +WIDGETS_IMAGES_ROOT = os.path.join(SPHINXROOT, '_static', 'images', 'widgets', 'fullsize') + +# Folder for the icons used for titles, sub-titles and so on for the Sphinx documentation +SPHINX_IMAGES_ROOT = os.path.join(SPHINXROOT, '_static', 'images', 'sphinxdocs') + +# The Doxygen root for the XML docstrings +DOXYROOT = os.path.join(os.environ['WXWIN'], 'docs', 'doxygen') + +# Dictionary copied over from tweaker_tools +MAGIC_METHODS = { + 'operator!=' : '__ne__', + 'operator==' : '__eq__', + 'operator+' : '__add__', + 'operator-' : '__sub__', + 'operator*' : '__mul__', + 'operator/' : '__div__', + 'operator+=' : '__iadd__', + 'operator-=' : '__isub__', + 'operator*=' : '__imul__', + 'operator/=' : '__idiv__', + 'operator bool' : '__int__', # Why not __nonzero__? + # TODO: add more + } + +# A regex to split a string keeping the whitespaces +RE_KEEP_SPACES = re.compile(r'(\s+)') + +# A list of things used in the post-processing of the HTML files generated by Sphinx +# This list is used only to insert a HTML horizontal line (<hr>) after each method/function +# description +HTML_REPLACE = ['module', 'function', 'method', 'class', 'classmethod', 'staticmethod', 'attribute'] + +# The SVN revision of wxWidgets/Phoenix used to build the Sphinx docs. +# There must be a more intelligent way to get this information automatically. +SVN_REVISION = '70154' + +# Today's date representation for the Sphinx HTML docs +TODAY = datetime.date.today().strftime('%d %B %Y') + diff --git a/sphinxtools/inheritance.py b/sphinxtools/inheritance.py new file mode 100644 index 00000000..5c9da835 --- /dev/null +++ b/sphinxtools/inheritance.py @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +#--------------------------------------------------------------------------- +# Name: sphinxtools/inheritance.py +# Author: Andrea Gavana +# +# Created: 30-Nov-2010 +# Copyright: (c) 2011 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +# Standard library imports + +import os +import errno +from subprocess import Popen, PIPE + +# Phoenix-specific imports + +from utilities import Wx2Sphinx +from constants import INHERITANCEROOT + +ENOENT = getattr(errno, 'ENOENT', 0) +EPIPE = getattr(errno, 'EPIPE', 0) + + +class InheritanceDiagram(object): + """ + Given a list of classes, determines the set of classes that they inherit + from all the way to the root "object", and then is able to generate a + graphviz dot graph from them. + """ + + # ----------------------------------------------------------------------- # + + def __init__(self, class_info): + + self.class_info, self.specials = class_info + + + # These are the default attrs for graphviz + default_graph_attrs = { + 'rankdir': 'LR', + 'size': '"8.0, 12.0"', + } + default_node_attrs = { + 'shape': 'box', + 'fontsize': 10, + 'height': 0.3, + 'fontname': 'Vera Sans, DejaVu Sans, Liberation Sans, ' + 'Arial, Helvetica, sans', + 'style': '"setlinewidth(0.5)"', + } + default_edge_attrs = { + 'arrowsize': 0.5, + 'style': '"setlinewidth(0.5)"', + } + + + # ----------------------------------------------------------------------- # + + def FormatNodeAttrs(self, attrs): + + return ','.join(['%s=%s' % x for x in attrs.items()]) + + + # ----------------------------------------------------------------------- # + + def FormatGraphAttrs(self, attrs): + + return ''.join(['%s=%s;\n' % x for x in attrs.items()]) + + + # ----------------------------------------------------------------------- # + + def GenerateDot(self, name="dummy"): + """ + Generate a graphviz dot graph from the classes that were passed in to `__init__`. + + :param string `name`: the name of the graph. + + :rtype: `string` + + :returns: A string representing the Graphviz dot diagram. + """ + + inheritance_graph_attrs = dict(fontsize=9, ratio='auto', size='""', rankdir="LR") + inheritance_node_attrs = {"align": "center", 'shape': 'box', + 'fontsize': 10, 'height': 0.3, + 'fontname': 'Vera Sans, DejaVu Sans, Liberation Sans, ' + 'Arial, Helvetica, sans', 'style': '"setlinewidth(0.5)"', + 'labelloc': 'c', 'fontcolor': 'grey45'} + + inheritance_edge_attrs = {'arrowsize': 0.5, 'style': '"setlinewidth(0.5)"', "color": "black"} + + g_attrs = self.default_graph_attrs.copy() + n_attrs = self.default_node_attrs.copy() + e_attrs = self.default_edge_attrs.copy() + g_attrs.update(inheritance_graph_attrs) + n_attrs.update(inheritance_node_attrs) + e_attrs.update(inheritance_edge_attrs) + + res = [] + res.append('digraph %s {\n' % name) + res.append(self.FormatGraphAttrs(g_attrs)) + + for name, fullname, bases in self.class_info.values(): + # Write the node + this_node_attrs = n_attrs.copy() + + if name in self.specials: + this_node_attrs['fontcolor'] = 'black' + this_node_attrs['color'] = 'blue' + this_node_attrs['style'] = 'bold' + + newname, fullname = Wx2Sphinx(name) + + this_node_attrs['URL'] = '"%s.html"'%fullname + res.append(' "%s" [%s];\n' % + (newname, self.FormatNodeAttrs(this_node_attrs))) + + # Write the edges + for base_name in bases: + + this_edge_attrs = e_attrs.copy() + if name in self.specials: + this_edge_attrs['color'] = 'red' + + base_name, dummy = Wx2Sphinx(base_name) + + res.append(' "%s" -> "%s" [%s];\n' % + (base_name, newname, + self.FormatNodeAttrs(this_edge_attrs))) + res.append('}\n') + return ''.join(res) + + + # ----------------------------------------------------------------------- # + + def MakeInheritanceDiagram(self): + """ + Actually generates the inheritance diagram as a PNG file plus the corresponding + MAP file for mouse navigation over the inheritance boxes. + + These two files are saved into the ``INHERITANCEROOT`` folder (see `sphinxtools/constants.py` + for more information). + + :rtype: `tuple` + + :returns: a tuple containing the PNG file name and a string representing the content + of the MAP file (with newlines stripped away). + + .. note:: The MAP file is deleted as soon as its content has been read. + """ + + code = self.GenerateDot() + + # graphviz expects UTF-8 by default + if isinstance(code, unicode): + code = code.encode('utf-8') + + static_root = INHERITANCEROOT + + dot_args = ['dot'] + dummy, filename = Wx2Sphinx(self.specials[0]) + outfn = os.path.join(static_root, filename + '_inheritance.png') + + if os.path.isfile(outfn): + os.remove(outfn) + if os.path.isfile(outfn + '.map'): + os.remove(outfn + '.map') + + dot_args.extend(['-Tpng', '-o' + outfn]) + dot_args.extend(['-Tcmapx', '-o%s.map' % outfn]) + + try: + + p = Popen(dot_args, stdout=PIPE, stdin=PIPE, stderr=PIPE) + + except OSError, err: + + if err.errno != ENOENT: # No such file or directory + raise + + print '\nERROR: Graphviz command `dot` cannot be run (needed for Graphviz output), check your ``PATH`` setting' + + try: + # Graphviz may close standard input when an error occurs, + # resulting in a broken pipe on communicate() + stdout, stderr = p.communicate(code) + + except OSError, err: + + # in this case, read the standard output and standard error streams + # directly, to get the error message(s) + stdout, stderr = p.stdout.read(), p.stderr.read() + p.wait() + + if p.returncode != 0: + print '\nERROR: Graphviz `dot` command exited with error:\n[stderr]\n%s\n[stdout]\n%s\n\n' % (stderr, stdout) + + mapfile = outfn + '.map' + + fid = open(mapfile, 'rt') + map = fid.read() + fid.close() + + os.remove(mapfile) + + return os.path.split(outfn)[1], map.replace('\n', ' ') + diff --git a/sphinxtools/postprocess.py b/sphinxtools/postprocess.py new file mode 100644 index 00000000..b7ce2a86 --- /dev/null +++ b/sphinxtools/postprocess.py @@ -0,0 +1,566 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +#--------------------------------------------------------------------------- +# Name: sphinxtools/postprocess.py +# Author: Andrea Gavana +# +# Created: 30-Nov-2010 +# Copyright: (c) 2011 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +# Standard library imports +import os +import re +import cPickle +import glob +import random + +# Phoenix-specific imports +import templates + +from utilities import Wx2Sphinx +from constants import HTML_REPLACE, SVN_REVISION, TODAY, SPHINXROOT +from constants import CONSTANT_INSTANCES, WIDGETS_IMAGES_ROOT, SPHINX_IMAGES_ROOT + + +def MakeHeadings(): + """ + Generates the "headings.inc" file containing the substitution reference + for the small icons used in the Sphinx titles, sub-titles and so on. + + The small icons are stored into the ``SPHINX_IMAGES_ROOT`` folder. + + .. note:: The "headings.inc" file is created in the ``SPHINXROOT`` folder + (see `sphinxtools/constants.py`). + """ + + images = glob.glob(SPHINX_IMAGES_ROOT + '/*.png') + images.sort() + + heading_file = os.path.join(SPHINXROOT, 'headings.inc') + + fid = open(heading_file, 'wt') + + for img in images: + name = os.path.split(os.path.splitext(img)[0])[1] + rel_path_index = img.find('_static') + rel_path = img[rel_path_index:] + + width = ('overload' in name and [16] or [32])[0] + text = templates.TEMPLATE_HEADINGS % (name, os.path.normpath(rel_path), width) + + fid.write(text) + + fid.close() + + +# ----------------------------------------------------------------------- # + +def SphinxIndexes(sphinxDir): + """ + This is the main function called after the `etg` process has finished. + + It class other functions to generate the standalone functions page, the + main class index and some clean-up/maintenance of the generated ReST + files. + """ + + pklfiles = glob.glob(sphinxDir + '/*.pkl') + + for file in pklfiles: + if file.endswith('functions.pkl'): + ReformatFunctions(file) + elif 'classindex' in file: + MakeClassIndex(file) + + BuildEnumsAndMethods(sphinxDir) + + +# ----------------------------------------------------------------------- # + +def BuildEnumsAndMethods(sphinxDir): + """ + This function does some clean-up/refactoring of the generated ReST files by: + + 1. Removing the `:meth:` reference to Enums, as they are not methods, and replacing + it with the `:ref:` role. This information is unfortunately not known when the + main `etgtools/sphinx_generator.py` runs. + 2. Removing the "Perl note" stuff from the text (and we should clean up the + wxWidgets docs at the source to remove the wxPython notes as well). + 3. Substituting the `:ref:` role for unreferenced classes (these may be classes yet + to be ported to Phoenix or C++-specific classes which will never be ported to + Phoenix) with simple backticks. + 4. Some cleanup. + """ + + fid = open(os.path.join(sphinxDir, 'class_summary.lst'), 'rb') + class_summary = cPickle.load(fid) + fid.close() + + unreferenced_classes = {} + + textfiles = glob.glob(sphinxDir + '/*.txt') + enum_files = glob.glob(sphinxDir + '/*.enumeration.txt') + + enum_base = [os.path.split(os.path.splitext(enum)[0])[1] for enum in enum_files] + enum_base = [enum.replace('.enumeration', '') for enum in enum_base] + + enum_dict = {} + + for enum in enum_base: + enum_dict[':meth:`%s`'%enum] = ':ref:`%s`'%enum + + for input in textfiles: + + fid = open(input, 'rt') + text = fid.read() + fid.close() + + for old, new in enum_dict.items(): + text = text.replace(old, new) + + # Replace the "Perl Note" stuff, we don't need it + newtext = '' + for line in text.splitlines(): + if 'perl note' in line.lower(): + continue + newtext += line + '\n' + + text = newtext + + text = FindInherited(input, class_summary, enum_base, text) + text, unreferenced_classes = RemoveUnreferenced(input, class_summary, enum_base, unreferenced_classes, text) + + text = text.replace('wx``', '``') + text = text.replace('wx.``', '``') + text = text.replace('non-NULL', 'not ``None``') + text = text.replace(',,', ',').replace(', ,', ',') + text = text.replace(':note:', '.. note::') + + fid = open(input, 'wt') + fid.write(text) + fid.close() + + if not unreferenced_classes: + return + + warn = '\n\nWARNING: there are %d instances of referenced classes/enums, via the `:ref:` role, which\n' \ + 'are not in the list of available classes (these may be classes yet to be ported to Phoenix\n' \ + 'or C++-specific classes which will never be ported to Phoenix).\n\n' \ + '*sphinxgenerator* has replaced the `:ref:` role for them with simple backticks, i.e.:\n\n' \ + ' :ref:`MissingClass` ==> `MissingClass`\n\n' \ + 'to avoid warning from Sphinx and Docutils, and saved a list of their occurrences into\n' \ + 'the text file "unreferenced_classes.inc" together with the ReST file names where they\n' \ + 'appear.\n\n' + + keys = unreferenced_classes.keys() + keys.sort() + + fid = open(os.path.join(SPHINXROOT, 'unreferenced_classes.inc'), 'wt') + fid.write('\n') + fid.write('='*50 + ' ' + '='*50 + '\n') + fid.write('%-50s %-50s\n'%('Reference', 'File Name(s)')) + fid.write('='*50 + ' ' + '='*50 + '\n') + + for key in keys: + fid.write('%-50s %-50s\n'%(key, ', '.join(unreferenced_classes[key]))) + + fid.write('='*50 + ' ' + '='*50 + '\n') + fid.close() + + print warn%(len(keys)) + + +# ----------------------------------------------------------------------- # + +def FindInherited(input, class_summary, enum_base, text): + + regex = re.findall(':meth:\S+', text) + + for regs in regex: + + hasdot = '.' in regs + hastilde = '~' in regs + + if regs.count('`') < 2: + continue + + full_name = regs[regs.index('`')+1:regs.rindex('`')] + full_name = full_name.replace('~', '') + + curr_class = dummy = os.path.split(os.path.splitext(input)[0])[1] + + if hasdot: + newstr = full_name.split('.') + curr_class, meth_name = '.'.join(newstr[0:-1]), newstr[-1] + else: + meth_name = full_name + + if meth_name == curr_class: + newtext = ':ref:`%s`'%meth_name + text = text.replace(regs, newtext, 1) + continue + + +## elif meth_name in enum_base: +## newtext = ':ref:`%s`'%meth_name +## text = text.replace(regs, newtext, 1) +## continue + + + if meth_name in CONSTANT_INSTANCES: + text = text.replace(regs, '``%s``'%meth_name, 1) + continue + + if curr_class not in class_summary: + continue + + methods, bases = class_summary[curr_class] + + if meth_name in methods: + continue + + newstr = '' + + for cls in bases: + if cls not in class_summary: + continue + + submethods, subbases = class_summary[cls] + + if meth_name in submethods: + if not hasdot: + newstr = ':meth:`~%s.%s`'%(cls, meth_name) + elif not hastilde: + newstr = ':meth:`%s.%s`'%(cls, meth_name) + elif hasdot: + newstr = ':meth:`~%s.%s`'%(cls, meth_name) + else: + newstr = ':meth:`%s.%s`'%(cls, meth_name) + + break + + if newstr: + text = text.replace(regs, newstr, 1) + + return text + + +# ----------------------------------------------------------------------- # + +def RemoveUnreferenced(input, class_summary, enum_base, unreferenced_classes, text): + + regex = re.findall(':ref:`(.*?)`', text) + + for reg in regex: + if reg in class_summary or reg in enum_base: + continue + + if ' ' in reg or '-' in reg: + # Leave the items with spaces/dash alone, as they are + # Overview pages + continue + + if reg not in unreferenced_classes: + unreferenced_classes[reg] = [] + + split = os.path.split(input)[1] + if split not in unreferenced_classes[reg]: + unreferenced_classes[reg].append(split) + + text = text.replace(':ref:`%s`'%reg, '`%s`'%reg, 1) + + return text, unreferenced_classes + + +# ----------------------------------------------------------------------- # + +def ReformatFunctions(file): + + text_file = os.path.splitext(file)[0] + '.txt' + local_file = os.path.split(file)[1] + + fid = open(file, 'rb') + functions = cPickle.load(fid) + fid.close() + + if local_file.count('.') == 1: + # Core functions + label = 'Core' + else: + label = local_file.split('.')[0:-2][0] + + names = functions.keys() + names.sort() + + text = templates.TEMPLATE_FUNCTION_SUMMARY % (label, label) + + letters = [] + for fun in names: + if fun[0] not in letters: + letters.append(fun[0].upper()) + + text += ' | '.join(['`%s`_'%letter for letter in letters]) + text += '\n\n\n' + + for letter in letters: + text += '%s\n^\n\n'%letter + for fun in names: + if fun[0].upper() != letter: + continue + + text += '* :func:`%s`\n'%fun + + text += '\n\n' + + text += 'Functions\n=============\n\n' + + for fun in names: + text += functions[fun] + '\n' + + fid = open(text_file, 'wt') + fid.write(text) + fid.close() + + +# ----------------------------------------------------------------------- # + +def MakeClassIndex(file): + + text_file = os.path.splitext(file)[0] + '.txt' + local_file = os.path.split(file)[1] + + fid = open(file, 'rb') + classes = cPickle.load(fid) + fid.close() + + if local_file.count('.') == 1: + # Core functions + label = 'Core' + else: + label = local_file.split('.')[0:-2][0] + + names = classes.keys() + names.sort() + + text = templates.TEMPLATE_CLASS_INDEX % (label, label) + + text += 80*'=' + ' ' + 80*'=' + '\n' + text += '%-80s **Short Description**\n'%'**Class**' + text += 80*'=' + ' ' + 80*'=' + '\n' + + for cls in names: + text += '%-80s %s\n'%(':ref:`%s`'%Wx2Sphinx(cls)[1], classes[cls]) + + text += 80*'=' + ' ' + 80*'=' + '\n' + + fid = open(text_file, 'wt') + fid.write(text) + fid.close() + + +# ----------------------------------------------------------------------- # + +def GenGallery(): + + link = '<div class="gallery_class">' + + link_template = """\ + <table><caption align="bottom"><a href="%s"<b>%s</b></a</caption> + <tr> + <td><a href="%s"><img src="_static/%s/%s" border="20" alt="%s"/></a> + </td> + </tr> + </table> + """ + + image_folder = WIDGETS_IMAGES_ROOT + platforms = ['wxmsw', 'wxgtk', 'wxmac'] + + image_files = {} + + pwd = os.getcwd() + + for folder in platforms: + plat_folder = os.path.join(image_folder, folder) + os.chdir(plat_folder) + + image_files[folder] = glob.glob('*.png') + + os.chdir(pwd) + + txt_files = glob.glob(SPHINXROOT + '/*.txt') + html_files = {} + + for text in txt_files: + simple = os.path.split(os.path.splitext(text)[0])[1] + possible = simple.split('.')[-1] + possible = possible.lower() + html_files[possible + '.png'] = simple + '.html' + + keys = html_files.keys() + keys.sort() + + text = '' + + for key in keys: + possible_png = key + html = html_files[possible_png] + + rand_list = range(3) + random.shuffle(rand_list) + + for plat_index in rand_list: + platform = platforms[plat_index] + plat_images = image_files[platform] + + if possible_png in plat_images: + text += link_template%(html, os.path.splitext(html)[0], html, platform, possible_png, os.path.splitext(html)[0]) + text += '\n' + break + + gallery = os.path.join(SPHINXROOT, '_templates', 'gallery.html') + fid = open(gallery, 'wt') + fid.write(templates.TEMPLATE_GALLERY % text) + fid.close() + + +# ----------------------------------------------------------------------- # + +def AddPrettyTable(text): + """ Unused at the moment. """ + + newtext = """<br> +<table border="1" class="docutils"> """ + newtext2 = """<br> +<table border="1" class="last docutils"> """ + + text = text.replace('<table border="1" class="docutils">', newtext) + text = text.replace('<table border="1" class="last docutils">', newtext2) + + othertext = """class="pretty-table">""" + + text = text.replace('class="docutils">', othertext) + text = text.replace('class="last docutils">', othertext) + + return text + + +# ----------------------------------------------------------------------- # + +def ClassToFile(line): + + if '–' not in line: + return line + + if 'href' in line and '<li>' in line and '(' in line and ')' in line: + indx1 = line.index('href=') + if 'title=' in line: + indx2 = line.rindex('title=') + paramdesc = line[indx1+6:indx2-2] + + if '.html#' in paramdesc: + newparamdesc = paramdesc[:] + lower = paramdesc.index('#') + 1 + + letter = paramdesc[lower] + if letter.isupper(): + newparamdesc = newparamdesc[0:lower] + letter.lower() + newparamdesc[lower+1:] + newparamdesc = newparamdesc.replace(letter, letter.lower(), 1) + line = line.replace(paramdesc, newparamdesc) + + return line + + +# ----------------------------------------------------------------------- # + +def PostProcess(folder): + + fileNames = glob.glob(folder + "/html/*.html") + + phoenix_image = '<div class="floatcenter" style="background-color: white; text-align: middle; align: middle; padding: 40px 10px 15px 15px">\n' \ + '<img src="_static/phoenix_top.png" alt="Phoenix Logo" align="middle" />\n' \ + '</div>' + + + enum_files = glob.glob(folder + '/html/*.enumeration.html') + + enum_base = [os.path.split(os.path.splitext(enum)[0])[1] for enum in enum_files] + enum_base = [enum.replace('.enumeration', '') for enum in enum_base] + + enum_dict = {} + # ENUMS + + for indx, enum in enumerate(enum_base): + html_file = os.path.split(enum_files[indx])[1] + base = enum.split('.')[-1] + new = '(<a class="reference internal" href="%s" title="%s"><em>%s</em></a>)'%(html_file, base, base) + enum_dict['(<em>%s</em>)'%enum] = new + + for files in fileNames: + + if "genindex" in files or "modindex" in files: + continue + + methods_done = properties_done = False + + fid = open(files, "rt") + text = fid.read() + fid.close() + + text = text.replace('|SVN|', SVN_REVISION) + text = text.replace('|TODAY|', TODAY) + + split = os.path.split(files)[1] + + if split not in ['index.html', 'main.html']: + text = text.replace(phoenix_image, '') + +## text = AddPrettyTable(text) + text = text.replace('– <p>', '– ') + text = text.replace('<p><img alt="overload"', '<br><p><img alt="overload"') + text = text.replace('<strong>Overloaded Implementations</strong>', '<em><strong>Overloaded Implementations</strong></em>') + text = text.replace('<strong>~~~</strong></p>', '<hr style="color:#0000FF;background-color:#0000FF;height:1px;border:none;width:50%;float:left" /></p><br>') + + for item in HTML_REPLACE: + text = text.replace('<dl class="%s">'%item, '<br><hr />\n<dl class="%s">'%item) + + newtext = '' + splitted_text = text.splitlines() + len_split = len(splitted_text) + + for index, line in enumerate(splitted_text): + if '<div class="admonition-availability admonition' in line: + line = '<div class="admonition-availability admonition availability">' + + line = ClassToFile(line) + + if index < len_split - 1: + + if line.strip() == '<br><hr />': + + next_line = splitted_text[index+1] + stripline = next_line.strip() + + if (stripline == '<dl class="staticmethod">' or stripline == '<dl class="method">') and not methods_done: + line = '<br><h3>Methods<a class="headerlink" href="#methods" title="Permalink to this headline">¶</a></h3>' + '\n' + line + methods_done = True + + elif stripline == '<dl class="attribute">' and not properties_done: + line = '<br><h3>Properties<a class="headerlink" href="#properties" title="Permalink to this headline">¶</a></h3>' + '\n' + line + properties_done = True + + newtext += line + '\n' + + for old, new in enum_dict.items(): + newtext = newtext.replace(old, new) + + fid = open(files, "wt") + fid.write(newtext) + fid.close() + + +# ----------------------------------------------------------------------- # + diff --git a/sphinxtools/templates.py b/sphinxtools/templates.py new file mode 100644 index 00000000..30aabc1f --- /dev/null +++ b/sphinxtools/templates.py @@ -0,0 +1,243 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +#--------------------------------------------------------------------------- +# Name: sphinxtools/templates.py +# Author: Andrea Gavana +# +# Created: 30-Nov-2010 +# Copyright: (c) 2011 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + + +# Main class description, with class name repeated twice +TEMPLATE_DESCRIPTION = ''' + +.. _%s: + +===================================================================================== +|phoenix_title| **%s** +===================================================================================== + +''' + + +# Inheritance diagram template, containing the class name, the PNG file representing +# the inheritance diagram, the "ALT" HTML flag (the class name again) and the full +# "MAP" HTML flag used for mouse navigation in the inheritance diagram boxes +TEMPLATE_INHERITANCE = ''' + +| + +|class_hierarchy| Inheritance Diagram +===================================== + +Inheritance diagram for: **%s** + +.. raw:: html + + <p class="graphviz"> + <img src="_static/images/inheritance/%s" alt="Inheritance diagram of %s" usemap="#dummy" class="inheritance"/> + %s + </p> + +| + +''' + + +# Template for the widget screenshots, with one screenshots image file for +# each platform +TEMPLATE_APPEARANCE = ''' +|appearance| Control Appearance +=============================== + +| + +.. figure:: _static/images/widgets/fullsize/wxmsw/%s + :alt: wxMSW + :figclass: floatleft + + **wxMSW** + + +.. figure:: _static/images/widgets/fullsize/wxmac/%s + :alt: wxMAC + :figclass: floatright + + **wxMAC** + + +.. figure:: _static/images/widgets/fullsize/wxgtk/%s + :alt: wxGTK + :figclass: floatcenter + + **wxGTK** + + +| + +''' + + +# Template for the subclasses of a class, with a string containing a list +# of comma separated class names with their ReST role as :ref: prepended +TEMPLATE_SUBCLASSES = ''' +|sub_classes| Known Subclasses +============================== + +%s + +| + +''' + + +# Template for the method summary of a class, containing a table made of +# ``method_name`` ``method description`` +TEMPLATE_METHOD_SUMMARY = ''' +|method_summary| Methods Summary +================================ + +%s + +| + +''' + + +# Template for the property summary of a class, containing a table made of +# ``property_name`` ``property description`` +TEMPLATE_PROPERTY_SUMMARY = ''' +|property_summary| Properties Summary +===================================== + +%s + +| + +''' + + +# Template for the Class API title, no input +TEMPLATE_API = ''' +|api| Class API +=============== + +''' + +# Template for the standalone function summary for a module (wx, wx.dataview +# and so on). + +TEMPLATE_FUNCTION_SUMMARY = ''' +.. include:: headings.inc + +========================================================================= +**%s** Functions +========================================================================= + +The functions and macros defined in the **%s** module are described here: you can look up a function using the alphabetical listing of them. + +Function Summary +================ + + +''' + + +# Template for the main class index for a module (wx, wx.dataview and so on). +TEMPLATE_CLASS_INDEX = ''' +.. include:: headings.inc + +========================================================================= +**%s** Classes +========================================================================= + +This is an alphabetical listing of all the classes defined in the **%s** module, together with a brief description of them (if available). + +You can look up a class using the alphabetical listing of them. + + +Class Summary +============= + + +''' + + +# Template for the class window styles, with the class name as input +TEMPLATE_WINDOW_STYLES = ''' + +.. _%s-styles: + +|styles| Window Styles +================================ + +''' + + +# Template for the class window extra styles, with the class name as input +TEMPLATE_WINDOW_EXTRASTYLES = ''' + +.. _%s-extra-styles: + +|extra_styles| Window Extra Styles +================================== + +''' + + +# Template for the class events, with the class name as input +TEMPLATE_EVENTS = ''' + +.. _%s-events: + +|events| Events Emitted by this Class +===================================== + +''' + + +# Template used to generate the widgets gallery (this needs some work) +TEMPLATE_GALLERY = ''' + +{%% extends "layout.html" %%} +{%% set title = "Thumbnail gallery" %%} + + +{%% block body %%} + +<h3>Click on any image to go to the relevant documentation</h3> +<br/> +The gallery is generated by randomly choosing a widget image between the 3 main +available ports of wxPython, namely <tt>wxMSW</tt>, <tt>wxGTK</tt> and <tt>wxMAC</tt> every +time the <b>Phoenix</b> documentation is built. + +<br/> +<br/> +<br/> +<br/> +<br/> + +<div class="gallery_class"> + +%s + +</div> +<br clear="all"> + +{%% endblock %%} +''' + + +# Template to generate the "headings.inc" file containing the substitution reference +# for the small icons used in the Sphinx titles, sub-titles and so on. +TEMPLATE_HEADINGS = ''' + +.. |%s| image:: %s + :align: middle + :width: %dpx + +''' + diff --git a/sphinxtools/utilities.py b/sphinxtools/utilities.py new file mode 100644 index 00000000..7649ed20 --- /dev/null +++ b/sphinxtools/utilities.py @@ -0,0 +1,589 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +#--------------------------------------------------------------------------- +# Name: sphinxtools/utilities.py +# Author: Andrea Gavana +# +# Created: 30-Nov-2010 +# Copyright: (c) 2011 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +# Standard library imports +import os +import codecs +import shutil +import cPickle + +from UserDict import UserDict + +# Phoenix-specific imports +from constants import IGNORE, PUNCTUATION +from constants import CPP_ITEMS, VERSION, VALUE_MAP +from constants import RE_KEEP_SPACES +from constants import DOXYROOT, SPHINXROOT, WIDGETS_IMAGES_ROOT + + +# ----------------------------------------------------------------------- # +class odict(UserDict): + """ + An ordered dict (odict). This is a dict which maintains an order to its items; + the order is rather like that of a list, in that new items are, by default, + added to the end, but items can be rearranged. + + .. note:: Note that updating an item (setting a value where the key is already + in the dict) is not considered to create a new item, and does not affect the + position of that key in the order. However, if an item is deleted, then a + new item with the same key is added, this is considered a new item. + + """ + + def __init__(self, dict = None): + self._keys = [] + UserDict.__init__(self, dict) + + def __delitem__(self, key): + UserDict.__delitem__(self, key) + self._keys.remove(key) + + def __setitem__(self, key, item): + UserDict.__setitem__(self, key, item) + if key not in self._keys: self._keys.append(key) + + def clear(self): + UserDict.clear(self) + self._keys = [] + + def copy(self): + dict = UserDict.copy(self) + dict._keys = self._keys[:] + return dict + + def items(self): + return zip(self._keys, self.values()) + + def keys(self): + return self._keys + + def popitem(self): + try: + key = self._keys[-1] + except IndexError: + raise KeyError('dictionary is empty') + + val = self[key] + del self[key] + + return (key, val) + + def setdefault(self, key, failobj = None): + UserDict.setdefault(self, key, failobj) + if key not in self._keys: self._keys.append(key) + + def update(self, dict): + UserDict.update(self, dict) + for key in dict.keys(): + if key not in self._keys: self._keys.append(key) + + def values(self): + return map(self.get, self._keys) + + +# ----------------------------------------------------------------------- # + +def RemoveWxPrefix(name): + """ + Removes the `wx` prefix from a string. + + :param string `name`: a string, possibly starting with "wx" or "``wx". + + :rtype: `string` + + .. note:: This function is similar to the one already present in `tweaker_tools` + but I had to extend it a bit to suite the ReSTification of the XML docs. + + """ + + if name.startswith('wx') and not name.startswith('wxEVT_') and not name.startswith('wx.'): + name = name[2:] + + if name.startswith('``wx') and not name.startswith('``wxEVT_') and not name.startswith('``wx.'): + name = name[0:2] + name[4:] + + return name + + +# ----------------------------------------------------------------------- # + +def IsNumeric(input_string): + """ + Checks if the string `input_string` actually represents a number. + + :param string `input_string`: any string. + + :rtype: `bool` + + :returns: ``True`` if the `input_string` can be converted to a number (any number), + ``False`` otherwise. + """ + + try: + float(input_string) + return True + except ValueError: + return False + + +# ----------------------------------------------------------------------- # + +def CountSpaces(text): + """ + Counts the number of spaces before and after a string. + + :param string `text`: any string. + + :rtype: `tuple` + + :returns: a tuple representing the number of spaces before and after the text. + """ + + space_before = ' '*(len(text) - len(text.lstrip(' '))) + space_after = ' '*(len(text) - len(text.rstrip(' '))) + + return space_before, space_after + + +# ----------------------------------------------------------------------- # + +def Underscore2Capitals(string): + """ + Replaces the underscore letter in a string with the following letter capitalized. + + :param string `string`: the string to be analyzed. + + :rtype: `string` + """ + + items = string.split('_')[1:] + newstr = '' + + for item in items: + newstr += item.capitalize() + + return newstr + + +# ----------------------------------------------------------------------- # + +def ReplaceCppItems(line): + """ + Replaces various C++ specific stuff with more Pythonized version of them. + + :param string `line`: any string. + + :rtype: `string` + """ + + newstr = [] + + for item in RE_KEEP_SPACES.split(line): + + if item in CPP_ITEMS: + continue + + if 'wxString' in item: + item = 'string' + elif item == 'char': + item = 'int' + elif item == 'double': + item = 'float' + + if len(item.replace('``', '')) > 2: + # Avoid replacing standalone '&&' and similar + for cpp in CPP_ITEMS[0:2]: + item = item.replace(cpp, '') + + newstr.append(item) + + newstr = ''.join(newstr) + newstr = newstr.replace(' *)', ' )') + return newstr + + +# ----------------------------------------------------------------------- # + +def PythonizeType(ptype): + """ + Replaces various C++ specific stuff with more Pythonized version of them, + for parameter lists and return types (i.e., the `:param:` and `:rtype:` + ReST roles). + + :param string `ptype`: any string. + + :rtype: `string` + """ + + ptype = Wx2Sphinx(ReplaceCppItems(ptype))[1] + ptype = ptype.replace('::', '.').replace('*&', '') + ptype = ptype.replace('int const', 'int') + ptype = ptype.replace('Uint32', 'int').replace('**', '').replace('Int32', 'int') + ptype = ptype.replace('FILE', 'file') + + for item in ['unsignedchar', 'unsignedint', 'unsignedlong', 'unsigned']: + ptype = ptype.replace(item, 'int') + + ptype = ptype.strip() + ptype = RemoveWxPrefix(ptype) + + if ptype.lower() == 'double': + ptype = 'float' + + if ptype.lower() in ['string', 'char']: + ptype = 'string' + + if 'Image.' in ptype: + ptype = ptype.split('.')[-1] + + return ptype + + +# ----------------------------------------------------------------------- # + +def ConvertToPython(text): + """ + Converts the input `text` into a more ReSTified version of it. + + This involves the following steps: + + 1. Any C++ specific declaration (like ``unsigned``, ``size_t`` and so on + is removed. + 2. Lines starting with "Include file" or "#include" are ignored. + 3. Uppercase constants (i.e., like ID_ANY, HORIZONTAL and so on) are converted + into inline literals (i.e., ``ID_ANY``, ``HORIZONTAL``). + 4. The "wx" prefix is removed from all the words in the input `text`. + + :param string `text`: any string. + + :rtype: `string` + """ + + newlines = [] + unwanted = ['Include file', '#include'] + + for line in text.splitlines(): + + newline = [] + + for remove in unwanted: + if remove in line: + line = line[0:line.index(remove)] + break + + spacer = ' '*(len(line) - len(line.lstrip())) + + line = ReplaceCppItems(line) + + for word in RE_KEEP_SPACES.split(line): + + if word == VERSION: + newline.append(word) + continue + + newword = word + for s in PUNCTUATION: + newword = newword.replace(s, "") + + if newword in VALUE_MAP: + word = word.replace(newword, VALUE_MAP[newword]) + newline.append(word) + continue + + if newword not in IGNORE and not newword.startswith('wx.'): + word = RemoveWxPrefix(word) + newword = RemoveWxPrefix(newword) + + if "::" in word and not word.endswith("::"): + word = word.replace("::", ".") + word = "`%s`"%word + newline.append(word) + continue + + if newword.upper() == newword and newword not in PUNCTUATION and \ + newword not in IGNORE and len(newword.strip()) > 1 and \ + not IsNumeric(newword) and newword not in ['DC', 'GCDC']: + + if '``' not in newword and '()' not in word and '**' not in word: + word = word.replace(newword, "``%s``"%newword) + + newline.append(word) + + newline = spacer + ''.join(newline) + newline = newline.replace(':see:', '.. seealso::') + newline = newline.replace(':note:', '.. note::') + newlines.append(newline) + + formatted = "\n".join(newlines) + formatted = formatted.replace('\\', '\\\\') + return formatted + + +# ----------------------------------------------------------------------- # + +def FindDescendants(element, tag, descendants=None): + """ + Finds and returns all descendants of a specific `xml.etree.ElementTree.Element` + whose tag matches the input `tag`. + + :param xml.etree.ElementTree.Element `element`: the XML element we want to examine. + :param string `tag`: the target tag we are looking for. + :param list `descendants`: a list of already-found descendants or ``None`` if this + is the first call to the function. + + :rtype: `list` + + .. note:: This is a recursive function, and it is only used in the `etgtools.extractors.py` + script. + + """ + + if descendants is None: + descendants = [] + + for childElement in element: + if childElement.tag == tag: + descendants.append(childElement) + + descendants = FindDescendants(childElement, tag, descendants) + + return descendants + + +# ----------------------------------------------------------------------- # + +def FindControlImages(element): + """ + Given the input `element` (an instance of `xml.etree.ElementTree.Element`) + representing a Phoenix class description, this function will scan the + doxygen image folder ``DOXYROOT`` to look for a widget screenshot. + + If this class indeed represents a widget and a screenshot is found, it is + then copied to the appropriate Sphinx input folder ``WIDGETS_IMAGES_ROOT`` + in one of its sub-folders (``wxmsw``, ``wxgtk``, ``wxmac``) depending on + which platform the screenshot was taken. + + :param xml.etree.ElementTree.Element `element`: the XML element we want to examine. + + :rtype: `list` + + :returns: A list of image paths, every element of it representing a screenshot on + a different platform. An empty list if returned if no screenshots have been found. + + .. note:: If a screenshot doesn't exist for one (or more) platform but it + exists for others, the missing images will be replaced by the "no_appearance.png" + file (you can find it inside the ``WIDGETS_IMAGES_ROOT`` folder. + + """ + + class_name = RemoveWxPrefix(element.name) or element.pyName + py_class_name = Wx2Sphinx(class_name)[1] + + class_name = class_name.lower() + py_class_name = py_class_name.lower() + + image_folder = os.path.join(DOXYROOT, 'images') + + appearance = odict() + + for sub_folder in ['wxmsw', 'wxmac', 'wxgtk']: + + png_file = class_name + '.png' + appearance[sub_folder] = '' + + possible_image = os.path.join(image_folder, sub_folder, png_file) + new_path = os.path.join(WIDGETS_IMAGES_ROOT, sub_folder) + + py_png_file = py_class_name + '.png' + new_file = os.path.join(new_path, py_png_file) + + if os.path.isfile(new_file): + + appearance[sub_folder] = py_png_file + + elif os.path.isfile(possible_image): + + if not os.path.isdir(new_path): + os.makedirs(new_path) + + if not os.path.isfile(new_file): + shutil.copyfile(possible_image, new_file) + + appearance[sub_folder] = py_png_file + + if not any(appearance.values()): + return [] + + for sub_folder, image in appearance.items(): + if not image: + appearance[sub_folder] = '../no_appearance.png' + + return appearance.values() + + +# ----------------------------------------------------------------------- # + +def MakeSummary(name, item_list, template, kind): + """ + This function generates a table containing a method/property name + and a shortened version of its docstrings. + + :param string `name`: the method/property class name. + :param list `item_list`: a list of tuples like `(method/property name, short docstrings)`. + :param string `template`: the template to use (from `sphinxtools/templates.py`, can + be the ``TEMPLATE_METHOD_SUMMARY`` or the ``TEMPLATE_PROPERTY_SUMMARY``. + :param string `kind`: can be ":meth:" or ":attr:". + + :rtype: `string` + """ + + summary = '='*80 + ' ' + '='*80 + "\n" + + for method, simple_docs in item_list: + summary += '%-80s %s'%(':%s:`~%s.%s`'%(kind, name, method), simple_docs) + '\n' + + summary += '='*80 + ' ' + '='*80 + "\n" + + return template % summary + + +# ----------------------------------------------------------------------- # + +def WriteSphinxOutput(stream, filename): + """ + Writes the text contained in the `stream` to the `filename` output file. + + :param StringIO.StringIO `stream`: the stream where the text lives. + :param string `filename`: the output file we want to write the text in. + """ + + text_file = os.path.join(SPHINXROOT, filename) + text = stream.getvalue() + + if not os.path.isfile(text_file): + text = '.. include:: headings.inc\n\n' + text + + fid = codecs.open(text_file, "a", encoding='utf-8') + fid.write(text) + fid.close() + + +# ----------------------------------------------------------------------- # + +def ChopDescription(text): + """ + Given the (possibly multiline) input text, this function will get the + first non-blank line up to the next newline character. + + :param string `text`: any string. + + :rtype: `string` + """ + + description = '' + + for line in text.splitlines(): + line = line.strip() + + if not line or line.startswith('..') or line.startswith('|'): + continue + + description = line + break + + return description + + +# ----------------------------------------------------------------------- # + +def PickleItem(description, current_module, name, kind): + """ + This function pickles/unpickles a dictionary containing class names as keys + and class brief description (chopped docstrings) as values to build the + main class index for Sphinx **or** the Phoenix standalone function names + as keys and their full description as values to build the function page. + + This step is necessary as the function names/description do not come out + in alphabetical order from the ``etg`` process. + + :param string `description`: the function/class description. + :param string `current_module`: the harmonized module name for this class + or function (see ``MODULENAME_REPLACE`` in `sphinxtools/constants.py`). + :param string `name`: the function/class name. + :param string `kind`: can be `function` or `class`. + """ + + if kind == 'function': + pickle_file = os.path.join(SPHINXROOT, current_module + 'functions.pkl') + else: + pickle_file = os.path.join(SPHINXROOT, current_module + '1classindex.pkl') + + if os.path.isfile(pickle_file): + fid = open(pickle_file, 'rb') + items = cPickle.load(fid) + fid.close() + else: + items = {} + + items[name] = description + fid = open(pickle_file, 'wb') + cPickle.dump(items, fid) + fid.close() + + +# ----------------------------------------------------------------------- # + +def PickleClassInfo(class_name, element): + + pickle_file = os.path.join(SPHINXROOT, 'class_summary.lst') + + if os.path.isfile(pickle_file): + fid = open(pickle_file, 'rb') + items = cPickle.load(fid) + fid.close() + else: + items = {} + + method_list, bases = [], [] + for method, description in element.method_list: + method_list.append(method) + + for base in element.bases: + bases.append(Wx2Sphinx(base)[1]) + + items[class_name] = (method_list, bases) + fid = open(pickle_file, 'wb') + cPickle.dump(items, fid) + fid.close() + + +# ----------------------------------------------------------------------- # + +def Wx2Sphinx(name): + """ + Converts a wxWidgets specific string into a Phoenix-ReST-ready string. + + :param string `name`: any string. + """ + + if '<' in name: + name = name[0:name.index('<')].strip() + + newname = fullname = RemoveWxPrefix(name) + + if 'DataView' in name: + fullname = 'dataview.' + fullname + + return newname, fullname + + +# ----------------------------------------------------------------------- # diff --git a/src/app_ex.py b/src/app_ex.py new file mode 100644 index 00000000..ec8d0f89 --- /dev/null +++ b/src/app_ex.py @@ -0,0 +1,263 @@ + +class PyOnDemandOutputWindow: + """ + A class that can be used for redirecting Python's stdout and + stderr streams. It will do nothing until something is wrriten to + the stream at which point it will create a Frame with a text area + and write the text there. + """ + def __init__(self, title="wxPython: stdout/stderr"): + self.frame = None + self.title = title + self.pos = wx.DefaultPosition + self.size = (450, 300) + self.parent = None + + def SetParent(self, parent): + """Set the window to be used as the popup Frame's parent.""" + self.parent = parent + + + def CreateOutputWindow(self, st): + self.frame = wx.Frame(self.parent, -1, self.title, self.pos, self.size, + style=wx.DEFAULT_FRAME_STYLE) + self.text = wx.TextCtrl(self.frame, -1, "", + style=wx.TE_MULTILINE|wx.TE_READONLY) + self.text.AppendText(st) + self.frame.Show(True) + self.frame.Bind(wx.EVT_CLOSE, self.OnCloseWindow) + + + def OnCloseWindow(self, event): + if self.frame is not None: + self.frame.Destroy() + self.frame = None + self.text = None + self.parent = None + + + # These methods provide the file-like output behaviour. + def write(self, text): + """ + Create the output window if needed and write the string to it. + If not called in the context of the gui thread then uses + CallAfter to do the work there. + """ + if self.frame is None: + if not wx.Thread.IsMain(): + wx.CallAfter(self.CreateOutputWindow, text) + else: + self.CreateOutputWindow(text) + else: + if not wx.Thread.IsMain(): + wx.CallAfter(self.text.AppendText, text) + else: + self.text.AppendText(text) + + + def close(self): + if self.frame is not None: + wx.CallAfter(self.frame.Close) + + + def flush(self): + pass + + + +#---------------------------------------------------------------------- + +class App(wx.PyApp): + """ + The ``wx.App`` class represents the application and is used to: + + * bootstrap the wxPython system and initialize the underlying + gui toolkit + * set and get application-wide properties + * implement the native windowing system main message or event loop, + and to dispatch events to window instances + * etc. + + Every wx application must have a single ``wx.App`` instance, and all + creation of UI objects should be delayed until after the ``wx.App`` object + has been created in order to ensure that the gui platform and wxWidgets + have been fully initialized. + + Normally you would derive from this class and implement an ``OnInit`` + method that creates a frame and then calls ``self.SetTopWindow(frame)``, + however ``wx.App`` is also usable on it's own without derivation. + """ + + outputWindowClass = PyOnDemandOutputWindow + + def __init__(self, + redirect=False, + filename=None, + useBestVisual=False, + clearSigInt=True): + """ + Construct a ``wx.App`` object. + + :param redirect: Should ``sys.stdout`` and ``sys.stderr`` be + redirected? Defaults to False. If ``filename`` is None + then output will be redirected to a window that pops up + as needed. (You can control what kind of window is created + for the output by resetting the class variable + ``outputWindowClass`` to a class of your choosing.) + + :param filename: The name of a file to redirect output to, if + redirect is True. + + :param useBestVisual: Should the app try to use the best + available visual provided by the system (only relevant on + systems that have more than one visual.) This parameter + must be used instead of calling `SetUseBestVisual` later + on because it must be set before the underlying GUI + toolkit is initialized. + + :param clearSigInt: Should SIGINT be cleared? This allows the + app to terminate upon a Ctrl-C in the console like other + GUI apps will. + + :note: You should override OnInit to do applicaition + initialization to ensure that the system, toolkit and + wxWidgets are fully initialized. + """ + + wx.PyApp.__init__(self) + + # make sure we can create a GUI + if not self.IsDisplayAvailable(): + + if wx.Port == "__WXMAC__": + msg = """This program needs access to the screen. +Please run with a Framework build of python, and only when you are +logged in on the main display of your Mac.""" + + elif wx.Port == "__WXGTK__": + msg ="Unable to access the X Display, is $DISPLAY set properly?" + + else: + msg = "Unable to create GUI" + # TODO: more description is needed for wxMSW... + + raise SystemExit(msg) + + # This has to be done before OnInit + self.SetUseBestVisual(useBestVisual) + + # Set the default handler for SIGINT. This fixes a problem + # where if Ctrl-C is pressed in the console that started this + # app then it will not appear to do anything, (not even send + # KeyboardInterrupt???) but will later segfault on exit. By + # setting the default handler then the app will exit, as + # expected (depending on platform.) + if clearSigInt: + try: + import signal + signal.signal(signal.SIGINT, signal.SIG_DFL) + except: + pass + + # Save and redirect the stdio to a window? + self.stdioWin = None + self.saveStdio = (_sys.stdout, _sys.stderr) + if redirect: + self.RedirectStdio(filename) + + # Use Python's install prefix as the default + wx.StandardPaths.Get().SetInstallPrefix(_sys.prefix) + +## # Until the new native control for wxMac is up to par, still use the generic one. +## wx.SystemOptions.SetOptionInt("mac.listctrl.always_use_generic", 1) + + # This finishes the initialization of wxWindows and then calls + # the OnInit that should be present in the derived class + self._BootstrapApp() + + + def OnPreInit(self): + """ + Things that must be done after _BootstrapApp has done its thing, but + would be nice if they were already done by the time that OnInit is + called. + """ + wx.StockGDI._initStockObjects() + + + def __del__(self): + self.RestoreStdio() # Just in case the MainLoop was overridden without calling RestoreStio + + + def Destroy(self): +## self.this.own(False) + wx.PyApp.Destroy(self) + + def SetTopWindow(self, frame): + """Set the \"main\" top level window""" + if self.stdioWin: + self.stdioWin.SetParent(frame) + wx.PyApp.SetTopWindow(self, frame) + + + def MainLoop(self): + """Execute the main GUI event loop""" + rv = wx.PyApp.MainLoop(self) + self.RestoreStdio() + return rv + + + def RedirectStdio(self, filename=None): + """Redirect sys.stdout and sys.stderr to a file or a popup window.""" + if filename: + _sys.stdout = _sys.stderr = open(filename, 'a') + else: + self.stdioWin = self.outputWindowClass() + _sys.stdout = _sys.stderr = self.stdioWin + + + def RestoreStdio(self): + try: + _sys.stdout, _sys.stderr = self.saveStdio + except: + pass + + + def SetOutputWindowAttributes(self, title=None, pos=None, size=None): + """ + Set the title, position and/or size of the output window if the stdio + has been redirected. This should be called before any output would + cause the output window to be created. + """ + if self.stdioWin: + if title is not None: + self.stdioWin.title = title + if pos is not None: + self.stdioWin.pos = pos + if size is not None: + self.stdioWin.size = size + +#---------------------------------------------------------------------------- + +@wx.deprecated +class PySimpleApp(App): + """ + This class is deprecated. Please use wx.App instead. + """ + def __init__(self, *args, **kw): + App.__init__(self, *args, **kw) + + +## #---------------------------------------------------------------------------- +## # DO NOT hold any other references to this object. This is how we +## # know when to cleanup system resources that wxWidgets is holding. When +## # the sys module is unloaded, the refcount on sys.__wxPythonCleanup +## # goes to zero and it calls the wx.App_CleanUp function. + +## #class __wxPyCleanup: +## #def __init__(self): +## #self.cleanup = _core_.App_CleanUp +## #def __del__(self): +## #self.cleanup() + +## #_sys.__wxPythonCleanup = __wxPyCleanup()

    Get the latest wxPython library from the wxPython website +, or view the latest modifications using Viewvc. + +