mirror of
https://github.com/onyx-and-iris/voicemeeter-compact.git
synced 2025-02-23 02:15:05 +00:00
251 lines
9.8 KiB
Python
251 lines
9.8 KiB
Python
import argparse
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
logger = logging.getLogger('vm-compact-rewriter')
|
|
|
|
PACKAGE_DIR = Path(__file__).parent.parent / 'vmcompact'
|
|
|
|
SRC_DIR = Path(__file__).parent / 'src'
|
|
|
|
|
|
def write_outs(output, outs: tuple):
|
|
for out in outs:
|
|
output.write(out)
|
|
|
|
|
|
def rewrite_app():
|
|
app_logger = logger.getChild('app')
|
|
app_logger.info('rewriting app.py')
|
|
infile = Path(SRC_DIR) / 'app.bk'
|
|
outfile = Path(PACKAGE_DIR) / 'app.py'
|
|
with open(infile, 'r') as input:
|
|
with open(outfile, 'w') as output:
|
|
for line in input:
|
|
match line:
|
|
# App init()
|
|
case ' def __init__(self, vmr):\n':
|
|
output.write(' def __init__(self, vmr, theme):\n')
|
|
case ' self._vmr = vmr\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' self._vmr = vmr\n',
|
|
' self._theme = theme\n',
|
|
' tcldir = Path.cwd() / "theme"\n',
|
|
' if not tcldir.is_dir():\n',
|
|
' tcldir = Path.cwd() / "_internal" / "theme"\n',
|
|
' self.tk.call("source", tcldir.resolve() / f"forest-{self._theme}.tcl")\n',
|
|
),
|
|
)
|
|
# def connect()
|
|
case 'def connect(kind_id: str, vmr) -> App:\n':
|
|
output.write(
|
|
'def connect(kind_id: str, vmr, theme="light") -> App:\n'
|
|
)
|
|
case ' return VMMIN_cls(vmr)\n':
|
|
output.write(' return VMMIN_cls(vmr, theme)\n')
|
|
case _:
|
|
output.write(line)
|
|
|
|
|
|
def rewrite_builders():
|
|
builders_logger = logger.getChild('builders')
|
|
builders_logger.info('rewriting builders.py')
|
|
infile = Path(SRC_DIR) / 'builders.bk'
|
|
outfile = Path(PACKAGE_DIR) / 'builders.py'
|
|
with open(infile, 'r') as input:
|
|
with open(outfile, 'w') as output:
|
|
ignore_next_lines = 0
|
|
|
|
for line in input:
|
|
if ignore_next_lines > 0:
|
|
builders_logger.info(f'ignoring: {line}')
|
|
ignore_next_lines -= 1
|
|
continue
|
|
|
|
match line:
|
|
# loading themes
|
|
case 'import sv_ttk\n':
|
|
output.write('#import sv_ttk\n')
|
|
case ' self.app.resizable(False, False)\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' self.app.resizable(False, False)\n'
|
|
' if _configuration.themes_enabled:\n',
|
|
' ttk.Style().theme_use(f"forest-{self.app._theme}")\n',
|
|
' self.logger.info(f"Forest Theme applied")\n',
|
|
),
|
|
)
|
|
ignore_next_lines = 6
|
|
# setting navframe button widths
|
|
case ' variable=self.navframe.submix,\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.navframe.submix,\n'
|
|
' width=8,\n',
|
|
),
|
|
)
|
|
case ' variable=self.navframe.channel,\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.navframe.channel,\n'
|
|
' width=8,\n',
|
|
),
|
|
)
|
|
case ' variable=self.navframe.extend,\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.navframe.extend,\n'
|
|
' width=8,\n',
|
|
),
|
|
)
|
|
case ' variable=self.navframe.info,\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.navframe.info,\n'
|
|
' width=8,\n',
|
|
),
|
|
)
|
|
# set channelframe button widths
|
|
case ' variable=self.labelframe.mute,\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.labelframe.mute,\n'
|
|
' width=7,\n',
|
|
),
|
|
)
|
|
case ' variable=self.labelframe.conf,\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.labelframe.conf,\n'
|
|
' width=7,\n',
|
|
),
|
|
)
|
|
case ' variable=self.labelframe.on,\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.labelframe.on,\n'
|
|
' width=7,\n',
|
|
),
|
|
)
|
|
# set stripconfigframe button widths
|
|
case ' self.configframe.phys_out_params.index(param)\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' self.configframe.phys_out_params.index(param)\n',
|
|
' ],\n',
|
|
' width=6,\n',
|
|
),
|
|
)
|
|
ignore_next_lines = 1
|
|
case ' self.configframe.virt_out_params.index(param)\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' self.configframe.virt_out_params.index(param)\n',
|
|
' ],\n',
|
|
' width=6,\n',
|
|
),
|
|
)
|
|
ignore_next_lines = 1
|
|
# This does both strip and bus param vars buttons
|
|
case ' variable=self.configframe.param_vars[i],\n':
|
|
write_outs(
|
|
output,
|
|
(
|
|
' variable=self.configframe.param_vars[i],\n',
|
|
' width=6,\n',
|
|
),
|
|
)
|
|
case _:
|
|
if 'Toggle.TButton' in line:
|
|
output.write(line.replace('Toggle.TButton', 'ToggleButton'))
|
|
else:
|
|
output.write(line)
|
|
|
|
|
|
def rewrite_menu():
|
|
menu_logger = logger.getChild('menu')
|
|
menu_logger.info('rewriting menu.py')
|
|
infile = Path(SRC_DIR) / 'menu.bk'
|
|
outfile = Path(PACKAGE_DIR) / 'menu.py'
|
|
with open(infile, 'r') as input:
|
|
with open(outfile, 'w') as output:
|
|
ignore_next_lines = 0
|
|
|
|
for line in input:
|
|
if ignore_next_lines > 0:
|
|
menu_logger.info(f'ignoring: {line}')
|
|
ignore_next_lines -= 1
|
|
continue
|
|
match line:
|
|
case 'import sv_ttk\n':
|
|
output.write('#import sv_ttk\n')
|
|
case ' # layout/themes\n':
|
|
ignore_next_lines = 14
|
|
case _:
|
|
output.write(line)
|
|
|
|
|
|
def prepare_for_build():
|
|
################# MOVE FILES FROM PACKAGE DIR INTO SRC DIR #########################
|
|
for file in (
|
|
PACKAGE_DIR / 'app.py',
|
|
PACKAGE_DIR / 'builders.py',
|
|
PACKAGE_DIR / 'menu.py',
|
|
):
|
|
if file.exists():
|
|
logger.debug(f'moving {str(file)}')
|
|
file.rename(SRC_DIR / f'{file.stem}.bk')
|
|
|
|
###################### RUN THE FILE REWRITER FOR EACH *.BK #########################
|
|
steps = (
|
|
rewrite_app,
|
|
rewrite_builders,
|
|
rewrite_menu,
|
|
)
|
|
[step() for step in steps]
|
|
|
|
|
|
def cleanup():
|
|
########################## RESTORE *.BK FILES #####################################
|
|
for file in (
|
|
PACKAGE_DIR / 'app.py',
|
|
PACKAGE_DIR / 'builders.py',
|
|
PACKAGE_DIR / 'menu.py',
|
|
):
|
|
file.unlink()
|
|
|
|
for file in (
|
|
SRC_DIR / 'app.bk',
|
|
SRC_DIR / 'builders.bk',
|
|
SRC_DIR / 'menu.bk',
|
|
):
|
|
file.rename(PACKAGE_DIR / f'{file.stem}.py')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--rewrite', action='store_true')
|
|
parser.add_argument('--restore', action='store_true')
|
|
args = parser.parse_args()
|
|
|
|
if args.rewrite:
|
|
logger.info('preparing files for build')
|
|
prepare_for_build()
|
|
elif args.restore:
|
|
logger.info('cleaning up files')
|
|
cleanup()
|