Skip to content

Commit

Permalink
Many fixes. 1.8
Browse files Browse the repository at this point in the history
  • Loading branch information
philpw99 committed Jan 25, 2025
1 parent e9eedad commit 260e673
Show file tree
Hide file tree
Showing 20 changed files with 469 additions and 352 deletions.
1 change: 0 additions & 1 deletion activate.bat

This file was deleted.

11 changes: 5 additions & 6 deletions app/common/config.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# coding:utf-8
from enum import Enum

from PyQt5.QtCore import QLocale, QObject
from PyQt5.QtCore import QLocale
from PyQt5.QtGui import QColor
from qfluentwidgets import (qconfig, QConfig, ConfigItem, OptionsConfigItem, BoolValidator,
OptionsValidator, RangeConfigItem, RangeValidator,
Theme, FolderValidator, ConfigSerializer, EnumSerializer)

from app.config import WORK_PATH, SETTINGS_PATH
from .enums import EnumExSerializer, EnumOptionsValidator
from ..core.entities import (
TargetLanguageEnum,
TranscribeModelEnum,
Expand All @@ -20,9 +21,6 @@
SubtitleLayoutEnum,
InternetTranslateEnum,
)
from ..components.EnumComboBoxSettingCard import EnumExSerializer, EnumOptionsValidator

qoConfig = QObject() # qo means QObject

class Language(Enum):
""" 软件语言 """
Expand Down Expand Up @@ -168,9 +166,10 @@ class Config(QConfig):

# ------------------- 字幕样式配置 -------------------
subtitle_style_name = ConfigItem("SubtitleStyle", "StyleName", "default")

subtitle_layout = OptionsConfigItem(
"SubtitleStyle", "Layout",
SubtitleLayoutEnum.ONLY_TRANSLATE.name,
SubtitleLayoutEnum.ONLY_TRANSLATE,
EnumOptionsValidator(SubtitleLayoutEnum),
EnumExSerializer(SubtitleLayoutEnum)
)
Expand Down Expand Up @@ -240,7 +239,7 @@ class Config(QConfig):
todo_when_done = OptionsConfigItem(
"All",
"ToDo_When_Done",
"NOTHING",
TodoWhenDoneEnum.NOTHING,
EnumOptionsValidator(TodoWhenDoneEnum),
EnumExSerializer(TodoWhenDoneEnum)
)
Expand Down
105 changes: 70 additions & 35 deletions app/common/enums.py
Original file line number Diff line number Diff line change
@@ -1,46 +1,81 @@
# Set the enums to new translated values
from enum import Enum
from PyQt5.QtCore import QObject
from qfluentwidgets import ConfigValidator, ConfigSerializer
from ..core.entities import SubtitleLayoutEnum, InternetTranslateEnum, TodoWhenDoneEnum, Task, BatchTaskTypeEnum

class EnumOptionsValidator(ConfigValidator):
""" Enum Options validator """

def __init__(self, enumClass: Enum):
if not enumClass or len(enumClass) == 0:
raise ValueError("The `enums` can't be empty.")

if issubclass(enumClass, Enum):
self.enumClass = enumClass
else:
self.enums = None

def validate(self, enum):
return enum in self.enumClass

def correct(self, enum):
return enum if self.validate(enum) else list(self.enumClass)[0]

class EnumExSerializer(ConfigSerializer):
""" enumeration class serializer for multi-language """
# It use names to serialize instead of values

def __init__(self, enumClass):
self.enumClass = enumClass

def serialize(self, item):
# From configItem.value to name
return item.name

def deserialize(self, name):
# From name to configItem.value, which is an Enum
return self.enumClass[name]

def Enums_Translate():
qoEnums = QObject()
BatchTaskTypeEnum.TRANSCRIBE._value_ = qoEnums.tr("Create Transcription from Audio/Video")
BatchTaskTypeEnum.TRANSLATE._value_ = qoEnums.tr("Transcribe + Translate Audio/Video")
BatchTaskTypeEnum.SOFT._value_ = qoEnums.tr("Create Soft Subtitle Video")
BatchTaskTypeEnum.HARD._value_ = qoEnums.tr("Create Hard Subtitle Video")
BatchTaskTypeEnum.TRANSCRIBE.setValue( qoEnums.tr("Create Transcription from Audio/Video") )
BatchTaskTypeEnum.TRANSLATE.setValue( qoEnums.tr("Transcribe + Translate Audio/Video") )
BatchTaskTypeEnum.SOFT.setValue( qoEnums.tr("Create Soft Subtitle Video") )
BatchTaskTypeEnum.HARD.setValue( qoEnums.tr("Create Hard Subtitle Video") )

SubtitleLayoutEnum.ONLY_ORIGINAL._value_ = qoEnums.tr("Original Only")
SubtitleLayoutEnum.ONLY_TRANSLATE._value_ = qoEnums.tr("Translated Only")
SubtitleLayoutEnum.ORIGINAL_ON_TOP._value_ = qoEnums.tr("Original on Top")
SubtitleLayoutEnum.TRANSLATE_ON_TOP._value_ = qoEnums.tr("Translated on Top")
SubtitleLayoutEnum.ONLY_ORIGINAL.setValue( qoEnums.tr("Original Only") )
SubtitleLayoutEnum.ONLY_TRANSLATE.setValue( qoEnums.tr("Translated Only") )
SubtitleLayoutEnum.ORIGINAL_ON_TOP.setValue( qoEnums.tr("Original on Top") )
SubtitleLayoutEnum.TRANSLATE_ON_TOP.setValue( qoEnums.tr("Translated on Top"))

InternetTranslateEnum.GOOGLE._value_ = qoEnums.tr("Google Translate")
InternetTranslateEnum.GOOGLE.setValue( qoEnums.tr("Google Translate"))

TodoWhenDoneEnum.NOTHING._value_ = qoEnums.tr("Nothing")
TodoWhenDoneEnum.EXIT._value_ = qoEnums.tr("Exit The Program")
TodoWhenDoneEnum.SHUTDOWN._value_ = qoEnums.tr("Shutdown The Computer")
TodoWhenDoneEnum.SUSPEND._value_ = qoEnums.tr("Suspend The Computer")
TodoWhenDoneEnum.NOTHING.setValue( qoEnums.tr("Nothing"))
TodoWhenDoneEnum.EXIT.setValue( qoEnums.tr("Exit The Program"))
TodoWhenDoneEnum.SHUTDOWN.setValue( qoEnums.tr("Shutdown The Computer"))
TodoWhenDoneEnum.SUSPEND.setValue( qoEnums.tr("Suspend The Computer"))

Task.Status.CANCELED._value_ = qoEnums.tr("Canceled")
Task.Status.COMPLETED._value_ = qoEnums.tr("Completed")
Task.Status.DOWNLOADING._value_ = qoEnums.tr("Downloading")
Task.Status.FAILED._value_ = qoEnums.tr("Failed")
Task.Status.GENERATING._value_ = qoEnums.tr("Generating")
Task.Status.OPTIMIZING._value_ = qoEnums.tr("Optimizing")
Task.Status.PENDING._value_ = qoEnums.tr("Pending")
Task.Status.SYNTHESIZING._value_ = qoEnums.tr("Synthesizing")
Task.Status.TRANSCODING._value_ = qoEnums.tr("Transcoding")
Task.Status.TRANSLATING._value_ = qoEnums.tr("Translating")
Task.Status.WAITINGAUDIO._value_ = qoEnums.tr("Waiting for audio transcoding")
Task.Status.WAITINGOPTIMIZE._value_ = qoEnums.tr("Waiting for optimization")
Task.Status.WAITINGSYNTHESIS._value_ = qoEnums.tr("Waiting for video synthesis")
Task.Status.WAITINGTRANSCRIBE._value_ = qoEnums.tr("Waiting for transcripting")

Task.Source.FILE_IMPORT._value_ = qoEnums.tr("File Import")
Task.Source.URL_IMPORT._value_ = qoEnums.tr("URL Import")
Task.Status.CANCELED.setValue( qoEnums.tr("Canceled"))
Task.Status.COMPLETED.setValue( qoEnums.tr("Completed"))
Task.Status.DOWNLOADING.setValue( qoEnums.tr("Downloading"))
Task.Status.FAILED.setValue( qoEnums.tr("Failed"))
Task.Status.GENERATING.setValue( qoEnums.tr("Generating"))
Task.Status.OPTIMIZING.setValue( qoEnums.tr("Optimizing"))
Task.Status.PENDING.setValue( qoEnums.tr("Pending"))
Task.Status.SYNTHESIZING.setValue( qoEnums.tr("Synthesizing"))
Task.Status.TRANSCODING.setValue( qoEnums.tr("Transcoding"))
Task.Status.TRANSLATING.setValue( qoEnums.tr("Translating"))
Task.Status.WAITINGAUDIO.setValue( qoEnums.tr("Waiting for audio transcoding"))
Task.Status.WAITINGOPTIMIZE.setValue( qoEnums.tr("Waiting for optimization"))
Task.Status.WAITINGSYNTHESIS.setValue( qoEnums.tr("Waiting for video synthesis"))
Task.Status.WAITINGTRANSCRIBE.setValue( qoEnums.tr("Waiting for transcripting"))

Task.Source.FILE_IMPORT.setValue( qoEnums.tr("File Import"))
Task.Source.URL_IMPORT.setValue( qoEnums.tr("URL Import"))

Task.Type.OPTIMIZE._value_ = qoEnums.tr("Optimize + Translate Subtitles")
Task.Type.SUBTITLE._value_ = qoEnums.tr("Add Subtitle To Video")
Task.Type.SYNTHESIS._value_ = qoEnums.tr("Combine Subtitle with Video")
Task.Type.TRANSCRIBE._value_ = qoEnums.tr("Get Subtitle From Video/Audio")
Task.Type.URL._value_ = qoEnums.tr("Download Video from URL then Add Subtitle")
Task.Type.OPTIMIZE.setValue( qoEnums.tr("Optimize + Translate Subtitles"))
Task.Type.SUBTITLE.setValue( qoEnums.tr("Add Subtitle To Video"))
Task.Type.SYNTHESIS.setValue( qoEnums.tr("Combine Subtitle with Video"))
Task.Type.TRANSCRIBE.setValue( qoEnums.tr("Get Subtitle From Video/Audio"))
Task.Type.URL.setValue( qoEnums.tr("Download Video from URL then Add Subtitle"))
3 changes: 3 additions & 0 deletions app/common/signal_bus.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ class SignalBus(QObject):
need_video_changed = pyqtSignal(bool)
soft_subtitle_changed = pyqtSignal(bool)

# App log signal
app_log_signal = pyqtSignal(str)

# 新增视频控制相关信号
video_play = pyqtSignal() # 播放信号
video_pause = pyqtSignal() # 暂停信号
Expand Down
64 changes: 14 additions & 50 deletions app/components/EnumComboBoxSettingCard.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QIcon
from qfluentwidgets import SettingCard, ComboBox
from qfluentwidgets.common.config import ConfigItem, qconfig , ConfigValidator, ConfigSerializer

from qfluentwidgets.common.config import ConfigItem, qconfig

class EnumComboBoxSettingCard(SettingCard):
""" 针对多语言的Enum选项设计的下拉框设置卡片 """
Expand All @@ -27,15 +26,16 @@ def __init__(self, configItem: ConfigItem, icon: Union[str, QIcon], title: str,
self.comboBox.addItem( item.value )

# 设置布局
self.hBoxLayout.addWidget(self.comboBox, 0, Qt.AlignRight)
self.hBoxLayout.addWidget(self.comboBox, 0, Qt.AlignmentFlag.AlignRight)
self.hBoxLayout.addSpacing(16)

# 设置最小宽度
self.comboBox.setMinimumWidth(100)

# 设置初始值
name = qconfig.get(configItem) # It's the key, not the value
self.setValue(enums[name].value) # Set the text to translated value
itemEnum = qconfig.get(configItem) # It's the enum, not the name or value
self.comboBox.setText(itemEnum.value)
# self.setValue(itemEnum.value) # Set the text to translated value

# 连接信号
self.comboBox.currentTextChanged.connect(self.__onTextChanged)
Expand All @@ -48,56 +48,20 @@ def __onTextChanged(self, text: str):

def setValue(self, value: str):
""" 设置值 """
key = self.getKey(value) # Get the name from Enum by value
qconfig.set(self.configItem, key)
enum = self.enums(value) # Get the enum from value
qconfig.set(self.configItem, enum)
self.comboBox.setText(value)

def addItems(self, items: List[str]):

def addItems(self, items: List[Enum]):
""" 添加选项 """
# Here the items should be enums, not str
for item in items:
self.comboBox.addItem(item)
self.comboBox.addItem(item.value)

def setItems(self, items: List[str]):
def setItems(self, items: List[Enum]):
""" 重新设置选项列表 """
self.comboBox.clear()
self.items = items
# self.items = items
for item in items:
self.comboBox.addItem(item)

def getKey(self, value) -> str:
# Get the key str from value str
for item in self.enums:
if item.value == value:
return item.name
return ""


class EnumOptionsValidator(ConfigValidator):
""" Enum Options validator """

def __init__(self, enums: Enum):

if type(enums) == type(Enum):
self.names = list(item.name for item in enums)
else:
self.names = []

def validate(self, value):
return value in self.names

def correct(self, value):
return value if self.validate(value) else self.names[0]

class EnumExSerializer(ConfigSerializer):
""" enumeration class serializer for multi-language """

def __init__(self, enumClass):
self.enumClass = enumClass

def serialize(self, key):
# From configItem.value to text
return key

def deserialize(self, name):
# From text to configItem.value
return name
self.comboBox.addItem(item.value)
Loading

0 comments on commit 260e673

Please sign in to comment.