# modules/app_manager.py import flet as ft import logging from modules import logger, setting_manager, db_manager, project_info, login_page, market_page, product_page, forbidden_page, category_page, app_state class AppManager: def __init__(self, page: ft.Page): self.page = page self.logger = logger.get_logger() self.project_info = project_info.get_project_info() # 창 제목은 project_info의 window_title 사용 self.page.title = self.project_info.get("window_title", "Modern Market Manager") self.page.theme_mode = ft.ThemeMode.LIGHT # 앱 상태 관리 객체 self.state = app_state.AppState() # 초기 관리자 객체 생성 self.settings_mgr = setting_manager.SettingsManager(self.project_info) self.db_mgr = db_manager.DBManager(self.logger) def start(self): self.logger.debug("AppManager.start() - 시작, 로그인 페이지 표시") from modules.login_page import LoginPage login_pg = LoginPage( self.page, self.logger, self.settings_mgr, self.db_mgr, on_login_success=self.on_login_success, project_info=self.project_info ) login_pg.show() def on_login_success(self): self.logger.debug("AppManager.on_login_success() 호출됨") # 예를 들어, 로그인 성공 시 AppState에 사용자 정보를 저장할 수 있음. # 전환 후 메인 UI (탭 + 로그 영역) 표시 self.show_main_ui() def show_main_ui(self): self.logger.debug("AppManager.show_main_ui() 호출됨") self.page.controls.clear() # 각 페이지 인스턴스 생성 from modules.market_page import MarketPage from modules.product_page import ProductPage from modules.forbidden_page import ForbiddenPage from modules.category_page import CategoryPage market_pg = MarketPage(self.page, self.logger, self.db_mgr) product_pg = ProductPage(self.page, self.logger) forbidden_pg = ForbiddenPage(self.page, self.logger) category_pg = CategoryPage(self.page, self.logger) # "팔린상품 가져오기" 버튼 클릭 시 호출될 콜백 (상품 페이지 업데이트 및 탭 전환) def on_products_fetched(products): self.logger.debug(f"AppManager.on_products_fetched() 호출됨, 상품 수: {len(products)}") product_pg.set_products(products) tabs.selected_index = 1 # 두 번째 탭으로 전환 (상품 페이지) self.page.update() market_pg.on_products_fetched_callback = on_products_fetched # 탭 컨트롤 구성 tabs = ft.Tabs( selected_index=0, tabs=[ ft.Tab(text="마켓", content=market_pg.get_content()), ft.Tab(text="상품", content=product_pg.get_content()), ft.Tab(text="금지어 관리", content=forbidden_pg.get_content()), ft.Tab(text="카테고리 관리", content=category_pg.get_content()), ], on_change=self.on_tab_change ) # 로그 영역: 스크롤 가능한 컨테이너에 Text 컨트롤 배치 log_text = ft.Text("", size=12, color="black") log_container = ft.Container( content=log_text, height=150, scroll=ft.ScrollMode.AUTO, border=ft.border.all(1, "lightgray"), padding=10, bgcolor="white", ) main_layout = ft.Column([tabs, log_container], expand=True, spacing=10) # 창 크기 및 중앙 배치 (1400×800) self.page.window.width = 1400 self.page.window.height = 800 self.page.window.center() self.page.add(main_layout) self.page.update() # Logger의 GUI 콜백 설정하여 로그가 log_text에 출력되도록 함 def gui_log_callback(message: str): log_text.value += message + "\n" self.page.update() self.logger.gui_callback = gui_log_callback def on_tab_change(self, e: ft.ControlEvent): self.logger.debug(f"탭 전환됨, 인덱스: {e.control.selected_index}") self.page.update()