Metahuman_DNA_Calibration/dna_viewer/ui/elements.py
2022-11-29 14:25:24 +01:00

173 lines
5.2 KiB
Python

from pathlib import Path
from typing import Optional
from maya import cmds
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QCheckBox, QProgressBar, QPushButton, QWidget
from ..config.character import BuildOptions
from ..model.dna import DNA
from ..ui.file_chooser import FileChooser
class Elements:
"""
Used for holding references to elements that get added to widgets
Attributes
----------
@type main_widget: QWidget
@param main_widget: The main widget that holds everything
@type select_dna_path: FileChooser
@param select_dna_path: The FileChooser widget for getting the DNA path
@type load_dna_btn: QPushButton
@param load_dna_btn: The button that starts loading in the DNA
@type mesh_tree_list: QWidget
@param mesh_tree_list: The widget that contains the meshes to be selected in a tree list
@type joints_cb: QCheckBox
@param joints_cb: The checkbox that represents if joints should be added
@type normals_cb: QCheckBox
@param normals_cb: The checkbox that represents if normals should be added
@type blend_shapes_cb: QCheckBox
@param blend_shapes_cb: The checkbox that represents if blend shapes should be added
@type skin_cb: QCheckBox
@param skin_cb: The checkbox that represents if skin should be added
@type rig_logic_cb: QCheckBox
@param rig_logic_cb: The checkbox that represents if rig logic should be added
@type select_gui_path: FileChooser
@param select_gui_path: The FileChooser widget for getting the gui path
@type select_analog_gui_path: FileChooser
@param select_analog_gui_path: The FileChooser widget for getting the analog gui path
@type select_aas_path: FileChooser
@param select_aas_path: The FileChooser widget for getting the additional assembly script path
@type process_btn: QPushButton
@param process_btn: The button that starts creating the scene and character
@type progress_bar: QProgressBar
@param progress_bar: The progress bar that shows the building progress
"""
main_widget: QWidget = None
select_dna_path: FileChooser = None
load_dna_btn: QPushButton = None
mesh_tree_list: QWidget = None
joints_cb: QCheckBox = None
normals_cb: QCheckBox = None
blend_shapes_cb: QCheckBox = None
skin_cb: QCheckBox = None
rig_logic_cb: QCheckBox = None
select_gui_path: FileChooser = None
select_analog_gui_path: FileChooser = None
select_aas_path: FileChooser = None
process_btn: QPushButton = None
progress_bar: QProgressBar = None
dna: DNA = None
@staticmethod
def create_new_scene() -> None:
"""Creates a new scene"""
cmds.file(new=True, force=True)
@staticmethod
def get_file_path(input: FileChooser) -> Optional[str]:
"""
Gets the file path contained in the provided FileChooser widget
@type input: FileChooser
@param input: The FileChooser widget we want to get the file path from
@rtype: Optional[str]
@returns: The value extracted from the FileChooser
"""
path: str = input.get_file_path()
if path and Path(path.strip()).exists():
return path
return None
def get_dna_path(self) -> Optional[str]:
"""
Gets the DNA file path
@rtype: Optional[str]
@returns: The DNA file path
"""
return Elements.get_file_path(self.select_dna_path)
def get_gui_path(self) -> Optional[str]:
"""
Gets the gui file path
@rtype: Optional[str]
@returns: The gui file path
"""
return Elements.get_file_path(self.select_gui_path)
def get_analog_gui_path(self) -> Optional[str]:
"""
Gets the analog gui file path
@rtype: Optional[str]
@returns: The analog gui file path
"""
return Elements.get_file_path(self.select_analog_gui_path)
def get_aas_path(self) -> Optional[str]:
"""
Gets the additional assembly script file path
@rtype: Optional[str]
@returns: The additional assembly script file path
"""
return Elements.get_file_path(self.select_aas_path)
def get_build_options(self) -> BuildOptions:
"""
Gets and returns a build options configuration from the corresponding UI elements
@rtype: BuildOptions
@returns: The object containing build option configuration
"""
return BuildOptions(
add_joints=Elements.is_checked(self.joints_cb),
add_normals=Elements.is_checked(self.normals_cb),
add_blend_shapes=Elements.is_checked(self.blend_shapes_cb),
add_skin=Elements.is_checked(self.skin_cb),
)
@staticmethod
def is_checked(checkbox: QCheckBox) -> bool:
"""
Returns if the provided checkbox is checked and enabled
@type checkbox: QCheckBox
@param checkbox: The checkbox thats value needs to be checked and enabled
@rtype: bool
@returns: The flag representing if the checkbox is checked and enabled
"""
return (
checkbox is not None
and bool(checkbox.isEnabled())
and checkbox.checkState() == Qt.CheckState.Checked
)