diff --git a/app/MindWork AI Studio/Pages/Writer.razor b/app/MindWork AI Studio/Pages/Writer.razor index 790e3e07..2941a9c3 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor +++ b/app/MindWork AI Studio/Pages/Writer.razor @@ -8,51 +8,23 @@ + + Load a text file + - - - + @foreach (var chunk in this.chunks) + { + + @chunk.Content + + } @if (this.isStreaming) { } - \ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Writer.razor.cs b/app/MindWork AI Studio/Pages/Writer.razor.cs index a36c0410..24792868 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor.cs +++ b/app/MindWork AI Studio/Pages/Writer.razor.cs @@ -1,6 +1,9 @@ +using System.Text; + using AIStudio.Chat; using AIStudio.Components; using AIStudio.Provider; +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; @@ -14,6 +17,9 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable [Inject] private ILogger Logger { get; init; } = null!; + [Inject] + private RustService RustService { get; init; } = null!; + private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); private readonly Timer typeTimer = new(TimeSpan.FromMilliseconds(1_500)); @@ -22,6 +28,7 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable private ChatThread? chatThread; private bool isStreaming; private string userInput = string.Empty; + private List chunks = new(); private string userDirection = string.Empty; private string suggestion = string.Empty; @@ -46,6 +53,39 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable #endregion private bool IsProviderSelected => this.providerSettings.UsedLLMProvider != LLMProviders.NONE; + + private async Task LoadTextFile() + { + var result = await this.RustService.SelectFile("Load a text file"); + if(result.UserCancelled) + return; + + if(!File.Exists(result.SelectedFilePath)) + return; + + var text = await File.ReadAllTextAsync(result.SelectedFilePath, Encoding.UTF8); + this.userInput = text; + this.ChunkText(); + } + + private void ChunkText() + { + this.chunks.Clear(); + var startIndex = 0; + var contentSpan = this.userInput.AsSpan(); + for (var index = 0; index < contentSpan.Length; index++) + { + if (contentSpan[index] is '\n') + { + var endIndex = index; + var lineMemory = this.userInput.AsMemory(startIndex..endIndex); + this.chunks.Add(new WriterChunk(lineMemory, false, false)); + startIndex = endIndex + 1; + } + } + + this.StateHasChanged(); + } private async Task InputKeyEvent(KeyboardEventArgs keyEvent) { diff --git a/app/MindWork AI Studio/Tools/WriterChunk.cs b/app/MindWork AI Studio/Tools/WriterChunk.cs new file mode 100644 index 00000000..d8031e3c --- /dev/null +++ b/app/MindWork AI Studio/Tools/WriterChunk.cs @@ -0,0 +1,10 @@ +namespace AIStudio.Tools; + +public sealed class WriterChunk(ReadOnlyMemory content, bool isSelected, bool isProcessing) +{ + public ReadOnlyMemory Content = content; + + public bool IsSelected = isSelected; + + public bool IsProcessing = isProcessing; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/app.css b/app/MindWork AI Studio/wwwroot/app.css index 83c35efb..45e7d390 100644 --- a/app/MindWork AI Studio/wwwroot/app.css +++ b/app/MindWork AI Studio/wwwroot/app.css @@ -38,6 +38,28 @@ margin-top: 4px; } +.write-mode-chunk { + font-size: large; + padding-left: 1.5em; + position: relative; +} + +.write-mode-chunk::before { + content: ""; + position: absolute; + left: 0; + top: 10%; + height: 80%; + width: 0.8em; + background-color: transparent; + border-radius: 0.4em; + transition: background-color 0.5s ease; +} + +.write-mode-chunk:hover::before { + background-color: #5894f3; /* Balkenfarbe im hover-Zustand */ +} + .plugin-icon-container { width: var(--mud-icon-size-large); height: var(--mud-icon-size-large);