144 lines
4.0 KiB
Python
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()
|
|
|
|
|