Multi-Platform Package Manager for Stable Diffusion
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

102 lines
3.3 KiB

using System;
using System.IO;
using Avalonia.Media;
using AvaloniaEdit;
using AvaloniaEdit.TextMate;
using StabilityMatrix.Avalonia.Extensions;
using StabilityMatrix.Avalonia.Models;
using StabilityMatrix.Avalonia.Styles;
using StabilityMatrix.Core.Extensions;
using TextMateSharp.Grammars;
using TextMateSharp.Internal.Themes.Reader;
using TextMateSharp.Registry;
using TextMateSharp.Themes;
namespace StabilityMatrix.Avalonia.Helpers;
public static class TextEditorConfigs
{
public static void Configure(TextEditor editor, TextEditorPreset preset)
{
switch (preset)
{
case TextEditorPreset.Prompt:
ConfigForPrompt(editor);
break;
case TextEditorPreset.Console:
ConfigForConsole(editor);
break;
case TextEditorPreset.None:
break;
default:
throw new ArgumentOutOfRangeException(nameof(preset), preset, null);
}
}
private static void ConfigForPrompt(TextEditor editor)
{
const ThemeName themeName = ThemeName.DimmedMonokai;
var registryOptions = new RegistryOptions(themeName);
var registry = new Registry(registryOptions);
using var stream = Assets.ImagePromptLanguageJson.Open();
var promptGrammar = registry.LoadGrammarFromStream(stream);
// Load theme
var theme = GetCustomTheme();
// Setup editor
var editorOptions = editor.Options;
editorOptions.ShowColumnRulers = true;
editorOptions.EnableTextDragDrop = true;
editorOptions.ExtendSelectionOnMouseUp = true;
// Config hyperlinks
editorOptions.EnableHyperlinks = true;
editorOptions.RequireControlModifierForHyperlinkClick = true;
editor.TextArea.TextView.LinkTextForegroundBrush = Brushes.Coral;
editor.TextArea.SelectionBrush = ThemeColors.EditorSelectionBrush;
var installation = editor.InstallTextMate(registryOptions);
// Set the _textMateRegistry property
installation.SetPrivateField("_textMateRegistry", registry);
installation.SetGrammar(promptGrammar.GetScopeName());
installation.SetTheme(theme);
}
private static void ConfigForConsole(TextEditor editor)
{
var registryOptions = new RegistryOptions(ThemeName.DarkPlus);
// Config hyperlinks
editor.TextArea.Options.EnableHyperlinks = true;
editor.TextArea.Options.RequireControlModifierForHyperlinkClick = false;
editor.TextArea.TextView.LinkTextForegroundBrush = Brushes.Coral;
var textMate = editor.InstallTextMate(registryOptions);
var scope = registryOptions.GetScopeByLanguageId("log");
if (scope is null)
throw new InvalidOperationException("Scope is null");
textMate.SetGrammar(scope);
textMate.SetTheme(registryOptions.LoadTheme(ThemeName.DarkPlus));
editor.Options.ShowBoxForControlCharacters = false;
}
private static IRawTheme GetThemeFromStream(Stream stream)
{
using var reader = new StreamReader(stream);
return ThemeReader.ReadThemeSync(reader);
}
private static IRawTheme GetCustomTheme()
{
using var stream = Assets.ThemeMatrixDarkJson.Open();
return GetThemeFromStream(stream);
}
}