Mycar_Browser/modules/ui/main_window.py

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)