107 lines
4.2 KiB
Python
107 lines
4.2 KiB
Python
# 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()
|