using System; using System.Collections.ObjectModel; using System.Linq; using System.Windows.Threading; using CommunityToolkit.Mvvm.ComponentModel; using UbisamBase.Core.Auth; using UbisamBase.Core.Modules; using UbisamBase.Core.Settings; using UbisamBase.Core.Setup; namespace UbisamBase.Core.Shell; public partial class ShellViewModel : ObservableObject { /// 좌상단에 표기되는 회사명. 장비명(Title)과 구분선으로 나란히 놓인다. public string Brand { get; } = "UBISAM"; /// 좌상단 장비명. IAppSetup.GetAppName()이 돌려주는 값. public string Title { get; } public UiSettingsService UiSettings { get; } public AuthService Auth { get; } public ObservableCollection MainTabs { get; } = new(); [ObservableProperty] private MainTabViewModel? selectedMainTab; [ObservableProperty] private string currentTime = DateTime.Now.ToString("HH:mm:ss"); [ObservableProperty] private string currentDate = FormatDate(DateTime.Now); private readonly DispatcherTimer clockTimer; public ShellViewModel(IServiceProvider serviceProvider, IAppSetup appSetup, TabManager tabManager, UiSettingsService uiSettings, AuthService auth) { Title = appSetup.GetAppName(); UiSettings = uiSettings; Auth = auth; foreach (var registration in tabManager.Registrations.OrderBy(m => m.Order)) { var mainTab = new MainTabViewModel( registration.Title, registration.Icon, () => registration.ContentFactory(serviceProvider), registration.Order); foreach (var sub in registration.SubTabs.OrderBy(s => s.Order)) { mainTab.AddSubTab(new SubTabViewModel(sub.Title, () => sub.ContentFactory(serviceProvider), sub.Order)); } MainTabs.Add(mainTab); } SelectedMainTab = MainTabs.FirstOrDefault(); clockTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; clockTimer.Tick += (_, _) => { var now = DateTime.Now; CurrentTime = now.ToString("HH:mm:ss"); CurrentDate = FormatDate(now); }; clockTimer.Start(); } private static string FormatDate(DateTime value) { var day = value.DayOfWeek switch { DayOfWeek.Sunday => "일", DayOfWeek.Monday => "월", DayOfWeek.Tuesday => "화", DayOfWeek.Wednesday => "수", DayOfWeek.Thursday => "목", DayOfWeek.Friday => "금", _ => "토" }; return $"{value:yyyy.MM.dd} {day}"; } }