handOver2/ui/panels/content_panel.py

142 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
"""
컨텐츠 패널 모듈
화면 중앙의 메인 컨텐츠 영역입니다.
섹션 패널(왼쪽 70%)과 Todo 패널(오른쪽 30%)을 포함합니다.
"""
from PySide6.QtWidgets import QWidget, QHBoxLayout
from PySide6.QtCore import Qt
from ui.base.base_widget import BaseWidget
from ui.components.splitter import CustomSplitter
from .section_panel import SectionPanel
from .todo_panel import TodoPanel
from core.config import ConfigManager
from core.signals import GlobalSignals
from core.logger import get_logger
logger = get_logger(__name__)
class ContentPanel(BaseWidget):
"""
컨텐츠 패널 위젯
화면 중앙 80% 영역에 표시되는 메인 컨텐츠 영역입니다.
분리바로 구분된 섹션 패널과 Todo 패널을 포함합니다.
Examples:
>>> content = ContentPanel()
>>> content.section_panel.load_data()
"""
def __init__(self, parent=None):
super().__init__(parent)
self._setup_ui()
self._connect_signals()
logger.info("컨텐츠 패널 초기화 완료")
def _setup_ui(self):
"""UI 설정"""
layout = QHBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.setSpacing(0)
# 분리바 (수평)
self.splitter = CustomSplitter(Qt.Horizontal)
# 섹션 패널 (왼쪽)
self.section_panel = SectionPanel()
self.splitter.addWidget(self.section_panel)
# Todo 패널 (오른쪽)
self.todo_panel = TodoPanel()
self.splitter.addWidget(self.todo_panel)
# 초기 비율 설정 (저장된 값 불러오기) - showEvent에서 처리
# self._restore_layout()
# 비율 변경 저장
self.splitter.splitterMoved.connect(self._on_splitter_moved)
layout.addWidget(self.splitter)
# 스타일 적용
self._apply_style()
# 레이아웃 복원 여부 플래그
self._layout_restored = False
def showEvent(self, event):
"""화면 표시 이벤트"""
super().showEvent(event)
if not self._layout_restored:
self._restore_layout()
self._layout_restored = True
def _restore_layout(self):
"""레이아웃 복원"""
# 위젯 너비가 유효하지 않으면 대기
if self.width() <= 0:
return
# 기본값 60:40
default_section = 60.0
default_todo = 40.0
try:
section_ratio = float(self.config.get('layout', 'section_panel_ratio', default_section))
todo_ratio = float(self.config.get('layout', 'todo_panel_ratio', default_todo))
except (ValueError, TypeError):
section_ratio = default_section
todo_ratio = default_todo
logger.debug(f"레이아웃 복원: section={section_ratio}, todo={todo_ratio}")
self.splitter.set_ratios([section_ratio, todo_ratio])
def _apply_style(self):
"""스타일 적용"""
theme = self.config.theme
if theme == 'dark':
bg = "#0f172a"
else:
bg = "#f1f5f9"
self.setStyleSheet(f"""
ContentPanel {{
background-color: {bg};
}}
""")
def _connect_signals(self):
"""시그널 연결"""
self.signals.layout_changed.connect(self._on_layout_changed)
def _on_splitter_moved(self, pos: int, index: int):
"""분리바 이동"""
ratios = self.splitter.get_ratios()
# 설정 저장
self.config.set('layout', 'section_panel_ratio', ratios[0])
self.config.set('layout', 'todo_panel_ratio', ratios[1])
self.config.save()
logger.debug(f"레이아웃 비율 변경 및 저장: {ratios}")
def _on_layout_changed(self):
"""레이아웃 변경 시그널"""
# 레이아웃 변경 시그널이 오면 저장된 값을 다시 불러옴 (초기화 아님)
self._restore_layout()
def refresh_all(self):
"""모든 데이터 새로고침"""
self.section_panel.refresh_data()
self.todo_panel.refresh_data()