This commit is contained in:
dazedanon 2025-10-25 17:02:06 -05:00
parent 38a0e8f03a
commit 692ddf00b6
5 changed files with 246 additions and 168 deletions

View file

@ -55,9 +55,11 @@ class ConfigTab(QWidget):
"""Initialize the user interface with tabs for different config categories."""
main_layout = QVBoxLayout()
main_layout.setContentsMargins(0, 0, 0, 0)
main_layout.setSpacing(0)
# Create tab widget for different configuration categories
self.config_tabs = QTabWidget()
self.config_tabs.setDocumentMode(True) # Remove frame for more space
# Tab 1: General Settings (Everything in one place!)
general_tab = self.create_general_settings_tab()
@ -76,74 +78,61 @@ class ConfigTab(QWidget):
self.config_tabs.addTab(self.wolf_tab, "Wolf RPG")
main_layout.addWidget(self.config_tabs)
# Bottom buttons row
button_layout = QHBoxLayout()
button_layout.setSpacing(10)
self.save_button = QPushButton("💾 Save Configuration")
self.save_button.clicked.connect(self.save_to_env)
self.save_button.setMinimumHeight(35)
self.load_button = QPushButton("📂 Load from File")
self.load_button.clicked.connect(self.load_from_file_dialog)
self.load_button.setMinimumHeight(35)
self.reset_button = QPushButton("🔄 Reset to Defaults")
self.reset_button.clicked.connect(self.reset_to_defaults)
self.reset_button.setMinimumHeight(35)
button_layout.addWidget(self.save_button)
button_layout.addWidget(self.load_button)
button_layout.addWidget(self.reset_button)
button_layout.addStretch()
main_layout.addLayout(button_layout)
self.setLayout(main_layout)
def create_general_settings_tab(self):
"""Create combined general settings tab with API, Translation, Performance, and UI settings."""
widget = QWidget()
scroll = QScrollArea()
scroll.setWidgetResizable(True)
scroll.setFrameShape(QFrame.NoFrame)
content = QWidget()
layout = QVBoxLayout()
layout.setSpacing(5)
layout.setContentsMargins(10, 10, 10, 10)
layout.setSpacing(8)
layout.setContentsMargins(15, 15, 15, 15)
# Create a two-column layout for better space utilization
columns_layout = QHBoxLayout()
columns_layout.setSpacing(20)
columns_layout.setSpacing(30)
# LEFT COLUMN
left_column = QVBoxLayout()
left_column.setSpacing(5)
left_column.setSpacing(8)
# API Configuration Section
left_column.addWidget(create_section_header("🔑 API Configuration"))
api_form = QFormLayout()
api_form.setSpacing(5)
api_form.setContentsMargins(0, 0, 0, 10)
api_form.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
api_form.setSpacing(6)
api_form.setContentsMargins(0, 0, 0, 12)
api_form.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint)
api_form.setLabelAlignment(Qt.AlignRight | Qt.AlignVCenter)
api_url_label = QLabel("API URL:")
api_url_label.setFixedWidth(150)
api_url_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.api_url_edit = QLineEdit()
self.api_url_edit.setPlaceholderText("Leave blank for OpenAI API")
self.api_url_edit.setFixedWidth(350) # Large
api_form.addRow("API URL:", self.api_url_edit)
api_form.addRow(api_url_label, self.api_url_edit)
api_key_label = QLabel("API Key:")
api_key_label.setFixedWidth(150)
api_key_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.api_key_edit = QLineEdit()
self.api_key_edit.setEchoMode(QLineEdit.Password)
self.api_key_edit.setPlaceholderText("Enter your API key")
self.api_key_edit.setFixedWidth(350) # Large
api_form.addRow("API Key:", self.api_key_edit)
api_form.addRow(api_key_label, self.api_key_edit)
org_label = QLabel("Organization:")
org_label.setFixedWidth(150)
org_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.organization_edit = QLineEdit()
self.organization_edit.setPlaceholderText("Optional organization key")
self.organization_edit.setFixedWidth(350) # Large
api_form.addRow("Organization:", self.organization_edit)
api_form.addRow(org_label, self.organization_edit)
model_label = QLabel("Model:")
model_label.setFixedWidth(150)
model_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.model_combo = QComboBox()
self.model_combo.setEditable(True)
self.model_combo.addItems([
@ -152,7 +141,7 @@ class ConfigTab(QWidget):
"gemini-2.0-flash", "gemini-2.5-flash", "gemini-2.5-pro"
])
self.model_combo.setFixedWidth(200) # Medium
api_form.addRow("Model:", self.model_combo)
api_form.addRow(model_label, self.model_combo)
left_column.addLayout(api_form)
left_column.addWidget(create_horizontal_line())
@ -160,25 +149,32 @@ class ConfigTab(QWidget):
# Translation Settings Section
left_column.addWidget(create_section_header("🌐 Translation Settings"))
trans_form = QFormLayout()
trans_form.setSpacing(5)
trans_form.setContentsMargins(0, 0, 0, 10)
trans_form.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
trans_form.setSpacing(6)
trans_form.setContentsMargins(0, 0, 0, 12)
trans_form.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint)
trans_form.setLabelAlignment(Qt.AlignRight | Qt.AlignVCenter)
lang_label = QLabel("Target Language:")
lang_label.setFixedWidth(150)
lang_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.language_combo = QComboBox()
self.language_combo.addItems([
"English", "Spanish", "French", "German", "Italian",
"Portuguese", "Russian", "Chinese", "Korean", "Japanese"
])
self.language_combo.setFixedWidth(200) # Medium
trans_form.addRow("Target Language:", self.language_combo)
trans_form.addRow(lang_label, self.language_combo)
timeout_label = QLabel("Timeout:")
timeout_label.setFixedWidth(150)
timeout_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.timeout_spin = QSpinBox()
self.timeout_spin.setButtonSymbols(QSpinBox.NoButtons)
self.timeout_spin.setRange(30, 300)
self.timeout_spin.setValue(90)
self.timeout_spin.setSuffix(" sec")
self.timeout_spin.setFixedWidth(90) # Small
trans_form.addRow("Timeout:", self.timeout_spin)
self.timeout_spin.setFixedWidth(120) # Small
trans_form.addRow(timeout_label, self.timeout_spin)
left_column.addLayout(trans_form)
left_column.addWidget(create_horizontal_line())
@ -186,76 +182,99 @@ class ConfigTab(QWidget):
# Performance Settings Section
left_column.addWidget(create_section_header("⚡ Performance Settings"))
perf_form = QFormLayout()
perf_form.setSpacing(5)
perf_form.setContentsMargins(0, 0, 0, 10)
perf_form.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
perf_form.setSpacing(6)
perf_form.setContentsMargins(0, 0, 0, 12)
perf_form.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint)
perf_form.setLabelAlignment(Qt.AlignRight | Qt.AlignVCenter)
file_threads_label = QLabel("File Threads:")
file_threads_label.setFixedWidth(150)
file_threads_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.file_threads_spin = QSpinBox()
self.file_threads_spin.setButtonSymbols(QSpinBox.NoButtons)
self.file_threads_spin.setRange(1, 10)
self.file_threads_spin.setValue(1)
self.file_threads_spin.setFixedWidth(90) # Small
perf_form.addRow("File Threads:", self.file_threads_spin)
self.file_threads_spin.setFixedWidth(120) # Small
perf_form.addRow(file_threads_label, self.file_threads_spin)
threads_label = QLabel("Threads per File:")
threads_label.setFixedWidth(150)
threads_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.threads_spin = QSpinBox()
self.threads_spin.setButtonSymbols(QSpinBox.NoButtons)
self.threads_spin.setRange(1, 20)
self.threads_spin.setValue(1)
self.threads_spin.setFixedWidth(90) # Small
perf_form.addRow("Threads per File:", self.threads_spin)
self.threads_spin.setFixedWidth(120) # Small
perf_form.addRow(threads_label, self.threads_spin)
batch_label = QLabel("Batch Size:")
batch_label.setFixedWidth(150)
batch_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.batch_size_spin = QSpinBox()
self.batch_size_spin.setButtonSymbols(QSpinBox.NoButtons)
self.batch_size_spin.setRange(1, 100)
self.batch_size_spin.setValue(30)
self.batch_size_spin.setFixedWidth(90) # Small
perf_form.addRow("Batch Size:", self.batch_size_spin)
self.batch_size_spin.setFixedWidth(120) # Small
perf_form.addRow(batch_label, self.batch_size_spin)
freq_label = QLabel("Frequency Penalty:")
freq_label.setFixedWidth(150)
freq_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.frequency_penalty_spin = QDoubleSpinBox()
self.frequency_penalty_spin.setButtonSymbols(QDoubleSpinBox.NoButtons)
self.frequency_penalty_spin.setRange(0.0, 2.0)
self.frequency_penalty_spin.setSingleStep(0.05)
self.frequency_penalty_spin.setValue(0.05)
self.frequency_penalty_spin.setFixedWidth(90) # Small
perf_form.addRow("Frequency Penalty:", self.frequency_penalty_spin)
self.frequency_penalty_spin.setFixedWidth(120) # Small
perf_form.addRow(freq_label, self.frequency_penalty_spin)
left_column.addLayout(perf_form)
left_column.addStretch()
# RIGHT COLUMN
right_column = QVBoxLayout()
right_column.setSpacing(5)
right_column.setSpacing(8)
# Text Formatting Section
right_column.addWidget(create_section_header("📝 Text Formatting"))
format_form = QFormLayout()
format_form.setSpacing(5)
format_form.setContentsMargins(0, 0, 0, 10)
format_form.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
format_form.setSpacing(6)
format_form.setContentsMargins(0, 0, 0, 12)
format_form.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint)
format_form.setLabelAlignment(Qt.AlignRight | Qt.AlignVCenter)
dialogue_label = QLabel("Dialogue Width:")
dialogue_label.setFixedWidth(150)
dialogue_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.width_spin = QSpinBox()
self.width_spin.setButtonSymbols(QSpinBox.NoButtons)
self.width_spin.setRange(20, 200)
self.width_spin.setValue(60)
self.width_spin.setSuffix(" chars")
self.width_spin.setFixedWidth(90) # Small
format_form.addRow("Dialogue Width:", self.width_spin)
self.width_spin.setFixedWidth(120) # Small
format_form.addRow(dialogue_label, self.width_spin)
list_label = QLabel("List Width:")
list_label.setFixedWidth(150)
list_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.list_width_spin = QSpinBox()
self.list_width_spin.setButtonSymbols(QSpinBox.NoButtons)
self.list_width_spin.setRange(20, 200)
self.list_width_spin.setValue(100)
self.list_width_spin.setSuffix(" chars")
self.list_width_spin.setFixedWidth(90) # Small
format_form.addRow("List Width:", self.list_width_spin)
self.list_width_spin.setFixedWidth(120) # Small
format_form.addRow(list_label, self.list_width_spin)
note_label = QLabel("Note Width:")
note_label.setFixedWidth(150)
note_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.note_width_spin = QSpinBox()
self.note_width_spin.setButtonSymbols(QSpinBox.NoButtons)
self.note_width_spin.setRange(20, 200)
self.note_width_spin.setValue(75)
self.note_width_spin.setSuffix(" chars")
self.note_width_spin.setFixedWidth(90) # Small
format_form.addRow("Note Width:", self.note_width_spin)
self.note_width_spin.setFixedWidth(120) # Small
format_form.addRow(note_label, self.note_width_spin)
right_column.addLayout(format_form)
right_column.addWidget(create_horizontal_line())
@ -263,16 +282,20 @@ class ConfigTab(QWidget):
# Custom API Pricing Section
right_column.addWidget(create_section_header("💰 Custom API Pricing"))
pricing_note = QLabel("Only used if your model isn't in the built-in pricing list")
pricing_note.setStyleSheet("color: #888888; font-style: italic; font-size: 10px;")
pricing_note = QLabel("Only used if model isn't in built-in pricing list")
pricing_note.setStyleSheet("color: #888888; font-style: italic; font-size: 9px;")
pricing_note.setWordWrap(True)
right_column.addWidget(pricing_note)
price_form = QFormLayout()
price_form.setSpacing(5)
price_form.setContentsMargins(0, 5, 0, 10)
price_form.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
price_form.setSpacing(6)
price_form.setContentsMargins(0, 3, 0, 12)
price_form.setFieldGrowthPolicy(QFormLayout.FieldsStayAtSizeHint)
price_form.setLabelAlignment(Qt.AlignRight | Qt.AlignVCenter)
input_label = QLabel("Input Cost:")
input_label.setFixedWidth(150)
input_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.input_cost_spin = QDoubleSpinBox()
self.input_cost_spin.setButtonSymbols(QDoubleSpinBox.NoButtons)
self.input_cost_spin.setRange(0.0, 100.0)
@ -281,8 +304,11 @@ class ConfigTab(QWidget):
self.input_cost_spin.setValue(2.0)
self.input_cost_spin.setSuffix(" per 1M tokens")
self.input_cost_spin.setFixedWidth(200) # Medium
price_form.addRow("Input Cost:", self.input_cost_spin)
price_form.addRow(input_label, self.input_cost_spin)
output_label = QLabel("Output Cost:")
output_label.setFixedWidth(150)
output_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self.output_cost_spin = QDoubleSpinBox()
self.output_cost_spin.setButtonSymbols(QDoubleSpinBox.NoButtons)
self.output_cost_spin.setRange(0.0, 100.0)
@ -291,7 +317,7 @@ class ConfigTab(QWidget):
self.output_cost_spin.setValue(8.0)
self.output_cost_spin.setSuffix(" per 1M tokens")
self.output_cost_spin.setFixedWidth(200) # Medium
price_form.addRow("Output Cost:", self.output_cost_spin)
price_form.addRow(output_label, self.output_cost_spin)
right_column.addLayout(price_form)
right_column.addStretch()
@ -302,13 +328,35 @@ class ConfigTab(QWidget):
layout.addLayout(columns_layout)
content.setLayout(layout)
scroll.setWidget(content)
# Add buttons at the bottom of General Settings tab
layout.addSpacing(15)
button_layout = QHBoxLayout()
button_layout.setSpacing(10)
wrapper = QVBoxLayout()
wrapper.setContentsMargins(0, 0, 0, 0)
wrapper.addWidget(scroll)
widget.setLayout(wrapper)
save_button = QPushButton("💾 Save Configuration")
save_button.clicked.connect(self.save_to_env)
save_button.setMinimumHeight(32)
save_button.setStyleSheet("font-weight: bold;")
load_button = QPushButton("📂 Load from File")
load_button.clicked.connect(self.load_from_file_dialog)
load_button.setMinimumHeight(32)
reset_button = QPushButton("🔄 Reset to Defaults")
reset_button.clicked.connect(self.reset_to_defaults)
reset_button.setMinimumHeight(32)
button_layout.addWidget(save_button)
button_layout.addWidget(load_button)
button_layout.addWidget(reset_button)
button_layout.addStretch()
layout.addLayout(button_layout)
content.setLayout(layout)
widget.setLayout(QVBoxLayout())
widget.layout().setContentsMargins(0, 0, 0, 0)
widget.layout().addWidget(content)
return widget
def load_from_env(self):

View file

@ -138,6 +138,8 @@ class DazedMTLGUI(QMainWindow):
# Set main layout
layout = QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
layout.addWidget(self.tab_widget)
central_widget.setLayout(layout)
@ -177,8 +179,6 @@ class DazedMTLGUI(QMainWindow):
# Save to .env file
self.config_tab.save_to_env()
self.status_label.setText(f"Font scale set to {scale_factor:.1f}x")
except Exception as e:
QMessageBox.warning(self, "Warning", f"Failed to set font scale: {str(e)}")
@ -240,17 +240,9 @@ class DazedMTLGUI(QMainWindow):
about_action.triggered.connect(self.show_about)
def setup_status_bar(self):
"""Set up the status bar."""
self.status_bar = QStatusBar()
self.setStatusBar(self.status_bar)
# Add status labels
self.status_label = QLabel("Ready")
self.progress_bar = QProgressBar()
self.progress_bar.setVisible(False)
self.status_bar.addWidget(self.status_label)
self.status_bar.addPermanentWidget(self.progress_bar)
"""Set up the status bar (removed to save space)."""
# Status bar removed to maximize space for content
pass
def load_project(self):
"""Load a project configuration."""
@ -265,7 +257,6 @@ class DazedMTLGUI(QMainWindow):
try:
# Load configuration from file
self.config_tab.load_from_file(file_path)
self.status_label.setText(f"Loaded project: {Path(file_path).name}")
except Exception as e:
QMessageBox.critical(self, "Error", f"Failed to load project:\n{str(e)}")
@ -287,7 +278,6 @@ class DazedMTLGUI(QMainWindow):
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(config_data, f, indent=2, ensure_ascii=False)
self.status_label.setText(f"Saved project: {Path(file_path).name}")
except Exception as e:
QMessageBox.critical(self, "Error", f"Failed to save project:\n{str(e)}")
@ -303,7 +293,6 @@ class DazedMTLGUI(QMainWindow):
if reply == QMessageBox.Yes:
self.config_tab.reset_to_defaults()
self.status_label.setText("Reset to defaults")
def validate_configuration(self):
"""Validate the current configuration."""
@ -313,7 +302,6 @@ class DazedMTLGUI(QMainWindow):
if config_valid:
QMessageBox.information(self, "Validation", "Configuration is valid!")
self.status_label.setText("Configuration validated")
else:
QMessageBox.warning(self, "Validation", "Configuration has issues. Check the warnings.")
@ -340,16 +328,16 @@ class DazedMTLGUI(QMainWindow):
)
def update_status(self, message):
"""Update the status bar message."""
self.status_label.setText(message)
"""Update the status bar message (removed to save space)."""
pass
def show_progress(self, show=True):
"""Show or hide the progress bar."""
self.progress_bar.setVisible(show)
"""Show or hide the progress bar (removed to save space)."""
pass
def set_progress(self, value):
"""Set the progress bar value (0-100)."""
self.progress_bar.setValue(value)
"""Set the progress bar value (removed to save space)."""
pass
def main():

View file

@ -171,29 +171,29 @@ class RPGMakerTab(QWidget):
def init_ui(self):
"""Initialize the user interface with compact two-column layout."""
main_layout = QVBoxLayout()
main_layout.setContentsMargins(10, 10, 10, 10)
main_layout.setContentsMargins(15, 15, 15, 15)
main_layout.setSpacing(10)
# Title and description
title = "RPG Maker MV/MZ" if self.engine != "ACE" else "RPG Maker Ace"
title_label = QLabel(f"{title} Translation Settings")
title_label.setStyleSheet("font-size: 14px; font-weight: bold; color: #007acc;")
title_label.setStyleSheet("font-size: 15px; font-weight: bold; color: #007acc;")
main_layout.addWidget(title_label)
description_label = QLabel(
"Enable event codes to translate. Only enable what you need to reduce translation time and costs."
)
description_label.setWordWrap(True)
description_label.setStyleSheet("color: #888888; font-size: 11px; margin-bottom: 5px;")
description_label.setStyleSheet("color: #888888; font-size: 10px; margin-bottom: 5px;")
main_layout.addWidget(description_label)
# Two-column layout for checkboxes
columns_layout = QHBoxLayout()
columns_layout.setSpacing(30)
columns_layout.setSpacing(40)
# LEFT COLUMN
left_column = QVBoxLayout()
left_column.setSpacing(3)
left_column.setSpacing(5)
# General Configuration
left_column.addWidget(create_section_label("⚙️ General Options"))
@ -221,7 +221,7 @@ class RPGMakerTab(QWidget):
self.ignoretltext_cb.setToolTip("Ignore already translated text")
left_column.addWidget(self.ignoretltext_cb)
left_column.addSpacing(8)
left_column.addSpacing(15)
# Main Dialogue Codes
left_column.addWidget(create_section_label("💬 Main Dialogue (Recommended)"))
@ -234,7 +234,7 @@ class RPGMakerTab(QWidget):
self.code102_cb = QCheckBox("CODE102 - Show Choices")
left_column.addWidget(self.code102_cb)
left_column.addSpacing(8)
left_column.addSpacing(15)
# Optional Dialogue Codes
left_column.addWidget(create_section_label("📝 Optional Dialogue"))
@ -243,6 +243,7 @@ class RPGMakerTab(QWidget):
self.code408_cb = QCheckBox("CODE408 - Show Text (continuation)")
self.code408_cb.setToolTip("Can significantly increase costs")
self.code408_cb.setStyleSheet("QCheckBox { color: #ff9999; }")
left_column.addWidget(self.code408_cb)
self.code122_cb = QCheckBox("CODE122 - Control Variables")
@ -252,40 +253,38 @@ class RPGMakerTab(QWidget):
# RIGHT COLUMN
right_column = QVBoxLayout()
right_column.setSpacing(3)
right_column.setSpacing(5)
# Event Codes (compact grid layout)
right_column.addWidget(create_section_label("🎮 Event Codes"))
# Plugins / Scripts / Other Codes
right_column.addWidget(create_section_label("🔧 Plugins / Scripts / Other"))
# Create a grid for better space usage
event_grid = QGridLayout()
event_grid.setSpacing(2)
event_grid.setHorizontalSpacing(15)
self.code355655_cb = QCheckBox("CODE355/655 - Script/Plugin Commands (MZ)")
right_column.addWidget(self.code355655_cb)
# Event codes in a more compact format
event_codes = [
("CODE103", "Input Number"), ("CODE104", "Select Item"),
("CODE111", "Conditional Branch"), ("CODE117", "Common Event"),
("CODE119", "Set Movement"), ("CODE121", "Control Switches"),
("CODE125", "Change Gold"), ("CODE126", "Change Items"),
("CODE127", "Change Weapons"), ("CODE128", "Change Armors"),
("CODE129", "Change Party"), ("CODE201", "Transfer Player"),
("CODE202", "Set Vehicle Loc"), ("CODE203", "Set Event Loc"),
("CODE211", "Change Transparency"), ("CODE212", "Show Animation"),
("CODE213", "Show Balloon"), ("CODE214", "Erase Event"),
("CODE221", "Fadeout Screen"), ("CODE222", "Fadein Screen"),
("CODE231", "Show Picture"), ("CODE232", "Move Picture"),
("CODE241", "Play BGM"), ("CODE242", "Fadeout BGM"),
]
self.code357_cb = QCheckBox("CODE357 - Plugin Commands")
right_column.addWidget(self.code357_cb)
self.event_checkboxes = {}
for idx, (code, label) in enumerate(event_codes):
cb = QCheckBox(f"{code} - {label}")
cb.setStyleSheet("QCheckBox { font-size: 10px; }")
event_grid.addWidget(cb, idx // 2, idx % 2)
self.event_checkboxes[code] = cb
self.code657_cb = QCheckBox("CODE657 - Plugin Commands (Extended)")
right_column.addWidget(self.code657_cb)
self.code356_cb = QCheckBox("CODE356 - System Settings")
right_column.addWidget(self.code356_cb)
self.code320_cb = QCheckBox("CODE320 - Change Name")
right_column.addWidget(self.code320_cb)
self.code324_cb = QCheckBox("CODE324 - Change Nickname")
right_column.addWidget(self.code324_cb)
self.code325_cb = QCheckBox("CODE325 - Change Profile")
right_column.addWidget(self.code325_cb)
self.code111_cb = QCheckBox("CODE111 - Conditional Branch")
right_column.addWidget(self.code111_cb)
self.code108_cb = QCheckBox("CODE108 - Comments")
right_column.addWidget(self.code108_cb)
right_column.addLayout(event_grid)
right_column.addStretch()
# Add both columns
@ -294,16 +293,20 @@ class RPGMakerTab(QWidget):
main_layout.addLayout(columns_layout)
# Bottom buttons
main_layout.addSpacing(12)
button_layout = QHBoxLayout()
button_layout.setSpacing(10)
self.reset_button = QPushButton("🔄 Reset to Defaults")
self.reset_button.clicked.connect(self.reset_to_defaults_with_message)
self.reset_button.setMaximumWidth(200)
self.reset_button.setMaximumWidth(180)
self.reset_button.setMinimumHeight(32)
self.apply_button = QPushButton("✓ Apply Settings")
self.apply_button.clicked.connect(self.apply_to_module)
self.apply_button.setMaximumWidth(200)
self.apply_button.setMaximumWidth(180)
self.apply_button.setMinimumHeight(32)
self.apply_button.setStyleSheet("font-weight: bold;")
button_layout.addWidget(self.reset_button)
button_layout.addWidget(self.apply_button)
@ -337,9 +340,16 @@ class RPGMakerTab(QWidget):
# Variable codes
self.code122_cb.setChecked(self.DEFAULT_CONFIG["CODE122"])
# Event codes
for code, cb in self.event_checkboxes.items():
cb.setChecked(self.DEFAULT_CONFIG.get(code, False))
# Plugins / Scripts / Other codes
self.code355655_cb.setChecked(self.DEFAULT_CONFIG.get("CODE355655", False))
self.code357_cb.setChecked(self.DEFAULT_CONFIG.get("CODE357", False))
self.code657_cb.setChecked(self.DEFAULT_CONFIG.get("CODE657", False))
self.code356_cb.setChecked(self.DEFAULT_CONFIG.get("CODE356", False))
self.code320_cb.setChecked(self.DEFAULT_CONFIG.get("CODE320", False))
self.code324_cb.setChecked(self.DEFAULT_CONFIG.get("CODE324", False))
self.code325_cb.setChecked(self.DEFAULT_CONFIG.get("CODE325", False))
self.code111_cb.setChecked(self.DEFAULT_CONFIG.get("CODE111", False))
self.code108_cb.setChecked(self.DEFAULT_CONFIG.get("CODE108", False))
# Reconnect signals and apply changes once
self.connect_auto_apply()
@ -377,9 +387,16 @@ class RPGMakerTab(QWidget):
# Variable codes
self.code122_cb.stateChanged.disconnect()
# Event codes
for cb in self.event_checkboxes.values():
cb.stateChanged.disconnect()
# Plugins / Scripts / Other codes
self.code355655_cb.stateChanged.disconnect()
self.code357_cb.stateChanged.disconnect()
self.code657_cb.stateChanged.disconnect()
self.code356_cb.stateChanged.disconnect()
self.code320_cb.stateChanged.disconnect()
self.code324_cb.stateChanged.disconnect()
self.code325_cb.stateChanged.disconnect()
self.code111_cb.stateChanged.disconnect()
self.code108_cb.stateChanged.disconnect()
except TypeError:
# Ignore if signals are not connected
pass
@ -406,9 +423,16 @@ class RPGMakerTab(QWidget):
# Variable codes
self.code122_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
# Event codes
for cb in self.event_checkboxes.values():
cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
# Plugins / Scripts / Other codes
self.code355655_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code357_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code657_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code356_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code320_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code324_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code325_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code111_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
self.code108_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
def get_config(self):
"""Get current configuration as dictionary."""
@ -432,11 +456,18 @@ class RPGMakerTab(QWidget):
# Variable codes
"CODE122": self.code122_cb.isChecked(),
# Plugins / Scripts / Other codes
"CODE355655": self.code355655_cb.isChecked(),
"CODE357": self.code357_cb.isChecked(),
"CODE657": self.code657_cb.isChecked(),
"CODE356": self.code356_cb.isChecked(),
"CODE320": self.code320_cb.isChecked(),
"CODE324": self.code324_cb.isChecked(),
"CODE325": self.code325_cb.isChecked(),
"CODE111": self.code111_cb.isChecked(),
"CODE108": self.code108_cb.isChecked(),
}
# Event codes
for code, cb in self.event_checkboxes.items():
config[code] = cb.isChecked()
return config
@ -462,9 +493,16 @@ class RPGMakerTab(QWidget):
# Variable codes
self.code122_cb.setChecked(config.get("CODE122", False))
# Event codes
for code, cb in self.event_checkboxes.items():
cb.setChecked(config.get(code, False))
# Plugins / Scripts / Other codes
self.code355655_cb.setChecked(config.get("CODE355655", False))
self.code357_cb.setChecked(config.get("CODE357", False))
self.code657_cb.setChecked(config.get("CODE657", False))
self.code356_cb.setChecked(config.get("CODE356", False))
self.code320_cb.setChecked(config.get("CODE320", False))
self.code324_cb.setChecked(config.get("CODE324", False))
self.code325_cb.setChecked(config.get("CODE325", False))
self.code111_cb.setChecked(config.get("CODE111", False))
self.code108_cb.setChecked(config.get("CODE108", False))
def load_from_file(self, file_path):
"""Load configuration from file."""

View file

@ -53,28 +53,28 @@ class WolfTab(QWidget):
def init_ui(self):
"""Initialize the user interface with compact two-column layout."""
main_layout = QVBoxLayout()
main_layout.setContentsMargins(10, 10, 10, 10)
main_layout.setContentsMargins(15, 15, 15, 15)
main_layout.setSpacing(10)
# Title and description
title = QLabel("Wolf RPG Editor Translation Settings")
title.setStyleSheet("font-size: 14px; font-weight: bold; color: #007acc;")
title.setStyleSheet("font-size: 15px; font-weight: bold; color: #007acc;")
main_layout.addWidget(title)
description = QLabel(
"Enable translation options for Wolf RPG Editor projects. Only enable what you need."
)
description.setWordWrap(True)
description.setStyleSheet("color: #888888; font-size: 11px; margin-bottom: 5px;")
description.setStyleSheet("color: #888888; font-size: 10px; margin-bottom: 5px;")
main_layout.addWidget(description)
# Two-column layout for checkboxes
columns_layout = QHBoxLayout()
columns_layout.setSpacing(30)
columns_layout.setSpacing(40)
# LEFT COLUMN
left_column = QVBoxLayout()
left_column.setSpacing(3)
left_column.setSpacing(5)
# Dialogue & Choices
left_column.addWidget(create_section_label("💬 Dialogue & Choices"))
@ -86,7 +86,7 @@ class WolfTab(QWidget):
self.code102_cb.setToolTip("Enable translation of choice options")
left_column.addWidget(self.code102_cb)
left_column.addSpacing(8)
left_column.addSpacing(15)
# Pictures & Variables
left_column.addWidget(create_section_label("🖼️ Pictures & Variables"))
@ -98,7 +98,7 @@ class WolfTab(QWidget):
self.code122_cb.setToolTip("Enable translation of string variables")
left_column.addWidget(self.code122_cb)
left_column.addSpacing(8)
left_column.addSpacing(15)
# Other Event Codes
left_column.addWidget(create_section_label("🎮 Other Event Codes"))
@ -115,15 +115,16 @@ class WolfTab(QWidget):
# RIGHT COLUMN
right_column = QVBoxLayout()
right_column.setSpacing(3)
right_column.setSpacing(5)
# Database Sections
right_column.addWidget(create_section_label("📚 Database Sections"))
# Database flags in compact 2-column grid
db_grid = QGridLayout()
db_grid.setSpacing(2)
db_grid.setHorizontalSpacing(10)
db_grid.setSpacing(5)
db_grid.setHorizontalSpacing(25)
db_grid.setVerticalSpacing(6)
database_flags = [
("SCENARIOFLAG", "Scenario Text"),
@ -142,7 +143,6 @@ class WolfTab(QWidget):
self.db_checkboxes = {}
for idx, (key, label) in enumerate(database_flags):
cb = QCheckBox(label)
cb.setStyleSheet("QCheckBox { font-size: 10px; }")
db_grid.addWidget(cb, idx // 2, idx % 2)
self.db_checkboxes[key] = cb
@ -155,16 +155,20 @@ class WolfTab(QWidget):
main_layout.addLayout(columns_layout)
# Bottom buttons
main_layout.addSpacing(12)
button_layout = QHBoxLayout()
button_layout.setSpacing(10)
self.reset_btn = QPushButton("🔄 Reset to Defaults")
self.reset_btn.clicked.connect(self.reset_to_defaults_with_message)
self.reset_btn.setMaximumWidth(200)
self.reset_btn.setMaximumWidth(180)
self.reset_btn.setMinimumHeight(32)
self.apply_btn = QPushButton("✓ Apply Settings")
self.apply_btn.clicked.connect(lambda: self.apply_to_module(True))
self.apply_btn.setMaximumWidth(200)
self.apply_btn.setMaximumWidth(180)
self.apply_btn.setMinimumHeight(32)
self.apply_btn.setStyleSheet("font-weight: bold;")
button_layout.addWidget(self.reset_btn)
button_layout.addWidget(self.apply_btn)

View file

@ -104,7 +104,7 @@ CODE408 = False
# Variables
CODE122 = False
# Other
# Plugins / Scripts
CODE355655 = False
CODE357 = False
CODE657 = False