# -*- 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()