diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs index 0ea500c0..3a1900d5 100644 --- a/Wino.Mail.ViewModels/MailListPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -120,6 +120,12 @@ namespace Wino.Mail.ViewModels [ObservableProperty] private string barMessage; + [ObservableProperty] + private double mailListLength = 300; + + [ObservableProperty] + private double maxMailListLength = 1200; + [ObservableProperty] private string barTitle; diff --git a/Wino.Mail/Converters/GridLengthConverter.cs b/Wino.Mail/Converters/GridLengthConverter.cs new file mode 100644 index 00000000..14eb8321 --- /dev/null +++ b/Wino.Mail/Converters/GridLengthConverter.cs @@ -0,0 +1,27 @@ +using System; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml; + +namespace Wino.Converters +{ + public class GridLengthConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, string language) + { + if (value is double doubleValue) + { + return new GridLength(doubleValue); + } + return new GridLength(1, GridUnitType.Auto); + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + if (value is GridLength gridLength) + { + return gridLength.Value; + } + return 0.0; + } + } +} diff --git a/Wino.Mail/Styles/Converters.xaml b/Wino.Mail/Styles/Converters.xaml index 0ef5e1cb..ec5a46a4 100644 --- a/Wino.Mail/Styles/Converters.xaml +++ b/Wino.Mail/Styles/Converters.xaml @@ -4,4 +4,5 @@ xmlns:converters="using:Wino.Converters"> + diff --git a/Wino.Mail/Views/MailListPage.xaml b/Wino.Mail/Views/MailListPage.xaml index 837ae05c..4a31671e 100644 --- a/Wino.Mail/Views/MailListPage.xaml +++ b/Wino.Mail/Views/MailListPage.xaml @@ -6,6 +6,7 @@ xmlns:collections="using:CommunityToolkit.Mvvm.Collections" xmlns:controls="using:Wino.Controls" xmlns:controls1="using:CommunityToolkit.WinUI.Controls" + xmlns:converters="using:Wino.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:domain="using:Wino.Core.Domain" xmlns:enums="using:Wino.Core.Domain.Enums" @@ -20,9 +21,8 @@ xmlns:ui="using:Microsoft.Toolkit.Uwp.UI" xmlns:viewModelData="using:Wino.Mail.ViewModels.Data" xmlns:wino="using:Wino" - xmlns:converters="using:Wino.Converters" x:Name="root" - Loaded="MailListPageLoaded" + SizeChanged="Page_SizeChanged" mc:Ignorable="d"> @@ -181,11 +181,11 @@ - + - + @@ -615,11 +612,11 @@ + - + + VerticalAlignment="Center" + Opacity="0.5" + Spacing="6"> - + + Text="{x:Bind ViewModel.SelectedMessageText, Mode=OneWay}" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Wino.Mail/Views/MailListPage.xaml.cs b/Wino.Mail/Views/MailListPage.xaml.cs index 80617854..b54b924f 100644 --- a/Wino.Mail/Views/MailListPage.xaml.cs +++ b/Wino.Mail/Views/MailListPage.xaml.cs @@ -42,6 +42,7 @@ namespace Wino.Views { private const string NarrowVisualStateKey = "NarrowState"; private const string AdaptivenessStatesKey = "AdaptiveStates"; + private const int RENDERING_COLUMN_MIN_WIDTH = 300; private IStatePersistanceService StatePersistanceService { get; } = App.Current.Services.GetService(); private IPreferencesService PreferencesService { get; } = App.Current.Services.GetService(); @@ -147,77 +148,6 @@ namespace Wino.Views MailListView.ClearSelections(); } - #region Mostly UI - - private void UpdateAdaptiveness() - { - - bool shouldDisplayNoMessagePanel, shouldDisplayMailingList, shouldDisplayRenderingFrame; - - // This is the smallest state UI can get. - // Either mailing list or rendering grid is visible. - if (StatePersistanceService.IsReaderNarrowed) - { - // Start visibility checks by no message panel. - - bool isMultiSelectionEnabled = ViewModel.IsMultiSelectionModeEnabled || KeyPressService.IsCtrlKeyPressed(); - - shouldDisplayMailingList = isMultiSelectionEnabled ? true : (!ViewModel.HasSelectedItems || ViewModel.HasMultipleItemSelections); - shouldDisplayNoMessagePanel = shouldDisplayMailingList ? false : !ViewModel.HasSelectedItems || ViewModel.HasMultipleItemSelections; - shouldDisplayRenderingFrame = shouldDisplayMailingList ? false : !shouldDisplayNoMessagePanel; - } - else - { - shouldDisplayMailingList = true; - shouldDisplayNoMessagePanel = !ViewModel.HasSelectedItems || ViewModel.HasMultipleItemSelections; - shouldDisplayRenderingFrame = !shouldDisplayNoMessagePanel; - } - - ReaderGridContainer.Visibility = shouldDisplayMailingList ? Visibility.Visible : Visibility.Collapsed; - RenderingFrame.Visibility = shouldDisplayRenderingFrame ? Visibility.Visible : Visibility.Collapsed; - NoMailSelectedPanel.Visibility = shouldDisplayNoMessagePanel ? Visibility.Visible : Visibility.Collapsed; - - if (StatePersistanceService.IsReaderNarrowed) - { - if (RenderingFrame.Visibility == Visibility.Visible && ReaderGridContainer.Visibility == Visibility.Collapsed) - { - // Extend rendering frame to full width. - Grid.SetColumn(RenderingGrid, 0); - Grid.SetColumnSpan(RenderingGrid, 2); - - Grid.SetColumn(ReaderGrid, 0); - Grid.SetColumnSpan(ReaderGrid, 2); - } - else if (RenderingFrame.Visibility == Visibility.Collapsed && NoMailSelectedPanel.Visibility == Visibility.Collapsed) - { - // Only mail list is available. - // Extend the mailing list. - Grid.SetColumn(ReaderGridContainer, 0); - Grid.SetColumnSpan(ReaderGridContainer, 2); - } - } - else - { - // Mailing list is always visible on the first part. - - Grid.SetColumn(ReaderGridContainer, 0); - Grid.SetColumnSpan(ReaderGridContainer, 1); - - // Rendering grid should take the rest of the space. - Grid.SetColumn(RenderingGrid, 1); - Grid.SetColumnSpan(RenderingGrid, 1); - } - } - - private void AdaptivenessChanged(object sender, VisualStateChangedEventArgs e) - { - StatePersistanceService.IsReaderNarrowed = e.NewState.Name == "NarrowState"; - - UpdateAdaptiveness(); - } - - #endregion - void IRecipient.Receive(ResetSingleMailItemSelectionEvent message) { // Single item in thread selected. @@ -329,7 +259,7 @@ namespace Wino.Views } } - UpdateAdaptiveness(); + UpdateAdaptiveness1(); } private bool IsRenderingPageActive() => RenderingFrame.Content is MailRenderingPage; @@ -379,7 +309,7 @@ namespace Wino.Views public void Receive(ActiveMailFolderChangedEvent message) { - UpdateAdaptiveness(); + UpdateAdaptiveness1(); } public async void Receive(SelectMailItemContainerEvent message) @@ -433,7 +363,7 @@ namespace Wino.Views public void Receive(ShellStateUpdated message) { - UpdateAdaptiveness(); + UpdateAdaptiveness1(); } private void SearchBoxFocused(object sender, RoutedEventArgs e) @@ -446,21 +376,6 @@ namespace Wino.Views SearchBar.PlaceholderText = Translator.SearchBarPlaceholder; } - private void MailListPageLoaded(object sender, RoutedEventArgs e) - { - // App might open with narrowed state. - // VSM will not trigger in this case. - // Set values to force updating adaptiveness. - - var groups = VisualStateManager.GetVisualStateGroups(RootGrid); - var adaptiveState = groups.FirstOrDefault(a => a.Name == AdaptivenessStatesKey); - - if (adaptiveState == null) return; - - // This should force UpdateAdaptiveness call. - StatePersistanceService.IsReaderNarrowed = adaptiveState.CurrentState.Name == NarrowVisualStateKey; - } - private void ProcessMailItemKeyboardAccelerator(UIElement sender, ProcessKeyboardAcceleratorEventArgs args) { if (args.Key == Windows.System.VirtualKey.Delete) @@ -568,5 +483,83 @@ namespace Wino.Views { ViewModel.NavigationService.Navigate(WinoPage.IdlePage, null, NavigationReferenceFrame.RenderingFrame, NavigationTransitionType.DrillIn); } + + private void Page_SizeChanged(object sender, SizeChangedEventArgs e) + { + ViewModel.MaxMailListLength = e.NewSize.Width - RENDERING_COLUMN_MIN_WIDTH; + + StatePersistanceService.IsReaderNarrowed = e.NewSize.Width < StatePersistanceService.MailListPaneLength + RENDERING_COLUMN_MIN_WIDTH; + + UpdateAdaptiveness1(); + } + + private void UpdateAdaptiveness1() + { + bool shouldDisplayNoMessagePanel, shouldDisplayMailingList, shouldDisplayRenderingFrame; + + // This is the smallest state UI can get. + // Either mailing list or rendering grid is visible. + if (StatePersistanceService.IsReaderNarrowed) + { + // Start visibility checks by no message panel. + + bool isMultiSelectionEnabled = ViewModel.IsMultiSelectionModeEnabled || KeyPressService.IsCtrlKeyPressed(); + + shouldDisplayMailingList = isMultiSelectionEnabled ? true : (!ViewModel.HasSelectedItems || ViewModel.HasMultipleItemSelections); + shouldDisplayNoMessagePanel = shouldDisplayMailingList ? false : !ViewModel.HasSelectedItems || ViewModel.HasMultipleItemSelections; + shouldDisplayRenderingFrame = shouldDisplayMailingList ? false : !shouldDisplayNoMessagePanel; + } + else + { + shouldDisplayMailingList = true; + shouldDisplayNoMessagePanel = !ViewModel.HasSelectedItems || ViewModel.HasMultipleItemSelections; + shouldDisplayRenderingFrame = !shouldDisplayNoMessagePanel; + } + + MailListContainer.Visibility = shouldDisplayMailingList ? Visibility.Visible : Visibility.Collapsed; + RenderingFrame.Visibility = shouldDisplayRenderingFrame ? Visibility.Visible : Visibility.Collapsed; + NoMailSelectedPanel.Visibility = shouldDisplayNoMessagePanel ? Visibility.Visible : Visibility.Collapsed; + + if (StatePersistanceService.IsReaderNarrowed == true) + { + if (ViewModel.HasSelectedItems) + { + MailListColumn.Width = new GridLength(0); + RendererColumn.Width = new GridLength(1, GridUnitType.Star); + + Grid.SetColumn(MailListContainer, 0); + Grid.SetColumnSpan(RenderingGrid, 2); + MailListContainer.Visibility = Visibility.Collapsed; + RenderingGrid.Visibility = Visibility.Visible; + } + else + { + MailListColumn.Width = new GridLength(1, GridUnitType.Star); + RendererColumn.Width = new GridLength(0); + + Grid.SetColumnSpan(MailListContainer, 2); + MailListContainer.Visibility = Visibility.Visible; + RenderingGrid.Visibility = Visibility.Collapsed; + } + } + else + { + MailListColumn.Width = new GridLength(StatePersistanceService.MailListPaneLength); + RendererColumn.Width = new GridLength(1, GridUnitType.Star); + + Grid.SetColumn(MailListContainer, 0); + Grid.SetColumn(RenderingGrid, 1); + Grid.SetColumnSpan(MailListContainer, 1); + Grid.SetColumnSpan(RenderingGrid, 1); + + MailListContainer.Visibility = Visibility.Visible; + RenderingGrid.Visibility = Visibility.Visible; + } + } + + private void PropertySizer_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) + { + StatePersistanceService.MailListPaneLength = ViewModel.MailListLength; + } } } diff --git a/Wino.Mail/Wino.Mail.csproj b/Wino.Mail/Wino.Mail.csproj index 43c2a54b..47ff411a 100644 --- a/Wino.Mail/Wino.Mail.csproj +++ b/Wino.Mail/Wino.Mail.csproj @@ -246,6 +246,7 @@ + AccountEditDialog.xaml