Files
2026-07-04 10:34:46 +09:00

195 lines
12 KiB
XML

<Window x:Class="Character_Builder.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"
Title="Dansori · Character Builder" Height="1040" Width="1560"
MinHeight="760" MinWidth="1320"
WindowStyle="None" WindowState="Maximized" WindowStartupLocation="CenterScreen"
Background="Transparent"
FontFamily="Segoe UI Variable, Segoe UI">
<shell:WindowChrome.WindowChrome>
<shell:WindowChrome CaptionHeight="52" ResizeBorderThickness="6"
GlassFrameThickness="0" CornerRadius="0" UseAeroCaptionButtons="False"/>
</shell:WindowChrome.WindowChrome>
<Border x:Name="RootBorder" Background="{StaticResource Bg}"
BorderBrush="{StaticResource Stroke}" BorderThickness="1">
<Grid Margin="16">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- ===== TOP BAR ===== -->
<Grid Grid.Row="0" Margin="4,0,4,14">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<Border Width="12" Height="12" CornerRadius="6" Background="{StaticResource Accent}" Margin="0,0,12,0"/>
<TextBlock Text="Character Builder" FontSize="28" FontWeight="Bold"/>
<TextBlock Text="Dansori 캐릭터 조합기" Foreground="{StaticResource Mute}"
FontSize="18" VerticalAlignment="Bottom" Margin="12,0,0,4"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
shell:WindowChrome.IsHitTestVisibleInChrome="True">
<Button x:Name="BtnRoot" Content="📁 루트" Click="Root_Click" Margin="0,0,8,0"/>
<Button x:Name="BtnLoad" Content="↥ 불러오기" Click="Load_Click" Margin="0,0,8,0"/>
<Button x:Name="BtnReset" Content="⟲ 초기화" Click="Reset_Click" Margin="0,0,8,0"/>
<Button x:Name="BtnSave" Content="💾 저장" Click="Save_Click" Style="{StaticResource AccentButton}"/>
<Border Width="1" Background="{StaticResource Stroke}" Margin="12,4,10,4"/>
<Button x:Name="BtnMin" Style="{StaticResource CaptionButton}" Click="Min_Click">
<Path Data="M0,5 H11" Stroke="{StaticResource Dim}" StrokeThickness="1.3"/>
</Button>
<Button x:Name="BtnMax" Style="{StaticResource CaptionButton}" Click="Max_Click" Margin="2,0">
<Path Data="M0,0 H10 V10 H0 Z" Stroke="{StaticResource Dim}" StrokeThickness="1.3" Fill="Transparent"/>
</Button>
<Button x:Name="BtnClose" Style="{StaticResource CaptionClose}" Click="Close_Click">
<Path Data="M0,0 L10,10 M0,10 L10,0" Stroke="{StaticResource Dim}" StrokeThickness="1.3"/>
</Button>
</StackPanel>
</Grid>
<!-- ===== MAIN ===== -->
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="440"/>
</Grid.ColumnDefinitions>
<!-- Character list -->
<Border Grid.Column="0" Style="{StaticResource Card}" Margin="0,0,14,0">
<DockPanel Margin="12">
<TextBlock DockPanel.Dock="Top" Text="캐릭터" FontWeight="Bold" FontSize="21" Margin="2,2,0,12"/>
<ListBox x:Name="CharList" Background="Transparent" BorderThickness="0"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
SelectionChanged="CharList_SelectionChanged">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Margin" Value="0,0,0,8"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border x:Name="bd" CornerRadius="10" Background="{StaticResource Panel2}"
BorderBrush="{StaticResource Stroke}" BorderThickness="1" Padding="8">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="bd" Property="BorderBrush" Value="{StaticResource Accent}"/>
<Setter TargetName="bd" Property="Background" Value="#12344A"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="bd" Property="BorderBrush" Value="{StaticResource Accent}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Border CornerRadius="8" Height="150" ClipToBounds="True" Background="#0E0F14">
<Image Source="{Binding Thumb}" Stretch="Uniform" Margin="4"/>
</Border>
<TextBlock Text="{Binding Name}" FontWeight="SemiBold" FontSize="19"
Margin="2,9,0,2" TextTrimming="CharacterEllipsis"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
</Border>
<!-- Preview -->
<Border Grid.Column="1" Style="{StaticResource Card}" Margin="0,0,14,0">
<DockPanel Margin="14">
<Grid DockPanel.Dock="Top" Margin="2,0,2,10">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock x:Name="TxtCharName" Text="캐릭터를 선택하세요" FontSize="22" FontWeight="Bold"/>
</StackPanel>
<Button x:Name="BtnPlay" Content="▶ 제스처 미리보기" Click="Play_Click"
HorizontalAlignment="Right" Width="210"/>
</Grid>
<Border Background="#0E0F14" CornerRadius="10" BorderBrush="{StaticResource Stroke}" BorderThickness="1">
<Grid>
<TextBlock x:Name="PreviewHint" Text="왼쪽에서 캐릭터를 고른 뒤, 오른쪽에서 파츠를 조합하세요."
Foreground="{StaticResource Mute}" HorizontalAlignment="Center"
VerticalAlignment="Center" TextWrapping="Wrap" TextAlignment="Center" MaxWidth="320"/>
<Viewbox Stretch="Uniform" Margin="16">
<Grid x:Name="StageHost" Width="540" Height="680"
Background="Transparent" Cursor="SizeAll"
MouseLeftButtonDown="Stage_MouseDown"
MouseMove="Stage_MouseMove"
MouseLeftButtonUp="Stage_MouseUp">
<Grid x:Name="Stage" Width="540" Height="680"/>
</Grid>
</Viewbox>
</Grid>
</Border>
</DockPanel>
</Border>
<!-- Controls -->
<Border Grid.Column="2" Style="{StaticResource Card}">
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="14,10,14,14">
<StackPanel>
<TextBlock Text="조합" FontWeight="Bold" FontSize="21" Margin="2,2,0,4"/>
<TextBlock Text="바디 / 제스처" Style="{StaticResource Label}"/>
<ComboBox x:Name="CmbBody" SelectionChanged="Body_Changed"/>
<TextBlock Text="헤어 모양" Style="{StaticResource Label}"/>
<ComboBox x:Name="CmbShape" SelectionChanged="Shape_Changed"/>
<TextBlock Text="표정" Style="{StaticResource Label}"/>
<ComboBox x:Name="CmbExpr" SelectionChanged="Expr_Changed"/>
<TextBlock Text="헤어 색상 (코드 틴트)" Style="{StaticResource Label}"/>
<WrapPanel x:Name="SwatchPanel"/>
<TextBlock Text="악세서리" Style="{StaticResource Label}"/>
<Border Background="{StaticResource Panel2}" BorderBrush="{StaticResource Stroke}"
BorderThickness="1" CornerRadius="8" Padding="10,6" MinHeight="40" MaxHeight="230">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel x:Name="AccPanel"/>
</ScrollViewer>
</Border>
<TextBlock Text="레이어 위치/크기 조정" Style="{StaticResource Label}"/>
<ComboBox x:Name="CmbLayer" SelectionChanged="Layer_Changed"/>
<Grid Margin="0,8,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="34"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="X" Foreground="{StaticResource Dim}" VerticalAlignment="Center"/>
<Slider x:Name="SldX" Grid.Row="0" Grid.Column="1" Minimum="-400" Maximum="400" ValueChanged="LayerXform_Changed"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Y" Foreground="{StaticResource Dim}" VerticalAlignment="Center"/>
<Slider x:Name="SldY" Grid.Row="1" Grid.Column="1" Minimum="-400" Maximum="400" ValueChanged="LayerXform_Changed"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="⤢" Foreground="{StaticResource Dim}" VerticalAlignment="Center"/>
<Slider x:Name="SldScale" Grid.Row="2" Grid.Column="1" Minimum="0.1" Maximum="1.6" ValueChanged="LayerXform_Changed"/>
</Grid>
<Button Content="🎯 머리 자동 정렬" Click="AutoAlign_Click" Margin="0,10,0,0"/>
<TextBlock Text="미리보기에서 드래그하면 위 목록에서 선택한 레이어가 이동합니다."
Foreground="{StaticResource Mute}" FontSize="16" TextWrapping="Wrap" Margin="2,10,0,0"/>
</StackPanel>
</ScrollViewer>
</Border>
</Grid>
<!-- ===== STATUS ===== -->
<TextBlock x:Name="TxtStatus" Grid.Row="2" Margin="4,10,4,0"
Foreground="{StaticResource Mute}" FontSize="17" Text="준비"/>
</Grid>
</Border>
</Window>