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 entries = new ObservableCollection(); 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 Functions { get; set; } = new ObservableCollection(); public ObservableCollection Classes { get; set; } = new ObservableCollection(); 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 entries) : ObservableObject { public string Documentation => docs; public string Name => name; public string Inherits => inherits == "ClassObject" ? "" : inherits; public string InheritsColon => inherits == "ClassObject" ? "" : " : "; public ObservableCollection 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; } } }