vertical layout

This commit is contained in:
Juraj Borza
2025-04-28 13:52:25 +02:00
parent 31c8d00ae7
commit 4462ee7ed4
+45 -14
View File
@@ -8,9 +8,17 @@ from PyQt5.QtWidgets import (
QSlider, QSlider,
QScrollArea, QScrollArea,
QWidget, QWidget,
QPushButton QPushButton,
QSizePolicy
) )
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from constants import (
VOICES_INTERNAL,
FLAGS
)
# Constants for voice names and flags
voice_mixer_width = 160
class VoiceMixer(QWidget): class VoiceMixer(QWidget):
def __init__(self, voice_name, language_icon, update_formula_callback): def __init__(self, voice_name, language_icon, update_formula_callback):
@@ -19,18 +27,26 @@ class VoiceMixer(QWidget):
self.voice_name = voice_name self.voice_name = voice_name
self.update_formula_callback = update_formula_callback self.update_formula_callback = update_formula_callback
# Set fixed width for this widget
self.setFixedWidth(voice_mixer_width)
# TODO Set CSS for rounded corners
# self.setObjectName("VoiceMixer")
# self.setStyleSheet(self.ROUNDED_CSS)
# Main Layout # Main Layout
layout = QVBoxLayout() layout = QVBoxLayout()
# Checkbox and Voice Name # Checkbox at the top
self.checkbox = QCheckBox() self.checkbox = QCheckBox()
self.checkbox.setChecked(True) self.checkbox.setChecked(True)
self.checkbox.stateChanged.connect(self.update_formula_callback) self.checkbox.stateChanged.connect(self.update_formula_callback)
layout.addWidget(self.checkbox, alignment=Qt.AlignCenter)
name_label = QLabel(f"{voice_name} {language_icon}") voice_gender = self.get_voice_gender()
name = voice_name[3:].capitalize()
name_label = QLabel(f"{language_icon} {voice_gender} {name}")
name_label.setStyleSheet("font-size: 16px;") name_label.setStyleSheet("font-size: 16px;")
name_layout = QHBoxLayout() name_layout = QHBoxLayout()
name_layout.addWidget(self.checkbox)
name_layout.addWidget(name_label) name_layout.addWidget(name_label)
name_layout.addStretch() name_layout.addStretch()
layout.addLayout(name_layout) layout.addLayout(name_layout)
@@ -44,7 +60,8 @@ class VoiceMixer(QWidget):
self.slider = QSlider(Qt.Vertical) # Set slider orientation to vertical self.slider = QSlider(Qt.Vertical) # Set slider orientation to vertical
self.slider.setRange(0, 100) self.slider.setRange(0, 100)
self.slider.setValue(50) # Default to 0.5 self.slider.setValue(100) # Default to 1.0
self.slider.setFixedHeight(180)
self.slider.valueChanged.connect( self.slider.valueChanged.connect(
lambda val: self.spin_box.setValue(val / 100) lambda val: self.spin_box.setValue(val / 100)
) )
@@ -55,12 +72,19 @@ class VoiceMixer(QWidget):
slider_layout = QVBoxLayout() slider_layout = QVBoxLayout()
slider_layout.addWidget(self.spin_box) slider_layout.addWidget(self.spin_box)
slider_layout.addWidget(QLabel("1", alignment=Qt.AlignCenter)) slider_layout.addWidget(QLabel("1", alignment=Qt.AlignCenter))
slider_layout.addWidget(self.slider) slider_layout.addWidget(self.slider, alignment=Qt.AlignCenter)
slider_layout.addWidget(QLabel("0", alignment=Qt.AlignCenter)) slider_layout.addWidget(QLabel("0", alignment=Qt.AlignCenter))
layout.addLayout(slider_layout) layout.addLayout(slider_layout)
self.setLayout(layout) self.setLayout(layout)
def get_voice_gender(self):
if self.voice_name in VOICES_INTERNAL:
gender = self.voice_name[1]
return "👩‍🦰" if gender == "f" else "👨"
return ""
def get_formula_component(self): def get_formula_component(self):
if self.checkbox.isChecked(): if self.checkbox.isChecked():
weight = self.spin_box.value() weight = self.spin_box.value()
@@ -73,6 +97,7 @@ class VoiceFormulaDialog(QDialog):
super().__init__(parent) super().__init__(parent)
self.setWindowTitle("Voice Mixer") self.setWindowTitle("Voice Mixer")
self.setFixedSize(1000, 500)
self.voice_mixers = [] self.voice_mixers = []
# Main Layout # Main Layout
@@ -81,15 +106,17 @@ class VoiceFormulaDialog(QDialog):
# Scroll Area for Voice Panels # Scroll Area for Voice Panels
self.scroll_area = QScrollArea() self.scroll_area = QScrollArea()
self.scroll_area.setWidgetResizable(True) self.scroll_area.setWidgetResizable(True)
self.scroll_area.setFixedSize(1000, 500) # Keep scroll area height within 500
self.voice_list_widget = QWidget() self.voice_list_widget = QWidget()
self.voice_list_layout = QHBoxLayout() self.voice_list_layout = QHBoxLayout()
self.voice_list_widget.setLayout(self.voice_list_layout) self.voice_list_widget.setLayout(self.voice_list_layout)
self.voice_list_widget.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
self.scroll_area.setWidget(self.voice_list_widget) self.scroll_area.setWidget(self.voice_list_widget)
main_layout.addWidget(self.scroll_area) main_layout.addWidget(self.scroll_area)
# Formula Label # Formula Label
self.formula_label = QLabel("Voice Formula: ") self.formula_label = QLabel("Voice Combination Formula: ")
self.formula_label.setStyleSheet("font-size: 14px; font-weight: bold;") self.formula_label.setStyleSheet("font-size: 14px;")
main_layout.addWidget(self.formula_label) main_layout.addWidget(self.formula_label)
@@ -111,14 +138,13 @@ class VoiceFormulaDialog(QDialog):
self.setLayout(main_layout) self.setLayout(main_layout)
# Initialize with fixed voices # Initialize with fixed voices
self.add_fixed_voices() self.add_voices()
def add_fixed_voices(self): def add_voices(self):
voices = ['af_bella', 'af_sarah', 'am_eric'] for voice in VOICES_INTERNAL:
language_icon = '🇺🇸' flag = FLAGS.get(voice[0], "")
for voice in voices: self.add_voice(voice, flag)
self.add_voice(voice, language_icon)
def add_voice(self, voice_name, language_icon): def add_voice(self, voice_name, language_icon):
voice_mixer = VoiceMixer(voice_name, language_icon, self.update_formula) voice_mixer = VoiceMixer(voice_name, language_icon, self.update_formula)
@@ -126,6 +152,11 @@ class VoiceFormulaDialog(QDialog):
self.voice_list_layout.addWidget(voice_mixer) self.voice_list_layout.addWidget(voice_mixer)
self.update_formula() self.update_formula()
def update_scroll_area_width(self):
# Calculate the width of the scrollable area based on the number of VoiceMixers
width = len(self.voice_mixers) * voice_mixer_width
self.voice_list_widget.setFixedWidth(width)
def update_formula(self): def update_formula(self):
formula_components = [ formula_components = [
mixer.get_formula_component() for mixer in self.voice_mixers mixer.get_formula_component() for mixer in self.voice_mixers