# -*- coding: utf-8 -*- """ Todo 패널 모듈 일상검수, 할일 목록, 메모를 관리하는 오른쪽 패널입니다. """ from PySide6.QtWidgets import ( QWidget, QVBoxLayout, QScrollArea, QFrame ) from PySide6.QtCore import Qt from PySide6.QtGui import QFont from ui.base.base_widget import BaseWidget from ui.widgets.daily_inspection import DailyInspectionWidget from ui.widgets.todo_list import TodoListWidget from ui.widgets.memo_widget import MemoWidget from core.config import ConfigManager from core.signals import GlobalSignals from core.logger import get_logger logger = get_logger(__name__) class TodoPanel(BaseWidget): """ Todo 패널 위젯 화면 오른쪽 30% 영역에 표시되는 패널입니다. 일상검수(30%), 할일 목록(35%), 메모(35%) 영역을 포함합니다. Examples: >>> panel = TodoPanel() >>> panel.refresh_data() """ def __init__(self, parent=None): super().__init__(parent) self.setMinimumWidth(300) self._setup_ui() self._connect_signals() logger.info("Todo 패널 초기화 완료") def _setup_ui(self): """UI 설정""" layout = QVBoxLayout(self) layout.setContentsMargins(8, 16, 16, 16) layout.setSpacing(12) # 스크롤 영역 scroll = QScrollArea() scroll.setWidgetResizable(True) scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) scroll.setFrameShape(QFrame.NoFrame) # 스크롤 컨테이너 container = QWidget() container_layout = QVBoxLayout(container) container_layout.setContentsMargins(0, 0, 0, 0) container_layout.setSpacing(16) # 일상검수 영역 (30%) self.daily_inspection = DailyInspectionWidget() container_layout.addWidget(self.daily_inspection) # 할일 목록 영역 (35%) self.todo_list = TodoListWidget() container_layout.addWidget(self.todo_list, 1) # 메모 영역 (35%) self.memo = MemoWidget() container_layout.addWidget(self.memo, 1) scroll.setWidget(container) layout.addWidget(scroll) # 스타일 적용 self._apply_style() def _apply_style(self): """스타일 적용""" theme = self.config.theme if theme == 'dark': bg = "#0f172a" scrollbar_bg = "#1e293b" scrollbar_handle = "#475569" else: bg = "#f1f5f9" scrollbar_bg = "#f8fafc" scrollbar_handle = "#cbd5e1" self.setStyleSheet(f""" TodoPanel {{ background-color: {bg}; }} QScrollArea {{ background-color: transparent; border: none; }} QScrollBar:vertical {{ background-color: {scrollbar_bg}; width: 8px; border-radius: 4px; }} QScrollBar::handle:vertical {{ background-color: {scrollbar_handle}; border-radius: 4px; min-height: 20px; }} QScrollBar::handle:vertical:hover {{ background-color: #3b82f6; }} QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {{ height: 0; }} """) def _connect_signals(self): """시그널 연결""" # 데이터 변경 시그널 self.signals.data_changed.connect(self._on_data_changed) def _on_data_changed(self, table_name: str): """데이터 변경 시그널""" if table_name in ['daily_inspections', 'todos', 'memos']: self.refresh_data() def refresh_data(self): """데이터 새로고침""" self.daily_inspection.load_data() self.todo_list.load_data() self.memo.load_data()