186 lines
4.1 KiB
C#
186 lines
4.1 KiB
C#
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Markup.Xaml;
|
|
using Avalonia.Platform.Storage;
|
|
using Avalonia.Threading;
|
|
using DialogHostAvalonia;
|
|
using Progrart.Controls.TabSystem;
|
|
using Progrart.Dialogs;
|
|
using Progrart.Icons;
|
|
using Progrart.Pages;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Progrart.Controls;
|
|
|
|
public partial class FileItem : UserControl
|
|
{
|
|
IStorageItem currentItem;
|
|
bool isOpen = false;
|
|
string extension = "";
|
|
public FileItem(IStorageItem storageItem)
|
|
{
|
|
InitializeComponent();
|
|
currentItem = storageItem;
|
|
if (storageItem is IStorageFolder folder)
|
|
{
|
|
FolderIcon.IsVisible = true;
|
|
GenericFileIcon.IsVisible = false;
|
|
IconContainer.IsVisible = false;
|
|
}
|
|
else if (storageItem is IStorageFile file)
|
|
{
|
|
NewFiles.IsVisible = false;
|
|
FolderIcon.IsVisible = false;
|
|
GenericFileIcon.IsVisible = true;
|
|
IconContainer.Children.Clear();
|
|
var dotIndex = file.Name.LastIndexOf('.');
|
|
if (dotIndex >= 0)
|
|
{
|
|
extension = file.Name[(dotIndex + 1)..];
|
|
if (IconProvider.TryGetIcon(extension, out var icon))
|
|
{
|
|
GenericFileIcon.IsVisible = false;
|
|
IconContainer.Children.Add(icon);
|
|
}
|
|
}
|
|
IconContainer.IsVisible = true;
|
|
}
|
|
NameBlock.Text = storageItem.Name;
|
|
MainButton.DoubleTapped += async (_, _) =>
|
|
{
|
|
OpenItem();
|
|
};
|
|
OpenFileMenuItem.Click += async (a, b) =>
|
|
{
|
|
OpenItem();
|
|
};
|
|
CreateFolderItem.Click += async (a, b) =>
|
|
{
|
|
InputDialog content = new();
|
|
content.SetDialogContent("Create New Folder", "Specify a name that is legal for your filesystem.");
|
|
content.onOK = async (v) =>
|
|
{
|
|
if (currentItem is IStorageFolder folder)
|
|
{
|
|
try
|
|
{
|
|
var fldr = await folder.CreateFolderAsync(v);
|
|
if (fldr is not null)
|
|
{
|
|
if (isOpen)
|
|
Dispatcher.UIThread.Invoke(() =>
|
|
{
|
|
var fitem = new FileItem(fldr);
|
|
ItemContainer.Children.Add(fitem);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
content.SetErrorMessage($"{v} is not a valid name for target filesystem.");
|
|
return true;
|
|
}
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
content.SetErrorMessage($"{v} is not a valid name for target filesystem.\nMsg:{e.Message}");
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
await DialogHost.Show(content);
|
|
};
|
|
CreateProgrartItem.Click += async (a, b) =>
|
|
{
|
|
InputDialog content = new();
|
|
content.SetDialogContent("Create A PROGRART Image", "Specify a name that is legal for your filesystem.");
|
|
content.onOK = async (v) =>
|
|
{
|
|
if (currentItem is IStorageFolder folder)
|
|
{
|
|
try
|
|
{
|
|
var fldr = await folder.CreateFileAsync($"{v}.progrart");
|
|
if (fldr is not null)
|
|
{
|
|
if (isOpen)
|
|
Dispatcher.UIThread.Invoke(() =>
|
|
{
|
|
var fitem = new FileItem(fldr);
|
|
ItemContainer.Children.Add(fitem);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
content.SetErrorMessage($"{v} is not a valid name for target filesystem.");
|
|
return true;
|
|
}
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
content.SetErrorMessage($"{v} is not a valid name for target filesystem.\nMsg:{e.Message}");
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
await DialogHost.Show(content);
|
|
};
|
|
}
|
|
void OpenItem()
|
|
{
|
|
|
|
if (currentItem is IStorageFolder folder)
|
|
{
|
|
if (isOpen)
|
|
{
|
|
RemoveAll();
|
|
isOpen = false;
|
|
}
|
|
else
|
|
{
|
|
isOpen = true;
|
|
Task.Run(async () =>
|
|
{
|
|
await LoadAll(folder);
|
|
});
|
|
}
|
|
}
|
|
else
|
|
if (currentItem is IStorageFile file)
|
|
{
|
|
var btn = EditorProvider.IsOpen(file);
|
|
if (btn is not null)
|
|
{
|
|
EditorProvider.SelectTabPage(btn);
|
|
}
|
|
else
|
|
if (EditorProvider.TryGetEditor(extension, out var page))
|
|
{
|
|
if (page is ITabPage editor)
|
|
{
|
|
if (page is IEditorPage editor_page)
|
|
{
|
|
editor_page.LoadDocument(file);
|
|
}
|
|
EditorProvider.OpenEditor(editor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
async Task LoadAll(IStorageFolder folder)
|
|
{
|
|
await foreach (var item in folder.GetItemsAsync())
|
|
{
|
|
Dispatcher.UIThread.Invoke(() =>
|
|
{
|
|
var fitem = new FileItem(item);
|
|
ItemContainer.Children.Add(fitem);
|
|
});
|
|
}
|
|
}
|
|
void RemoveAll()
|
|
{
|
|
ItemContainer.Children.Clear();
|
|
}
|
|
} |