From 6b520a1bcc1fd4eb3ad2dcc8c93e2c6f8cf7224a Mon Sep 17 00:00:00 2001 From: HRiggs Date: Tue, 16 Sep 2025 15:10:13 -0400 Subject: [PATCH] Add Footer, Remove Mods, and Add Main Mod --- .gitignore | 54 +++++++++++++ .../steam_required_ids.cpython-310.pyc | Bin 6191 -> 0 bytes hrsys.png | Bin 0 -> 13161 bytes hrsys_logo.svg | 37 --------- sealoader_gui.py | 72 +++++++++++++++++- steam_required_ids.py | 6 +- 6 files changed, 126 insertions(+), 43 deletions(-) create mode 100644 .gitignore delete mode 100644 __pycache__/steam_required_ids.cpython-310.pyc create mode 100644 hrsys.png delete mode 100644 hrsys_logo.svg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..806d434 --- /dev/null +++ b/.gitignore @@ -0,0 +1,54 @@ +# Python bytecode +__pycache__/ +*.py[cod] +*$py.class + +# Virtual environments +.venv/ +venv/ +env/ +ENV/ +.conda/ +.python-version + +# Testing / type-check / tooling caches +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.pyre/ +.tox/ +.coverage +.coverage.* +.cache/ +nosetests.xml +coverage.xml +htmlcov/ + +# Build and packaging +build/ +dist/ +.eggs/ +*.egg-info/ +*.egg +pip-wheel-metadata/ +*.manifest +*.spec + +dist_upload/ +SeaLoader.exe +SeaLoader_Windows_x64.zip + +# Editors/IDE +.vscode/ +.idea/ +*.code-workspace + +# OS junk +.DS_Store +Thumbs.db + +# Local configuration +usersettings.ini + +# Logs +*.log diff --git a/__pycache__/steam_required_ids.cpython-310.pyc b/__pycache__/steam_required_ids.cpython-310.pyc deleted file mode 100644 index dd05ab8efbf827749f8c0308f06746b7f407eace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6191 zcmbVQ%X1vZd7qw{oqb~QAYOb(8abxPrN{-K2PIKYQiLd46vz-%!5UNE8f-VP1MKcB zx_b#?YgSPez1Zw=44tlv}T>0ch55AmpZW?9_gtZ4;@_^kl|`mr0$JK>C{;kI(4r`bzQO3Tvs+bp;RKx znX0y>Dl8qjBEqhY*1FB*xZCOFBL3dlyZn_(>NccUOFb!cSGMbr%i+&MD~IPJJnCOj zB$jfyMW;!udrXzMO|>l3Sno}Z_q(jmxPwtk{vcr+tn+eW?b+Pn?!L|4<5rvTOyAZ{ zVuRA*UgCiA!vwA4mi%Z?^Xze}?dZyGBQXqdpYdKJnIWke_`fqTb0~WP+W_ef(so+P1SS2fk*6vhxEm%mD&-P)U4zs zeRrDK>I%7&W>lvcX_=*=Y@~R!9_ci{c)u<>I*Qxr^vccKpDurL^H%NpoyE^;*RR%Y zFJ4>xN$M#P%6cQstV^)F;z?5d)H4F%a+EsumP+&Wu+1YLYLRAIp{_T+v*Zc9d{nu5 z>F%3V|5~K)E{pI+9C9J=DlNiRO^U57=-?Wmwnf*Vbg*s*ylx2Q`nv zWiA_YTxQ!jcFMNDcC8#6V zCSwF+L}3^x$LZAsii#^=p!PHsGgQn{L5v&}C(%kL2G-CDqjoLQq6L2a2;+)A*k(Ca zc*2*A{oih;^w(#MxzXHnH~{4wKlo`)(U`-_=ldu#c4Ybi(#f?=xm?WfB;E#a&9Bb)k*^$Pw&N z@lr>@+_M-BwU%kF9yXig45W|OL-~cAL+M_^Kng`yfi0Q?6?B_Xdo#!m8SpHRj@RR6 zQy5)R17$k+>{qdrA_jY4RS8d-xlkz=Y=crUd4{%f8@hE=Z%Q-+k71At10${BY}f8H z&A=*~bVoaTE=ReMftPR|z%wKc7+4`Mu;CG7xYdR3Y)vJZzNfPs?85umem3#Un+wcp zk0;)S%`@EN*#~w%m)JU&ri zRWom&RnfmWaCcAq;J}!N3QK(b5L>DDQ52ZxOhZ{oX<^L{DK7ass-d>F%cdQA``6=T zjLSE%#KTDxX;w!q5qEXnM(^N9mVc<+Z=nNQhXQl=pB*?uql!F-wxg{L_=E%=AYnZJ zz%}q@?*qD^;0_d`u=FVYEbc`x)d@BdFB4Iqpjv(+WDvz zu8Xo7PF+k4yum<_f8*j? z^RK@8`usw#yl~;iVY?g3oeK+ZzdfI_g^Cm8S0kw#B!ytK87hsr^#;C^)+hryyHeCh zx3EdY87Q5Q(7t*cZ$?7Nw;>*ioJebg(#kl?bWDbk61BBh*07}RLj8yfmCOK8Xp(%7 z3R0%jl|pr%)yKk`0B+YhILHQwjE}S(+qIeZC%b4v?Y#e)$dHmra)L+TgHV+o;~g)d z@ie9qq5?E1rh-3|Gf*Bv*BJtk#36_PaM(J-*#mgAioFD9;cSW>_
DDMEf5Ztxm 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 Vn;BAm(h7%VqphP&;Tq2q{|9>5#CiY# literal 0 HcmV?d00001 diff --git a/hrsys_logo.svg b/hrsys_logo.svg deleted file mode 100644 index 60d90e6..0000000 --- a/hrsys_logo.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - SYSTEMS - - - - - - - - \ No newline at end of file diff --git a/sealoader_gui.py b/sealoader_gui.py index 88ac14f..71f02c0 100644 --- a/sealoader_gui.py +++ b/sealoader_gui.py @@ -3,6 +3,7 @@ import os import shutil import sys import threading +import webbrowser from dataclasses import dataclass from pathlib import Path from typing import Dict, List, Tuple @@ -209,9 +210,23 @@ class SeaLoaderApp(tk.Tk): bottom.pack(fill=tk.X, padx=12, pady=(0, 12)) self.enable_btn = ttk.Button(bottom, text="Enable Matching Mods", command=self._on_enable) self.enable_btn.pack(side=tk.LEFT) + self.disable_all_btn = ttk.Button(bottom, text="Disable All Mods", command=self._on_disable_all) + self.disable_all_btn.pack(side=tk.LEFT, padx=(8, 0)) self.help_btn = ttk.Button(bottom, text="Help", command=self._on_help) self.help_btn.pack(side=tk.RIGHT) + # Footer attribution + footer = ttk.Frame(self, style="TFrame") + footer.pack(fill=tk.X, padx=12, pady=(0, 10)) + self._footer_icon = self._load_png_icon("hrsys.png", max_px=18) + if self._footer_icon is not None: + icon_lbl = ttk.Label(footer, image=self._footer_icon, style="TLabel") + icon_lbl.pack(side=tk.LEFT) + icon_lbl.bind("", lambda e: self._open_link("https://hudsonriggs.systems")) + link_lbl = ttk.Label(footer, text="Created by HudsonRiggs.Systems", style="TLabel", foreground=MUTED) + link_lbl.pack(side=tk.LEFT, padx=(6, 0)) + link_lbl.bind("", lambda e: self._open_link("https://hudsonriggs.systems")) + def _create_tree(self, parent, columns: List[str], ratios: List[float]): tree = ttk.Treeview(parent, columns=columns, show="headings", height=12) for col in columns: @@ -219,12 +234,10 @@ class SeaLoaderApp(tk.Tk): tree.column(col, width=50, anchor=tk.W, stretch=True) vsb = ttk.Scrollbar(parent, orient="vertical", command=tree.yview) - hsb = ttk.Scrollbar(parent, orient="horizontal", command=tree.xview) - tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set) + tree.configure(yscrollcommand=vsb.set) tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) vsb.pack(side=tk.LEFT, fill=tk.Y) - hsb.pack(side=tk.BOTTOM, fill=tk.X) self._bind_auto_columns(parent, tree, ratios) return tree @@ -372,6 +385,59 @@ class SeaLoaderApp(tk.Tk): pass return Path(__file__).resolve().parent / name + def _open_link(self, url: str) -> None: + try: + webbrowser.open(url) + except Exception: + pass + + def _load_png_icon(self, filename: str, max_px: int = 18): + try: + png_path = self._resource_path(filename) + if not png_path.exists(): + return None + img = tk.PhotoImage(file=str(png_path)) + # Downscale if needed using integer subsample + sx = max(img.width() // max_px, 1) + sy = max(img.height() // max_px, 1) + scale = max(sx, sy) + if scale > 1: + img = img.subsample(scale, scale) + return img + except Exception: + return None + + def _on_disable_all(self) -> None: + confirm = messagebox.askyesno("SeaLoader", "Disable all mods in usersettings.ini?") + if not confirm: + return + try: + self._disable_all_mods() + except Exception as exc: + messagebox.showerror("SeaLoader", f"Failed to disable all mods: {exc}") + return + self._load_installed_mods() + messagebox.showinfo("SeaLoader", "All mods disabled.") + + def _disable_all_mods(self) -> None: + parser = configparser.ConfigParser() + parser.optionxform = str + parser.read(self.ini_path, encoding="utf-8") + section = "LoadOrder" + if section not in parser: + raise ValueError("[LoadOrder] section not found in usersettings.ini") + shutil.copyfile(self.ini_path, self.ini_path + ".bak") + for key, value in list(parser[section].items()): + if not key.lower().startswith("mod"): + continue + parts = value.split(",") + if not parts: + continue + left_token = parts[0].strip() + parser[section][key] = f"{left_token},False" + with open(self.ini_path, "w", encoding="utf-8") as f: + parser.write(f) + def main() -> None: ini_path = DEFAULT_INI_PATH diff --git a/steam_required_ids.py b/steam_required_ids.py index f558b06..5151c79 100644 --- a/steam_required_ids.py +++ b/steam_required_ids.py @@ -128,10 +128,10 @@ def extract_required_item_ids(url: str) -> List[str]: html = fetch_page(url) found_ids = extract_required_item_ids_from_html(html) - # Remove the current page's ID if present + # Ensure the current page's ID is included (user wants main mod too) current_id = parse_main_item_id(url) - if current_id and current_id in found_ids: - found_ids.remove(current_id) + if current_id: + found_ids.add(current_id) return sorted(found_ids, key=int)