diff --git a/TornadoAce_CJOnStyle/Assets/LoginBroadcastControlRoom.png b/TornadoAce_CJOnStyle/Assets/LoginBroadcastControlRoom.png new file mode 100644 index 0000000..35de4fd Binary files /dev/null and b/TornadoAce_CJOnStyle/Assets/LoginBroadcastControlRoom.png differ diff --git a/TornadoAce_CJOnStyle/TornadoAce_CJOnStyle.csproj b/TornadoAce_CJOnStyle/TornadoAce_CJOnStyle.csproj index 5fa7c16..f934182 100644 --- a/TornadoAce_CJOnStyle/TornadoAce_CJOnStyle.csproj +++ b/TornadoAce_CJOnStyle/TornadoAce_CJOnStyle.csproj @@ -29,6 +29,7 @@ + diff --git a/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs b/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs index 2cd6f10..27c94a4 100644 --- a/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs +++ b/TornadoAce_CJOnStyle/ViewModels/MainViewModel.cs @@ -1,5 +1,6 @@ using Microsoft.UI; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Media; using System.Collections.ObjectModel; using TornadoAce_CJOnStyle.Services; @@ -23,6 +24,8 @@ namespace TornadoAce_CJOnStyle.ViewModels InspectionSummary = "1차 diff 실패 2건 / LLM 검토 대기 1건"; SceneSnapshotLabel = $"{workspace.ActiveScene.SceneName} / visible text objects"; SceneSnapshotText = workspace.ActiveScene.ToPreviewJson(); + LoginOperatorName = "producer"; + LaunchMessage = "큐시트, Scene 템플릿, 검수 큐 상태를 확인하고 있습니다."; LlmPolicyText = "사내 LLM 우선, 외부 서비스는 정책 승인 후"; LlmPolicyDetail = "1차 Text Diffing 실패 건만 2차 LLM 판정으로 이동하고, 가격·구성·방송시간 변경은 높은 중요도로 표시합니다."; @@ -42,6 +45,11 @@ namespace TornadoAce_CJOnStyle.ViewModels private string sceneSnapshotText = string.Empty; private string llmPolicyText = string.Empty; private string llmPolicyDetail = string.Empty; + private string loginOperatorName = string.Empty; + private string launchMessage = string.Empty; + private Visibility loginScreenVisibility = Visibility.Visible; + private Visibility launchScreenVisibility = Visibility.Collapsed; + private Visibility mainShellVisibility = Visibility.Collapsed; public string BuildPhase { @@ -107,6 +115,53 @@ namespace TornadoAce_CJOnStyle.ViewModels public ObservableCollection InspectionQueue { get; } = []; + public string LoginOperatorName + { + get => loginOperatorName; + set => SetProperty(ref loginOperatorName, value); + } + + public string LaunchMessage + { + get => launchMessage; + set => SetProperty(ref launchMessage, value); + } + + public Visibility LoginScreenVisibility + { + get => loginScreenVisibility; + set => SetProperty(ref loginScreenVisibility, value); + } + + public Visibility LaunchScreenVisibility + { + get => launchScreenVisibility; + set => SetProperty(ref launchScreenVisibility, value); + } + + public Visibility MainShellVisibility + { + get => mainShellVisibility; + set => SetProperty(ref mainShellVisibility, value); + } + + public void BeginLogin(string operatorName, string accessCode) + { + LoginOperatorName = string.IsNullOrWhiteSpace(operatorName) ? "producer" : operatorName.Trim(); + LaunchMessage = string.IsNullOrWhiteSpace(accessCode) + ? "데모 접속으로 제작 콘솔을 준비하고 있습니다." + : "접속 코드 확인 후 제작 콘솔을 준비하고 있습니다."; + LoginScreenVisibility = Visibility.Collapsed; + LaunchScreenVisibility = Visibility.Visible; + } + + public void CompleteLogin() + { + LaunchScreenVisibility = Visibility.Collapsed; + MainShellVisibility = Visibility.Visible; + OperatorMessage = $"{LoginOperatorName} 제작자가 접속했습니다. 큐시트와 Scene 매핑 상태를 확인하세요."; + } + [RelayCommand] private void RefreshCueSheet() { diff --git a/TornadoAce_CJOnStyle/Views/MainPage.xaml b/TornadoAce_CJOnStyle/Views/MainPage.xaml index 4d6ae47..4338712 100644 --- a/TornadoAce_CJOnStyle/Views/MainPage.xaml +++ b/TornadoAce_CJOnStyle/Views/MainPage.xaml @@ -7,14 +7,69 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vm="using:TornadoAce_CJOnStyle.ViewModels" mc:Ignorable="d"> + + + + + + + + + + + + + + RequestedTheme="Dark" + Visibility="{x:Bind ViewModel.MainShellVisibility, Mode=OneWay}"> @@ -495,5 +550,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TornadoAce_CJOnStyle/Views/MainPage.xaml.cs b/TornadoAce_CJOnStyle/Views/MainPage.xaml.cs index d5de1a4..eed1152 100644 --- a/TornadoAce_CJOnStyle/Views/MainPage.xaml.cs +++ b/TornadoAce_CJOnStyle/Views/MainPage.xaml.cs @@ -10,8 +10,23 @@ namespace TornadoAce_CJOnStyle.Views public MainPage() { this.InitializeComponent(); + Loaded += MainPage_Loaded; } public MainViewModel ViewModel => viewModel; + + private void MainPage_Loaded(object sender, RoutedEventArgs e) + { + LoginIntroStoryboard.Begin(); + LoginLineStoryboard.Begin(); + OperatorNameTextBox.Focus(FocusState.Programmatic); + } + + private async void LoginButton_Click(object sender, RoutedEventArgs e) + { + ViewModel.BeginLogin(OperatorNameTextBox.Text, OperatorPasswordBox.Password); + await Task.Delay(1050); + ViewModel.CompleteLogin(); + } } } diff --git a/docs/initial-architecture.md b/docs/initial-architecture.md index 8cca5d5..d6d6815 100644 --- a/docs/initial-architecture.md +++ b/docs/initial-architecture.md @@ -21,6 +21,12 @@ - 솔루션 구성에서 Deploy 대상이 아니므로 `*.appxrecipe` 산출물을 요구하지 않는다. - VS에서는 `x64` 구성으로 빌드/디버그 실행한다. +## 도입 화면 방향 + +- CargoRadar의 전체 화면 사진형 로그인 도입부를 참고하되, TornadoAce는 방송 CG 제작실/송출 콘솔 분위기로 전환한다. +- CJ ONSTYLE 공식 소개의 `Inspiring Purple` / `Vibrant Lime` 조합을 로그인 카드, 신호 라인, 강조 텍스트의 기준 톤으로 사용한다. +- 현재 로그인은 실제 인증이 아니라 초기 빌드용 진입 게이트이며, 추후 사내 계정/권한 정책이 정해지면 인증 서비스로 교체한다. + ## 다음 설계 결정 지점 - Tornado2와 Tornado3의 어댑터 경계를 같은 인터페이스로 유지할지 여부.