diff --git a/gui/workflow_tab.py b/gui/workflow_tab.py index 2f5dba1..59d1bd0 100644 --- a/gui/workflow_tab.py +++ b/gui/workflow_tab.py @@ -351,8 +351,9 @@ class _JsFormatWorker(QThread): def _make_section_label(text: str) -> QLabel: lbl = QLabel(text) lbl.setStyleSheet( - "font-size: 13px; font-weight: bold; color: #007acc;" - "padding: 8px 0px 5px 0px; background-color: transparent;" + "font-size: 14px; font-weight: bold; color: #e0e0e0;" + "padding: 7px 0px 6px 10px; background-color: transparent;" + "border-left: 3px solid #007acc; margin-top: 6px;" ) return lbl @@ -360,8 +361,8 @@ def _make_section_label(text: str) -> QLabel: def _make_hr() -> QFrame: hr = QFrame() hr.setFrameShape(QFrame.HLine) - hr.setFrameShadow(QFrame.Sunken) - hr.setStyleSheet("QFrame { color: #555555; margin: 5px 0px; }") + hr.setFrameShadow(QFrame.Plain) + hr.setStyleSheet("QFrame { color: #333333; margin: 10px 0px 4px 0px; }") return hr @@ -388,7 +389,7 @@ def _make_btn(text: str, color: str = "#007acc") -> QPushButton: f"QPushButton{{background-color:#2d2d30;color:#cccccc;" f"border:1px solid #555555;{_PAD}" f"border-radius:4px;font-size:12px;font-weight:bold;" - f"font-family:'Segoe UI Emoji','Segoe UI','Apple Color Emoji',sans-serif;}}" + f"font-family:'Segoe UI','Segoe UI Emoji','Apple Color Emoji',sans-serif;}}" f"QPushButton:hover{{background-color:#3e3e42;}}" f"QPushButton:pressed{{background-color:#007acc;color:white;}}" f"QPushButton:disabled{{background-color:#404040;color:#666666;border-color:#444444;}}" @@ -408,7 +409,7 @@ def _make_btn(text: str, color: str = "#007acc") -> QPushButton: btn.setStyleSheet( f"QPushButton{{background-color:{color};color:white;border:none;" f"{_PAD}border-radius:4px;font-size:12px;font-weight:bold;" - f"font-family:'Segoe UI Emoji','Segoe UI','Apple Color Emoji',sans-serif;}}" + f"font-family:'Segoe UI','Segoe UI Emoji','Apple Color Emoji',sans-serif;}}" f"QPushButton:hover{{background-color:{hover_color};}}" f"QPushButton:pressed{{background-color:{press_color};}}" f"QPushButton:disabled{{background-color:#404040;color:#666666;}}" @@ -424,7 +425,7 @@ def _make_toggle_btn(text: str) -> QPushButton: "QPushButton{background-color:#2d2d30;color:#aaaaaa;" "border:1px solid #555555;padding:4px 12px;" "border-radius:4px;font-size:12px;" - "font-family:'Segoe UI Emoji','Segoe UI','Apple Color Emoji',sans-serif;}" + "font-family:'Segoe UI','Segoe UI Emoji','Apple Color Emoji',sans-serif;}" "QPushButton:hover{background-color:#3e3e42;color:#cccccc;}" "QPushButton:checked{background-color:#1a3a5a;color:#7ab8d4;border-color:#2a6a9a;}" "QPushButton:checked:hover{background-color:#1e4268;}" @@ -467,17 +468,23 @@ class WorkflowTab(QWidget): # Splitter: left=steps, right=log splitter = QSplitter(Qt.Horizontal) - splitter.setHandleWidth(2) - splitter.setStyleSheet("QSplitter::handle{background:#555555;}") + splitter.setHandleWidth(1) + splitter.setStyleSheet("QSplitter::handle{background:#3a3a3a;}") # ---- Left: scrollable step panels ---- scroll = QScrollArea() scroll.setWidgetResizable(True) - scroll.setStyleSheet("QScrollArea{border:none;}") + scroll.setStyleSheet( + "QScrollArea{border:none;background-color:#1e1e1e;}" + "QScrollBar:vertical{background:#252526;width:10px;border:none;}" + "QScrollBar::handle:vertical{background:#555555;border-radius:5px;min-height:20px;}" + "QScrollBar::handle:vertical:hover{background:#007acc;}" + "QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical{height:0;}" + ) container = QWidget() vbox = QVBoxLayout(container) - vbox.setContentsMargins(18, 14, 18, 14) - vbox.setSpacing(4) + vbox.setContentsMargins(20, 16, 20, 16) + vbox.setSpacing(2) self._build_step0(vbox) vbox.addWidget(_make_hr()) @@ -503,10 +510,11 @@ class WorkflowTab(QWidget): lp_layout.setContentsMargins(0, 0, 0, 0) lp_layout.setSpacing(0) - log_header = QLabel(" Log") + log_header = QLabel(" ▸ Workflow Log") log_header.setStyleSheet( - "background-color:#2d2d30;color:#cccccc;font-size:11px;font-weight:bold;" - "padding:6px 8px;border-bottom:1px solid #555555;" + "background-color:#252526;color:#9d9d9d;font-size:11px;font-weight:bold;" + "padding:7px 10px;border-bottom:1px solid #3a3a3a;" + "letter-spacing:0.5px;" ) lp_layout.addWidget(log_header) @@ -514,12 +522,21 @@ class WorkflowTab(QWidget): self.log_area.setReadOnly(True) self.log_area.setFont(QFont("Consolas", 9)) self.log_area.setStyleSheet( - "QTextEdit{background-color:#252526;color:#d4d4d4;" - "border:none;padding:8px;}" + "QTextEdit{background-color:#1e1e1e;color:#c8c8c8;" + "border:none;padding:10px;" + "selection-background-color:#264f78;}" ) lp_layout.addWidget(self.log_area) - clear_btn = _make_btn("Clear Log", "#444") + clear_btn = _make_btn("Clear Log", "#3a3a3a") + clear_btn.setStyleSheet( + "QPushButton{background-color:#252526;color:#6a6a6a;" + "border:none;border-top:1px solid #3a3a3a;" + "padding:5px 12px;font-size:11px;font-weight:normal;" + "font-family:'Segoe UI','Arial',sans-serif;}" + "QPushButton:hover{background-color:#2d2d30;color:#9d9d9d;}" + "QPushButton:pressed{color:#cccccc;}" + ) clear_btn.clicked.connect(self.log_area.clear) lp_layout.addWidget(clear_btn) @@ -528,11 +545,77 @@ class WorkflowTab(QWidget): root.addWidget(splitter) self.setLayout(root) + self._apply_theme() # Auto-detect on first start if a folder was previously saved if self._setting("last_game_folder", ""): QTimer.singleShot(100, self._detect_folder) + def _apply_theme(self): + """Apply a unified dark-theme stylesheet to all standard controls.""" + self.setStyleSheet(""" + QLineEdit { + background-color: #3c3c3c; + border: 1px solid #555555; + border-radius: 4px; + padding: 4px 8px; + color: #cccccc; + font-size: 13px; + } + QLineEdit:focus { + border-color: #007acc; + } + QLineEdit:disabled { + background-color: #2d2d30; + color: #666666; + } + QLineEdit::placeholder { + color: #606060; + } + QSpinBox { + background-color: #3c3c3c; + border: 1px solid #555555; + border-radius: 4px; + padding: 3px 6px; + color: #cccccc; + font-size: 13px; + } + QSpinBox:focus { + border-color: #007acc; + } + QSpinBox::up-button, QSpinBox::down-button { + background-color: #2d2d30; + border: none; + width: 18px; + } + QSpinBox::up-button:hover, QSpinBox::down-button:hover { + background-color: #007acc; + } + QCheckBox { + color: #cccccc; + font-size: 13px; + spacing: 7px; + } + QCheckBox::indicator { + width: 14px; + height: 14px; + border: 1px solid #555555; + border-radius: 3px; + background-color: #3c3c3c; + } + QCheckBox::indicator:checked { + background-color: #007acc; + border-color: #007acc; + } + QCheckBox::indicator:hover { + border-color: #007acc; + } + QCheckBox::indicator:disabled { + background-color: #2d2d30; + border-color: #444444; + } + """) + # ── Step 0: Project Folder ────────────────────────────────────────────── def _build_step0(self, layout: QVBoxLayout): @@ -557,16 +640,23 @@ class WorkflowTab(QWidget): # Detected info self.detected_label = QLabel("No folder detected yet.") - self.detected_label.setStyleSheet("color:#888;font-size:13px;padding:2px 0;") + self.detected_label.setStyleSheet( + "color:#6a9a6a;font-size:13px;padding:4px 8px;" + "background-color:#1f2b1f;border:1px solid #2a4a2a;" + "border-radius:4px;margin:4px 0;" + ) layout.addWidget(self.detected_label) # File list self.file_list = QListWidget() self.file_list.setMaximumHeight(180) self.file_list.setStyleSheet( - "QListWidget{outline:none;border:1px solid #555555;}" - "QListWidget::item{border:none;outline:none;}" - "QListWidget::item:hover{background-color:#3e3e42;}" + "QListWidget{outline:none;border:1px solid #3c3c3c;" + "background-color:#252526;border-radius:4px;}" + "QListWidget::item{border:none;outline:none;padding:2px 6px;" + "color:#c8c8c8;}" + "QListWidget::item:hover{background-color:#2d2d30;" + "border-left:2px solid #007acc;}" ) layout.addWidget(self.file_list) @@ -1046,10 +1136,11 @@ class WorkflowTab(QWidget): def _build_step1_preprocess(self, layout: QVBoxLayout): header_row = QHBoxLayout() header_row.addWidget(_make_section_label("Step 1 (Optional) — Pre-process")) - opt_badge = QLabel("personal / optional") + opt_badge = QLabel("optional") opt_badge.setStyleSheet( - "color:#888;font-size:12px;border:1px solid #555;" - "padding:1px 6px;border-radius:8px;margin-left:6px;" + "color:#7a7a7a;font-size:11px;border:1px solid #3c3c3c;" + "padding:1px 8px;border-radius:8px;margin-left:8px;" + "background-color:#252526;" ) header_row.addWidget(opt_badge) header_row.addStretch() @@ -1076,11 +1167,11 @@ class WorkflowTab(QWidget): "importing files. Paths are auto-filled when a project folder is detected." ) hint.setWordWrap(True) - hint.setStyleSheet("color:#999;font-size:13px;padding-bottom:6px;") + hint.setStyleSheet("color:#9d9d9d;font-size:13px;padding-bottom:6px;") collapse_layout.addWidget(hint) tasks_box = QGroupBox() - tasks_box.setStyleSheet("QGroupBox{border:none;margin:0;padding:0;}") + tasks_box.setStyleSheet("QGroupBox{border:none;margin:0;padding:4px 0;}") tb = QVBoxLayout(tasks_box) tb.setSpacing(10) collapse_layout.addWidget(tasks_box) @@ -1097,16 +1188,16 @@ class WorkflowTab(QWidget): ) ta_desc.setTextFormat(Qt.RichText) ta_desc.setWordWrap(True) - ta_desc.setStyleSheet("color:#aaa;font-size:13px;") + ta_desc.setStyleSheet("color:#9d9d9d;font-size:13px;") ta_inner.addWidget(ta_desc) ta_path_row = QHBoxLayout() ta_path_row.addWidget(QLabel("Data folder:")) self.pp_data_path_label = QLabel("(detect a project folder first)") - self.pp_data_path_label.setStyleSheet("color:#888;font-size:13px;") + self.pp_data_path_label.setStyleSheet("color:#7a7a7a;font-size:13px;") ta_path_row.addWidget(self.pp_data_path_label, 1) ta_inner.addLayout(ta_path_row) ta_btn_row = QHBoxLayout() - run_dazed = _make_btn("▶ Run dazedformat", "#555") + run_dazed = _make_btn("► Run dazedformat", "#555") run_dazed.clicked.connect(self._run_dazedformat) ta_btn_row.addWidget(run_dazed) ta_btn_row.addStretch() @@ -1124,7 +1215,7 @@ class WorkflowTab(QWidget): ) tb_desc.setTextFormat(Qt.RichText) tb_desc.setWordWrap(True) - tb_desc.setStyleSheet("color:#aaa;font-size:13px;") + tb_desc.setStyleSheet("color:#9d9d9d;font-size:13px;") tb_inner.addWidget(tb_desc) tb_path_row = QHBoxLayout() tb_path_lbl = QLabel("plugins.js:") @@ -1139,7 +1230,7 @@ class WorkflowTab(QWidget): tb_path_row.addWidget(browse_plugins) tb_inner.addLayout(tb_path_row) tb_btn_row = QHBoxLayout() - run_prettier = _make_btn("▶ Format plugins.js", "#555") + run_prettier = _make_btn("► Format plugins.js", "#555") run_prettier.clicked.connect(self._run_prettier) tb_btn_row.addWidget(run_prettier) tb_btn_row.addStretch() @@ -1157,7 +1248,7 @@ class WorkflowTab(QWidget): ) tc_desc.setTextFormat(Qt.RichText) tc_desc.setWordWrap(True) - tc_desc.setStyleSheet("color:#aaa;font-size:13px;") + tc_desc.setStyleSheet("color:#9d9d9d;font-size:13px;") tc_inner.addWidget(tc_desc) tc_src_row = QHBoxLayout() @@ -1175,16 +1266,16 @@ class WorkflowTab(QWidget): tc_dst_row = QHBoxLayout() tc_dst_row.addWidget(QLabel("Destination:")) self.pp_gameupdate_dst_label = QLabel("(game root folder auto-filled from project)") - self.pp_gameupdate_dst_label.setStyleSheet("color:#888;font-size:13px;") + self.pp_gameupdate_dst_label.setStyleSheet("color:#7a7a7a;font-size:13px;") tc_dst_row.addWidget(self.pp_gameupdate_dst_label, 1) tc_inner.addLayout(tc_dst_row) tc_btn_row = QHBoxLayout() - run_gu = _make_btn("▶ Copy gameupdate/", "#555") + run_gu = _make_btn("► Copy gameupdate/", "#555") run_gu.clicked.connect(self._run_gameupdate) tc_btn_row.addWidget(run_gu) tc_btn_row.addStretch() - run_all_btn = _make_btn("▶▶ Run All 3 Tasks", "#007acc") + run_all_btn = _make_btn("►► Run All 3 Tasks", "#007acc") run_all_btn.setToolTip("Run dazedformat, prettier, and gameupdate copy in sequence") run_all_btn.clicked.connect(self._run_all_preprocess) tc_btn_row.addWidget(run_all_btn) @@ -1194,28 +1285,46 @@ class WorkflowTab(QWidget): layout.addWidget(collapse_widget) def _toggle_preprocess(expanded: bool): - toggle_btn.setText("▼" if expanded else "▶") + toggle_btn.setText("▼" if expanded else "►") collapse_widget.setVisible(expanded) toggle_btn.toggled.connect(_toggle_preprocess) @staticmethod def _task_box_style() -> str: return ( - "QGroupBox{border:none;margin-top:14px;padding-top:4px;}" - "QGroupBox::title{subcontrol-origin:margin;subcontrol-position:top left;" - "padding:0;color:#007acc;font-weight:bold;font-size:13px;" - "font-family:'Segoe UI Emoji','Segoe UI','Apple Color Emoji',sans-serif;}" + "QGroupBox{" + "border:1px solid #3c3c3c;" + "border-radius:6px;" + "background-color:#252526;" + "margin-top:18px;" + "padding:10px 10px 8px 10px;}" + "QGroupBox::title{" + "subcontrol-origin:margin;" + "subcontrol-position:top left;" + "left:12px;top:-1px;" + "padding:0 6px;" + "color:#4ec9b0;" + "font-weight:bold;font-size:13px;" + "font-family:'Segoe UI','Segoe UI Emoji','Apple Color Emoji',sans-serif;}" ) @staticmethod def _checkbox_box_style() -> str: """Bordered style for sections that contain scrollable checkbox lists.""" return ( - "QGroupBox{border:1px solid #3a3a3a;border-radius:4px;margin-top:10px;padding-top:4px;}" - "QGroupBox::title{subcontrol-origin:margin;subcontrol-position:top left;" - "left:8px;padding:0 4px;top:-1px;" - "background-color:#1e1e1e;color:#888888;font-size:12px;" - "font-family:'Segoe UI Emoji','Segoe UI','Apple Color Emoji',sans-serif;}" + "QGroupBox{" + "border:1px solid #3c3c3c;" + "border-radius:4px;" + "background-color:#252526;" + "margin-top:10px;" + "padding:8px 8px 6px 8px;}" + "QGroupBox::title{" + "subcontrol-origin:margin;" + "subcontrol-position:top left;" + "left:10px;top:-1px;" + "padding:0 4px;" + "color:#888888;font-size:12px;" + "font-family:'Segoe UI','Segoe UI Emoji','Apple Color Emoji',sans-serif;}" ) def _build_step3_glossary(self, layout: QVBoxLayout): @@ -1225,7 +1334,7 @@ class WorkflowTab(QWidget): "here are injected into every AI prompt for consistent terminology." ) hint.setWordWrap(True) - hint.setStyleSheet("color:#999;font-size:13px;padding-bottom:4px;") + hint.setStyleSheet("color:#9d9d9d;font-size:13px;padding-bottom:4px;") layout.addWidget(hint) # ---- Parse Speakers ------------------------------------------------- @@ -1242,7 +1351,7 @@ class WorkflowTab(QWidget): ) spk_hint.setTextFormat(Qt.RichText) spk_hint.setWordWrap(True) - spk_hint.setStyleSheet("color:#999;font-size:13px;") + spk_hint.setStyleSheet("color:#9d9d9d;font-size:13px;") spk_inner.addWidget(spk_hint) spk_btn_row = QHBoxLayout() @@ -1256,7 +1365,7 @@ class WorkflowTab(QWidget): spk_btn_row.addStretch() spk_inner.addLayout(spk_btn_row) self._parse_speakers_status = QLabel("") - self._parse_speakers_status.setStyleSheet("color:#aaa;font-size:13px;") + self._parse_speakers_status.setStyleSheet("color:#9d9d9d;font-size:13px;") spk_inner.addWidget(self._parse_speakers_status) layout.addWidget(spk_box) @@ -1274,7 +1383,7 @@ class WorkflowTab(QWidget): "and add worldbuilding terms. Paste the AI's output back into vocab.txt." ) prompt_hint.setWordWrap(True) - prompt_hint.setStyleSheet("color:#999;font-size:13px;") + prompt_hint.setStyleSheet("color:#9d9d9d;font-size:13px;") pb_inner.addWidget(prompt_hint) # Combined glossary prompt @@ -1307,8 +1416,9 @@ class WorkflowTab(QWidget): ) format_hint.setFont(QFont("Consolas", 9)) format_hint.setStyleSheet( - "color:#569cd6;border:1px solid #444444;" - "padding:5px 8px;border-radius:3px;font-size:13px;" + "color:#569cd6;background-color:#1a1e2a;border:1px solid #2a3a5a;" + "padding:7px 10px;border-radius:4px;font-size:13px;" + "border-left:3px solid #2a6a9a;" ) layout.addWidget(format_hint) @@ -1317,7 +1427,8 @@ class WorkflowTab(QWidget): self.vocab_editor.setFont(QFont("Consolas", 9)) self.vocab_editor.setStyleSheet( "QTextEdit{background-color:#252526;color:#d4d4d4;" - "border:1px solid #555555;padding:6px;}" + "border:1px solid #3c3c3c;border-radius:4px;padding:8px;" + "selection-background-color:#264f78;}" ) self._reload_vocab() layout.addWidget(self.vocab_editor) @@ -1363,7 +1474,7 @@ class WorkflowTab(QWidget): "speaker flags to enable. Then tick the matching boxes and click Apply." ) hint.setWordWrap(True) - hint.setStyleSheet("color:#999;font-size:13px;padding-bottom:6px;") + hint.setStyleSheet("color:#9d9d9d;font-size:13px;padding-bottom:6px;") layout.addWidget(hint) copy_row = QHBoxLayout() @@ -1413,7 +1524,7 @@ class WorkflowTab(QWidget): "Click Apply to write the values to .env." ) wrap_hint.setWordWrap(True) - wrap_hint.setStyleSheet("color:#999;font-size:13px;") + wrap_hint.setStyleSheet("color:#9d9d9d;font-size:13px;") wrap_inner.addWidget(wrap_hint) def _spin_pair(label_text: str, default: int): @@ -1457,11 +1568,11 @@ class WorkflowTab(QWidget): "Translates names, descriptions, and notes in the core database. " "Run this first before any event-code phases." ) - p0_desc.setStyleSheet("color:#999;font-size:13px;") + p0_desc.setStyleSheet("color:#9d9d9d;font-size:13px;") p0_desc.setWordWrap(True) p0_inner.addWidget(p0_desc) p0_row = QHBoxLayout() - self._run_p0_btn = _make_btn("▶ Run Phase 0", "#4a7a4a") + self._run_p0_btn = _make_btn("► Run Phase 0", "#4a7a4a") self._run_p0_btn.setToolTip( "Sets engine to RPG Maker MV/MZ, selects only DB files " "(Actors, Armors … etc.), all event codes OFF — then starts translation." @@ -1483,11 +1594,11 @@ class WorkflowTab(QWidget): "Clicking the button below applies these codes, then takes you to the Translation tab.\n" "While translating, watch the log — speaker lines should look like [Speaker]: Dialogue." ) - p1_desc.setStyleSheet("color:#999;font-size:13px;") + p1_desc.setStyleSheet("color:#9d9d9d;font-size:13px;") p1_desc.setWordWrap(True) p1_inner.addWidget(p1_desc) p1_row = QHBoxLayout() - self._run_p1_btn = _make_btn("▶ Run Phase 1", "#007acc") + self._run_p1_btn = _make_btn("► Run Phase 1", "#007acc") self._run_p1_btn.setToolTip("Applies Phase 1 code settings and starts translation") self._run_p1_btn.clicked.connect(lambda: self._run_phase(1)) p1_row.addWidget(self._run_p1_btn) @@ -1508,11 +1619,11 @@ class WorkflowTab(QWidget): "Run this before Phase 2 so that code 122 translated strings are automatically " "matched when those same strings appear in 111 comparisons." ) - p1b_desc.setStyleSheet("color:#999;font-size:13px;") + p1b_desc.setStyleSheet("color:#9d9d9d;font-size:13px;") p1b_desc.setWordWrap(True) p1b_inner.addWidget(p1b_desc) p1b_row = QHBoxLayout() - self._run_p1b_btn = _make_btn("▶ Run Phase 1b", "#2a5a7a") + self._run_p1b_btn = _make_btn("► Run Phase 1b", "#2a5a7a") self._run_p1b_btn.setToolTip("Applies Phase 1b code settings (111 only) and starts translation") self._run_p1b_btn.clicked.connect(lambda: self._run_phase("1b")) p1b_row.addWidget(self._run_p1b_btn) @@ -1531,7 +1642,7 @@ class WorkflowTab(QWidget): "Use the Plugin Prompt to audit the game first, then enable only the codes and " "plugins that contain visible text." ) - p2_desc.setStyleSheet("color:#999;font-size:13px;") + p2_desc.setStyleSheet("color:#9d9d9d;font-size:13px;") p2_desc.setWordWrap(True) p2_inner.addWidget(p2_desc) @@ -1736,7 +1847,7 @@ class WorkflowTab(QWidget): p2_inner.addLayout(apply_plugins_row) p2_row = QHBoxLayout() - self._run_p2_btn = _make_btn("▶ Run Phase 2", "#7a4a00") + self._run_p2_btn = _make_btn("► Run Phase 2", "#7a4a00") self._run_p2_btn.setFixedWidth(_P2_BTN_WIDTH) self._run_p2_btn.setToolTip( "Applies Phase 2 code settings (from the checkboxes above) and starts translation " @@ -1766,7 +1877,7 @@ class WorkflowTab(QWidget): "plugins.js, vocab.txt, and optionally System.json attached." ) hint.setWordWrap(True) - hint.setStyleSheet("color:#999;font-size:13px;padding-bottom:6px;") + hint.setStyleSheet("color:#9d9d9d;font-size:13px;padding-bottom:6px;") layout.addWidget(hint) _BTN_WIDTH = 300 @@ -1801,7 +1912,7 @@ class WorkflowTab(QWidget): "Copy translated files back into the game's data folder to patch the game in-place." ) hint.setWordWrap(True) - hint.setStyleSheet("color:#999;font-size:13px;padding-bottom:4px;") + hint.setStyleSheet("color:#9d9d9d;font-size:13px;padding-bottom:4px;") layout.addWidget(hint) _EXP_W = 280 @@ -1843,6 +1954,11 @@ class WorkflowTab(QWidget): self._save_setting("last_game_folder", folder) self.detected_label.setText("Scanning…") + self.detected_label.setStyleSheet( + "color:#9d9d9d;font-size:13px;padding:4px 8px;" + "background-color:#252526;border:1px solid #3c3c3c;" + "border-radius:4px;margin:4px 0;" + ) self.file_list.clear() self.import_btn.setEnabled(False) @@ -1851,6 +1967,11 @@ class WorkflowTab(QWidget): data_path, engine = find_data_folder(folder) except Exception as exc: self.detected_label.setText(f"Error: {exc}") + self.detected_label.setStyleSheet( + "color:#f48771;font-size:13px;padding:4px 8px;" + "background-color:#2b1a1a;border:1px solid #5a2a2a;" + "border-radius:4px;margin:4px 0;" + ) return if data_path is None: @@ -1858,6 +1979,11 @@ class WorkflowTab(QWidget): "⚠ No recognised data folder found. " "Make sure this is a valid RPGMaker game directory." ) + self.detected_label.setStyleSheet( + "color:#e9a12a;font-size:13px;padding:4px 8px;" + "background-color:#2b2010;border:1px solid #5a4010;" + "border-radius:4px;margin:4px 0;" + ) return self._data_path = str(data_path) @@ -1865,6 +1991,11 @@ class WorkflowTab(QWidget): self.detected_label.setText( f"Engine: {engine} · Data folder: {data_path}" ) + self.detected_label.setStyleSheet( + "color:#6a9a6a;font-size:13px;padding:4px 8px;" + "background-color:#1f2b1f;border:1px solid #2a4a2a;" + "border-radius:4px;margin:4px 0;" + ) self._log(f"Detected data folder: {data_path} (engine: {engine})") worker = _ScanWorker(self._data_path, self._engine) @@ -2792,7 +2923,7 @@ class WorkflowTab(QWidget): self._log("✅ All pre-process tasks finished.") return label, worker = remaining[0] - self._log(f"▶ {label} …") + self._log(f"► {label} …") worker.log.connect(self._log) def on_done(ok, msg, rest=remaining[1:]):