urwid 2.6.5__tar.gz → 2.6.6__tar.gz
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.
- {urwid-2.6.5 → urwid-2.6.6}/PKG-INFO +1 -1
- {urwid-2.6.5 → urwid-2.6.6}/pyproject.toml +4 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_columns.py +82 -3
- {urwid-2.6.5 → urwid-2.6.6}/urwid/version.py +2 -2
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/columns.py +70 -26
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/frame.py +17 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/grid_flow.py +34 -1
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/overlay.py +62 -2
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/padding.py +10 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/pile.py +45 -14
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/widget.py +1 -1
- {urwid-2.6.5 → urwid-2.6.6}/urwid.egg-info/PKG-INFO +1 -1
- {urwid-2.6.5 → urwid-2.6.6}/.coveralls.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.devcontainer/dev.dockerfile +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.devcontainer/devcontainer.json +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.dockerignore +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/CODE_OF_CONDUCT.md +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/ISSUE_TEMPLATE/docs.md +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/dependabot.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/labeler.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/release.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/workflows/documentation.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/workflows/isolated_static_check.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/workflows/labels.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/workflows/pythonpackage.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.github/workflows/yamllint.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.gitignore +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.pre-commit-config.yaml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/.yamllint.yml +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/COPYING +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/MANIFEST.in +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/README.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/black-requirements.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/classifiers.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/Makefile +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/changelog.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/conf.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/bigtext.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/bigtext.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/bigtext1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/bigtext2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/bigtext3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/browse.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/browse.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/browse1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/browse2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/edit.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/edit.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/edit1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/edit2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/edit_text.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/graph.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/graph.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/graph1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/graph2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/index.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/palette_test.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/palette_test.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/palette_test1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/palette_test2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/pop_up.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/pop_up.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/pop_up1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/pop_up2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/real_browse.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/real_edit.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/subproc.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/subproc.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/subproc1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/subproc2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/subproc2.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/tour.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/tour.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/tour1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/examples/tour2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/index.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/bright_combinations.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/bright_combinations.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/bright_combinations1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/canvascache.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/displayattributes.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/displaymodules.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/encodings.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/display_modules.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/introduction.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/urwid_widgets.svgz +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/urwid_widgets_1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/urwid_widgets_1.xcf +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/urwid_widgets_2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/urwid_widgets_2.xcf +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/images/widget_layout.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/index.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/mainloop.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/overview.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/safe_combinations.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/safe_combinations.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/safe_combinations1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/textlayout.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/userinput.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/wanat.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/wanat_multi.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/wcur1.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/wcur2.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/widgets.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/wmod.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/manual/wsel.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/attrspec.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/canvas.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/command_map.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/constants.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/deprecated.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/display_modules.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/exceptions.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/global_settings.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/index.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/list_walkers.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/main_loop.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/meta.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/signals.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/text_layout.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/reference/widget.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tools/compile_pngs.sh +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tools/screenshots.sh +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tools/static/.placeholder +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tools/templates/indexcontent.html +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tools/templates/indexsidebar.html +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tools/templates/localtoc.html +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/adventure.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/adventure.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/adventure1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/adventure2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/adventure3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/adventure4.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/cmenu.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/cmenu.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/cmenu1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/cmenu2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/cmenu3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/cmenu4.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/highcolors.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/highcolors.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/highcolors1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/hmenu.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/hmenu.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/hmenu1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/hmenu2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/hmenu3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/hmenu4.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/index.rst +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/input.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/input.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/input1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/input2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/input3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/input4.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/input5.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/menu25.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/minimal.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/minimal.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/minimal1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/multiple.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/multiple.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/multiple1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/multiple2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/multiple3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/multiple4.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/qa.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/qa.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/qa1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/qa2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/qa3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/sig.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/sig.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/sig1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/sig2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/sig3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/sig4.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/smenu.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/smenu.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/smenu1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/smenu2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/smenu3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/urwid_attr.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/urwid_attr.py.xdotool +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/urwid_attr1.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/urwid_attr2.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/urwid_attr3.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/tutorial/urwid_attr4.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/docs/urwid-logo.png +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/asyncio_socket_server.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/bigtext.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/browse.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/calc.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/dialog.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/edit.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/fib.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/graph.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/input_test.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/lcd_cf635.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/palette_test.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/pop_up.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/subproc.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/subproc2.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/terminal.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/tour.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/treesample.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/twisted_serve_ssh.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/examples/twisted_serve_ssh.tac +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/isort-requirements.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/pylint-requirements.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/requirements.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/ruff-requirements.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/setup.cfg +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/setup.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/test_requirements.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/__init__.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_canvas.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_container.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_doctests.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_escapes.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_event_loops.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_filler.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_floatedit.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_font.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_frame.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_graphics.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_grid_flow.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_line_box.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_listbox.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_moved_imports.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_overlay.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_padding.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_pile.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_raw_display.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_scrollable.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_signals.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_str_util.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_text_layout.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_tree.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_util.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_vterm.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/test_widget.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tests/util.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/tox.ini +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/__init__.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/canvas.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/command_map.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/container.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/decoration.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/__init__.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/_posix_raw_display.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/_raw_display_base.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/_web.css +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/_web.js +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/_win32.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/_win32_raw_display.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/common.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/curses.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/escape.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/html_fragment.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/lcd.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/raw.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/display/web.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/__init__.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/abstract_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/asyncio_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/glib_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/main_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/select_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/tornado_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/trio_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/twisted_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/event_loop/zmq_loop.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/font.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/graphics.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/numedit.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/signals.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/split_repr.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/str_util.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/text_layout.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/util.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/vterm.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/__init__.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/attr_map.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/attr_wrap.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/bar_graph.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/big_text.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/box_adapter.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/constants.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/container.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/divider.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/edit.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/filler.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/line_box.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/listbox.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/monitored_list.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/popup.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/progress_bar.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/scrollable.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/solid_fill.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/text.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/treetools.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/widget_decoration.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/widget/wimp.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid/wimp.py +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid.egg-info/SOURCES.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid.egg-info/dependency_links.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid.egg-info/not-zip-safe +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid.egg-info/requires.txt +0 -0
- {urwid-2.6.5 → urwid-2.6.6}/urwid.egg-info/top_level.txt +0 -0
|
@@ -90,6 +90,10 @@ exclude_lines = [
|
|
|
90
90
|
|
|
91
91
|
# Don't complain about missing debug-only code:
|
|
92
92
|
"def __repr__",
|
|
93
|
+
"def __rich_repr__",
|
|
94
|
+
# own repr construct magic
|
|
95
|
+
"def _repr_words",
|
|
96
|
+
"def _repr_attrs",
|
|
93
97
|
|
|
94
98
|
# Don't complain if tests don't hit defensive assertion code:
|
|
95
99
|
"raise NotImplementedError",
|
|
@@ -80,13 +80,40 @@ class ColumnsTest(unittest.TestCase):
|
|
|
80
80
|
|
|
81
81
|
with self.subTest("FIXED only"):
|
|
82
82
|
widget = urwid.Columns(((urwid.PACK, fixed_only),))
|
|
83
|
-
self.assertEqual(frozenset((urwid.FIXED
|
|
83
|
+
self.assertEqual(frozenset((urwid.FLOW, urwid.FIXED)), widget.sizing())
|
|
84
84
|
cols, rows = 3, 3
|
|
85
85
|
self.assertEqual((cols, rows), widget.pack(()))
|
|
86
86
|
canvas = widget.render(())
|
|
87
87
|
self.assertEqual(cols, canvas.cols())
|
|
88
88
|
self.assertEqual(rows, canvas.rows())
|
|
89
89
|
|
|
90
|
+
with self.subTest("FIXED only use FLOW methods - drop & replace by solid"):
|
|
91
|
+
widget = urwid.Columns(((urwid.PACK, fixed_only),))
|
|
92
|
+
self.assertEqual(frozenset((urwid.FLOW, urwid.FIXED)), widget.sizing())
|
|
93
|
+
cols, rows = 2, 1
|
|
94
|
+
self.assertEqual((cols, rows), widget.pack((cols,)))
|
|
95
|
+
canvas = widget.render((cols,))
|
|
96
|
+
self.assertEqual(cols, canvas.cols())
|
|
97
|
+
self.assertEqual(rows, canvas.rows())
|
|
98
|
+
self.assertEqual(" ", str(canvas))
|
|
99
|
+
|
|
100
|
+
with self.subTest("FIXED only use FLOW methods - add empty space"):
|
|
101
|
+
widget = urwid.Columns(((urwid.PACK, fixed_only),))
|
|
102
|
+
self.assertEqual(frozenset((urwid.FLOW, urwid.FIXED)), widget.sizing())
|
|
103
|
+
cols, rows = 5, 3
|
|
104
|
+
self.assertEqual((cols, rows), widget.pack((cols,)))
|
|
105
|
+
canvas = widget.render((cols,))
|
|
106
|
+
self.assertEqual(cols, canvas.cols())
|
|
107
|
+
self.assertEqual(rows, canvas.rows())
|
|
108
|
+
self.assertEqual(
|
|
109
|
+
(
|
|
110
|
+
"┌─┐ ",
|
|
111
|
+
"│ │ ",
|
|
112
|
+
"└─┘ ",
|
|
113
|
+
),
|
|
114
|
+
canvas.decoded_text,
|
|
115
|
+
)
|
|
116
|
+
|
|
90
117
|
with self.subTest("GIVEN BOX + FLOW/FIXED, but other widgets do not support box"):
|
|
91
118
|
widget = urwid.Columns((flow_fixed, (3, box_only)), box_columns=(1,))
|
|
92
119
|
self.assertEqual(frozenset((urwid.FLOW, urwid.FIXED)), widget.sizing())
|
|
@@ -153,8 +180,7 @@ class ColumnsTest(unittest.TestCase):
|
|
|
153
180
|
)
|
|
154
181
|
|
|
155
182
|
cols, rows = 30, 1
|
|
156
|
-
|
|
157
|
-
widget.pack((cols,))
|
|
183
|
+
self.assertEqual((cols, rows), widget.pack((cols,)))
|
|
158
184
|
|
|
159
185
|
canvas = widget.render((cols,))
|
|
160
186
|
self.assertEqual(rows, canvas.rows())
|
|
@@ -241,6 +267,59 @@ class ColumnsTest(unittest.TestCase):
|
|
|
241
267
|
str(ctx.warnings[0].message),
|
|
242
268
|
)
|
|
243
269
|
|
|
270
|
+
def test_pack_render_skip_widget(self):
|
|
271
|
+
widget = urwid.Columns(((0, urwid.Text("Ignore\nme")), (urwid.Text("Count"))))
|
|
272
|
+
cols, rows = 5, 1
|
|
273
|
+
self.assertEqual((cols, rows), widget.pack(()))
|
|
274
|
+
self.assertEqual((cols, rows), widget.pack((cols,)))
|
|
275
|
+
self.assertEqual("Count", str(widget.render(())))
|
|
276
|
+
self.assertEqual("Count", str(widget.render((cols,))))
|
|
277
|
+
|
|
278
|
+
def test_pack_flow_with_fixed_item(self):
|
|
279
|
+
widget = urwid.Columns(
|
|
280
|
+
(
|
|
281
|
+
(urwid.PACK, urwid.BigText("3", urwid.Thin3x3Font())),
|
|
282
|
+
(urwid.Text("Multi\nline\ntext\n???")),
|
|
283
|
+
),
|
|
284
|
+
dividechars=1,
|
|
285
|
+
)
|
|
286
|
+
with self.subTest("Skip"):
|
|
287
|
+
self.assertEqual(3, widget.rows((3,)))
|
|
288
|
+
self.assertEqual((3, 3), widget.pack((3,)))
|
|
289
|
+
self.assertEqual(
|
|
290
|
+
(
|
|
291
|
+
"┌─┐",
|
|
292
|
+
" ─┤",
|
|
293
|
+
"└─┘",
|
|
294
|
+
),
|
|
295
|
+
widget.render((3,)).decoded_text,
|
|
296
|
+
)
|
|
297
|
+
with self.subTest("Fit all"):
|
|
298
|
+
self.assertEqual(4, widget.rows((9,)))
|
|
299
|
+
self.assertEqual((9, 4), widget.pack((9,)))
|
|
300
|
+
self.assertEqual(
|
|
301
|
+
(
|
|
302
|
+
"┌─┐ Multi",
|
|
303
|
+
" ─┤ line ",
|
|
304
|
+
"└─┘ text ",
|
|
305
|
+
" ??? ",
|
|
306
|
+
),
|
|
307
|
+
widget.render((9,)).decoded_text,
|
|
308
|
+
)
|
|
309
|
+
with self.subTest("Use SolidCanvas instead"):
|
|
310
|
+
self.assertEqual(1, widget.rows((2,)))
|
|
311
|
+
self.assertEqual((2, 1), widget.pack((2,)))
|
|
312
|
+
self.assertEqual((" ",), widget.render((2,)).decoded_text)
|
|
313
|
+
|
|
314
|
+
def test_pack_render_empty_widget(self):
|
|
315
|
+
widget = urwid.Columns(())
|
|
316
|
+
self.assertEqual(frozenset((urwid.FLOW, urwid.BOX)), widget.sizing())
|
|
317
|
+
cols, rows = 10, 1
|
|
318
|
+
self.assertEqual((cols, rows), widget.pack((cols,)))
|
|
319
|
+
canvas = widget.render((cols,))
|
|
320
|
+
self.assertEqual(rows, canvas.rows())
|
|
321
|
+
self.assertEqual((" ",), canvas.decoded_text)
|
|
322
|
+
|
|
244
323
|
def test_not_a_widget(self):
|
|
245
324
|
class NotAWidget:
|
|
246
325
|
__slots__ = ("name", "symbol")
|
|
@@ -7,6 +7,7 @@ from itertools import chain, repeat
|
|
|
7
7
|
import urwid
|
|
8
8
|
from urwid.canvas import Canvas, CanvasJoin, CompositeCanvas, SolidCanvas
|
|
9
9
|
from urwid.command_map import Command
|
|
10
|
+
from urwid.split_repr import remove_defaults
|
|
10
11
|
from urwid.util import is_mouse_press
|
|
11
12
|
|
|
12
13
|
from .constants import Align, Sizing, WHSettings
|
|
@@ -15,7 +16,7 @@ from .monitored_list import MonitoredFocusList, MonitoredList
|
|
|
15
16
|
from .widget import Widget, WidgetError, WidgetWarning
|
|
16
17
|
|
|
17
18
|
if typing.TYPE_CHECKING:
|
|
18
|
-
from collections.abc import Iterable, Sequence
|
|
19
|
+
from collections.abc import Iterable, Iterator, Sequence
|
|
19
20
|
|
|
20
21
|
from typing_extensions import Literal
|
|
21
22
|
|
|
@@ -66,43 +67,43 @@ class Columns(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
|
|
|
66
67
|
|
|
67
68
|
# BOX-only widget
|
|
68
69
|
>>> Columns((SolidFill("#"),))
|
|
69
|
-
<Columns box widget
|
|
70
|
+
<Columns box widget (1 item)>
|
|
70
71
|
|
|
71
72
|
# BOX-only widget with "get height from max"
|
|
72
73
|
>>> Columns((SolidFill("#"),), box_columns=(0,))
|
|
73
|
-
<Columns box widget
|
|
74
|
+
<Columns box widget (1 item)>
|
|
74
75
|
|
|
75
76
|
# FLOW-only
|
|
76
77
|
>>> Columns((Edit(),))
|
|
77
|
-
<Columns selectable flow widget
|
|
78
|
+
<Columns selectable flow widget (1 item)>
|
|
78
79
|
|
|
79
80
|
# FLOW allowed by "box_columns"
|
|
80
81
|
>>> Columns((Edit(), SolidFill("#")), box_columns=(1,))
|
|
81
|
-
<Columns selectable flow widget
|
|
82
|
+
<Columns selectable flow widget (2 items) focus_column=0>
|
|
82
83
|
|
|
83
84
|
# FLOW/FIXED
|
|
84
85
|
>>> Columns((Text("T"),))
|
|
85
|
-
<Columns fixed/flow widget
|
|
86
|
+
<Columns fixed/flow widget (1 item)>
|
|
86
87
|
|
|
87
88
|
# GIVEN BOX only -> BOX only
|
|
88
89
|
>>> Columns(((5, SolidFill("#")),), box_columns=(0,))
|
|
89
|
-
<Columns box widget
|
|
90
|
+
<Columns box widget (1 item)>
|
|
90
91
|
|
|
91
92
|
# No FLOW - BOX only
|
|
92
93
|
>>> Columns(((5, SolidFill("#")), SolidFill("*")), box_columns=(0, 1))
|
|
93
|
-
<Columns box widget
|
|
94
|
+
<Columns box widget (2 items) focus_column=0>
|
|
94
95
|
|
|
95
|
-
# FIXED only -> FIXED
|
|
96
|
+
# FIXED only -> FIXED (and FLOW via drop/expand)
|
|
96
97
|
>>> Columns(((WHSettings.PACK, BigText("1", font)),))
|
|
97
|
-
<Columns fixed widget
|
|
98
|
+
<Columns fixed/flow widget (1 item)>
|
|
98
99
|
|
|
99
100
|
# Invalid sizing combination -> use fallback settings (and produce warning)
|
|
100
101
|
>>> Columns(((WHSettings.PACK, SolidFill("#")),))
|
|
101
|
-
<Columns box/flow widget
|
|
102
|
+
<Columns box/flow widget (1 item)>
|
|
102
103
|
|
|
103
104
|
# Special case: empty columns widget sizing is impossible to calculate
|
|
104
105
|
>>> Columns(())
|
|
105
|
-
<Columns box/flow widget
|
|
106
|
+
<Columns box/flow widget ()>
|
|
106
107
|
"""
|
|
107
108
|
if not self.contents:
|
|
108
109
|
return frozenset((urwid.BOX, urwid.FLOW))
|
|
@@ -183,6 +184,7 @@ class Columns(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
|
|
|
183
184
|
supported.add(Sizing.FLOW)
|
|
184
185
|
|
|
185
186
|
if has_fixed and not block_fixed:
|
|
187
|
+
supported.add(Sizing.FLOW)
|
|
186
188
|
supported.add(Sizing.FIXED)
|
|
187
189
|
|
|
188
190
|
if not supported:
|
|
@@ -289,10 +291,50 @@ class Columns(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
|
|
|
289
291
|
|
|
290
292
|
def _repr_words(self) -> list[str]:
|
|
291
293
|
if len(self.contents) > 1:
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
294
|
+
contents_string = f"({len(self.contents)} items)"
|
|
295
|
+
elif self.contents:
|
|
296
|
+
contents_string = "(1 item)"
|
|
297
|
+
else:
|
|
298
|
+
contents_string = "()"
|
|
299
|
+
return [*super()._repr_words(), contents_string]
|
|
300
|
+
|
|
301
|
+
def _repr_attrs(self) -> dict[str, typing.Any]:
|
|
302
|
+
attrs = {
|
|
303
|
+
**super()._repr_attrs(),
|
|
304
|
+
"dividechars": self.dividechars,
|
|
305
|
+
"focus_column": self.focus_position if len(self._contents) > 1 else None,
|
|
306
|
+
"min_width": self.min_width,
|
|
307
|
+
}
|
|
308
|
+
return remove_defaults(attrs, Columns.__init__)
|
|
309
|
+
|
|
310
|
+
def __rich_repr__(self) -> Iterator[tuple[str | None, typing.Any] | typing.Any]:
|
|
311
|
+
widget_list: list[
|
|
312
|
+
Widget
|
|
313
|
+
| tuple[Literal[WHSettings.PACK] | int, Widget]
|
|
314
|
+
| tuple[Literal[WHSettings.WEIGHT], int | float, Widget]
|
|
315
|
+
] = []
|
|
316
|
+
box_columns: list[int] = []
|
|
317
|
+
for idx, (w_instance, (sizing, amount, is_box)) in enumerate(self._contents):
|
|
318
|
+
if sizing == WHSettings.GIVEN:
|
|
319
|
+
widget_list.append((amount, w_instance))
|
|
320
|
+
elif sizing == WHSettings.PACK:
|
|
321
|
+
widget_list.append((WHSettings.PACK, w_instance))
|
|
322
|
+
elif amount == 1:
|
|
323
|
+
widget_list.append(w_instance)
|
|
324
|
+
else:
|
|
325
|
+
widget_list.append((WHSettings.WEIGHT, amount, w_instance))
|
|
326
|
+
|
|
327
|
+
if is_box:
|
|
328
|
+
box_columns.append(idx)
|
|
329
|
+
|
|
330
|
+
yield "widget_list", widget_list
|
|
331
|
+
yield "dividechars", self.dividechars
|
|
332
|
+
yield "focus_column", self.focus_position if self._contents else None
|
|
333
|
+
yield "min_width", self.min_width
|
|
334
|
+
yield "box_columns", box_columns
|
|
335
|
+
|
|
336
|
+
def __len__(self) -> int:
|
|
337
|
+
return len(self._contents)
|
|
296
338
|
|
|
297
339
|
def _contents_modified(self) -> None:
|
|
298
340
|
"""
|
|
@@ -904,11 +946,17 @@ class Columns(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
|
|
|
904
946
|
box.append(i)
|
|
905
947
|
|
|
906
948
|
elif Sizing.FLOW in w_sizing:
|
|
907
|
-
|
|
949
|
+
if width > 0:
|
|
950
|
+
heights[i] = widget.rows((width,), focus and i == self.focus_position)
|
|
951
|
+
else:
|
|
952
|
+
heights[i] = 0
|
|
908
953
|
w_h_args[i] = (width,)
|
|
909
954
|
|
|
910
955
|
elif size_kind == WHSettings.PACK:
|
|
911
|
-
|
|
956
|
+
if width > 0:
|
|
957
|
+
heights[i] = widget.pack((), focus and i == self.focus_position)[1]
|
|
958
|
+
else:
|
|
959
|
+
heights[i] = 0
|
|
912
960
|
w_h_args[i] = ()
|
|
913
961
|
|
|
914
962
|
else:
|
|
@@ -1135,14 +1183,10 @@ class Columns(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
|
|
|
1135
1183
|
|
|
1136
1184
|
see :meth:`Widget.rows` for details
|
|
1137
1185
|
"""
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
if b or mc <= 0:
|
|
1143
|
-
continue
|
|
1144
|
-
rows = max(rows, w.rows((mc,), focus=focus and self.focus_position == i))
|
|
1145
|
-
return rows
|
|
1186
|
+
_, heights, _ = self.get_column_sizes(size, focus)
|
|
1187
|
+
if heights:
|
|
1188
|
+
return max(1, *heights)
|
|
1189
|
+
return 1
|
|
1146
1190
|
|
|
1147
1191
|
def keypress(
|
|
1148
1192
|
self,
|
|
@@ -4,6 +4,7 @@ import typing
|
|
|
4
4
|
import warnings
|
|
5
5
|
|
|
6
6
|
from urwid.canvas import CanvasCombine, CompositeCanvas
|
|
7
|
+
from urwid.split_repr import remove_defaults
|
|
7
8
|
from urwid.util import is_mouse_press
|
|
8
9
|
|
|
9
10
|
from .constants import Sizing, VAlign
|
|
@@ -89,6 +90,22 @@ class Frame(Widget, WidgetContainerMixin, typing.Generic[BodyWidget, HeaderWidge
|
|
|
89
90
|
_check_widget_subclass(body)
|
|
90
91
|
_check_widget_subclass(footer)
|
|
91
92
|
|
|
93
|
+
def _repr_attrs(self) -> dict[str, typing.Any]:
|
|
94
|
+
attrs = {
|
|
95
|
+
**super()._repr_attrs(),
|
|
96
|
+
"body": self._body,
|
|
97
|
+
"header": self._header,
|
|
98
|
+
"footer": self._footer,
|
|
99
|
+
"focus_part": self.focus_part,
|
|
100
|
+
}
|
|
101
|
+
return remove_defaults(attrs, Frame.__init__)
|
|
102
|
+
|
|
103
|
+
def __rich_repr__(self) -> Iterator[tuple[str | None, typing.Any] | typing.Any]:
|
|
104
|
+
yield "body", self._body
|
|
105
|
+
yield "header", self._header
|
|
106
|
+
yield "footer", self._footer
|
|
107
|
+
yield "focus_part", self.focus_part
|
|
108
|
+
|
|
92
109
|
@property
|
|
93
110
|
def header(self) -> HeaderWidget:
|
|
94
111
|
return self._header
|
|
@@ -3,6 +3,8 @@ from __future__ import annotations
|
|
|
3
3
|
import typing
|
|
4
4
|
import warnings
|
|
5
5
|
|
|
6
|
+
from urwid.split_repr import remove_defaults
|
|
7
|
+
|
|
6
8
|
from .columns import Columns
|
|
7
9
|
from .constants import Align, Sizing, WHSettings
|
|
8
10
|
from .container import WidgetContainerListContentsMixin, WidgetContainerMixin
|
|
@@ -13,7 +15,7 @@ from .pile import Pile
|
|
|
13
15
|
from .widget import Widget, WidgetError, WidgetWarning, WidgetWrap
|
|
14
16
|
|
|
15
17
|
if typing.TYPE_CHECKING:
|
|
16
|
-
from collections.abc import Iterable, Sequence
|
|
18
|
+
from collections.abc import Iterable, Iterator, Sequence
|
|
17
19
|
|
|
18
20
|
from typing_extensions import Literal
|
|
19
21
|
|
|
@@ -78,6 +80,37 @@ class GridFlow(WidgetWrap[Pile], WidgetContainerMixin, WidgetContainerListConten
|
|
|
78
80
|
self._cache_maxcol = self._get_maxcol(())
|
|
79
81
|
super().__init__(self.generate_display_widget((self._cache_maxcol,)))
|
|
80
82
|
|
|
83
|
+
def _repr_words(self) -> list[str]:
|
|
84
|
+
if len(self.contents) > 1:
|
|
85
|
+
contents_string = f"({len(self.contents)} items)"
|
|
86
|
+
elif self.contents:
|
|
87
|
+
contents_string = "(1 item)"
|
|
88
|
+
else:
|
|
89
|
+
contents_string = "()"
|
|
90
|
+
return [*super()._repr_words(), contents_string]
|
|
91
|
+
|
|
92
|
+
def _repr_attrs(self) -> dict[str, typing.Any]:
|
|
93
|
+
attrs = {
|
|
94
|
+
**super()._repr_attrs(),
|
|
95
|
+
"cell_width": self.cell_width,
|
|
96
|
+
"h_sep": self.h_sep,
|
|
97
|
+
"v_sep": self.v_sep,
|
|
98
|
+
"align": self.align,
|
|
99
|
+
"focus": self.focus_position if len(self._contents) > 1 else None,
|
|
100
|
+
}
|
|
101
|
+
return remove_defaults(attrs, GridFlow.__init__)
|
|
102
|
+
|
|
103
|
+
def __rich_repr__(self) -> Iterator[tuple[str | None, typing.Any] | typing.Any]:
|
|
104
|
+
yield "cells", [widget for widget, _ in self.contents]
|
|
105
|
+
yield "cell_width", self.cell_width
|
|
106
|
+
yield "h_sep", self.h_sep
|
|
107
|
+
yield "v_sep", self.v_sep
|
|
108
|
+
yield "align", self.align
|
|
109
|
+
yield "focus", self.focus_position
|
|
110
|
+
|
|
111
|
+
def __len__(self) -> int:
|
|
112
|
+
return len(self._contents)
|
|
113
|
+
|
|
81
114
|
def _invalidate(self) -> None:
|
|
82
115
|
self._cache_maxcol = None
|
|
83
116
|
super()._invalidate()
|
|
@@ -4,6 +4,7 @@ import typing
|
|
|
4
4
|
import warnings
|
|
5
5
|
|
|
6
6
|
from urwid.canvas import CanvasOverlay, CompositeCanvas
|
|
7
|
+
from urwid.split_repr import remove_defaults
|
|
7
8
|
|
|
8
9
|
from .constants import (
|
|
9
10
|
RELATIVE_100,
|
|
@@ -330,8 +331,67 @@ class Overlay(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin, ty
|
|
|
330
331
|
f"min_height={self.min_height!r}"
|
|
331
332
|
)
|
|
332
333
|
|
|
333
|
-
def
|
|
334
|
-
|
|
334
|
+
def _repr_attrs(self) -> dict[str, typing.Any]:
|
|
335
|
+
attrs = {
|
|
336
|
+
**super()._repr_attrs(),
|
|
337
|
+
"top_w": self.top_w,
|
|
338
|
+
"bottom_w": self.bottom_w,
|
|
339
|
+
"align": self.align,
|
|
340
|
+
"width": self.width,
|
|
341
|
+
"valign": self.valign,
|
|
342
|
+
"height": self.height,
|
|
343
|
+
"min_width": self.min_width,
|
|
344
|
+
"min_height": self.min_height,
|
|
345
|
+
"left": self.left,
|
|
346
|
+
"right": self.right,
|
|
347
|
+
"top": self.top,
|
|
348
|
+
"bottom": self.bottom,
|
|
349
|
+
}
|
|
350
|
+
return remove_defaults(attrs, Overlay.__init__)
|
|
351
|
+
|
|
352
|
+
def __rich_repr__(self) -> Iterator[tuple[str | None, typing.Any] | typing.Any]:
|
|
353
|
+
yield "top", self.top_w
|
|
354
|
+
yield "bottom", self.bottom_w
|
|
355
|
+
yield "align", self.align
|
|
356
|
+
yield "width", self.width
|
|
357
|
+
yield "valign", self.valign
|
|
358
|
+
yield "height", self.height
|
|
359
|
+
yield "min_width", self.min_width
|
|
360
|
+
yield "min_height", self.min_height
|
|
361
|
+
yield "left", self.left
|
|
362
|
+
yield "right", self.right
|
|
363
|
+
yield "top", self.top
|
|
364
|
+
yield "bottom", self.bottom
|
|
365
|
+
|
|
366
|
+
@property
|
|
367
|
+
def align(self) -> Align | tuple[Literal[WHSettings.RELATIVE], int]:
|
|
368
|
+
return simplify_align(self.align_type, self.align_amount)
|
|
369
|
+
|
|
370
|
+
@property
|
|
371
|
+
def width(
|
|
372
|
+
self,
|
|
373
|
+
) -> (
|
|
374
|
+
Literal[WHSettings.CLIP, WHSettings.PACK]
|
|
375
|
+
| int
|
|
376
|
+
| tuple[Literal[WHSettings.RELATIVE], int]
|
|
377
|
+
| tuple[Literal[WHSettings.WEIGHT], int | float]
|
|
378
|
+
):
|
|
379
|
+
return simplify_width(self.width_type, self.width_amount)
|
|
380
|
+
|
|
381
|
+
@property
|
|
382
|
+
def valign(self) -> VAlign | tuple[Literal[WHSettings.RELATIVE], int]:
|
|
383
|
+
return simplify_valign(self.valign_type, self.valign_amount)
|
|
384
|
+
|
|
385
|
+
@property
|
|
386
|
+
def height(
|
|
387
|
+
self,
|
|
388
|
+
) -> (
|
|
389
|
+
int
|
|
390
|
+
| Literal[WHSettings.FLOW, WHSettings.PACK]
|
|
391
|
+
| tuple[Literal[WHSettings.RELATIVE], int]
|
|
392
|
+
| tuple[Literal[WHSettings.WEIGHT], int | float]
|
|
393
|
+
):
|
|
394
|
+
return simplify_height(self.height_type, self.height_amount)
|
|
335
395
|
|
|
336
396
|
@staticmethod
|
|
337
397
|
def options(
|
|
@@ -20,6 +20,8 @@ from .constants import (
|
|
|
20
20
|
from .widget_decoration import WidgetDecoration, WidgetError, WidgetWarning
|
|
21
21
|
|
|
22
22
|
if typing.TYPE_CHECKING:
|
|
23
|
+
from collections.abc import Iterator
|
|
24
|
+
|
|
23
25
|
from typing_extensions import Literal
|
|
24
26
|
|
|
25
27
|
WrappedWidget = typing.TypeVar("WrappedWidget")
|
|
@@ -184,6 +186,14 @@ class Padding(WidgetDecoration[WrappedWidget], typing.Generic[WrappedWidget]):
|
|
|
184
186
|
}
|
|
185
187
|
return remove_defaults(attrs, Padding.__init__)
|
|
186
188
|
|
|
189
|
+
def __rich_repr__(self) -> Iterator[tuple[str | None, typing.Any] | typing.Any]:
|
|
190
|
+
yield "w", self.original_widget
|
|
191
|
+
yield "align", self.align
|
|
192
|
+
yield "width", self.width
|
|
193
|
+
yield "min_width", self.min_width
|
|
194
|
+
yield "left", self.left
|
|
195
|
+
yield "right", self.right
|
|
196
|
+
|
|
187
197
|
@property
|
|
188
198
|
def align(
|
|
189
199
|
self,
|
|
@@ -6,6 +6,7 @@ from itertools import chain, repeat
|
|
|
6
6
|
|
|
7
7
|
from urwid.canvas import CanvasCombine, CompositeCanvas, SolidCanvas
|
|
8
8
|
from urwid.command_map import Command
|
|
9
|
+
from urwid.split_repr import remove_defaults
|
|
9
10
|
from urwid.util import is_mouse_press
|
|
10
11
|
|
|
11
12
|
from .constants import Sizing, WHSettings
|
|
@@ -14,7 +15,7 @@ from .monitored_list import MonitoredFocusList, MonitoredList
|
|
|
14
15
|
from .widget import Widget, WidgetError, WidgetWarning
|
|
15
16
|
|
|
16
17
|
if typing.TYPE_CHECKING:
|
|
17
|
-
from collections.abc import Iterable, Sequence
|
|
18
|
+
from collections.abc import Iterable, Iterator, Sequence
|
|
18
19
|
|
|
19
20
|
from typing_extensions import Literal
|
|
20
21
|
|
|
@@ -58,39 +59,39 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
|
|
|
58
59
|
|
|
59
60
|
# BOX-only widget
|
|
60
61
|
>>> Pile((SolidFill("#"),))
|
|
61
|
-
<Pile box widget
|
|
62
|
+
<Pile box widget (1 item)>
|
|
62
63
|
|
|
63
64
|
# GIVEN BOX -> BOX/FLOW
|
|
64
65
|
>>> Pile(((10, SolidFill("#")),))
|
|
65
|
-
<Pile box/flow widget
|
|
66
|
+
<Pile box/flow widget (1 item)>
|
|
66
67
|
|
|
67
68
|
# FLOW-only
|
|
68
69
|
>>> Pile((ProgressBar(None, None),))
|
|
69
|
-
<Pile flow widget
|
|
70
|
+
<Pile flow widget (1 item)>
|
|
70
71
|
|
|
71
72
|
# FIXED -> FIXED
|
|
72
73
|
>>> Pile(((WHSettings.PACK, BigText("0", font)),))
|
|
73
|
-
<Pile fixed widget
|
|
74
|
+
<Pile fixed widget (1 item)>
|
|
74
75
|
|
|
75
76
|
# FLOW/FIXED -> FLOW/FIXED
|
|
76
77
|
>>> Pile(((WHSettings.PACK, Text("text")),))
|
|
77
|
-
<Pile fixed/flow widget
|
|
78
|
+
<Pile fixed/flow widget (1 item)>
|
|
78
79
|
|
|
79
80
|
# FLOW + FIXED widgets -> FLOW/FIXED
|
|
80
81
|
>>> Pile((ProgressBar(None, None), (WHSettings.PACK, BigText("0", font))))
|
|
81
|
-
<Pile fixed/flow widget
|
|
82
|
+
<Pile fixed/flow widget (2 items) focus_item=0>
|
|
82
83
|
|
|
83
84
|
# GIVEN BOX + FIXED widgets -> BOX/FLOW/FIXED (GIVEN BOX allows overriding its height & allows any width)
|
|
84
85
|
>>> Pile(((10, SolidFill("#")), (WHSettings.PACK, BigText("0", font))))
|
|
85
|
-
<Pile widget
|
|
86
|
+
<Pile widget (2 items) focus_item=0>
|
|
86
87
|
|
|
87
88
|
# Invalid sizing combination -> use fallback settings (and produce warning)
|
|
88
89
|
>>> Pile(((WHSettings.WEIGHT, 1, BigText("0", font)),))
|
|
89
|
-
<Pile box/flow widget
|
|
90
|
+
<Pile box/flow widget (1 item)>
|
|
90
91
|
|
|
91
92
|
# Special case: empty pile widget sizing is impossible to calculate
|
|
92
93
|
>>> Pile(())
|
|
93
|
-
<Pile box/flow widget
|
|
94
|
+
<Pile box/flow widget ()>
|
|
94
95
|
"""
|
|
95
96
|
if not self.contents:
|
|
96
97
|
return frozenset((Sizing.BOX, Sizing.FLOW))
|
|
@@ -233,10 +234,40 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
|
|
|
233
234
|
|
|
234
235
|
def _repr_words(self) -> list[str]:
|
|
235
236
|
if len(self.contents) > 1:
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
237
|
+
contents_string = f"({len(self.contents)} items)"
|
|
238
|
+
elif self.contents:
|
|
239
|
+
contents_string = "(1 item)"
|
|
240
|
+
else:
|
|
241
|
+
contents_string = "()"
|
|
242
|
+
return [*super()._repr_words(), contents_string]
|
|
243
|
+
|
|
244
|
+
def _repr_attrs(self) -> dict[str, typing.Any]:
|
|
245
|
+
attrs = {**super()._repr_attrs(), "focus_item": self.focus_position if len(self._contents) > 1 else None}
|
|
246
|
+
return remove_defaults(attrs, Pile.__init__)
|
|
247
|
+
|
|
248
|
+
def __rich_repr__(self) -> Iterator[tuple[str | None, typing.Any] | typing.Any]:
|
|
249
|
+
widget_list: list[
|
|
250
|
+
Widget
|
|
251
|
+
| tuple[Literal[WHSettings.PACK] | int, Widget]
|
|
252
|
+
| tuple[Literal[WHSettings.WEIGHT], int | float, Widget]
|
|
253
|
+
] = []
|
|
254
|
+
|
|
255
|
+
for w_instance, (sizing, amount) in self._contents:
|
|
256
|
+
if sizing == WHSettings.GIVEN:
|
|
257
|
+
widget_list.append((amount, w_instance))
|
|
258
|
+
elif sizing == WHSettings.PACK:
|
|
259
|
+
widget_list.append((WHSettings.PACK, w_instance))
|
|
260
|
+
elif sizing == WHSettings.WEIGHT:
|
|
261
|
+
if amount == 1:
|
|
262
|
+
widget_list.append(w_instance)
|
|
263
|
+
else:
|
|
264
|
+
widget_list.append((WHSettings.WEIGHT, amount, w_instance))
|
|
265
|
+
|
|
266
|
+
yield "widget_list", widget_list
|
|
267
|
+
yield "focus_item", self.focus_position if self._contents else None
|
|
268
|
+
|
|
269
|
+
def __len__(self) -> int:
|
|
270
|
+
return len(self._contents)
|
|
240
271
|
|
|
241
272
|
def _contents_modified(self) -> None:
|
|
242
273
|
"""Recalculate whether this widget should be selectable whenever the contents has been changed."""
|
|
@@ -391,7 +391,7 @@ class Widget(metaclass=WidgetMeta):
|
|
|
391
391
|
"""
|
|
392
392
|
if not size:
|
|
393
393
|
if Sizing.FIXED in self.sizing():
|
|
394
|
-
raise NotImplementedError("
|
|
394
|
+
raise NotImplementedError(f"{self!r} must override Widget.pack()")
|
|
395
395
|
raise WidgetError(f"Cannot pack () size, this is not a fixed widget: {self!r}")
|
|
396
396
|
|
|
397
397
|
if len(size) == 1:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|