Skip to content

Commit 0769b84

Browse files
committed
MainWindow: Simplify Results Area UI
1 parent 2bc7260 commit 0769b84

File tree

3 files changed

+64
-90
lines changed

3 files changed

+64
-90
lines changed

Flow.Launcher/MainWindow.xaml

Lines changed: 19 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@
221221
x:Name="QueryTextBox"
222222
Height="{Binding MainWindowHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
223223
AllowDrop="True"
224-
AutomationProperties.Name="{Binding Results.SelectedItem.Result.Title}"
224+
AutomationProperties.Name="{Binding SelectedResults.SelectedItem.Result.Title}"
225225
FontSize="{Binding QueryBoxFontSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
226226
PreviewDragOver="QueryTextBox_OnPreviewDragOver"
227227
PreviewKeyUp="QueryTextBox_KeyUp"
@@ -281,40 +281,6 @@
281281
</Grid>
282282
</Border>
283283

284-
<ContentControl>
285-
<ContentControl.Style>
286-
<Style TargetType="ContentControl">
287-
<Setter Property="Visibility" Value="Visible" />
288-
<Style.Triggers>
289-
<MultiDataTrigger>
290-
<MultiDataTrigger.Conditions>
291-
<Condition Binding="{Binding ElementName=ResultListBox, Path=Items.Count}" Value="0" />
292-
<Condition Binding="{Binding ElementName=ResultContextMenu, Path=Visibility}" Value="Collapsed" />
293-
</MultiDataTrigger.Conditions>
294-
<MultiDataTrigger.Setters>
295-
<Setter Property="Visibility" Value="Collapsed" />
296-
<Setter Property="Margin" Value="0" />
297-
<Setter Property="Height" Value="0" />
298-
</MultiDataTrigger.Setters>
299-
</MultiDataTrigger>
300-
</Style.Triggers>
301-
<!--<Style.Triggers>
302-
<DataTrigger Binding="{Binding ElementName=ResultListBox, Path=Visibility}" Value="Visible">
303-
<Setter Property="Visibility" Value="Visible" />
304-
</DataTrigger>
305-
<DataTrigger Binding="{Binding ElementName=ResultContextMenu, Path=Visibility}" Value="Visible">
306-
<Setter Property="Visibility" Value="Visible" />
307-
</DataTrigger>
308-
</Style.Triggers>-->
309-
</Style>
310-
</ContentControl.Style>
311-
<Rectangle
312-
Name="MiddleSeparator"
313-
Width="Auto"
314-
HorizontalAlignment="Stretch"
315-
Style="{DynamicResource SeparatorStyle}" />
316-
</ContentControl>
317-
318284
<Border x:Name="ResultPreviewAreaBoarder" Style="{DynamicResource WindowRadius}">
319285
<Border.Clip>
320286
<MultiBinding Converter="{StaticResource BorderClipConverter}">
@@ -331,25 +297,25 @@
331297
<ColumnDefinition Width="0.85*" MinWidth="244" />
332298
</Grid.ColumnDefinitions>
333299

334-
<StackPanel
335-
x:Name="ResultArea"
300+
<Rectangle
301+
Name="MiddleSeparator"
302+
Width="Auto"
303+
Grid.Column="0"
304+
Grid.ColumnSpan="3"
305+
HorizontalAlignment="Stretch"
306+
VerticalAlignment="Top"
307+
Style="{DynamicResource SeparatorStyle}"
308+
Visibility="{Binding MiddleSeparatorVisibility}">
309+
</Rectangle>
310+
311+
<flowlauncher:ResultListBox
312+
x:Name="ResultListBox"
336313
Grid.Column="0"
337-
Grid.ColumnSpan="{Binding ResultAreaColumn}">
338-
<ContentControl>
339-
<flowlauncher:ResultListBox
340-
x:Name="ResultListBox"
341-
DataContext="{Binding Results}"
342-
LeftClickResultCommand="{Binding LeftClickResultCommand}"
343-
RightClickResultCommand="{Binding RightClickResultCommand}" />
344-
</ContentControl>
345-
<ContentControl>
346-
<flowlauncher:ResultListBox
347-
x:Name="ResultContextMenu"
348-
DataContext="{Binding ContextMenu}"
349-
LeftClickResultCommand="{Binding LeftClickResultCommand}"
350-
RightClickResultCommand="{Binding RightClickResultCommand}" />
351-
</ContentControl>
352-
</StackPanel>
314+
Grid.ColumnSpan="{Binding DataContext.ResultAreaColumn, ElementName=FlowMainWindow}"
315+
VerticalAlignment="Top"
316+
DataContext="{Binding SelectedResults}"
317+
LeftClickResultCommand="{Binding LeftClickResultCommand}"
318+
RightClickResultCommand="{Binding RightClickResultCommand}" />
353319

354320
<GridSplitter
355321
x:Name="PreviewMiddleSeparator"

Flow.Launcher/MainWindow.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ public double VerticalTop(MonitorInfo screen)
711711

712712
private void QueryTextBox_OnCopy(object sender, ExecutedRoutedEventArgs e)
713713
{
714-
var result = _viewModel.Results.SelectedItem?.Result;
714+
var result = _viewModel.SelectedResults.SelectedItem?.Result;
715715
if (QueryTextBox.SelectionLength == 0 && result != null)
716716
{
717717
string copyText = result.CopyText;

Flow.Launcher/ViewModel/MainViewModel.cs

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ public partial class MainViewModel : BaseModel, ISavable, IDisposable
4949
private ChannelWriter<ResultsForUpdate> _resultsUpdateChannelWriter;
5050
private Task _resultsViewUpdateTask;
5151

52-
private readonly IReadOnlyList<Result> _emptyResult = new List<Result>();
52+
private readonly ResultsViewModel _results, _contextMenu;
53+
private readonly IReadOnlyList<Result> _emptyResult = [];
5354

5455
#endregion
5556

@@ -128,32 +129,41 @@ public MainViewModel()
128129
_topMostRecord = new FlowLauncherJsonStorageTopMostRecord();
129130
_userSelectedRecord = _userSelectedRecordStorage.Load();
130131

131-
ContextMenu = new ResultsViewModel(Settings, this)
132+
_contextMenu = new ResultsViewModel(Settings, this)
132133
{
133134
LeftClickResultCommand = OpenResultCommand,
134135
RightClickResultCommand = LoadContextMenuCommand,
135136
IsPreviewOn = Settings.AlwaysPreview
136137
};
137-
Results = new ResultsViewModel(Settings, this)
138+
_results = new ResultsViewModel(Settings, this)
138139
{
139140
LeftClickResultCommand = OpenResultCommand,
140141
RightClickResultCommand = LoadContextMenuCommand,
141142
IsPreviewOn = Settings.AlwaysPreview
142143
};
143-
_selectedResults = Results;
144+
_selectedResults = _results;
144145

145-
Results.PropertyChanged += (o, args) =>
146+
_results.PropertyChanged += (o, args) =>
146147
{
147148
switch (args.PropertyName)
148149
{
149-
case nameof(Results.SelectedItem):
150+
case nameof(_results.SelectedItem):
150151
_selectedItemFromQueryResults = true;
151-
PreviewSelectedItem = Results.SelectedItem;
152+
PreviewSelectedItem = _results.SelectedItem;
152153
_ = UpdatePreviewAsync();
153154
break;
154155
}
155156
};
156157

158+
_results.Results.CollectionChanged += (s, e) =>
159+
{
160+
OnPropertyChanged(nameof(MiddleSeparatorVisibility));
161+
};
162+
_contextMenu.Results.CollectionChanged += (s, e) =>
163+
{
164+
OnPropertyChanged(nameof(MiddleSeparatorVisibility));
165+
};
166+
157167
RegisterViewUpdate();
158168

159169
ThemeManager.Current.ActualApplicationThemeChanged += ThemeManager_ActualApplicationThemeChanged;
@@ -297,11 +307,11 @@ private void LoadContextMenu()
297307
// When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing
298308
// i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing
299309
if (SelectedResults.SelectedItem != null)
300-
SelectedResults = ContextMenu;
310+
SelectedResults = _contextMenu;
301311
}
302312
else
303313
{
304-
SelectedResults = Results;
314+
SelectedResults = _results;
305315
}
306316
}
307317

@@ -446,7 +456,7 @@ private void SelectPrevItem()
446456
{
447457
if (QueryResultsSelected() // Results selected
448458
&& string.IsNullOrEmpty(QueryText) // No input
449-
&& Results.Visibility != Visibility.Visible) // No items in result list, e.g. when home page is off and no query text is entered, therefore the view is collapsed.
459+
&& _results.Visibility != Visibility.Visible) // No items in result list, e.g. when home page is off and no query text is entered, therefore the view is collapsed.
450460
{
451461

452462
}
@@ -467,7 +477,7 @@ private void Esc()
467477
{
468478
if (!QueryResultsSelected())
469479
{
470-
SelectedResults = Results;
480+
SelectedResults = _results;
471481
}
472482
else
473483
{
@@ -479,7 +489,7 @@ public void BackToQueryResults()
479489
{
480490
if (!QueryResultsSelected())
481491
{
482-
SelectedResults = Results;
492+
SelectedResults = _results;
483493
}
484494
}
485495

@@ -492,7 +502,7 @@ public void ToggleGameMode()
492502
[RelayCommand]
493503
public void CopyAlternative()
494504
{
495-
var result = Results.SelectedItem?.Result?.CopyText;
505+
var result = _results.SelectedItem?.Result?.CopyText;
496506

497507
if (result != null)
498508
{
@@ -503,13 +513,8 @@ public void CopyAlternative()
503513
#endregion
504514

505515
#region ViewModel Properties
506-
507516
public Settings Settings { get; }
508517

509-
public ResultsViewModel Results { get; private set; }
510-
511-
public ResultsViewModel ContextMenu { get; private set; }
512-
513518
public bool GameModeStatus { get; set; } = false;
514519

515520
private string _queryText;
@@ -639,18 +644,18 @@ private async Task ChangeQueryTextAsync(string queryText, bool isReQuery = false
639644

640645
private ResultsViewModel _selectedResults;
641646

642-
private ResultsViewModel SelectedResults
647+
public ResultsViewModel SelectedResults
643648
{
644649
get => _selectedResults;
645-
set
650+
private set
646651
{
647652
var isReturningFromQueryResults = QueryResultsSelected();
648653
var isReturningFromContextMenu = ContextMenuSelected();
649654
_selectedResults = value;
650655
if (QueryResultsSelected())
651656
{
652-
Results.Visibility = Visibility.Visible;
653-
ContextMenu.Visibility = Visibility.Collapsed;
657+
_results.Visibility = Visibility.Visible;
658+
_contextMenu.Visibility = Visibility.Collapsed;
654659

655660
// QueryText setter (used in ChangeQueryText) runs the query again, resetting the selected
656661
// result from the one that was selected before going into the context menu to the first result.
@@ -672,8 +677,8 @@ private ResultsViewModel SelectedResults
672677
}
673678
else
674679
{
675-
Results.Visibility = Visibility.Collapsed;
676-
ContextMenu.Visibility = Visibility.Visible;
680+
_results.Visibility = Visibility.Collapsed;
681+
_contextMenu.Visibility = Visibility.Visible;
677682
_queryTextBeforeLeaveResults = QueryText;
678683

679684
// Because of Fody's optimization
@@ -688,6 +693,9 @@ private ResultsViewModel SelectedResults
688693
}
689694
}
690695

696+
public Visibility MiddleSeparatorVisibility
697+
=> _selectedResults.Results.Count == 0 ? Visibility.Collapsed : Visibility.Visible;
698+
691699
public Visibility MainWindowVisibility { get; set; }
692700

693701
// This is to be used for determining the visibility status of the main window instead of MainWindowVisibility
@@ -966,13 +974,13 @@ when CanExternalPreviewSelectedResult(out var path):
966974

967975
private bool CanExternalPreviewSelectedResult(out string path)
968976
{
969-
path = QueryResultsPreviewed() ? Results.SelectedItem?.Result?.Preview.FilePath : string.Empty;
977+
path = QueryResultsPreviewed() ? _results.SelectedItem?.Result?.Preview.FilePath : string.Empty;
970978
return !string.IsNullOrEmpty(path);
971979
}
972980

973981
private bool QueryResultsPreviewed()
974982
{
975-
var previewed = PreviewSelectedItem == Results.SelectedItem;
983+
var previewed = PreviewSelectedItem == _results.SelectedItem;
976984
return previewed;
977985
}
978986

@@ -1027,9 +1035,9 @@ private void QueryContextMenu()
10271035
{
10281036
const string id = "Context Menu ID";
10291037
var query = QueryText.ToLower().Trim();
1030-
ContextMenu.Clear();
1038+
_contextMenu.Clear();
10311039

1032-
var selected = Results.SelectedItem?.Result;
1040+
var selected = _results.SelectedItem?.Result;
10331041

10341042
if (selected != null) // SelectedItem returns null if selection is empty.
10351043
{
@@ -1081,11 +1089,11 @@ private void QueryContextMenu()
10811089
r.Score = match.Score;
10821090
return true;
10831091
}).ToList();
1084-
ContextMenu.AddResults(filtered, id);
1092+
_contextMenu.AddResults(filtered, id);
10851093
}
10861094
else
10871095
{
1088-
ContextMenu.AddResults(results, id);
1096+
_contextMenu.AddResults(results, id);
10891097
}
10901098
}
10911099
}
@@ -1103,8 +1111,8 @@ private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, b
11031111
App.API.LogDebug(ClassName, $"Clear query results");
11041112

11051113
// Hide and clear results again because running query may show and add some results
1106-
Results.Visibility = Visibility.Collapsed;
1107-
Results.Clear();
1114+
_results.Visibility = Visibility.Collapsed;
1115+
_results.Clear();
11081116

11091117
// Reset plugin icon
11101118
PluginIconPath = null;
@@ -1179,7 +1187,7 @@ private async Task QueryResultsAsync(bool searchDelay, bool isReQuery = false, b
11791187
{
11801188
if (ShouldClearExistingResultsForNonQuery(plugins))
11811189
{
1182-
Results.Clear();
1190+
_results.Clear();
11831191
App.API.LogDebug(ClassName, $"Existing results are cleared for non-query");
11841192
}
11851193

@@ -1457,13 +1465,13 @@ private static Result ContextMenuPluginInfo(Result result)
14571465

14581466
internal bool QueryResultsSelected()
14591467
{
1460-
var selected = SelectedResults == Results;
1468+
var selected = SelectedResults == _results;
14611469
return selected;
14621470
}
14631471

14641472
private bool ContextMenuSelected()
14651473
{
1466-
var selected = SelectedResults == ContextMenu;
1474+
var selected = SelectedResults == _contextMenu;
14671475
return selected;
14681476
}
14691477

@@ -1654,7 +1662,7 @@ public void UpdateResultView(ICollection<ResultsForUpdate> resultsForUpdates)
16541662
// it should be the same for all results
16551663
bool reSelect = resultsForUpdates.First().ReSelectFirstResult;
16561664

1657-
Results.AddResults(resultsForUpdates, token, reSelect);
1665+
_results.AddResults(resultsForUpdates, token, reSelect);
16581666
}
16591667

16601668
[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "<Pending>")]

0 commit comments

Comments
 (0)