Files
crosslangdevstudio/ViewModels/CRVMViewerViewModel.cs
2025-10-22 17:31:32 -05:00

103 lines
3.3 KiB
C#

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Media;
using Avalonia.Platform.Storage;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using CrossLangDevStudio.Messages;
using CrossLangDevStudio.Views;
namespace CrossLangDevStudio.ViewModels;
public class CRVMViewerViewModel : ViewModelBase
{
public string FilePath { get; set; }
public CRVMViewerViewModel(string path)
{
FilePath = path;
var clf = new CrossLangFile();
using (var strm = File.OpenRead(path))
{
clf.Load(strm);
}
foreach (var fn in clf.Functions)
{
string docs = $"/^{fn.NameParts[0]}^/";
string name = string.Join(".", fn.NameParts.Skip(1));
string args = string.Join(", ", clf.Chunks[(int)fn.ChunkId]);
Functions.Add(new Function(docs, name, args));
}
foreach (var cls in clf.Classes)
{
string docs = $"/^{cls.Documentation}^/";
ObservableCollection<Class.ClassEntry> entries = new ObservableCollection<Class.ClassEntry>();
foreach (var item in cls.Entries)
{
string modifiers = $"\t{item.Modifier.ToString().ToLower()} ";
if (item.IsFunction && item.IsAbstract)
modifiers += "abstract ";
Class.ClassEntry ce = new Class.ClassEntry($"\t/^{item.Documentation}^/", item.Name, modifiers, item.IsFunction, item.IsFunction ? string.Join(", ", item.Arguments) : "");
entries.Add(ce);
}
Classes.Add(new Class(docs, cls.Name, cls.Inherit, entries));
}
}
public ObservableCollection<Function> Functions { get; set; } = new ObservableCollection<Function>();
public ObservableCollection<Class> Classes { get; set; } = new ObservableCollection<Class>();
public class Function(string docs, string name, string args) : ObservableObject
{
public string Name => name;
public string Documentation => docs;
public string Args => args;
}
public class Class(string docs, string name, string inherits, ObservableCollection<Class.ClassEntry> entries) : ObservableObject
{
public string Documentation => docs;
public string Name => name;
public string Inherits => inherits == "ClassObject" ? "" : inherits;
public string InheritsColon => inherits == "ClassObject" ? "" : " : ";
public ObservableCollection<ClassEntry> Entries => entries;
public class ClassEntry(string docs,string name, string modifiers, bool isFunction, string args)
{
public string Documentation => docs;
public string Name => name;
public string Modifiers => modifiers;
public IBrush NameColor => new SolidColorBrush(isFunction ? 0xFFDCDCAA : 0xFF9CDCFE);
public IBrush LeftParenColor => new SolidColorBrush(isFunction ? 0xFFC586C0 : 0xFFCCCCCC);
public string LeftParen => isFunction ? "(" : ";";
public string RightParen => isFunction ? ")" : "";
public string Args => args;
}
}
}