wxPython-zombie 3.1.5.8__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wx/__init__.py +22 -0
- wx/__version__.py +9 -0
- wx/_adv.cp313-win_amd64.pyd +0 -0
- wx/_aui.cp313-win_amd64.pyd +0 -0
- wx/_core.cp313-win_amd64.pyd +0 -0
- wx/_dataview.cp313-win_amd64.pyd +0 -0
- wx/_glcanvas.cp313-win_amd64.pyd +0 -0
- wx/_grid.cp313-win_amd64.pyd +0 -0
- wx/_html.cp313-win_amd64.pyd +0 -0
- wx/_html2.cp313-win_amd64.pyd +0 -0
- wx/_media.cp313-win_amd64.pyd +0 -0
- wx/_msw.cp313-win_amd64.pyd +0 -0
- wx/_propgrid.cp313-win_amd64.pyd +0 -0
- wx/_ribbon.cp313-win_amd64.pyd +0 -0
- wx/_richtext.cp313-win_amd64.pyd +0 -0
- wx/_stc.cp313-win_amd64.pyd +0 -0
- wx/_xml.cp313-win_amd64.pyd +0 -0
- wx/_xrc.cp313-win_amd64.pyd +0 -0
- wx/adv.py +124 -0
- wx/adv.pyi +5182 -0
- wx/aui.py +77 -0
- wx/aui.pyi +3655 -0
- wx/core.py +3540 -0
- wx/core.pyi +50592 -0
- wx/dataview.py +173 -0
- wx/dataview.pyi +3491 -0
- wx/demo/AUI_DockingWindowMgr.py +1154 -0
- wx/demo/AUI_MDI.py +117 -0
- wx/demo/AUI_Notebook.py +58 -0
- wx/demo/About.py +75 -0
- wx/demo/AboutBox.py +75 -0
- wx/demo/ActiveXWrapper_Acrobat.py +132 -0
- wx/demo/ActiveXWrapper_IE.py +187 -0
- wx/demo/ActiveX_FlashWindow.py +107 -0
- wx/demo/ActiveX_IEHtmlWindow.py +242 -0
- wx/demo/ActiveX_PDFWindow.py +204 -0
- wx/demo/ActivityIndicator.py +80 -0
- wx/demo/AddPrivateFont.py +116 -0
- wx/demo/AdjustChannels.py +178 -0
- wx/demo/AlphaDrawing.py +77 -0
- wx/demo/AnalogClock.py +144 -0
- wx/demo/AnimationCtrl.py +104 -0
- wx/demo/ArtProvider.py +893 -0
- wx/demo/BannerWindow.py +1 -0
- wx/demo/BitmapButton.py +87 -0
- wx/demo/BitmapComboBox.py +63 -0
- wx/demo/BitmapFromBuffer.py +140 -0
- wx/demo/Button.py +77 -0
- wx/demo/Cairo.py +197 -0
- wx/demo/Cairo_Snippets.py +135 -0
- wx/demo/Calendar.py +660 -0
- wx/demo/CalendarCtrl.py +122 -0
- wx/demo/CheckBox.py +74 -0
- wx/demo/CheckListBox.py +79 -0
- wx/demo/CheckListCtrl.py +99 -0
- wx/demo/Choice.py +55 -0
- wx/demo/Choicebook.py +80 -0
- wx/demo/CollapsibleHeaderCtrl.py +85 -0
- wx/demo/CollapsiblePane.py +126 -0
- wx/demo/ColorPanel.py +19 -0
- wx/demo/ColourDB.py +203 -0
- wx/demo/ColourDialog.py +76 -0
- wx/demo/ColourSelect.py +119 -0
- wx/demo/ComboBox.py +111 -0
- wx/demo/ComboCtrl.py +153 -0
- wx/demo/ComboTreeBox.py +71 -0
- wx/demo/CommandLinkButton.py +50 -0
- wx/demo/ContextHelp.py +112 -0
- wx/demo/Cursor.py +336 -0
- wx/demo/CustomDragAndDrop.py +353 -0
- wx/demo/DVC_CustomRenderer.py +204 -0
- wx/demo/DVC_DataViewModel.py +365 -0
- wx/demo/DVC_IndexListModel.py +257 -0
- wx/demo/DVC_ListCtrl.py +69 -0
- wx/demo/DVC_TreeCtrl.py +76 -0
- wx/demo/DatePickerCtrl.py +68 -0
- wx/demo/DelayedResult.py +239 -0
- wx/demo/Dialog.py +169 -0
- wx/demo/DialogUnits.py +128 -0
- wx/demo/DirDialog.py +58 -0
- wx/demo/DragAndDrop.py +265 -0
- wx/demo/DragImage.py +316 -0
- wx/demo/DragScroller.py +59 -0
- wx/demo/DrawXXXList.py +436 -0
- wx/demo/DynamicSashWindow.py +177 -0
- wx/demo/EditableListBox.py +101 -0
- wx/demo/Editor.py +70 -0
- wx/demo/EventManager.py +291 -0
- wx/demo/ExpandoTextCtrl.py +164 -0
- wx/demo/FancyText.py +83 -0
- wx/demo/FileBrowseButton.py +100 -0
- wx/demo/FileCtrl.py +97 -0
- wx/demo/FileDialog.py +144 -0
- wx/demo/FileHistory.py +140 -0
- wx/demo/FindReplaceDialog.py +123 -0
- wx/demo/FloatCanvas.py +1959 -0
- wx/demo/FontDialog.py +142 -0
- wx/demo/FontEnumerator.py +82 -0
- wx/demo/Frame.py +85 -0
- wx/demo/GLCanvas.py +371 -0
- wx/demo/Gauge.py +66 -0
- wx/demo/GenericButtons.py +185 -0
- wx/demo/GenericCheckBox.py +65 -0
- wx/demo/GenericDirCtrl.py +74 -0
- wx/demo/GetMouseState.py +159 -0
- wx/demo/GraphicsContext.py +236 -0
- wx/demo/GraphicsGradient.py +281 -0
- wx/demo/Grid.py +95 -0
- wx/demo/GridBagSizer.py +170 -0
- wx/demo/GridCustEditor.py +247 -0
- wx/demo/GridCustTable.py +170 -0
- wx/demo/GridDragAndDrop.py +102 -0
- wx/demo/GridDragable.py +206 -0
- wx/demo/GridEnterHandler.py +66 -0
- wx/demo/GridHugeTable.py +89 -0
- wx/demo/GridLabelRenderer.py +114 -0
- wx/demo/GridSimple.py +270 -0
- wx/demo/GridStdEdRend.py +186 -0
- wx/demo/Grid_MegaExample.py +490 -0
- wx/demo/HTML2_WebView.py +183 -0
- wx/demo/HtmlWindow.py +232 -0
- wx/demo/I18N.py +237 -0
- wx/demo/Image.py +338 -0
- wx/demo/ImageAlpha.py +87 -0
- wx/demo/ImageBrowser.py +70 -0
- wx/demo/ImageFromStream.py +49 -0
- wx/demo/Img2PyArtProvider.py +99 -0
- wx/demo/InfoBar.py +127 -0
- wx/demo/IntCtrl.py +343 -0
- wx/demo/ItemsPicker.py +108 -0
- wx/demo/Joystick.py +1083 -0
- wx/demo/KeyEvents.py +428 -0
- wx/demo/LEDNumberCtrl.py +121 -0
- wx/demo/LayoutAnchors.py +258 -0
- wx/demo/LayoutConstraints.py +149 -0
- wx/demo/Layoutf.py +69 -0
- wx/demo/ListBox.py +164 -0
- wx/demo/ListCtrl.py +538 -0
- wx/demo/ListCtrl_edit.py +155 -0
- wx/demo/ListCtrl_virtual.py +145 -0
- wx/demo/Listbook.py +104 -0
- wx/demo/MDIDemo.py +86 -0
- wx/demo/MDISashDemo.py +152 -0
- wx/demo/MDIWindows.py +66 -0
- wx/demo/Main.py +2768 -0
- wx/demo/Mask.py +137 -0
- wx/demo/MaskedEditControls.py +648 -0
- wx/demo/MaskedNumCtrl.py +359 -0
- wx/demo/MediaCtrl.py +190 -0
- wx/demo/Menu.py +322 -0
- wx/demo/MessageDialog.py +54 -0
- wx/demo/MimeTypesManager.py +354 -0
- wx/demo/MiniFrame.py +67 -0
- wx/demo/MouseGestures.py +198 -0
- wx/demo/MultiChoiceDialog.py +59 -0
- wx/demo/MultiSash.py +95 -0
- wx/demo/MultiSplitterWindow.py +168 -0
- wx/demo/MultipleChoiceDialog.py +101 -0
- wx/demo/Notebook.py +134 -0
- wx/demo/NotificationMessage.py +61 -0
- wx/demo/OGL.py +433 -0
- wx/demo/Overlay.py +209 -0
- wx/demo/OwnerDrawnComboBox.py +152 -0
- wx/demo/PDFViewer.py +109 -0
- wx/demo/PageSetupDialog.py +70 -0
- wx/demo/PenAndBrushStyles.py +208 -0
- wx/demo/Pickers.py +120 -0
- wx/demo/PlateButton.py +430 -0
- wx/demo/PopupControl.py +99 -0
- wx/demo/PopupMenu.py +156 -0
- wx/demo/PopupWindow.py +227 -0
- wx/demo/PrintDialog.py +60 -0
- wx/demo/PrintFramework.py +227 -0
- wx/demo/Process.py +168 -0
- wx/demo/ProgressDialog.py +87 -0
- wx/demo/PropertyGrid.py +1045 -0
- wx/demo/PropertySheetDialog.py +231 -0
- wx/demo/PseudoDC.py +350 -0
- wx/demo/PyColourChooser.py +60 -0
- wx/demo/PyCrust.py +21 -0
- wx/demo/PyPlot.py +83 -0
- wx/demo/PyShell.py +22 -0
- wx/demo/PythonEvents.py +109 -0
- wx/demo/README.txt +7 -0
- wx/demo/RadioBox.py +67 -0
- wx/demo/RadioButton.py +127 -0
- wx/demo/RawBitmapAccess.py +208 -0
- wx/demo/RearrangeDialog.py +160 -0
- wx/demo/RendererNative.py +170 -0
- wx/demo/ResizeWidget.py +76 -0
- wx/demo/RichMessageDialog.py +85 -0
- wx/demo/RichTextCtrl.py +732 -0
- wx/demo/RichToolTip.py +145 -0
- wx/demo/SVGImage_Bitmap.py +130 -0
- wx/demo/SVGImage_Render.py +138 -0
- wx/demo/SashWindow.py +151 -0
- wx/demo/ScrolledMessageDialog.py +52 -0
- wx/demo/ScrolledPanel.py +124 -0
- wx/demo/ScrolledWindow.py +260 -0
- wx/demo/SearchCtrl.py +115 -0
- wx/demo/ShapedWindow.py +145 -0
- wx/demo/Simplebook.py +202 -0
- wx/demo/SingleChoiceDialog.py +56 -0
- wx/demo/SizedControls.py +433 -0
- wx/demo/Sizers.py +609 -0
- wx/demo/Slider.py +52 -0
- wx/demo/Sound.py +95 -0
- wx/demo/SpinButton.py +63 -0
- wx/demo/SpinCtrl.py +56 -0
- wx/demo/SpinCtrlDouble.py +42 -0
- wx/demo/SplitTree.py +146 -0
- wx/demo/SplitterWindow.py +62 -0
- wx/demo/StandardPaths.py +113 -0
- wx/demo/StaticBitmap.py +55 -0
- wx/demo/StaticBox.py +62 -0
- wx/demo/StaticText.py +69 -0
- wx/demo/StatusBar.py +144 -0
- wx/demo/StockButtons.py +113 -0
- wx/demo/StyledTextCtrl_1.py +303 -0
- wx/demo/StyledTextCtrl_2.py +410 -0
- wx/demo/SystemSettings.py +333 -0
- wx/demo/TablePrint.py +215 -0
- wx/demo/TestTable.txt +38 -0
- wx/demo/TextCtrl.py +187 -0
- wx/demo/TextEntryDialog.py +57 -0
- wx/demo/Threads.py +258 -0
- wx/demo/Throbber.py +250 -0
- wx/demo/Ticker.py +147 -0
- wx/demo/TimeCtrl.py +240 -0
- wx/demo/TimePickerCtrl.py +60 -0
- wx/demo/Timer.py +275 -0
- wx/demo/ToggleButton.py +54 -0
- wx/demo/ToolBar.py +249 -0
- wx/demo/ToolTip.py +71 -0
- wx/demo/Toolbook.py +111 -0
- wx/demo/TreeCtrl.py +199 -0
- wx/demo/TreeListCtrl.py +121 -0
- wx/demo/TreeMixin.py +269 -0
- wx/demo/Treebook.py +117 -0
- wx/demo/UIActionSimulator.py +151 -0
- wx/demo/URLDragAndDrop.py +130 -0
- wx/demo/Unicode.py +146 -0
- wx/demo/VListBox.py +176 -0
- wx/demo/Validator.py +237 -0
- wx/demo/Wizard.py +248 -0
- wx/demo/WrapSizer.py +115 -0
- wx/demo/XmlResource.py +80 -0
- wx/demo/XmlResourceHandler.py +199 -0
- wx/demo/XmlResourceSubclass.py +119 -0
- wx/demo/__init__.py +9 -0
- wx/demo/agw/AGWInfoBar.py +175 -0
- wx/demo/agw/AUI.py +3058 -0
- wx/demo/agw/AdvancedSplash.py +59 -0
- wx/demo/agw/AquaButton.py +146 -0
- wx/demo/agw/BalloonTip.py +378 -0
- wx/demo/agw/ButtonPanel.py +890 -0
- wx/demo/agw/CubeColourDialog.py +83 -0
- wx/demo/agw/CustomTreeCtrl.py +2167 -0
- wx/demo/agw/Example1 +67 -0
- wx/demo/agw/Example2 +49 -0
- wx/demo/agw/FlatMenu.py +876 -0
- wx/demo/agw/FlatNotebook.py +994 -0
- wx/demo/agw/FloatSpin.py +475 -0
- wx/demo/agw/FoldPanelBar.py +953 -0
- wx/demo/agw/FourWaySplitter.py +300 -0
- wx/demo/agw/GenericMessageDialog.py +207 -0
- wx/demo/agw/GradientButton.py +156 -0
- wx/demo/agw/HyperLinkCtrl.py +144 -0
- wx/demo/agw/HyperTreeList.py +2660 -0
- wx/demo/agw/KnobCtrl.py +186 -0
- wx/demo/agw/LabelBook.py +567 -0
- wx/demo/agw/MacLargeDemo.py +360 -0
- wx/demo/agw/MultiDirDialog.py +117 -0
- wx/demo/agw/PeakMeter.py +194 -0
- wx/demo/agw/PersistentControls.py +589 -0
- wx/demo/agw/PieCtrl.py +206 -0
- wx/demo/agw/PyBusyInfo.py +64 -0
- wx/demo/agw/PyCollapsiblePane.py +308 -0
- wx/demo/agw/PyGauge.py +162 -0
- wx/demo/agw/PyProgress.py +155 -0
- wx/demo/agw/RibbonBar.py +925 -0
- wx/demo/agw/RulerCtrl.py +454 -0
- wx/demo/agw/ScrolledThumbnail.py +128 -0
- wx/demo/agw/ShapedButton.py +603 -0
- wx/demo/agw/ShortcutEditor.py +397 -0
- wx/demo/agw/SpeedMeter.py +668 -0
- wx/demo/agw/SuperToolTip.py +396 -0
- wx/demo/agw/ThumbDemoConfig.py +603 -0
- wx/demo/agw/ThumbnailCtrl.py +149 -0
- wx/demo/agw/ToasterBox.py +410 -0
- wx/demo/agw/UltimateListCtrl.py +80 -0
- wx/demo/agw/UltimateListIconDemo.py +908 -0
- wx/demo/agw/UltimateListListDemo.py +124 -0
- wx/demo/agw/UltimateReportDemo.py +1146 -0
- wx/demo/agw/UltimateVirtualDemo.py +207 -0
- wx/demo/agw/Windows7Explorer_Contents.py +368 -0
- wx/demo/agw/XLSGrid.py +238 -0
- wx/demo/agw/ZoomBar.py +230 -0
- wx/demo/agw/__demo__.py +183 -0
- wx/demo/agw/bitmaps/Explorer96.png +0 -0
- wx/demo/agw/bitmaps/Explorer96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Folder96.png +0 -0
- wx/demo/agw/bitmaps/Folder96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Monitor96.png +0 -0
- wx/demo/agw/bitmaps/Monitor96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Music96.png +0 -0
- wx/demo/agw/bitmaps/Music96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Photo96.png +0 -0
- wx/demo/agw/bitmaps/Photo96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Search96.png +0 -0
- wx/demo/agw/bitmaps/Search96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Wizard96.png +0 -0
- wx/demo/agw/bitmaps/Wizard96Flip40.png +0 -0
- wx/demo/agw/bitmaps/advancedsplash.png +0 -0
- wx/demo/agw/bitmaps/aquabutton.png +0 -0
- wx/demo/agw/bitmaps/aquachecked.ico +0 -0
- wx/demo/agw/bitmaps/aquaflagged.ico +0 -0
- wx/demo/agw/bitmaps/aquanotchecked.ico +0 -0
- wx/demo/agw/bitmaps/aquanotflagged.ico +0 -0
- wx/demo/agw/bitmaps/canada.gif +0 -0
- wx/demo/agw/bitmaps/checked.ico +0 -0
- wx/demo/agw/bitmaps/columns.png +0 -0
- wx/demo/agw/bitmaps/contexthelp-16.png +0 -0
- wx/demo/agw/bitmaps/contexthelp.png +0 -0
- wx/demo/agw/bitmaps/copy.png +0 -0
- wx/demo/agw/bitmaps/cut.png +0 -0
- wx/demo/agw/bitmaps/editcopy.png +0 -0
- wx/demo/agw/bitmaps/editcut.png +0 -0
- wx/demo/agw/bitmaps/editpaste.png +0 -0
- wx/demo/agw/bitmaps/empty_icon.png +0 -0
- wx/demo/agw/bitmaps/exit-16.png +0 -0
- wx/demo/agw/bitmaps/exit.ico +0 -0
- wx/demo/agw/bitmaps/ffwd.png +0 -0
- wx/demo/agw/bitmaps/ffwddisabled.png +0 -0
- wx/demo/agw/bitmaps/field-16.png +0 -0
- wx/demo/agw/bitmaps/filenew.png +0 -0
- wx/demo/agw/bitmaps/fileopen.png +0 -0
- wx/demo/agw/bitmaps/filesave.png +0 -0
- wx/demo/agw/bitmaps/flagged.ico +0 -0
- wx/demo/agw/bitmaps/folder.png +0 -0
- wx/demo/agw/bitmaps/folder_new.png +0 -0
- wx/demo/agw/bitmaps/ghost.png +0 -0
- wx/demo/agw/bitmaps/gradientbutton.png +0 -0
- wx/demo/agw/bitmaps/help-16.png +0 -0
- wx/demo/agw/bitmaps/help.ico +0 -0
- wx/demo/agw/bitmaps/italy.gif +0 -0
- wx/demo/agw/bitmaps/lbadd.png +0 -0
- wx/demo/agw/bitmaps/lbcharge.png +0 -0
- wx/demo/agw/bitmaps/lbdecrypted.png +0 -0
- wx/demo/agw/bitmaps/lbnews.png +0 -0
- wx/demo/agw/bitmaps/lbroll.png +0 -0
- wx/demo/agw/bitmaps/minus1.ico +0 -0
- wx/demo/agw/bitmaps/minus2.ico +0 -0
- wx/demo/agw/bitmaps/minus3.ico +0 -0
- wx/demo/agw/bitmaps/minus4.ico +0 -0
- wx/demo/agw/bitmaps/minus5.ico +0 -0
- wx/demo/agw/bitmaps/month-16.png +0 -0
- wx/demo/agw/bitmaps/new_file.png +0 -0
- wx/demo/agw/bitmaps/new_folder.png +0 -0
- wx/demo/agw/bitmaps/notchecked.ico +0 -0
- wx/demo/agw/bitmaps/notflagged.ico +0 -0
- wx/demo/agw/bitmaps/ok-16.png +0 -0
- wx/demo/agw/bitmaps/open_folder.png +0 -0
- wx/demo/agw/bitmaps/paste.png +0 -0
- wx/demo/agw/bitmaps/pause.png +0 -0
- wx/demo/agw/bitmaps/pausedisabled.png +0 -0
- wx/demo/agw/bitmaps/play.png +0 -0
- wx/demo/agw/bitmaps/playdisabled.png +0 -0
- wx/demo/agw/bitmaps/plus1.ico +0 -0
- wx/demo/agw/bitmaps/plus2.ico +0 -0
- wx/demo/agw/bitmaps/plus3.ico +0 -0
- wx/demo/agw/bitmaps/plus4.ico +0 -0
- wx/demo/agw/bitmaps/plus5.ico +0 -0
- wx/demo/agw/bitmaps/record.png +0 -0
- wx/demo/agw/bitmaps/recorddisabled.png +0 -0
- wx/demo/agw/bitmaps/recording.gif +0 -0
- wx/demo/agw/bitmaps/rewind.png +0 -0
- wx/demo/agw/bitmaps/rewinddisabled.png +0 -0
- wx/demo/agw/bitmaps/round.png +0 -0
- wx/demo/agw/bitmaps/save.png +0 -0
- wx/demo/agw/bitmaps/separator.gif +0 -0
- wx/demo/agw/bitmaps/separatorflip.png +0 -0
- wx/demo/agw/bitmaps/smfuel.ico +0 -0
- wx/demo/agw/bitmaps/smpi.ico +0 -0
- wx/demo/agw/bitmaps/smtemp.ico +0 -0
- wx/demo/agw/bitmaps/stop.png +0 -0
- wx/demo/agw/bitmaps/stopdisabled.png +0 -0
- wx/demo/agw/bitmaps/sttbutton.png +0 -0
- wx/demo/agw/bitmaps/sttfont.png +0 -0
- wx/demo/agw/bitmaps/sttheader.png +0 -0
- wx/demo/agw/bitmaps/stthelp.png +0 -0
- wx/demo/agw/bitmaps/view1.png +0 -0
- wx/demo/agw/bitmaps/view2.png +0 -0
- wx/demo/agw/bitmaps/view_choose.png +0 -0
- wx/demo/agw/bitmaps/view_detailed.png +0 -0
- wx/demo/agw/bitmaps/view_icon.png +0 -0
- wx/demo/agw/bitmaps/view_multicolumn.png +0 -0
- wx/demo/agw/bitmaps/viewmag-16.png +0 -0
- wx/demo/agw/bitmaps/viewmag-m-16.png +0 -0
- wx/demo/agw/bitmaps/viewmag-p-16.png +0 -0
- wx/demo/agw/bitmaps/viewmagfit-16.png +0 -0
- wx/demo/agw/data/Example_1.xls +0 -0
- wx/demo/agw/images.py +6714 -0
- wx/demo/bitmaps/AG00028_.gif +0 -0
- wx/demo/bitmaps/AG00039_.gif +0 -0
- wx/demo/bitmaps/AG00178_.gif +0 -0
- wx/demo/bitmaps/AG00183_.gif +0 -0
- wx/demo/bitmaps/AG00185_.gif +0 -0
- wx/demo/bitmaps/BD13656_.gif +0 -0
- wx/demo/bitmaps/advancedsplash.png +0 -0
- wx/demo/bitmaps/aquabutton.png +0 -0
- wx/demo/bitmaps/aquachecked.ico +0 -0
- wx/demo/bitmaps/aquaflagged.ico +0 -0
- wx/demo/bitmaps/aquanotchecked.ico +0 -0
- wx/demo/bitmaps/aquanotflagged.ico +0 -0
- wx/demo/bitmaps/canada.gif +0 -0
- wx/demo/bitmaps/checked.ico +0 -0
- wx/demo/bitmaps/columns.png +0 -0
- wx/demo/bitmaps/contexthelp-16.png +0 -0
- wx/demo/bitmaps/contexthelp.png +0 -0
- wx/demo/bitmaps/copy.png +0 -0
- wx/demo/bitmaps/cropshot24x20.png +0 -0
- wx/demo/bitmaps/cut.png +0 -0
- wx/demo/bitmaps/editcopy.png +0 -0
- wx/demo/bitmaps/editcut.png +0 -0
- wx/demo/bitmaps/editpaste.png +0 -0
- wx/demo/bitmaps/exit-16.png +0 -0
- wx/demo/bitmaps/exit.ico +0 -0
- wx/demo/bitmaps/ffwd.png +0 -0
- wx/demo/bitmaps/ffwddisabled.png +0 -0
- wx/demo/bitmaps/field-16.png +0 -0
- wx/demo/bitmaps/filenew.png +0 -0
- wx/demo/bitmaps/fileopen.png +0 -0
- wx/demo/bitmaps/filesave.png +0 -0
- wx/demo/bitmaps/flagged.ico +0 -0
- wx/demo/bitmaps/folder_new.png +0 -0
- wx/demo/bitmaps/ghost.png +0 -0
- wx/demo/bitmaps/gradientbutton.png +0 -0
- wx/demo/bitmaps/help-16.png +0 -0
- wx/demo/bitmaps/help.ico +0 -0
- wx/demo/bitmaps/honeycomb300.png +0 -0
- wx/demo/bitmaps/image.bmp +0 -0
- wx/demo/bitmaps/image.gif +0 -0
- wx/demo/bitmaps/image.ico +0 -0
- wx/demo/bitmaps/image.jpg +0 -0
- wx/demo/bitmaps/image.png +0 -0
- wx/demo/bitmaps/image.tif +0 -0
- wx/demo/bitmaps/italy.gif +0 -0
- wx/demo/bitmaps/lbadd.png +0 -0
- wx/demo/bitmaps/lbcharge.png +0 -0
- wx/demo/bitmaps/lbdecrypted.png +0 -0
- wx/demo/bitmaps/lbnews.png +0 -0
- wx/demo/bitmaps/lbroll.png +0 -0
- wx/demo/bitmaps/minus1.ico +0 -0
- wx/demo/bitmaps/minus2.ico +0 -0
- wx/demo/bitmaps/minus3.ico +0 -0
- wx/demo/bitmaps/minus4.ico +0 -0
- wx/demo/bitmaps/minus5.ico +0 -0
- wx/demo/bitmaps/month-16.png +0 -0
- wx/demo/bitmaps/new_file.png +0 -0
- wx/demo/bitmaps/new_folder.png +0 -0
- wx/demo/bitmaps/notchecked.ico +0 -0
- wx/demo/bitmaps/notflagged.ico +0 -0
- wx/demo/bitmaps/ok-16.png +0 -0
- wx/demo/bitmaps/open_folder.png +0 -0
- wx/demo/bitmaps/paste.png +0 -0
- wx/demo/bitmaps/pause.png +0 -0
- wx/demo/bitmaps/pausedisabled.png +0 -0
- wx/demo/bitmaps/phoenix_title.png +0 -0
- wx/demo/bitmaps/phoenix_top.png +0 -0
- wx/demo/bitmaps/play.png +0 -0
- wx/demo/bitmaps/playdisabled.png +0 -0
- wx/demo/bitmaps/plus1.ico +0 -0
- wx/demo/bitmaps/plus2.ico +0 -0
- wx/demo/bitmaps/plus3.ico +0 -0
- wx/demo/bitmaps/plus4.ico +0 -0
- wx/demo/bitmaps/plus5.ico +0 -0
- wx/demo/bitmaps/record.png +0 -0
- wx/demo/bitmaps/recorddisabled.png +0 -0
- wx/demo/bitmaps/rewind.png +0 -0
- wx/demo/bitmaps/rewinddisabled.png +0 -0
- wx/demo/bitmaps/round.png +0 -0
- wx/demo/bitmaps/save.png +0 -0
- wx/demo/bitmaps/smfuel.ico +0 -0
- wx/demo/bitmaps/smpi.ico +0 -0
- wx/demo/bitmaps/smtemp.ico +0 -0
- wx/demo/bitmaps/snakey_render.png +0 -0
- wx/demo/bitmaps/splash.png +0 -0
- wx/demo/bitmaps/stop.png +0 -0
- wx/demo/bitmaps/stopdisabled.png +0 -0
- wx/demo/bitmaps/sttbutton.png +0 -0
- wx/demo/bitmaps/sttfont.png +0 -0
- wx/demo/bitmaps/sttheader.png +0 -0
- wx/demo/bitmaps/stthelp.png +0 -0
- wx/demo/bitmaps/toucan.png +0 -0
- wx/demo/bitmaps/view1.png +0 -0
- wx/demo/bitmaps/view2.png +0 -0
- wx/demo/bitmaps/view_choose.png +0 -0
- wx/demo/bitmaps/view_detailed.png +0 -0
- wx/demo/bitmaps/view_icon.png +0 -0
- wx/demo/bitmaps/view_multicolumn.png +0 -0
- wx/demo/bitmaps/viewmag-16.png +0 -0
- wx/demo/bitmaps/viewmag-m-16.png +0 -0
- wx/demo/bitmaps/viewmag-p-16.png +0 -0
- wx/demo/bitmaps/viewmagfit-16.png +0 -0
- wx/demo/bmp_source/001.png +0 -0
- wx/demo/bmp_source/002.png +0 -0
- wx/demo/bmp_source/003.png +0 -0
- wx/demo/bmp_source/004.png +0 -0
- wx/demo/bmp_source/005.png +0 -0
- wx/demo/bmp_source/006.png +0 -0
- wx/demo/bmp_source/007.png +0 -0
- wx/demo/bmp_source/008.png +0 -0
- wx/demo/bmp_source/009.png +0 -0
- wx/demo/bmp_source/010.png +0 -0
- wx/demo/bmp_source/011.png +0 -0
- wx/demo/bmp_source/012.png +0 -0
- wx/demo/bmp_source/013.png +0 -0
- wx/demo/bmp_source/014.png +0 -0
- wx/demo/bmp_source/015.png +0 -0
- wx/demo/bmp_source/016.png +0 -0
- wx/demo/bmp_source/017.png +0 -0
- wx/demo/bmp_source/018.png +0 -0
- wx/demo/bmp_source/019.png +0 -0
- wx/demo/bmp_source/020.png +0 -0
- wx/demo/bmp_source/021.png +0 -0
- wx/demo/bmp_source/022.png +0 -0
- wx/demo/bmp_source/023.png +0 -0
- wx/demo/bmp_source/024.png +0 -0
- wx/demo/bmp_source/025.png +0 -0
- wx/demo/bmp_source/026.png +0 -0
- wx/demo/bmp_source/027.png +0 -0
- wx/demo/bmp_source/028.png +0 -0
- wx/demo/bmp_source/029.png +0 -0
- wx/demo/bmp_source/030.png +0 -0
- wx/demo/bmp_source/DbDec.bmp +0 -0
- wx/demo/bmp_source/DbInc.bmp +0 -0
- wx/demo/bmp_source/Dec.bmp +0 -0
- wx/demo/bmp_source/FRM_0.png +0 -0
- wx/demo/bmp_source/FRM_1.png +0 -0
- wx/demo/bmp_source/FRM_2.png +0 -0
- wx/demo/bmp_source/FRM_3.png +0 -0
- wx/demo/bmp_source/FRM_4.png +0 -0
- wx/demo/bmp_source/FRM_5.png +0 -0
- wx/demo/bmp_source/FRM_6.png +0 -0
- wx/demo/bmp_source/FRM_7.png +0 -0
- wx/demo/bmp_source/FRM_8.png +0 -0
- wx/demo/bmp_source/GridBG.gif +0 -0
- wx/demo/bmp_source/Inc.bmp +0 -0
- wx/demo/bmp_source/LB01.png +0 -0
- wx/demo/bmp_source/LB02.png +0 -0
- wx/demo/bmp_source/LB03.png +0 -0
- wx/demo/bmp_source/LB04.png +0 -0
- wx/demo/bmp_source/LB05.png +0 -0
- wx/demo/bmp_source/LB06.png +0 -0
- wx/demo/bmp_source/LB07.png +0 -0
- wx/demo/bmp_source/LB08.png +0 -0
- wx/demo/bmp_source/LB09.png +0 -0
- wx/demo/bmp_source/LB10.png +0 -0
- wx/demo/bmp_source/LB11.png +0 -0
- wx/demo/bmp_source/LB12.png +0 -0
- wx/demo/bmp_source/Pt.bmp +0 -0
- wx/demo/bmp_source/Vippi.png +0 -0
- wx/demo/bmp_source/backgrnd.png +0 -0
- wx/demo/bmp_source/book.png +0 -0
- wx/demo/bmp_source/book_blue.png +0 -0
- wx/demo/bmp_source/book_green.png +0 -0
- wx/demo/bmp_source/book_red.png +0 -0
- wx/demo/bmp_source/bp_btn1.png +0 -0
- wx/demo/bmp_source/bp_btn2.png +0 -0
- wx/demo/bmp_source/bp_btn3.png +0 -0
- wx/demo/bmp_source/bp_btn4.png +0 -0
- wx/demo/bmp_source/bulb1.bmp +0 -0
- wx/demo/bmp_source/bulb2.bmp +0 -0
- wx/demo/bmp_source/carrot.png +0 -0
- wx/demo/bmp_source/clipboard.png +0 -0
- wx/demo/bmp_source/code.png +0 -0
- wx/demo/bmp_source/core.png +0 -0
- wx/demo/bmp_source/custom.png +0 -0
- wx/demo/bmp_source/customcontrol.png +0 -0
- wx/demo/bmp_source/deletedocs.png +0 -0
- wx/demo/bmp_source/deleteperspective.png +0 -0
- wx/demo/bmp_source/demo.png +0 -0
- wx/demo/bmp_source/dialog.png +0 -0
- wx/demo/bmp_source/exit.png +0 -0
- wx/demo/bmp_source/expansion.png +0 -0
- wx/demo/bmp_source/find.png +0 -0
- wx/demo/bmp_source/findnext.png +0 -0
- wx/demo/bmp_source/floatcanvas.png +0 -0
- wx/demo/bmp_source/frame.png +0 -0
- wx/demo/bmp_source/images.png +0 -0
- wx/demo/bmp_source/inspect.png +0 -0
- wx/demo/bmp_source/layout.png +0 -0
- wx/demo/bmp_source/logo.png +0 -0
- wx/demo/bmp_source/miscellaneous.png +0 -0
- wx/demo/bmp_source/modifiedexists.png +0 -0
- wx/demo/bmp_source/mondrian.ico +0 -0
- wx/demo/bmp_source/morecontrols.png +0 -0
- wx/demo/bmp_source/moredialog.png +0 -0
- wx/demo/bmp_source/noicon.png +0 -0
- wx/demo/bmp_source/overview.png +0 -0
- wx/demo/bmp_source/pencil.png +0 -0
- wx/demo/bmp_source/pointy.png +0 -0
- wx/demo/bmp_source/process.png +0 -0
- wx/demo/bmp_source/pyshell.png +0 -0
- wx/demo/bmp_source/recent.png +0 -0
- wx/demo/bmp_source/rest.png +0 -0
- wx/demo/bmp_source/robin.jpg +0 -0
- wx/demo/bmp_source/rt_alignleft.xpm +24 -0
- wx/demo/bmp_source/rt_alignright.xpm +24 -0
- wx/demo/bmp_source/rt_bold.xpm +24 -0
- wx/demo/bmp_source/rt_centre.xpm +24 -0
- wx/demo/bmp_source/rt_colour.xpm +59 -0
- wx/demo/bmp_source/rt_copy.xpm +44 -0
- wx/demo/bmp_source/rt_cut.xpm +46 -0
- wx/demo/bmp_source/rt_font.xpm +25 -0
- wx/demo/bmp_source/rt_idea.xpm +47 -0
- wx/demo/bmp_source/rt_indentless.xpm +25 -0
- wx/demo/bmp_source/rt_indentmore.xpm +25 -0
- wx/demo/bmp_source/rt_italic.xpm +25 -0
- wx/demo/bmp_source/rt_open.xpm +57 -0
- wx/demo/bmp_source/rt_paste.xpm +46 -0
- wx/demo/bmp_source/rt_redo.xpm +58 -0
- wx/demo/bmp_source/rt_sample.xpm +44 -0
- wx/demo/bmp_source/rt_save.xpm +42 -0
- wx/demo/bmp_source/rt_smiley.xpm +42 -0
- wx/demo/bmp_source/rt_underline.xpm +25 -0
- wx/demo/bmp_source/rt_undo.xpm +58 -0
- wx/demo/bmp_source/rt_zebra.xpm +409 -0
- wx/demo/bmp_source/saveperspective.png +0 -0
- wx/demo/bmp_source/sm_down.bmp +0 -0
- wx/demo/bmp_source/sm_up.bmp +0 -0
- wx/demo/bmp_source/smiles2.bmp +0 -0
- wx/demo/bmp_source/test2.bmp +0 -0
- wx/demo/bmp_source/testmask.bmp +0 -0
- wx/demo/bmp_source/teststar.png +0 -0
- wx/demo/bmp_source/thekid.png +0 -0
- wx/demo/bmp_source/tog1.bmp +0 -0
- wx/demo/bmp_source/tog2.bmp +0 -0
- wx/demo/bmp_source/wiztest1.bmp +0 -0
- wx/demo/bmp_source/wiztest2.bmp +0 -0
- wx/demo/bmp_source/wxpdemo.ico +0 -0
- wx/demo/cursors/paperairplane_arrow_blue.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_blue_fadeout80.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_colorshift.ani +0 -0
- wx/demo/cursors/paperairplane_arrow_dark.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_grey.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_red.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_white.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_white24.png +0 -0
- wx/demo/data/0-tiger.svg +725 -0
- wx/demo/data/Asteroid_blaster.swf +0 -0
- wx/demo/data/SIL_OPEN_FONT_LICENSE.txt +97 -0
- wx/demo/data/SourceCodePro-Regular.ttf +0 -0
- wx/demo/data/accessories-calculator.svg +636 -0
- wx/demo/data/accessories-text-editor.svg +554 -0
- wx/demo/data/anykey.wav +0 -0
- wx/demo/data/applications-internet.svg +623 -0
- wx/demo/data/desktop-accessibility.svg +245 -0
- wx/demo/data/desktop-keyboard-shortcuts.svg +839 -0
- wx/demo/data/desktop-locale.svg +878 -0
- wx/demo/data/desktop-remote-desktop.svg +1479 -0
- wx/demo/data/desktop-theme.svg +882 -0
- wx/demo/data/desktop-wallpaper.svg +747 -0
- wx/demo/data/echo.py +25 -0
- wx/demo/data/imagemap.htm +20 -0
- wx/demo/data/imagemap.png +0 -0
- wx/demo/data/internet-group-chat.svg +312 -0
- wx/demo/data/internet-mail.svg +440 -0
- wx/demo/data/locale/af/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/de/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/es/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/fr/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/it/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale-src/af.po +23 -0
- wx/demo/data/locale-src/de.po +23 -0
- wx/demo/data/locale-src/es.po +22 -0
- wx/demo/data/locale-src/fr.po +22 -0
- wx/demo/data/locale-src/install +15 -0
- wx/demo/data/locale-src/it.po +23 -0
- wx/demo/data/locale-src/wxpydemo.po +21 -0
- wx/demo/data/office-calendar.svg +316 -0
- wx/demo/data/pic.png +0 -0
- wx/demo/data/pic2.bmp +0 -0
- wx/demo/data/plan.wav +0 -0
- wx/demo/data/proclamation.txt +115 -0
- wx/demo/data/resource.wdr +0 -0
- wx/demo/data/resource_wdr.xrc +146 -0
- wx/demo/data/romedalen.png +0 -0
- wx/demo/data/stc.h.html +3544 -0
- wx/demo/data/system-session.svg +510 -0
- wx/demo/data/system-users.svg +539 -0
- wx/demo/data/tables.htm +116 -0
- wx/demo/data/test-gradient-pen.svg +14 -0
- wx/demo/data/test-opacity.svg +7 -0
- wx/demo/data/test.htm +253 -0
- wx/demo/data/testmovie.mpg +0 -0
- wx/demo/data/testtable.txt +38 -0
- wx/demo/data/tips.txt +73 -0
- wx/demo/data/utilities-system-monitor.svg +435 -0
- wx/demo/data/utilities-terminal.svg +500 -0
- wx/demo/data/widgetTest.htm +70 -0
- wx/demo/data/world.dat +24055 -0
- wx/demo/demo.py +4 -0
- wx/demo/demo.pyw +4 -0
- wx/demo/demodata.py +310 -0
- wx/demo/encode_bitmaps.py +181 -0
- wx/demo/images.py +6812 -0
- wx/demo/infoframe.py +149 -0
- wx/demo/run.py +171 -0
- wx/demo/snippets/__init__.py +13 -0
- wx/demo/snippets/arc.py +21 -0
- wx/demo/snippets/arc_negative.py +21 -0
- wx/demo/snippets/clip.py +13 -0
- wx/demo/snippets/clip_image.py +13 -0
- wx/demo/snippets/curve_rectangle.py +53 -0
- wx/demo/snippets/curve_to.py +17 -0
- wx/demo/snippets/dash.py +18 -0
- wx/demo/snippets/ellipse.py +33 -0
- wx/demo/snippets/fill_and_stroke.py +12 -0
- wx/demo/snippets/fill_and_stroke2.py +18 -0
- wx/demo/snippets/fill_style.py +31 -0
- wx/demo/snippets/glyph_path.py +21 -0
- wx/demo/snippets/gradient.py +16 -0
- wx/demo/snippets/gradient_mask.py +12 -0
- wx/demo/snippets/group.py +16 -0
- wx/demo/snippets/image.py +14 -0
- wx/demo/snippets/imagepattern.py +23 -0
- wx/demo/snippets/path.py +7 -0
- wx/demo/snippets/set_line_cap.py +19 -0
- wx/demo/snippets/set_line_join.py +21 -0
- wx/demo/snippets/show_glyphs.py +15 -0
- wx/demo/snippets/text.py +22 -0
- wx/demo/snippets/text_align_center.py +26 -0
- wx/demo/snippets/text_extents.py +27 -0
- wx/demo/template.py +36 -0
- wx/demo/throbImages.py +1277 -0
- wx/demo/version.py +3 -0
- wx/demo/widgetTest.py +72 -0
- wx/demo/wxpdemo.ico +0 -0
- wx/glcanvas.py +10 -0
- wx/glcanvas.pyi +458 -0
- wx/grid.py +229 -0
- wx/grid.pyi +4959 -0
- wx/html.py +35 -0
- wx/html.pyi +2965 -0
- wx/html2.py +40 -0
- wx/html2.pyi +772 -0
- wx/lib/CDate.py +202 -0
- wx/lib/ClickableHtmlWindow.py +57 -0
- wx/lib/__init__.py +0 -0
- wx/lib/activex.py +178 -0
- wx/lib/activexwrapper.py +153 -0
- wx/lib/agw/__init__.py +128 -0
- wx/lib/agw/advancedsplash.py +564 -0
- wx/lib/agw/aquabutton.py +1127 -0
- wx/lib/agw/artmanager.py +2110 -0
- wx/lib/agw/aui/__init__.py +295 -0
- wx/lib/agw/aui/aui_constants.py +2628 -0
- wx/lib/agw/aui/aui_switcherdialog.py +1227 -0
- wx/lib/agw/aui/aui_utilities.py +672 -0
- wx/lib/agw/aui/auibar.py +4031 -0
- wx/lib/agw/aui/auibook.py +6289 -0
- wx/lib/agw/aui/dockart.py +1198 -0
- wx/lib/agw/aui/framemanager.py +10409 -0
- wx/lib/agw/aui/tabart.py +2771 -0
- wx/lib/agw/aui/tabmdi.py +679 -0
- wx/lib/agw/balloontip.py +1158 -0
- wx/lib/agw/buttonpanel.py +2823 -0
- wx/lib/agw/cubecolourdialog.py +3529 -0
- wx/lib/agw/customtreectrl.py +8963 -0
- wx/lib/agw/data/ShortcutEditor_1.png +0 -0
- wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
- wx/lib/agw/data/default_help_text.html +105 -0
- wx/lib/agw/flatmenu.py +7333 -0
- wx/lib/agw/flatnotebook.py +6672 -0
- wx/lib/agw/floatspin.py +1823 -0
- wx/lib/agw/fmcustomizedlg.py +540 -0
- wx/lib/agw/fmresources.py +407 -0
- wx/lib/agw/foldpanelbar.py +2282 -0
- wx/lib/agw/fourwaysplitter.py +1130 -0
- wx/lib/agw/genericmessagedialog.py +1549 -0
- wx/lib/agw/gradientbutton.py +732 -0
- wx/lib/agw/hyperlink.py +664 -0
- wx/lib/agw/hypertreelist.py +5374 -0
- wx/lib/agw/infobar.py +885 -0
- wx/lib/agw/knobctrl.py +945 -0
- wx/lib/agw/labelbook.py +3029 -0
- wx/lib/agw/multidirdialog.py +615 -0
- wx/lib/agw/peakmeter.py +1029 -0
- wx/lib/agw/persist/__init__.py +188 -0
- wx/lib/agw/persist/persist_constants.py +284 -0
- wx/lib/agw/persist/persist_handlers.py +2614 -0
- wx/lib/agw/persist/persistencemanager.py +864 -0
- wx/lib/agw/piectrl.py +1082 -0
- wx/lib/agw/pybusyinfo.py +399 -0
- wx/lib/agw/pycollapsiblepane.py +940 -0
- wx/lib/agw/pygauge.py +570 -0
- wx/lib/agw/pyprogress.py +917 -0
- wx/lib/agw/ribbon/__init__.py +198 -0
- wx/lib/agw/ribbon/art.py +219 -0
- wx/lib/agw/ribbon/art_aui.py +1284 -0
- wx/lib/agw/ribbon/art_default.py +81 -0
- wx/lib/agw/ribbon/art_internal.py +244 -0
- wx/lib/agw/ribbon/art_msw.py +2736 -0
- wx/lib/agw/ribbon/art_osx.py +52 -0
- wx/lib/agw/ribbon/bar.py +1261 -0
- wx/lib/agw/ribbon/buttonbar.py +1320 -0
- wx/lib/agw/ribbon/control.py +205 -0
- wx/lib/agw/ribbon/gallery.py +974 -0
- wx/lib/agw/ribbon/page.py +946 -0
- wx/lib/agw/ribbon/panel.py +1170 -0
- wx/lib/agw/ribbon/toolbar.py +1442 -0
- wx/lib/agw/rulerctrl.py +1887 -0
- wx/lib/agw/scrolledthumbnail.py +2119 -0
- wx/lib/agw/shapedbutton.py +1809 -0
- wx/lib/agw/shortcuteditor.py +2634 -0
- wx/lib/agw/speedmeter.py +1801 -0
- wx/lib/agw/supertooltip.py +1444 -0
- wx/lib/agw/thumbnailctrl.py +529 -0
- wx/lib/agw/toasterbox.py +1327 -0
- wx/lib/agw/ultimatelistctrl.py +13666 -0
- wx/lib/agw/xlsgrid.py +2113 -0
- wx/lib/agw/zoombar.py +1339 -0
- wx/lib/analogclock/__init__.py +140 -0
- wx/lib/analogclock/analogclock.py +631 -0
- wx/lib/analogclock/helpers.py +991 -0
- wx/lib/analogclock/lib_setup/__init__.py +0 -0
- wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
- wx/lib/analogclock/lib_setup/fontselect.py +57 -0
- wx/lib/analogclock/setup.py +490 -0
- wx/lib/analogclock/styles.py +47 -0
- wx/lib/anchors.py +103 -0
- wx/lib/art/__init__.py +4 -0
- wx/lib/art/flagart.py +1583 -0
- wx/lib/art/img2pyartprov.py +56 -0
- wx/lib/busy.py +146 -0
- wx/lib/buttons.py +1141 -0
- wx/lib/calendar.py +1597 -0
- wx/lib/checkbox.py +837 -0
- wx/lib/colourchooser/__init__.py +38 -0
- wx/lib/colourchooser/canvas.py +145 -0
- wx/lib/colourchooser/intl.py +24 -0
- wx/lib/colourchooser/pycolourbox.py +89 -0
- wx/lib/colourchooser/pycolourchooser.py +629 -0
- wx/lib/colourchooser/pycolourslider.py +100 -0
- wx/lib/colourchooser/pypalette.py +211 -0
- wx/lib/colourdb.py +740 -0
- wx/lib/colourselect.py +385 -0
- wx/lib/colourutils.py +118 -0
- wx/lib/combotreebox.py +944 -0
- wx/lib/delayedresult.py +420 -0
- wx/lib/dialogs.py +510 -0
- wx/lib/docview.py +3210 -0
- wx/lib/dragscroller.py +79 -0
- wx/lib/editor/README.txt +77 -0
- wx/lib/editor/__init__.py +24 -0
- wx/lib/editor/editor.py +974 -0
- wx/lib/editor/images.py +15 -0
- wx/lib/editor/selection.py +44 -0
- wx/lib/embeddedimage.py +76 -0
- wx/lib/eventStack.py +136 -0
- wx/lib/eventwatcher.py +440 -0
- wx/lib/evtmgr.py +521 -0
- wx/lib/expando.py +393 -0
- wx/lib/fancytext.py +505 -0
- wx/lib/filebrowsebutton.py +459 -0
- wx/lib/flashwin.py +262 -0
- wx/lib/flashwin_old.py +651 -0
- wx/lib/floatcanvas/FCEvents.py +53 -0
- wx/lib/floatcanvas/FCObjects.py +2923 -0
- wx/lib/floatcanvas/FloatCanvas.py +1027 -0
- wx/lib/floatcanvas/GUIMode.py +396 -0
- wx/lib/floatcanvas/NavCanvas.py +161 -0
- wx/lib/floatcanvas/Resources.py +319 -0
- wx/lib/floatcanvas/ScreenShot.py +1788 -0
- wx/lib/floatcanvas/Utilities/BBox.py +314 -0
- wx/lib/floatcanvas/Utilities/Colors.py +137 -0
- wx/lib/floatcanvas/Utilities/GUI.py +91 -0
- wx/lib/floatcanvas/Utilities/__init__.py +7 -0
- wx/lib/floatcanvas/__init__.py +124 -0
- wx/lib/foldmenu.py +89 -0
- wx/lib/gestures.py +310 -0
- wx/lib/gizmos/__init__.py +18 -0
- wx/lib/gizmos/dynamicsash.py +1202 -0
- wx/lib/gizmos/ledctrl.py +300 -0
- wx/lib/gizmos/treelistctrl.py +87 -0
- wx/lib/graphics.py +1939 -0
- wx/lib/gridmovers.py +511 -0
- wx/lib/iewin.py +249 -0
- wx/lib/iewin_old.py +894 -0
- wx/lib/imagebrowser.py +856 -0
- wx/lib/imageutils.py +163 -0
- wx/lib/infoframe.py +490 -0
- wx/lib/inspection.py +1255 -0
- wx/lib/intctrl.py +1001 -0
- wx/lib/itemspicker.py +256 -0
- wx/lib/langlistctrl.py +480 -0
- wx/lib/layoutf.py +271 -0
- wx/lib/masked/__init__.py +27 -0
- wx/lib/masked/combobox.py +839 -0
- wx/lib/masked/ctrl.py +108 -0
- wx/lib/masked/ipaddrctrl.py +242 -0
- wx/lib/masked/maskededit.py +7279 -0
- wx/lib/masked/numctrl.py +2001 -0
- wx/lib/masked/textctrl.py +465 -0
- wx/lib/masked/timectrl.py +1466 -0
- wx/lib/mixins/__init__.py +17 -0
- wx/lib/mixins/grid.py +47 -0
- wx/lib/mixins/gridlabelrenderer.py +251 -0
- wx/lib/mixins/imagelist.py +77 -0
- wx/lib/mixins/inspection.py +184 -0
- wx/lib/mixins/listctrl.py +894 -0
- wx/lib/mixins/rubberband.py +404 -0
- wx/lib/mixins/treemixin.py +678 -0
- wx/lib/msgpanel.py +95 -0
- wx/lib/multisash.py +747 -0
- wx/lib/myole4ax.idl +178 -0
- wx/lib/myole4ax.tlb +0 -0
- wx/lib/newevent.py +229 -0
- wx/lib/nvdlg.py +156 -0
- wx/lib/ogl/__init__.py +13 -0
- wx/lib/ogl/basic.py +3991 -0
- wx/lib/ogl/bmpshape.py +87 -0
- wx/lib/ogl/canvas.py +467 -0
- wx/lib/ogl/composit.py +1577 -0
- wx/lib/ogl/diagram.py +230 -0
- wx/lib/ogl/divided.py +483 -0
- wx/lib/ogl/drawn.py +900 -0
- wx/lib/ogl/lines.py +1811 -0
- wx/lib/ogl/oglmisc.py +608 -0
- wx/lib/pdfviewer/__init__.py +113 -0
- wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
- wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
- wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
- wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
- wx/lib/pdfviewer/bitmaps/Save.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
- wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
- wx/lib/pdfviewer/buttonpanel.py +279 -0
- wx/lib/pdfviewer/images.py +240 -0
- wx/lib/pdfviewer/viewer.py +1077 -0
- wx/lib/pdfwin.py +295 -0
- wx/lib/pdfwin_old.py +789 -0
- wx/lib/platebtn.py +789 -0
- wx/lib/plot/CHANGELOG.md +150 -0
- wx/lib/plot/README.md +16 -0
- wx/lib/plot/__init__.py +46 -0
- wx/lib/plot/__main__.py +5 -0
- wx/lib/plot/examples/__init__.py +0 -0
- wx/lib/plot/examples/demo.py +1009 -0
- wx/lib/plot/examples/simple_example.py +54 -0
- wx/lib/plot/plotcanvas.py +2981 -0
- wx/lib/plot/polyobjects.py +1525 -0
- wx/lib/plot/utils.py +327 -0
- wx/lib/popupctl.py +250 -0
- wx/lib/printout.py +1157 -0
- wx/lib/progressindicator.py +151 -0
- wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
- wx/lib/pubsub/README_WxPython.txt +22 -0
- wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
- wx/lib/pubsub/__init__.py +25 -0
- wx/lib/pubsub/core/__init__.py +92 -0
- wx/lib/pubsub/core/arg1/__init__.py +16 -0
- wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
- wx/lib/pubsub/core/arg1/publisher.py +40 -0
- wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
- wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
- wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
- wx/lib/pubsub/core/callables.py +191 -0
- wx/lib/pubsub/core/imp2.py +63 -0
- wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
- wx/lib/pubsub/core/kwargs/__init__.py +16 -0
- wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
- wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
- wx/lib/pubsub/core/kwargs/publisher.py +77 -0
- wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
- wx/lib/pubsub/core/kwargs/topicargspecimpl.py +217 -0
- wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
- wx/lib/pubsub/core/listener.py +40 -0
- wx/lib/pubsub/core/listenerbase.py +185 -0
- wx/lib/pubsub/core/notificationmgr.py +185 -0
- wx/lib/pubsub/core/publisherbase.py +191 -0
- wx/lib/pubsub/core/topicargspec.py +77 -0
- wx/lib/pubsub/core/topicdefnprovider.py +632 -0
- wx/lib/pubsub/core/topicexc.py +72 -0
- wx/lib/pubsub/core/topicmgr.py +456 -0
- wx/lib/pubsub/core/topicobj.py +472 -0
- wx/lib/pubsub/core/topictreetraverser.py +143 -0
- wx/lib/pubsub/core/topicutils.py +118 -0
- wx/lib/pubsub/core/treeconfig.py +21 -0
- wx/lib/pubsub/core/validatedefnargs.py +29 -0
- wx/lib/pubsub/core/weakmethod.py +102 -0
- wx/lib/pubsub/policies.py +24 -0
- wx/lib/pubsub/pub.py +199 -0
- wx/lib/pubsub/py2and3.py +608 -0
- wx/lib/pubsub/setuparg1.py +47 -0
- wx/lib/pubsub/setupkwargs.py +29 -0
- wx/lib/pubsub/utils/__init__.py +27 -0
- wx/lib/pubsub/utils/exchandling.py +100 -0
- wx/lib/pubsub/utils/misc.py +100 -0
- wx/lib/pubsub/utils/notification.py +331 -0
- wx/lib/pubsub/utils/topictreeprinter.py +195 -0
- wx/lib/pubsub/utils/xmltopicdefnprovider.py +287 -0
- wx/lib/pydocview.py +3300 -0
- wx/lib/rcsizer.py +229 -0
- wx/lib/resizewidget.py +357 -0
- wx/lib/scrolledpanel.py +225 -0
- wx/lib/sheet.py +350 -0
- wx/lib/sized_controls.py +691 -0
- wx/lib/softwareupdate.py +361 -0
- wx/lib/splitter.py +925 -0
- wx/lib/statbmp.py +199 -0
- wx/lib/stattext.py +322 -0
- wx/lib/throbber.py +425 -0
- wx/lib/ticker.py +295 -0
- wx/lib/ticker_xrc.py +48 -0
- wx/lib/utils.py +89 -0
- wx/lib/wordwrap.py +97 -0
- wx/lib/wxcairo/__init__.py +124 -0
- wx/lib/wxcairo/wx_cairocffi.py +200 -0
- wx/lib/wxcairo/wx_pycairo.py +463 -0
- wx/lib/wxpTag.py +274 -0
- wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
- wx/media.py +27 -0
- wx/media.pyi +223 -0
- wx/msw.py +13 -0
- wx/msw.pyi +65 -0
- wx/propgrid.py +1451 -0
- wx/propgrid.pyi +7914 -0
- wx/py/CHANGES.txt +796 -0
- wx/py/Py.ico +0 -0
- wx/py/PyAlaCarte.py +34 -0
- wx/py/PyAlaMode.py +34 -0
- wx/py/PyAlaModeTest.py +33 -0
- wx/py/PyCrust.ico +0 -0
- wx/py/PyCrust.py +78 -0
- wx/py/PyCrust_16.png +0 -0
- wx/py/PyCrust_32.png +0 -0
- wx/py/PyFilling.py +35 -0
- wx/py/PyShell.py +78 -0
- wx/py/PySlices.ico +0 -0
- wx/py/PySlices.py +98 -0
- wx/py/PySlicesShell.py +94 -0
- wx/py/PySlices_16.png +0 -0
- wx/py/PySlices_32.png +0 -0
- wx/py/PyWrap.py +52 -0
- wx/py/README.txt +77 -0
- wx/py/__init__.py +20 -0
- wx/py/buffer.py +136 -0
- wx/py/crust.py +403 -0
- wx/py/crustslices.py +403 -0
- wx/py/dispatcher.py +259 -0
- wx/py/document.py +37 -0
- wx/py/editor.py +844 -0
- wx/py/editwindow.py +299 -0
- wx/py/filling.py +357 -0
- wx/py/frame.py +978 -0
- wx/py/images.py +212 -0
- wx/py/interpreter.py +170 -0
- wx/py/introspect.py +393 -0
- wx/py/magic.py +98 -0
- wx/py/parse.py +134 -0
- wx/py/path.py +36 -0
- wx/py/pseudo.py +99 -0
- wx/py/shell.py +1588 -0
- wx/py/sliceshell.py +3814 -0
- wx/py/tests/test_interpreter.py +71 -0
- wx/py/tests/test_introspect.py +862 -0
- wx/py/tests/test_pseudo.py +70 -0
- wx/py/tests/test_version.py +36 -0
- wx/py/tests/testall.py +22 -0
- wx/py/version.py +7 -0
- wx/ribbon.py +45 -0
- wx/ribbon.pyi +2494 -0
- wx/richtext.py +142 -0
- wx/richtext.pyi +12113 -0
- wx/siplib.cp313-win_amd64.pyd +0 -0
- wx/stc.py +58 -0
- wx/stc.pyi +8463 -0
- wx/svg/__init__.py +364 -0
- wx/svg/_nanosvg.cp313-win_amd64.pyd +0 -0
- wx/tools/__init__.py +18 -0
- wx/tools/dbg.py +268 -0
- wx/tools/genaxmodule.py +50 -0
- wx/tools/helpviewer.py +92 -0
- wx/tools/img2img.py +85 -0
- wx/tools/img2png.py +54 -0
- wx/tools/img2py.py +309 -0
- wx/tools/img2xpm.py +54 -0
- wx/tools/pywxrc.py +949 -0
- wx/tools/wxget.py +254 -0
- wx/tools/wxget_docs_demo.py +186 -0
- wx/wxbase315u_net_vc140_x64.dll +0 -0
- wx/wxbase315u_vc140_x64.dll +0 -0
- wx/wxbase315u_xml_vc140_x64.dll +0 -0
- wx/wxmsw315u_adv_vc140_x64.dll +0 -0
- wx/wxmsw315u_aui_vc140_x64.dll +0 -0
- wx/wxmsw315u_core_vc140_x64.dll +0 -0
- wx/wxmsw315u_gl_vc140_x64.dll +0 -0
- wx/wxmsw315u_html_vc140_x64.dll +0 -0
- wx/wxmsw315u_media_vc140_x64.dll +0 -0
- wx/wxmsw315u_propgrid_vc140_x64.dll +0 -0
- wx/wxmsw315u_qa_vc140_x64.dll +0 -0
- wx/wxmsw315u_ribbon_vc140_x64.dll +0 -0
- wx/wxmsw315u_richtext_vc140_x64.dll +0 -0
- wx/wxmsw315u_stc_vc140_x64.dll +0 -0
- wx/wxmsw315u_webview_vc140_x64.dll +0 -0
- wx/wxmsw315u_xrc_vc140_x64.dll +0 -0
- wx/xml.py +15 -0
- wx/xml.pyi +575 -0
- wx/xrc.py +65 -0
- wx/xrc.pyi +742 -0
- wxPython_zombie-3.1.5.8.dist-info/LICENSE.txt +950 -0
- wxPython_zombie-3.1.5.8.dist-info/METADATA +107 -0
- wxPython_zombie-3.1.5.8.dist-info/RECORD +1175 -0
- wxPython_zombie-3.1.5.8.dist-info/WHEEL +5 -0
- wxPython_zombie-3.1.5.8.dist-info/entry_points.txt +2 -0
- wxPython_zombie-3.1.5.8.dist-info/top_level.txt +1 -0
wx/lib/agw/labelbook.py
ADDED
|
@@ -0,0 +1,3029 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------- #
|
|
2
|
+
# LABELBOOK And FLATIMAGEBOOK Widgets wxPython IMPLEMENTATION
|
|
3
|
+
#
|
|
4
|
+
# Original C++ Code From Eran, embedded in the FlatMenu source code
|
|
5
|
+
#
|
|
6
|
+
#
|
|
7
|
+
# License: wxWidgets license
|
|
8
|
+
#
|
|
9
|
+
#
|
|
10
|
+
# Python Code By:
|
|
11
|
+
#
|
|
12
|
+
# Andrea Gavana, @ 03 Nov 2006
|
|
13
|
+
# Latest Revision: 22 Jan 2013, 21.00 GMT
|
|
14
|
+
# (c) 2021 Zombie
|
|
15
|
+
#
|
|
16
|
+
#
|
|
17
|
+
# For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please
|
|
18
|
+
# Write To Me At:
|
|
19
|
+
#
|
|
20
|
+
# andrea.gavana@gmail.com
|
|
21
|
+
# andrea.gavana@maerskoil.com
|
|
22
|
+
#
|
|
23
|
+
# Or, Obviously, To The wxPython Mailing List!!!
|
|
24
|
+
#
|
|
25
|
+
# TODO:
|
|
26
|
+
# LabelBook - Support IMB_SHOW_ONLY_IMAGES
|
|
27
|
+
# LabelBook - An option to only draw the border
|
|
28
|
+
# between the controls and the pages so the background
|
|
29
|
+
# colour can flow into the window background
|
|
30
|
+
#
|
|
31
|
+
# Tags: phoenix-port, unittest, documented, py3-port
|
|
32
|
+
#
|
|
33
|
+
#
|
|
34
|
+
# End Of Comments
|
|
35
|
+
# --------------------------------------------------------------------------- #
|
|
36
|
+
|
|
37
|
+
"""
|
|
38
|
+
:class:`~wx.lib.agw.labelbook.LabelBook` and :class:`~wx.lib.agw.labelbook.FlatImageBook` are a quasi-full generic and owner-drawn
|
|
39
|
+
implementations of :class:`Notebook`.
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
Description
|
|
43
|
+
===========
|
|
44
|
+
|
|
45
|
+
:class:`LabelBook` and :class:`FlatImageBook` are quasi-full implementations of the :class:`Notebook`,
|
|
46
|
+
and designed to be a drop-in replacement for :class:`Notebook`. The API functions are
|
|
47
|
+
similar so one can expect the function to behave in the same way.
|
|
48
|
+
:class:`LabelBook` anf :class:`FlatImageBook` share their appearance with :class:`Toolbook` and
|
|
49
|
+
:class:`Listbook`, while having more options for custom drawings, label positioning,
|
|
50
|
+
mouse pointing and so on. Moreover, they retain also some visual characteristics
|
|
51
|
+
of the Outlook address book.
|
|
52
|
+
|
|
53
|
+
Some features:
|
|
54
|
+
|
|
55
|
+
- They are generic controls;
|
|
56
|
+
- Supports for left, right, top (:class:`FlatImageBook` only), bottom (:class:`FlatImageBook`
|
|
57
|
+
only) book styles;
|
|
58
|
+
- Possibility to draw images only, text only or both (:class:`FlatImageBook` only);
|
|
59
|
+
- Support for a "pin-button", that allows the user to shrink/expand the book
|
|
60
|
+
tab area;
|
|
61
|
+
- Shadows behind tabs (:class:`LabelBook` only);
|
|
62
|
+
- Gradient shading of the tab area (:class:`LabelBook` only);
|
|
63
|
+
- Web-like mouse pointing on tabs style (:class:`LabelBook` only);
|
|
64
|
+
- Many customizable colours (tab area, active tab text, tab borders, active
|
|
65
|
+
tab, highlight) - :class:`LabelBook` only.
|
|
66
|
+
|
|
67
|
+
And much more. See the demo for a quasi-complete review of all the functionalities
|
|
68
|
+
of :class:`LabelBook` and :class:`FlatImageBook`.
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
Usage
|
|
72
|
+
=====
|
|
73
|
+
|
|
74
|
+
Usage example::
|
|
75
|
+
|
|
76
|
+
import wx
|
|
77
|
+
import wx.lib.agw.labelbook as LB
|
|
78
|
+
|
|
79
|
+
class MyFrame(wx.Frame):
|
|
80
|
+
|
|
81
|
+
def __init__(self, parent):
|
|
82
|
+
|
|
83
|
+
wx.Frame.__init__(self, parent, -1, "LabelBook Demo")
|
|
84
|
+
|
|
85
|
+
# Possible values for Tab placement are INB_TOP, INB_BOTTOM, INB_RIGHT, INB_LEFT
|
|
86
|
+
|
|
87
|
+
notebook = LB.LabelBook(self, -1, agwStyle=LB.INB_FIT_LABELTEXT|LB.INB_LEFT|LB.INB_DRAW_SHADOW|LB.INB_GRADIENT_BACKGROUND)
|
|
88
|
+
|
|
89
|
+
pane1 = wx.Panel(notebook)
|
|
90
|
+
pane2 = wx.Panel(notebook)
|
|
91
|
+
|
|
92
|
+
imagelist = wx.ImageList(32, 32)
|
|
93
|
+
imagelist.Add(wx.Bitmap("my_bitmap.png", wx.BITMAP_TYPE_PNG))
|
|
94
|
+
notebook.AssignImageList(imagelist)
|
|
95
|
+
|
|
96
|
+
notebook.AddPage(pane_1, "Tab1", 1, 0)
|
|
97
|
+
notebook.AddPage(pane_2, "Tab2", 0, 0)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# our normal wxApp-derived class, as usual
|
|
101
|
+
|
|
102
|
+
app = wx.App(0)
|
|
103
|
+
|
|
104
|
+
frame = MyFrame(None)
|
|
105
|
+
app.SetTopWindow(frame)
|
|
106
|
+
frame.Show()
|
|
107
|
+
|
|
108
|
+
app.MainLoop()
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
Supported Platforms
|
|
113
|
+
===================
|
|
114
|
+
|
|
115
|
+
:class:`LabelBook` and :class:`FlatImageBook` have been tested on the following platforms:
|
|
116
|
+
* Windows (Windows XP);
|
|
117
|
+
* Linux Ubuntu (Dapper 6.06)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
Window Styles
|
|
121
|
+
=============
|
|
122
|
+
|
|
123
|
+
This class supports the following window styles:
|
|
124
|
+
|
|
125
|
+
=========================== =========== ==================================================
|
|
126
|
+
Window Styles Hex Value Description
|
|
127
|
+
=========================== =========== ==================================================
|
|
128
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
129
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
130
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
131
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
132
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
133
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
134
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
135
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
136
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
137
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
138
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
139
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
140
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
141
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
142
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
143
|
+
=========================== =========== ==================================================
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
Events Processing
|
|
147
|
+
=================
|
|
148
|
+
|
|
149
|
+
This class processes the following events:
|
|
150
|
+
|
|
151
|
+
=================================== ==================================================
|
|
152
|
+
Event Name Description
|
|
153
|
+
=================================== ==================================================
|
|
154
|
+
``EVT_IMAGENOTEBOOK_PAGE_CHANGED`` Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` has changed.
|
|
155
|
+
``EVT_IMAGENOTEBOOK_PAGE_CHANGING`` Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` is about to change.
|
|
156
|
+
``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` has been closed.
|
|
157
|
+
``EVT_IMAGENOTEBOOK_PAGE_CLOSING`` Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` is closing.
|
|
158
|
+
=================================== ==================================================
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
TODOs
|
|
162
|
+
=====
|
|
163
|
+
|
|
164
|
+
- :class:`LabelBook`: support ``IMB_SHOW_ONLY_IMAGES``;
|
|
165
|
+
- :class:`LabelBook`: an option to only draw the border between the controls and the pages so the background
|
|
166
|
+
colour can flow into the window background.
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
License And Version
|
|
170
|
+
===================
|
|
171
|
+
|
|
172
|
+
:class:`LabelBook` and :class:`FlatImageBook` are distributed under the wxPython license.
|
|
173
|
+
|
|
174
|
+
Latest Revision: Andrea Gavana @ 22 Jan 2013, 21.00 GMT
|
|
175
|
+
|
|
176
|
+
Version 0.6.
|
|
177
|
+
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
__version__ = "0.6"
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
#----------------------------------------------------------------------
|
|
184
|
+
# Beginning Of IMAGENOTEBOOK wxPython Code
|
|
185
|
+
#----------------------------------------------------------------------
|
|
186
|
+
|
|
187
|
+
import wx
|
|
188
|
+
|
|
189
|
+
from .artmanager import ArtManager, DCSaver
|
|
190
|
+
from .fmresources import *
|
|
191
|
+
|
|
192
|
+
# Check for the new method in 2.7 (not present in 2.6.3.3)
|
|
193
|
+
if wx.VERSION_STRING < "2.7":
|
|
194
|
+
wx.Rect.Contains = lambda self, point: wx.Rect.Inside(self, point)
|
|
195
|
+
|
|
196
|
+
# FlatImageBook and LabelBook styles
|
|
197
|
+
INB_BOTTOM = 1
|
|
198
|
+
""" Place labels below the page area. Available only for :class:`FlatImageBook`."""
|
|
199
|
+
INB_LEFT = 2
|
|
200
|
+
""" Place labels on the left side. Available only for :class:`FlatImageBook`."""
|
|
201
|
+
INB_RIGHT = 4
|
|
202
|
+
""" Place labels on the right side. """
|
|
203
|
+
INB_TOP = 8
|
|
204
|
+
""" Place labels above the page area. """
|
|
205
|
+
INB_BORDER = 16
|
|
206
|
+
""" Draws a border around :class:`LabelBook` or :class:`FlatImageBook`. """
|
|
207
|
+
INB_SHOW_ONLY_TEXT = 32
|
|
208
|
+
""" Shows only text labels and no images. Available only for :class:`LabelBook`."""
|
|
209
|
+
INB_SHOW_ONLY_IMAGES = 64
|
|
210
|
+
""" Shows only tab images and no label texts. Available only for :class:`LabelBook`."""
|
|
211
|
+
INB_FIT_BUTTON = 128
|
|
212
|
+
""" Displays a pin button to show/hide the book control. """
|
|
213
|
+
INB_DRAW_SHADOW = 256
|
|
214
|
+
""" Draw shadows below the book tabs. Available only for :class:`LabelBook`."""
|
|
215
|
+
INB_USE_PIN_BUTTON = 512
|
|
216
|
+
""" Displays a pin button to show/hide the book control. """
|
|
217
|
+
INB_GRADIENT_BACKGROUND = 1024
|
|
218
|
+
""" Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`."""
|
|
219
|
+
INB_WEB_HILITE = 2048
|
|
220
|
+
""" On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`."""
|
|
221
|
+
INB_NO_RESIZE = 4096
|
|
222
|
+
""" Don't allow resizing of the tab area. """
|
|
223
|
+
INB_FIT_LABELTEXT = 8192
|
|
224
|
+
""" Will fit the tab area to the longest text (or text+image if you have images) in all the tabs. """
|
|
225
|
+
INB_BOLD_TAB_SELECTION = 16384
|
|
226
|
+
""" Show the selected tab text using a bold font. """
|
|
227
|
+
|
|
228
|
+
wxEVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
|
|
229
|
+
wxEVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING
|
|
230
|
+
wxEVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.NewEventType()
|
|
231
|
+
wxEVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.NewEventType()
|
|
232
|
+
|
|
233
|
+
#-----------------------------------#
|
|
234
|
+
# ImageNotebookEvent
|
|
235
|
+
#-----------------------------------#
|
|
236
|
+
|
|
237
|
+
EVT_IMAGENOTEBOOK_PAGE_CHANGED = wx.EVT_NOTEBOOK_PAGE_CHANGED
|
|
238
|
+
""" Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` has changed. """
|
|
239
|
+
EVT_IMAGENOTEBOOK_PAGE_CHANGING = wx.EVT_NOTEBOOK_PAGE_CHANGING
|
|
240
|
+
""" Notify client objects when the active page in :class:`FlatImageBook` or :class:`LabelBook` is about to change. """
|
|
241
|
+
EVT_IMAGENOTEBOOK_PAGE_CLOSING = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, 1)
|
|
242
|
+
""" Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` is closing. """
|
|
243
|
+
EVT_IMAGENOTEBOOK_PAGE_CLOSED = wx.PyEventBinder(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, 1)
|
|
244
|
+
""" Notify client objects when a page in :class:`FlatImageBook` or :class:`LabelBook` has been closed. """
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
# ---------------------------------------------------------------------------- #
|
|
248
|
+
# Class ImageNotebookEvent
|
|
249
|
+
# ---------------------------------------------------------------------------- #
|
|
250
|
+
|
|
251
|
+
class ImageNotebookEvent(wx.PyCommandEvent):
|
|
252
|
+
"""
|
|
253
|
+
This events will be sent when a ``EVT_IMAGENOTEBOOK_PAGE_CHANGED``,
|
|
254
|
+
``EVT_IMAGENOTEBOOK_PAGE_CHANGING``, ``EVT_IMAGENOTEBOOK_PAGE_CLOSING``,
|
|
255
|
+
``EVT_IMAGENOTEBOOK_PAGE_CLOSED`` is mapped in the parent.
|
|
256
|
+
"""
|
|
257
|
+
|
|
258
|
+
def __init__(self, eventType, eventId=1, sel=-1, oldsel=-1):
|
|
259
|
+
"""
|
|
260
|
+
Default class constructor.
|
|
261
|
+
|
|
262
|
+
:param `eventType`: the event type;
|
|
263
|
+
:param `eventId`: the event identifier;
|
|
264
|
+
:param `sel`: the current selection;
|
|
265
|
+
:param `oldsel`: the old selection.
|
|
266
|
+
"""
|
|
267
|
+
|
|
268
|
+
wx.PyCommandEvent.__init__(self, eventType, eventId)
|
|
269
|
+
self._eventType = eventType
|
|
270
|
+
self._sel = sel
|
|
271
|
+
self._oldsel = oldsel
|
|
272
|
+
self._allowed = True
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def SetSelection(self, s):
|
|
276
|
+
"""
|
|
277
|
+
Sets the event selection.
|
|
278
|
+
|
|
279
|
+
:param `s`: an integer specifying the new selection.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
self._sel = s
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def SetOldSelection(self, s):
|
|
286
|
+
"""
|
|
287
|
+
Sets the event old selection.
|
|
288
|
+
|
|
289
|
+
:param `s`: an integer specifying the old selection.
|
|
290
|
+
"""
|
|
291
|
+
|
|
292
|
+
self._oldsel = s
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def GetSelection(self):
|
|
296
|
+
""" Returns the event selection. """
|
|
297
|
+
|
|
298
|
+
return self._sel
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def GetOldSelection(self):
|
|
302
|
+
""" Returns the old event selection. """
|
|
303
|
+
|
|
304
|
+
return self._oldsel
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def Veto(self):
|
|
308
|
+
"""
|
|
309
|
+
Prevents the change announced by this event from happening.
|
|
310
|
+
|
|
311
|
+
:note: It is in general a good idea to notify the user about the reasons
|
|
312
|
+
for vetoing the change because otherwise the applications behaviour (which
|
|
313
|
+
just refuses to do what the user wants) might be quite surprising.
|
|
314
|
+
"""
|
|
315
|
+
|
|
316
|
+
self._allowed = False
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def Allow(self):
|
|
320
|
+
"""
|
|
321
|
+
This is the opposite of :meth:`~ImageNotebookEvent.Veto`: it explicitly allows the event to be processed.
|
|
322
|
+
For most events it is not necessary to call this method as the events are
|
|
323
|
+
allowed anyhow but some are forbidden by default (this will be mentioned
|
|
324
|
+
in the corresponding event description).
|
|
325
|
+
"""
|
|
326
|
+
|
|
327
|
+
self._allowed = True
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def IsAllowed(self):
|
|
331
|
+
"""
|
|
332
|
+
Returns ``True`` if the change is allowed (:meth:`~ImageNotebookEvent.Veto` hasn't been called) or
|
|
333
|
+
``False`` otherwise (if it was).
|
|
334
|
+
"""
|
|
335
|
+
|
|
336
|
+
return self._allowed
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
# ---------------------------------------------------------------------------- #
|
|
340
|
+
# Class ImageInfo
|
|
341
|
+
# ---------------------------------------------------------------------------- #
|
|
342
|
+
|
|
343
|
+
class ImageInfo(object):
|
|
344
|
+
"""
|
|
345
|
+
This class holds all the information (caption, image, etc...) belonging to a
|
|
346
|
+
single tab in :class:`LabelBook`.
|
|
347
|
+
"""
|
|
348
|
+
def __init__(self, strCaption="", imageIndex=-1, enabled=True):
|
|
349
|
+
"""
|
|
350
|
+
Default class constructor.
|
|
351
|
+
|
|
352
|
+
:param `strCaption`: the tab caption;
|
|
353
|
+
:param `imageIndex`: the tab image index based on the assigned (set)
|
|
354
|
+
:class:`wx.ImageList` (if any);
|
|
355
|
+
:param `enabled`: sets the tab as enabled or disabled.
|
|
356
|
+
"""
|
|
357
|
+
|
|
358
|
+
self._pos = wx.Point()
|
|
359
|
+
self._size = wx.Size()
|
|
360
|
+
self._strCaption = strCaption
|
|
361
|
+
self._ImageIndex = imageIndex
|
|
362
|
+
self._captionRect = wx.Rect()
|
|
363
|
+
self._bEnabled = enabled
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def SetCaption(self, value):
|
|
367
|
+
"""
|
|
368
|
+
Sets the tab caption.
|
|
369
|
+
|
|
370
|
+
:param `value`: the new tab caption.
|
|
371
|
+
"""
|
|
372
|
+
|
|
373
|
+
self._strCaption = value
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def GetCaption(self):
|
|
377
|
+
""" Returns the tab caption. """
|
|
378
|
+
|
|
379
|
+
return self._strCaption
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def SetPosition(self, value):
|
|
383
|
+
"""
|
|
384
|
+
Sets the tab position.
|
|
385
|
+
|
|
386
|
+
:param `value`: the new tab position, an instance of :class:`wx.Point`.
|
|
387
|
+
"""
|
|
388
|
+
|
|
389
|
+
self._pos = value
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def GetPosition(self):
|
|
393
|
+
""" Returns the tab position. """
|
|
394
|
+
|
|
395
|
+
return self._pos
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def SetSize(self, value):
|
|
399
|
+
"""
|
|
400
|
+
Sets the tab size.
|
|
401
|
+
|
|
402
|
+
:param `value`: the new tab size, an instance of :class:`wx.Size`.
|
|
403
|
+
"""
|
|
404
|
+
|
|
405
|
+
self._size = value
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def GetSize(self):
|
|
409
|
+
""" Returns the tab size. """
|
|
410
|
+
|
|
411
|
+
return self._size
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def SetImageIndex(self, value):
|
|
415
|
+
"""
|
|
416
|
+
Sets the tab image index.
|
|
417
|
+
|
|
418
|
+
:param `value`: an index into the image list..
|
|
419
|
+
"""
|
|
420
|
+
|
|
421
|
+
self._ImageIndex = value
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def GetImageIndex(self):
|
|
425
|
+
""" Returns the tab image index. """
|
|
426
|
+
|
|
427
|
+
return self._ImageIndex
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def SetTextRect(self, rect):
|
|
431
|
+
"""
|
|
432
|
+
Sets the client rectangle available for the tab text.
|
|
433
|
+
|
|
434
|
+
:param `rect`: the tab text client rectangle, an instance of :class:`wx.Rect`.
|
|
435
|
+
"""
|
|
436
|
+
|
|
437
|
+
self._captionRect = rect
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
def GetTextRect(self):
|
|
441
|
+
""" Returns the client rectangle available for the tab text. """
|
|
442
|
+
|
|
443
|
+
return self._captionRect
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
def GetEnabled(self):
|
|
447
|
+
""" Returns whether the tab is enabled or not. """
|
|
448
|
+
|
|
449
|
+
return self._bEnabled
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def EnableTab(self, enabled):
|
|
453
|
+
"""
|
|
454
|
+
Sets the tab enabled or disabled.
|
|
455
|
+
|
|
456
|
+
:param `enabled`: ``True`` to enable a tab, ``False`` to disable it.
|
|
457
|
+
"""
|
|
458
|
+
|
|
459
|
+
self._bEnabled = enabled
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
# ---------------------------------------------------------------------------- #
|
|
463
|
+
# Class ImageContainerBase
|
|
464
|
+
# ---------------------------------------------------------------------------- #
|
|
465
|
+
|
|
466
|
+
class ImageContainerBase(wx.Panel):
|
|
467
|
+
"""
|
|
468
|
+
Base class for :class:`FlatImageBook` image container.
|
|
469
|
+
"""
|
|
470
|
+
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
471
|
+
style=0, agwStyle=0, name="ImageContainerBase"):
|
|
472
|
+
"""
|
|
473
|
+
Default class constructor.
|
|
474
|
+
|
|
475
|
+
:param `parent`: parent window. Must not be ``None``;
|
|
476
|
+
:param `id`: window identifier. A value of -1 indicates a default value;
|
|
477
|
+
:param `pos`: the control position. A value of (-1, -1) indicates a default position,
|
|
478
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
479
|
+
:param `size`: the control size. A value of (-1, -1) indicates a default size,
|
|
480
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
481
|
+
:param `style`: the underlying :class:`Panel` window style;
|
|
482
|
+
:param `agwStyle`: the AGW-specific window style. This can be a combination of the
|
|
483
|
+
following bits:
|
|
484
|
+
|
|
485
|
+
=========================== =========== ==================================================
|
|
486
|
+
Window Styles Hex Value Description
|
|
487
|
+
=========================== =========== ==================================================
|
|
488
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
489
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
490
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
491
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
492
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
493
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
494
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
495
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
496
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
497
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
498
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
499
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
500
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
501
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
502
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
503
|
+
=========================== =========== ==================================================
|
|
504
|
+
|
|
505
|
+
:param `name`: the window name.
|
|
506
|
+
"""
|
|
507
|
+
|
|
508
|
+
self._nIndex = -1
|
|
509
|
+
self._nImgSize = 16
|
|
510
|
+
self._ImageList = None
|
|
511
|
+
self._nHoveredImgIdx = -1
|
|
512
|
+
self._bCollapsed = False
|
|
513
|
+
self._tabAreaSize = (-1, -1)
|
|
514
|
+
self._nPinButtonStatus = INB_PIN_NONE
|
|
515
|
+
self._pagesInfoVec = []
|
|
516
|
+
self._pinBtnRect = wx.Rect()
|
|
517
|
+
|
|
518
|
+
wx.Panel.__init__(self, parent, id, pos, size, style | wx.NO_BORDER | wx.NO_FULL_REPAINT_ON_RESIZE, name)
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def HasAGWFlag(self, flag):
|
|
522
|
+
"""
|
|
523
|
+
Tests for existence of flag in the style.
|
|
524
|
+
|
|
525
|
+
:param `flag`: a window style. This can be a combination of the following bits:
|
|
526
|
+
|
|
527
|
+
=========================== =========== ==================================================
|
|
528
|
+
Window Styles Hex Value Description
|
|
529
|
+
=========================== =========== ==================================================
|
|
530
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
531
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
532
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
533
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
534
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
535
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
536
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
537
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
538
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
539
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
540
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
541
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
542
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
543
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
544
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
545
|
+
=========================== =========== ==================================================
|
|
546
|
+
"""
|
|
547
|
+
|
|
548
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
549
|
+
res = (style & flag and [True] or [False])[0]
|
|
550
|
+
return res
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
def ClearFlag(self, flag):
|
|
554
|
+
"""
|
|
555
|
+
Removes flag from the style.
|
|
556
|
+
|
|
557
|
+
:param `flag`: a window style flag.
|
|
558
|
+
|
|
559
|
+
:see: :meth:`~ImageContainerBase.HasAGWFlag` for a list of possible window style flags.
|
|
560
|
+
"""
|
|
561
|
+
|
|
562
|
+
parent = self.GetParent()
|
|
563
|
+
agwStyle = parent.GetAGWWindowStyleFlag()
|
|
564
|
+
agwStyle &= ~flag
|
|
565
|
+
parent.SetAGWWindowStyleFlag(agwStyle)
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
def AssignImageList(self, imglist):
|
|
569
|
+
"""
|
|
570
|
+
Assigns an image list to the :class:`wx.ImageContainerBase`.
|
|
571
|
+
|
|
572
|
+
:param `imglist`: an instance of :class:`wx.ImageList`.
|
|
573
|
+
"""
|
|
574
|
+
|
|
575
|
+
if imglist and imglist.GetImageCount() != 0:
|
|
576
|
+
self._nImgSize = imglist.GetBitmap(0).GetHeight()
|
|
577
|
+
|
|
578
|
+
self._ImageList = imglist
|
|
579
|
+
parent = self.GetParent()
|
|
580
|
+
agwStyle = parent.GetAGWWindowStyleFlag()
|
|
581
|
+
parent.SetAGWWindowStyleFlag(agwStyle)
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
def GetImageList(self):
|
|
585
|
+
""" Return the image list for :class:`wx.ImageContainerBase`. """
|
|
586
|
+
|
|
587
|
+
return self._ImageList
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def GetImageSize(self):
|
|
591
|
+
""" Returns the image size inside the :class:`wx.ImageContainerBase` image list. """
|
|
592
|
+
|
|
593
|
+
return self._nImgSize
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
def FixTextSize(self, dc, text, maxWidth):
|
|
597
|
+
"""
|
|
598
|
+
Fixes the text, to fit `maxWidth` value. If the text length exceeds
|
|
599
|
+
`maxWidth` value this function truncates it and appends two dots at
|
|
600
|
+
the end. ("Long Long Long Text" might become "Long Long...").
|
|
601
|
+
|
|
602
|
+
:param `dc`: an instance of :class:`wx.DC`;
|
|
603
|
+
:param `text`: the text to fix/truncate;
|
|
604
|
+
:param `maxWidth`: the maximum allowed width for the text, in pixels.
|
|
605
|
+
"""
|
|
606
|
+
|
|
607
|
+
return ArtManager.Get().TruncateText(dc, text, maxWidth)
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
def CanDoBottomStyle(self):
|
|
611
|
+
"""
|
|
612
|
+
Allows the parent to examine the children type. Some implementation
|
|
613
|
+
(such as :class:`LabelBook`), does not support top/bottom images, only left/right.
|
|
614
|
+
"""
|
|
615
|
+
|
|
616
|
+
return False
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
def AddPage(self, caption, selected=False, imgIdx=-1):
|
|
620
|
+
"""
|
|
621
|
+
Adds a page to the container.
|
|
622
|
+
|
|
623
|
+
:param `caption`: specifies the text for the new tab;
|
|
624
|
+
:param `selected`: specifies whether the page should be selected;
|
|
625
|
+
:param `imgIdx`: specifies the optional image index for the new tab.
|
|
626
|
+
"""
|
|
627
|
+
|
|
628
|
+
self._pagesInfoVec.append(ImageInfo(caption, imgIdx))
|
|
629
|
+
if selected or len(self._pagesInfoVec) == 1:
|
|
630
|
+
self._nIndex = len(self._pagesInfoVec)-1
|
|
631
|
+
|
|
632
|
+
self.Refresh()
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
def InsertPage(self, page_idx, caption, selected=False, imgIdx=-1):
|
|
636
|
+
"""
|
|
637
|
+
Inserts a page into the container at the specified position.
|
|
638
|
+
|
|
639
|
+
:param `page_idx`: specifies the position for the new tab;
|
|
640
|
+
:param `caption`: specifies the text for the new tab;
|
|
641
|
+
:param `selected`: specifies whether the page should be selected;
|
|
642
|
+
:param `imgIdx`: specifies the optional image index for the new tab.
|
|
643
|
+
"""
|
|
644
|
+
|
|
645
|
+
self._pagesInfoVec.insert(page_idx, ImageInfo(caption, imgIdx))
|
|
646
|
+
if selected or len(self._pagesInfoVec) == 1:
|
|
647
|
+
self._nIndex = len(self._pagesInfoVec)-1
|
|
648
|
+
|
|
649
|
+
self.Refresh()
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
def SetPageImage(self, page, imgIdx):
|
|
653
|
+
"""
|
|
654
|
+
Sets the image for the given page.
|
|
655
|
+
|
|
656
|
+
:param `page`: the index of the tab;
|
|
657
|
+
:param `imgIdx`: specifies the optional image index for the tab.
|
|
658
|
+
"""
|
|
659
|
+
|
|
660
|
+
imgInfo = self._pagesInfoVec[page]
|
|
661
|
+
imgInfo.SetImageIndex(imgIdx)
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
def SetPageText(self, page, text):
|
|
665
|
+
"""
|
|
666
|
+
Sets the tab caption for the given page.
|
|
667
|
+
|
|
668
|
+
:param `page`: the index of the tab;
|
|
669
|
+
:param `text`: the new tab caption.
|
|
670
|
+
"""
|
|
671
|
+
|
|
672
|
+
imgInfo = self._pagesInfoVec[page]
|
|
673
|
+
imgInfo.SetCaption(text)
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
def GetPageImage(self, page):
|
|
677
|
+
"""
|
|
678
|
+
Returns the image index for the given page.
|
|
679
|
+
|
|
680
|
+
:param `page`: the index of the tab.
|
|
681
|
+
"""
|
|
682
|
+
|
|
683
|
+
imgInfo = self._pagesInfoVec[page]
|
|
684
|
+
return imgInfo.GetImageIndex()
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
def GetPageText(self, page):
|
|
688
|
+
"""
|
|
689
|
+
Returns the tab caption for the given page.
|
|
690
|
+
|
|
691
|
+
:param `page`: the index of the tab.
|
|
692
|
+
"""
|
|
693
|
+
|
|
694
|
+
imgInfo = self._pagesInfoVec[page]
|
|
695
|
+
return imgInfo.GetCaption()
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
def GetEnabled(self, page):
|
|
699
|
+
"""
|
|
700
|
+
Returns whether a tab is enabled or not.
|
|
701
|
+
|
|
702
|
+
:param `page`: an integer specifying the page index.
|
|
703
|
+
"""
|
|
704
|
+
|
|
705
|
+
if page >= len(self._pagesInfoVec):
|
|
706
|
+
return True # Adding a page - enabled by default
|
|
707
|
+
|
|
708
|
+
imgInfo = self._pagesInfoVec[page]
|
|
709
|
+
return imgInfo.GetEnabled()
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
def EnableTab(self, page, enabled=True):
|
|
713
|
+
"""
|
|
714
|
+
Enables or disables a tab.
|
|
715
|
+
|
|
716
|
+
:param `page`: an integer specifying the page index;
|
|
717
|
+
:param `enabled`: ``True`` to enable a tab, ``False`` to disable it.
|
|
718
|
+
"""
|
|
719
|
+
|
|
720
|
+
if page >= len(self._pagesInfoVec):
|
|
721
|
+
return
|
|
722
|
+
|
|
723
|
+
imgInfo = self._pagesInfoVec[page]
|
|
724
|
+
imgInfo.EnableTab(enabled)
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
def ClearAll(self):
|
|
728
|
+
""" Deletes all the pages in the container. """
|
|
729
|
+
|
|
730
|
+
self._pagesInfoVec = []
|
|
731
|
+
self._nIndex = wx.NOT_FOUND
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
def DoDeletePage(self, page):
|
|
735
|
+
"""
|
|
736
|
+
Does the actual page deletion.
|
|
737
|
+
|
|
738
|
+
:param `page`: the index of the tab.
|
|
739
|
+
"""
|
|
740
|
+
|
|
741
|
+
# Remove the page from the vector
|
|
742
|
+
book = self.GetParent()
|
|
743
|
+
self._pagesInfoVec.pop(page)
|
|
744
|
+
|
|
745
|
+
if self._nIndex >= page:
|
|
746
|
+
self._nIndex = self._nIndex - 1
|
|
747
|
+
|
|
748
|
+
# The delete page was the last first on the array,
|
|
749
|
+
# but the book still has more pages, so we set the
|
|
750
|
+
# active page to be the first one (0)
|
|
751
|
+
if self._nIndex < 0 and len(self._pagesInfoVec) > 0:
|
|
752
|
+
self._nIndex = 0
|
|
753
|
+
|
|
754
|
+
# Refresh the tabs
|
|
755
|
+
if self._nIndex >= 0:
|
|
756
|
+
|
|
757
|
+
book._bForceSelection = True
|
|
758
|
+
book.SetSelection(self._nIndex)
|
|
759
|
+
book._bForceSelection = False
|
|
760
|
+
|
|
761
|
+
if not self._pagesInfoVec:
|
|
762
|
+
# Erase the page container drawings
|
|
763
|
+
dc = wx.ClientDC(self)
|
|
764
|
+
dc.Clear()
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
def OnSize(self, event):
|
|
768
|
+
"""
|
|
769
|
+
Handles the ``wx.EVT_SIZE`` event for :class:`wx.ImageContainerBase`.
|
|
770
|
+
|
|
771
|
+
:param `event`: a :class:`wx.SizeEvent` event to be processed.
|
|
772
|
+
"""
|
|
773
|
+
|
|
774
|
+
self.Refresh() # Call on paint
|
|
775
|
+
event.Skip()
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
def OnEraseBackground(self, event):
|
|
779
|
+
"""
|
|
780
|
+
Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`wx.ImageContainerBase`.
|
|
781
|
+
|
|
782
|
+
:param `event`: a :class:`EraseEvent` event to be processed.
|
|
783
|
+
|
|
784
|
+
:note: This method is intentionally empty to reduce flicker.
|
|
785
|
+
"""
|
|
786
|
+
|
|
787
|
+
pass
|
|
788
|
+
|
|
789
|
+
|
|
790
|
+
def HitTest(self, pt):
|
|
791
|
+
"""
|
|
792
|
+
Returns the index of the tab at the specified position or ``wx.NOT_FOUND``
|
|
793
|
+
if ``None``, plus the flag style of :meth:`~ImageContainerBase.HitTest`.
|
|
794
|
+
|
|
795
|
+
:param `pt`: an instance of :class:`wx.Point`, to test for hits.
|
|
796
|
+
|
|
797
|
+
:return: The index of the tab at the specified position plus the hit test
|
|
798
|
+
flag, which can be one of the following bits:
|
|
799
|
+
|
|
800
|
+
====================== ======= ================================
|
|
801
|
+
HitTest Flags Value Description
|
|
802
|
+
====================== ======= ================================
|
|
803
|
+
``IMG_OVER_IMG`` 0 The mouse is over the tab icon
|
|
804
|
+
``IMG_OVER_PIN`` 1 The mouse is over the pin button
|
|
805
|
+
``IMG_OVER_EW_BORDER`` 2 The mouse is over the east-west book border
|
|
806
|
+
``IMG_NONE`` 3 Nowhere
|
|
807
|
+
====================== ======= ================================
|
|
808
|
+
|
|
809
|
+
"""
|
|
810
|
+
|
|
811
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
812
|
+
|
|
813
|
+
if style & INB_USE_PIN_BUTTON:
|
|
814
|
+
if self._pinBtnRect.Contains(pt):
|
|
815
|
+
return -1, IMG_OVER_PIN
|
|
816
|
+
|
|
817
|
+
for i in range(len(self._pagesInfoVec)):
|
|
818
|
+
|
|
819
|
+
if self._pagesInfoVec[i].GetPosition() == wx.Point(-1, -1):
|
|
820
|
+
break
|
|
821
|
+
|
|
822
|
+
# For Web Hover style, we test the TextRect
|
|
823
|
+
if not self.HasAGWFlag(INB_WEB_HILITE):
|
|
824
|
+
buttonRect = wx.Rect(self._pagesInfoVec[i].GetPosition(), self._pagesInfoVec[i].GetSize())
|
|
825
|
+
else:
|
|
826
|
+
buttonRect = self._pagesInfoVec[i].GetTextRect()
|
|
827
|
+
|
|
828
|
+
if buttonRect.Contains(pt):
|
|
829
|
+
return i, IMG_OVER_IMG
|
|
830
|
+
|
|
831
|
+
if self.PointOnSash(pt):
|
|
832
|
+
return -1, IMG_OVER_EW_BORDER
|
|
833
|
+
else:
|
|
834
|
+
return -1, IMG_NONE
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
def PointOnSash(self, pt):
|
|
838
|
+
"""
|
|
839
|
+
Tests whether pt is located on the sash.
|
|
840
|
+
|
|
841
|
+
:param `pt`: an instance of :class:`wx.Point`, to test for hits.
|
|
842
|
+
"""
|
|
843
|
+
|
|
844
|
+
# Check if we are on a the sash border
|
|
845
|
+
cltRect = self.GetClientRect()
|
|
846
|
+
|
|
847
|
+
if self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP):
|
|
848
|
+
if pt.x > cltRect.x + cltRect.width - 4:
|
|
849
|
+
return True
|
|
850
|
+
|
|
851
|
+
else:
|
|
852
|
+
if pt.x < 4:
|
|
853
|
+
return True
|
|
854
|
+
|
|
855
|
+
return False
|
|
856
|
+
|
|
857
|
+
|
|
858
|
+
def OnMouseLeftDown(self, event):
|
|
859
|
+
"""
|
|
860
|
+
Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`wx.ImageContainerBase`.
|
|
861
|
+
|
|
862
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
863
|
+
"""
|
|
864
|
+
|
|
865
|
+
newSelection = -1
|
|
866
|
+
event.Skip()
|
|
867
|
+
|
|
868
|
+
# Support for collapse/expand
|
|
869
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
870
|
+
if style & INB_USE_PIN_BUTTON:
|
|
871
|
+
|
|
872
|
+
if self._pinBtnRect.Contains(event.GetPosition()):
|
|
873
|
+
|
|
874
|
+
self._nPinButtonStatus = INB_PIN_PRESSED
|
|
875
|
+
dc = wx.ClientDC(self)
|
|
876
|
+
self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed)
|
|
877
|
+
return
|
|
878
|
+
|
|
879
|
+
# Incase panel is collapsed, there is nothing
|
|
880
|
+
# to check
|
|
881
|
+
if self._bCollapsed:
|
|
882
|
+
return
|
|
883
|
+
|
|
884
|
+
tabIdx, where = self.HitTest(event.GetPosition())
|
|
885
|
+
|
|
886
|
+
if where == IMG_OVER_IMG:
|
|
887
|
+
self._nHoveredImgIdx = -1
|
|
888
|
+
|
|
889
|
+
if tabIdx == -1:
|
|
890
|
+
return
|
|
891
|
+
|
|
892
|
+
self.GetParent().SetSelection(tabIdx)
|
|
893
|
+
|
|
894
|
+
|
|
895
|
+
def OnMouseLeaveWindow(self, event):
|
|
896
|
+
"""
|
|
897
|
+
Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`wx.ImageContainerBase`.
|
|
898
|
+
|
|
899
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
900
|
+
"""
|
|
901
|
+
|
|
902
|
+
bRepaint = self._nHoveredImgIdx != -1
|
|
903
|
+
self._nHoveredImgIdx = -1
|
|
904
|
+
|
|
905
|
+
# Make sure the pin button status is NONE
|
|
906
|
+
# incase we were in pin button style
|
|
907
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
908
|
+
|
|
909
|
+
if style & INB_USE_PIN_BUTTON:
|
|
910
|
+
|
|
911
|
+
self._nPinButtonStatus = INB_PIN_NONE
|
|
912
|
+
dc = wx.ClientDC(self)
|
|
913
|
+
self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed)
|
|
914
|
+
|
|
915
|
+
# Restore cursor
|
|
916
|
+
self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
|
|
917
|
+
|
|
918
|
+
if bRepaint:
|
|
919
|
+
self.Refresh()
|
|
920
|
+
|
|
921
|
+
|
|
922
|
+
def OnMouseLeftUp(self, event):
|
|
923
|
+
"""
|
|
924
|
+
Handles the ``wx.EVT_LEFT_UP`` event for :class:`wx.ImageContainerBase`.
|
|
925
|
+
|
|
926
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
927
|
+
"""
|
|
928
|
+
|
|
929
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
930
|
+
|
|
931
|
+
if style & INB_USE_PIN_BUTTON:
|
|
932
|
+
|
|
933
|
+
bIsLabelContainer = not self.CanDoBottomStyle()
|
|
934
|
+
|
|
935
|
+
if self._pinBtnRect.Contains(event.GetPosition()):
|
|
936
|
+
|
|
937
|
+
self._nPinButtonStatus = INB_PIN_NONE
|
|
938
|
+
self._bCollapsed = not self._bCollapsed
|
|
939
|
+
|
|
940
|
+
if self._bCollapsed:
|
|
941
|
+
|
|
942
|
+
# Save the current tab area width
|
|
943
|
+
self._tabAreaSize = self.GetSize()
|
|
944
|
+
|
|
945
|
+
if bIsLabelContainer:
|
|
946
|
+
|
|
947
|
+
self.SetSizeHints(20, self._tabAreaSize.y)
|
|
948
|
+
|
|
949
|
+
else:
|
|
950
|
+
|
|
951
|
+
if style & INB_BOTTOM or style & INB_TOP:
|
|
952
|
+
self.SetSizeHints(self._tabAreaSize.x, 20)
|
|
953
|
+
else:
|
|
954
|
+
self.SetSizeHints(20, self._tabAreaSize.y)
|
|
955
|
+
|
|
956
|
+
else:
|
|
957
|
+
|
|
958
|
+
if bIsLabelContainer:
|
|
959
|
+
|
|
960
|
+
self.SetSizeHints(self._tabAreaSize.x, -1)
|
|
961
|
+
|
|
962
|
+
else:
|
|
963
|
+
|
|
964
|
+
# Restore the tab area size
|
|
965
|
+
if style & INB_BOTTOM or style & INB_TOP:
|
|
966
|
+
self.SetSizeHints(-1, self._tabAreaSize.y)
|
|
967
|
+
else:
|
|
968
|
+
self.SetSizeHints(self._tabAreaSize.x, -1)
|
|
969
|
+
|
|
970
|
+
self.GetParent().GetSizer().Layout()
|
|
971
|
+
self.Refresh()
|
|
972
|
+
return
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
def OnMouseMove(self, event):
|
|
976
|
+
"""
|
|
977
|
+
Handles the ``wx.EVT_MOTION`` event for :class:`wx.ImageContainerBase`.
|
|
978
|
+
|
|
979
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
980
|
+
"""
|
|
981
|
+
|
|
982
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
983
|
+
if style & INB_USE_PIN_BUTTON:
|
|
984
|
+
|
|
985
|
+
# Check to see if we are in the pin button rect
|
|
986
|
+
if not self._pinBtnRect.Contains(event.GetPosition()) and self._nPinButtonStatus == INB_PIN_PRESSED:
|
|
987
|
+
|
|
988
|
+
self._nPinButtonStatus = INB_PIN_NONE
|
|
989
|
+
dc = wx.ClientDC(self)
|
|
990
|
+
self.DrawPin(dc, self._pinBtnRect, not self._bCollapsed)
|
|
991
|
+
|
|
992
|
+
imgIdx, where = self.HitTest(event.GetPosition())
|
|
993
|
+
|
|
994
|
+
# Allow hovering unless over current tab or tab is disabled
|
|
995
|
+
self._nHoveredImgIdx = -1
|
|
996
|
+
|
|
997
|
+
if imgIdx < len(self._pagesInfoVec) and self.GetEnabled(imgIdx) and imgIdx != self._nIndex:
|
|
998
|
+
self._nHoveredImgIdx = imgIdx
|
|
999
|
+
|
|
1000
|
+
if not self._bCollapsed:
|
|
1001
|
+
|
|
1002
|
+
if self._nHoveredImgIdx >= 0 and self.HasAGWFlag(INB_WEB_HILITE):
|
|
1003
|
+
|
|
1004
|
+
# Change the cursor to be Hand if we have the Web hover style set
|
|
1005
|
+
self.SetCursor(wx.Cursor(wx.CURSOR_HAND))
|
|
1006
|
+
|
|
1007
|
+
elif not self.PointOnSash(event.GetPosition()):
|
|
1008
|
+
|
|
1009
|
+
# Restore the cursor if we are not currently hovering the sash
|
|
1010
|
+
self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
|
|
1011
|
+
|
|
1012
|
+
self.Refresh()
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
def DrawPin(self, dc, rect, downPin):
|
|
1016
|
+
"""
|
|
1017
|
+
Draw a pin button, that allows collapsing of the image panel.
|
|
1018
|
+
|
|
1019
|
+
:param `dc`: an instance of :class:`wx.DC`;
|
|
1020
|
+
:param `rect`: the pin button client rectangle;
|
|
1021
|
+
:param `downPin`: ``True`` if the pin button is facing downwards, ``False``
|
|
1022
|
+
if it is facing leftwards.
|
|
1023
|
+
"""
|
|
1024
|
+
|
|
1025
|
+
# Set the bitmap according to the button status
|
|
1026
|
+
|
|
1027
|
+
if downPin:
|
|
1028
|
+
pinBmp = wx.Bitmap(pin_down_xpm)
|
|
1029
|
+
else:
|
|
1030
|
+
pinBmp = wx.Bitmap(pin_left_xpm)
|
|
1031
|
+
|
|
1032
|
+
xx = rect.x + 2
|
|
1033
|
+
|
|
1034
|
+
if self._nPinButtonStatus in [INB_PIN_HOVER, INB_PIN_NONE]:
|
|
1035
|
+
|
|
1036
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
1037
|
+
dc.SetPen(wx.BLACK_PEN)
|
|
1038
|
+
dc.DrawRectangle(xx, rect.y, 16, 16)
|
|
1039
|
+
|
|
1040
|
+
# Draw upper and left border with grey colour
|
|
1041
|
+
dc.SetPen(wx.WHITE_PEN)
|
|
1042
|
+
dc.DrawLine(xx, rect.y, xx + 16, rect.y)
|
|
1043
|
+
dc.DrawLine(xx, rect.y, xx, rect.y + 16)
|
|
1044
|
+
|
|
1045
|
+
elif self._nPinButtonStatus == INB_PIN_PRESSED:
|
|
1046
|
+
|
|
1047
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
1048
|
+
dc.SetPen(wx.LIGHT_GREY_PEN)
|
|
1049
|
+
dc.DrawRectangle(xx, rect.y, 16, 16)
|
|
1050
|
+
|
|
1051
|
+
# Draw upper and left border with grey colour
|
|
1052
|
+
dc.SetPen(wx.BLACK_PEN)
|
|
1053
|
+
dc.DrawLine(xx, rect.y, xx + 16, rect.y)
|
|
1054
|
+
dc.DrawLine(xx, rect.y, xx, rect.y + 16)
|
|
1055
|
+
|
|
1056
|
+
# Set the masking
|
|
1057
|
+
pinBmp.SetMask(wx.Mask(pinBmp, wx.WHITE))
|
|
1058
|
+
|
|
1059
|
+
# Draw the new bitmap
|
|
1060
|
+
dc.DrawBitmap(pinBmp, xx, rect.y, True)
|
|
1061
|
+
|
|
1062
|
+
# Save the pin rect
|
|
1063
|
+
self._pinBtnRect = rect
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
# ---------------------------------------------------------------------------- #
|
|
1067
|
+
# Class ImageContainer
|
|
1068
|
+
# ---------------------------------------------------------------------------- #
|
|
1069
|
+
|
|
1070
|
+
class ImageContainer(ImageContainerBase):
|
|
1071
|
+
"""
|
|
1072
|
+
Base class for :class:`FlatImageBook` image container.
|
|
1073
|
+
"""
|
|
1074
|
+
|
|
1075
|
+
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
1076
|
+
style=0, agwStyle=0, name="ImageContainer"):
|
|
1077
|
+
"""
|
|
1078
|
+
Default class constructor.
|
|
1079
|
+
|
|
1080
|
+
:param `parent`: parent window. Must not be ``None``;
|
|
1081
|
+
:param `id`: window identifier. A value of -1 indicates a default value;
|
|
1082
|
+
:param `pos`: the control position. A value of (-1, -1) indicates a default position,
|
|
1083
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
1084
|
+
:param `size`: the control size. A value of (-1, -1) indicates a default size,
|
|
1085
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
1086
|
+
:param `style`: the underlying :class:`Panel` window style;
|
|
1087
|
+
:param `agwStyle`: the AGW-specific window style. This can be a combination of the
|
|
1088
|
+
following bits:
|
|
1089
|
+
|
|
1090
|
+
=========================== =========== ==================================================
|
|
1091
|
+
Window Styles Hex Value Description
|
|
1092
|
+
=========================== =========== ==================================================
|
|
1093
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
1094
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
1095
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
1096
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
1097
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
1098
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
1099
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
1100
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
1101
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
1102
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
1103
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
1104
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
1105
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
1106
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
1107
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
1108
|
+
=========================== =========== ==================================================
|
|
1109
|
+
|
|
1110
|
+
:param `name`: the window name.
|
|
1111
|
+
"""
|
|
1112
|
+
|
|
1113
|
+
ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
|
|
1114
|
+
|
|
1115
|
+
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
|
1116
|
+
self.Bind(wx.EVT_SIZE, self.OnSize)
|
|
1117
|
+
self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
|
|
1118
|
+
self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
|
|
1119
|
+
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
|
|
1120
|
+
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
|
|
1121
|
+
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow)
|
|
1122
|
+
|
|
1123
|
+
|
|
1124
|
+
def OnSize(self, event):
|
|
1125
|
+
"""
|
|
1126
|
+
Handles the ``wx.EVT_SIZE`` event for :class:`wx.ImageContainer`.
|
|
1127
|
+
|
|
1128
|
+
:param `event`: a :class:`wx.SizeEvent` event to be processed.
|
|
1129
|
+
"""
|
|
1130
|
+
|
|
1131
|
+
ImageContainerBase.OnSize(self, event)
|
|
1132
|
+
event.Skip()
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
def OnMouseLeftDown(self, event):
|
|
1136
|
+
"""
|
|
1137
|
+
Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`wx.ImageContainer`.
|
|
1138
|
+
|
|
1139
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1140
|
+
"""
|
|
1141
|
+
|
|
1142
|
+
ImageContainerBase.OnMouseLeftDown(self, event)
|
|
1143
|
+
event.Skip()
|
|
1144
|
+
|
|
1145
|
+
|
|
1146
|
+
def OnMouseLeftUp(self, event):
|
|
1147
|
+
"""
|
|
1148
|
+
Handles the ``wx.EVT_LEFT_UP`` event for :class:`wx.ImageContainer`.
|
|
1149
|
+
|
|
1150
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1151
|
+
"""
|
|
1152
|
+
|
|
1153
|
+
ImageContainerBase.OnMouseLeftUp(self, event)
|
|
1154
|
+
event.Skip()
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
def OnEraseBackground(self, event):
|
|
1158
|
+
"""
|
|
1159
|
+
Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`wx.ImageContainer`.
|
|
1160
|
+
|
|
1161
|
+
:param `event`: a :class:`EraseEvent` event to be processed.
|
|
1162
|
+
"""
|
|
1163
|
+
|
|
1164
|
+
ImageContainerBase.OnEraseBackground(self, event)
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
def OnMouseMove(self, event):
|
|
1168
|
+
"""
|
|
1169
|
+
Handles the ``wx.EVT_MOTION`` event for :class:`wx.ImageContainer`.
|
|
1170
|
+
|
|
1171
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1172
|
+
"""
|
|
1173
|
+
|
|
1174
|
+
ImageContainerBase.OnMouseMove(self, event)
|
|
1175
|
+
event.Skip()
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
def OnMouseLeaveWindow(self, event):
|
|
1179
|
+
"""
|
|
1180
|
+
Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`wx.ImageContainer`.
|
|
1181
|
+
|
|
1182
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1183
|
+
"""
|
|
1184
|
+
|
|
1185
|
+
ImageContainerBase.OnMouseLeaveWindow(self, event)
|
|
1186
|
+
event.Skip()
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
def CanDoBottomStyle(self):
|
|
1190
|
+
"""
|
|
1191
|
+
Allows the parent to examine the children type. Some implementation
|
|
1192
|
+
(such as :class:`LabelBook`), does not support top/bottom images, only left/right.
|
|
1193
|
+
"""
|
|
1194
|
+
|
|
1195
|
+
return True
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
def OnPaint(self, event):
|
|
1199
|
+
"""
|
|
1200
|
+
Handles the ``wx.EVT_PAINT`` event for :class:`wx.ImageContainer`.
|
|
1201
|
+
|
|
1202
|
+
:param `event`: a :class:`PaintEvent` event to be processed.
|
|
1203
|
+
"""
|
|
1204
|
+
|
|
1205
|
+
dc = wx.BufferedPaintDC(self)
|
|
1206
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
1207
|
+
|
|
1208
|
+
backBrush = wx.WHITE_BRUSH
|
|
1209
|
+
if style & INB_BORDER:
|
|
1210
|
+
borderPen = wx.Pen(wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW))
|
|
1211
|
+
else:
|
|
1212
|
+
borderPen = wx.TRANSPARENT_PEN
|
|
1213
|
+
|
|
1214
|
+
size = self.GetSize()
|
|
1215
|
+
|
|
1216
|
+
# Background
|
|
1217
|
+
dc.SetBrush(backBrush)
|
|
1218
|
+
|
|
1219
|
+
borderPen.SetWidth(1)
|
|
1220
|
+
dc.SetPen(borderPen)
|
|
1221
|
+
dc.DrawRectangle(0, 0, size.x, size.y)
|
|
1222
|
+
bUsePin = (style & INB_USE_PIN_BUTTON and [True] or [False])[0]
|
|
1223
|
+
|
|
1224
|
+
if bUsePin:
|
|
1225
|
+
|
|
1226
|
+
# Draw the pin button
|
|
1227
|
+
clientRect = self.GetClientRect()
|
|
1228
|
+
pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
|
|
1229
|
+
self.DrawPin(dc, pinRect, not self._bCollapsed)
|
|
1230
|
+
|
|
1231
|
+
if self._bCollapsed:
|
|
1232
|
+
return
|
|
1233
|
+
|
|
1234
|
+
borderPen = wx.BLACK_PEN
|
|
1235
|
+
borderPen.SetWidth(1)
|
|
1236
|
+
dc.SetPen(borderPen)
|
|
1237
|
+
dc.DrawLine(0, size.y, size.x, size.y)
|
|
1238
|
+
dc.DrawPoint(0, size.y)
|
|
1239
|
+
|
|
1240
|
+
clientSize = 0
|
|
1241
|
+
bUseYcoord = (style & INB_RIGHT or style & INB_LEFT)
|
|
1242
|
+
|
|
1243
|
+
if bUseYcoord:
|
|
1244
|
+
clientSize = size.GetHeight()
|
|
1245
|
+
else:
|
|
1246
|
+
clientSize = size.GetWidth()
|
|
1247
|
+
|
|
1248
|
+
# We reserver 20 pixels for the 'pin' button
|
|
1249
|
+
|
|
1250
|
+
# The drawing of the images start position. This is
|
|
1251
|
+
# depenedent of the style, especially when Pin button
|
|
1252
|
+
# style is requested
|
|
1253
|
+
|
|
1254
|
+
if bUsePin:
|
|
1255
|
+
if style & INB_TOP or style & INB_BOTTOM:
|
|
1256
|
+
pos = (style & INB_BORDER and [0] or [1])[0]
|
|
1257
|
+
else:
|
|
1258
|
+
pos = (style & INB_BORDER and [20] or [21])[0]
|
|
1259
|
+
else:
|
|
1260
|
+
pos = (style & INB_BORDER and [0] or [1])[0]
|
|
1261
|
+
|
|
1262
|
+
nPadding = 4 # Pad text with 2 pixels on the left and right
|
|
1263
|
+
nTextPaddingLeft = 2
|
|
1264
|
+
|
|
1265
|
+
count = 0
|
|
1266
|
+
normalFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
1267
|
+
boldFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
1268
|
+
boldFont.SetWeight(wx.BOLD)
|
|
1269
|
+
|
|
1270
|
+
for i in range(len(self._pagesInfoVec)):
|
|
1271
|
+
|
|
1272
|
+
count = count + 1
|
|
1273
|
+
|
|
1274
|
+
# incase the 'fit button' style is applied, we set the rectangle width to the
|
|
1275
|
+
# text width plus padding
|
|
1276
|
+
# Incase the style IS applied, but the style is either LEFT or RIGHT
|
|
1277
|
+
# we ignore it
|
|
1278
|
+
dc.SetFont(normalFont)
|
|
1279
|
+
|
|
1280
|
+
if style & INB_BOLD_TAB_SELECTION and self._nIndex == i:
|
|
1281
|
+
dc.SetFont(boldFont)
|
|
1282
|
+
|
|
1283
|
+
textWidth, textHeight = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption())
|
|
1284
|
+
|
|
1285
|
+
# Default values for the surrounding rectangle
|
|
1286
|
+
# around a button
|
|
1287
|
+
rectWidth = self._nImgSize * 2 # To avoid the rectangle to 'touch' the borders
|
|
1288
|
+
rectHeight = self._nImgSize * 2
|
|
1289
|
+
|
|
1290
|
+
# In case the style requires non-fixed button (fit to text)
|
|
1291
|
+
# recalc the rectangle width
|
|
1292
|
+
if style & INB_FIT_BUTTON and \
|
|
1293
|
+
not ((style & INB_LEFT) or (style & INB_RIGHT)) and \
|
|
1294
|
+
not self._pagesInfoVec[i].GetCaption() == "" and \
|
|
1295
|
+
not (style & INB_SHOW_ONLY_IMAGES):
|
|
1296
|
+
|
|
1297
|
+
rectWidth = ((textWidth + nPadding * 2) > rectWidth and [nPadding * 2 + textWidth] or [rectWidth])[0]
|
|
1298
|
+
|
|
1299
|
+
# Make the width an even number
|
|
1300
|
+
if rectWidth % 2 != 0:
|
|
1301
|
+
rectWidth += 1
|
|
1302
|
+
|
|
1303
|
+
# Check that we have enough space to draw the button
|
|
1304
|
+
# If Pin button is used, consider its space as well (applicable for top/botton style)
|
|
1305
|
+
# since in the left/right, its size is already considered in 'pos'
|
|
1306
|
+
pinBtnSize = (bUsePin and [20] or [0])[0]
|
|
1307
|
+
|
|
1308
|
+
if pos + rectWidth + pinBtnSize > clientSize:
|
|
1309
|
+
break
|
|
1310
|
+
|
|
1311
|
+
# Calculate the button rectangle
|
|
1312
|
+
modRectWidth = ((style & INB_LEFT or style & INB_RIGHT) and [rectWidth - 2] or [rectWidth])[0]
|
|
1313
|
+
modRectHeight = ((style & INB_LEFT or style & INB_RIGHT) and [rectHeight] or [rectHeight - 2])[0]
|
|
1314
|
+
|
|
1315
|
+
if bUseYcoord:
|
|
1316
|
+
buttonRect = wx.Rect(1, pos, modRectWidth, modRectHeight)
|
|
1317
|
+
else:
|
|
1318
|
+
buttonRect = wx.Rect(pos , 1, modRectWidth, modRectHeight)
|
|
1319
|
+
|
|
1320
|
+
# Check if we need to draw a rectangle around the button
|
|
1321
|
+
if self._nIndex == i:
|
|
1322
|
+
|
|
1323
|
+
# Set the colours
|
|
1324
|
+
penColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION)
|
|
1325
|
+
brushColour = ArtManager.Get().LightColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 75)
|
|
1326
|
+
|
|
1327
|
+
dc.SetPen(wx.Pen(penColour))
|
|
1328
|
+
dc.SetBrush(wx.Brush(brushColour))
|
|
1329
|
+
|
|
1330
|
+
# Fix the surrounding of the rect if border is set
|
|
1331
|
+
if style & INB_BORDER:
|
|
1332
|
+
|
|
1333
|
+
if style & INB_TOP or style & INB_BOTTOM:
|
|
1334
|
+
buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height)
|
|
1335
|
+
else:
|
|
1336
|
+
buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1)
|
|
1337
|
+
|
|
1338
|
+
dc.DrawRectangle(buttonRect)
|
|
1339
|
+
|
|
1340
|
+
if self._nHoveredImgIdx == i:
|
|
1341
|
+
|
|
1342
|
+
# Set the colours
|
|
1343
|
+
penColour = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION)
|
|
1344
|
+
brushColour = ArtManager.Get().LightColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION), 90)
|
|
1345
|
+
|
|
1346
|
+
dc.SetPen(wx.Pen(penColour))
|
|
1347
|
+
dc.SetBrush(wx.Brush(brushColour))
|
|
1348
|
+
|
|
1349
|
+
# Fix the surrounding of the rect if border is set
|
|
1350
|
+
if style & INB_BORDER:
|
|
1351
|
+
|
|
1352
|
+
if style & INB_TOP or style & INB_BOTTOM:
|
|
1353
|
+
buttonRect = wx.Rect(buttonRect.x + 1, buttonRect.y, buttonRect.width - 1, buttonRect.height)
|
|
1354
|
+
else:
|
|
1355
|
+
buttonRect = wx.Rect(buttonRect.x, buttonRect.y + 1, buttonRect.width, buttonRect.height - 1)
|
|
1356
|
+
|
|
1357
|
+
dc.DrawRectangle(buttonRect)
|
|
1358
|
+
|
|
1359
|
+
if bUseYcoord:
|
|
1360
|
+
rect = wx.Rect(0, pos, rectWidth, rectWidth)
|
|
1361
|
+
else:
|
|
1362
|
+
rect = wx.Rect(pos, 0, rectWidth, rectWidth)
|
|
1363
|
+
|
|
1364
|
+
# Incase user set both flags:
|
|
1365
|
+
# INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES
|
|
1366
|
+
# We override them to display both
|
|
1367
|
+
|
|
1368
|
+
if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES:
|
|
1369
|
+
|
|
1370
|
+
style ^= INB_SHOW_ONLY_TEXT
|
|
1371
|
+
style ^= INB_SHOW_ONLY_IMAGES
|
|
1372
|
+
self.GetParent().SetAGWWindowStyleFlag(style)
|
|
1373
|
+
|
|
1374
|
+
# Draw the caption and text
|
|
1375
|
+
imgTopPadding = 10
|
|
1376
|
+
if not style & INB_SHOW_ONLY_TEXT and self._pagesInfoVec[i].GetImageIndex() != -1:
|
|
1377
|
+
|
|
1378
|
+
if bUseYcoord:
|
|
1379
|
+
|
|
1380
|
+
imgXcoord = self._nImgSize / 2
|
|
1381
|
+
imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos + self._nImgSize / 2] or [pos + imgTopPadding])[0]
|
|
1382
|
+
|
|
1383
|
+
else:
|
|
1384
|
+
|
|
1385
|
+
imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2)
|
|
1386
|
+
imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding])[0]
|
|
1387
|
+
|
|
1388
|
+
self._ImageList.Draw(self._pagesInfoVec[i].GetImageIndex(), dc,
|
|
1389
|
+
int(imgXcoord), int(imgYcoord),
|
|
1390
|
+
wx.IMAGELIST_DRAW_TRANSPARENT, True)
|
|
1391
|
+
|
|
1392
|
+
# Draw the text
|
|
1393
|
+
if not style & INB_SHOW_ONLY_IMAGES and not self._pagesInfoVec[i].GetCaption() == "":
|
|
1394
|
+
|
|
1395
|
+
if style & INB_BOLD_TAB_SELECTION and self._nIndex == i:
|
|
1396
|
+
dc.SetFont(boldFont)
|
|
1397
|
+
else:
|
|
1398
|
+
dc.SetFont(normalFont)
|
|
1399
|
+
|
|
1400
|
+
# Check if the text can fit the size of the rectangle,
|
|
1401
|
+
# if not truncate it
|
|
1402
|
+
fixedText = self._pagesInfoVec[i].GetCaption()
|
|
1403
|
+
if not style & INB_FIT_BUTTON or (style & INB_LEFT or (style & INB_RIGHT)):
|
|
1404
|
+
|
|
1405
|
+
fixedText = self.FixTextSize(dc, self._pagesInfoVec[i].GetCaption(), self._nImgSize *2 - 4)
|
|
1406
|
+
|
|
1407
|
+
# Update the length of the text
|
|
1408
|
+
textWidth, textHeight = dc.GetTextExtent(fixedText)
|
|
1409
|
+
|
|
1410
|
+
if bUseYcoord:
|
|
1411
|
+
|
|
1412
|
+
textOffsetX = ((rectWidth - textWidth) / 2 )
|
|
1413
|
+
textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or \
|
|
1414
|
+
[pos + ((self._nImgSize * 2 - textHeight) / 2 )])[0]
|
|
1415
|
+
|
|
1416
|
+
else:
|
|
1417
|
+
|
|
1418
|
+
textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft
|
|
1419
|
+
textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or \
|
|
1420
|
+
[((self._nImgSize * 2 - textHeight) / 2 )])[0]
|
|
1421
|
+
|
|
1422
|
+
dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
|
|
1423
|
+
dc.DrawText(fixedText, int(textOffsetX), int(textOffsetY))
|
|
1424
|
+
|
|
1425
|
+
# Update the page info
|
|
1426
|
+
self._pagesInfoVec[i].SetPosition(buttonRect.GetPosition())
|
|
1427
|
+
self._pagesInfoVec[i].SetSize(buttonRect.GetSize())
|
|
1428
|
+
|
|
1429
|
+
pos += rectWidth
|
|
1430
|
+
|
|
1431
|
+
# Update all buttons that can not fit into the screen as non-visible
|
|
1432
|
+
for ii in range(count, len(self._pagesInfoVec)):
|
|
1433
|
+
self._pagesInfoVec[ii].SetPosition(wx.Point(-1, -1))
|
|
1434
|
+
|
|
1435
|
+
# Draw the pin button
|
|
1436
|
+
if bUsePin:
|
|
1437
|
+
|
|
1438
|
+
clientRect = self.GetClientRect()
|
|
1439
|
+
pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
|
|
1440
|
+
self.DrawPin(dc, pinRect, not self._bCollapsed)
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
# ---------------------------------------------------------------------------- #
|
|
1444
|
+
# Class LabelContainer
|
|
1445
|
+
# ---------------------------------------------------------------------------- #
|
|
1446
|
+
|
|
1447
|
+
class LabelContainer(ImageContainerBase):
|
|
1448
|
+
""" Base class for :class:`LabelBook`. """
|
|
1449
|
+
|
|
1450
|
+
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
1451
|
+
style=0, agwStyle=0, name="LabelContainer"):
|
|
1452
|
+
"""
|
|
1453
|
+
Default class constructor.
|
|
1454
|
+
|
|
1455
|
+
:param `parent`: parent window. Must not be ``None``;
|
|
1456
|
+
:param `id`: window identifier. A value of -1 indicates a default value;
|
|
1457
|
+
:param `pos`: the control position. A value of (-1, -1) indicates a default position,
|
|
1458
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
1459
|
+
:param `size`: the control size. A value of (-1, -1) indicates a default size,
|
|
1460
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
1461
|
+
:param `style`: the underlying :class:`Panel` window style;
|
|
1462
|
+
:param `agwStyle`: the AGW-specific window style. This can be a combination of the
|
|
1463
|
+
following bits:
|
|
1464
|
+
|
|
1465
|
+
=========================== =========== ==================================================
|
|
1466
|
+
Window Styles Hex Value Description
|
|
1467
|
+
=========================== =========== ==================================================
|
|
1468
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
1469
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
1470
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
1471
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
1472
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
1473
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
1474
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
1475
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
1476
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
1477
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
1478
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
1479
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
1480
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
1481
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
1482
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
1483
|
+
=========================== =========== ==================================================
|
|
1484
|
+
|
|
1485
|
+
:param `name`: the window name.
|
|
1486
|
+
"""
|
|
1487
|
+
|
|
1488
|
+
ImageContainerBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
|
|
1489
|
+
self._nTabAreaWidth = 100
|
|
1490
|
+
self._oldCursor = wx.NullCursor
|
|
1491
|
+
self._coloursMap = {}
|
|
1492
|
+
self._skin = wx.NullBitmap
|
|
1493
|
+
self._sashRect = wx.Rect()
|
|
1494
|
+
|
|
1495
|
+
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
|
1496
|
+
self.Bind(wx.EVT_SIZE, self.OnSize)
|
|
1497
|
+
self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
|
|
1498
|
+
self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
|
|
1499
|
+
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
|
|
1500
|
+
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnMouseLeaveWindow)
|
|
1501
|
+
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
def OnSize(self, event):
|
|
1505
|
+
"""
|
|
1506
|
+
Handles the ``wx.EVT_SIZE`` event for :class:`LabelContainer`.
|
|
1507
|
+
|
|
1508
|
+
:param `event`: a :class:`wx.SizeEvent` event to be processed.
|
|
1509
|
+
"""
|
|
1510
|
+
|
|
1511
|
+
ImageContainerBase.OnSize(self, event)
|
|
1512
|
+
event.Skip()
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
def OnEraseBackground(self, event):
|
|
1516
|
+
"""
|
|
1517
|
+
Handles the ``wx.EVT_ERASE_BACKGROUND`` event for :class:`LabelContainer`.
|
|
1518
|
+
|
|
1519
|
+
:param `event`: a :class:`EraseEvent` event to be processed.
|
|
1520
|
+
"""
|
|
1521
|
+
|
|
1522
|
+
ImageContainerBase.OnEraseBackground(self, event)
|
|
1523
|
+
|
|
1524
|
+
|
|
1525
|
+
def GetTabAreaWidth(self):
|
|
1526
|
+
""" Returns the width of the tab area. """
|
|
1527
|
+
|
|
1528
|
+
return self._nTabAreaWidth
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
def SetTabAreaWidth(self, width):
|
|
1532
|
+
"""
|
|
1533
|
+
Sets the width of the tab area.
|
|
1534
|
+
|
|
1535
|
+
:param `width`: the width of the tab area, in pixels.
|
|
1536
|
+
"""
|
|
1537
|
+
|
|
1538
|
+
self._nTabAreaWidth = width
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
def CanDoBottomStyle(self):
|
|
1542
|
+
"""
|
|
1543
|
+
Allows the parent to examine the children type. Some implementation
|
|
1544
|
+
(such as :class:`LabelBook`), does not support top/bottom images, only left/right.
|
|
1545
|
+
"""
|
|
1546
|
+
|
|
1547
|
+
return False
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
def SetBackgroundBitmap(self, bmp):
|
|
1551
|
+
"""
|
|
1552
|
+
Sets the background bitmap for the control.
|
|
1553
|
+
|
|
1554
|
+
:param `bmp`: a valid :class:`wx.Bitmap` object.
|
|
1555
|
+
"""
|
|
1556
|
+
|
|
1557
|
+
self._skin = bmp
|
|
1558
|
+
|
|
1559
|
+
|
|
1560
|
+
def OnPaint(self, event):
|
|
1561
|
+
"""
|
|
1562
|
+
Handles the ``wx.EVT_PAINT`` event for :class:`LabelContainer`.
|
|
1563
|
+
|
|
1564
|
+
:param `event`: a :class:`PaintEvent` event to be processed.
|
|
1565
|
+
"""
|
|
1566
|
+
|
|
1567
|
+
style = self.GetParent().GetAGWWindowStyleFlag()
|
|
1568
|
+
|
|
1569
|
+
dc = wx.BufferedPaintDC(self)
|
|
1570
|
+
backBrush = wx.Brush(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR])
|
|
1571
|
+
if self.HasAGWFlag(INB_BORDER):
|
|
1572
|
+
borderPen = wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR])
|
|
1573
|
+
else:
|
|
1574
|
+
borderPen = wx.TRANSPARENT_PEN
|
|
1575
|
+
|
|
1576
|
+
size = self.GetSize()
|
|
1577
|
+
|
|
1578
|
+
# Set the pen & brush
|
|
1579
|
+
dc.SetBrush(backBrush)
|
|
1580
|
+
dc.SetPen(borderPen)
|
|
1581
|
+
|
|
1582
|
+
# In case user set both flags, we override them to display both
|
|
1583
|
+
# INB_SHOW_ONLY_TEXT and INB_SHOW_ONLY_IMAGES
|
|
1584
|
+
if style & INB_SHOW_ONLY_TEXT and style & INB_SHOW_ONLY_IMAGES:
|
|
1585
|
+
|
|
1586
|
+
style ^= INB_SHOW_ONLY_TEXT
|
|
1587
|
+
style ^= INB_SHOW_ONLY_IMAGES
|
|
1588
|
+
self.GetParent().SetAGWWindowStyleFlag(style)
|
|
1589
|
+
|
|
1590
|
+
if self.HasAGWFlag(INB_GRADIENT_BACKGROUND) and not self._skin.IsOk():
|
|
1591
|
+
|
|
1592
|
+
# Draw gradient in the background area
|
|
1593
|
+
startColour = self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]
|
|
1594
|
+
endColour = ArtManager.Get().LightColour(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR], 50)
|
|
1595
|
+
ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(0, 0, size.x // 2, size.y), startColour, endColour, False)
|
|
1596
|
+
ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(size.x // 2, 0, size.x // 2, size.y), endColour, startColour, False)
|
|
1597
|
+
|
|
1598
|
+
else:
|
|
1599
|
+
|
|
1600
|
+
# Draw the border and background
|
|
1601
|
+
if self._skin.IsOk():
|
|
1602
|
+
|
|
1603
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
1604
|
+
self.DrawBackgroundBitmap(dc)
|
|
1605
|
+
|
|
1606
|
+
dc.DrawRectangle(wx.Rect(0, 0, size.x, size.y))
|
|
1607
|
+
|
|
1608
|
+
# Draw border
|
|
1609
|
+
if self.HasAGWFlag(INB_BORDER) and self.HasAGWFlag(INB_GRADIENT_BACKGROUND):
|
|
1610
|
+
|
|
1611
|
+
# Just draw the border with transparent brush
|
|
1612
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
1613
|
+
dc.DrawRectangle(wx.Rect(0, 0, size.x, size.y))
|
|
1614
|
+
|
|
1615
|
+
bUsePin = (self.HasAGWFlag(INB_USE_PIN_BUTTON) and [True] or [False])[0]
|
|
1616
|
+
|
|
1617
|
+
if bUsePin:
|
|
1618
|
+
|
|
1619
|
+
# Draw the pin button
|
|
1620
|
+
clientRect = self.GetClientRect()
|
|
1621
|
+
pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
|
|
1622
|
+
self.DrawPin(dc, pinRect, not self._bCollapsed)
|
|
1623
|
+
|
|
1624
|
+
if self._bCollapsed:
|
|
1625
|
+
return
|
|
1626
|
+
|
|
1627
|
+
dc.SetPen(wx.BLACK_PEN)
|
|
1628
|
+
self.SetSizeHints(self._nTabAreaWidth, -1)
|
|
1629
|
+
|
|
1630
|
+
# We reserve 20 pixels for the pin button
|
|
1631
|
+
posy = 20
|
|
1632
|
+
count = 0
|
|
1633
|
+
|
|
1634
|
+
for i in range(len(self._pagesInfoVec)):
|
|
1635
|
+
count = count+1
|
|
1636
|
+
# Default values for the surrounding rectangle
|
|
1637
|
+
# around a button
|
|
1638
|
+
rectWidth = self._nTabAreaWidth
|
|
1639
|
+
|
|
1640
|
+
if self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
|
|
1641
|
+
font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
1642
|
+
font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple())
|
|
1643
|
+
|
|
1644
|
+
if self.GetParent().GetFontBold():
|
|
1645
|
+
font.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
1646
|
+
elif self.HasAGWFlag(INB_BOLD_TAB_SELECTION) and self._nIndex == i:
|
|
1647
|
+
font.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
1648
|
+
|
|
1649
|
+
dc.SetFont(font)
|
|
1650
|
+
w, h = dc.GetTextExtent(self._pagesInfoVec[i].GetCaption())
|
|
1651
|
+
rectHeight = h * 2
|
|
1652
|
+
else:
|
|
1653
|
+
rectHeight = self._nImgSize * 2
|
|
1654
|
+
|
|
1655
|
+
# Check that we have enough space to draw the button
|
|
1656
|
+
if posy + rectHeight > size.GetHeight():
|
|
1657
|
+
break
|
|
1658
|
+
|
|
1659
|
+
# Calculate the button rectangle
|
|
1660
|
+
posx = 0
|
|
1661
|
+
|
|
1662
|
+
buttonRect = wx.Rect(posx, posy, rectWidth, rectHeight)
|
|
1663
|
+
indx = self._pagesInfoVec[i].GetImageIndex()
|
|
1664
|
+
|
|
1665
|
+
if indx == -1:
|
|
1666
|
+
bmp = wx.NullBitmap
|
|
1667
|
+
else:
|
|
1668
|
+
bmp = self._ImageList.GetBitmap(indx)
|
|
1669
|
+
|
|
1670
|
+
self.DrawLabel(dc, buttonRect, self._pagesInfoVec[i].GetCaption(), bmp,
|
|
1671
|
+
self._pagesInfoVec[i], self.HasAGWFlag(INB_LEFT) or self.HasAGWFlag(INB_TOP),
|
|
1672
|
+
i, self._nIndex == i, self._nHoveredImgIdx == i)
|
|
1673
|
+
|
|
1674
|
+
posy += rectHeight
|
|
1675
|
+
|
|
1676
|
+
# Update all buttons that can not fit into the screen as non-visible
|
|
1677
|
+
for ii in range(count, len(self._pagesInfoVec)):
|
|
1678
|
+
self._pagesInfoVec[i].SetPosition(wx.Point(-1, -1))
|
|
1679
|
+
|
|
1680
|
+
if bUsePin:
|
|
1681
|
+
|
|
1682
|
+
clientRect = self.GetClientRect()
|
|
1683
|
+
pinRect = wx.Rect(clientRect.GetX() + clientRect.GetWidth() - 20, 2, 20, 20)
|
|
1684
|
+
self.DrawPin(dc, pinRect, not self._bCollapsed)
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
def DrawBackgroundBitmap(self, dc):
|
|
1688
|
+
"""
|
|
1689
|
+
Draws a bitmap as the background of the control.
|
|
1690
|
+
|
|
1691
|
+
:param `dc`: an instance of :class:`wx.DC`.
|
|
1692
|
+
"""
|
|
1693
|
+
|
|
1694
|
+
clientRect = self.GetClientRect()
|
|
1695
|
+
width = clientRect.GetWidth()
|
|
1696
|
+
height = clientRect.GetHeight()
|
|
1697
|
+
coveredY = coveredX = 0
|
|
1698
|
+
xstep = self._skin.GetWidth()
|
|
1699
|
+
ystep = self._skin.GetHeight()
|
|
1700
|
+
bmpRect = wx.Rect(0, 0, xstep, ystep)
|
|
1701
|
+
if bmpRect != clientRect:
|
|
1702
|
+
|
|
1703
|
+
mem_dc = wx.MemoryDC()
|
|
1704
|
+
bmp = wx.Bitmap(width, height)
|
|
1705
|
+
mem_dc.SelectObject(bmp)
|
|
1706
|
+
|
|
1707
|
+
while coveredY < height:
|
|
1708
|
+
|
|
1709
|
+
while coveredX < width:
|
|
1710
|
+
|
|
1711
|
+
mem_dc.DrawBitmap(self._skin, coveredX, coveredY, True)
|
|
1712
|
+
coveredX += xstep
|
|
1713
|
+
|
|
1714
|
+
coveredX = 0
|
|
1715
|
+
coveredY += ystep
|
|
1716
|
+
|
|
1717
|
+
mem_dc.SelectObject(wx.NullBitmap)
|
|
1718
|
+
#self._skin = bmp
|
|
1719
|
+
dc.DrawBitmap(bmp, 0, 0)
|
|
1720
|
+
|
|
1721
|
+
else:
|
|
1722
|
+
|
|
1723
|
+
dc.DrawBitmap(self._skin, 0, 0)
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
def OnMouseLeftUp(self, event):
|
|
1727
|
+
"""
|
|
1728
|
+
Handles the ``wx.EVT_LEFT_UP`` event for :class:`LabelContainer`.
|
|
1729
|
+
|
|
1730
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1731
|
+
"""
|
|
1732
|
+
|
|
1733
|
+
if self.HasAGWFlag(INB_NO_RESIZE):
|
|
1734
|
+
|
|
1735
|
+
ImageContainerBase.OnMouseLeftUp(self, event)
|
|
1736
|
+
return
|
|
1737
|
+
|
|
1738
|
+
if self.HasCapture():
|
|
1739
|
+
self.ReleaseMouse()
|
|
1740
|
+
|
|
1741
|
+
# Sash was being dragged?
|
|
1742
|
+
if not self._sashRect.IsEmpty():
|
|
1743
|
+
|
|
1744
|
+
# Remove sash
|
|
1745
|
+
ArtManager.Get().DrawDragSash(self._sashRect)
|
|
1746
|
+
self.Resize(event)
|
|
1747
|
+
|
|
1748
|
+
self._sashRect = wx.Rect()
|
|
1749
|
+
return
|
|
1750
|
+
|
|
1751
|
+
self._sashRect = wx.Rect()
|
|
1752
|
+
|
|
1753
|
+
# Restore cursor
|
|
1754
|
+
if self._oldCursor.IsOk():
|
|
1755
|
+
|
|
1756
|
+
self.SetCursor(self._oldCursor)
|
|
1757
|
+
self._oldCursor = wx.NullCursor
|
|
1758
|
+
|
|
1759
|
+
ImageContainerBase.OnMouseLeftUp(self, event)
|
|
1760
|
+
|
|
1761
|
+
|
|
1762
|
+
def Resize(self, event):
|
|
1763
|
+
"""
|
|
1764
|
+
Actually resizes the tab area.
|
|
1765
|
+
|
|
1766
|
+
:param `event`: an instance of :class:`wx.SizeEvent`.
|
|
1767
|
+
"""
|
|
1768
|
+
|
|
1769
|
+
# Resize our size
|
|
1770
|
+
self._tabAreaSize = self.GetSize()
|
|
1771
|
+
newWidth = self._tabAreaSize.x
|
|
1772
|
+
x = event.GetX()
|
|
1773
|
+
|
|
1774
|
+
if self.HasAGWFlag(INB_BOTTOM) or self.HasAGWFlag(INB_RIGHT):
|
|
1775
|
+
|
|
1776
|
+
newWidth -= event.GetX()
|
|
1777
|
+
|
|
1778
|
+
else:
|
|
1779
|
+
|
|
1780
|
+
newWidth = x
|
|
1781
|
+
|
|
1782
|
+
if newWidth < 100: # Dont allow width to be lower than that
|
|
1783
|
+
newWidth = 100
|
|
1784
|
+
|
|
1785
|
+
self.SetSizeHints(newWidth, self._tabAreaSize.y)
|
|
1786
|
+
|
|
1787
|
+
# Update the tab new area width
|
|
1788
|
+
self._nTabAreaWidth = newWidth
|
|
1789
|
+
self.GetParent().Freeze()
|
|
1790
|
+
self.GetParent().GetSizer().Layout()
|
|
1791
|
+
self.GetParent().Thaw()
|
|
1792
|
+
|
|
1793
|
+
|
|
1794
|
+
def OnMouseMove(self, event):
|
|
1795
|
+
"""
|
|
1796
|
+
Handles the ``wx.EVT_MOTION`` event for :class:`LabelContainer`.
|
|
1797
|
+
|
|
1798
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1799
|
+
"""
|
|
1800
|
+
|
|
1801
|
+
if self.HasAGWFlag(INB_NO_RESIZE):
|
|
1802
|
+
|
|
1803
|
+
ImageContainerBase.OnMouseMove(self, event)
|
|
1804
|
+
return
|
|
1805
|
+
|
|
1806
|
+
# Remove old sash
|
|
1807
|
+
if not self._sashRect.IsEmpty():
|
|
1808
|
+
ArtManager.Get().DrawDragSash(self._sashRect)
|
|
1809
|
+
|
|
1810
|
+
if event.LeftIsDown():
|
|
1811
|
+
|
|
1812
|
+
if not self._sashRect.IsEmpty():
|
|
1813
|
+
|
|
1814
|
+
# Progress sash, and redraw it
|
|
1815
|
+
clientRect = self.GetClientRect()
|
|
1816
|
+
pt = self.ClientToScreen(wx.Point(event.GetX(), 0))
|
|
1817
|
+
self._sashRect = wx.Rect(pt, wx.Size(4, clientRect.height))
|
|
1818
|
+
ArtManager.Get().DrawDragSash(self._sashRect)
|
|
1819
|
+
|
|
1820
|
+
else:
|
|
1821
|
+
|
|
1822
|
+
# Sash is not being dragged
|
|
1823
|
+
if self._oldCursor.IsOk():
|
|
1824
|
+
self.SetCursor(self._oldCursor)
|
|
1825
|
+
self._oldCursor = wx.NullCursor
|
|
1826
|
+
|
|
1827
|
+
else:
|
|
1828
|
+
|
|
1829
|
+
if self.HasCapture():
|
|
1830
|
+
self.ReleaseMouse()
|
|
1831
|
+
|
|
1832
|
+
if self.PointOnSash(event.GetPosition()):
|
|
1833
|
+
|
|
1834
|
+
# Change cursor to EW cursor
|
|
1835
|
+
self._oldCursor = self.GetCursor()
|
|
1836
|
+
self.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE))
|
|
1837
|
+
|
|
1838
|
+
elif self._oldCursor.IsOk():
|
|
1839
|
+
|
|
1840
|
+
self.SetCursor(self._oldCursor)
|
|
1841
|
+
self._oldCursor = wx.NullCursor
|
|
1842
|
+
|
|
1843
|
+
self._sashRect = wx.Rect()
|
|
1844
|
+
ImageContainerBase.OnMouseMove(self, event)
|
|
1845
|
+
|
|
1846
|
+
|
|
1847
|
+
def OnMouseLeftDown(self, event):
|
|
1848
|
+
"""
|
|
1849
|
+
Handles the ``wx.EVT_LEFT_DOWN`` event for :class:`LabelContainer`.
|
|
1850
|
+
|
|
1851
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1852
|
+
"""
|
|
1853
|
+
|
|
1854
|
+
if self.HasAGWFlag(INB_NO_RESIZE):
|
|
1855
|
+
|
|
1856
|
+
ImageContainerBase.OnMouseLeftDown(self, event)
|
|
1857
|
+
return
|
|
1858
|
+
|
|
1859
|
+
imgIdx, where = self.HitTest(event.GetPosition())
|
|
1860
|
+
|
|
1861
|
+
if IMG_OVER_EW_BORDER == where and not self._bCollapsed:
|
|
1862
|
+
|
|
1863
|
+
# We are over the sash
|
|
1864
|
+
if not self._sashRect.IsEmpty():
|
|
1865
|
+
ArtManager.Get().DrawDragSash(self._sashRect)
|
|
1866
|
+
else:
|
|
1867
|
+
# first time, begin drawing sash
|
|
1868
|
+
self.CaptureMouse()
|
|
1869
|
+
|
|
1870
|
+
# Change mouse cursor
|
|
1871
|
+
self._oldCursor = self.GetCursor()
|
|
1872
|
+
self.SetCursor(wx.Cursor(wx.CURSOR_SIZEWE))
|
|
1873
|
+
|
|
1874
|
+
clientRect = self.GetClientRect()
|
|
1875
|
+
pt = self.ClientToScreen(wx.Point(event.GetX(), 0))
|
|
1876
|
+
self._sashRect = wx.Rect(pt, wx.Size(4, clientRect.height))
|
|
1877
|
+
|
|
1878
|
+
ArtManager.Get().DrawDragSash(self._sashRect)
|
|
1879
|
+
|
|
1880
|
+
else:
|
|
1881
|
+
ImageContainerBase.OnMouseLeftDown(self, event)
|
|
1882
|
+
|
|
1883
|
+
|
|
1884
|
+
def OnMouseLeaveWindow(self, event):
|
|
1885
|
+
"""
|
|
1886
|
+
Handles the ``wx.EVT_LEAVE_WINDOW`` event for :class:`LabelContainer`.
|
|
1887
|
+
|
|
1888
|
+
:param `event`: a :class:`MouseEvent` event to be processed.
|
|
1889
|
+
"""
|
|
1890
|
+
|
|
1891
|
+
if self.HasAGWFlag(INB_NO_RESIZE):
|
|
1892
|
+
|
|
1893
|
+
ImageContainerBase.OnMouseLeaveWindow(self, event)
|
|
1894
|
+
return
|
|
1895
|
+
|
|
1896
|
+
# If Sash is being dragged, ignore this event
|
|
1897
|
+
if not self.HasCapture():
|
|
1898
|
+
ImageContainerBase.OnMouseLeaveWindow(self, event)
|
|
1899
|
+
|
|
1900
|
+
|
|
1901
|
+
def DrawRegularHover(self, dc, rect):
|
|
1902
|
+
"""
|
|
1903
|
+
Draws a rounded rectangle around the current tab.
|
|
1904
|
+
|
|
1905
|
+
:param `dc`: an instance of :class:`wx.DC`;
|
|
1906
|
+
:param `rect`: the current tab client rectangle.
|
|
1907
|
+
"""
|
|
1908
|
+
|
|
1909
|
+
# The hovered tab with default border
|
|
1910
|
+
dc.SetBrush(wx.TRANSPARENT_BRUSH)
|
|
1911
|
+
dc.SetPen(wx.Pen(wx.WHITE))
|
|
1912
|
+
|
|
1913
|
+
# We draw CCW
|
|
1914
|
+
if self.HasAGWFlag(INB_RIGHT) or self.HasAGWFlag(INB_TOP):
|
|
1915
|
+
|
|
1916
|
+
# Right images
|
|
1917
|
+
# Upper line
|
|
1918
|
+
dc.DrawLine(rect.x + 1, rect.y, rect.x + rect.width, rect.y)
|
|
1919
|
+
|
|
1920
|
+
# Right line (white)
|
|
1921
|
+
dc.DrawLine(rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height)
|
|
1922
|
+
|
|
1923
|
+
# Bottom diagonal - we change pen
|
|
1924
|
+
dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]))
|
|
1925
|
+
|
|
1926
|
+
# Bottom line
|
|
1927
|
+
dc.DrawLine(rect.x + rect.width, rect.y + rect.height, rect.x, rect.y + rect.height)
|
|
1928
|
+
|
|
1929
|
+
else:
|
|
1930
|
+
|
|
1931
|
+
# Left images
|
|
1932
|
+
# Upper line white
|
|
1933
|
+
dc.DrawLine(rect.x, rect.y, rect.x + rect.width - 1, rect.y)
|
|
1934
|
+
|
|
1935
|
+
# Left line
|
|
1936
|
+
dc.DrawLine(rect.x, rect.y, rect.x, rect.y + rect.height)
|
|
1937
|
+
|
|
1938
|
+
# Bottom diagonal, we change the pen
|
|
1939
|
+
dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]))
|
|
1940
|
+
|
|
1941
|
+
# Bottom line
|
|
1942
|
+
dc.DrawLine(rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height)
|
|
1943
|
+
|
|
1944
|
+
|
|
1945
|
+
def DrawWebHover(self, dc, caption, xCoord, yCoord, selected):
|
|
1946
|
+
"""
|
|
1947
|
+
Draws a web style hover effect (cursor set to hand & text is underlined).
|
|
1948
|
+
|
|
1949
|
+
:param `dc`: an instance of :class:`wx.DC`;
|
|
1950
|
+
:param `caption`: the tab caption text;
|
|
1951
|
+
:param `xCoord`: the x position of the tab caption;
|
|
1952
|
+
:param `yCoord`: the y position of the tab caption;
|
|
1953
|
+
:param `selected`: ``True`` if the tab is selected, ``False`` otherwise.
|
|
1954
|
+
"""
|
|
1955
|
+
|
|
1956
|
+
# Redraw the text with underlined font
|
|
1957
|
+
underLinedFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
1958
|
+
underLinedFont.SetPointSize(underLinedFont.GetPointSize() * self.GetParent().GetFontSizeMultiple())
|
|
1959
|
+
if self.GetParent().GetFontBold():
|
|
1960
|
+
underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
1961
|
+
elif self.HasAGWFlag(INB_BOLD_TAB_SELECTION) and selected:
|
|
1962
|
+
underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
1963
|
+
|
|
1964
|
+
underLinedFont.SetUnderlined(True)
|
|
1965
|
+
dc.SetFont(underLinedFont)
|
|
1966
|
+
dc.DrawText(caption, xCoord, yCoord)
|
|
1967
|
+
|
|
1968
|
+
|
|
1969
|
+
def SetColour(self, which, colour):
|
|
1970
|
+
"""
|
|
1971
|
+
Sets a colour for a parameter.
|
|
1972
|
+
|
|
1973
|
+
:param `which`: can be one of the following parameters:
|
|
1974
|
+
|
|
1975
|
+
================================== ======= ==================================
|
|
1976
|
+
Colour Key Value Description
|
|
1977
|
+
================================== ======= ==================================
|
|
1978
|
+
``INB_TAB_AREA_BACKGROUND_COLOUR`` 100 The tab area background colour
|
|
1979
|
+
``INB_ACTIVE_TAB_COLOUR`` 101 The active tab background colour
|
|
1980
|
+
``INB_TABS_BORDER_COLOUR`` 102 The tabs border colour
|
|
1981
|
+
``INB_TEXT_COLOUR`` 103 The tab caption text colour
|
|
1982
|
+
``INB_ACTIVE_TEXT_COLOUR`` 104 The active tab caption text colour
|
|
1983
|
+
``INB_HILITE_TAB_COLOUR`` 105 The tab caption highlight text colour
|
|
1984
|
+
================================== ======= ==================================
|
|
1985
|
+
|
|
1986
|
+
:param `colour`: a valid :class:`wx.Colour` object.
|
|
1987
|
+
"""
|
|
1988
|
+
|
|
1989
|
+
self._coloursMap[which] = colour
|
|
1990
|
+
|
|
1991
|
+
|
|
1992
|
+
def GetColour(self, which):
|
|
1993
|
+
"""
|
|
1994
|
+
Returns a colour for a parameter.
|
|
1995
|
+
|
|
1996
|
+
:param `which`: the colour key.
|
|
1997
|
+
|
|
1998
|
+
:see: :meth:`~LabelContainer.SetColour` for a list of valid colour keys.
|
|
1999
|
+
"""
|
|
2000
|
+
|
|
2001
|
+
return self._coloursMap.get(which, wx.Colour())
|
|
2002
|
+
|
|
2003
|
+
|
|
2004
|
+
def InitializeColours(self):
|
|
2005
|
+
""" Initializes the colours map to be used for this control. """
|
|
2006
|
+
|
|
2007
|
+
# Initialize map colours
|
|
2008
|
+
self._coloursMap.update({INB_TAB_AREA_BACKGROUND_COLOUR: ArtManager.Get().LightColour(ArtManager.Get().FrameColour(), 50)})
|
|
2009
|
+
self._coloursMap.update({INB_ACTIVE_TAB_COLOUR: ArtManager.Get().GetMenuFaceColour()})
|
|
2010
|
+
self._coloursMap.update({INB_TABS_BORDER_COLOUR: wx.SystemSettings.GetColour(wx.SYS_COLOUR_3DSHADOW)})
|
|
2011
|
+
self._coloursMap.update({INB_HILITE_TAB_COLOUR: wx.Colour("LIGHT BLUE")})
|
|
2012
|
+
self._coloursMap.update({INB_TEXT_COLOUR: wx.WHITE})
|
|
2013
|
+
self._coloursMap.update({INB_ACTIVE_TEXT_COLOUR: wx.BLACK})
|
|
2014
|
+
|
|
2015
|
+
# Don't allow bright colour one over the other
|
|
2016
|
+
if not ArtManager.Get().IsDark(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR]) and \
|
|
2017
|
+
not ArtManager.Get().IsDark(self._coloursMap[INB_TEXT_COLOUR]):
|
|
2018
|
+
|
|
2019
|
+
self._coloursMap[INB_TEXT_COLOUR] = ArtManager.Get().DarkColour(self._coloursMap[INB_TEXT_COLOUR], 100)
|
|
2020
|
+
|
|
2021
|
+
|
|
2022
|
+
def DrawLabel(self, dc, rect, text, bmp, imgInfo, orientationLeft, imgIdx, selected, hover):
|
|
2023
|
+
"""
|
|
2024
|
+
Draws a label using the specified dc.
|
|
2025
|
+
|
|
2026
|
+
:param `dc`: an instance of :class:`wx.DC`;
|
|
2027
|
+
:param `rect`: the text client rectangle;
|
|
2028
|
+
:param `text`: the actual text string;
|
|
2029
|
+
:param `bmp`: a bitmap to be drawn next to the text;
|
|
2030
|
+
:param `imgInfo`: an instance of :class:`wx.ImageInfo`;
|
|
2031
|
+
:param `orientationLeft`: ``True`` if the book has the ``INB_RIGHT`` or ``INB_LEFT``
|
|
2032
|
+
style set;
|
|
2033
|
+
:param `imgIdx`: the tab image index;
|
|
2034
|
+
:param `selected`: ``True`` if the tab is selected, ``False`` otherwise;
|
|
2035
|
+
:param `hover`: ``True`` if the tab is being hovered with the mouse, ``False`` otherwise.
|
|
2036
|
+
"""
|
|
2037
|
+
|
|
2038
|
+
dcsaver = DCSaver(dc)
|
|
2039
|
+
nPadding = 6
|
|
2040
|
+
|
|
2041
|
+
if orientationLeft:
|
|
2042
|
+
|
|
2043
|
+
rect.x += nPadding
|
|
2044
|
+
rect.width -= nPadding
|
|
2045
|
+
|
|
2046
|
+
else:
|
|
2047
|
+
|
|
2048
|
+
rect.width -= nPadding
|
|
2049
|
+
|
|
2050
|
+
textRect = wx.Rect(*rect)
|
|
2051
|
+
imgRect = wx.Rect(*rect)
|
|
2052
|
+
|
|
2053
|
+
font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
2054
|
+
font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple())
|
|
2055
|
+
|
|
2056
|
+
if self.GetParent().GetFontBold():
|
|
2057
|
+
font.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
2058
|
+
elif self.HasAGWFlag(INB_BOLD_TAB_SELECTION) and selected:
|
|
2059
|
+
font.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
2060
|
+
|
|
2061
|
+
dc.SetFont(font)
|
|
2062
|
+
|
|
2063
|
+
# First we define the rectangle for the text
|
|
2064
|
+
w, h = dc.GetTextExtent(text)
|
|
2065
|
+
|
|
2066
|
+
#-------------------------------------------------------------------------
|
|
2067
|
+
# Label layout:
|
|
2068
|
+
# [ nPadding | Image | nPadding | Text | nPadding ]
|
|
2069
|
+
#-------------------------------------------------------------------------
|
|
2070
|
+
|
|
2071
|
+
# Text bounding rectangle
|
|
2072
|
+
textRect.x += nPadding
|
|
2073
|
+
textRect.y = rect.y + (rect.height - h) // 2
|
|
2074
|
+
textRect.width = rect.width - 2 * nPadding
|
|
2075
|
+
|
|
2076
|
+
if bmp.IsOk() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
|
|
2077
|
+
textRect.x += (bmp.GetWidth() + nPadding)
|
|
2078
|
+
textRect.width -= (bmp.GetWidth() + nPadding)
|
|
2079
|
+
|
|
2080
|
+
textRect.height = h
|
|
2081
|
+
|
|
2082
|
+
# Truncate text if needed
|
|
2083
|
+
caption = ArtManager.Get().TruncateText(dc, text, textRect.width)
|
|
2084
|
+
|
|
2085
|
+
# Image bounding rectangle
|
|
2086
|
+
if bmp.IsOk() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
|
|
2087
|
+
|
|
2088
|
+
imgRect.x += nPadding
|
|
2089
|
+
imgRect.width = bmp.GetWidth()
|
|
2090
|
+
imgRect.y = rect.y + (rect.height - bmp.GetHeight()) // 2
|
|
2091
|
+
imgRect.height = bmp.GetHeight()
|
|
2092
|
+
|
|
2093
|
+
# Draw bounding rectangle
|
|
2094
|
+
if selected:
|
|
2095
|
+
|
|
2096
|
+
# First we colour the tab
|
|
2097
|
+
dc.SetBrush(wx.Brush(self._coloursMap[INB_ACTIVE_TAB_COLOUR]))
|
|
2098
|
+
|
|
2099
|
+
if self.HasAGWFlag(INB_BORDER):
|
|
2100
|
+
dc.SetPen(wx.Pen(self._coloursMap[INB_TABS_BORDER_COLOUR]))
|
|
2101
|
+
else:
|
|
2102
|
+
dc.SetPen(wx.Pen(self._coloursMap[INB_ACTIVE_TAB_COLOUR]))
|
|
2103
|
+
|
|
2104
|
+
labelRect = wx.Rect(*rect)
|
|
2105
|
+
|
|
2106
|
+
if orientationLeft:
|
|
2107
|
+
labelRect.width += 3
|
|
2108
|
+
else:
|
|
2109
|
+
labelRect.width += 3
|
|
2110
|
+
labelRect.x -= 3
|
|
2111
|
+
|
|
2112
|
+
dc.DrawRoundedRectangle(labelRect, 3)
|
|
2113
|
+
|
|
2114
|
+
if not orientationLeft and self.HasAGWFlag(INB_DRAW_SHADOW):
|
|
2115
|
+
dc.SetPen(wx.BLACK_PEN)
|
|
2116
|
+
dc.DrawPoint(labelRect.x + labelRect.width - 1, labelRect.y + labelRect.height - 1)
|
|
2117
|
+
|
|
2118
|
+
# Draw the text & bitmap
|
|
2119
|
+
if caption != "":
|
|
2120
|
+
|
|
2121
|
+
if selected:
|
|
2122
|
+
dc.SetTextForeground(self._coloursMap[INB_ACTIVE_TEXT_COLOUR])
|
|
2123
|
+
else:
|
|
2124
|
+
dc.SetTextForeground(self._coloursMap[INB_TEXT_COLOUR])
|
|
2125
|
+
|
|
2126
|
+
dc.DrawText(caption, textRect.x, textRect.y)
|
|
2127
|
+
imgInfo.SetTextRect(textRect)
|
|
2128
|
+
|
|
2129
|
+
else:
|
|
2130
|
+
|
|
2131
|
+
imgInfo.SetTextRect(wx.Rect())
|
|
2132
|
+
|
|
2133
|
+
if bmp.IsOk() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT):
|
|
2134
|
+
dc.DrawBitmap(bmp, imgRect.x, imgRect.y, True)
|
|
2135
|
+
|
|
2136
|
+
# Drop shadow
|
|
2137
|
+
if self.HasAGWFlag(INB_DRAW_SHADOW) and selected:
|
|
2138
|
+
|
|
2139
|
+
sstyle = 0
|
|
2140
|
+
if orientationLeft:
|
|
2141
|
+
sstyle = BottomShadow
|
|
2142
|
+
else:
|
|
2143
|
+
sstyle = BottomShadowFull | RightShadow
|
|
2144
|
+
|
|
2145
|
+
if self.HasAGWFlag(INB_WEB_HILITE):
|
|
2146
|
+
|
|
2147
|
+
# Always drop shadow for this style
|
|
2148
|
+
ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle)
|
|
2149
|
+
|
|
2150
|
+
else:
|
|
2151
|
+
|
|
2152
|
+
if imgIdx+1 != self._nHoveredImgIdx:
|
|
2153
|
+
ArtManager.Get().DrawBitmapShadow(dc, rect, sstyle)
|
|
2154
|
+
|
|
2155
|
+
# Draw hover effect
|
|
2156
|
+
if hover:
|
|
2157
|
+
|
|
2158
|
+
if self.HasAGWFlag(INB_WEB_HILITE) and caption != "":
|
|
2159
|
+
self.DrawWebHover(dc, caption, textRect.x, textRect.y, selected)
|
|
2160
|
+
else:
|
|
2161
|
+
self.DrawRegularHover(dc, rect)
|
|
2162
|
+
|
|
2163
|
+
# Update the page information bout position and size
|
|
2164
|
+
imgInfo.SetPosition(rect.GetPosition())
|
|
2165
|
+
imgInfo.SetSize(rect.GetSize())
|
|
2166
|
+
|
|
2167
|
+
|
|
2168
|
+
# ---------------------------------------------------------------------------- #
|
|
2169
|
+
# Class FlatBookBase
|
|
2170
|
+
# ---------------------------------------------------------------------------- #
|
|
2171
|
+
|
|
2172
|
+
class FlatBookBase(wx.Panel):
|
|
2173
|
+
""" Base class for the containing window for :class:`LabelBook` and :class:`FlatImageBook`. """
|
|
2174
|
+
|
|
2175
|
+
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
2176
|
+
style=0, agwStyle=0, name="FlatBookBase"):
|
|
2177
|
+
"""
|
|
2178
|
+
Default class constructor.
|
|
2179
|
+
|
|
2180
|
+
:param `parent`: parent window. Must not be ``None``;
|
|
2181
|
+
:param `id`: window identifier. A value of -1 indicates a default value;
|
|
2182
|
+
:param `pos`: the control position. A value of (-1, -1) indicates a default position,
|
|
2183
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
2184
|
+
:param `size`: the control size. A value of (-1, -1) indicates a default size,
|
|
2185
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
2186
|
+
:param `style`: the underlying :class:`Panel` window style;
|
|
2187
|
+
:param `agwStyle`: the AGW-specific window style. This can be a combination of the
|
|
2188
|
+
following bits:
|
|
2189
|
+
|
|
2190
|
+
=========================== =========== ==================================================
|
|
2191
|
+
Window Styles Hex Value Description
|
|
2192
|
+
=========================== =========== ==================================================
|
|
2193
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
2194
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
2195
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
2196
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
2197
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
2198
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
2199
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
2200
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
2201
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
2202
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
2203
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
2204
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
2205
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
2206
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
2207
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
2208
|
+
=========================== =========== ==================================================
|
|
2209
|
+
|
|
2210
|
+
:param `name`: the window name.
|
|
2211
|
+
"""
|
|
2212
|
+
|
|
2213
|
+
self._pages = None
|
|
2214
|
+
self._bInitializing = True
|
|
2215
|
+
self._pages = None
|
|
2216
|
+
self._bForceSelection = False
|
|
2217
|
+
self._windows = []
|
|
2218
|
+
self._fontSizeMultiple = 1
|
|
2219
|
+
self._fontBold = False
|
|
2220
|
+
|
|
2221
|
+
style |= wx.TAB_TRAVERSAL
|
|
2222
|
+
self._agwStyle = agwStyle
|
|
2223
|
+
|
|
2224
|
+
wx.Panel.__init__(self, parent, id, pos, size, style, name)
|
|
2225
|
+
self._bInitializing = False
|
|
2226
|
+
|
|
2227
|
+
self.Bind(wx.EVT_NAVIGATION_KEY, self.OnNavigationKey)
|
|
2228
|
+
self.Bind(wx.EVT_MOUSE_CAPTURE_LOST, lambda evt: True)
|
|
2229
|
+
|
|
2230
|
+
|
|
2231
|
+
def SetAGWWindowStyleFlag(self, agwStyle):
|
|
2232
|
+
"""
|
|
2233
|
+
Sets the window style.
|
|
2234
|
+
|
|
2235
|
+
:param `agwStyle`: can be a combination of the following bits:
|
|
2236
|
+
|
|
2237
|
+
=========================== =========== ==================================================
|
|
2238
|
+
Window Styles Hex Value Description
|
|
2239
|
+
=========================== =========== ==================================================
|
|
2240
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
2241
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
2242
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
2243
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
2244
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
2245
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
2246
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
2247
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
2248
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
2249
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
2250
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
2251
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
2252
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
2253
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
2254
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
2255
|
+
=========================== =========== ==================================================
|
|
2256
|
+
|
|
2257
|
+
"""
|
|
2258
|
+
|
|
2259
|
+
self._agwStyle = agwStyle
|
|
2260
|
+
|
|
2261
|
+
# Check that we are not in initialization process
|
|
2262
|
+
if self._bInitializing:
|
|
2263
|
+
return
|
|
2264
|
+
|
|
2265
|
+
if not self._pages:
|
|
2266
|
+
return
|
|
2267
|
+
|
|
2268
|
+
# Detach the windows attached to the sizer
|
|
2269
|
+
if self.GetSelection() >= 0:
|
|
2270
|
+
self._mainSizer.Detach(self._windows[self.GetSelection()])
|
|
2271
|
+
|
|
2272
|
+
self._mainSizer.Detach(self._pages)
|
|
2273
|
+
|
|
2274
|
+
if isinstance(self, LabelBook):
|
|
2275
|
+
self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
2276
|
+
else:
|
|
2277
|
+
if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
|
|
2278
|
+
self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
2279
|
+
else:
|
|
2280
|
+
self._mainSizer = wx.BoxSizer(wx.VERTICAL)
|
|
2281
|
+
|
|
2282
|
+
self.SetSizer(self._mainSizer)
|
|
2283
|
+
|
|
2284
|
+
# Add the tab container and the separator
|
|
2285
|
+
self._mainSizer.Add(self._pages, 0, wx.EXPAND)
|
|
2286
|
+
|
|
2287
|
+
if isinstance(self, FlatImageBook):
|
|
2288
|
+
if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
|
|
2289
|
+
self._pages.SetSizeHints(self._pages._nImgSize * 2, -1)
|
|
2290
|
+
else:
|
|
2291
|
+
self._pages.SetSizeHints(-1, self._pages._nImgSize * 2)
|
|
2292
|
+
|
|
2293
|
+
# Attach the windows back to the sizer to the sizer
|
|
2294
|
+
if self.GetSelection() >= 0:
|
|
2295
|
+
self.DoSetSelection(self._windows[self.GetSelection()])
|
|
2296
|
+
|
|
2297
|
+
if agwStyle & INB_FIT_LABELTEXT:
|
|
2298
|
+
self.ResizeTabArea()
|
|
2299
|
+
|
|
2300
|
+
self._mainSizer.Layout()
|
|
2301
|
+
dummy = wx.SizeEvent(self.GetSize())
|
|
2302
|
+
wx.PostEvent(self, dummy)
|
|
2303
|
+
self._pages.Refresh()
|
|
2304
|
+
|
|
2305
|
+
|
|
2306
|
+
def GetAGWWindowStyleFlag(self):
|
|
2307
|
+
"""
|
|
2308
|
+
Returns the :class:`FlatBookBase` window style.
|
|
2309
|
+
|
|
2310
|
+
:see: :meth:`~FlatBookBase.SetAGWWindowStyleFlag` for a list of possible window style flags.
|
|
2311
|
+
"""
|
|
2312
|
+
|
|
2313
|
+
return self._agwStyle
|
|
2314
|
+
|
|
2315
|
+
|
|
2316
|
+
def HasAGWFlag(self, flag):
|
|
2317
|
+
"""
|
|
2318
|
+
Returns whether a flag is present in the :class:`FlatBookBase` style.
|
|
2319
|
+
|
|
2320
|
+
:param `flag`: one of the possible :class:`FlatBookBase` window styles.
|
|
2321
|
+
|
|
2322
|
+
:see: :meth:`~FlatBookBase.SetAGWWindowStyleFlag` for a list of possible window style flags.
|
|
2323
|
+
"""
|
|
2324
|
+
|
|
2325
|
+
agwStyle = self.GetAGWWindowStyleFlag()
|
|
2326
|
+
res = (agwStyle & flag and [True] or [False])[0]
|
|
2327
|
+
return res
|
|
2328
|
+
|
|
2329
|
+
|
|
2330
|
+
def AddPage(self, page, text, select=False, imageId=-1):
|
|
2331
|
+
"""
|
|
2332
|
+
Adds a page to the book.
|
|
2333
|
+
|
|
2334
|
+
:param `page`: specifies the new page;
|
|
2335
|
+
:param `text`: specifies the text for the new page;
|
|
2336
|
+
:param `select`: specifies whether the page should be selected;
|
|
2337
|
+
:param `imageId`: specifies the optional image index for the new page.
|
|
2338
|
+
|
|
2339
|
+
:note: The call to this function generates the page changing events.
|
|
2340
|
+
"""
|
|
2341
|
+
|
|
2342
|
+
if not page:
|
|
2343
|
+
return
|
|
2344
|
+
|
|
2345
|
+
page.Reparent(self)
|
|
2346
|
+
|
|
2347
|
+
self._windows.append(page)
|
|
2348
|
+
|
|
2349
|
+
if select or len(self._windows) == 1:
|
|
2350
|
+
self.SetSelection(len(self._windows)-1)
|
|
2351
|
+
else:
|
|
2352
|
+
page.Hide()
|
|
2353
|
+
|
|
2354
|
+
self._pages.AddPage(text, select, imageId)
|
|
2355
|
+
self.ResizeTabArea()
|
|
2356
|
+
self.Refresh()
|
|
2357
|
+
|
|
2358
|
+
|
|
2359
|
+
def InsertPage(self, page_idx, page, text, select=False, imageId=-1):
|
|
2360
|
+
"""
|
|
2361
|
+
Inserts a page into the book at the specified position.
|
|
2362
|
+
|
|
2363
|
+
:param `page_idx`: specifies the position for the new page;
|
|
2364
|
+
:param `page`: specifies the new page;
|
|
2365
|
+
:param `text`: specifies the text for the new page;
|
|
2366
|
+
:param `select`: specifies whether the page should be selected;
|
|
2367
|
+
:param `imageId`: specifies the optional image index for the new page.
|
|
2368
|
+
|
|
2369
|
+
:note: The call to this function generates the page changing events.
|
|
2370
|
+
"""
|
|
2371
|
+
|
|
2372
|
+
if not page:
|
|
2373
|
+
return
|
|
2374
|
+
|
|
2375
|
+
page.Reparent(self)
|
|
2376
|
+
|
|
2377
|
+
self._windows.insert(page_idx, page)
|
|
2378
|
+
|
|
2379
|
+
if select or len(self._windows) == 1:
|
|
2380
|
+
self.SetSelection(page_idx)
|
|
2381
|
+
else:
|
|
2382
|
+
page.Hide()
|
|
2383
|
+
|
|
2384
|
+
self._pages.InsertPage(page_idx, text, select, imageId)
|
|
2385
|
+
self.ResizeTabArea()
|
|
2386
|
+
self.Refresh()
|
|
2387
|
+
|
|
2388
|
+
|
|
2389
|
+
def DeletePage(self, page):
|
|
2390
|
+
"""
|
|
2391
|
+
Deletes the specified page, and the associated window.
|
|
2392
|
+
|
|
2393
|
+
:param `page`: an integer specifying the page to be deleted.
|
|
2394
|
+
|
|
2395
|
+
:note: The call to this function generates the page changing events.
|
|
2396
|
+
"""
|
|
2397
|
+
|
|
2398
|
+
if page >= len(self._windows) or page < 0:
|
|
2399
|
+
return
|
|
2400
|
+
|
|
2401
|
+
# Fire a closing event
|
|
2402
|
+
event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId())
|
|
2403
|
+
event.SetSelection(page)
|
|
2404
|
+
event.SetEventObject(self)
|
|
2405
|
+
self.GetEventHandler().ProcessEvent(event)
|
|
2406
|
+
|
|
2407
|
+
# The event handler allows it?
|
|
2408
|
+
if not event.IsAllowed():
|
|
2409
|
+
return False
|
|
2410
|
+
|
|
2411
|
+
self.Freeze()
|
|
2412
|
+
|
|
2413
|
+
# Delete the requested page
|
|
2414
|
+
pageRemoved = self._windows[page]
|
|
2415
|
+
|
|
2416
|
+
# If the page is the current window, remove it from the sizer
|
|
2417
|
+
# as well
|
|
2418
|
+
if page == self.GetSelection():
|
|
2419
|
+
self._mainSizer.Detach(pageRemoved)
|
|
2420
|
+
|
|
2421
|
+
# Remove it from the array as well
|
|
2422
|
+
self._windows.pop(page)
|
|
2423
|
+
|
|
2424
|
+
# Now we can destroy it in wxWidgets use Destroy instead of delete
|
|
2425
|
+
pageRemoved.Destroy()
|
|
2426
|
+
self._mainSizer.Layout()
|
|
2427
|
+
|
|
2428
|
+
self._pages.DoDeletePage(page)
|
|
2429
|
+
self.ResizeTabArea()
|
|
2430
|
+
self.Thaw()
|
|
2431
|
+
|
|
2432
|
+
# Fire a closed event
|
|
2433
|
+
closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId())
|
|
2434
|
+
closedEvent.SetSelection(page)
|
|
2435
|
+
closedEvent.SetEventObject(self)
|
|
2436
|
+
self.GetEventHandler().ProcessEvent(closedEvent)
|
|
2437
|
+
|
|
2438
|
+
|
|
2439
|
+
def RemovePage(self, page):
|
|
2440
|
+
"""
|
|
2441
|
+
Deletes the specified page, without deleting the associated window.
|
|
2442
|
+
|
|
2443
|
+
:param `page`: an integer specifying the page to be removed.
|
|
2444
|
+
|
|
2445
|
+
:note: The call to this function generates the page changing events.
|
|
2446
|
+
"""
|
|
2447
|
+
|
|
2448
|
+
if page >= len(self._windows):
|
|
2449
|
+
return False
|
|
2450
|
+
|
|
2451
|
+
# Fire a closing event
|
|
2452
|
+
event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSING, self.GetId())
|
|
2453
|
+
event.SetSelection(page)
|
|
2454
|
+
event.SetEventObject(self)
|
|
2455
|
+
self.GetEventHandler().ProcessEvent(event)
|
|
2456
|
+
|
|
2457
|
+
# The event handler allows it?
|
|
2458
|
+
if not event.IsAllowed():
|
|
2459
|
+
return False
|
|
2460
|
+
|
|
2461
|
+
self.Freeze()
|
|
2462
|
+
|
|
2463
|
+
# Remove the requested page
|
|
2464
|
+
pageRemoved = self._windows[page]
|
|
2465
|
+
|
|
2466
|
+
# If the page is the current window, remove it from the sizer
|
|
2467
|
+
# as well
|
|
2468
|
+
if page == self.GetSelection():
|
|
2469
|
+
self._mainSizer.Detach(pageRemoved)
|
|
2470
|
+
|
|
2471
|
+
# Remove it from the array as well
|
|
2472
|
+
self._windows.pop(page)
|
|
2473
|
+
self._mainSizer.Layout()
|
|
2474
|
+
self.ResizeTabArea()
|
|
2475
|
+
self.Thaw()
|
|
2476
|
+
|
|
2477
|
+
self._pages.DoDeletePage(page)
|
|
2478
|
+
|
|
2479
|
+
# Fire a closed event
|
|
2480
|
+
closedEvent = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CLOSED, self.GetId())
|
|
2481
|
+
closedEvent.SetSelection(page)
|
|
2482
|
+
closedEvent.SetEventObject(self)
|
|
2483
|
+
self.GetEventHandler().ProcessEvent(closedEvent)
|
|
2484
|
+
|
|
2485
|
+
return True
|
|
2486
|
+
|
|
2487
|
+
|
|
2488
|
+
def ResizeTabArea(self):
|
|
2489
|
+
""" Resizes the tab area if the control has the ``INB_FIT_LABELTEXT`` style set. """
|
|
2490
|
+
|
|
2491
|
+
agwStyle = self.GetAGWWindowStyleFlag()
|
|
2492
|
+
|
|
2493
|
+
if agwStyle & INB_FIT_LABELTEXT == 0:
|
|
2494
|
+
return
|
|
2495
|
+
|
|
2496
|
+
if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
|
|
2497
|
+
dc = wx.MemoryDC()
|
|
2498
|
+
dc.SelectObject(wx.Bitmap(1, 1))
|
|
2499
|
+
font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
|
2500
|
+
font.SetPointSize(font.GetPointSize()*self._fontSizeMultiple)
|
|
2501
|
+
if self.GetFontBold() or agwStyle & INB_BOLD_TAB_SELECTION:
|
|
2502
|
+
font.SetWeight(wx.FONTWEIGHT_BOLD)
|
|
2503
|
+
dc.SetFont(font)
|
|
2504
|
+
maxW = 0
|
|
2505
|
+
|
|
2506
|
+
for page in range(self.GetPageCount()):
|
|
2507
|
+
caption = self._pages.GetPageText(page)
|
|
2508
|
+
w, h = dc.GetTextExtent(caption)
|
|
2509
|
+
maxW = max(maxW, w)
|
|
2510
|
+
|
|
2511
|
+
maxW += 24 #TODO this is 6*4 6 is nPadding from drawlabel
|
|
2512
|
+
|
|
2513
|
+
if not agwStyle & INB_SHOW_ONLY_TEXT:
|
|
2514
|
+
maxW += self._pages._nImgSize * 2
|
|
2515
|
+
|
|
2516
|
+
maxW = max(maxW, 100)
|
|
2517
|
+
self._pages.SetSizeHints(maxW, -1)
|
|
2518
|
+
self._pages._nTabAreaWidth = maxW
|
|
2519
|
+
|
|
2520
|
+
|
|
2521
|
+
def DeleteAllPages(self):
|
|
2522
|
+
""" Deletes all the pages in the book. """
|
|
2523
|
+
|
|
2524
|
+
if not self._windows:
|
|
2525
|
+
return
|
|
2526
|
+
|
|
2527
|
+
self.Freeze()
|
|
2528
|
+
|
|
2529
|
+
for win in self._windows:
|
|
2530
|
+
win.Destroy()
|
|
2531
|
+
|
|
2532
|
+
self._windows = []
|
|
2533
|
+
self.Thaw()
|
|
2534
|
+
|
|
2535
|
+
# remove old selection
|
|
2536
|
+
self._pages.ClearAll()
|
|
2537
|
+
self._pages.Refresh()
|
|
2538
|
+
|
|
2539
|
+
|
|
2540
|
+
def SetSelection(self, page):
|
|
2541
|
+
"""
|
|
2542
|
+
Changes the selection from currently visible/selected page to the page
|
|
2543
|
+
given by page.
|
|
2544
|
+
|
|
2545
|
+
:param `page`: an integer specifying the page to be selected.
|
|
2546
|
+
|
|
2547
|
+
:note: The call to this function generates the page changing events.
|
|
2548
|
+
"""
|
|
2549
|
+
|
|
2550
|
+
if page >= len(self._windows):
|
|
2551
|
+
return
|
|
2552
|
+
|
|
2553
|
+
if not self.GetEnabled(page):
|
|
2554
|
+
return
|
|
2555
|
+
|
|
2556
|
+
if page == self.GetSelection() and not self._bForceSelection:
|
|
2557
|
+
return
|
|
2558
|
+
|
|
2559
|
+
oldSelection = self.GetSelection()
|
|
2560
|
+
|
|
2561
|
+
# Generate an event that indicates that an image is about to be selected
|
|
2562
|
+
event = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGING, self.GetId())
|
|
2563
|
+
event.SetSelection(page)
|
|
2564
|
+
event.SetOldSelection(oldSelection)
|
|
2565
|
+
event.SetEventObject(self)
|
|
2566
|
+
self.GetEventHandler().ProcessEvent(event)
|
|
2567
|
+
|
|
2568
|
+
# The event handler allows it?
|
|
2569
|
+
if not event.IsAllowed() and not self._bForceSelection:
|
|
2570
|
+
return
|
|
2571
|
+
|
|
2572
|
+
self.DoSetSelection(self._windows[page])
|
|
2573
|
+
# Now we can update the new selection
|
|
2574
|
+
self._pages._nIndex = page
|
|
2575
|
+
|
|
2576
|
+
# Refresh calls the OnPaint of this class
|
|
2577
|
+
self._pages.Refresh()
|
|
2578
|
+
|
|
2579
|
+
# Generate an event that indicates that an image was selected
|
|
2580
|
+
eventChanged = ImageNotebookEvent(wxEVT_IMAGENOTEBOOK_PAGE_CHANGED, self.GetId())
|
|
2581
|
+
eventChanged.SetEventObject(self)
|
|
2582
|
+
eventChanged.SetOldSelection(oldSelection)
|
|
2583
|
+
eventChanged.SetSelection(page)
|
|
2584
|
+
self.GetEventHandler().ProcessEvent(eventChanged)
|
|
2585
|
+
|
|
2586
|
+
|
|
2587
|
+
def AssignImageList(self, imglist):
|
|
2588
|
+
"""
|
|
2589
|
+
Assigns an image list to the control.
|
|
2590
|
+
|
|
2591
|
+
:param `imglist`: an instance of :class:`wx.ImageList`.
|
|
2592
|
+
"""
|
|
2593
|
+
|
|
2594
|
+
self._pages.AssignImageList(imglist)
|
|
2595
|
+
|
|
2596
|
+
# Force change
|
|
2597
|
+
self.SetAGWWindowStyleFlag(self.GetAGWWindowStyleFlag())
|
|
2598
|
+
|
|
2599
|
+
|
|
2600
|
+
def GetSelection(self):
|
|
2601
|
+
""" Returns the current selection. """
|
|
2602
|
+
|
|
2603
|
+
if self._pages:
|
|
2604
|
+
return self._pages._nIndex
|
|
2605
|
+
else:
|
|
2606
|
+
return -1
|
|
2607
|
+
|
|
2608
|
+
|
|
2609
|
+
def DoSetSelection(self, window):
|
|
2610
|
+
"""
|
|
2611
|
+
Select the window by the provided pointer.
|
|
2612
|
+
|
|
2613
|
+
:param `window`: an instance of :class:`wx.Window`.
|
|
2614
|
+
"""
|
|
2615
|
+
|
|
2616
|
+
curSel = self.GetSelection()
|
|
2617
|
+
agwStyle = self.GetAGWWindowStyleFlag()
|
|
2618
|
+
# Replace the window in the sizer
|
|
2619
|
+
self.Freeze()
|
|
2620
|
+
|
|
2621
|
+
# Check if a new selection was made
|
|
2622
|
+
bInsertFirst = (agwStyle & INB_BOTTOM or agwStyle & INB_RIGHT)
|
|
2623
|
+
|
|
2624
|
+
if curSel >= 0:
|
|
2625
|
+
|
|
2626
|
+
# Remove the window from the main sizer
|
|
2627
|
+
self._mainSizer.Detach(self._windows[curSel])
|
|
2628
|
+
self._windows[curSel].Hide()
|
|
2629
|
+
|
|
2630
|
+
if bInsertFirst:
|
|
2631
|
+
self._mainSizer.Insert(0, window, 1, wx.EXPAND)
|
|
2632
|
+
else:
|
|
2633
|
+
self._mainSizer.Add(window, 1, wx.EXPAND)
|
|
2634
|
+
|
|
2635
|
+
window.Show()
|
|
2636
|
+
self._mainSizer.Layout()
|
|
2637
|
+
self.Thaw()
|
|
2638
|
+
|
|
2639
|
+
|
|
2640
|
+
def GetImageList(self):
|
|
2641
|
+
""" Returns the associated image list. """
|
|
2642
|
+
|
|
2643
|
+
return self._pages.GetImageList()
|
|
2644
|
+
|
|
2645
|
+
|
|
2646
|
+
def GetPageCount(self):
|
|
2647
|
+
""" Returns the number of pages in the book. """
|
|
2648
|
+
|
|
2649
|
+
return len(self._windows)
|
|
2650
|
+
|
|
2651
|
+
|
|
2652
|
+
def GetFontBold(self):
|
|
2653
|
+
""" Gets the font bold status. """
|
|
2654
|
+
|
|
2655
|
+
return self._fontBold
|
|
2656
|
+
|
|
2657
|
+
|
|
2658
|
+
def SetFontBold(self, bold):
|
|
2659
|
+
"""
|
|
2660
|
+
Sets whether the page captions are bold or not.
|
|
2661
|
+
|
|
2662
|
+
:param `bold`: ``True`` or ``False``.
|
|
2663
|
+
"""
|
|
2664
|
+
|
|
2665
|
+
self._fontBold = bold
|
|
2666
|
+
|
|
2667
|
+
|
|
2668
|
+
def GetFontSizeMultiple(self):
|
|
2669
|
+
""" Gets the font size multiple for the page captions. """
|
|
2670
|
+
|
|
2671
|
+
return self._fontSizeMultiple
|
|
2672
|
+
|
|
2673
|
+
|
|
2674
|
+
def SetFontSizeMultiple(self, multiple):
|
|
2675
|
+
"""
|
|
2676
|
+
Sets the font size multiple for the page captions.
|
|
2677
|
+
|
|
2678
|
+
:param `multiple`: The multiple to be applied to the system font to get the our font size.
|
|
2679
|
+
"""
|
|
2680
|
+
|
|
2681
|
+
self._fontSizeMultiple = int(multiple)
|
|
2682
|
+
|
|
2683
|
+
|
|
2684
|
+
def SetPageImage(self, page, imageId):
|
|
2685
|
+
"""
|
|
2686
|
+
Sets the image index for the given page.
|
|
2687
|
+
|
|
2688
|
+
:param `page`: an integer specifying the page index;
|
|
2689
|
+
:param `image`: an index into the image list.
|
|
2690
|
+
"""
|
|
2691
|
+
|
|
2692
|
+
self._pages.SetPageImage(page, imageId)
|
|
2693
|
+
self._pages.Refresh()
|
|
2694
|
+
|
|
2695
|
+
|
|
2696
|
+
def SetPageText(self, page, text):
|
|
2697
|
+
"""
|
|
2698
|
+
Sets the text for the given page.
|
|
2699
|
+
|
|
2700
|
+
:param `page`: an integer specifying the page index;
|
|
2701
|
+
:param `text`: the new tab label.
|
|
2702
|
+
"""
|
|
2703
|
+
|
|
2704
|
+
self._pages.SetPageText(page, text)
|
|
2705
|
+
self._pages.Refresh()
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
def GetPageText(self, page):
|
|
2709
|
+
"""
|
|
2710
|
+
Returns the text for the given page.
|
|
2711
|
+
|
|
2712
|
+
:param `page`: an integer specifying the page index.
|
|
2713
|
+
"""
|
|
2714
|
+
|
|
2715
|
+
return self._pages.GetPageText(page)
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
def GetPageImage(self, page):
|
|
2719
|
+
"""
|
|
2720
|
+
Returns the image index for the given page.
|
|
2721
|
+
|
|
2722
|
+
:param `page`: an integer specifying the page index.
|
|
2723
|
+
"""
|
|
2724
|
+
|
|
2725
|
+
return self._pages.GetPageImage(page)
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
def GetEnabled(self, page):
|
|
2729
|
+
"""
|
|
2730
|
+
Returns whether a tab is enabled or not.
|
|
2731
|
+
|
|
2732
|
+
:param `page`: an integer specifying the page index.
|
|
2733
|
+
"""
|
|
2734
|
+
|
|
2735
|
+
return self._pages.GetEnabled(page)
|
|
2736
|
+
|
|
2737
|
+
|
|
2738
|
+
def EnableTab(self, page, enabled=True):
|
|
2739
|
+
"""
|
|
2740
|
+
Enables or disables a tab.
|
|
2741
|
+
|
|
2742
|
+
:param `page`: an integer specifying the page index;
|
|
2743
|
+
:param `enabled`: ``True`` to enable a tab, ``False`` to disable it.
|
|
2744
|
+
"""
|
|
2745
|
+
|
|
2746
|
+
if page >= len(self._windows):
|
|
2747
|
+
return
|
|
2748
|
+
|
|
2749
|
+
self._windows[page].Enable(enabled)
|
|
2750
|
+
self._pages.EnableTab(page, enabled)
|
|
2751
|
+
|
|
2752
|
+
|
|
2753
|
+
def GetPage(self, page):
|
|
2754
|
+
"""
|
|
2755
|
+
Returns the window at the given page position.
|
|
2756
|
+
|
|
2757
|
+
:param `page`: an integer specifying the page to be returned.
|
|
2758
|
+
"""
|
|
2759
|
+
|
|
2760
|
+
if page >= len(self._windows):
|
|
2761
|
+
return
|
|
2762
|
+
|
|
2763
|
+
return self._windows[page]
|
|
2764
|
+
|
|
2765
|
+
|
|
2766
|
+
def GetCurrentPage(self):
|
|
2767
|
+
""" Returns the currently selected notebook page or ``None``. """
|
|
2768
|
+
|
|
2769
|
+
if self.GetSelection() < 0:
|
|
2770
|
+
return
|
|
2771
|
+
|
|
2772
|
+
return self.GetPage(self.GetSelection())
|
|
2773
|
+
|
|
2774
|
+
|
|
2775
|
+
def OnNavigationKey(self, event):
|
|
2776
|
+
"""
|
|
2777
|
+
Handles the ``wx.EVT_NAVIGATION_KEY`` event for :class:`FlatBookBase`.
|
|
2778
|
+
|
|
2779
|
+
:param `event`: a :class:`NavigationKeyEvent` event to be processed.
|
|
2780
|
+
"""
|
|
2781
|
+
|
|
2782
|
+
if event.IsWindowChange():
|
|
2783
|
+
if self.GetPageCount() == 0:
|
|
2784
|
+
return
|
|
2785
|
+
|
|
2786
|
+
# change pages
|
|
2787
|
+
self.AdvanceSelection(event.GetDirection())
|
|
2788
|
+
|
|
2789
|
+
else:
|
|
2790
|
+
event.Skip()
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
def AdvanceSelection(self, forward=True):
|
|
2794
|
+
"""
|
|
2795
|
+
Cycles through the tabs.
|
|
2796
|
+
|
|
2797
|
+
:param `forward`: if ``True``, the selection is advanced in ascending order
|
|
2798
|
+
(to the right), otherwise the selection is advanced in descending order.
|
|
2799
|
+
|
|
2800
|
+
:note: The call to this function generates the page changing events.
|
|
2801
|
+
"""
|
|
2802
|
+
|
|
2803
|
+
nSel = self.GetSelection()
|
|
2804
|
+
|
|
2805
|
+
if nSel < 0:
|
|
2806
|
+
return
|
|
2807
|
+
|
|
2808
|
+
nMax = self.GetPageCount() - 1
|
|
2809
|
+
|
|
2810
|
+
if forward:
|
|
2811
|
+
newSelection = (nSel == nMax and [0] or [nSel + 1])[0]
|
|
2812
|
+
else:
|
|
2813
|
+
newSelection = (nSel == 0 and [nMax] or [nSel - 1])[0]
|
|
2814
|
+
|
|
2815
|
+
self.SetSelection(newSelection)
|
|
2816
|
+
|
|
2817
|
+
|
|
2818
|
+
def ChangeSelection(self, page):
|
|
2819
|
+
"""
|
|
2820
|
+
Changes the selection for the given page, returning the previous selection.
|
|
2821
|
+
|
|
2822
|
+
:param `page`: an integer specifying the page to be selected.
|
|
2823
|
+
|
|
2824
|
+
:note: The call to this function does not generate the page changing events.
|
|
2825
|
+
"""
|
|
2826
|
+
|
|
2827
|
+
if page < 0 or page >= self.GetPageCount():
|
|
2828
|
+
return
|
|
2829
|
+
|
|
2830
|
+
oldPage = self.GetSelection()
|
|
2831
|
+
self.DoSetSelection(page)
|
|
2832
|
+
|
|
2833
|
+
return oldPage
|
|
2834
|
+
|
|
2835
|
+
CurrentPage = property(GetCurrentPage, doc="See `GetCurrentPage`")
|
|
2836
|
+
Page = property(GetPage, doc="See `GetPage`")
|
|
2837
|
+
PageCount = property(GetPageCount, doc="See `GetPageCount`")
|
|
2838
|
+
PageImage = property(GetPageImage, SetPageImage, doc="See `GetPageImage, SetPageImage`")
|
|
2839
|
+
PageText = property(GetPageText, SetPageText, doc="See `GetPageText, SetPageText`")
|
|
2840
|
+
Selection = property(GetSelection, SetSelection, doc="See `GetSelection, SetSelection`")
|
|
2841
|
+
|
|
2842
|
+
|
|
2843
|
+
# ---------------------------------------------------------------------------- #
|
|
2844
|
+
# Class FlatImageBook
|
|
2845
|
+
# ---------------------------------------------------------------------------- #
|
|
2846
|
+
|
|
2847
|
+
class FlatImageBook(FlatBookBase):
|
|
2848
|
+
"""
|
|
2849
|
+
Default implementation of the image book, it is like a :class:`Notebook`, except that
|
|
2850
|
+
images are used to control the different pages. This container is usually used
|
|
2851
|
+
for configuration dialogs etc.
|
|
2852
|
+
|
|
2853
|
+
:note: Currently, this control works properly for images of size 32x32 and bigger.
|
|
2854
|
+
"""
|
|
2855
|
+
|
|
2856
|
+
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
2857
|
+
style=0, agwStyle=0, name="FlatImageBook"):
|
|
2858
|
+
"""
|
|
2859
|
+
Default class constructor.
|
|
2860
|
+
|
|
2861
|
+
:param `parent`: parent window. Must not be ``None``;
|
|
2862
|
+
:param `id`: window identifier. A value of -1 indicates a default value;
|
|
2863
|
+
:param `pos`: the control position. A value of (-1, -1) indicates a default position,
|
|
2864
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
2865
|
+
:param `size`: the control size. A value of (-1, -1) indicates a default size,
|
|
2866
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
2867
|
+
:param `style`: the underlying :class:`Panel` window style;
|
|
2868
|
+
:param `agwStyle`: the AGW-specific window style. This can be a combination of the
|
|
2869
|
+
following bits:
|
|
2870
|
+
|
|
2871
|
+
=========================== =========== ==================================================
|
|
2872
|
+
Window Styles Hex Value Description
|
|
2873
|
+
=========================== =========== ==================================================
|
|
2874
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
2875
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
2876
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
2877
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
2878
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
2879
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
2880
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
2881
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
2882
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
2883
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
2884
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
2885
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
2886
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
2887
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
2888
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
2889
|
+
=========================== =========== ==================================================
|
|
2890
|
+
|
|
2891
|
+
:param `name`: the window name.
|
|
2892
|
+
"""
|
|
2893
|
+
|
|
2894
|
+
FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
|
|
2895
|
+
|
|
2896
|
+
self._pages = self.CreateImageContainer()
|
|
2897
|
+
|
|
2898
|
+
if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
|
|
2899
|
+
self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
2900
|
+
else:
|
|
2901
|
+
self._mainSizer = wx.BoxSizer(wx.VERTICAL)
|
|
2902
|
+
|
|
2903
|
+
self.SetSizer(self._mainSizer)
|
|
2904
|
+
|
|
2905
|
+
# Add the tab container to the sizer
|
|
2906
|
+
self._mainSizer.Add(self._pages, 0, wx.EXPAND)
|
|
2907
|
+
|
|
2908
|
+
if agwStyle & INB_LEFT or agwStyle & INB_RIGHT:
|
|
2909
|
+
self._pages.SetSizeHints(self._pages.GetImageSize() * 2, -1)
|
|
2910
|
+
else:
|
|
2911
|
+
self._pages.SetSizeHints(-1, self._pages.GetImageSize() * 2)
|
|
2912
|
+
|
|
2913
|
+
self._mainSizer.Layout()
|
|
2914
|
+
|
|
2915
|
+
|
|
2916
|
+
def CreateImageContainer(self):
|
|
2917
|
+
""" Creates the image container class for :class:`FlatImageBook`. """
|
|
2918
|
+
|
|
2919
|
+
return ImageContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag())
|
|
2920
|
+
|
|
2921
|
+
|
|
2922
|
+
# ---------------------------------------------------------------------------- #
|
|
2923
|
+
# Class LabelBook
|
|
2924
|
+
# ---------------------------------------------------------------------------- #
|
|
2925
|
+
|
|
2926
|
+
class LabelBook(FlatBookBase):
|
|
2927
|
+
"""
|
|
2928
|
+
An implementation of a notebook control - except that instead of having
|
|
2929
|
+
tabs to show labels, it labels to the right or left (arranged horizontally).
|
|
2930
|
+
"""
|
|
2931
|
+
|
|
2932
|
+
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
2933
|
+
style=0, agwStyle=0, name="LabelBook"):
|
|
2934
|
+
"""
|
|
2935
|
+
Default class constructor.
|
|
2936
|
+
|
|
2937
|
+
:param `parent`: parent window. Must not be ``None``;
|
|
2938
|
+
:param `id`: window identifier. A value of -1 indicates a default value;
|
|
2939
|
+
:param `pos`: the control position. A value of (-1, -1) indicates a default position,
|
|
2940
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
2941
|
+
:param `size`: the control size. A value of (-1, -1) indicates a default size,
|
|
2942
|
+
chosen by either the windowing system or wxPython, depending on platform;
|
|
2943
|
+
:param `style`: the underlying :class:`Panel` window style;
|
|
2944
|
+
:param `agwStyle`: the AGW-specific window style. This can be a combination of the
|
|
2945
|
+
following bits:
|
|
2946
|
+
|
|
2947
|
+
=========================== =========== ==================================================
|
|
2948
|
+
Window Styles Hex Value Description
|
|
2949
|
+
=========================== =========== ==================================================
|
|
2950
|
+
``INB_BOTTOM`` 0x1 Place labels below the page area. Available only for :class:`FlatImageBook`.
|
|
2951
|
+
``INB_LEFT`` 0x2 Place labels on the left side. Available only for :class:`FlatImageBook`.
|
|
2952
|
+
``INB_RIGHT`` 0x4 Place labels on the right side.
|
|
2953
|
+
``INB_TOP`` 0x8 Place labels above the page area.
|
|
2954
|
+
``INB_BORDER`` 0x10 Draws a border around :class:`LabelBook` or :class:`FlatImageBook`.
|
|
2955
|
+
``INB_SHOW_ONLY_TEXT`` 0x20 Shows only text labels and no images. Available only for :class:`LabelBook`.
|
|
2956
|
+
``INB_SHOW_ONLY_IMAGES`` 0x40 Shows only tab images and no label texts. Available only for :class:`LabelBook`.
|
|
2957
|
+
``INB_FIT_BUTTON`` 0x80 Displays a pin button to show/hide the book control.
|
|
2958
|
+
``INB_DRAW_SHADOW`` 0x100 Draw shadows below the book tabs. Available only for :class:`LabelBook`.
|
|
2959
|
+
``INB_USE_PIN_BUTTON`` 0x200 Displays a pin button to show/hide the book control.
|
|
2960
|
+
``INB_GRADIENT_BACKGROUND`` 0x400 Draws a gradient shading on the tabs background. Available only for :class:`LabelBook`.
|
|
2961
|
+
``INB_WEB_HILITE`` 0x800 On mouse hovering, tabs behave like html hyperlinks. Available only for :class:`LabelBook`.
|
|
2962
|
+
``INB_NO_RESIZE`` 0x1000 Don't allow resizing of the tab area.
|
|
2963
|
+
``INB_FIT_LABELTEXT`` 0x2000 Will fit the tab area to the longest text (or text+image if you have images) in all the tabs.
|
|
2964
|
+
``INB_BOLD_TAB_SELECTION`` 0x4000 Show the selected tab text using a bold font.
|
|
2965
|
+
=========================== =========== ==================================================
|
|
2966
|
+
|
|
2967
|
+
:param `name`: the window name.
|
|
2968
|
+
"""
|
|
2969
|
+
|
|
2970
|
+
FlatBookBase.__init__(self, parent, id, pos, size, style, agwStyle, name)
|
|
2971
|
+
|
|
2972
|
+
self._pages = self.CreateImageContainer()
|
|
2973
|
+
|
|
2974
|
+
# Label book specific initialization
|
|
2975
|
+
self._mainSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
2976
|
+
self.SetSizer(self._mainSizer)
|
|
2977
|
+
|
|
2978
|
+
# Add the tab container to the sizer
|
|
2979
|
+
self._mainSizer.Add(self._pages, 0, wx.EXPAND)
|
|
2980
|
+
self._pages.SetSizeHints(self._pages.GetTabAreaWidth(), -1)
|
|
2981
|
+
|
|
2982
|
+
# Initialize the colours maps
|
|
2983
|
+
self._pages.InitializeColours()
|
|
2984
|
+
|
|
2985
|
+
self.Bind(wx.EVT_SIZE, self.OnSize)
|
|
2986
|
+
|
|
2987
|
+
|
|
2988
|
+
def CreateImageContainer(self):
|
|
2989
|
+
""" Creates the image container (LabelContainer) class for :class:`FlatImageBook`. """
|
|
2990
|
+
|
|
2991
|
+
return LabelContainer(self, wx.ID_ANY, agwStyle=self.GetAGWWindowStyleFlag())
|
|
2992
|
+
|
|
2993
|
+
|
|
2994
|
+
def SetColour(self, which, colour):
|
|
2995
|
+
"""
|
|
2996
|
+
Sets the colour for the specified parameter.
|
|
2997
|
+
|
|
2998
|
+
:param `which`: the colour key;
|
|
2999
|
+
:param `colour`: a valid :class:`wx.Colour` instance.
|
|
3000
|
+
|
|
3001
|
+
:see: :meth:`LabelContainer.SetColour() <LabelContainer.SetColour>` for a list of valid colour keys.
|
|
3002
|
+
"""
|
|
3003
|
+
|
|
3004
|
+
self._pages.SetColour(which, colour)
|
|
3005
|
+
|
|
3006
|
+
|
|
3007
|
+
def GetColour(self, which):
|
|
3008
|
+
"""
|
|
3009
|
+
Returns the colour for the specified parameter.
|
|
3010
|
+
|
|
3011
|
+
:param `which`: the colour key.
|
|
3012
|
+
|
|
3013
|
+
:see: :meth:`LabelContainer.SetColour() <LabelContainer.SetColour>` for a list of valid colour keys.
|
|
3014
|
+
"""
|
|
3015
|
+
|
|
3016
|
+
return self._pages.GetColour(which)
|
|
3017
|
+
|
|
3018
|
+
|
|
3019
|
+
def OnSize(self, event):
|
|
3020
|
+
"""
|
|
3021
|
+
Handles the ``wx.EVT_SIZE`` event for :class:`LabelBook`.
|
|
3022
|
+
|
|
3023
|
+
:param `event`: a :class:`wx.SizeEvent` event to be processed.
|
|
3024
|
+
"""
|
|
3025
|
+
|
|
3026
|
+
self._pages.Refresh()
|
|
3027
|
+
event.Skip()
|
|
3028
|
+
|
|
3029
|
+
|