Skip to content

Commit

Permalink
✨ UI: Add the built-in graphics switch for embedded monitors.
Browse files Browse the repository at this point in the history
NExt step will be to implement the configuration within the service.
  • Loading branch information
hexawyz committed Feb 1, 2025
1 parent cb38b82 commit 7a1003f
Show file tree
Hide file tree
Showing 11 changed files with 272 additions and 47 deletions.
10 changes: 10 additions & 0 deletions src/Exo/Service/Exo.Service.Grpc/GrpcConvert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
using GrpcSensorInformation = Exo.Contracts.Ui.Settings.SensorInformation;
using GrpcEmbeddedMonitorDeviceInformation = Exo.Contracts.Ui.Settings.EmbeddedMonitorDeviceInformation;
using GrpcEmbeddedMonitorInformation = Exo.Contracts.Ui.Settings.EmbeddedMonitorInformation;
using GrpcEmbeddedMonitorGraphicsDescription = Exo.Contracts.Ui.Settings.EmbeddedMonitorGraphicsDescription;
using GrpcMonitorShape = Exo.Contracts.Ui.Settings.MonitorShape;
using GrpcVendorIdSource = Exo.Contracts.Ui.Settings.VendorIdSource;
using GrpcWatchNotificationKind = Exo.Contracts.Ui.WatchNotificationKind;
Expand All @@ -43,6 +44,7 @@
using System.Numerics;
using Exo.Images;
using Exo.Monitors;
using Exo.Features.EmbeddedMonitors;

namespace Exo.Service.Grpc;

Expand Down Expand Up @@ -158,6 +160,14 @@ public static GrpcEmbeddedMonitorInformation ToGrpc(this EmbeddedMonitorInformat
ImageSize = embeddedMonitorInformation.ImageSize.ToGrpc(),
Capabilities = (Contracts.Ui.Settings.EmbeddedMonitorCapabilities)embeddedMonitorInformation.Capabilities,
SupportedImageFormats = (Contracts.Ui.Settings.ImageFormats)embeddedMonitorInformation.SupportedImageFormats,
SupportedGraphics = ImmutableArray.CreateRange(embeddedMonitorInformation.SupportedGraphics, ToGrpc),
};

public static GrpcEmbeddedMonitorGraphicsDescription ToGrpc(this EmbeddedMonitorGraphicsDescription description)
=> new()
{
GraphicsId = description.GraphicsId,
NameStringId = description.NameStringId,
};

public static GrpcMonitorShape ToGrpc(this MonitorShape shape)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Runtime.CompilerServices;
using Exo.Contracts.Ui.Settings;
using Microsoft.Extensions.Logging;

Expand All @@ -16,7 +17,7 @@ public GrpcEmbeddedMonitorService(ILogger<GrpcDeviceService> logger, Configurati
_embeddedMonitorService = embeddedMonitorService;
}

public async IAsyncEnumerable<Contracts.Ui.Settings.EmbeddedMonitorDeviceInformation> WatchEmbeddedMonitorDevicesAsync(CancellationToken cancellationToken)
public async IAsyncEnumerable<Contracts.Ui.Settings.EmbeddedMonitorDeviceInformation> WatchEmbeddedMonitorDevicesAsync([EnumeratorCancellation] CancellationToken cancellationToken)
{
_logger.GrpcSpecializedDeviceServiceWatchStart(GrpcService.EmbeddedMonitor);
try
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Runtime.Serialization;

namespace Exo.Contracts.Ui.Settings;

[DataContract]
public readonly struct EmbeddedMonitorGraphicsDescription
{
[DataMember(Order = 1)]
public Guid GraphicsId { get; init; }
[DataMember(Order = 2)]
public Guid NameStringId { get; init; }
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Collections.Immutable;
using System.Runtime.Serialization;

namespace Exo.Contracts.Ui.Settings;
Expand All @@ -17,4 +18,6 @@ public sealed class EmbeddedMonitorInformation
public ImageFormats SupportedImageFormats { get; init; }
[DataMember(Order = 6)]
public EmbeddedMonitorCapabilities Capabilities { get; init; }
[DataMember(Order = 7)]
public ImmutableArray<EmbeddedMonitorGraphicsDescription> SupportedGraphics { get; init; }
}
1 change: 1 addition & 0 deletions src/Exo/Ui/Exo.Settings.Ui/ChangedProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,5 @@ internal static class ChangedProperty
public static readonly PropertyChangedEventArgs DisplayWidth = new (nameof(DisplayWidth));
public static readonly PropertyChangedEventArgs DisplayHeight = new (nameof(DisplayHeight));
public static readonly PropertyChangedEventArgs HasBuiltInGraphics = new (nameof(HasBuiltInGraphics));
public static readonly PropertyChangedEventArgs CurrentGraphics = new (nameof(CurrentGraphics));
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Exo.Settings.Ui.ViewModels;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;

namespace Exo.Settings.Ui.DataTemplateSelectors;

internal sealed class EmbeddedMonitorGraphicsSettingTemplateSelector : DataTemplateSelector
{
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public DataTemplate ImageTemplate { get; set; }
public DataTemplate BuiltInTemplate { get; set; }
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
=> SelectTemplateCore(item);

protected override DataTemplate SelectTemplateCore(object item)
=> item is EmbeddedMonitorImageGraphicsViewModel s ? ImageTemplate : BuiltInTemplate;
}
93 changes: 62 additions & 31 deletions src/Exo/Ui/Exo.Settings.Ui/EmbeddedMonitorSettingsControl.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
<DataTemplate x:DataType="vm:EmbeddedMonitorFeaturesViewModel">
<Grid HorizontalAlignment="Stretch" DataContext="{Binding EmbeddedMonitors[0]}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
Expand All @@ -31,7 +30,12 @@
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="EmbeddedMonitorGraphicsLabel" Margin="{StaticResource RowLabelMargin}"></TextBlock>
<ComboBox Grid.Column="1" Margin="{StaticResource RowContentLabelMargin}" ItemsSource="{Binding SupportedGraphics}" HorizontalAlignment="Stretch">
<ComboBox
Grid.Column="1"
Margin="{StaticResource RowContentLabelMargin}"
ItemsSource="{Binding SupportedGraphics}"
SelectedItem="{Binding CurrentGraphics, Mode=TwoWay}"
HorizontalAlignment="Stretch">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:EmbeddedMonitorGraphicsViewModel">
<TextBlock Text="{Binding DisplayName}" />
Expand All @@ -42,35 +46,62 @@
<FontIcon Glyph="&#xE777;" />
</Button>
</Grid>
<Grid Grid.Row="1" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{StaticResource PropertyLabelColumnWidth}" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="EmbeddedMonitorImageLabel" Margin="{StaticResource RowLabelMargin}"></TextBlock>
<ComboBox Grid.Column="1" Margin="{StaticResource RowContentLabelMargin}" ItemsSource="{Binding AvailableImages}" SelectedItem="{Binding Image, Mode=TwoWay}" HorizontalAlignment="Stretch">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:ImageViewModel">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding FileName, Converter={StaticResource FileNameToBitmapImageConverter}}" Width="20" Height="20" Margin="0,0,6,0" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Grid.Column="2" Margin="{StaticResource RowContentMargin}" HorizontalAlignment="Right" Command="{Binding ResetCommand}">
<FontIcon Glyph="&#xE777;" />
</Button>
</Grid>
<Grid Grid.Row="2" MinHeight="{Binding DisplayHeight}">
<controls:ImageCropper
CropShape="{Binding Shape, Converter={StaticResource MonitorShapeToCropShapeConverter}}"
Source="{Binding Image, Converter={StaticResource ImageToWriteableBitmapConverter}}"
ThumbPlacement="Corners"
Padding="20"
Height="{Binding ImageSize.Height}" />
</Grid>
<ContentControl Grid.Row="1" Content="{Binding CurrentGraphics}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch">
<ContentControl.ContentTemplateSelector>
<lts:EmbeddedMonitorGraphicsSettingTemplateSelector>
<lts:EmbeddedMonitorGraphicsSettingTemplateSelector.BuiltInTemplate>
<DataTemplate>
<Grid></Grid>
</DataTemplate>
</lts:EmbeddedMonitorGraphicsSettingTemplateSelector.BuiltInTemplate>
<lts:EmbeddedMonitorGraphicsSettingTemplateSelector.ImageTemplate>
<DataTemplate>
<Grid HorizontalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{StaticResource PropertyLabelColumnWidth}" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock x:Uid="EmbeddedMonitorImageLabel" Margin="{StaticResource RowLabelMargin}"></TextBlock>
<ComboBox
Grid.Column="1"
Margin="{StaticResource RowContentLabelMargin}"
ItemsSource="{Binding AvailableImages}"
SelectedItem="{Binding Image, Mode=TwoWay}"
HorizontalAlignment="Stretch">
<ComboBox.ItemTemplate>
<DataTemplate x:DataType="vm:ImageViewModel">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding FileName, Converter={StaticResource FileNameToBitmapImageConverter}}" Width="20" Height="20" Margin="0,0,6,0" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Button Grid.Column="2" Margin="{StaticResource RowContentMargin}" HorizontalAlignment="Right" Command="{Binding ResetCommand}">
<FontIcon Glyph="&#xE777;" />
</Button>
</Grid>
<Grid Grid.Row="1" MinHeight="{Binding DisplayHeight}">
<controls:ImageCropper
CropShape="{Binding Shape, Converter={StaticResource MonitorShapeToCropShapeConverter}}"
Source="{Binding Image, Converter={StaticResource ImageToWriteableBitmapConverter}}"
ThumbPlacement="Corners"
Padding="20"
Height="{Binding ImageSize.Height}" />
</Grid>
</Grid>
</DataTemplate>
</lts:EmbeddedMonitorGraphicsSettingTemplateSelector.ImageTemplate>
</lts:EmbeddedMonitorGraphicsSettingTemplateSelector>
</ContentControl.ContentTemplateSelector>
</ContentControl>
<StackPanel Grid.Row="3" Orientation="Horizontal" Margin="0,12,0,0" HorizontalAlignment="Right">
<Button x:Uid="ResetButton" HorizontalAlignment="Right" Margin="0,0,6,0" Command="{Binding ResetCommand}" CommandParameter="{Binding}" />
<Button x:Uid="ApplyButton" Style="{StaticResource AccentButtonStyle}" HorizontalAlignment="Right" Margin="6,0,0,0" Command="{Binding ApplyCommand}" CommandParameter="{Binding}" />
Expand Down
2 changes: 1 addition & 1 deletion src/Exo/Ui/Exo.Settings.Ui/Strings/en-US/Resources.resw
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@
<value>DPI presets</value>
</data>
<data name="EmbeddedMonitorGraphicsLabel.Text" xml:space="preserve">
<value>Graphismes</value>
<value>Graphics</value>
</data>
<data name="EmbeddedMonitorImageLabel.Text" xml:space="preserve">
<value>Image</value>
Expand Down
2 changes: 1 addition & 1 deletion src/Exo/Ui/Exo.Settings.Ui/Strings/fr-FR/Resources.resw
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@
<value>Préréglages PPP</value>
</data>
<data name="EmbeddedMonitorGraphicsLabel.Text" xml:space="preserve">
<value>Graphics</value>
<value>Graphismes</value>
</data>
<data name="EmbeddedMonitorImageLabel.Text" xml:space="preserve">
<value>Image</value>
Expand Down
2 changes: 1 addition & 1 deletion src/Exo/Ui/Exo.Settings.Ui/ViewModels/DeviceViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ DeviceInformation deviceInformation
}
else if (featureId == WellKnownGuids.EmbeddedMonitorDeviceFeature)
{
EmbeddedMonitorFeatures ??= new(this, availableImages, rasterizationScaleProvider);
EmbeddedMonitorFeatures ??= new(this, availableImages, rasterizationScaleProvider, metadataService);
}
}
}
Expand Down
Loading

0 comments on commit 7a1003f

Please sign in to comment.