from typing import Dict, Optional, Any, List from types import ModuleType import importlib import sys import gradio import facefusion.globals from facefusion import metadata, logger, wording from facefusion.uis.typing import Component, ComponentName from facefusion.filesystem import resolve_relative_path UI_COMPONENTS: Dict[ComponentName, Component] = {} UI_LAYOUT_MODULES : List[ModuleType] = [] UI_LAYOUT_METHODS =\ [ 'pre_check', 'pre_render', 'render', 'listen', 'run' ] def load_ui_layout_module(ui_layout : str) -> Any: try: ui_layout_module = importlib.import_module('facefusion.uis.layouts.' + ui_layout) for method_name in UI_LAYOUT_METHODS: if not hasattr(ui_layout_module, method_name): raise NotImplementedError except ModuleNotFoundError as exception: logger.debug(exception.msg, __name__.upper()) sys.exit(wording.get('ui_layout_not_loaded').format(ui_layout = ui_layout)) except NotImplementedError: sys.exit(wording.get('ui_layout_not_implemented').format(ui_layout = ui_layout)) return ui_layout_module def get_ui_layouts_modules(ui_layouts : List[str]) -> List[ModuleType]: global UI_LAYOUT_MODULES if not UI_LAYOUT_MODULES: for ui_layout in ui_layouts: ui_layout_module = load_ui_layout_module(ui_layout) UI_LAYOUT_MODULES.append(ui_layout_module) return UI_LAYOUT_MODULES def get_ui_component(name : ComponentName) -> Optional[Component]: if name in UI_COMPONENTS: return UI_COMPONENTS[name] return None def register_ui_component(name : ComponentName, component: Component) -> None: UI_COMPONENTS[name] = component def launch() -> None: with gradio.Blocks(theme = get_theme(), css = get_css(), title = metadata.get('name') + ' ' + metadata.get('version')) as ui: for ui_layout in facefusion.globals.ui_layouts: ui_layout_module = load_ui_layout_module(ui_layout) if ui_layout_module.pre_render(): ui_layout_module.render() ui_layout_module.listen() for ui_layout in facefusion.globals.ui_layouts: ui_layout_module = load_ui_layout_module(ui_layout) ui_layout_module.run(ui) def get_theme() -> gradio.Theme: return gradio.themes.Base( primary_hue = gradio.themes.colors.red, secondary_hue = gradio.themes.colors.neutral, font = gradio.themes.GoogleFont('Open Sans') ).set( background_fill_primary = '*neutral_100', block_background_fill = 'white', block_border_width = '0', block_label_background_fill = '*primary_100', block_label_background_fill_dark = '*primary_600', block_label_border_width = 'none', block_label_margin = '0.5rem', block_label_radius = '*radius_md', block_label_text_color = '*primary_500', block_label_text_color_dark = 'white', block_label_text_weight = '600', block_title_background_fill = '*primary_100', block_title_background_fill_dark = '*primary_600', block_title_padding = '*block_label_padding', block_title_radius = '*block_label_radius', block_title_text_color = '*primary_500', block_title_text_size = '*text_sm', block_title_text_weight = '600', block_padding = '0.5rem', border_color_primary = 'transparent', border_color_primary_dark = 'transparent', button_large_padding = '2rem 0.5rem', button_large_text_weight = 'normal', button_primary_background_fill = '*primary_500', button_primary_text_color = 'white', button_secondary_background_fill = 'white', button_secondary_border_color = 'transparent', button_secondary_border_color_dark = 'transparent', button_secondary_border_color_hover = 'transparent', button_secondary_border_color_hover_dark = 'transparent', button_secondary_text_color = '*neutral_800', button_small_padding = '0.75rem', checkbox_background_color = '*neutral_200', checkbox_background_color_selected = '*primary_600', checkbox_background_color_selected_dark = '*primary_700', checkbox_border_color_focus = '*primary_500', checkbox_border_color_focus_dark = '*primary_600', checkbox_border_color_selected = '*primary_600', checkbox_border_color_selected_dark = '*primary_700', checkbox_label_background_fill = '*neutral_50', checkbox_label_background_fill_hover = '*neutral_50', checkbox_label_background_fill_selected = '*primary_500', checkbox_label_background_fill_selected_dark = '*primary_600', checkbox_label_text_color_selected = 'white', input_background_fill = '*neutral_50', shadow_drop = 'none', slider_color = '*primary_500', slider_color_dark = '*primary_600' ) def get_css() -> str: fixes_css_path = resolve_relative_path('uis/assets/fixes.css') overrides_css_path = resolve_relative_path('uis/assets/overrides.css') return open(fixes_css_path, 'r').read() + open(overrides_css_path, 'r').read()