FileItem now support work as a selector.

Move To now works.
This commit is contained in:
Creeper Lv
2026-01-23 23:19:00 +11:00
parent 4bc2295a7f
commit 14de38a329
5 changed files with 176 additions and 10 deletions

View File

@@ -6,8 +6,8 @@
x:Class="Progrart.Controls.FileItem" HorizontalAlignment="Stretch">
<StackPanel>
<Grid>
<Border Background="#2288EE" Margin="2,5" Width="4" CornerRadius="4" HorizontalAlignment="Left" Name="SelectIndicator" IsVisible="False"/>
<Button Name="MainButton" HorizontalAlignment="Stretch">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="_Open" Name="OpenFileMenuItem">
@@ -30,9 +30,9 @@
<MenuItem Header="_Folder" Name="CreateFolderItem"/>
</MenuItem>
<Separator/>
<MenuItem Header="_Copy"/>
<MenuItem Header="Cut (_x)"/>
<MenuItem Header="_Paste"/>
<MenuItem Header="_Copy To" Name="CopyToMenuItem"/>
<MenuItem Header="_Move to" Name="MoveToMenuItem"/>
<!--<MenuItem Header="_Paste"/>-->
<Separator/>
<MenuItem Header="_Delete"/>
</ContextMenu>

View File

@@ -8,6 +8,7 @@ using Progrart.Controls.TabSystem;
using Progrart.Dialogs;
using Progrart.Icons;
using Progrart.Pages;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
@@ -18,14 +19,23 @@ public partial class FileItem : UserControl
IStorageItem? currentItem;
bool isOpen = false;
string extension = "";
FileItem? root = null;
bool isSelectOnly = false;
public IStorageItem? CurrentItem => currentItem;
public Action<FileItem>? onSelected = null;
public FileItem()
{
InitializeComponent();
}
public FileItem(IStorageItem storageItem)
public FileItem(IStorageItem storageItem, FileItem? RootItem, bool SelectOnly = false)
{
InitializeComponent();
this.root = RootItem;
isSelectOnly = SelectOnly;
if (isSelectOnly)
{
MainButton.ContextMenu = null;
}
currentItem = storageItem;
if (storageItem is IStorageFolder folder)
{
@@ -63,6 +73,11 @@ public partial class FileItem : UserControl
IconContainer.IsVisible = true;
}
NameBlock.Text = storageItem.Name;
if (isSelectOnly)
MainButton.Click += (a, b) =>
{
(root ?? this).SelectFileItem(this);
};
MainButton.DoubleTapped += async (_, _) =>
{
await OpenItem();
@@ -87,7 +102,7 @@ public partial class FileItem : UserControl
if (isOpen)
Dispatcher.UIThread.Invoke(() =>
{
var fitem = new FileItem(fldr);
var fitem = new FileItem(fldr, root ?? this, SelectOnly);
ItemContainer.Children.Add(fitem);
});
}
@@ -107,6 +122,8 @@ public partial class FileItem : UserControl
};
await DialogHost.Show(content);
};
CopyToMenuItem.Click += CopyToMenuItem_Click;
MoveToMenuItem.Click += MoveToMenuItem_Click;
CreateProgrartItem.Click += async (a, b) =>
{
InputDialog content = new();
@@ -123,7 +140,7 @@ public partial class FileItem : UserControl
if (isOpen)
Dispatcher.UIThread.Invoke(() =>
{
var fitem = new FileItem(fldr);
var fitem = new FileItem(fldr, root ?? this, SelectOnly);
ItemContainer.Children.Add(fitem);
});
}
@@ -144,6 +161,46 @@ public partial class FileItem : UserControl
await DialogHost.Show(content);
};
}
private async void MoveToMenuItem_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
var content = new BrowserDialog();
content.Title = "";
content.onOK = async (si) =>
{
if (si is IStorageFolder destFolder)
{
if (currentItem is not null)
{
await currentItem.MoveAsync(destFolder);
}
}
return true;
};
if ((root ?? this).CurrentItem is IStorageItem item)
content.SetFileITem(new FileItem(item, null, true));
await DialogHost.Show(content);
}
private async void CopyToMenuItem_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
var content = new BrowserDialog();
content.onOK = async (si) =>
{
if (currentItem is IStorageFolder folder)
{
}
else if (currentItem is IStorageFile file)
{
}
return true;
};
if ((root ?? this).CurrentItem is IStorageItem item)
content.SetFileITem(new FileItem(item, null, true));
await DialogHost.Show(content);
}
public async Task OpenItem()
{
@@ -198,9 +255,14 @@ public partial class FileItem : UserControl
{
await foreach (var item in folder.GetItemsAsync())
{
if (isSelectOnly)
{
if (item is IStorageFile)
continue;
}
Dispatcher.UIThread.Invoke(() =>
{
var fitem = new FileItem(item);
var fitem = new FileItem(item, root ?? this, isSelectOnly);
ItemContainer.Children.Add(fitem);
});
}
@@ -209,4 +271,16 @@ public partial class FileItem : UserControl
{
ItemContainer.Children.Clear();
}
public void SelectFileItem(FileItem item)
{
if (root == null) onSelected?.Invoke(item);
SelectIndicator.IsVisible = this == item;
foreach (var citem in ItemContainer.Children)
{
if (citem is FileItem fi)
{
fi.SelectFileItem(item);
}
}
}
}

View File

@@ -0,0 +1,25 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Progrart.Dialogs.BrowserDialog">
<StackPanel>
<TextBlock Name="DialogTitle" FontSize="16" TextWrapping="Wrap">Select A Folder</TextBlock>
<StackPanel Name="FileRoot">
<StackPanel.Styles>
<Style Selector="Button">
<Setter Property="Background" Value="#01000000"/>
</Style>
</StackPanel.Styles>
</StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Classes="accent" Name="OKBtn" Content="OK"/>
<Button HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" Name="CancelBtn" Grid.Column="1" Content="Cancel"/>
</Grid>
</StackPanel>
</UserControl>

View File

@@ -0,0 +1,67 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.Platform.Storage;
using DialogHostAvalonia;
using Progrart.Controls;
using System;
using System.Threading.Tasks;
namespace Progrart.Dialogs;
public partial class BrowserDialog : UserControl
{
public Func<IStorageItem, Task<bool>>? onOK = null;
public Func<bool>? onCancel = null;
public string Title
{
get => DialogTitle.Text ?? "";
set => DialogTitle.Text = value;
}
public BrowserDialog()
{
InitializeComponent();
OKBtn.Click += OKBtn_Click;
CancelBtn.Click += CancelBtn_Click;
}
IStorageItem? currentItem = null;
public void SetFileITem(FileItem item)
{
FileRoot.Children.Add(item);
item.onSelected = async (it) =>
{
currentItem = it.CurrentItem;
};
}
private void CancelBtn_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
Cancel();
}
private void Cancel()
{
if (!(onCancel?.Invoke()) ?? true)
{
DialogHost.Close(null);
}
}
private async void OKBtn_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
{
await Confirmed();
}
private async Task Confirmed()
{
if (currentItem is null) return;
if (onOK is not null)
{
if (!await onOK(currentItem))
{
DialogHost.Close(null);
}
}
else
DialogHost.Close(null);
}
}

View File

@@ -109,7 +109,7 @@ public partial class MainView : UserControl
FileContainer.Children.Clear();
var folder = folders[0];
App.CurrentOpenFolder = folder;
FileItem item1 = new(folder);
FileItem item1 = new(folder, null, false);
FileContainer.Children.Add(item1);
await foreach (var item in folder.GetItemsAsync())
{