108 lines
4.4 KiB
Python
108 lines
4.4 KiB
Python
import flet as ft
|
|
from flet import AlertDialog, TextField, Checkbox, ElevatedButton, Text, Column, Row, MainAxisAlignment
|
|
import logging
|
|
|
|
class LoginDialog:
|
|
"""
|
|
- 로그인 성공 시 on_login_success 콜백 호출
|
|
- 로그인 실패 시 메시지 표시
|
|
- 비밀번호 보기 토글, 정보 저장 체크박스 등
|
|
"""
|
|
def __init__(
|
|
self,
|
|
page: ft.Page,
|
|
logger: logging.Logger,
|
|
settings_manager,
|
|
db_manager,
|
|
on_login_success
|
|
):
|
|
"""
|
|
on_login_success: 로그인 성공 시 호출할 콜백 함수 (메인 윈도우로 전환 등)
|
|
"""
|
|
self.page = page
|
|
self.logger = logger
|
|
self.settings_manager = settings_manager
|
|
self.db_manager = db_manager
|
|
self.on_login_success = on_login_success
|
|
self.result = None # True/False
|
|
|
|
self.logger.log("Initializing LoginDialog...", level=logging.DEBUG)
|
|
self.create_dialog()
|
|
|
|
def create_dialog(self):
|
|
self.logger.log("Entering LoginDialog.create_dialog()", level=logging.DEBUG)
|
|
self.email_field = TextField(label="이메일", width=300)
|
|
self.password_field = TextField(label="비밀번호", width=300, password=True)
|
|
self.remember_checkbox = Checkbox(label="정보 저장")
|
|
self.show_password_checkbox = Checkbox(label="비밀번호 보기")
|
|
self.error_text = Text("", color="red")
|
|
|
|
self.show_password_checkbox.on_change = self.toggle_password
|
|
|
|
self.login_button = ElevatedButton("로그인", on_click=self.on_login)
|
|
self.reset_button = ElevatedButton("비밀번호 찾기", on_click=self.on_reset)
|
|
|
|
# AlertDialog 구성
|
|
self.dialog = AlertDialog(
|
|
title=Text("로그인"),
|
|
content=Column([
|
|
self.email_field,
|
|
self.password_field,
|
|
Row([self.remember_checkbox, self.show_password_checkbox]),
|
|
self.error_text,
|
|
Row([self.login_button, self.reset_button], alignment=MainAxisAlignment.CENTER)
|
|
]),
|
|
actions_alignment=MainAxisAlignment.CENTER
|
|
)
|
|
self.logger.log("Exiting LoginDialog.create_dialog()", level=logging.DEBUG)
|
|
|
|
def show(self):
|
|
"""
|
|
로그인 다이얼로그를 표시한다. (비동기 루프 없이, 콜백 방식)
|
|
"""
|
|
self.logger.log("LoginDialog.show() 호출됨", level=logging.DEBUG)
|
|
self.page.dialog = self.dialog
|
|
self.dialog.open = True
|
|
self.page.update()
|
|
|
|
def toggle_password(self, e: ft.ControlEvent):
|
|
self.logger.log("toggle_password() 호출됨", level=logging.DEBUG)
|
|
self.password_field.password = not self.show_password_checkbox.value
|
|
self.page.update()
|
|
|
|
def on_login(self, e: ft.ControlEvent):
|
|
self.logger.log("on_login() 호출됨", level=logging.DEBUG)
|
|
email = self.email_field.value.strip()
|
|
password = self.password_field.value.strip()
|
|
if not email or not password:
|
|
self.error_text.value = "이메일과 비밀번호를 모두 입력하세요."
|
|
self.logger.log("on_login(): 입력값 부족", level=logging.WARNING)
|
|
self.page.update()
|
|
return
|
|
|
|
result = self.db_manager.login(email, password)
|
|
if "error" not in result:
|
|
self.logger.log(f"로그인 성공: {result}", level=logging.DEBUG)
|
|
self.db_manager.update_last_login(result["id"])
|
|
if self.remember_checkbox.value:
|
|
user_info = {"email": email, "password": password, "id": result["id"]}
|
|
self.settings_manager.save_user_info(user_info)
|
|
|
|
# 로그인 성공 => 다이얼로그 닫고 콜백 호출
|
|
self.dialog.open = False
|
|
self.page.dialog = None
|
|
self.page.update()
|
|
|
|
# 메인윈도우로 전환
|
|
if self.on_login_success:
|
|
self.on_login_success()
|
|
else:
|
|
self.error_text.value = f"로그인 실패: {result['error']}"
|
|
self.logger.log(f"로그인 실패: {result['error']}", level=logging.WARNING)
|
|
self.page.update()
|
|
|
|
def on_reset(self, e: ft.ControlEvent):
|
|
self.logger.log("on_reset() 호출됨", level=logging.DEBUG)
|
|
self.error_text.value = "비밀번호 찾기 기능은 구현되지 않았습니다."
|
|
self.page.update()
|