feat: standalone extractor - theme toggle and UI improvements

Changes:
- Removed "Include ALL version folders" checkbox (redundant with dropdown)
- Adjusted splitter sizes: left panel 420px, right panel 400px
  (Available Icons list now takes less space)
- Added Light/Dark theme toggle button in header
  - ☀️ Light / 🌙 Dark modes
  - Toggle switches between themes
  - Dark theme is default

Theme support:
- _toggle_theme() method switches between modes
- _apply_dark_theme() - dark color scheme
- _apply_light_theme() - light color scheme

Code cleanup:
- Removed _on_all_subfolders_changed() method
- Simplified _refresh_file_list() logic
This commit is contained in:
LemonNexus 2026-02-11 18:55:48 +00:00
parent f1349fe366
commit ed98f073c7
1 changed files with 172 additions and 20 deletions

View File

@ -327,6 +327,15 @@ class IconExtractorWindow(QMainWindow):
header = QLabel("Entropia Universe Icon Extractor")
header.setStyleSheet("font-size: 22px; font-weight: bold; color: #4caf50;")
header_layout.addWidget(header, 1)
# Theme toggle button
self.theme_btn = QPushButton("☀️ Light")
self.theme_btn.setMaximumWidth(80)
self.theme_btn.setStyleSheet("font-size: 11px; padding: 5px;")
self.theme_btn.setCheckable(True)
self.theme_btn.clicked.connect(self._toggle_theme)
header_layout.addWidget(self.theme_btn)
header_layout.addStretch()
layout.addLayout(header_layout)
@ -408,13 +417,6 @@ class IconExtractorWindow(QMainWindow):
cache_layout.addLayout(subfolder_layout)
# All subfolders checkbox
self.all_subfolders_check = QCheckBox("☑️ Include ALL version folders")
self.all_subfolders_check.setStyleSheet("font-size: 12px;")
self.all_subfolders_check.setToolTip("Merge icons from all game versions")
self.all_subfolders_check.stateChanged.connect(self._on_all_subfolders_changed)
cache_layout.addWidget(self.all_subfolders_check)
left_layout.addWidget(cache_group)
# Output folder
@ -564,7 +566,7 @@ class IconExtractorWindow(QMainWindow):
right_layout.addWidget(files_group)
splitter.addWidget(right_panel)
splitter.setSizes([360, 560])
splitter.setSizes([420, 400])
layout.addWidget(splitter, 1)
@ -687,6 +689,164 @@ class IconExtractorWindow(QMainWindow):
self.header_icon.hide()
return False
def _toggle_theme(self):
"""Toggle between light and dark theme."""
if self.theme_btn.isChecked():
self._apply_light_theme()
self.theme_btn.setText("🌙 Dark")
else:
self._apply_dark_theme()
self.theme_btn.setText("☀️ Light")
def _apply_dark_theme(self):
"""Apply dark theme."""
self.setStyleSheet("""
QMainWindow, QDialog {
background-color: #1e1e1e;
}
QWidget {
background-color: #1e1e1e;
color: #e0e0e0;
}
QGroupBox {
font-weight: bold;
border: 1px solid #404040;
border-radius: 6px;
margin-top: 12px;
padding-top: 12px;
}
QGroupBox::title {
subcontrol-origin: margin;
left: 12px;
padding: 0 8px;
}
QPushButton {
background-color: #3d3d3d;
border: 1px solid #555;
padding: 6px 12px;
border-radius: 4px;
font-size: 12px;
}
QPushButton:hover {
background-color: #4d4d4d;
}
QComboBox {
background-color: #2d2d2d;
border: 1px solid #555;
padding: 5px;
border-radius: 4px;
}
QListWidget {
background-color: #252525;
border: 1px solid #404040;
border-radius: 4px;
}
QListWidget::item {
padding: 6px;
}
QListWidget::item:selected {
background-color: #1565c0;
}
QListWidget::item:hover {
background-color: #2a4d6e;
}
QProgressBar {
border: 1px solid #404040;
border-radius: 4px;
text-align: center;
}
QProgressBar::chunk {
background-color: #4caf50;
}
QTextEdit {
background-color: #252525;
border: 1px solid #404040;
}
QCheckBox {
font-size: 12px;
}
QLabel {
font-size: 12px;
}
""")
def _apply_light_theme(self):
"""Apply light theme."""
self.setStyleSheet("""
QMainWindow, QDialog {
background-color: #f5f5f5;
}
QWidget {
background-color: #f5f5f5;
color: #333333;
}
QGroupBox {
font-weight: bold;
border: 1px solid #cccccc;
border-radius: 6px;
margin-top: 12px;
padding-top: 12px;
}
QGroupBox::title {
subcontrol-origin: margin;
left: 12px;
padding: 0 8px;
}
QPushButton {
background-color: #e0e0e0;
border: 1px solid #bbbbbb;
padding: 6px 12px;
border-radius: 4px;
font-size: 12px;
color: #333333;
}
QPushButton:hover {
background-color: #d0d0d0;
}
QComboBox {
background-color: #ffffff;
border: 1px solid #bbbbbb;
padding: 5px;
border-radius: 4px;
color: #333333;
}
QListWidget {
background-color: #ffffff;
border: 1px solid #cccccc;
border-radius: 4px;
}
QListWidget::item {
padding: 6px;
color: #333333;
}
QListWidget::item:selected {
background-color: #1976d2;
color: #ffffff;
}
QListWidget::item:hover {
background-color: #e3f2fd;
}
QProgressBar {
border: 1px solid #cccccc;
border-radius: 4px;
text-align: center;
}
QProgressBar::chunk {
background-color: #4caf50;
}
QTextEdit {
background-color: #ffffff;
border: 1px solid #cccccc;
color: #333333;
}
QCheckBox {
font-size: 12px;
}
QLabel {
font-size: 12px;
}
""")
def _load_settings(self):
"""Load saved settings."""
# Output folder
@ -743,11 +903,6 @@ class IconExtractorWindow(QMainWindow):
"""Handle subfolder selection change."""
self._refresh_file_list()
def _on_all_subfolders_changed(self):
"""Handle 'all subfolders' checkbox change."""
self.subfolder_combo.setEnabled(not self.all_subfolders_check.isChecked())
self._refresh_file_list()
def _browse_output(self):
"""Browse for output folder."""
folder = QFileDialog.getExistingDirectory(
@ -770,16 +925,13 @@ class IconExtractorWindow(QMainWindow):
if not self.base_cache_path.exists():
return
# Determine which folders to scan
if self.all_subfolders_check.isChecked():
# Determine which folders to scan based on dropdown selection
path_data = self.subfolder_combo.currentData()
if path_data == "all" or path_data is None:
# Scan all subfolders
folders_to_scan = [d for d in self.base_cache_path.iterdir() if d.is_dir()]
else:
# Scan selected subfolder
path_data = self.subfolder_combo.currentData()
if path_data == "all" or path_data is None:
folders_to_scan = [d for d in self.base_cache_path.iterdir() if d.is_dir()]
else:
folders_to_scan = [Path(path_data)]
# Collect TGA files