releases/VideoDownloader.App/Browser/GlanceWindow.xaml.cs

66 lines
2.9 KiB
C#

using System.Windows.Controls;
using System.Windows;
using System.Windows.Interop;
using Microsoft.Web.WebView2.Core;
using VideoDownloader.Core.Config;
using Wv2 = Microsoft.Web.WebView2.Wpf;
namespace VideoDownloader.App.Browser;
/// <summary>T2-6 Glance: Alt+클릭 링크의 플로팅 미리보기(Zen Glance 패턴) — 닫기/탭으로 승격.</summary>
public partial class GlanceWindow : Window
{
private readonly Wv2.WebView2 _web = new() { DefaultBackgroundColor = System.Drawing.Color.Black };
private readonly CoreWebView2Environment _env;
private readonly AppConfig _config;
public string Url { get; }
public event Action<GlanceWindow>? ExpandRequested;
public GlanceWindow(CoreWebView2Environment env, AppConfig config, string url)
{
_env = env;
_config = config;
Url = url;
Width = 720; Height = 520;
WindowStartupLocation = WindowStartupLocation.CenterOwner;
ResizeMode = ResizeMode.CanResize;
var bar = new Border
{
Background = System.Windows.Media.Brushes.Black,
Padding = new Thickness(8, 6, 8, 6)
};
var dock = new DockPanel();
var close = new Button { Content = "✕ 닫기", Padding = new Thickness(10, 3, 10, 3), Margin = new Thickness(4, 0, 4, 0), Background = System.Windows.Media.Brushes.Transparent, Foreground = System.Windows.Media.Brushes.White, BorderBrush = System.Windows.Media.Brushes.Gray };
close.Click += (_, _) => Close();
var expand = new Button { Content = "⤢ 탭으로 열기", Padding = new Thickness(10, 3, 10, 3), Background = System.Windows.Media.Brushes.Transparent, Foreground = System.Windows.Media.Brushes.White, BorderBrush = System.Windows.Media.Brushes.Gray };
expand.Click += (_, _) => ExpandRequested?.Invoke(this);
var title = new TextBlock { Text = url, Foreground = System.Windows.Media.Brushes.LightGray, FontSize = 11, VerticalAlignment = VerticalAlignment.Center, TextTrimming = TextTrimming.CharacterEllipsis };
DockPanel.SetDock(close, Dock.Right);
DockPanel.SetDock(expand, Dock.Right);
dock.Children.Add(close);
dock.Children.Add(expand);
dock.Children.Add(title);
bar.Child = dock;
var grid = new Grid { RowDefinitions = { new RowDefinition { Height = GridLength.Auto }, new RowDefinition { Height = new GridLength(1, GridUnitType.Star) } } };
Grid.SetRow(bar, 0); Grid.SetRow(_web, 1);
grid.Children.Add(bar);
grid.Children.Add(_web);
Content = grid;
Loaded += async (_, _) =>
{
try
{
var options = _env.CreateCoreWebView2ControllerOptions();
if (_config.PrivateMode) options.IsInPrivateModeEnabled = true;
await _web.EnsureCoreWebView2Async(_env, options);
_web.CoreWebView2!.Navigate(url);
}
catch { }
};
}
}