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);