mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 19:57:57 +01:00
Enhance input source selection in UI
Added dynamic visibility binding to the input source button. Updated the `ListView` to bind to `AvailableInputSources` and replaced hardcoded items with a `DataTemplate` for better flexibility. Introduced `InputSourceListView_SelectionChanged` to handle selection changes, update the monitor's input source, and close the flyout after selection. Added logging for improved debugging and error handling.
This commit is contained in:
@@ -121,11 +121,15 @@
|
|||||||
HorizontalAlignment="Right"
|
HorizontalAlignment="Right"
|
||||||
Content="{ui:FontIcon Glyph=,
|
Content="{ui:FontIcon Glyph=,
|
||||||
FontSize=16}"
|
FontSize=16}"
|
||||||
Style="{StaticResource SubtleButtonStyle}">
|
Style="{StaticResource SubtleButtonStyle}"
|
||||||
|
Visibility="{x:Bind ConvertBoolToVisibility(SupportsInputSource), Mode=OneWay}">
|
||||||
<Button.Flyout>
|
<Button.Flyout>
|
||||||
<Flyout>
|
<Flyout>
|
||||||
<StackPanel Orientation="Vertical">
|
<StackPanel Orientation="Vertical">
|
||||||
<ListView SelectedIndex="2">
|
<ListView
|
||||||
|
ItemsSource="{x:Bind AvailableInputSources, Mode=OneWay}"
|
||||||
|
SelectionChanged="InputSourceListView_SelectionChanged"
|
||||||
|
SelectionMode="Single">
|
||||||
<ListView.Header>
|
<ListView.Header>
|
||||||
<TextBlock
|
<TextBlock
|
||||||
Margin="16,0,8,0"
|
Margin="16,0,8,0"
|
||||||
@@ -133,9 +137,25 @@
|
|||||||
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
|
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
|
||||||
Text="Input source" />
|
Text="Input source" />
|
||||||
</ListView.Header>
|
</ListView.Header>
|
||||||
<ListViewItem Content="Source 1" />
|
<ListView.ItemTemplate>
|
||||||
<ListViewItem Content="Source 2" />
|
<DataTemplate x:DataType="vm:InputSourceItem">
|
||||||
<ListViewItem Content="Source 3" />
|
<Grid Padding="0,4">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="{x:Bind Name}" />
|
||||||
|
<FontIcon
|
||||||
|
Grid.Column="1"
|
||||||
|
Margin="8,0,0,0"
|
||||||
|
FontSize="12"
|
||||||
|
Glyph=""
|
||||||
|
Visibility="{x:Bind SelectionVisibility}" />
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</ListView.ItemTemplate>
|
||||||
</ListView>
|
</ListView>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Flyout>
|
</Flyout>
|
||||||
|
|||||||
@@ -738,6 +738,49 @@ namespace PowerDisplay
|
|||||||
Logger.LogInfo("[UI] InputSourceItem_Click: SetInputSourceAsync completed");
|
Logger.LogInfo("[UI] InputSourceItem_Click: SetInputSourceAsync completed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Input source ListView selection changed handler - switches the monitor input source
|
||||||
|
/// </summary>
|
||||||
|
private async void InputSourceListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is not ListView listView)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the selected input source item
|
||||||
|
var selectedItem = listView.SelectedItem as InputSourceItem;
|
||||||
|
if (selectedItem == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.LogInfo($"[UI] InputSourceListView_SelectionChanged: Selected {selectedItem.Name} (0x{selectedItem.Value:X2}) for monitor {selectedItem.MonitorId}");
|
||||||
|
|
||||||
|
// Find the monitor by ID
|
||||||
|
MonitorViewModel? monitorVm = null;
|
||||||
|
if (!string.IsNullOrEmpty(selectedItem.MonitorId) && _viewModel != null)
|
||||||
|
{
|
||||||
|
monitorVm = _viewModel.Monitors.FirstOrDefault(m => m.Id == selectedItem.MonitorId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (monitorVm == null)
|
||||||
|
{
|
||||||
|
Logger.LogWarning("[UI] InputSourceListView_SelectionChanged: Could not find MonitorViewModel");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the input source
|
||||||
|
await monitorVm.SetInputSourceAsync(selectedItem.Value);
|
||||||
|
|
||||||
|
// Close the flyout after selection
|
||||||
|
if (listView.Parent is StackPanel stackPanel &&
|
||||||
|
stackPanel.Parent is Flyout flyout)
|
||||||
|
{
|
||||||
|
flyout.Hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_viewModel?.Dispose();
|
_viewModel?.Dispose();
|
||||||
|
|||||||
Reference in New Issue
Block a user