fix Face Swapper module UI

This commit is contained in:
iperov 2022-05-13 14:15:37 +04:00
parent f8047dd256
commit 15c2ad5593
2 changed files with 30 additions and 27 deletions

View file

@ -1,5 +1,6 @@
import time import time
from pathlib import Path from pathlib import Path
from typing import Dict
import numpy as np import numpy as np
from modelhub import DFLive from modelhub import DFLive
@ -24,7 +25,7 @@ class FaceSwapper(BackendHost):
worker_start_args=[weak_heap, reemit_frame_signal, bc_in, bc_out, dfm_models_path]) worker_start_args=[weak_heap, reemit_frame_signal, bc_in, bc_out, dfm_models_path])
def get_control_sheet(self) -> 'Sheet.Host': return super().get_control_sheet() def get_control_sheet(self) -> 'Sheet.Host': return super().get_control_sheet()
def _get_name(self): def _get_name(self):
return super()._get_name()# + f'{self._id}' return super()._get_name()# + f'{self._id}'
@ -48,7 +49,7 @@ class FaceSwapperWorker(BackendWorker):
state, cs = self.get_state(), self.get_control_sheet() state, cs = self.get_state(), self.get_control_sheet()
cs.model.call_on_selected(self.on_cs_model_info) cs.model.call_on_selected(self.on_cs_model)
cs.device.call_on_selected(self.on_cs_device) cs.device.call_on_selected(self.on_cs_device)
cs.swap_all_faces.call_on_flag(self.on_cs_swap_all_faces) cs.swap_all_faces.call_on_flag(self.on_cs_swap_all_faces)
cs.face_id.call_on_number(self.on_cs_face_id) cs.face_id.call_on_number(self.on_cs_face_id)
@ -59,32 +60,31 @@ class FaceSwapperWorker(BackendWorker):
cs.pre_gamma_blue.call_on_number(self.on_cs_pre_gamma_blue) cs.pre_gamma_blue.call_on_number(self.on_cs_pre_gamma_blue)
cs.two_pass.call_on_flag(self.on_cs_two_pass) cs.two_pass.call_on_flag(self.on_cs_two_pass)
cs.model.enable() cs.device.enable()
cs.model.set_choices( DFLive.get_available_models_info(dfm_models_path), none_choice_name='@misc.menu_select') cs.device.set_choices( DFLive.get_available_devices(), none_choice_name='@misc.menu_select')
cs.model.select(state.model) cs.device.select(state.device)
def on_cs_model_info(self, idx, model): def on_cs_device(self, idx, device):
state, cs = self.get_state(), self.get_control_sheet() state, cs = self.get_state(), self.get_control_sheet()
if state.model == model: if device is not None and state.device == device:
cs.model.enable()
cs.device.enable() cs.model.set_choices( DFLive.get_available_models_info(self.dfm_models_path), none_choice_name='@misc.menu_select')
cs.device.set_choices( DFLive.get_available_devices(), none_choice_name='@misc.menu_select') cs.model.select(state.model)
cs.device.select(state.model_state.device)
else: else:
state.model = model state.device = device
state.model_state = ModelState()
self.save_state() self.save_state()
self.restart() self.restart()
def on_cs_device(self, idxs, device): def on_cs_model(self, idx, model):
state, cs = self.get_state(), self.get_control_sheet() state, cs = self.get_state(), self.get_control_sheet()
if device is not None and state.model_state.device == device:
self.dfm_model_initializer = DFLive.DFMModel_from_info(state.model, device) if state.model == model:
state.model_state = state.models_state[model.get_name()] = state.models_state.get(model.get_name(), ModelState())
self.dfm_model_initializer = DFLive.DFMModel_from_info(state.model, state.device)
self.set_busy(True) self.set_busy(True)
else: else:
state.model_state = ModelState() state.model = model
state.model_state.device = device
self.save_state() self.save_state()
self.restart() self.restart()
@ -338,7 +338,6 @@ class Sheet:
self.two_pass = lib_csw.Flag.Host() self.two_pass = lib_csw.Flag.Host()
class ModelState(BackendWorkerState): class ModelState(BackendWorkerState):
device = None
swap_all_faces : bool = None swap_all_faces : bool = None
face_id : int = None face_id : int = None
morph_factor : float = None morph_factor : float = None
@ -349,5 +348,9 @@ class ModelState(BackendWorkerState):
two_pass : bool = None two_pass : bool = None
class WorkerState(BackendWorkerState): class WorkerState(BackendWorkerState):
model : DFLive.DFMModelInfo = None def __init__(self):
model_state : ModelState = None super().__init__()
self.device = None
self.model : DFLive.DFMModelInfo = None
self.models_state : Dict[str, ModelState] = {}
self.model_state : ModelState = None

View file

@ -25,6 +25,9 @@ class QFaceSwapper(QBackendPanel):
btn_open_folder = self.btn_open_folder = qtx.QXPushButton(image = QXImageDB.eye_outline('light gray'), tooltip_text='Reveal in Explorer', released=self._btn_open_folder_released, fixed_size=(24,22) ) btn_open_folder = self.btn_open_folder = qtx.QXPushButton(image = QXImageDB.eye_outline('light gray'), tooltip_text='Reveal in Explorer', released=self._btn_open_folder_released, fixed_size=(24,22) )
q_device_label = QLabelPopupInfo(label=L('@common.device'), popup_info_text=L('@common.help.device') )
q_device = QComboBoxCSWDynamicSingleSwitch(cs.device, reflect_state_widgets=[q_device_label])
q_model_label = QLabelPopupInfo(label=L('@QFaceSwapper.model'), popup_info_text=L('@QFaceSwapper.help.model') ) q_model_label = QLabelPopupInfo(label=L('@QFaceSwapper.model'), popup_info_text=L('@QFaceSwapper.help.model') )
q_model = QComboBoxCSWDynamicSingleSwitch(cs.model, reflect_state_widgets=[q_model_label, btn_open_folder]) q_model = QComboBoxCSWDynamicSingleSwitch(cs.model, reflect_state_widgets=[q_model_label, btn_open_folder])
@ -33,9 +36,6 @@ class QFaceSwapper(QBackendPanel):
q_model_info_label = self._q_model_info_label = QLabelPopupInfoCSWInfoLabel(cs.model_info_label) q_model_info_label = self._q_model_info_label = QLabelPopupInfoCSWInfoLabel(cs.model_info_label)
q_device_label = QLabelPopupInfo(label=L('@common.device'), popup_info_text=L('@common.help.device') )
q_device = QComboBoxCSWDynamicSingleSwitch(cs.device, reflect_state_widgets=[q_device_label])
q_swap_all_faces_label = QLabelPopupInfo(label=L('@QFaceSwapper.swap_all_faces') ) q_swap_all_faces_label = QLabelPopupInfo(label=L('@QFaceSwapper.swap_all_faces') )
q_swap_all_faces = QCheckBoxCSWFlag(cs.swap_all_faces, reflect_state_widgets=[q_swap_all_faces_label]) q_swap_all_faces = QCheckBoxCSWFlag(cs.swap_all_faces, reflect_state_widgets=[q_swap_all_faces_label])
@ -59,6 +59,9 @@ class QFaceSwapper(QBackendPanel):
grid_l = qtx.QXGridLayout( spacing=5) grid_l = qtx.QXGridLayout( spacing=5)
row = 0 row = 0
grid_l.addWidget(q_device_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter )
grid_l.addWidget(q_device, row, 1, alignment=qtx.AlignLeft )
row += 1
grid_l.addWidget(q_model_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget(q_model_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter )
grid_l.addLayout(qtx.QXHBoxLayout([q_model, 2, btn_open_folder, 2, q_model_info_label]), row, 1 ) grid_l.addLayout(qtx.QXHBoxLayout([q_model, 2, btn_open_folder, 2, q_model_info_label]), row, 1 )
row += 1 row += 1
@ -66,9 +69,6 @@ class QFaceSwapper(QBackendPanel):
row += 1 row += 1
grid_l.addWidget(q_model_dl_error, row, 0, 1, 2 ) grid_l.addWidget(q_model_dl_error, row, 0, 1, 2 )
row += 1 row += 1
grid_l.addWidget(q_device_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter )
grid_l.addWidget(q_device, row, 1, alignment=qtx.AlignLeft )
row += 1
grid_l.addWidget( q_swap_all_faces_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter ) grid_l.addWidget( q_swap_all_faces_label, row, 0, alignment=qtx.AlignRight | qtx.AlignVCenter )
grid_l.addLayout( qtx.QXHBoxLayout([q_swap_all_faces, 4, q_face_id_label, 4, q_face_id ]), row, 1, alignment=qtx.AlignLeft ) grid_l.addLayout( qtx.QXHBoxLayout([q_swap_all_faces, 4, q_face_id_label, 4, q_face_id ]), row, 1, alignment=qtx.AlignLeft )
row += 1 row += 1