Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 19 additions & 11 deletions src/Capacitor.App/Views/Onboarding/OnboardingPaneView.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,26 @@
<TextBlock x:Name="EditionNoticeText" Classes="onboardingBody" Text="{Binding Notice}" />
</Border>
<Button x:Name="LocalEditionButton" Classes="onboardingEditionCard" Command="{Binding ChooseLocalCommand}"
AutomationProperties.Name="{x:Static vm:EditionStepViewModel.LocalTitle}">
<Grid ColumnDefinitions="Auto,*" RowDefinitions="Auto,Auto" ColumnSpacing="14" RowSpacing="4">
<app:AppIcon Kind="Laptop" Size="20" />
<TextBlock Grid.Column="1" Classes="onboardingLabel" VerticalAlignment="Center"
Text="{x:Static vm:EditionStepViewModel.LocalTitle}" />
<TextBlock Grid.Row="1" Grid.Column="1" Classes="onboardingDetail" Text="{x:Static vm:EditionStepViewModel.LocalDetail}" />
</Grid>
AutomationProperties.Name="{x:Static vm:EditionStepViewModel.LocalTitle}"
AutomationProperties.HelpText="{Binding LocalUnavailableReason}">
<StackPanel>
<Grid Classes="onboardingEditionHead" ColumnDefinitions="Auto,*" RowDefinitions="Auto,Auto" ColumnSpacing="14" RowSpacing="4">
<app:AppIcon Kind="Laptop" Size="20" />
<TextBlock Grid.Column="1" Classes="onboardingLabel" VerticalAlignment="Center"
Comment thread
qodo-code-review[bot] marked this conversation as resolved.
Text="{x:Static vm:EditionStepViewModel.LocalTitle}" />
<TextBlock Grid.Row="1" Grid.Column="1" Classes="onboardingDetail" Text="{x:Static vm:EditionStepViewModel.LocalDetail}" />
</Grid>
<StackPanel Classes="onboardingEditionFooter" IsVisible="{Binding LocalUnavailableVisible}">
<Border Classes="onboardingDivider" />
<Grid ColumnDefinitions="20,*" ColumnSpacing="14">
<app:AppIcon Kind="Info" Size="14" HorizontalAlignment="Center" VerticalAlignment="Top"
Margin="0,2,0,0" Foreground="{StaticResource OnboardingDimBrush}" />
<TextBlock Grid.Column="1" x:Name="LocalUnavailableText" Classes="onboardingNote"
Foreground="{StaticResource OnboardingMutedBrush}" Text="{Binding LocalUnavailableReason}" />
</Grid>
</StackPanel>
</StackPanel>
</Button>
<Border Classes="onboardingCallout" IsVisible="{Binding LocalUnavailableVisible}">
<TextBlock x:Name="LocalUnavailableText" Classes="onboardingBody"
Text="{Binding LocalUnavailableReason}" />
</Border>

<Button x:Name="CloudEditionButton" Classes="onboardingEditionCard" Command="{Binding ChooseCloudCommand}"
AutomationProperties.Name="{x:Static vm:EditionStepViewModel.CloudTitle}">
Expand Down
8 changes: 8 additions & 0 deletions src/Capacitor.App/Views/Onboarding/OnboardingStyles.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,14 @@
<Setter Property="BorderBrush" Value="{StaticResource OnboardingAccentBrush}" />
<Setter Property="Foreground" Value="{StaticResource OnboardingTextBrush}" />
</Style>
<!-- An edition this machine cannot take: the head fades, the footer saying why stays legible. -->
<Style Selector="Button.onboardingEditionCard:disabled Grid.onboardingEditionHead">
<Setter Property="Opacity" Value="0.5" />
</Style>
<Style Selector="StackPanel.onboardingEditionFooter">
<Setter Property="Spacing" Value="14" />
<Setter Property="Margin" Value="0,16,0,0" />
</Style>
<Style Selector="Button.onboardingCompact">
<Setter Property="Padding" Value="14,9" />
<Setter Property="FontFamily" Value="{StaticResource OnboardingMonoFont}" />
Expand Down
38 changes: 38 additions & 0 deletions test/Capacitor.App.Tests.Unit/EditionStepViewModelTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,44 @@ public async Task The_pane_shows_the_cards_in_place_of_next_and_the_cloud_card_r
await Assert.That(after).IsEqualTo(WizardStepId.SignIn);
}

/// The footer sits inside a disabled button, whose template may fade everything it holds;
/// the reason is the one part of the card that must stay at full strength.
[Test]
[NotInParallel("AvaloniaSession")]
public async Task An_unavailable_local_card_says_why_in_its_own_footer() {
var (inCard, footerShown, enabled, help, footerOpacity, headOpacity) = await AvaloniaSession.DispatchAsync(async () => {
var edition = new EditionStepViewModel(
CliTelemetry.Disabled(TimeProvider.System).Funnel, () => EditionStepViewModel.UnsupportedPlatform);
var vm = new OnboardingViewModel([edition, new FakeWizardStep(WizardStepId.SignIn)]);
await vm.PendingEnterForTesting;

var window = new MainWindow { Onboarding = vm };
window.Show();
Dispatcher.UIThread.RunJobs();

var local = window.GetVisualDescendants().OfType<Button>().First(c => c.Name == "LocalEditionButton");
var reason = window.GetVisualDescendants().OfType<TextBlock>().First(c => c.Name == "LocalUnavailableText");
var head = local.GetVisualDescendants().OfType<Grid>().First(g => g.Classes.Contains("onboardingEditionHead"));
var result = (reason.GetVisualAncestors().Contains(local), reason.IsEffectivelyVisible, local.IsEffectivelyEnabled,
Avalonia.Automation.AutomationProperties.GetHelpText(local), EffectiveOpacity(reason), EffectiveOpacity(head));

window.Close();
Dispatcher.UIThread.RunJobs();

return result;
});

await Assert.That(inCard).IsTrue();
await Assert.That(footerShown).IsTrue();
await Assert.That(enabled).IsFalse();
await Assert.That(help).IsEqualTo(EditionStepViewModel.UnsupportedPlatform);
await Assert.That(footerOpacity).IsEqualTo(1.0);
await Assert.That(headOpacity).IsEqualTo(0.5);

static double EffectiveOpacity(Avalonia.Visual visual) =>
visual.GetSelfAndVisualAncestors().Aggregate(1.0, (opacity, v) => opacity * v.Opacity);
}

[Test]
[NotInParallel("AvaloniaSession")]
public async Task A_notice_stays_until_the_next_choice() {
Expand Down
Loading