chore: HERV 통합 저장소 재초기화 커밋

손상된 .git 히스토리(missing tree)로 재초기화 후 작업트리 전체 커밋.
.claude/ 만 제외(로컬 에이전트 설정). 구 저장소 백업(.git_corrupt_backup/) 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jeon
2026-06-16 09:29:03 +09:00
commit a502322188
630 changed files with 65126 additions and 0 deletions
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net10.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AirPlanner</RootNamespace>
<AssemblyName>AirPlanner</AssemblyName>
<StartupObject>AirPlanner.App</StartupObject>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
</PropertyGroup>
</Project>
+12
View File
@@ -0,0 +1,12 @@
<Application x:Class="AirPlanner.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
@@ -0,0 +1,8 @@
using System.Windows;
namespace AirPlanner
{
public partial class App : Application
{
}
}
@@ -0,0 +1,37 @@
<UserControl x:Class="AirPlanner.ControlView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
FontFamily="Malgun Gothic, Segoe UI" Background="#FFFFFF">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="210"/>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 카테고리 -->
<Border Grid.Column="0" Background="#F6F7F9" BorderBrush="{StaticResource CardBorder}" BorderThickness="0,0,1,0">
<StackPanel Margin="0,28,0,0">
<Button Style="{StaticResource ZoneBtn}" Content="시스템 에어컨"/>
<Button Style="{StaticResource ZoneBtn}" Content="환기" Foreground="{StaticResource Ink}" FontWeight="Bold"/>
<Button Style="{StaticResource ZoneBtn}" Content="대기전력콘센트"/>
<Button Style="{StaticResource ZoneBtn}" Content="엘리베이터 호출"/>
<Button Style="{StaticResource ZoneBtn}" Content="쿡탑"/>
</StackPanel>
</Border>
<!-- 구역 (클릭 → 우측 전환) -->
<Border Grid.Column="1" Background="#F6F7F9" BorderBrush="{StaticResource CardBorder}" BorderThickness="0,0,1,0">
<StackPanel Margin="0,28,0,0">
<Button x:Name="zAll" Style="{StaticResource ZoneBtn}" Content="전체" Click="Zone_Click" Tag="전체"/>
<Button x:Name="zLiving" Style="{StaticResource ZoneBtn}" Content="거실" Click="Zone_Click" Tag="거실"/>
<Button x:Name="zR1" Style="{StaticResource ZoneBtn}" Content="침실1" Click="Zone_Click" Tag="침실1"/>
<Button x:Name="zR2" Style="{StaticResource ZoneBtn}" Content="침실2" Click="Zone_Click" Tag="침실2"/>
<Button x:Name="zR3" Style="{StaticResource ZoneBtn}" Content="침실3" Click="Zone_Click" Tag="침실3"/>
</StackPanel>
</Border>
<!-- 구역별 콘텐츠 -->
<ContentControl x:Name="ZoneContent" Grid.Column="2"/>
</Grid>
</UserControl>
@@ -0,0 +1,34 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace AirPlanner
{
public partial class ControlView : UserControl
{
static readonly Brush Off = (Brush)new BrushConverter().ConvertFromString("#A6ABB6")!;
static readonly Brush On = (Brush)new BrushConverter().ConvertFromString("#161616")!;
public ControlView()
{
InitializeComponent();
ShowZone("전체", zAll);
}
void Zone_Click(object sender, RoutedEventArgs e)
{
if (sender is Button b && b.Tag is string zone) ShowZone(zone, b);
}
void ShowZone(string zone, Button active)
{
ZoneContent.Content = zone == "전체" ? new VentAllView() : new RoomDetailView(zone);
foreach (var b in new[] { zAll, zLiving, zR1, zR2, zR3 })
{
bool on = b == active;
b.Foreground = on ? On : Off;
b.FontWeight = on ? FontWeights.Bold : FontWeights.Normal;
}
}
}
}
@@ -0,0 +1,154 @@
<UserControl x:Class="AirPlanner.HomeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
FontFamily="Malgun Gothic, Segoe UI" Background="#FFFFFF">
<Grid Margin="26,22,26,22">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="600"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 좌: 환기 상태 -->
<StackPanel Grid.Column="0">
<TextBlock x:Name="txtClock" Text="10월 28일 (월) 오후 12시 37분" FontSize="16" Foreground="#6B7280"/>
<StackPanel Orientation="Horizontal" Margin="0,12,0,0">
<Grid Width="34" Height="34" VerticalAlignment="Center" Margin="0,0,12,0">
<Ellipse Fill="#141417"/>
<TextBlock Text="&#x23FB;" FontFamily="Segoe UI Symbol" FontSize="17" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<TextBlock x:Name="txtState" Text="자동운전 중입니다." FontSize="30" FontWeight="Bold" Foreground="{StaticResource Ink}" VerticalAlignment="Center"/>
</StackPanel>
<!-- 4실 원형 -->
<UniformGrid Columns="2" Rows="2" Width="360" HorizontalAlignment="Left" Margin="40,22,0,0">
<Grid Width="94" Height="94" Margin="0,0,0,18" HorizontalAlignment="Left">
<Ellipse Width="94" Height="94" StrokeThickness="3.5" Stroke="#5FB236" Fill="Transparent"/>
<TextBlock Text="거실" FontSize="17" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<Grid Width="94" Height="94" Margin="0,0,0,18" HorizontalAlignment="Left">
<Ellipse Width="94" Height="94" StrokeThickness="3.5" Stroke="#5BB6E8" Fill="Transparent"/>
<TextBlock Text="침실1" FontSize="17" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<Grid Width="94" Height="94" HorizontalAlignment="Left">
<Ellipse Width="94" Height="94" StrokeThickness="3.5" Stroke="#EF5350" Fill="Transparent"/>
<TextBlock Text="침실2" FontSize="17" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<Grid Width="94" Height="94" HorizontalAlignment="Left">
<Ellipse Width="94" Height="94" StrokeThickness="3.5" Stroke="#F59E0B" Fill="Transparent"/>
<TextBlock Text="침실3" FontSize="17" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</UniformGrid>
<!-- 제어 카드 -->
<Border CornerRadius="14" Background="#FFFFFF" BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5"
Padding="22,18" Margin="0,16,0,0" HorizontalAlignment="Left" Width="560">
<Grid>
<Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions>
<!-- 좌: 4 토글 -->
<StackPanel Grid.Column="0">
<Grid Margin="0,0,0,12"><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="자동운전" Style="{StaticResource ToggleLabel}"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}" IsChecked="True"/></Grid>
<Grid Margin="0,0,0,12"><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="스마트수면" Style="{StaticResource ToggleLabel}"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}"/></Grid>
<Grid Margin="0,0,0,12"><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="쾌적조리" Style="{StaticResource ToggleLabel}"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}" IsChecked="True"/></Grid>
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="안심회복" Style="{StaticResource ToggleLabel}"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}"/></Grid>
</StackPanel>
<!-- 우: 세그먼트 + 알약 + 제습기 연동 -->
<StackPanel Grid.Column="1" Margin="20,0,0,0" VerticalAlignment="Center">
<Border CornerRadius="9" Background="#EFEFF1" Padding="3" HorizontalAlignment="Left" Margin="0,0,0,12">
<StackPanel Orientation="Horizontal">
<RadioButton GroupName="seg" Style="{StaticResource Seg}" Content="Eco"/>
<RadioButton GroupName="seg" Style="{StaticResource Seg}" Content="Normal" IsChecked="True"/>
<RadioButton GroupName="seg" Style="{StaticResource Seg}" Content="Turbo"/>
</StackPanel>
</Border>
<StackPanel Orientation="Horizontal" Margin="0,0,0,12">
<Border CornerRadius="9" BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5" Padding="13,9" Margin="0,0,10,0">
<StackPanel Orientation="Horizontal"><TextBlock Text="운전모드" Style="{StaticResource PillLabel}"/><TextBlock Text="청정환기" Style="{StaticResource PillValue}" Margin="8,0,0,0"/></StackPanel></Border>
<Border CornerRadius="9" BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5" Padding="13,9">
<StackPanel Orientation="Horizontal"><TextBlock Text="풍량" Style="{StaticResource PillLabel}"/><TextBlock Text="3단" Style="{StaticResource PillValue}" Margin="8,0,0,0"/></StackPanel></Border>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="제습기 연동" Style="{StaticResource ToggleLabel}" FontSize="15" Margin="0,0,12,0"/>
<ToggleButton Style="{StaticResource Toggle}"/>
</StackPanel>
</StackPanel>
</Grid>
</Border>
</StackPanel>
<!-- 우: 스마트홈 카드 -->
<UniformGrid Grid.Column="1" Columns="3" Rows="2" Margin="18,0,0,0">
<Border Style="{StaticResource HomeCard}">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions>
<Grid><TextBlock Text="기상정보" Style="{StaticResource CardTitle}"/><TextBlock Text="&#x203A;" Style="{StaticResource CardArrow}"/></Grid>
<StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="&#x26C5;" FontFamily="Segoe UI Emoji" FontSize="54" VerticalAlignment="Center"/>
<TextBlock Text="15&#176;" FontSize="40" FontWeight="Bold" Foreground="{StaticResource Ink}" VerticalAlignment="Center" Margin="14,0,0,0"/>
<TextBlock Text="11&#176; / 23&#176;" FontSize="15" Foreground="{StaticResource Ink2}" VerticalAlignment="Bottom" Margin="12,0,0,12"/>
</StackPanel>
</Grid>
</Border>
<Border Style="{StaticResource HomeCard}">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<Grid><TextBlock Text="엘리베이터 호출" Style="{StaticResource CardTitle}"/><TextBlock Text="&#x203A;" Style="{StaticResource CardArrow}"/></Grid>
<TextBlock Grid.Row="1" Text="7F" FontSize="20" Foreground="{StaticResource Ink2}" Margin="0,8,0,0"/>
<Border Grid.Row="2" CornerRadius="8" BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5" Padding="0,10">
<TextBlock Text="CALL" FontSize="15" Foreground="{StaticResource Ink2}" HorizontalAlignment="Center"/>
</Border>
</Grid>
</Border>
<Border Style="{StaticResource HomeCard}">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<Grid><TextBlock Text="방문차량등록" Style="{StaticResource CardTitle}"/><TextBlock Text="&#x203A;" Style="{StaticResource CardArrow}"/></Grid>
<TextBlock Grid.Row="1" Text="총1대" FontSize="18" Foreground="{StaticResource Ink2}" Margin="0,8,0,0"/>
<TextBlock Grid.Row="3" Foreground="{StaticResource Ink2}" FontSize="15">
<Run Text="잔여마일리지"/><LineBreak/><Run Text="32시간 50분"/>
</TextBlock>
</Grid>
</Border>
<Border Style="{StaticResource HomeCard}">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions>
<Grid><TextBlock Text="주차위치" Style="{StaticResource CardTitle}"/><TextBlock Text="&#x203A;" Style="{StaticResource CardArrow}"/></Grid>
<StackPanel Grid.Row="1" Margin="0,10,0,0">
<Grid Margin="0,0,0,6"><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="B1-A01" FontSize="17" Foreground="{StaticResource Ink2}"/><TextBlock Grid.Column="1" Text="9401" FontSize="17" Foreground="{StaticResource Ink2}"/></Grid>
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="B2-C11" FontSize="17" Foreground="{StaticResource Ink2}"/><TextBlock Grid.Column="1" Text="3486" FontSize="17" Foreground="{StaticResource Ink2}"/></Grid>
</StackPanel>
</Grid>
</Border>
<Border Style="{StaticResource HomeCard}">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions>
<Grid><TextBlock Text="에너지사용량" Style="{StaticResource CardTitle}"/><TextBlock Text="&#x203A;" Style="{StaticResource CardArrow}"/></Grid>
<TextBlock Grid.Row="1" Text="전기 256kwh" FontSize="17" Foreground="{StaticResource Ink2}" Margin="0,10,0,0"/>
</Grid>
</Border>
<Border Style="{StaticResource HomeCard}">
<TextBlock Text="+ 추가" FontSize="18" Foreground="{StaticResource Ink2}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</UniformGrid>
</Grid>
</UserControl>
@@ -0,0 +1,29 @@
using System;
using System.Windows.Controls;
using System.Windows.Threading;
namespace AirPlanner
{
public partial class HomeView : UserControl
{
readonly DispatcherTimer _clock = new() { Interval = TimeSpan.FromSeconds(10) };
public HomeView()
{
InitializeComponent();
_clock.Tick += (_, _) => UpdateClock();
_clock.Start();
UpdateClock();
Unloaded += (_, _) => _clock.Stop();
}
void UpdateClock()
{
var n = DateTime.Now;
string[] dow = { "일", "월", "화", "수", "목", "금", "토" };
string ap = n.Hour < 12 ? "오전" : "오후";
int h12 = n.Hour % 12; if (h12 == 0) h12 = 12;
txtClock.Text = $"{n.Month}월 {n.Day}일 ({dow[(int)n.DayOfWeek]}) {ap} {h12}시 {n.Minute:00}분";
}
}
}
@@ -0,0 +1,37 @@
<Window x:Class="AirPlanner.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="AirPlanner — 에어플래너 (e편한세상)" Height="600" Width="1400"
Background="#141417" FontFamily="Malgun Gothic, Segoe UI"
WindowStartupLocation="CenterScreen">
<Viewbox Stretch="Uniform">
<Grid Width="1400" Height="560" Background="#FFFFFF">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="92"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 좌측 네비게이션 (공유) -->
<Border Grid.Column="0" Background="#141417">
<StackPanel Margin="0,30,0,0">
<Button x:Name="navHome" Style="{StaticResource NavBtn}" Content="홈" Click="Nav_Home"/>
<Button x:Name="navCall" Style="{StaticResource NavBtn}" Content="통화" Click="Nav_Todo"/>
<Button x:Name="navCtrl" Style="{StaticResource NavBtn}" Content="제어" Click="Nav_Control"/>
<Button x:Name="navView" Style="{StaticResource NavBtn}" Content="조회" Click="Nav_Todo"/>
<Button x:Name="navSet" Style="{StaticResource NavBtn}" Content="설정" Click="Nav_Todo"/>
<Button x:Name="navAlarm" Style="{StaticResource NavBtn}" Click="Nav_Todo">
<Grid>
<TextBlock Text="알림" FontSize="18" Foreground="#7B8090"/>
<Ellipse Width="6" Height="6" Fill="#EF4444" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,2,-8,0"/>
</Grid>
</Button>
<Button x:Name="navEmer" Style="{StaticResource NavBtn}" Content="비상" Foreground="#EF4444" Click="Nav_Todo"/>
</StackPanel>
</Border>
<!-- 화면 영역 -->
<ContentControl x:Name="MainContent" Grid.Column="1"/>
</Grid>
</Viewbox>
</Window>
@@ -0,0 +1,37 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace AirPlanner
{
public partial class MainWindow : Window
{
static readonly Brush NavOff = (Brush)new BrushConverter().ConvertFromString("#7B8090")!;
static readonly Brush NavOn = Brushes.White;
public MainWindow()
{
InitializeComponent();
Show("home");
}
void Show(string view)
{
if (view == "control") { MainContent.Content = new ControlView(); SetActive(navCtrl); }
else { MainContent.Content = new HomeView(); SetActive(navHome); }
}
void SetActive(Button active)
{
foreach (var b in new[] { navHome, navCall, navCtrl, navView, navSet })
{
b.Foreground = b == active ? NavOn : NavOff;
b.FontWeight = b == active ? FontWeights.Bold : FontWeights.Normal;
}
}
void Nav_Home(object sender, RoutedEventArgs e) => Show("home");
void Nav_Control(object sender, RoutedEventArgs e) => Show("control");
void Nav_Todo(object sender, RoutedEventArgs e) { /* 통화/조회/설정/알림/비상 — 추후 구현 */ }
}
}
@@ -0,0 +1,51 @@
<UserControl x:Class="AirPlanner.RoomCard"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
FontFamily="Malgun Gothic, Segoe UI">
<Border CornerRadius="12" Background="{StaticResource CardBg}"
BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5" Margin="8" Padding="18,16">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 헤더 : 이름 + 공기질 원 -->
<Grid Grid.Row="0">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock x:Name="NameText" Grid.Column="0" Text="거실" FontSize="20" FontWeight="Bold"
Foreground="{StaticResource Ink}" VerticalAlignment="Center"/>
<Grid Grid.Column="1" Width="64" Height="64">
<Ellipse x:Name="AqRing" Width="64" Height="64" StrokeThickness="3.5" Stroke="{StaticResource AqGood}" Fill="Transparent"/>
<TextBlock x:Name="AqText" Text="좋음" FontSize="13" FontWeight="SemiBold" Width="54" TextAlignment="Center" TextWrapping="Wrap"
Foreground="{StaticResource AqGood}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Grid>
<!-- 센서 4종 (글씨 검정) -->
<StackPanel Grid.Row="1" Margin="2,14,0,0" VerticalAlignment="Top">
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
<TextBlock Text="&#x2022;" Foreground="{StaticResource AqVeryBad}" FontSize="13" Margin="0,0,7,0"/>
<TextBlock x:Name="S0" Text="초미세먼지: 좋음" FontSize="13.5" Foreground="{StaticResource Ink}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
<TextBlock Text="&#x2022;" Foreground="{StaticResource AqVeryBad}" FontSize="13" Margin="0,0,7,0"/>
<TextBlock x:Name="S1" Text="미세먼지: 좋음" FontSize="13.5" Foreground="{StaticResource Ink}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
<TextBlock Text="&#x2022;" Foreground="{StaticResource AqVeryBad}" FontSize="13" Margin="0,0,7,0"/>
<TextBlock x:Name="S2" Text="CO2: 좋음" FontSize="13.5" Foreground="{StaticResource Ink}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#x2022;" Foreground="{StaticResource AqVeryBad}" FontSize="13" Margin="0,0,7,0"/>
<TextBlock x:Name="S3" Text="VOCs: 좋음" FontSize="13.5" Foreground="{StaticResource Ink}"/>
</StackPanel>
</StackPanel>
<!-- ON / Standby / OFF -->
<ToggleButton x:Name="OnBtn" Grid.Row="2" Style="{StaticResource BigToggleBtn}" Content="ON"
Height="48" Margin="0,16,0,0"/>
</Grid>
</Border>
</UserControl>
@@ -0,0 +1,30 @@
using System.Windows.Controls;
using System.Windows.Media;
namespace AirPlanner
{
public partial class RoomCard : UserControl
{
public RoomCard()
{
InitializeComponent();
}
// 실명 / 공기질 텍스트·색 / 센서 4종 상태 / 버튼(ON·Standby·OFF, active=검정)
public void Set(string name, string aqText, Brush aqColor,
string pm25, string pm10, string co2, string voc,
string btnText, bool btnActive)
{
NameText.Text = name;
AqText.Text = aqText;
AqText.Foreground = aqColor;
AqRing.Stroke = aqColor;
S0.Text = $"초미세먼지: {pm25}";
S1.Text = $"미세먼지: {pm10}";
S2.Text = $"CO2: {co2}";
S3.Text = $"VOCs: {voc}";
OnBtn.Content = btnText;
OnBtn.IsChecked = btnActive; // true → 검정(ON/Standby)
}
}
}
@@ -0,0 +1,84 @@
<UserControl x:Class="AirPlanner.RoomDetailView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
FontFamily="Malgun Gothic, Segoe UI" Background="#FFFFFF">
<Grid Margin="40,26,40,26">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 상단 : 전원원형 + 운전모드/토글 -->
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0" Width="200" Height="200" VerticalAlignment="Center" HorizontalAlignment="Center">
<Ellipse Fill="#141417"/>
<TextBlock Text="&#x23FB;" FontFamily="Segoe UI Symbol" FontSize="86" Foreground="White"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<StackPanel Grid.Column="1" VerticalAlignment="Center" Margin="40,0,0,0">
<TextBlock Text="청정환기" FontSize="24" FontWeight="Bold" Foreground="{StaticResource Ink}"/>
<TextBlock Text="자동운전" FontSize="24" FontWeight="Bold" Foreground="{StaticResource Ink}" Margin="0,8,0,16"/>
<!-- 실별 토글 — 코드에서 구성 -->
<StackPanel x:Name="TogglePanel"/>
</StackPanel>
</Grid>
<!-- 하단 : 실내온습도 + 공기질 4종 (같은 줄) -->
<Grid Grid.Row="1" Margin="0,18,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 실내온도 / 실내습도 (크게) -->
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="실내온도" FontSize="17" Foreground="{StaticResource Ink2}" HorizontalAlignment="Center"/>
<TextBlock Text="24&#176;" FontSize="28" FontWeight="Bold" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" Margin="0,4,0,0"/>
</StackPanel>
<Border Width="1" Background="{StaticResource CardBorder}" Margin="26,4,26,4"/>
<StackPanel HorizontalAlignment="Center">
<TextBlock Text="실내습도" FontSize="17" Foreground="{StaticResource Ink2}" HorizontalAlignment="Center"/>
<TextBlock Text="24%" FontSize="28" FontWeight="Bold" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" Margin="0,4,0,0"/>
</StackPanel>
</StackPanel>
<!-- 공기질 4종 (모두 좋음) -->
<UniformGrid Grid.Column="1" Columns="4" VerticalAlignment="Center">
<StackPanel HorizontalAlignment="Center">
<Grid Width="64" Height="64" HorizontalAlignment="Center">
<Ellipse Width="64" Height="64" StrokeThickness="3.5" Stroke="{StaticResource AqGood}" Fill="Transparent"/>
<TextBlock Text="좋음" FontSize="13" FontWeight="SemiBold" Foreground="{StaticResource AqGood}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<TextBlock Text="초미세먼지" FontSize="13" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" Margin="0,8,0,0"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center">
<Grid Width="64" Height="64" HorizontalAlignment="Center">
<Ellipse Width="64" Height="64" StrokeThickness="3.5" Stroke="{StaticResource AqGood}" Fill="Transparent"/>
<TextBlock Text="좋음" FontSize="13" FontWeight="SemiBold" Foreground="{StaticResource AqGood}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<TextBlock Text="미세먼지" FontSize="13" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" Margin="0,8,0,0"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center">
<Grid Width="64" Height="64" HorizontalAlignment="Center">
<Ellipse Width="64" Height="64" StrokeThickness="3.5" Stroke="{StaticResource AqGood}" Fill="Transparent"/>
<TextBlock Text="좋음" FontSize="13" FontWeight="SemiBold" Foreground="{StaticResource AqGood}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<TextBlock Text="이산화탄소" FontSize="13" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" Margin="0,8,0,0"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center">
<Grid Width="64" Height="64" HorizontalAlignment="Center">
<Ellipse Width="64" Height="64" StrokeThickness="3.5" Stroke="{StaticResource AqGood}" Fill="Transparent"/>
<TextBlock Text="좋음" FontSize="13" FontWeight="SemiBold" Foreground="{StaticResource AqGood}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<TextBlock Text="휘발성" FontSize="13" Foreground="{StaticResource Ink}" HorizontalAlignment="Center" Margin="0,8,0,0"/>
<TextBlock Text="유기 화합물" FontSize="13" Foreground="{StaticResource Ink}" HorizontalAlignment="Center"/>
</StackPanel>
</UniformGrid>
</Grid>
</Grid>
</UserControl>
@@ -0,0 +1,34 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace AirPlanner
{
public partial class RoomDetailView : UserControl
{
// 거실 : 표시램프만
// 침실1 : 안심회복 + 표시램프 + 제습기 연동 (안심회복은 침실1 전용)
// 침실2·침실3 : 표시램프 + 제습기 연동
public RoomDetailView(string roomName)
{
InitializeComponent();
bool isBedroom = roomName != "거실";
if (roomName == "침실1") TogglePanel.Children.Add(MakeRow("안심회복", false));
TogglePanel.Children.Add(MakeRow("표시램프", true));
if (isBedroom) TogglePanel.Children.Add(MakeRow("제습기 연동", false));
}
FrameworkElement MakeRow(string label, bool on)
{
var sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 12) };
sp.Children.Add(new TextBlock
{
Text = label, FontSize = 18, VerticalAlignment = VerticalAlignment.Center,
Foreground = (Brush)FindResource("Ink"), Margin = new Thickness(0, 0, 12, 0), MinWidth = 86
});
sp.Children.Add(new ToggleButton { Style = (Style)FindResource("Toggle"), IsChecked = on });
return sp;
}
}
}
@@ -0,0 +1,178 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- ===== 색상 ===== -->
<Color x:Key="cBg">#FFFFFF</Color>
<SolidColorBrush x:Key="Bg" Color="#FFFFFF"/>
<SolidColorBrush x:Key="CardBg" Color="#FFFFFF"/>
<SolidColorBrush x:Key="CardBorder" Color="#E5E7EB"/>
<SolidColorBrush x:Key="Ink" Color="#161616"/>
<SolidColorBrush x:Key="Ink2" Color="#6B7280"/>
<SolidColorBrush x:Key="TrackOff" Color="#E3E5EA"/>
<SolidColorBrush x:Key="ThumbBr" Color="#FFFFFF"/>
<!-- 공기질 4단계 -->
<SolidColorBrush x:Key="AqGood" Color="#3B82F6"/> <!-- 좋음 파랑 -->
<SolidColorBrush x:Key="AqNormal" Color="#22C55E"/> <!-- 보통 초록 -->
<SolidColorBrush x:Key="AqBad" Color="#F59E0B"/> <!-- 나쁨 주황 -->
<SolidColorBrush x:Key="AqVeryBad" Color="#EF4444"/> <!-- 매우나쁨 빨강 -->
<!-- ===== iOS 스타일 토글 스위치 ===== -->
<Style x:Key="Toggle" TargetType="ToggleButton">
<Setter Property="Width" Value="50"/>
<Setter Property="Height" Value="29"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Grid>
<Border x:Name="track" CornerRadius="15" Background="{StaticResource TrackOff}"/>
<Ellipse x:Name="thumb" Width="23" Height="23" Fill="{StaticResource ThumbBr}"
HorizontalAlignment="Left" Margin="3,0,0,0">
<Ellipse.Effect><DropShadowEffect BlurRadius="4" ShadowDepth="1" Opacity="0.25"/></Ellipse.Effect>
</Ellipse>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="track" Property="Background" Value="{StaticResource Ink}"/>
<Setter TargetName="thumb" Property="HorizontalAlignment" Value="Right"/>
<Setter TargetName="thumb" Property="Margin" Value="0,0,3,0"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" Value="0.35"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 토글 행 라벨 -->
<Style x:Key="ToggleLabel" TargetType="TextBlock">
<Setter Property="FontSize" Value="17"/>
<Setter Property="Foreground" Value="{StaticResource Ink}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<!-- ===== 큰 ON/OFF 버튼 (전체/각실) ===== -->
<Style x:Key="BigToggleBtn" TargetType="ToggleButton">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="FontSize" Value="20"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Foreground" Value="{StaticResource Ink2}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border x:Name="b" CornerRadius="10" Background="{StaticResource CardBg}"
BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="b" Property="Background" Value="{StaticResource Ink}"/>
<Setter TargetName="b" Property="BorderBrush" Value="{StaticResource Ink}"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ===== 좌측 네비 버튼 ===== -->
<Style x:Key="NavBtn" TargetType="Button">
<Setter Property="Foreground" Value="#7B8090"/>
<Setter Property="FontSize" Value="18"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Margin" Value="0,0,0,30"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="Transparent" Padding="0,2">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ===== 카테고리/구역 리스트 버튼 ===== -->
<Style x:Key="ZoneBtn" TargetType="Button">
<Setter Property="Foreground" Value="#A6ABB6"/>
<Setter Property="FontSize" Value="18"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Margin" Value="0,0,0,40"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="Transparent" Padding="0,2">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ===== Eco/Normal/Turbo 세그먼트 (RadioButton) ===== -->
<Style x:Key="Seg" TargetType="RadioButton">
<Setter Property="Foreground" Value="#6B7280"/>
<Setter Property="FontSize" Value="15"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Padding" Value="18,7"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Border x:Name="b" CornerRadius="7" Background="Transparent" Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="b" Property="Background" Value="White"/>
<Setter Property="Foreground" Value="{StaticResource Ink}"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter TargetName="b" Property="Effect">
<Setter.Value><DropShadowEffect BlurRadius="5" ShadowDepth="1" Opacity="0.18"/></Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- ===== 스마트홈 카드 (홈 우측) ===== -->
<Style x:Key="HomeCard" TargetType="Border">
<Setter Property="CornerRadius" Value="14"/>
<Setter Property="Background" Value="{StaticResource CardBg}"/>
<Setter Property="BorderBrush" Value="{StaticResource CardBorder}"/>
<Setter Property="BorderThickness" Value="1.5"/>
<Setter Property="Padding" Value="18,14"/>
<Setter Property="Margin" Value="8"/>
</Style>
<Style x:Key="CardTitle" TargetType="TextBlock">
<Setter Property="FontSize" Value="18"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Foreground" Value="{StaticResource Ink}"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
<Style x:Key="CardArrow" TargetType="TextBlock">
<Setter Property="FontSize" Value="20"/>
<Setter Property="Foreground" Value="{StaticResource Ink2}"/>
<Setter Property="HorizontalAlignment" Value="Right"/>
<Setter Property="VerticalAlignment" Value="Top"/>
</Style>
<!-- ===== 상태 알약 (운전모드/풍량) ===== -->
<Style x:Key="PillLabel" TargetType="TextBlock">
<Setter Property="FontSize" Value="14"/>
<Setter Property="Foreground" Value="{StaticResource Ink2}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style x:Key="PillValue" TargetType="TextBlock">
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="{StaticResource Ink}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="10,0,0,0"/>
</Style>
</ResourceDictionary>
@@ -0,0 +1,69 @@
<UserControl x:Class="AirPlanner.VentAllView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AirPlanner"
FontFamily="Malgun Gothic, Segoe UI" Background="#FFFFFF">
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="14,14,8,14">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/><ColumnDefinition Width="*"/><ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/><RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 전체 제어 카드 (2열 차지) -->
<Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Style="{StaticResource HomeCard}">
<Grid>
<Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="Auto"/></Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="전체" FontSize="20" FontWeight="Bold" Foreground="{StaticResource Ink}" VerticalAlignment="Top" Margin="0,2,0,0"/>
<!-- 토글 4 -->
<StackPanel Grid.Column="1" HorizontalAlignment="Center">
<Grid Margin="0,0,0,11"><Grid.ColumnDefinitions><ColumnDefinition Width="92"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="자동운전" Style="{StaticResource ToggleLabel}" FontSize="15"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}" IsChecked="True"/></Grid>
<Grid Margin="0,0,0,11"><Grid.ColumnDefinitions><ColumnDefinition Width="92"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="스마트수면" Style="{StaticResource ToggleLabel}" FontSize="15"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}"/></Grid>
<Grid Margin="0,0,0,11"><Grid.ColumnDefinitions><ColumnDefinition Width="92"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="쾌적조리" Style="{StaticResource ToggleLabel}" FontSize="15"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}" IsChecked="True"/></Grid>
<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="92"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<TextBlock Text="안심회복" Style="{StaticResource ToggleLabel}" FontSize="15"/>
<ToggleButton Grid.Column="1" Style="{StaticResource Toggle}"/></Grid>
</StackPanel>
<!-- 알약 3 (자동운전/운전모드/풍량) -->
<StackPanel Grid.Column="2" VerticalAlignment="Center" Margin="14,0,0,0">
<Border CornerRadius="9" BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5" Padding="13,9" Margin="0,0,0,9">
<StackPanel Orientation="Horizontal"><TextBlock Text="자동운전" Style="{StaticResource PillLabel}"/><TextBlock Text="Normal" Style="{StaticResource PillValue}" Margin="8,0,0,0"/></StackPanel></Border>
<Border CornerRadius="9" BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5" Padding="13,9" Margin="0,0,0,9">
<StackPanel Orientation="Horizontal"><TextBlock Text="운전모드" Style="{StaticResource PillLabel}"/><TextBlock Text="청정환기" Style="{StaticResource PillValue}" Margin="8,0,0,0"/></StackPanel></Border>
<Border CornerRadius="9" BorderBrush="{StaticResource CardBorder}" BorderThickness="1.5" Padding="13,9">
<StackPanel Orientation="Horizontal"><TextBlock Text="풍량" Style="{StaticResource PillLabel}"/><TextBlock Text="3단" Style="{StaticResource PillValue}" Margin="8,0,0,0"/></StackPanel></Border>
</StackPanel>
</Grid>
<!-- 하단 : ON + 제습기 연동 -->
<Grid Grid.Row="1" Margin="0,16,0,0">
<Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions>
<ToggleButton Grid.Column="0" Style="{StaticResource BigToggleBtn}" Content="ON" IsChecked="True" Height="46" Margin="0,0,16,0"/>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="제습기 연동" Style="{StaticResource ToggleLabel}" FontSize="15" Margin="0,0,12,0"/>
<ToggleButton Style="{StaticResource Toggle}"/>
</StackPanel>
</Grid>
</Grid>
</Border>
<local:RoomCard x:Name="cLiving" Grid.Row="0" Grid.Column="2"/>
<local:RoomCard x:Name="cR1" Grid.Row="1" Grid.Column="0"/>
<local:RoomCard x:Name="cR2" Grid.Row="1" Grid.Column="1"/>
<local:RoomCard x:Name="cR3" Grid.Row="1" Grid.Column="2"/>
</Grid>
</ScrollViewer>
</UserControl>
@@ -0,0 +1,22 @@
using System.Windows.Controls;
using System.Windows.Media;
namespace AirPlanner
{
public partial class VentAllView : UserControl
{
public VentAllView()
{
InitializeComponent();
Loaded += (_, _) =>
{
cLiving.Set("거실", "좋음", Aq("AqGood"), "좋음", "좋음", "좋음", "좋음", "Standby", true);
cR1.Set("침실1", "좋음", Aq("AqGood"), "좋음", "좋음", "좋음", "좋음", "Standby", true);
cR2.Set("침실2", "보통", Aq("AqNormal"), "좋음", "좋음", "보통", "보통", "ON", true);
cR3.Set("침실3", "나쁨", Aq("AqBad"), "좋음", "좋음", "보통", "나쁨", "ON", true);
};
}
Brush Aq(string key) => (Brush)FindResource(key);
}
}