Clock_out_Time_Calculator/ui/clock_in_dialog.py
KINDNICK bedbb1e9ec
Some checks failed
CI / test (push) Has been cancelled
Initial release v2.2.0
핵심 기능:
- 단축근무·표준·반일 등 다양한 근무 패턴 (5개 프리셋 + 사용자 정의)
- Windows 이벤트 뷰어 자동 출퇴근 감지
- 30분 단위 연장근무 적립/사용 시스템
- 1.0/0.5/0.25일 연차·반차·반반차
- 자동 점심·저녁·외출·자동 백업·화면 잠금 자동 외출
- 한국 공휴일 자동 등록 (음력 포함, holidays 패키지)
- matplotlib 차트 기반 주간/월간/패턴 통계
- 미니 위젯 + 시스템 트레이 통합
- 한국어/English i18n
- 자가 업데이트 (updater.exe + Gitea Releases)

아키텍처:
- core/ (db, time_calculator, notifier, i18n, version, settings_keys)
- ui/ (main_window + 9 dialogs + 3 controllers)
- utils/ (backup, lock_detector, debug_log, updater_client, time_format)
- tests/ (66 pytest 단위) + 통합/i18n GUI 검증

CI/CD:
- .gitea/workflows/ci.yml: push 시 pytest + 통합 테스트
- .gitea/workflows/release.yml: v* 태그 push 시 두 .exe 자동 빌드 + Releases 첨부

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 12:54:40 +09:00

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("오늘의 출근시간을 입력해주세요")
info_label.setObjectName("field_label")
info_label.setAlignment(Qt.AlignCenter)
layout.addWidget(info_label)
# 시간 입력
time_layout = QHBoxLayout()
time_label = QLabel("출근시간:")
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("빠른 선택:")
quick_label.setObjectName("field_label")
btn_8am = QPushButton("08:00")
btn_9am = QPushButton("09:00")
btn_10am = QPushButton("10:00")
btn_now = QPushButton("현재")
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("확인")
ok_button.setObjectName("btn_primary")
ok_button.setMinimumHeight(40)
ok_button.clicked.connect(self.accept)
cancel_button = QPushButton("취소")
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()