handOver2/ui/panels/todo_panel.py

144 lines
4.0 KiB
Python

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