VOC_Monitor/app/view/tray_icon.py

57 lines
2.4 KiB
Python

import pystray
from view.ui_utils import asset_loader
class SystemTray:
"""
시스템 트레이 아이콘 및 메뉴를 관리하는 클래스.
pystray 라이브러리를 사용하여 트레이 아이콘을 생성하고 백그라운드 실행을 지원합니다.
"""
def __init__(self, controller):
self.controller = controller
self.icon = None
def create_modern_icon(self):
"""에셋 로더를 통해 Tray 아이콘(PIL Image)을 생성하여 반환합니다."""
return asset_loader.get_tray_icon_image()
def run(self, on_check, on_update, on_list, on_settings, on_quit):
"""
트레이 아이콘을 실행하고 메뉴 이벤트를 바인딩합니다.
Args:
on_check (func): '지금 확인' 메뉴 핸들러
on_update (func): '업데이트 확인' 메뉴 핸들러
on_list (func): 'VOC 모니터링 열기' 메뉴 핸들러
on_settings (func): '설정' 메뉴 핸들러
on_quit (func): '종료' 메뉴 핸들러
"""
# 메뉴 구성
menu = (
pystray.MenuItem('VOC 모니터링 열기', lambda *args: on_list()), # 메인 기능
pystray.Menu.SEPARATOR,
pystray.MenuItem('지금 확인 (수동)', lambda *args: on_check()),
pystray.MenuItem('업데이트 확인', lambda *args: on_update()),
pystray.MenuItem('설정', lambda *args: on_settings()),
pystray.MenuItem('종료', lambda *args: on_quit()),
)
# 아이콘 로드 및 실행
self.icon = pystray.Icon(
"VOC_Monitor",
self.create_modern_icon(),
"VOC 알리미",
menu
)
self.icon.run()
def stop(self):
"""트레이 아이콘을 종료하고 리소스를 정리합니다."""
if self.icon:
self.icon.stop()
def show_notification(self, title, msg, voc_id=None):
"""커스텀 알림 창 표시 (메인 스레드에서 실행)"""
# controller.root.after를 사용하여 메인 스레드에서 UI 생성 보장
# 순환 참조 방지를 위해 지역 import 사용
from view.components.notification import NotificationView
self.controller.root.after(0, lambda: NotificationView(self.controller, title=title, msg=msg, voc_id=voc_id))