add gainlayer command group

add GainlayerHelpFormatter
This commit is contained in:
onyx-and-iris 2026-03-02 01:24:18 +00:00
parent 1a0fb979e0
commit e6ebf86c86
3 changed files with 70 additions and 2 deletions

51
src/vban_cli/gainlayer.py Normal file
View File

@ -0,0 +1,51 @@
from typing import Annotated
from cyclopts import App, Argument, Parameter
from . import console
from .context import Context
from .help import GainlayerHelpFormatter
app = App(name='gainlayer', help_formatter=GainlayerHelpFormatter())
@app.meta.default
def launcher(
gainlayer_index: Annotated[int, Argument()] = None,
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
index: Annotated[int, Argument()] = None,
ctx: Annotated[Context, Parameter(show=False)] = None,
):
"""Control the gainlayers."""
additional_kwargs = {}
command, bound, _ = app.parse_args(tokens)
if index is not None and gainlayer_index is not None:
additional_kwargs['strip_index'] = index
additional_kwargs['gainlayer_index'] = gainlayer_index
else:
raise ValueError('Both gainlayer_index and index must be provided.')
if ctx is not None:
additional_kwargs['ctx'] = ctx
return command(*bound.args, **bound.kwargs, **additional_kwargs)
@app.command(name='level')
def level(
new_level: Annotated[float, Argument()] = None,
*,
strip_index: Annotated[int, Parameter(show=False)] = None,
gainlayer_index: Annotated[int, Parameter(show=False)] = None,
ctx: Annotated[Context, Parameter(show=False)] = None,
):
"""Get or set the level of the specified gainlayer.
Parameters
----------
new_level : float
If provided, sets the level to this value. If not provided, the current level is printed.
"""
if new_level is None:
console.out.print(ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain)
return
ctx.client.strip[strip_index].gainlayer[gainlayer_index].gain = new_level

View File

@ -95,6 +95,22 @@ class EqHelpFormatter(BaseHelpFormatter):
console.print(f'[bold]Usage:[/bold] {modified_usage}')
class GainlayerHelpFormatter(BaseHelpFormatter):
"""Help formatter for gainlayer commands that works with strip commands.
Injects <index> after 'strip' and <gainlayer_index> after 'gainlayer'."""
def render_usage(self, console: Console, options: ConsoleOptions, usage) -> None:
"""Render the usage line with proper <index> placement for strip commands."""
if usage:
modified_usage = re.sub(
r'(\S+\s+strip)(\s+gainlayer\s+)(COMMAND)',
r'\1 <index>\2<[cyan]gainlayer_index[/cyan]> \3',
str(usage),
)
console.print(f'[bold]Usage:[/bold] {modified_usage}')
class CellHelpFormatter(BaseHelpFormatter):
"""Help formatter for cell commands that works with both strip and bus commands.
@ -105,7 +121,7 @@ class CellHelpFormatter(BaseHelpFormatter):
if usage:
modified_usage = re.sub(
r'(\S+\s+)(\w+)(\s+eq\s+cell\s+)(COMMAND)',
r'\1\2 <index>\3<band> \4',
r'\1\2 <index>\3<[cyan]band[/cyan]> \4',
str(usage),
)
console.print(f'[bold]Usage:[/bold] {modified_usage}')

View File

@ -2,7 +2,7 @@ from typing import Annotated, Optional
from cyclopts import App, Argument, Parameter
from . import comp, console, denoiser, eq, gate
from . import comp, console, denoiser, eq, gainlayer, gate
from .context import Context
from .help import StripHelpFormatter
@ -11,6 +11,7 @@ app.command(eq.app.meta, name='eq')
app.command(comp.app.meta, name='comp')
app.command(gate.app.meta, name='gate')
app.command(denoiser.app.meta, name='denoiser')
app.command(gainlayer.app.meta, name='gainlayer')
@app.meta.default