From eb5552bf7144e2059b14934f1079642c984f78c9 Mon Sep 17 00:00:00 2001 From: Alexandru Macocian Date: Thu, 8 Apr 2021 16:03:28 +0200 Subject: [PATCH] Ability to maximize/resize browsers --- Daybreak/Controls/ChromiumBrowserWrapper.xaml | 7 +++- .../Controls/ChromiumBrowserWrapper.xaml.cs | 41 ++++++++++++++++-- Daybreak/Controls/MaximizeButton.xaml | 39 +++++++++++++++++ Daybreak/Controls/MaximizeButton.xaml.cs | 37 ++++++++++++++++ Daybreak/Daybreak.csproj | 4 ++ Daybreak/Launch/MainWindow.xaml.cs | 1 - Daybreak/Views/StartupView.xaml | 22 ++++++---- Daybreak/Views/StartupView.xaml.cs | 42 ++++++++++++++++++- 8 files changed, 177 insertions(+), 16 deletions(-) create mode 100644 Daybreak/Controls/MaximizeButton.xaml create mode 100644 Daybreak/Controls/MaximizeButton.xaml.cs diff --git a/Daybreak/Controls/ChromiumBrowserWrapper.xaml b/Daybreak/Controls/ChromiumBrowserWrapper.xaml index 37452e05..c017c812 100644 --- a/Daybreak/Controls/ChromiumBrowserWrapper.xaml +++ b/Daybreak/Controls/ChromiumBrowserWrapper.xaml @@ -52,9 +52,14 @@ BorderThickness="1" VerticalAlignment="Center" VerticalContentAlignment="Center" BorderBrush="{Binding ElementName=_this, Path=Foreground, Mode=OneWay}" PreviewKeyDown="TextBox_PreviewKeyDown"> - + + + diff --git a/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs b/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs index 2701acce..938c1b28 100644 --- a/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs +++ b/Daybreak/Controls/ChromiumBrowserWrapper.xaml.cs @@ -20,6 +20,7 @@ public partial class ChromiumBrowserWrapper : UserControl public readonly static DependencyProperty AddressBarReadonlyProperty = DependencyPropertyExtensions.Register(nameof(AddressBarReadonly)); public event EventHandler FavoriteUriChanged; + public event EventHandler MaximizeClicked; private readonly CoreWebView2Environment coreWebView2Environment; private readonly IConfigurationManager configurationManager; @@ -62,6 +63,11 @@ protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) } } + public void ReinitializeBrowser() + { + this.InitializeBrowser(); + } + private async void InitializeBrowser() { await this.WebBrowser.EnsureCoreWebView2Async(this.coreWebView2Environment); @@ -76,7 +82,8 @@ private void TextBox_PreviewKeyDown(object sender, System.Windows.Input.KeyEvent if (e.Key == System.Windows.Input.Key.Enter) { var newAddress = sender.As().Text; - if (string.IsNullOrWhiteSpace(newAddress)) + newAddress = SanitizeAddress(newAddress); + if (newAddress is null) { return; } @@ -95,19 +102,19 @@ private void UserControl_Unloaded(object sender, RoutedEventArgs e) private void BackButton_Clicked(object sender, EventArgs e) { this.WebBrowser.GoBack(); - this.Address = this.WebBrowser.Source.AbsoluteUri; + this.Address = this.WebBrowser.Source.ToString(); } private void ForwardButton_Clicked(object sender, EventArgs e) { this.WebBrowser.GoForward(); - this.Address = this.WebBrowser.Source.AbsoluteUri; + this.Address = this.WebBrowser.Source.ToString(); } private void RefreshGlyph_Clicked(object sender, EventArgs e) { this.WebBrowser.Reload(); - this.Address = this.WebBrowser.Source.AbsoluteUri; + this.Address = this.WebBrowser.Source.ToString(); } private void CancelGlyph_Clicked(object sender, EventArgs e) @@ -121,6 +128,11 @@ private void StarGlyph_Clicked(object sender, EventArgs e) this.FavoriteUriChanged?.Invoke(this, this.FavoriteAddress); } + private void MaximizeButton_Clicked(object sender, EventArgs e) + { + this.MaximizeClicked?.Invoke(this, e); + } + private void CheckFavoriteAddress() { if (this.Address == this.FavoriteAddress) @@ -132,5 +144,26 @@ private void CheckFavoriteAddress() this.FavoriteButton.IsEnabled = true; } } + + private static string SanitizeAddress(string address) + { + if (string.IsNullOrWhiteSpace(address)) + { + return null; + } + + if (address.StartsWith("www") is false && + address.StartsWith("http") is false) + { + address = "https://www." + address; + } + else if (address.StartsWith("www")) + { + address = "https://" + address; + } + + Uri.TryCreate(address, UriKind.Absolute, out var uri); + return uri?.ToString(); + } } } diff --git a/Daybreak/Controls/MaximizeButton.xaml b/Daybreak/Controls/MaximizeButton.xaml new file mode 100644 index 00000000..d0bf4970 --- /dev/null +++ b/Daybreak/Controls/MaximizeButton.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Daybreak/Controls/MaximizeButton.xaml.cs b/Daybreak/Controls/MaximizeButton.xaml.cs new file mode 100644 index 00000000..8f7d9c2c --- /dev/null +++ b/Daybreak/Controls/MaximizeButton.xaml.cs @@ -0,0 +1,37 @@ +using System; +using System.Windows.Controls; +using System.Windows.Input; + +namespace Daybreak.Controls +{ + /// + /// Interaction logic for SaveButton.xaml + /// + public partial class MaximizeButton : UserControl + { + public event EventHandler Clicked; + + public MaximizeButton() + { + InitializeComponent(); + } + + private void Ellipse_MouseEnter(object sender, MouseEventArgs e) + { + BackgroundEllipse.Visibility = System.Windows.Visibility.Visible; + } + + private void Ellipse_MouseLeave(object sender, MouseEventArgs e) + { + BackgroundEllipse.Visibility = System.Windows.Visibility.Hidden; + } + + private void Ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + { + Clicked?.Invoke(this, e); + } + } + } +} diff --git a/Daybreak/Daybreak.csproj b/Daybreak/Daybreak.csproj index 2bd4f82f..6450b31a 100644 --- a/Daybreak/Daybreak.csproj +++ b/Daybreak/Daybreak.csproj @@ -37,6 +37,10 @@ + + $(DefaultXamlRuntime) + Designer + $(DefaultXamlRuntime) Designer diff --git a/Daybreak/Launch/MainWindow.xaml.cs b/Daybreak/Launch/MainWindow.xaml.cs index 7e5002e1..66b201c0 100644 --- a/Daybreak/Launch/MainWindow.xaml.cs +++ b/Daybreak/Launch/MainWindow.xaml.cs @@ -134,7 +134,6 @@ private void SetImage(ImageSource imageSource) { var avgColor = GetAverageColor(bitmapImage); var luminace = GetLuminace(avgColor); - Debug.WriteLine(luminace); if (luminace < 0.15) { this.Foreground = Brushes.White; diff --git a/Daybreak/Views/StartupView.xaml b/Daybreak/Views/StartupView.xaml index d95e0671..83053d94 100644 --- a/Daybreak/Views/StartupView.xaml +++ b/Daybreak/Views/StartupView.xaml @@ -14,7 +14,7 @@ - + @@ -28,13 +28,17 @@ Foreground="White" FontSize="36" Width="250" Height="60" VerticalAlignment="Bottom" Margin="0, 0, 0, 30" IsEnabled="{Binding ElementName=_this, Path=LaunchButtonEnabled, Mode=OneWay}" Clicked="OpaqueButton_Clicked" Grid.Row="1" Grid.ColumnSpan="3"> - - - - + + + + + + diff --git a/Daybreak/Views/StartupView.xaml.cs b/Daybreak/Views/StartupView.xaml.cs index 9cf5eaa5..44a72911 100644 --- a/Daybreak/Views/StartupView.xaml.cs +++ b/Daybreak/Views/StartupView.xaml.cs @@ -1,4 +1,5 @@ -using Daybreak.Services.ApplicationDetection; +using Daybreak.Controls; +using Daybreak.Services.ApplicationDetection; using Daybreak.Services.Configuration; using Daybreak.Services.ViewManagement; using System; @@ -31,6 +32,9 @@ public partial class StartupView : UserControl private readonly IConfigurationManager configurationManager; private readonly CancellationTokenSource cancellationTokenSource = new(); + private bool leftBrowserMaximized = false; + private bool rightBrowserMaximized = false; + public string RightBrowserFavoriteAddress { get => this.GetTypedValue(RightBrowserFavoriteAddressProperty); @@ -130,5 +134,41 @@ private void RightBrowser_FavoriteUriChanged(object sender, string e) config.RightBrowserDefault = e; this.configurationManager.SaveConfiguration(config); } + + private void LeftChromiumBrowserWrapper_MaximizeClicked(object sender, EventArgs e) + { + if (this.leftBrowserMaximized) + { + this.ViewContainer.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[2].Width = new GridLength(1, GridUnitType.Star); + } + else + { + this.ViewContainer.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[1].Width = new GridLength(0, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[2].Width = new GridLength(0, GridUnitType.Star); + } + + this.leftBrowserMaximized = !this.leftBrowserMaximized; + } + + private void RightChromiumBrowserWrapper_MaximizeClicked(object sender, EventArgs e) + { + if (this.rightBrowserMaximized) + { + this.ViewContainer.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[2].Width = new GridLength(1, GridUnitType.Star); + } + else + { + this.ViewContainer.ColumnDefinitions[0].Width = new GridLength(0, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[1].Width = new GridLength(0, GridUnitType.Star); + this.ViewContainer.ColumnDefinitions[2].Width = new GridLength(1, GridUnitType.Star); + } + + this.rightBrowserMaximized = !this.rightBrowserMaximized; + } } }