Skip to content

Commit 36e1897

Browse files
committed
Refactor results display and add document preview title
Results are now shown in a flat style with filenames displayed to the right of content matches. Introduced BlitzDocumentPreviewTitle for improved document preview headers. Enhanced navigation logic in ResultsBox for better left/right arrow behavior. Updated MainWindowViewModel and ContentResultViewModel to support new result display logic. Bumped version to 1.0.19 and updated the changelog.
1 parent 255dbb2 commit 36e1897

File tree

12 files changed

+109
-86
lines changed

12 files changed

+109
-86
lines changed

src/Blitz.Avalonia.Controls/ViewModels/ContentResultViewModel.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using Avalonia.Controls.Documents;
2+
using Avalonia.Controls.Shapes;
3+
using Avalonia.Media;
24
using Blitz.AvaloniaEdit.ViewModels;
35
using Blitz.Interfacing;
46
using ReactiveUI;
@@ -47,7 +49,13 @@ public InlineCollection ContentWithHighlights
4749
return matchHighlighter.GetInlines();
4850
}
4951
}
52+
53+
public string ShortDisplayName => System.IO.Path.GetFileName(fileNameResult.FileName);
5054

55+
public IBrush FileBackgroundBrush => new SolidColorBrush(Configuration.Instance.CurrentTheme.WindowBackground);
56+
57+
public bool IsFirstFromFile { get; set; }
58+
public double VisualAlpha => IsFirstFromFile ? 0.35 : 0.10;
5159

5260
public void RefreshPropertyVisuals()
5361
{

src/Blitz.Avalonia.Controls/ViewModels/MainWindowViewModel.cs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,12 +1054,23 @@ private void ProcessSearchTaskResult(SearchTaskResult searchTaskResult)
10541054

10551055
bool isMatchInFilename = changedFile.BlitzMatches != null && changedFile.BlitzMatches.Count > 0;
10561056

1057-
if (!foundThis && (isMatchInFilename || changedFile.ContentResults.Count > 0) )
1057+
if (!foundThis && (isMatchInFilename || changedFile.ContentResults.Count > 0) )
10581058
{
1059-
ResultBoxItems.Add(new FileNameResultViewModel(this,changedFile){IsUpdated = true});
1059+
if (isMatchInFilename)
1060+
{
1061+
var fileItem = new FileNameResultViewModel(this, changedFile) { IsUpdated = true };
1062+
ResultBoxItems.Add(fileItem);
1063+
}
1064+
bool isFirst = true;
10601065
foreach (var item in changedFile.ContentResults)
10611066
{
1062-
ResultBoxItems.Add(new ContentResultViewModel(this, item, changedFile));
1067+
var contextItem = new ContentResultViewModel(this, item, changedFile);
1068+
if (isFirst)
1069+
{
1070+
contextItem.IsFirstFromFile = true;
1071+
isFirst = false;
1072+
}
1073+
ResultBoxItems.Add(contextItem);
10631074
}
10641075
}
10651076
}
@@ -1073,14 +1084,22 @@ private void ProcessSearchTaskResult(SearchTaskResult searchTaskResult)
10731084
return;
10741085
}
10751086
DoScheduledClear();
1076-
ResultBoxItems.Add(new FileNameResultViewModel(this,fileResult));
1077-
if (fileResult.ContentResults.Count <= 0)
1087+
bool isMatchInFilename = fileResult.BlitzMatches.Count > 0;
1088+
if ( isMatchInFilename )
10781089
{
1090+
ResultBoxItems.Add(new FileNameResultViewModel(this,fileResult));
10791091
continue;
10801092
}
1093+
1094+
bool isFirst = true;
10811095
foreach (var contentResult in fileResult.ContentResults)
10821096
{
10831097
var thisItem = new ContentResultViewModel(this, contentResult, fileResult);
1098+
if (isFirst)
1099+
{
1100+
thisItem.IsFirstFromFile = true;
1101+
isFirst = false;
1102+
}
10841103
ResultBoxItems.Add(thisItem);
10851104
}
10861105
}

src/Blitz.Avalonia.Controls/Views/BlitzMainPanel.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
</Grid>
7474
<models:ResultsBox x:Name="ResultsBox" />
7575
</DockPanel>
76-
<GridSplitter Grid.Row="1" ResizeDirection="Rows" IsTabStop="False" />
76+
<GridSplitter IsVisible="{Binding SplitPane }" Grid.Row="1" ResizeDirection="Rows" IsTabStop="False" />
7777
<models:BlitzSecondary x:Name="BlitzSecondary" Grid.Row="2" />
7878
</Grid>
7979
</DockPanel>

src/Blitz.Avalonia.Controls/Views/BlitzSecondary.axaml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,13 @@
6868
</UserControl.Styles>
6969
<Grid>
7070
<DockPanel >
71-
<DockPanel DockPanel.Dock="Top" LastChildFill="False" Background="{Binding EditorViewModel.TitleBarBackground}">
72-
<models:OptionTogglePanel DockPanel.Dock="Right"/>
73-
<Grid DockPanel.Dock="Left" IsVisible="{Binding EnableTextPane}">
74-
<views:BlitzFileTab DataContext="{Binding EditorViewModel }" DockPanel.Dock="Left"/>
75-
</Grid>
71+
<DockPanel DockPanel.Dock="Top" LastChildFill="False" Background="{Binding EditorViewModel.TitleBarBackground}" >
72+
<models:OptionTogglePanel Margin="0 6" DockPanel.Dock="Right"/>
73+
<views:BlitzDocumentPreviewTitle Margin="0 6" DockPanel.Dock="Left" DataContext="{Binding EditorViewModel }" />
7674
</DockPanel>
75+
<!-- <Grid DockPanel.Dock="Top" IsVisible="{Binding EnableTextPane}"> -->
76+
<!-- <views:BlitzFileTab DataContext="{Binding EditorViewModel }" DockPanel.Dock="Left"/> -->
77+
<!-- </Grid> -->
7778
<Grid DockPanel.Dock="Top" >
7879
<models:HelpPanel/>
7980
<models:SettingsPanel/>

src/Blitz.Avalonia.Controls/Views/ResultsBox.axaml

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,23 +76,17 @@
7676
</StackPanel>
7777
</DataTemplate>
7878
<DataTemplate x:DataType="vm:ContentResultViewModel">
79-
<Border BorderThickness="1" Background="Transparent" IsHitTestVisible="True" Margin="2"
79+
<Border Padding="3" Background="Transparent" IsHitTestVisible="True" Margin="0"
8080
VerticalAlignment="Center">
8181
<Panel>
82-
<!-- <DockPanel LastChildFill="True"> -->
83-
<!-- <Panel VerticalAlignment="Center"> -->
84-
<!-- <TextBlock VerticalAlignment="Center" -->
85-
<!-- Inlines="{Binding BackGroundWithHighlights }" -->
86-
<!-- LineSpacing="{Binding LineHeight}" -->
87-
<!-- Foreground="{StaticResource SystemColorWindowTextColor}"> -->
88-
<!-- </TextBlock> -->
89-
<TextBlock VerticalAlignment="Center"
90-
Inlines="{Binding ContentWithHighlights }"
91-
LineSpacing="{Binding LineHeight}"
92-
Foreground="{StaticResource SystemColorWindowTextColor}">
93-
</TextBlock>
94-
<!-- </Panel> -->
95-
<!-- </DockPanel> -->
82+
<TextBlock VerticalAlignment="Center"
83+
Inlines="{Binding ContentWithHighlights }"
84+
LineSpacing="{Binding LineHeight}"
85+
Foreground="{StaticResource SystemColorWindowTextColor}">
86+
</TextBlock>
87+
<Panel HorizontalAlignment="Right" Background="{Binding MainWindowViewModel.EditorViewModel.ThemeViewModel.BackGroundBrush}" VerticalAlignment="Stretch">
88+
<TextBlock Margin="10 0 " VerticalAlignment="Center" Opacity="{Binding VisualAlpha}" Text="{Binding ShortDisplayName}"></TextBlock>
89+
</Panel>
9690
</Panel>
9791
</Border>
9892
</DataTemplate>
@@ -147,7 +141,7 @@
147141
</DataTemplate>
148142
</ListBox.DataTemplates>
149143
<ListBox.ContextMenu>
150-
<ContextMenu Opened="RightClickMenu_OnOpened">
144+
<ContextMenu>
151145
<MenuItem Header="Copy" Command="{Binding CopyCommand}">
152146
<MenuItem.Icon>
153147
<material:MaterialIcon Kind="ContentCopy"></material:MaterialIcon>

src/Blitz.Avalonia.Controls/Views/ResultsBox.axaml.cs

Lines changed: 9 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,15 @@ private void SkipNextResultCommandRun()
9292
{
9393
continue;
9494
}
95-
selectedItem.IsSelected = true;
96-
selectedItem.Focus();
97-
ResultsListBox.SelectedIndex = index;
98-
if (thisType == nextItem.GetType())
95+
96+
if (lastorDefault is ContentResultViewModel firstItem && nextItem is ContentResultViewModel nextContentResultViewModel
97+
&& firstItem.FileNameResult.FileName == nextContentResultViewModel.FileNameResult.FileName)
9998
{
10099
continue;
101100
}
101+
selectedItem.IsSelected = true;
102+
selectedItem.Focus();
103+
ResultsListBox.SelectedIndex = index;
102104
return;
103105
}
104106
}
@@ -146,7 +148,9 @@ private void SkipPrevResultCommandRun()
146148
}
147149
selectedItem.Focus();
148150
ResultsListBox.ScrollIntoView(selectedItem);
149-
if (thisType == nextItem?.GetType())
151+
152+
if (firstOrDefault is ContentResultViewModel firstItem && nextItem is ContentResultViewModel nextContentResultViewModel
153+
&& firstItem.FileNameResult.FileName == nextContentResultViewModel.FileNameResult.FileName)
150154
{
151155
continue;
152156
}
@@ -217,55 +221,7 @@ private void ShowImportantMessage(string message)
217221
mainWindowViewModel.ShowPreview?.Invoke(message);
218222
}
219223

220-
[SuppressMessage("ReSharper", "UnusedParameter.Local")]
221-
private void RightClickMenu_OnOpened(object sender, RoutedEventArgs e)
222-
{
223-
if (sender is not ContextMenu contextMenu) return;
224-
225-
string startMenuName = "Dynamic_Starter";
226-
int starterIndex = -1;
227-
for (int i = 0; i < contextMenu.Items.Count; i++)
228-
{
229-
if (contextMenu.Items[i] is Separator separator && separator.Name == startMenuName)
230-
{
231-
contextMenu.Items.RemoveAt(i);
232-
starterIndex = i;
233-
while (contextMenu.Items.Count > starterIndex && contextMenu.Items[starterIndex] is not Separator)
234-
{
235-
contextMenu.Items.RemoveAt(i);
236-
}
237-
}
238-
}
239-
240-
if (starterIndex == -1)
241-
{
242-
starterIndex = contextMenu.Items.Count;
243-
}
244224

245-
if (DataContext is not MainWindowViewModel mainWindowViewModel) return;
246-
247-
var newSeparator = new Separator() { Name = "Dynamic_Starter" };
248-
contextMenu.Items.Insert(starterIndex,newSeparator);
249-
for (int i = 0; i < mainWindowViewModel.GotoEditorCollection.Count; i++)
250-
{
251-
var editorVm = mainWindowViewModel.GotoEditorCollection[i];
252-
if (!editorVm.EditorExists())
253-
{
254-
continue;
255-
}
256-
var multiBinding = this.FindResource("ImageConverterBinding") as MultiBinding;
257-
var titleBinding = this.FindResource("TitleBinding") as IBinding;
258-
var menuItem = new MenuItem
259-
{
260-
DataContext = editorVm,
261-
Command = GotoOtherEditor,
262-
CommandParameter = i,
263-
Icon = new Image(){ [!Image.SourceProperty] = multiBinding!},
264-
[!HeaderedSelectingItemsControl.HeaderProperty] = titleBinding!,
265-
};
266-
contextMenu.Items.Add(menuItem);
267-
}
268-
}
269225
private void ResultsListBox_OnDoubleTapped(object? _, TappedEventArgs e)
270226
{
271227
if (DataContext is not MainWindowViewModel mainWindowViewModel)

src/Blitz.AvaloniaEdit/ViewModels/BlitzEditorViewModel.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Linq;
33
using System.Collections.ObjectModel;
4+
using System.Collections.Specialized;
45
using Avalonia.Dialogs.Internal;
56
using AvaloniaEdit.TextMate;
67
using Avalonia.Media;
@@ -24,6 +25,16 @@ public class BlitzEditorViewModel : ViewModelBase
2425
private IBrush? _textForeground;
2526
private string? _searchThisPreviewText;
2627

28+
public BlitzEditorViewModel()
29+
{
30+
_selectedFiles.CollectionChanged+=SelectedFilesOnCollectionChanged;
31+
}
32+
33+
private void SelectedFilesOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
34+
{
35+
this.RaisePropertyChanged(nameof(CurrentDocument));
36+
}
37+
2738
public Action<TextMate.Installation>? BackGroundForeGroundUpdate;
2839

2940
private ThemeViewModel? _blitzThemeViewModel;
@@ -58,9 +69,14 @@ public ThemeViewModel? ThemeViewModel
5869
public ObservableCollection<object> SelectedFiles
5970
{
6071
get => _selectedFiles;
61-
set => this.RaiseAndSetIfChanged(ref _selectedFiles, value);
6272
}
6373

74+
public BlitzDocument? CurrentDocument
75+
{
76+
get => SelectedFiles.FirstOrDefault() as BlitzDocument;
77+
}
78+
79+
6480
/// <summary>
6581
/// Gets the current opened file, if one isn't in the collection a new one
6682
/// </summary>
@@ -158,9 +174,9 @@ public TextMate.Installation? TextMateInstallation
158174
}
159175

160176
private FontFamily _selectedFontFamily = FontFamily.Default;
177+
private BlitzDocument? _currentDocument;
178+
161179

162-
163-
164180
bool ApplyBrushAction(TextMate.Installation e, string colorKeyNameFromJson, Action<IBrush> applyColorAction)
165181
{
166182
if (!e.TryGetThemeColor(colorKeyNameFromJson, out var colorString))
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<UserControl xmlns="https://github.com/avaloniaui"
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
6+
xmlns:viewModels="clr-namespace:Blitz.AvaloniaEdit.ViewModels"
7+
x:DataType="viewModels:BlitzEditorViewModel"
8+
x:Class="Blitz.AvaloniaEdit.Views.BlitzDocumentPreviewTitle">
9+
<DockPanel DataContext="{Binding CurrentDocument }">
10+
<TextBlock VerticalAlignment="Center" DockPanel.Dock="Left" Margin="20 3 3 3" Text ="{Binding TabTitle}" Foreground="{StaticResource SystemColorWindowTextColor}"/>
11+
<TextBlock VerticalAlignment="Center" DockPanel.Dock="Left" Margin="3" Opacity="0.33" Text ="{Binding FileNameOrTitle}" Foreground="{StaticResource SystemColorWindowTextColor}"/>
12+
</DockPanel>
13+
</UserControl>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Avalonia;
2+
using Avalonia.Controls;
3+
using Avalonia.Markup.Xaml;
4+
5+
namespace Blitz.AvaloniaEdit.Views;
6+
7+
public partial class BlitzDocumentPreviewTitle : UserControl
8+
{
9+
public BlitzDocumentPreviewTitle()
10+
{
11+
InitializeComponent();
12+
}
13+
}

src/Blitz.AvaloniaEdit/Views/BlitzFileTab.axaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
xmlns:viewModels="clr-namespace:Blitz.AvaloniaEdit.ViewModels"
77
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
88
xmlns:avEditConverters="using:Blitz.AvaloniaEdit.Converters"
9-
109
x:DataType="viewModels:BlitzEditorViewModel"
1110
x:Class="Blitz.AvaloniaEdit.Views.BlitzFileTab">
1211
<UserControl.Resources>

0 commit comments

Comments
 (0)