File size: 2,500 Bytes
32b00b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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