65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
"""
|
|
|
|
This module contains `SystemCommands`, a command palette command provider for Textual system commands.
|
|
|
|
This is a simple command provider that makes the most obvious application
|
|
actions available via the [command palette][textual.command.CommandPalette].
|
|
|
|
!!! note
|
|
|
|
The App base class installs this automatically.
|
|
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from textual.command import DiscoveryHit, Hit, Hits, Provider
|
|
|
|
|
|
class SystemCommandsProvider(Provider):
|
|
"""A [source][textual.command.Provider] of command palette commands that run app-wide tasks.
|
|
|
|
Used by default in [`App.COMMANDS`][textual.app.App.COMMANDS].
|
|
"""
|
|
|
|
async def discover(self) -> Hits:
|
|
"""Handle a request for the discovery commands for this provider.
|
|
|
|
Yields:
|
|
Commands that can be discovered.
|
|
"""
|
|
commands = sorted(
|
|
self.app.get_system_commands(self.screen), key=lambda command: command[0]
|
|
)
|
|
for name, help_text, callback, discover in commands:
|
|
if discover:
|
|
yield DiscoveryHit(
|
|
name,
|
|
callback,
|
|
help=help_text,
|
|
)
|
|
|
|
async def search(self, query: str) -> Hits:
|
|
"""Handle a request to search for system commands that match the query.
|
|
|
|
Args:
|
|
query: The user input to be matched.
|
|
|
|
Yields:
|
|
Command hits for use in the command palette.
|
|
"""
|
|
# We're going to use Textual's builtin fuzzy matcher to find
|
|
# matching commands.
|
|
matcher = self.matcher(query)
|
|
|
|
# Loop over all applicable commands, find those that match and offer
|
|
# them up to the command palette.
|
|
for name, help_text, callback, *_ in self.app.get_system_commands(self.screen):
|
|
if (match := matcher.match(name)) > 0:
|
|
yield Hit(
|
|
match,
|
|
matcher.highlight(name),
|
|
callback,
|
|
help=help_text,
|
|
)
|