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

117 lines
2.7 KiB
C#

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Platform.Storage;
using AvaloniaEdit;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using CrossLangDevStudio.Messages;
using CrossLangDevStudio.Views;
using AvaloniaEdit.CodeCompletion;
using AvaloniaEdit.Document;
using AvaloniaEdit.Editing;
using AvaloniaEdit.Folding;
using AvaloniaEdit.Rendering;
using TextMateSharp.Grammars;
using AvaloniaEdit.TextMate;
using Avalonia.Input;
using System.Collections.Generic;
using Avalonia.Media;
namespace CrossLangDevStudio.ViewModels;
public partial class FileEditorViewModel : ViewModelBase, ISavable
{
TabItemViewModel tab;
public string FilePath { get; }
bool _modified = false;
public bool Modified
{
get => _modified;
set
{
_modified = value;
if (value)
{
tab.Header = $"{Path.GetFileName(FilePath)}*";
}
else
{
tab.Header = Path.GetFileName(FilePath);
}
}
}
TextEditor textEdit = new TextEditor();
public TextEditor TextEditor => textEdit;
public FileEditorViewModel(string path, TabItemViewModel tab)
{
this.tab = tab;
FilePath = path;
textEdit.ShowLineNumbers = true;
textEdit.FontSize = 24;
string ext = Path.GetExtension(FilePath);
if (ext == ".tcross")
{
ext = ".go";
}
{
var _registryOptions = new RegistryOptions(ThemeName.Dark);
var _textMateInstallation = textEdit.InstallTextMate(_registryOptions);
//definition.
//Here we are getting the language by the extension and right after that we are initializing grammar with this language.
//And that's all 😀, you are ready to use AvaloniaEdit with syntax highlighting!
try
{
//AssetLoader.Open(new Uri("avares://CrossLangDevStudio/Assets/crosslang.png")
_textMateInstallation.SetGrammar(_registryOptions.GetScopeByLanguageId(_registryOptions.GetLanguageByExtension(ext).Id));
}
catch (Exception)
{
}
}
textEdit.Text = File.ReadAllText(path);
textEdit.TextChanged += (sender, e) =>
{
Modified = true;
};
}
public void Save()
{
File.WriteAllText(FilePath, textEdit.Text);
Modified = false;
}
public void SaveRecovery(string path)
{
File.WriteAllText(path, textEdit.Text);
}
}