mirror of
https://fastgit.cc/github.com/sourcegit-scm/sourcegit
synced 2026-04-23 18:30:34 +08:00
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
|
||||
@@ -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}"/>
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}"/>
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user