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