106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from textual.app import App
|
||
|
|
from textual.binding import Binding
|
||
|
|
from textual.demo.game import GameScreen
|
||
|
|
from textual.demo.home import HomeScreen
|
||
|
|
from textual.demo.projects import ProjectsScreen
|
||
|
|
from textual.demo.widgets import WidgetsScreen
|
||
|
|
|
||
|
|
|
||
|
|
class DemoApp(App):
|
||
|
|
"""The demo app defines the modes and sets a few bindings."""
|
||
|
|
|
||
|
|
CSS = """
|
||
|
|
.column {
|
||
|
|
align: center top;
|
||
|
|
&>*{ max-width: 100; }
|
||
|
|
}
|
||
|
|
Screen .-maximized {
|
||
|
|
margin: 1 2;
|
||
|
|
max-width: 100%;
|
||
|
|
&.column { margin: 1 2; padding: 1 2; }
|
||
|
|
&.column > * {
|
||
|
|
max-width: 100%;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
"""
|
||
|
|
|
||
|
|
MODES = {
|
||
|
|
"game": GameScreen,
|
||
|
|
"home": HomeScreen,
|
||
|
|
"projects": ProjectsScreen,
|
||
|
|
"widgets": WidgetsScreen,
|
||
|
|
}
|
||
|
|
DEFAULT_MODE = "home"
|
||
|
|
BINDINGS = [
|
||
|
|
Binding(
|
||
|
|
"h",
|
||
|
|
"app.switch_mode('home')",
|
||
|
|
"Home",
|
||
|
|
tooltip="Show the home screen",
|
||
|
|
),
|
||
|
|
Binding(
|
||
|
|
"g",
|
||
|
|
"app.switch_mode('game')",
|
||
|
|
"Game",
|
||
|
|
tooltip="Unwind with a Textual game",
|
||
|
|
),
|
||
|
|
Binding(
|
||
|
|
"p",
|
||
|
|
"app.switch_mode('projects')",
|
||
|
|
"Projects",
|
||
|
|
tooltip="A selection of Textual projects",
|
||
|
|
),
|
||
|
|
Binding(
|
||
|
|
"w",
|
||
|
|
"app.switch_mode('widgets')",
|
||
|
|
"Widgets",
|
||
|
|
tooltip="Test the builtin widgets",
|
||
|
|
),
|
||
|
|
Binding(
|
||
|
|
"ctrl+s",
|
||
|
|
"app.screenshot",
|
||
|
|
"Screenshot",
|
||
|
|
tooltip="Save an SVG 'screenshot' of the current screen",
|
||
|
|
),
|
||
|
|
Binding(
|
||
|
|
"ctrl+a",
|
||
|
|
"app.maximize",
|
||
|
|
"Maximize",
|
||
|
|
tooltip="Maximize the focused widget (if possible)",
|
||
|
|
),
|
||
|
|
]
|
||
|
|
|
||
|
|
def action_maximize(self) -> None:
|
||
|
|
if self.screen.is_maximized:
|
||
|
|
return
|
||
|
|
if self.screen.focused is None:
|
||
|
|
self.notify(
|
||
|
|
"Nothing to be maximized (try pressing [b]tab[/b])",
|
||
|
|
title="Maximize",
|
||
|
|
severity="warning",
|
||
|
|
)
|
||
|
|
else:
|
||
|
|
if self.screen.maximize(self.screen.focused):
|
||
|
|
self.notify(
|
||
|
|
"You are now in the maximized view. Press [b]escape[/b] to return.",
|
||
|
|
title="Maximize",
|
||
|
|
)
|
||
|
|
else:
|
||
|
|
self.notify(
|
||
|
|
"This widget may not be maximized.",
|
||
|
|
title="Maximize",
|
||
|
|
severity="warning",
|
||
|
|
)
|
||
|
|
|
||
|
|
def check_action(self, action: str, parameters: tuple[object, ...]) -> bool | None:
|
||
|
|
"""Disable switching to a mode we are already on."""
|
||
|
|
if (
|
||
|
|
action == "switch_mode"
|
||
|
|
and parameters
|
||
|
|
and self.current_mode == parameters[0]
|
||
|
|
):
|
||
|
|
return None
|
||
|
|
return True
|