Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/agmmnn/textual-filedrop
FileDrop widget for Textual, easily drag and drop files into your terminal apps.
https://github.com/agmmnn/textual-filedrop
cli python rich textual tui
Last synced: 2 months ago
JSON representation
FileDrop widget for Textual, easily drag and drop files into your terminal apps.
- Host: GitHub
- URL: https://github.com/agmmnn/textual-filedrop
- Owner: agmmnn
- Created: 2022-12-17T16:14:30.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2023-03-22T17:59:15.000Z (almost 2 years ago)
- Last Synced: 2024-10-11T12:45:44.831Z (3 months ago)
- Topics: cli, python, rich, textual, tui
- Language: Python
- Homepage: https://pypi.org/project/textual-filedrop
- Size: 146 KB
- Stars: 21
- Watchers: 2
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
![textual-filedrop](https://user-images.githubusercontent.com/16024979/208708722-e550d8ca-22a7-47f0-adf9-16cad570cdfd.png)
# textual-filedrop
Add filedrop support to your [Textual](https://github.com/textualize/textual/) apps, easily drag and drop files into your terminal apps.
> _Tested on `Windows` and [`macOS`](https://github.com/Textualize/textual/discussions/1414#discussioncomment-4467029)._
> _[Nerd Font](https://www.nerdfonts.com/font-downloads) is required to display file icons._
## Install
```
pip install textual-filedrop
```or
```
git clone https://github.com/agmmnn/textual-filedrop.git
cd textual-filedrop
poetry install
```## Note
Since version [0.10.0](https://github.com/Textualize/textual/releases/tag/v0.10.0) Textual supports [bubble](https://textual.textualize.io/guide/events/#bubbling) for the [paste event](https://textual.textualize.io/events/paste/) ([Textualize/textual#1434](https://github.com/Textualize/textual/issues/1434)). So if the terminal where your app is running treats the file drag and drop as a paste event, you can catch it yourself with the `on_paste` function without widget.
## Usage
### `getfiles`
`getfiles` returns an object containing the _path, filename, extension_ and _icon_ of the files.
```py
from textual_filedrop import getfilesclass MyApp(App):
...
def on_paste(self, event) -> None:
files = getfiles(event)
print(files)
```![](https://i.imgur.com/1xdpivC.png)
### `FileDrop` Widget
As long as the `FileDrop` widget is in focus, it will give the information of the dragged files and render the file names with their icons on the screen.
```py
from textual_filedrop import FileDrop
``````py
# add FileDrop widget to your app
yield FileDrop(id="filedrop")
``````py
# focus the widget
self.query_one("#filedrop").focus()
``````py
# when the files are dropped
def on_file_drop_dropped(self, message: FileDrop.Dropped) -> None:
path = message.path
filepaths = message.filepaths
filenames = message.filenames
filesobj = message.filesobj
print(path, filepaths, filenames, filesobj)# output: path, [filepaths], [filenames], [filesobj]
```You can find more examples [here](./examples).
## Examples
### [subdomain_lister.py](./examples/subdomain_lister.py)
Drag and drop the subdomain list files and see the results as a tree list.
![subdomain_lister](https://user-images.githubusercontent.com/16024979/208706132-0a33bb21-51b8-441a-aeb9-668dbfcb382c.gif)
### [fullscreen.py](./examples/fullscreen.py)
Fullscreen example, will show the results in the textual console.
### [hidden.py](./examples/hidden.py)
As long as focus is on, the `FileDrop` widget will be active even if it is not visible on the screen.
### [without_widget.py](./examples/without_widget.py)
An example that renders the object with the information of the dragged files returned from the `getfiles` function to the screen with `rich.json`.
## Dev
```
poetry installtextual console
poetry run textual run --dev examples/subdomain_lister.py
```