diff --git a/.gitignore b/.gitignore index 517ca32..600778e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ .venv -*.db \ No newline at end of file +*.db +/dist +/build +__pycache__/ \ No newline at end of file diff --git a/UFF-Search.spec b/UFF-Search.spec new file mode 100644 index 0000000..1563e28 --- /dev/null +++ b/UFF-Search.spec @@ -0,0 +1,38 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['uff_app.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=['rapidfuzz', 'pypdf'], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='UFF-Search', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/UFF_Search_Installer_v3.exe b/UFF_Search_Installer_v3.exe new file mode 100644 index 0000000..0cf5d86 Binary files /dev/null and b/UFF_Search_Installer_v3.exe differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6bb09ce --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +pypdf +rapidfuzz +PyQt6 \ No newline at end of file diff --git a/setup-file.iss b/setup-file.iss new file mode 100644 index 0000000..c35bc76 --- /dev/null +++ b/setup-file.iss @@ -0,0 +1,52 @@ +; -- UFF-Search Installer Skript -- + +[Setup] +; Der Name, der überall steht +AppName=UFF Text Search +AppVersion=3.0 +AppPublisher=Konstantin Roßmann +AppPublisherURL=https://rossmann-it-solutions.de + +; Wo soll standardmäßig installiert werden? {autopf} ist "Program Files" +DefaultDirName={autopf}\UFF-Search +; Name der Gruppe im Startmenü +DefaultGroupName=UFF Search + +; Speicherort der fertigen setup.exe (z.B. auf dem Desktop oder im Projektordner) +OutputDir=. +OutputBaseFilename=UFF_Search_Installer_v3 +Compression=lzma +SolidCompression=yes + +; Icon für den Installer selbst (optional, sonst weglassen) +; SetupIconFile=app.ico + +; Administrator-Rechte anfordern für Installation in Program Files +PrivilegesRequired=admin + +[Languages] +Name: "german"; MessagesFile: "compiler:Languages\German.isl" + +[Tasks] +; Checkbox: "Desktop Verknüpfung erstellen" +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +; !!! WICHTIG: HIER DEN PFAD ZU DEINER EXE ANPASSEN !!! +; "Source" muss auf die Datei zeigen, die PyInstaller im "dist" Ordner erstellt hat. +Source: "C:\Users\konst\Arbeit\unsorted-folder-full-text-search\dist\UFF-Search.exe"; DestDir: "{app}"; Flags: ignoreversion + +; Falls du ein Icon mitliefern willst (optional) +; Source: "C:\Pfad\Zu\Deinem\Projekt\app.ico"; DestDir: "{app}"; Flags: ignoreversion + +[Icons] +; Verknüpfung im Startmenü +Name: "{group}\UFF Text Search"; Filename: "{app}\UFF-Search.exe" +; Verknüpfung zum Deinstallieren +Name: "{group}\Uninstall UFF Search"; Filename: "{uninstallexe}" +; Verknüpfung auf dem Desktop (wenn vom User ausgewählt) +Name: "{commondesktop}\UFF Text Search"; Filename: "{app}\UFF-Search.exe"; Tasks: desktopicon + +[Run] +; Checkbox am Ende: "Programm jetzt starten" +Description: "{cm:LaunchProgram,UFF Text Search}"; Filename: "{app}\UFF-Search.exe"; Flags: nowait postinstall skipifsilent \ No newline at end of file diff --git a/uff_app.py b/uff_app.py index d36e63f..b83d239 100644 --- a/uff_app.py +++ b/uff_app.py @@ -16,8 +16,28 @@ from PyQt6.QtGui import QDesktopServices # --- 1. DATENBANK MANAGER (Mit Fuzzy-Ranking) --- class DatabaseHandler: - def __init__(self, db_name="uff_index.db"): - self.db_name = db_name + def __init__(self): + # 1. Wir ermitteln den korrekten AppData Ordner für den User + # Windows: C:\Users\Name\AppData\Local\UFF_Search + if os.name == 'nt': + base_dir = os.getenv('LOCALAPPDATA') + else: + # Mac/Linux: ~/.local/share/uff_search + base_dir = os.path.join(os.path.expanduser("~"), ".local", "share") + + # 2. Wir erstellen unseren eigenen Unterordner + self.app_data_dir = os.path.join(base_dir, "UFF_Search") + + # Falls der Ordner nicht existiert, erstellen wir ihn + if not os.path.exists(self.app_data_dir): + os.makedirs(self.app_data_dir) + + # 3. Der Pfad zur Datenbank + self.db_name = os.path.join(self.app_data_dir, "uff_index.db") + + # Debug-Info (falls du es im Terminal testest) + print(f"Datenbank Pfad: {self.db_name}") + self.init_db() def init_db(self): @@ -324,7 +344,12 @@ class UffWindow(QMainWindow): def start_indexing(self, folder): self.set_ui_busy(True) self.lbl_status.setText(f"Starte... {os.path.basename(folder)}") - self.indexer_thread = IndexerThread(folder) + + # HIER WAR DER FEHLER: + # Wir müssen dem Thread explizit sagen, wo die Datenbank liegt! + # self.db.db_name enthält den korrekten Pfad (C:\Users\...\AppData\...) + self.indexer_thread = IndexerThread(folder, db_name=self.db.db_name) + self.indexer_thread.progress_signal.connect(lambda msg: self.lbl_status.setText(msg)) self.indexer_thread.finished_signal.connect(self.indexing_finished) self.indexer_thread.start()