* Update snapshots
* Update to use textual-snapshot v1.0.0
* Dont use xdist on CI
* Update pytest-cov to fix warnings
* Remove xdist thing from pythonpackage.yml GitHub workflow
* Add example apps to tests.
* Add merlin, remove code browser, update snapshots.
* Fix snapshots.
* Update JSON example to use new colors.
* Fixing a snapshot
* Update lockfile
---------
Co-authored-by: Darren Burns <darrenburns@users.noreply.github.com>
Co-authored-by: Darren Burns <darrenb900@gmail.com>
* Initial undo related machinery added to TextArea
* Initial undo implementation
* Basic undo and redo
* Some more fleshing out of undo and redo
* Skeleton code for managing TextArea history
* Initial implementation of undo & redo checkpointing in TextArea
* Increase checkpoint characters
* Restoring the selection in the TextArea and then restoring it on undo
* Adding docstrings to undo_batch and redo_batch in the TextArea
* Batching edits of the same type
* Batching edits of the same type
* Keeping edits containing newlines in their own batch
* Checking for newline characters in insertion or replacement during undo checkpoint creation. Updating docstrings in history.py
* Fix mypy warning
* Performance improvement
* Add history checkpoint on cursor movement
* Fixing merge conflict in Edit class
* Fixing error in merge conflict resolution
* Remove unused test file
* Remove unused test file
* Initial testing of undo and redo
* Testing for undo redo
* Updating lockfile
* Add an extra test
* Fix: setting the `text` property programmatically should invalidate the edit history
* Improving docstrings
* Rename EditHistory.reset() to EditHistory.clear()
* Add docstring to an exception
* Add a pause after focus/blur in a test
* Forcing CI colour
* Update focus checkpoint test
* Try to force color in pytest by setting --color=yes in PYTEST_ADDOPTS in env var on Github Actions
* Add extra assertion in a test
* Toggle text_area has focus to trigger checkpoint in history
* Apply grammar/wording suggestions from code review
Co-authored-by: Rodrigo Girão Serrão <5621605+rodrigogiraoserrao@users.noreply.github.com>
* Making max checkpoints configurable in TextArea history
* Improve a docstring
* Update changelog
* Spelling fixes
* More spelling fixes
* Americanize spelling of tab_behaviour (->tab_behavior)
* Update CHANGELOG regarding `tab_behaviour`->`tab_behavior`
---------
Co-authored-by: Rodrigo Girão Serrão <5621605+rodrigogiraoserrao@users.noreply.github.com>
* Fixing pytest running on incorrect Python version in GitHub actions.
Also removes 3.12 from the testing matrix, and enables MacOS again.
* Dropping Python 3.7
* Update required Python version to ^3.8
* Remove 3.7 asyncio compatibility layer
* Version pinning in GitHub Action
* Move tree-sitter and tree_sitter_languages to optional extras
* Update docs and GitHub action for moving syntax to extras
* Updating, remake lockfile
* Update snapshots from textual-dev change
* Improve warning when a language is set but tree-sitter not available
* Update CHANGELOG
* Add note on syntax extras
* Update lock
* Add docstring and switch to tree-sitter-languages wheels - although the wheels arent working
* Adding highlights files
* Fix index error on SyntaxAwareDocument
* Narrowing highlighting scope
* Adding basic highlights for Markdown
* Using utf-8 byte length instead of codepoint count in syntax aware doc
* Start creating an ABC defining functionality required by Document impls
* Simplify tree-sitter logic
* Extracting more ABC
* Fix width calculation, add SyntaxTheme
* Ensure the highlight line style goes right to the very end
* Updating a docstring
* Renaming, and adding document width guide
* Ensuring that line number column toggling refreshes virtual size
* Ensuring that line number column toggling refreshes virtual size
* Width guide
* Fix focus event stopping
* Use release_mouse
* Improving a docstring
* Remove bash
* TextArea language snapshot testing
* Updating snapshots for TextArea since we now highlight more nodes
* Typing fixes
* Testing
* Adding tests
* Fixing language selection
* Refresh size on indent width change
* Testing, renaming, fixing display of selection
* Fix multibyte highlight glitch
* Fix deleting right with selection at end of document in TextArea
* Fixing utf-8 multibyte character issues
* Default location of text insertion is cursor position, add cursor_location properties
* Removing some debugging code
* Cursor location tests
* Updating snapshots
* Cached utf8 encoding
* TextArea selection snapshot testing
* Tidying docstrings and queries
* Updating selection snapshot output
* Binding for ESC to shift focus
* Only build the tree-sitter query once!
* Expand cursor scroll horizontal leeway in TextArea
* Property setter for cursor_location in TextArea shouldnt return value
* Avoiding NamedTuple subclassing - using type aliasing instead
* Tidying API, docstrings etc.
* Tidying the API and docstrings
* TextArea additional cursor tests
* Testing pageup and pagedown in TextArea
* Fix a faulty test
* Docstring in a test for TextArea edit
* Stop using DEFAULT_SYNTAX_THEME
* Docstrings
* Change cursor_destination to move_cursor, add more tests
* Remove faulty assertion
* Tidying cursor movement
* Tidying up, adding docstrings for component classes
* Fix a broken selection test
* Remove some unused highlighting machinery
* Fix some Python highlighting issues
* Make HTML syntax highlight nicely
* Create tag name for mismatching HTML end tag
* Add styling for YAML, update boolean styling
* Stylising toml types
* Styling floats
* JSON syntax highlighting
* Updating snapshots
* Syntax highlighting datetimes in TOML
* Namespace TOML errors in highlighting
* Add a move_cursor_relative method
* Update TOML TextArea snapshot for datetime highlighting support
* Adjusting selections
* At TextArea widget level, delete_range is insert_range of empty string
* Refactoring
* Dunder all, docstring fix
* Fix XFAIL
* Remove unused import
* More tests, tidying up
* Cleaning the API
* Docstrings for TextArea
* A bunch of docstrings, delete unused code
* More tidying and docstrings
* Cursor origin on document load, correctly handle delete word left/right when selection is non-empty, fix delete_line when selection spans multiple lines and is in reverse direction
* Moving things around
* Fixing dunder all to export DocumentBase
* Add docstring
* Record cursor width on programmatic insert since it can result in the cursor moving
* Typing fixes
* Fixing remaining typing issues with TextArea
* Add tree-sitter-languages stubs and fix typing issues in documents
* Fixing remaining typing issues with document
* Updating Syntax themes
* Improve highlighting, add initial TextArea docs page
* Add TextArea indent note
* Start TextArea guide inside reference
* Add TextArea to widget gallery
* Fleshing out TextArea docs
* Add note
* Fix TextArea programmatic insert/cursor interaction
* Improve a test
* Testing replacement within selection
* Testing double-width character keyboard navigation and deletion keybinds with active selections
* Testing "delete to start of line" TextArea binding
* Testing TextArea delete line methods and delete to end of line
* Testing shift selecting using keyboard in vertical direction
* Expand tests for home and end keybinds in TextArea
* Renaming tests, testing empty replace and insert
* Testing delete word left via API
* Testing delete word left via API
* Testing delete_word_left with tabs, and delete_word_right
* Remove unused variables
* Remove debugging width guide
* Fix snapshot report path
* Deleting word left/right interaction with line ends fixes, ensure cursor width recorded on all edits
* Docstring fixes
* Unpin textual snapshot library dependency (issue is fixed)
* Docstring fixes
* Fix recording cursor width
* Fix a docstring
* Add select_all to TextArea
* Remove unused tree-sitter stuff from .gitignore
* Line select
* Make word pattern private in TextArea
* Add blinking cursor to TextArea
* Renaming, adding missing return typing
* Add selection bindings
* Moving cursor left/right by word while selecting
* Change escape keybind description, TextArea
* Stripping whitespace when going word left/right
* Add missing annotation
* Cursor word right and left parity with PyCharm
* Use repaint=False for cursor blink
* Improve focus/blur styling
* A whole bunch of TextArea testing
* Simplify delete_left and delete_right
* Testing hiding line numbers in snapshot
* Adding snapshot test for unfocus styling
* Create initial snapshot for text-area unfocused
* Support shift+home, shift+end
* Document shift+home, shift+end
* Add Dracula syntax highlighting theme
* Small change to delete_line behaviour when multiple lines selected to match vscode/pycharm behaviour
* Add test for new delete line logic
* Delete line improvement
* Add extra test for delete_line multiple selection
* Test cursor "smart" home behaviour
* Fix typo
* Highlight matching brackets
* Update snapshot
* Update snapshot
* Fix xfails
* Simplify delete_word_left
* Catch correct exception to ensure support for Python 3.7
* Add styling for Markdown
* Add styles for Dracula for Markdown
* Remove unused _fix_direction.py
* Add docstring to EditResult
* Use default=0 in max inside Document
* Remove redundant actions
* Use cell-width aware expand tabs implementation from @willmcgugan
* Construct strip with cell length
* Some TextArea keyword-only arguments
* Begin moving over to TextAreaTheme #skipci
* Prepare queries inside document #skip-ci
* Add comment
* Refactoring
* TextAreaTheme styling
* Setting width of blank selected lines
* Building the highlight map in the text area
* Remove unused default css from TextArea
* Moving highlighting stylize into widget
* Moving syntax highlighting into TextArea widget
* Remove unused code
* Optimise imports
* Fix highlighting when initial text supplied to TextArea
* Rebuild highlight map when the theme changes
* Extending
* Restore themes
* Remove old comment, fix docstring
* Fixing docstrings
* Fixing mypy
* Fixing mypy issues in document
* Tidying things
* Updating version
* Add theme
* Fix VSCode theme bracket matching
* Only match brackets when theres no selection
* Highlighting tidying
* Fix markdown header highlighting
* Setting theme correctly in background
* Tidying module interface
* Merging main
* Fixing a bunch of typing problems
* Fixing more typing problems
* Correctly setting theme object
* mypy
* Small fix to bracket matching
* Improve a docstring
* Fix docstring
* Testing builtin and custom languages
* Unit testing theme stuff
* Reworking themes
* Error handling
* Improve error message
* Testing new theme setting approach, error handling
* Improvements/tests for theme and language setting
* Remove unused TextArea unfocus snapshot
* Update snapshot file
* Adding theme snapshot tests
* Add `function.call` style binding in dark vscode theme
* Renaming a test file
* Making active line clearer on vscode theme
* Renaming tests
* A whole lot of docs for TextArea
* Update wording in docs
* A bit more docs
* Example on adding Java as a custom language
* More custom language docs
* Finishing up custom themeing/syntax highlighting guide for TextArea
* Add note on potential issue
* Fix wording
* Add note on Apple Silicon Python 3.7 fallback
* Add another note on Apple Silicon Python 3.7 fallback
* Fix class names in example files
* Add some documentation for useful TextArea APIs
* TextArea docs improvements
* TextArea docs typo fix
* Note about extending TextArea
* Tab-stop support when spaces used for indent
* Docs update
* Text area blog post (#3356)
* Start blog post
* Add demo script to blog post
* Continuing the blog post
* Yet more writing for TextArea blog post
* Working on closing section
* Finishing up
* Update docs/blog/posts/text-area-learnings.md
Co-authored-by: Dave Pearson <davep@davep.org>
* Update docs/blog/posts/text-area-learnings.md
Co-authored-by: Dave Pearson <davep@davep.org>
* Typo fix
* Update docs/blog/posts/text-area-learnings.md
Co-authored-by: Dave Pearson <davep@davep.org>
---------
Co-authored-by: Dave Pearson <davep@davep.org>
* Remove redundant pass
* Add docstring
* Docs fix
* Simplify docs
* Improve docstring
* Add links in docstrings
---------
Co-authored-by: Dave Pearson <davep@davep.org>
This was pinned by Darren a wee while back, I think, due to some other
problem. But this kills coverage. Right now I want coverage so I can see
what needs testing with the command palette. So let's unpin with a view to
pinning back again (or solving the main problem I guess) once I'm done.
* Add a notification class and a class to hold notifications
This provides the core classes for holding information on a single
notification, and then on top of that a class for managing a collection of
notifications.
* WiP: End of day/week commit to pick up post-holiday
* Ask permission rather than forgiveness
Yes, this does go against all things Pythonic, but in this case it's likely
less costly to do the check first; moreover it works around the problem I
ran in to: https://github.com/Textualize/textual/issues/2863
* Move the handling of "I've seen this" into the toast rack
This way the interface becomes "here's a bunch of notifications, you go work
this out".
* Add a notify method to all widgets
* The removal time for a toast should be the time left
When it was per-screen, it made sense that it was the timeout; now that
we're carrying them over between screens we're going to make sure they're
only around for as long as they need to be.
* Carry notifications between screens
* Remove the test code
* Drop the borders from the toasts
Except for the title, keep that.
* Provide access to the notification timeout
* Remove the title panel from a Toast if the title is empty
* Make the Toast CSS classes "private"
Prefix with a - to reduce the chance of a clash with userspace.
* Refresh a docstring
* Stop widget leakage
The Toasts were removing themselves, but they're wrapped inside a helper
container that keeps them aligned right. So the problem was that the
alignment containers were leaking. This ensures that when a Toast goes away
it takes its parent with it.
* Make the alignment container hidden
This doesn't really make any difference, but it feels like it makes sense to
hide it if there's nothing to show -- it's purely for alignment.
* 🚚 Rename the toast container
This is about getting the toasts to align correctly (even when you do align
things, they don't really align as expected due to the way that a container
aligns the bounding box of all if its children, not the individual
children). However, I had this named after where it aligned them to; someone
using the system may wish to change that, so let's make the name more
generic.
* Improve ToastRack._toast_id
Add a docstring, and also change the format of the identity somewhat so that
it's even "more internal".
* Add some initial low-level notification testing
* Add initial testing of notifications within an application
* Add tests for notifying from the 3 main levels within the DOM
* Add a toast example to the docs and a snapshot test
This might not be the final form, but it'll do for the moment. I want to get
the snapshot test in place at least.
* Add a snapshot test for notifications persisting between screens
* Add some documentation for a Toast
This isn't going into the index, just yet. This is *technically* an internal
widget so I'm not sure how and where it makes sense to document it; if at
all. But let's get some documentation in here anyway.
* Flesh out the docstrings for the notify methods
* Add a missing docstring to the Notifications __init__ method
* Add snapshot tests for persisting notifications through mode switches
* Remove unused import
Looks like eglot/pyright tried to be "helpful" at some point and I didn't
notice.
* Correct the Toast severity level classes in the docs
Originally they weren't in the "internal" namespace, then I decided that
they should be so there's less chance of a clash with dev-space code; but I
forgot to reflect this in the docs.
This fixes that.
* Make the removal of notifications/toasts a two way thing
The addition of the ability to dismiss a toast by clicking on it had a flaw:
the notification->toast code had been written with things being one way. The
expiration of notifications happened in the notification handler, and the
expiration of Toasts was done in the Toast system, on purpose (notifications
might end up being routed via elsewhere so this needs to be done).
But... this meant that hand-removed Toasts kept coming back from the dead
when a new notification was raised iff the hand-removed ones hadn't yet
expired.
So here I add the ability the remove a notification from the notification
collection.
* Remove an unhelpful comment
Sort of a hangover from what was initially looking like it was going to be a
longer body of code. It doesn't really need explaining any more.
* Add in support to the notification collection
* Change the toast rack adder to be a general "show" method
This turns the method into one that further aids making the connection
between the notifications and the toasts two way. Now it makes sense that if
there are toasts for notifications that no longer exist, they also get
removed.
This makes it easier to add all sorts of clear options later on.
* Add a method to clear notifications
* Add an App method for clearing all existing notifications
* Add a missing docstring to _refresh_notifications
* Return the notification from the notify methods
It can be seen as, and used as, a handle of sorts (see unnotify); so return
it so people can use it.
* Add some more notifications unit testing
* Add some more app-level notification unit testing
* Style tweaks
* docs
* added notifications
* snapshots
---------
Co-authored-by: Will McGugan <willmcgugan@gmail.com>
* Fix Toggle Buttons on a selection list
* Update CHANGELOG.md
* Update dependencies
Mainly updating the now-external snapshot testing code so that the failure
report (which was to be expected) gets generated.
* Update snapshot tests
* Add testing for clicking on a SelectionList prompt or checkbox
* Cody tidy
---------
Co-authored-by: Dave Pearson <davep@davep.org>
* WiP: Move the devtools and related code to `textual-dev` (#2834)
* Remove the textual script from the project file
This is moving into the textual-dev package.
* Remove the textual CLI code from Textual
This has all gone to live in textual-dev.
* Remove the devtools testing from Textual's unit tests
They've moved over to textual-dev instead.
* Remove the devtools server from Textual itself
The start of the process to remove as much of the core devtools as possible
from Textual.
* Switch the console docs example screenshot over to textual_dev
* Remove rednerables.py from Textual
* Remove the last parts of devtools from Textual
This is the last step. It remains to be seen if this is sustainable, but for
testing purposes this is the extreme case we're aiming for. I *think* this
will work though.
Hereon we'll be needing to do an editable install of textual-dev into
textual, and more generally and once this is "live" we'll be needing to make
sure that textual[dev] is installed when doing development work on textual
apps.
The thing that remains to be seen however is how this all works
with *developing* Textual itself. Will I always need to do an editable
install? Still got to figure that one out.
* Start to whittle down the pyproject file
The next step is to try and work out what can come out of the pyproject
file.
* Remove aiohttp from Textual
* Remove some more development dependencies we don't need any more
* Relock
* Remove the pointer to the previews directory
* Reintroduce the border preview snapshot test
* Reintroduce the color preview snapshot test
* Reinstate the key press for the border preview snapshot test
* Reintroduce the easing preview snapshot test
* Reintroduce the keys tool snapshot test
* Add pytest-asyncio as a development dependency
* Relock
* Pin the textual-dev version to 0.1.0 or later
Mostly to try and get the tests kicked off properly.
* Relock dependencies
* Further `textual-dev` changes (#2850)
* Remove the textual script from the project file
This is moving into the textual-dev package.
* Remove the textual CLI code from Textual
This has all gone to live in textual-dev.
* Remove the devtools testing from Textual's unit tests
They've moved over to textual-dev instead.
* Remove the devtools server from Textual itself
The start of the process to remove as much of the core devtools as possible
from Textual.
* Switch the console docs example screenshot over to textual_dev
* Remove rednerables.py from Textual
* Remove the last parts of devtools from Textual
This is the last step. It remains to be seen if this is sustainable, but for
testing purposes this is the extreme case we're aiming for. I *think* this
will work though.
Hereon we'll be needing to do an editable install of textual-dev into
textual, and more generally and once this is "live" we'll be needing to make
sure that textual[dev] is installed when doing development work on textual
apps.
The thing that remains to be seen however is how this all works
with *developing* Textual itself. Will I always need to do an editable
install? Still got to figure that one out.
* Start to whittle down the pyproject file
The next step is to try and work out what can come out of the pyproject
file.
* Remove aiohttp from Textual
* Remove some more development dependencies we don't need any more
* Relock
* Remove the pointer to the previews directory
* Reintroduce the border preview snapshot test
* Reintroduce the color preview snapshot test
* Reinstate the key press for the border preview snapshot test
* Reintroduce the easing preview snapshot test
* Reintroduce the keys tool snapshot test
* Add pytest-asyncio as a development dependency
* Relock
* Pin the textual-dev version to 0.1.0 or later
Mostly to try and get the tests kicked off properly.
* Relock dependencies
* Whitespace cleaning
* Swap mentions of textual[dev] to textual-dev
* Remove the dev extra
* Tweak README.md in response to PR review
* Tweak animation.md in response to PR review
* Tweak getting_started.md in response to PR review
* bump version
* lock
* drop dev
* more
* version bump
---------
Co-authored-by: Dave Pearson <davep@davep.org>