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:
parent
f1349fe366
commit
ed98f073c7
|
|
@ -327,6 +327,15 @@ class IconExtractorWindow(QMainWindow):
|
||||||
header = QLabel("Entropia Universe Icon Extractor")
|
header = QLabel("Entropia Universe Icon Extractor")
|
||||||
header.setStyleSheet("font-size: 22px; font-weight: bold; color: #4caf50;")
|
header.setStyleSheet("font-size: 22px; font-weight: bold; color: #4caf50;")
|
||||||
header_layout.addWidget(header, 1)
|
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()
|
header_layout.addStretch()
|
||||||
|
|
||||||
layout.addLayout(header_layout)
|
layout.addLayout(header_layout)
|
||||||
|
|
@ -408,13 +417,6 @@ class IconExtractorWindow(QMainWindow):
|
||||||
|
|
||||||
cache_layout.addLayout(subfolder_layout)
|
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)
|
left_layout.addWidget(cache_group)
|
||||||
|
|
||||||
# Output folder
|
# Output folder
|
||||||
|
|
@ -564,7 +566,7 @@ class IconExtractorWindow(QMainWindow):
|
||||||
right_layout.addWidget(files_group)
|
right_layout.addWidget(files_group)
|
||||||
|
|
||||||
splitter.addWidget(right_panel)
|
splitter.addWidget(right_panel)
|
||||||
splitter.setSizes([360, 560])
|
splitter.setSizes([420, 400])
|
||||||
|
|
||||||
layout.addWidget(splitter, 1)
|
layout.addWidget(splitter, 1)
|
||||||
|
|
||||||
|
|
@ -687,6 +689,164 @@ class IconExtractorWindow(QMainWindow):
|
||||||
self.header_icon.hide()
|
self.header_icon.hide()
|
||||||
return False
|
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):
|
def _load_settings(self):
|
||||||
"""Load saved settings."""
|
"""Load saved settings."""
|
||||||
# Output folder
|
# Output folder
|
||||||
|
|
@ -743,11 +903,6 @@ class IconExtractorWindow(QMainWindow):
|
||||||
"""Handle subfolder selection change."""
|
"""Handle subfolder selection change."""
|
||||||
self._refresh_file_list()
|
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):
|
def _browse_output(self):
|
||||||
"""Browse for output folder."""
|
"""Browse for output folder."""
|
||||||
folder = QFileDialog.getExistingDirectory(
|
folder = QFileDialog.getExistingDirectory(
|
||||||
|
|
@ -770,16 +925,13 @@ class IconExtractorWindow(QMainWindow):
|
||||||
if not self.base_cache_path.exists():
|
if not self.base_cache_path.exists():
|
||||||
return
|
return
|
||||||
|
|
||||||
# Determine which folders to scan
|
# Determine which folders to scan based on dropdown selection
|
||||||
if self.all_subfolders_check.isChecked():
|
path_data = self.subfolder_combo.currentData()
|
||||||
|
if path_data == "all" or path_data is None:
|
||||||
# Scan all subfolders
|
# Scan all subfolders
|
||||||
folders_to_scan = [d for d in self.base_cache_path.iterdir() if d.is_dir()]
|
folders_to_scan = [d for d in self.base_cache_path.iterdir() if d.is_dir()]
|
||||||
else:
|
else:
|
||||||
# Scan selected subfolder
|
# 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)]
|
folders_to_scan = [Path(path_data)]
|
||||||
|
|
||||||
# Collect TGA files
|
# Collect TGA files
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue