feat: save offsets in viewmodels

This commit is contained in:
estrogen elf
2025-06-17 13:37:03 -05:00
parent 910d26c00d
commit 57334535cf
12 changed files with 101 additions and 16 deletions

View File

@@ -1,4 +1,5 @@
using AvaloniaEdit.Utils; using Avalonia;
using AvaloniaEdit.Utils;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using Needlework.Net.Models; using Needlework.Net.Models;
@@ -40,6 +41,9 @@ public partial class EndpointListViewModel : ObservableObject
[ObservableProperty] [ObservableProperty]
private string _search = string.Empty; private string _search = string.Empty;
[ObservableProperty]
private Vector _offset = new();
partial void OnSearchChanged(string value) partial void OnSearchChanged(string value)
{ {
EndpointSearchDetails.Clear(); EndpointSearchDetails.Clear();

View File

@@ -1,4 +1,5 @@
using AvaloniaEdit.Utils; using Avalonia;
using AvaloniaEdit.Utils;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -31,6 +32,15 @@ public partial class PluginViewModel : ObservableObject
[ObservableProperty] [ObservableProperty]
private string? _search; private string? _search;
[ObservableProperty]
private Vector _offset = new();
[ObservableProperty]
private Vector _paramsOffset = new();
[ObservableProperty]
private Vector _schemasOffset = new();
partial void OnSearchChanged(string? value) partial void OnSearchChanged(string? value)
{ {
FilteredPathOperations.Clear(); FilteredPathOperations.Clear();

View File

@@ -1,4 +1,6 @@
using Avalonia.Platform; using Avalonia;
using Avalonia.Platform;
using CommunityToolkit.Mvvm.ComponentModel;
using Needlework.Net.Models; using Needlework.Net.Models;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -17,6 +19,9 @@ public partial class HomeViewModel : PageBase
.Select(library => new LibraryViewModel(library)) .Select(library => new LibraryViewModel(library))
.ToList(); .ToList();
[ObservableProperty]
private Vector _librariesOffset = new();
public override Task InitializeAsync() public override Task InitializeAsync()
{ {
return Task.CompletedTask; return Task.CompletedTask;

View File

@@ -1,4 +1,5 @@
using Avalonia.Threading; using Avalonia;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using DebounceThrottle; using DebounceThrottle;
using Needlework.Net.Helpers; using Needlework.Net.Helpers;
@@ -35,6 +36,9 @@ namespace Needlework.Net.ViewModels.Pages.Schemas
[ObservableProperty] [ObservableProperty]
private List<SchemaItemViewModel> _schemaItems = []; private List<SchemaItemViewModel> _schemaItems = [];
[ObservableProperty]
private Vector _offset = new();
partial void OnSearchChanged(string? value) partial void OnSearchChanged(string? value)
{ {
_debounceDispatcher.Debounce(() => _debounceDispatcher.Debounce(() =>

View File

@@ -1,4 +1,5 @@
using Avalonia.Collections; using Avalonia;
using Avalonia.Collections;
using AvaloniaEdit.Document; using AvaloniaEdit.Document;
using BlossomiShymae.Briar; using BlossomiShymae.Briar;
using BlossomiShymae.Briar.WebSocket.Events; using BlossomiShymae.Briar.WebSocket.Events;
@@ -53,6 +54,9 @@ public partial class WebSocketViewModel : PageBase, IEnableLogger
public IReadOnlyList<EventViewModel> FilteredEventLog => string.IsNullOrWhiteSpace(Search) ? EventLog : [.. EventLog.Where(x => x.Key.Contains(Search, StringComparison.InvariantCultureIgnoreCase))]; public IReadOnlyList<EventViewModel> FilteredEventLog => string.IsNullOrWhiteSpace(Search) ? EventLog : [.. EventLog.Where(x => x.Key.Contains(Search, StringComparison.InvariantCultureIgnoreCase))];
[ObservableProperty]
private Vector _eventLogOffset = new();
[NotifyPropertyChangedFor(nameof(FilteredEventLog))] [NotifyPropertyChangedFor(nameof(FilteredEventLog))]
[ObservableProperty] [ObservableProperty]
private string _search = string.Empty; private string _search = string.Empty;
@@ -75,6 +79,9 @@ public partial class WebSocketViewModel : PageBase, IEnableLogger
[ObservableProperty] [ObservableProperty]
private TextDocument _document = new(); private TextDocument _document = new();
[ObservableProperty]
private Vector _documentOffset = new();
public override async Task InitializeAsync() public override async Task InitializeAsync()
{ {
await InitializeEventTypes(); await InitializeEventTypes();

View File

@@ -1,4 +1,5 @@
using Avalonia.Media; using Avalonia;
using Avalonia.Media;
using AvaloniaEdit.Document; using AvaloniaEdit.Document;
using BlossomiShymae.Briar; using BlossomiShymae.Briar;
using BlossomiShymae.Briar.Utils; using BlossomiShymae.Briar.Utils;
@@ -42,9 +43,21 @@ public partial class RequestViewModel : ObservableObject, IEnableLogger
[ObservableProperty] [ObservableProperty]
private TextDocument _requestDocument = new(); private TextDocument _requestDocument = new();
[ObservableProperty]
private Vector _requestDocumentOffset = new();
[ObservableProperty] [ObservableProperty]
private TextDocument _responseDocument = new(); private TextDocument _responseDocument = new();
[ObservableProperty]
private Vector _responseDocumentOffset = new();
[ObservableProperty]
private double _responseDocumentHorizontalScrollBar;
[ObservableProperty]
private double _responseDocumentVerticalScrollBar;
[ObservableProperty] [ObservableProperty]
private string? _responsePath; private string? _responsePath;

View File

@@ -59,7 +59,13 @@
Margin="0 8 0 0" Margin="0 8 0 0"
FontSize="12" FontSize="12"
Grid.Row="1" Grid.Row="1"
Grid.Column="0"/> Grid.Column="0">
<avaloniaEdit:TextEditor.Styles>
<Style Selector="ScrollViewer#PART_ScrollViewer">
<Setter Property="Offset" Value="{Binding Request.RequestDocumentOffset, Mode=TwoWay}"/>
</Style>
</avaloniaEdit:TextEditor.Styles>
</avaloniaEdit:TextEditor>
</Grid> </Grid>
<Grid RowDefinitions="35,*" <Grid RowDefinitions="35,*"
ColumnDefinitions="*" ColumnDefinitions="*"
@@ -83,7 +89,13 @@
ShowLineNumbers="True" ShowLineNumbers="True"
IsReadOnly="True" IsReadOnly="True"
Text="" Text=""
FontSize="12"/> FontSize="12">
<avaloniaEdit:TextEditor.Styles>
<Style Selector="ScrollViewer#PART_ScrollViewer">
<Setter Property="Offset" Value="{Binding Request.ResponseDocumentOffset, Mode=TwoWay}"/>
</Style>
</avaloniaEdit:TextEditor.Styles>
</avaloniaEdit:TextEditor>
</Grid> </Grid>
</Grid> </Grid>
</controls:BusyArea> </controls:BusyArea>

View File

@@ -10,7 +10,7 @@
x:DataType="vm:EndpointListViewModel"> x:DataType="vm:EndpointListViewModel">
<Grid RowDefinitions="auto,auto,*" ColumnDefinitions="*"> <Grid RowDefinitions="auto,auto,*" ColumnDefinitions="*">
<TextBox Watermark="Search" Margin="0 0 0 4" Text="{Binding Search}" Grid.Row="1" Grid.Column="0"/> <TextBox Watermark="Search" Margin="0 0 0 4" Text="{Binding Search}" Grid.Row="1" Grid.Column="0"/>
<ScrollViewer Grid.Row="2" Grid.Column="0"> <ScrollViewer Grid.Row="2" Grid.Column="0" Offset="{Binding Offset, Mode=TwoWay}">
<ItemsControl ItemsSource="{Binding EndpointSearchDetails}"> <ItemsControl ItemsSource="{Binding EndpointSearchDetails}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate> <DataTemplate>

View File

@@ -50,6 +50,11 @@
Margin="0 0 0 0" Margin="0 0 0 0"
Grid.Row="1" Grid.Row="1"
Grid.Column="0"> Grid.Column="0">
<ListBox.Styles>
<Style Selector="ScrollViewer#PART_ScrollViewer">
<Setter Property="Offset" Value="{Binding Offset, Mode=TwoWay}"/>
</Style>
</ListBox.Styles>
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:PathOperationViewModel"> <DataTemplate x:DataType="vm:PathOperationViewModel">
<ContentControl Content="{Binding}"/> <ContentControl Content="{Binding}"/>
@@ -92,7 +97,7 @@
<Grid Grid.Row="1" Grid.Column="2"> <Grid Grid.Row="1" Grid.Column="2">
<TabControl> <TabControl>
<TabItem Header="Params"> <TabItem Header="Params">
<ScrollViewer> <ScrollViewer Offset="{Binding ParamsOffset, Mode=TwoWay}">
<StackPanel IsVisible="{Binding SelectedPathOperation, Converter={StaticResource NullableToVisibilityConverter}}"> <StackPanel IsVisible="{Binding SelectedPathOperation, Converter={StaticResource NullableToVisibilityConverter}}">
<controls:Card <controls:Card
Margin="0 4" Margin="0 4"
@@ -155,7 +160,13 @@
VerticalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
Text="" Text=""
ShowLineNumbers="True" ShowLineNumbers="True"
FontSize="12"/> FontSize="12">
<avalonEdit:TextEditor.Styles>
<Style Selector="ScrollViewer#PART_ScrollViewer">
<Setter Property="Offset" Value="{Binding SelectedPathOperation.Request.Value.RequestDocumentOffset, Mode=TwoWay}"/>
</Style>
</avalonEdit:TextEditor.Styles>
</avalonEdit:TextEditor>
</TabItem> </TabItem>
<TabItem Header="Auth"> <TabItem Header="Auth">
<Grid RowDefinitions="auto,auto,auto,*" ColumnDefinitions="*,4*"> <Grid RowDefinitions="auto,auto,auto,*" ColumnDefinitions="*,4*">
@@ -197,7 +208,7 @@
</Grid> </Grid>
</TabItem> </TabItem>
<TabItem Header="Schemas"> <TabItem Header="Schemas">
<ScrollViewer> <ScrollViewer Offset="{Binding SchemasOffset, Mode=TwoWay}">
<StackPanel> <StackPanel>
<controls:Card Margin="0 4" IsVisible="{Binding SelectedPathOperation.Operation.RequestBodyType, Converter={StaticResource NullableToVisibilityConverter}}"> <controls:Card Margin="0 4" IsVisible="{Binding SelectedPathOperation.Operation.RequestBodyType, Converter={StaticResource NullableToVisibilityConverter}}">
<TextBlock> <TextBlock>
@@ -266,7 +277,13 @@
ShowLineNumbers="True" ShowLineNumbers="True"
IsReadOnly="True" IsReadOnly="True"
Text="" Text=""
FontSize="12"/> FontSize="12">
<avalonEdit:TextEditor.Styles>
<Style Selector="ScrollViewer#PART_ScrollViewer">
<Setter Property="Offset" Value="{Binding SelectedPathOperation.Request.Value.ResponseDocumentOffset, Mode=TwoWay}"/>
</Style>
</avalonEdit:TextEditor.Styles>
</avalonEdit:TextEditor>
</TabItem> </TabItem>
</TabControl> </TabControl>
</controls:BusyArea> </controls:BusyArea>

View File

@@ -93,7 +93,8 @@
Grid.Row="0">Libraries</TextBlock> Grid.Row="0">Libraries</TextBlock>
<ScrollViewer Grid.Column="0" <ScrollViewer Grid.Column="0"
Grid.Row="1" Grid.Row="1"
HorizontalScrollBarVisibility="Disabled"> HorizontalScrollBarVisibility="Disabled"
Offset="{Binding LibrariesOffset, Mode=TwoWay}">
<ItemsRepeater ItemsSource="{Binding Libraries}"> <ItemsRepeater ItemsSource="{Binding Libraries}">
<ItemsRepeater.ItemTemplate> <ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="vm:LibraryViewModel"> <DataTemplate x:DataType="vm:LibraryViewModel">

View File

@@ -19,7 +19,8 @@
Grid.Row="0" Grid.Row="0"
Grid.Column="0"/> Grid.Column="0"/>
<ScrollViewer Grid.Row="1" <ScrollViewer Grid.Row="1"
Grid.Column="0"> Grid.Column="0"
Offset="{Binding Offset, Mode=TwoWay}">
<ItemsControl ItemsSource="{Binding SchemaItems}"> <ItemsControl ItemsSource="{Binding SchemaItems}">
<ItemsControl.Styles> <ItemsControl.Styles>
<Style Selector="views|SchemaItemView"> <Style Selector="views|SchemaItemView">

View File

@@ -54,6 +54,11 @@
ItemsSource="{Binding FilteredEventLog}" ItemsSource="{Binding FilteredEventLog}"
SelectedItem="{Binding SelectedEventLog}" SelectedItem="{Binding SelectedEventLog}"
ScrollViewer.HorizontalScrollBarVisibility="Auto"> ScrollViewer.HorizontalScrollBarVisibility="Auto">
<ListBox.Styles>
<Style Selector="ScrollViewer#PART_ScrollViewer">
<Setter Property="Offset" Value="{Binding EventLogOffset, Mode=TwoWay}"/>
</Style>
</ListBox.Styles>
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:EventViewModel"> <DataTemplate x:DataType="vm:EventViewModel">
<ContentControl Content="{Binding}"/> <ContentControl Content="{Binding}"/>
@@ -72,7 +77,13 @@
HorizontalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
Text="" Text=""
FontSize="12"/> FontSize="12">
<avaloniaEdit:TextEditor.Styles>
<Style Selector="ScrollViewer#PART_ScrollViewer">
<Setter Property="Offset" Value="{Binding DocumentOffset, Mode=TwoWay}"/>
</Style>
</avaloniaEdit:TextEditor.Styles>
</avaloniaEdit:TextEditor>
</Border> </Border>
</Grid> </Grid>
</UserControl> </UserControl>