import inspect import waifuc.action import gradio as gr from .config_manager import ConfigManager class ActionManager: def __init__(self, config_manager: ConfigManager): self.config_manager = config_manager self.action_classes = [ cls for name, cls in inspect.getmembers(waifuc.action, inspect.isclass) if name.endswith("Action") and not inspect.isabstract(cls) ] self.action_names = [cls.__name__ for cls in self.action_classes] def get_action_params(self, action_name): action_cls = next(cls for cls in self.action_classes if cls.__name__ == action_name) sig = inspect.signature(action_cls.__init__) return [p for p in sig.parameters.values() if p.name != 'self'] def create_action_param_inputs(self, selected_actions): params = {} for action in selected_actions: params[action] = {} for param in self.get_action_params(action): if param.name == "size" and action == "ResizeAction": params[action][param.name] = gr.Number( label="Resize Size" if self.config_manager.get_config("language") == "en" else "调整大小", value=self.config_manager.get_config("default_resize_size"), info="Image resize dimension" if self.config_manager.get_config("language") == "en" else "图片调整尺寸" ) elif param.annotation == int: params[action][param.name] = gr.Number(label=param.name) else: params[action][param.name] = gr.Textbox(label=param.name) return params def instantiate_actions(self, selected_actions, action_params): actions = [] for name in selected_actions: action_cls = next(cls for cls in self.action_classes if cls.__name__ == name) params = action_params.get(name, {}) if name == "FaceCountAction": actions.append(action_cls(params.get("count", 1))) elif name == "AlignMinSizeAction": actions.append(action_cls(params.get("size", 800))) elif name == "ResizeAction": actions.append(action_cls(size=params.get("size", self.config_manager.get_config("default_resize_size")))) else: actions.append(action_cls(**params)) return actions