159 lines
5.4 KiB
Python
159 lines
5.4 KiB
Python
from PySide6.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
|
|
QMenuBar, QStatusBar, QSplitter)
|
|
from PySide6.QtCore import Qt, Signal, QThreadPool
|
|
from modules.ui.browser_widget import BrowserWidget
|
|
from modules.ui.tools_widget import ToolsWidget
|
|
from modules.ui.menu_bar import MenuBar
|
|
from modules.ui.status_bar import StatusBar
|
|
from modules.tools.forbidden_words import ForbiddenWords
|
|
from modules.tools.category_manager import CategoryManager
|
|
import logging
|
|
import os
|
|
|
|
# Fluent Widgets 추가
|
|
from qfluentwidgets import (FluentWindow, NavigationItemPosition, FluentIcon,
|
|
MessageBox, setTheme, Theme, FluentStyleSheet, InfoBar,
|
|
InfoBarPosition, setFont)
|
|
from qfluentwidgets import FluentTranslator
|
|
|
|
class MainWindow(FluentWindow):
|
|
# 시그널 정의
|
|
status_changed = Signal(str)
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.setWindowTitle("MyCar Browser")
|
|
self.resize(1200, 800)
|
|
|
|
# Fluent 디자인 테마 설정
|
|
setTheme(Theme.AUTO)
|
|
|
|
# 로깅 설정
|
|
self.setup_logger()
|
|
|
|
# 스레드풀 초기화
|
|
self.thread_pool = QThreadPool()
|
|
self.logger.info(f"스레드풀 초기화, 최대 스레드 수: {self.thread_pool.maxThreadCount()}")
|
|
|
|
# 도구 관리자 초기화
|
|
self.setup_managers()
|
|
|
|
# UI 초기화
|
|
self.initUI()
|
|
|
|
# 시그널 연결
|
|
self.connect_signals()
|
|
|
|
def setup_logger(self):
|
|
"""로깅 시스템 설정"""
|
|
self.logger = logging.getLogger("MyCar")
|
|
self.logger.setLevel(logging.DEBUG)
|
|
|
|
# 콘솔 핸들러
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setLevel(logging.INFO)
|
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
console_handler.setFormatter(formatter)
|
|
|
|
# 파일 핸들러
|
|
os.makedirs("logs", exist_ok=True)
|
|
file_handler = logging.FileHandler("logs/mycar.log")
|
|
file_handler.setLevel(logging.DEBUG)
|
|
file_handler.setFormatter(formatter)
|
|
|
|
self.logger.addHandler(console_handler)
|
|
self.logger.addHandler(file_handler)
|
|
|
|
self.logger.info("로깅 시스템 초기화 완료")
|
|
|
|
def setup_managers(self):
|
|
"""도구 관리자 객체 초기화"""
|
|
self.forbidden_words = ForbiddenWords(logger=self.logger)
|
|
self.category_manager = CategoryManager(logger=self.logger)
|
|
|
|
self.logger.info("관리자 객체 초기화 완료")
|
|
|
|
def initUI(self):
|
|
"""UI 관련 코드 초기화"""
|
|
# 브라우저 위젯 생성
|
|
self.browser_widget = BrowserWidget()
|
|
|
|
# 도구 위젯 생성
|
|
self.tools_widget = ToolsWidget(
|
|
parent=self,
|
|
thread_pool=self.thread_pool,
|
|
logger=self.logger,
|
|
forbidden_words=self.forbidden_words,
|
|
category_manager=self.category_manager
|
|
)
|
|
|
|
# 상태바 설정
|
|
self.status_bar = StatusBar()
|
|
self.setStatusBar(self.status_bar)
|
|
|
|
# Fluent 스타일의 내비게이션 추가
|
|
self.addSubInterface(self.browser_widget, FluentIcon.GLOBE, "브라우저")
|
|
self.addSubInterface(self.tools_widget, FluentIcon.SETTING, "도구")
|
|
|
|
# 추가 도구 메뉴 추가
|
|
self.navigationInterface().addSeparator()
|
|
|
|
# 로그 메뉴 추가
|
|
self.navigationInterface().addItem(
|
|
routeKey='logs',
|
|
icon=FluentIcon.SCROLL,
|
|
text='로그',
|
|
position=NavigationItemPosition.BOTTOM
|
|
)
|
|
|
|
# 설정 메뉴 추가
|
|
self.navigationInterface().addItem(
|
|
routeKey='settings',
|
|
icon=FluentIcon.SETTING,
|
|
text='설정',
|
|
position=NavigationItemPosition.BOTTOM
|
|
)
|
|
|
|
# 기본 페이지 설정
|
|
self.navigationInterface().setCurrentItem("브라우저")
|
|
|
|
# 로고 이미지 설정
|
|
# self.setWindowIcon(FluentIcon.CAR)
|
|
|
|
self.logger.info("UI 초기화 완료")
|
|
|
|
def connect_signals(self):
|
|
"""시그널과 슬롯 연결"""
|
|
self.status_changed.connect(self.status_bar.set_status_message)
|
|
|
|
# 도구 위젯의 시그널 연결
|
|
try:
|
|
self.tools_widget.status_changed.connect(self.status_bar.set_status_message)
|
|
except AttributeError:
|
|
self.logger.warning("도구 위젯에 status_changed 시그널이 없습니다.")
|
|
|
|
self.logger.info("시그널 연결 완료")
|
|
|
|
def update_status(self, message):
|
|
"""상태바 메시지 업데이트"""
|
|
self.status_changed.emit(message)
|
|
self.logger.info(f"상태 메시지: {message}")
|
|
|
|
# Fluent 스타일 알림 표시
|
|
InfoBar.success(
|
|
title='알림',
|
|
content=message,
|
|
duration=2000,
|
|
position=InfoBarPosition.BOTTOM_RIGHT,
|
|
parent=self
|
|
)
|
|
|
|
def showMessageBox(self, title, content):
|
|
"""Fluent 스타일 메시지 박스 표시"""
|
|
w = MessageBox(title, content, self)
|
|
w.show()
|
|
|
|
def closeEvent(self, event):
|
|
"""앱 종료 시 이벤트 처리"""
|
|
self.logger.info("애플리케이션 종료")
|
|
super().closeEvent(event) |