- i18n 사전 100% (break/overtime/leave/clockin) — 50+ 신규 키 - 런타임 재번역 인프라 (ui/i18n_runtime.py) — 재시작 없이 메인 UI 적용 - MealController 분리 — 점심/저녁 토글을 컨트롤러로 추출 - 통합 테스트 +15 (S36-S52: 온보딩/salary/CSV/notification dedupe 등) - pytest 신규 4종 + i18n_runtime 테스트 (총 122 케이스, 90→122) - README/INSTALL/CLAUDE/AGENTS v2.6+ 아키텍처 반영
142 lines
4.3 KiB
Python
142 lines
4.3 KiB
Python
"""
|
|
출근시간 수동 입력 다이얼로그
|
|
"""
|
|
from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel,
|
|
QPushButton, QTimeEdit, QMessageBox)
|
|
from PyQt5.QtCore import QTime, Qt
|
|
from datetime import datetime
|
|
from core.i18n import tr
|
|
from ui.styles import apply_dark_titlebar
|
|
|
|
|
|
class ClockInDialog(QDialog):
|
|
"""출근시간 입력 다이얼로그"""
|
|
|
|
def __init__(self, parent=None, default_time=None):
|
|
super().__init__(parent)
|
|
self.selected_time = None
|
|
self.init_ui(default_time)
|
|
apply_dark_titlebar(self)
|
|
|
|
def init_ui(self, default_time):
|
|
"""UI 초기화"""
|
|
self.setWindowTitle(tr('window.clock_in_dialog'))
|
|
self.setModal(True)
|
|
self.setFixedSize(340, 200)
|
|
|
|
layout = QVBoxLayout()
|
|
layout.setSpacing(8)
|
|
layout.setContentsMargins(12, 10, 12, 10)
|
|
|
|
# 안내 문구
|
|
info_label = QLabel(tr('dlg.clock_in.prompt'))
|
|
info_label.setObjectName("field_label")
|
|
info_label.setAlignment(Qt.AlignCenter)
|
|
layout.addWidget(info_label)
|
|
|
|
# 시간 입력
|
|
time_layout = QHBoxLayout()
|
|
time_label = QLabel(tr('dlg.clock_in.label'))
|
|
time_label.setObjectName("field_label")
|
|
|
|
self.time_edit = QTimeEdit()
|
|
self.time_edit.setDisplayFormat("HH:mm:ss")
|
|
self.time_edit.setMinimumHeight(35)
|
|
|
|
# 기본값 설정
|
|
if default_time:
|
|
qtime = QTime(default_time.hour, default_time.minute, default_time.second)
|
|
else:
|
|
# 현재 시간으로 기본값 설정
|
|
now = datetime.now()
|
|
qtime = QTime(now.hour, now.minute, now.second)
|
|
|
|
self.time_edit.setTime(qtime)
|
|
|
|
time_layout.addWidget(time_label)
|
|
time_layout.addWidget(self.time_edit)
|
|
layout.addLayout(time_layout)
|
|
|
|
# 빠른 선택 버튼
|
|
quick_layout = QHBoxLayout()
|
|
quick_label = QLabel(tr('dlg.clock_in.quick'))
|
|
quick_label.setObjectName("field_label")
|
|
|
|
btn_8am = QPushButton("08:00")
|
|
btn_9am = QPushButton("09:00")
|
|
btn_10am = QPushButton("10:00")
|
|
btn_now = QPushButton(tr('dlg.clock_in.btn_now'))
|
|
|
|
for btn in [btn_8am, btn_9am, btn_10am, btn_now]:
|
|
btn.setMinimumHeight(30)
|
|
|
|
btn_8am.clicked.connect(lambda: self.time_edit.setTime(QTime(8, 0, 0)))
|
|
btn_9am.clicked.connect(lambda: self.time_edit.setTime(QTime(9, 0, 0)))
|
|
btn_10am.clicked.connect(lambda: self.time_edit.setTime(QTime(10, 0, 0)))
|
|
btn_now.clicked.connect(lambda: self.time_edit.setTime(QTime.currentTime()))
|
|
|
|
quick_layout.addWidget(quick_label)
|
|
quick_layout.addWidget(btn_8am)
|
|
quick_layout.addWidget(btn_9am)
|
|
quick_layout.addWidget(btn_10am)
|
|
quick_layout.addWidget(btn_now)
|
|
layout.addLayout(quick_layout)
|
|
|
|
layout.addStretch()
|
|
|
|
# 버튼
|
|
button_layout = QHBoxLayout()
|
|
|
|
ok_button = QPushButton(tr('btn.confirm'))
|
|
ok_button.setObjectName("btn_primary")
|
|
ok_button.setMinimumHeight(40)
|
|
ok_button.clicked.connect(self.accept)
|
|
|
|
cancel_button = QPushButton(tr('btn.cancel'))
|
|
cancel_button.setMinimumHeight(40)
|
|
cancel_button.clicked.connect(self.reject)
|
|
|
|
button_layout.addWidget(cancel_button)
|
|
button_layout.addWidget(ok_button)
|
|
layout.addLayout(button_layout)
|
|
|
|
self.setLayout(layout)
|
|
|
|
def accept(self):
|
|
"""확인 버튼 클릭"""
|
|
qtime = self.time_edit.time()
|
|
|
|
# QTime을 datetime으로 변환
|
|
today = datetime.now().date()
|
|
self.selected_time = datetime.combine(
|
|
today,
|
|
datetime.min.time().replace(
|
|
hour=qtime.hour(),
|
|
minute=qtime.minute(),
|
|
second=qtime.second()
|
|
)
|
|
)
|
|
|
|
super().accept()
|
|
|
|
def get_time(self):
|
|
"""선택된 시간 반환"""
|
|
return self.selected_time
|
|
|
|
|
|
# 테스트 코드
|
|
if __name__ == "__main__":
|
|
from PyQt5.QtWidgets import QApplication
|
|
import sys
|
|
|
|
app = QApplication(sys.argv)
|
|
|
|
dialog = ClockInDialog()
|
|
if dialog.exec_() == QDialog.Accepted:
|
|
selected_time = dialog.get_time()
|
|
print(f"선택된 시간: {selected_time.strftime('%H:%M:%S')}")
|
|
else:
|
|
print("취소됨")
|
|
|
|
sys.exit()
|