project: upgrade dependencies

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-10-09 11:54:27 +08:00
parent 050e058f7d
commit 501aae9867
11 changed files with 156 additions and 139 deletions

View File

@@ -7,7 +7,7 @@ The project uses the following third-party libraries or assets
### AvaloniaUI
- **Source**: https://github.com/AvaloniaUI/Avalonia
- **Version**: 11.3.6
- **Version**: 11.3.7
- **License**: MIT License
- **License Link**: https://github.com/AvaloniaUI/Avalonia/blob/master/licence.md
@@ -35,14 +35,14 @@ The project uses the following third-party libraries or assets
### OpenAI .NET SDK
- **Source**: https://github.com/openai/openai-dotnet
- **Version**: 2.4.0
- **Version**: 2.5.0
- **License**: MIT License
- **License Link**: https://github.com/openai/openai-dotnet/blob/main/LICENSE
### Azure.AI.OpenAI
- **Source**: https://github.com/Azure/azure-sdk-for-net
- **Version**: 2.3.0-beta.2
- **Version**: 2.5.0-beta.1
- **License**: MIT License
- **License Link**: https://github.com/Azure/azure-sdk-for-net/blob/main/LICENSE.txt

View File

@@ -14,6 +14,7 @@ using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Data.Core.Plugins;
using Avalonia.Input.Platform;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Media.Fonts;
@@ -324,7 +325,7 @@ namespace SourceGit
public static async Task<string> GetClipboardTextAsync()
{
if (Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime { MainWindow.Clipboard: { } clipboard })
return await clipboard.GetTextAsync();
return await clipboard.TryGetTextAsync();
return null;
}

View File

@@ -39,19 +39,19 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.6" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.6" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.6" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.6" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.6" />
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.6" Condition="'$(Configuration)' == 'Debug'" />
<PackageReference Include="Avalonia" Version="11.3.7" />
<PackageReference Include="Avalonia.Controls.DataGrid" Version="11.3.7" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.7" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.7" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.7" />
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.7" Condition="'$(Configuration)' == 'Debug'" />
<PackageReference Include="Avalonia.AvaloniaEdit" Version="11.3.0" />
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.3.0" />
<PackageReference Include="Azure.AI.OpenAI" Version="2.3.0-beta.2" />
<PackageReference Include="Azure.AI.OpenAI" Version="2.5.0-beta.1" />
<PackageReference Include="BitMiracle.LibTiff.NET" Version="2.4.660" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="LiveChartsCore.SkiaSharpView.Avalonia" Version="2.0.0-rc6.1" />
<PackageReference Include="OpenAI" Version="2.4.0" />
<PackageReference Include="OpenAI" Version="2.5.0" />
<PackageReference Include="Pfim" Version="0.11.3" />
<PackageReference Include="TextMateSharp" Version="1.0.70" />
<PackageReference Include="TextMateSharp.Grammars" Version="1.0.70" />

View File

@@ -176,6 +176,22 @@ namespace SourceGit.ViewModels
activePage.Popup = new CreateGroup(null);
}
public RepositoryNode FindNodeById(string id, RepositoryNode root = null)
{
var collection = (root == null) ? Preferences.Instance.RepositoryNodes : root.SubNodes;
foreach (var node in collection)
{
if (node.Id.Equals(id, StringComparison.Ordinal))
return node;
var sub = FindNodeById(id, node);
if (sub != null)
return sub;
}
return null;
}
public RepositoryNode FindParentGroup(RepositoryNode node, RepositoryNode group = null)
{
var collection = (group == null) ? Preferences.Instance.RepositoryNodes : group.SubNodes;

View File

@@ -3,6 +3,7 @@ using System.Text;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Interactivity;
namespace SourceGit.Views
@@ -51,7 +52,7 @@ namespace SourceGit.Views
var clipboard = TopLevel.GetTopLevel(this)?.Clipboard;
if (clipboard != null)
{
var text = await clipboard.GetTextAsync();
var text = await clipboard.TryGetTextAsync();
if (!string.IsNullOrEmpty(text))
OnTextInput(new TextInputEventArgs() { Text = text });
}

View File

@@ -94,8 +94,9 @@
<!-- Drag & Drop Anchor -->
<Border Grid.Column="0" Background="Transparent"
Loaded="OnSetupRowHeaderDragDrop"
PointerPressed="OnRowHeaderPointerPressed">
PointerPressed="OnRowHeaderPointerPressed"
DragDrop.AllowDrop="True"
DragDrop.DragOver="OnRowHeaderDragOver">
<ToolTip.Tip>
<TextBlock>
<Run Text="{DynamicResource Text.InteractiveRebase.ReorderTip}"/>

View File

@@ -136,54 +136,62 @@ namespace SourceGit.Views
OpenCommitMessageEditor(items[0]);
}
private void OnSetupRowHeaderDragDrop(object sender, RoutedEventArgs e)
{
if (sender is Border border)
{
DragDrop.SetAllowDrop(border, true);
border.AddHandler(DragDrop.DragOverEvent, OnRowHeaderDragOver);
}
}
private void OnRowHeaderPointerPressed(object sender, PointerPressedEventArgs e)
private async void OnRowHeaderPointerPressed(object sender, PointerPressedEventArgs e)
{
if (sender is Border { DataContext: ViewModels.InteractiveRebaseItem item })
{
var data = new DataObject();
data.Set("InteractiveRebaseItem", item);
DragDrop.DoDragDrop(e, data, DragDropEffects.Move | DragDropEffects.Copy | DragDropEffects.Link);
var data = new DataTransfer();
data.Add(DataTransferItem.Create(_dndItemFormat, item.Commit.SHA));
await DragDrop.DoDragDropAsync(e, data, DragDropEffects.Move);
}
}
private void OnRowHeaderDragOver(object sender, DragEventArgs e)
{
if (DataContext is ViewModels.InteractiveRebase vm &&
e.Data.Contains("InteractiveRebaseItem") &&
e.Data.Get("InteractiveRebaseItem") is ViewModels.InteractiveRebaseItem src &&
sender is Border { DataContext: ViewModels.InteractiveRebaseItem dst } border &&
src != dst)
if (DataContext is not ViewModels.InteractiveRebase vm)
return;
if (e.DataTransfer.TryGetValue(_dndItemFormat) is not { Length: > 6 } sha)
return;
ViewModels.InteractiveRebaseItem src = null;
foreach (var item in vm.Items)
{
e.DragEffects = DragDropEffects.Move | DragDropEffects.Copy | DragDropEffects.Link;
var p = e.GetPosition(border);
if (p.Y > border.Bounds.Height * 0.33 && p.Y < border.Bounds.Height * 0.67)
if (item.Commit.SHA.Equals(sha, StringComparison.Ordinal))
{
var srcIdx = vm.Items.IndexOf(src);
var dstIdx = vm.Items.IndexOf(dst);
if (srcIdx < dstIdx)
{
for (var i = srcIdx; i < dstIdx; i++)
vm.MoveItemDown(src);
}
else
{
for (var i = srcIdx; i > dstIdx; i--)
vm.MoveItemUp(src);
}
src = item;
break;
}
e.Handled = true;
}
if (src == null)
return;
if (sender is not Border { DataContext: ViewModels.InteractiveRebaseItem dst } border)
return;
if (src == dst)
return;
var p = e.GetPosition(border);
if (p.Y > border.Bounds.Height * 0.33 && p.Y < border.Bounds.Height * 0.67)
{
var srcIdx = vm.Items.IndexOf(src);
var dstIdx = vm.Items.IndexOf(dst);
if (srcIdx < dstIdx)
{
for (var i = srcIdx; i < dstIdx; i++)
vm.MoveItemDown(src);
}
else
{
for (var i = srcIdx; i > dstIdx; i--)
vm.MoveItemUp(src);
}
}
e.DragEffects = DragDropEffects.Move;
e.Handled = true;
}
private void OnButtonActionClicked(object sender, RoutedEventArgs e)
@@ -293,5 +301,6 @@ namespace SourceGit.Views
}
private bool _firstSelectionChangedHandled = false;
private readonly DataFormat<string> _dndItemFormat = DataFormat.CreateStringApplicationFormat("sourcegit-dnd-ir-item");
}
}

View File

@@ -47,8 +47,9 @@
PointerPressed="OnPointerPressedTab"
PointerMoved="OnPointerMovedOverTab"
PointerReleased="OnPointerReleasedTab"
Loaded="SetupDragAndDrop"
ContextRequested="OnTabContextRequested">
ContextRequested="OnTabContextRequested"
DragDrop.AllowDrop="True"
DragDrop.Drop="DropTab">
<ToolTip.Tip>
<Grid>
<TextBlock Text="{DynamicResource Text.Welcome}" IsVisible="{Binding !Node.IsRepository}"/>

View File

@@ -161,16 +161,6 @@ namespace SourceGit.Views
InvalidateVisual();
}
private void SetupDragAndDrop(object sender, RoutedEventArgs e)
{
if (sender is Border border)
{
DragDrop.SetAllowDrop(border, true);
border.AddHandler(DragDrop.DropEvent, DropTab);
}
e.Handled = true;
}
private void OnPointerPressedTab(object sender, PointerPressedEventArgs e)
{
if (sender is Border border)
@@ -196,7 +186,7 @@ namespace SourceGit.Views
_startDragTab = false;
}
private void OnPointerMovedOverTab(object sender, PointerEventArgs e)
private async void OnPointerMovedOverTab(object sender, PointerEventArgs e)
{
if (_pressedTab && !_startDragTab && sender is Border { DataContext: ViewModels.LauncherPage page } border)
{
@@ -207,23 +197,42 @@ namespace SourceGit.Views
_startDragTab = true;
var data = new DataObject();
data.Set("MovedTab", page);
DragDrop.DoDragDrop(e, data, DragDropEffects.Move);
var data = new DataTransfer();
data.Add(DataTransferItem.Create(_dndMainTabFormat, page.Node.Id));
await DragDrop.DoDragDropAsync(e, data, DragDropEffects.Move);
}
e.Handled = true;
}
private void DropTab(object sender, DragEventArgs e)
{
if (e.Data.Contains("MovedTab") &&
e.Data.Get("MovedTab") is ViewModels.LauncherPage moved &&
sender is Border { DataContext: ViewModels.LauncherPage to } &&
to != moved)
if (e.DataTransfer.TryGetValue(_dndMainTabFormat) is not { Length: > 0 } id)
return;
if (DataContext is not ViewModels.Launcher launcher)
return;
ViewModels.LauncherPage target = null;
foreach (var page in launcher.Pages)
{
(DataContext as ViewModels.Launcher)?.MoveTab(moved, to);
if (page.Node.Id.Equals(id, StringComparison.Ordinal))
{
target = page;
break;
}
}
if (target == null)
return;
if (sender is not Border { DataContext: ViewModels.LauncherPage to })
return;
if (target == to)
return;
launcher.MoveTab(target, to);
_pressedTab = false;
_startDragTab = false;
e.Handled = true;
@@ -317,5 +326,6 @@ namespace SourceGit.Views
private bool _pressedTab = false;
private Point _pressedTabPosition = new();
private bool _startDragTab = false;
private readonly DataFormat<string> _dndMainTabFormat = DataFormat.CreateStringApplicationFormat("sourcegit-dnd-main-tab");
}
}

View File

@@ -60,8 +60,10 @@
ScrollViewer.VerticalScrollBarVisibility="Auto"
ItemsSource="{Binding Rows}"
SelectionMode="Single"
Loaded="SetupTreeViewDragAndDrop"
LostFocus="OnTreeViewLostFocus">
LostFocus="OnTreeViewLostFocus"
DragDrop.AllowDrop="True"
DragDrop.DragOver="DragOverTreeView"
DragDrop.Drop="DropOnTreeView">
<ListBox.Styles>
<Style Selector="ListBox">
<Setter Property="FocusAdorner">
@@ -106,13 +108,15 @@
Height="30"
ColumnDefinitions="16,18,Auto,*"
Margin="{Binding Depth, Converter={x:Static c:IntConverters.ToTreeMargin}}"
Loaded="SetupTreeNodeDragAndDrop"
ClipToBounds="True"
ContextRequested="OnTreeNodeContextRequested"
PointerPressed="OnPointerPressedTreeNode"
PointerMoved="OnPointerMovedOverTreeNode"
PointerReleased="OnPointerReleasedOnTreeNode"
DoubleTapped="OnDoubleTappedTreeNode"
ClipToBounds="True">
DragDrop.AllowDrop="True"
DragDrop.DragOver="DragOverTreeNode"
DragDrop.Drop="DropOnTreeNode">
<v:RepositoryTreeNodeToggleButton Grid.Column="0"
Classes="tree_expander"
Focusable="False"

View File

@@ -81,26 +81,6 @@ namespace SourceGit.Views
}
}
private void SetupTreeViewDragAndDrop(object sender, RoutedEventArgs _)
{
if (sender is ListBox view)
{
DragDrop.SetAllowDrop(view, true);
view.AddHandler(DragDrop.DragOverEvent, DragOverTreeView);
view.AddHandler(DragDrop.DropEvent, DropOnTreeView);
}
}
private void SetupTreeNodeDragAndDrop(object sender, RoutedEventArgs _)
{
if (sender is Grid grid)
{
DragDrop.SetAllowDrop(grid, true);
grid.AddHandler(DragDrop.DragOverEvent, DragOverTreeNode);
grid.AddHandler(DragDrop.DropEvent, DropOnTreeNode);
}
}
private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs ev)
{
if (sender is Grid { DataContext: ViewModels.RepositoryNode node } grid)
@@ -228,7 +208,7 @@ namespace SourceGit.Views
_startDragTreeNode = false;
}
private void OnPointerMovedOverTreeNode(object sender, PointerEventArgs e)
private async void OnPointerMovedOverTreeNode(object sender, PointerEventArgs e)
{
if (_pressedTreeNode && !_startDragTreeNode &&
sender is Grid { DataContext: ViewModels.RepositoryNode node } grid)
@@ -240,9 +220,9 @@ namespace SourceGit.Views
_startDragTreeNode = true;
var data = new DataObject();
data.Set("MovedRepositoryTreeNode", node);
DragDrop.DoDragDrop(e, data, DragDropEffects.Move);
var data = new DataTransfer();
data.Add(DataTransferItem.Create(_dndRepoNode, node.Id));
await DragDrop.DoDragDropAsync(e, data, DragDropEffects.Move);
}
}
@@ -254,7 +234,7 @@ namespace SourceGit.Views
private void DragOverTreeView(object sender, DragEventArgs e)
{
if (e.Data.Contains("MovedRepositoryTreeNode") || e.Data.Contains(DataFormats.Files))
if (e.DataTransfer.Contains(DataFormat.File) || e.DataTransfer.Contains(_dndRepoNode))
{
e.DragEffects = DragDropEffects.Move;
e.Handled = true;
@@ -268,33 +248,31 @@ namespace SourceGit.Views
private async void DropOnTreeView(object sender, DragEventArgs e)
{
if (e.Data.Contains("MovedRepositoryTreeNode") && e.Data.Get("MovedRepositoryTreeNode") is ViewModels.RepositoryNode moved)
if (e.DataTransfer.TryGetValue(_dndRepoNode) is { Length: > 1 } nodeId)
{
e.Handled = true;
var moved = ViewModels.Welcome.Instance.FindNodeById(nodeId);
ViewModels.Welcome.Instance.MoveNode(moved, null);
e.Handled = true;
}
else if (e.Data.Contains(DataFormats.Files))
else if (e.DataTransfer.Contains(DataFormat.File))
{
e.Handled = true;
var items = e.Data.GetFiles();
if (items != null)
var items = e.DataTransfer.TryGetFiles() ?? [];
var refresh = false;
foreach (var item in items)
{
var refresh = false;
foreach (var item in items)
var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath);
if (!string.IsNullOrEmpty(path))
{
var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath);
if (!string.IsNullOrEmpty(path))
{
ViewModels.Welcome.Instance.AddRepository(path, null, true, false);
refresh = true;
}
ViewModels.Welcome.Instance.AddRepository(path, null, true, false);
refresh = true;
}
if (refresh)
ViewModels.Welcome.Instance.Refresh();
}
if (refresh)
ViewModels.Welcome.Instance.Refresh();
}
_pressedTreeNode = false;
@@ -303,11 +281,9 @@ namespace SourceGit.Views
private void DragOverTreeNode(object sender, DragEventArgs e)
{
if (e.Data.Contains("MovedRepositoryTreeNode") || e.Data.Contains(DataFormats.Files))
if (e.DataTransfer.Contains(DataFormat.File) || e.DataTransfer.Contains(_dndRepoNode))
{
var grid = sender as Grid;
if (grid?.DataContext is not ViewModels.RepositoryNode)
if (sender is not Grid { DataContext: ViewModels.RepositoryNode })
return;
e.DragEffects = DragDropEffects.Move;
@@ -329,36 +305,33 @@ namespace SourceGit.Views
if (to.IsRepository)
to = ViewModels.Welcome.Instance.FindParentGroup(to);
if (e.Data.Contains("MovedRepositoryTreeNode") &&
e.Data.Get("MovedRepositoryTreeNode") is ViewModels.RepositoryNode moved)
if (e.DataTransfer.TryGetValue(_dndRepoNode) is { } nodeId)
{
e.Handled = true;
var moved = ViewModels.Welcome.Instance.FindNodeById(nodeId);
if (to != moved)
ViewModels.Welcome.Instance.MoveNode(moved, to);
}
else if (e.Data.Contains(DataFormats.Files))
else if (e.DataTransfer.Contains(DataFormat.File))
{
e.Handled = true;
var items = e.Data.GetFiles();
if (items != null)
var items = e.DataTransfer.TryGetFiles() ?? [];
var refresh = false;
foreach (var item in items)
{
var refresh = false;
foreach (var item in items)
var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath);
if (!string.IsNullOrEmpty(path))
{
var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath);
if (!string.IsNullOrEmpty(path))
{
ViewModels.Welcome.Instance.AddRepository(path, to, true, false);
refresh = true;
}
ViewModels.Welcome.Instance.AddRepository(path, to, true, false);
refresh = true;
}
if (refresh)
ViewModels.Welcome.Instance.Refresh();
}
if (refresh)
ViewModels.Welcome.Instance.Refresh();
}
_pressedTreeNode = false;
@@ -381,5 +354,6 @@ namespace SourceGit.Views
private bool _pressedTreeNode = false;
private Point _pressedTreeNodePosition = new Point();
private bool _startDragTreeNode = false;
private readonly DataFormat<string> _dndRepoNode = DataFormat.CreateStringApplicationFormat("sourcegit-dnd-repo-node");
}
}