|
62 | 62 | from ..backends.validator import BadPatternManager, validate_all |
63 | 63 | from ..utils.config import load_config, save_config |
64 | 64 | from .patterns_dialog import PatternsDialog |
| 65 | +from .settings_dialog import SettingsDialog |
65 | 66 | from .patterns_panel import PatternsPanel |
66 | 67 | from .highlighters import ( |
67 | 68 | create_disassembly_highlighter, |
@@ -183,12 +184,25 @@ def _is_null_pat(p) -> bool: |
183 | 184 | tb.addSeparator() |
184 | 185 | tb.addWidget(QLabel("Arch:")) |
185 | 186 | tb.addWidget(self.arch_combo) |
186 | | - tb.addSeparator() |
187 | 187 | # Labels are always allowed (block assembly mode enabled) |
188 | 188 | # Checkbox removed; always assemble with labels preserved. |
189 | 189 | tb.addSeparator() |
190 | 190 | tb.addAction(self.act_assemble) |
191 | 191 | tb.addAction(self.act_disassemble) |
| 192 | + # Push Settings button to the far right within the same title bar |
| 193 | + try: |
| 194 | + self._toolbar_right_spacer = QWidget() |
| 195 | + self._toolbar_right_spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) |
| 196 | + tb.addWidget(self._toolbar_right_spacer) |
| 197 | + except Exception: |
| 198 | + self._toolbar_right_spacer = None |
| 199 | + try: |
| 200 | + self.btn_settings = QPushButton("Settings") |
| 201 | + self.btn_settings.setToolTip("Open Settings") |
| 202 | + tb.addWidget(self.btn_settings) |
| 203 | + self.btn_settings.clicked.connect(self.on_open_settings) |
| 204 | + except Exception: |
| 205 | + self.btn_settings = None |
192 | 206 |
|
193 | 207 | # Central layout |
194 | 208 | splitter = QSplitter() |
@@ -372,6 +386,13 @@ def _copy_disasm(): |
372 | 386 | parent=self, |
373 | 387 | ) |
374 | 388 | self.output_tabs.addTab(self.optimize_widget, "Optimize") |
| 389 | + # Apply optimize defaults from config |
| 390 | + try: |
| 391 | + cfg = load_config() |
| 392 | + self.optimize_widget.chk_rule1.setChecked(bool(cfg.get("opt_rule_push_zero", True))) |
| 393 | + self.optimize_widget.chk_rule2.setChecked(bool(cfg.get("opt_rule_mov_imm8", True))) |
| 394 | + except Exception: |
| 395 | + pass |
375 | 396 |
|
376 | 397 | # Formats view (Shellcode output pane) |
377 | 398 | fmt_widget = QWidget() |
@@ -411,6 +432,14 @@ def _copy_disasm(): |
411 | 432 | self.hll_lang_combo.addItems(["C", "Python", "Zig", "Rust", "Go"]) # supported generators |
412 | 433 | except Exception: |
413 | 434 | pass |
| 435 | + # Load default HLL language from config |
| 436 | + try: |
| 437 | + cfg = load_config() |
| 438 | + def_lang = (cfg.get("default_hll_lang") or "C") |
| 439 | + idx = max(0, self.hll_lang_combo.findText(def_lang)) |
| 440 | + self.hll_lang_combo.setCurrentIndex(idx) |
| 441 | + except Exception: |
| 442 | + pass |
414 | 443 | try: |
415 | 444 | # Prevent Enter/Return from leaking to the Assembly editor when changing selection |
416 | 445 | self.hll_lang_combo.installEventFilter(self) |
@@ -521,6 +550,14 @@ def _insert_snippet(snippet: str) -> None: |
521 | 550 | parent=self, |
522 | 551 | ) |
523 | 552 | self.output_tabs.addTab(self.syscalls_widget, "Syscalls") |
| 553 | + # Apply Syscalls default style from config |
| 554 | + try: |
| 555 | + cfg = load_config() |
| 556 | + def_style = (cfg.get("syscalls_style_default") or "Commented") |
| 557 | + idx = max(0, self.syscalls_widget.style_combo.findText(def_style)) |
| 558 | + self.syscalls_widget.style_combo.setCurrentIndex(idx) |
| 559 | + except Exception: |
| 560 | + pass |
524 | 561 | # Now that Syscalls tab exists, sync Shellcode pane and editors padding to match it |
525 | 562 | try: |
526 | 563 | self._sync_shellcode_padding_to_syscalls() |
@@ -565,6 +602,15 @@ def _insert_asm_text(s: str) -> None: |
565 | 602 | parent=self, |
566 | 603 | ) |
567 | 604 | self.output_tabs.addTab(self.shellstorm_widget, "Shell-Storm") |
| 605 | + # Apply Shell-Storm default preview language |
| 606 | + try: |
| 607 | + cfg = load_config() |
| 608 | + def_ss_lang = (cfg.get("shellstorm_default_lang") or "C") |
| 609 | + if getattr(self.shellstorm_widget, 'lang_combo', None) is not None: |
| 610 | + idx = max(0, self.shellstorm_widget.lang_combo.findText(def_ss_lang)) |
| 611 | + self.shellstorm_widget.lang_combo.setCurrentIndex(idx) |
| 612 | + except Exception: |
| 613 | + pass |
568 | 614 |
|
569 | 615 | # Validation tab (container with a button bar and text) |
570 | 616 | val_container = QWidget() |
@@ -2180,3 +2226,61 @@ def closeEvent(self, event): |
2180 | 2226 | cfg["bad_patterns"] = self.bpm.serialize() |
2181 | 2227 | save_config(cfg) |
2182 | 2228 | super().closeEvent(event) |
| 2229 | + |
| 2230 | + def on_open_settings(self): |
| 2231 | + """Open Settings dialog and apply changes live on accept.""" |
| 2232 | + try: |
| 2233 | + dlg = SettingsDialog(self) |
| 2234 | + except Exception: |
| 2235 | + return |
| 2236 | + try: |
| 2237 | + res = dlg.exec() |
| 2238 | + except Exception: |
| 2239 | + res = dlg.exec_() |
| 2240 | + if not res: |
| 2241 | + return |
| 2242 | + vals = dlg.values() |
| 2243 | + # Apply: Bad-chars highlight only if value provided |
| 2244 | + if "bad_highlight_enabled" in vals: |
| 2245 | + try: |
| 2246 | + self.on_badchars_toggled(bool(vals.get("bad_highlight_enabled"))) |
| 2247 | + if hasattr(self, 'patterns_widget') and hasattr(self.patterns_widget, 'chk_enabled'): |
| 2248 | + self.patterns_widget.chk_enabled.setChecked(bool(vals.get("bad_highlight_enabled"))) |
| 2249 | + except Exception: |
| 2250 | + pass |
| 2251 | + # Apply: Optimize rules (present in Settings) |
| 2252 | + try: |
| 2253 | + if "opt_rule_push_zero" in vals: |
| 2254 | + self.optimize_widget.chk_rule1.setChecked(bool(vals.get("opt_rule_push_zero"))) |
| 2255 | + if "opt_rule_mov_imm8" in vals: |
| 2256 | + self.optimize_widget.chk_rule2.setChecked(bool(vals.get("opt_rule_mov_imm8"))) |
| 2257 | + self.optimize_widget.on_preview() |
| 2258 | + except Exception: |
| 2259 | + pass |
| 2260 | + # Apply: Formats default language only if present |
| 2261 | + if "default_hll_lang" in vals: |
| 2262 | + try: |
| 2263 | + def_lang = vals.get("default_hll_lang") |
| 2264 | + if def_lang: |
| 2265 | + idx = max(0, self.hll_lang_combo.findText(def_lang)) |
| 2266 | + self.hll_lang_combo.setCurrentIndex(idx) |
| 2267 | + except Exception: |
| 2268 | + pass |
| 2269 | + # Apply: Syscalls snippet style (present in Settings) |
| 2270 | + try: |
| 2271 | + if "syscalls_style_default" in vals: |
| 2272 | + def_style = vals.get("syscalls_style_default") |
| 2273 | + if def_style: |
| 2274 | + idx = max(0, self.syscalls_widget.style_combo.findText(def_style)) |
| 2275 | + self.syscalls_widget.style_combo.setCurrentIndex(idx) |
| 2276 | + except Exception: |
| 2277 | + pass |
| 2278 | + # Apply: Shell-Storm preview syntax only if present |
| 2279 | + if "shellstorm_default_lang" in vals: |
| 2280 | + try: |
| 2281 | + def_ss = vals.get("shellstorm_default_lang") |
| 2282 | + if def_ss and getattr(self.shellstorm_widget, 'lang_combo', None) is not None: |
| 2283 | + idx = max(0, self.shellstorm_widget.lang_combo.findText(def_ss)) |
| 2284 | + self.shellstorm_widget.lang_combo.setCurrentIndex(idx) |
| 2285 | + except Exception: |
| 2286 | + pass |
0 commit comments