142 lines
4.2 KiB
Python
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()
|
|
|
|
|