Some checks failed
CI / test (push) Has been cancelled
핵심 기능: - 단축근무·표준·반일 등 다양한 근무 패턴 (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>
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("오늘의 출근시간을 입력해주세요")
|
|
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()
|