Skip to content

Commit 627dfb1

Browse files
committed
Separate preview into a different control, only render it when needed
1 parent db6ee3b commit 627dfb1

File tree

7 files changed

+129
-96
lines changed

7 files changed

+129
-96
lines changed

Flow.Launcher/DefaultPreview.xaml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<UserControl x:Class="Flow.Launcher.DefaultPreview"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:local="clr-namespace:Flow.Launcher"
7+
xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
8+
d:DataContext="{d:DesignInstance Type=vm:ResultViewModel}"
9+
mc:Ignorable="d">
10+
<Grid
11+
Background="Transparent">
12+
<Grid.RowDefinitions>
13+
<RowDefinition Height="*" />
14+
<RowDefinition Height="Auto" />
15+
</Grid.RowDefinitions>
16+
<Grid Grid.Row="0" VerticalAlignment="Center">
17+
<Grid.RowDefinitions>
18+
<RowDefinition Height="Auto" />
19+
<RowDefinition Height="Auto" />
20+
</Grid.RowDefinitions>
21+
<TextBlock
22+
x:Name="PreviewGlyphIcon"
23+
Grid.Row="0"
24+
Height="Auto"
25+
Margin="0 16 0 0"
26+
FontFamily="{Binding Glyph.FontFamily}"
27+
Style="{DynamicResource PreviewGlyph}"
28+
Text="{Binding Glyph.Glyph}"
29+
Visibility="{Binding ShowGlyph}" />
30+
<Image
31+
x:Name="PreviewImageIcon"
32+
Grid.Row="0"
33+
MaxHeight="320"
34+
Margin="0 16 0 0"
35+
HorizontalAlignment="Center"
36+
Source="{Binding PreviewImage}"
37+
StretchDirection="DownOnly"
38+
Visibility="{Binding ShowPreviewImage}">
39+
<Image.Style>
40+
<Style TargetType="{x:Type Image}">
41+
<Setter Property="MaxWidth" Value="96" />
42+
<Style.Triggers>
43+
<DataTrigger Binding="{Binding UseBigThumbnail}" Value="True">
44+
<Setter Property="MaxWidth" Value="{Binding ElementName=Preview, Path=ActualWidth}" />
45+
</DataTrigger>
46+
</Style.Triggers>
47+
</Style>
48+
</Image.Style>
49+
</Image>
50+
<TextBlock
51+
x:Name="PreviewTitle"
52+
Grid.Row="1"
53+
Margin="0 6 0 16"
54+
HorizontalAlignment="Stretch"
55+
Style="{DynamicResource PreviewItemTitleStyle}"
56+
Text="{Binding Result.Title}"
57+
TextAlignment="Center"
58+
TextWrapping="Wrap" />
59+
</Grid>
60+
<StackPanel Grid.Row="1">
61+
<StackPanel.Style>
62+
<Style TargetType="{x:Type StackPanel}">
63+
<Style.Triggers>
64+
<DataTrigger Binding="{Binding ElementName=PreviewSubTitle, UpdateSourceTrigger=PropertyChanged, Path=Text.Length}" Value="0">
65+
<Setter Property="Visibility" Value="Collapsed" />
66+
</DataTrigger>
67+
</Style.Triggers>
68+
</Style>
69+
</StackPanel.Style>
70+
<Separator Style="{DynamicResource PreviewSeparatorStyle}" />
71+
<TextBlock
72+
x:Name="PreviewSubTitle"
73+
Style="{DynamicResource PreviewItemSubTitleStyle}"
74+
Text="{Binding Result.SubTitle}" />
75+
</StackPanel>
76+
</Grid>
77+
</UserControl>

Flow.Launcher/DefaultPreview.xaml.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Windows.Controls;
2+
3+
namespace Flow.Launcher;
4+
5+
public partial class DefaultPreview : UserControl
6+
{
7+
public DefaultPreview()
8+
{
9+
InitializeComponent();
10+
}
11+
}

Flow.Launcher/MainWindow.xaml

Lines changed: 7 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -367,95 +367,17 @@
367367
</GridSplitter.Template>
368368
</GridSplitter>
369369

370-
<Grid
370+
<ContentPresenter
371371
x:Name="Preview"
372372
Grid.Column="2"
373373
VerticalAlignment="Stretch"
374+
MinHeight="{Binding PreviewMinHeight}"
375+
MaxHeight="{Binding ElementName=ResultListBox, Path=ActualHeight}"
376+
Margin="0 0 10 5"
374377
Style="{DynamicResource PreviewArea}"
375-
Visibility="{Binding InternalPreviewVisible, Converter={StaticResource BoolToVisibilityConverter}}">
376-
<Border
377-
MinHeight="380"
378-
Visibility="{Binding ShowDefaultPreview}">
379-
<Grid
380-
d:DataContext="{d:DesignInstance vm:ResultViewModel}"
381-
DataContext="{Binding PreviewSelectedItem, Mode=OneWay}"
382-
Margin="0 0 10 5"
383-
VerticalAlignment="Stretch"
384-
Background="Transparent">
385-
<Grid.RowDefinitions>
386-
<RowDefinition Height="*" />
387-
<RowDefinition Height="Auto" />
388-
</Grid.RowDefinitions>
389-
<Grid Grid.Row="0" VerticalAlignment="Center">
390-
<Grid.RowDefinitions>
391-
<RowDefinition Height="Auto" />
392-
<RowDefinition Height="Auto" />
393-
</Grid.RowDefinitions>
394-
<TextBlock
395-
x:Name="PreviewGlyphIcon"
396-
Grid.Row="0"
397-
Height="Auto"
398-
Margin="0 16 0 0"
399-
FontFamily="{Binding Glyph.FontFamily}"
400-
Style="{DynamicResource PreviewGlyph}"
401-
Text="{Binding Glyph.Glyph}"
402-
Visibility="{Binding ShowGlyph}" />
403-
<Image
404-
x:Name="PreviewImageIcon"
405-
Grid.Row="0"
406-
MaxHeight="320"
407-
Margin="0 16 0 0"
408-
HorizontalAlignment="Center"
409-
Source="{Binding PreviewImage}"
410-
StretchDirection="DownOnly"
411-
Visibility="{Binding ShowPreviewImage}">
412-
<Image.Style>
413-
<Style TargetType="{x:Type Image}">
414-
<Setter Property="MaxWidth" Value="96" />
415-
<Style.Triggers>
416-
<DataTrigger Binding="{Binding UseBigThumbnail}" Value="True">
417-
<Setter Property="MaxWidth" Value="{Binding ElementName=Preview, Path=ActualWidth}" />
418-
</DataTrigger>
419-
</Style.Triggers>
420-
</Style>
421-
</Image.Style>
422-
</Image>
423-
<TextBlock
424-
x:Name="PreviewTitle"
425-
Grid.Row="1"
426-
Margin="0 6 0 16"
427-
HorizontalAlignment="Stretch"
428-
Style="{DynamicResource PreviewItemTitleStyle}"
429-
Text="{Binding Result.Title}"
430-
TextAlignment="Center"
431-
TextWrapping="Wrap" />
432-
</Grid>
433-
<StackPanel Grid.Row="1">
434-
<StackPanel.Style>
435-
<Style TargetType="{x:Type StackPanel}">
436-
<Style.Triggers>
437-
<DataTrigger Binding="{Binding ElementName=PreviewSubTitle, UpdateSourceTrigger=PropertyChanged, Path=Text.Length}" Value="0">
438-
<Setter Property="Visibility" Value="Collapsed" />
439-
</DataTrigger>
440-
</Style.Triggers>
441-
</Style>
442-
</StackPanel.Style>
443-
<Separator Style="{DynamicResource PreviewSep}" />
444-
<TextBlock
445-
x:Name="PreviewSubTitle"
446-
Style="{DynamicResource PreviewItemSubTitleStyle}"
447-
Text="{Binding Result.SubTitle}" />
448-
</StackPanel>
449-
</Grid>
450-
</Border>
451-
<Border
452-
MinHeight="380"
453-
MaxHeight="{Binding ElementName=ResultListBox, Path=ActualHeight}"
454-
Padding="0 0 10 10"
455-
Visibility="{Binding ShowCustomizedPreview}">
456-
<ContentControl Content="{Binding CustomizedPreviewControl}" />
457-
</Border>
458-
</Grid>
378+
Visibility="{Binding PreviewVisibility}"
379+
Content="{Binding PreviewContent}">
380+
</ContentPresenter>
459381
</Grid>
460382
</Border>
461383
</StackPanel>

Flow.Launcher/Themes/Base.xaml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,9 +371,8 @@
371371
x:Key="PreviewGlyph"
372372
BasedOn="{StaticResource BasePreviewGlyph}"
373373
TargetType="{x:Type TextBlock}" />
374-
<Style x:Key="PreviewSep" TargetType="{x:Type Separator}">
374+
<Style x:Key="BasePreviewSeparatorStyle" TargetType="{x:Type Separator}">
375375
<Setter Property="Visibility" Value="Visible" />
376-
<Setter Property="Background" Value="{Binding ElementName=MiddleSeparator, Path=Fill}" />
377376
<Setter Property="Margin" Value="0 15 5 5" />
378377
<Style.Triggers>
379378
<DataTrigger Binding="{Binding ElementName=PreviewSubTitle, UpdateSourceTrigger=PropertyChanged, Path=Text.Length}" Value="0">
@@ -389,8 +388,7 @@
389388
<Setter Property="BorderBrush" Value="Gray" />
390389
</Style>
391390

392-
<Style x:Key="PreviewArea" TargetType="{x:Type Grid}">
393-
<Setter Property="Visibility" Value="Collapsed" />
391+
<Style x:Key="PreviewArea" TargetType="{x:Type ContentPresenter}">
394392
<Style.Triggers>
395393
<MultiDataTrigger>
396394
<MultiDataTrigger.Conditions>

Flow.Launcher/Themes/Win10System.xaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,10 @@
187187
TargetType="{x:Type TextBlock}">
188188
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
189189
</Style>
190+
<Style
191+
x:Key="PreviewSeparatorStyle"
192+
TargetType="{x:Type Separator}"
193+
BasedOn="{StaticResource BasePreviewSeparatorStyle}">
194+
<Setter Property="Background" Value="{DynamicResource SeparatorForeground}" />
195+
</Style>
190196
</ResourceDictionary>

Flow.Launcher/Themes/Win11Light.xaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,10 @@
189189
TargetType="{x:Type TextBlock}">
190190
<Setter Property="Foreground" Value="{DynamicResource Color05B}" />
191191
</Style>
192+
<Style
193+
x:Key="PreviewSeparatorStyle"
194+
TargetType="{x:Type Separator}"
195+
BasedOn="{StaticResource BasePreviewSeparatorStyle}">
196+
<Setter Property="Background" Value="{DynamicResource SeparatorForeground}" />
197+
</Style>
192198
</ResourceDictionary>

Flow.Launcher/ViewModel/MainViewModel.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ private static string VerifyOrSetDefaultHotkey(string hotkey, string defaultHotk
779779

780780
private bool? _selectedItemFromQueryResults;
781781

782+
private readonly DefaultPreview _defaultPreview = new();
782783
private ResultViewModel _previewSelectedItem;
783784
public ResultViewModel PreviewSelectedItem
784785
{
@@ -808,16 +809,28 @@ public bool InternalPreviewVisible
808809
}
809810
}
810811

811-
public Visibility ShowCustomizedPreview
812-
=> InternalPreviewVisible && PreviewSelectedItem?.Result.PreviewPanel != null ? Visibility.Visible : Visibility.Collapsed;
812+
public Control PreviewContent
813+
{
814+
get
815+
{
816+
if (!InternalPreviewVisible || PreviewSelectedItem == null)
817+
return null;
818+
819+
if (PreviewSelectedItem.Result.PreviewPanel != null)
820+
return PreviewSelectedItem.Result.PreviewPanel.Value;
821+
822+
_defaultPreview.DataContext = PreviewSelectedItem;
823+
return _defaultPreview;
824+
}
825+
}
813826

814-
public UserControl CustomizedPreviewControl
815-
=> ShowCustomizedPreview == Visibility.Visible ? PreviewSelectedItem?.Result.PreviewPanel.Value : null;
827+
public Visibility PreviewVisibility =>
828+
!InternalPreviewVisible || PreviewSelectedItem == null ? Visibility.Collapsed : Visibility.Visible;
816829

817-
public Visibility ShowDefaultPreview
818-
=> InternalPreviewVisible && PreviewSelectedItem?.Result.PreviewPanel == null ? Visibility.Visible : Visibility.Collapsed;
830+
public double PreviewMinHeight =>
831+
PreviewVisibility == Visibility.Visible ? 380 : 0;
819832

820-
public int ResultAreaColumn { get; set; } = ResultAreaColumnPreviewShown;
833+
public int ResultAreaColumn { get; set; } = ResultAreaColumnPreviewHidden;
821834

822835
// This is not a reliable indicator of whether external preview is visible due to the
823836
// ability of manually closing/exiting the external preview program which, does not inform flow that

0 commit comments

Comments
 (0)