refactor: Implement Singleton pattern for DatabaseManager

Refactor the database handling to use a Singleton pattern for `DatabaseManager`.

- A single, module-level instance `db_manager` is created in `core/database.py` to ensure one database connection is used throughout the application.
- `MediaRepository` and `MainController` are updated to use this shared instance instead of creating their own.
- This simplifies dependency injection and prevents potential issues with multiple database connections.
- Also, update `review.md` to reflect the progress.
This commit is contained in:
2025-10-14 08:55:45 +02:00
parent 96c2495a8b
commit c8d9029df7
4 changed files with 28 additions and 6 deletions

View File

@@ -3,7 +3,7 @@ from PySide6.QtCore import Slot
from PySide6.QtGui import QPixmap from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import QPushButton from PySide6.QtWidgets import QPushButton
from core.database import DatabaseManager from core.database import db_manager
from core.media import MediaRepository from core.media import MediaRepository
from core.camera.camera_manager import CameraManager from core.camera.camera_manager import CameraManager
from ui.widgets.color_list_widget import ColorListWidget from ui.widgets.color_list_widget import ColorListWidget
@@ -14,8 +14,8 @@ from ui.widgets.split_view_widget import SplitView, CameraPlaceholder, ViewWithO
class MainController: class MainController:
def __init__(self, view): def __init__(self, view):
self.view = view self.view = view
self.db = DatabaseManager() self.db = db_manager
self.media_repo = MediaRepository(self.db) self.media_repo = MediaRepository()
self.camera_manager = CameraManager() self.camera_manager = CameraManager()
# --- UI Widgets --- # --- UI Widgets ---

View File

@@ -154,3 +154,6 @@ class DatabaseManager:
cur = self.conn.cursor() cur = self.conn.cursor()
cur.execute("DELETE FROM media WHERE color_id = ?", (color_id,)) cur.execute("DELETE FROM media WHERE color_id = ?", (color_id,))
self.conn.commit() self.conn.commit()
db_manager = DatabaseManager()

View File

@@ -1,13 +1,13 @@
from pathlib import Path from pathlib import Path
import shutil import shutil
from core.database import DatabaseManager from core.database import db_manager
MEDIA_DIR = Path("media") MEDIA_DIR = Path("media")
DEFAULT_ICON = Path("media/default_icon.jpg") DEFAULT_ICON = Path("media/default_icon.jpg")
class MediaRepository: class MediaRepository:
def __init__(self, db: DatabaseManager): def __init__(self):
self.db = db self.db = db_manager
def sync_media(self): def sync_media(self):
disk_colors = {d.name for d in MEDIA_DIR.iterdir() if d.is_dir()} disk_colors = {d.name for d in MEDIA_DIR.iterdir() if d.is_dir()}

View File

@@ -51,3 +51,22 @@ To bardzo obiecujący projekt z solidnymi fundamentami. Moje sugestie mają na c
4. **Uprość logikę UI:** Zastanów się nad refaktoryzacją obsługi stanu przycisków w `MainController`, aby kod był bardziej czytelny i mniej podatny na błędy. 4. **Uprość logikę UI:** Zastanów się nad refaktoryzacją obsługi stanu przycisków w `MainController`, aby kod był bardziej czytelny i mniej podatny na błędy.
Świetna robota! Jeśli masz więcej pytań lub chciałbyś, żebym przyjrzał się jakiemuś konkretnemu fragmentowi, daj znać. Świetna robota! Jeśli masz więcej pytań lub chciałbyś, żebym przyjrzał się jakiemuś konkretnemu fragmentowi, daj znać.
---
### Postęp Prac (14.10.2025)
Na podstawie powyższej recenzji, wspólnie wprowadziliśmy następujące zmiany:
* **Zrefaktoryzowano ścieżki do zasobów (Zrealizowano):**
* Utworzono plik `settings.py` do centralnego zarządzania ścieżkami.
* Zaktualizowano komponenty UI (`split_view_widget.py`, `view_settings_dialog.py`), aby korzystały ze scentralizowanych ścieżek, co uniezależniło aplikację od katalogu roboczego.
* **Poprawiono logikę rotacji obrazu (Zrealizowano):**
* Zmieniono mechanizm obracania obrazu referencyjnego w `SplitView`, aby operacje były wykonywane na oryginalnym obrazie. Zapobiega to stopniowej utracie jakości przy wielokrotnych rotacjach.
* **Uproszczono logikę sygnałów w `MainController` (Zrealizowano):**
* Zastąpiono dynamiczne łączenie i rozłączanie sygnałów przycisku kamery jednym, stałym połączeniem i centralną metodą obsługi. Zwiększyło to czytelność i niezawodność kodu.
* **Wyczyszczono projekt (Zrealizowano):**
* Użytkownik potwierdził usunięcie zduplikowanych plików (`camera_controller.py` i `mock_gphoto.py`) z katalogu `controllers`.