Text Editor

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Text Editor

Beitrag von Lambda »

Möchte via Canvas ein reguläres Text Editor - Steuerelement schreiben. Allerdings ist diese Art von Steuerelement doch etwas speziell :D . Bevor ich jetzt mit der besten Theorie anfange, wollte ich mal in die Runde fragen, ob jemand damit Erfahrungen hat wie der Text am besten gehandhabt wird.

Gesamt in einer String-Variable? Als Liste? Direkt im Speicher? Es wäre in den meisten Fällen für kurze Eingaben, aber größere Texte sollten natürlich auch ohne Einbrüche verarbeitet werden können.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Text Editor

Beitrag von ts-soft »

2 Dimensionalles SpeicherArray sowie extra Variablen, die Cursorpostition, Selektionen usw. festhalten.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Text Editor

Beitrag von STARGÅTE »

Als erstes solltest du mal eine (für deinen Zweck) geeignete Prozedur für den (automatischen) Zeilenumbruch schreiben.
Das heißt, eine Prozedur, der man zB einen String und eine FontID übergibt, und welche dann die resultierenden Zeilen-Strings zurückgibt, jenachdem, wie der Text aussieht und das Canvas breit ist.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Text Editor

Beitrag von Danilo »

cOoki3druqs hat geschrieben:Gesamt in einer String-Variable? Als Liste? Direkt im Speicher? Es wäre in den meisten Fällen für kurze Eingaben, aber größere Texte sollten natürlich auch ohne Einbrüche verarbeitet werden können.
Doppelt verkettet Liste für die Strings, ein Element pro Zeile. Dazu eine Struktur, die Informationen über das Dokument
speichert, z.B. Cursorposition, ListIndex der obersten Zeile, Dokument- und Dateiname, usw.
CreateDocument() erstellt und initialisiert diese Struktur. Vorteil ist, Du kannst 20 Dokumente erstellen (also 20 Files öffnen),
brauchst aber nur 1 CanvasGadget zu öffnen. Austausch der Document-Struktur und neu zeichnen, schon wird eine
andere Datei zum editieren angezeigt.

Bei der doppelt verketteten Liste mit den Strings kommt es noch darauf an, welche Features Du haben möchtest.
Soll das ganze Dokument nur einen Font und eine Farbe haben, kannst Du das in Document speichern.
Sollen unterschiedliche Fonts, Farben, Styles (Bold, Italic, ..) gemischt werden, musst Du diese Zusatzinformationen
noch speichern. Entweder direkt im String wie "Hallo [ u][col=$445566]Welt[/col][ /u]!", oder performanter in einem
anderen Linkedlist-Eintrag pro Zeile. Oder gleich jeden Char einzeln, mit Optionen pro Char (Style, Farbe, usw).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Text Editor

Beitrag von dysti »

Doppelt verkettet Liste für die Strings, ein Element pro Zeile. Dazu eine Struktur, die Informationen über das Dokument
speichert
Seid ihr mal so lieb und könnt ihr mal ein Beispiel bringen.
Hatte erst vor, es in den Anfängerbereich zu posten.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Text Editor

Beitrag von Lambda »

Den Zeilenumbruch (falls angewendet) sowie Formatierungen sind kein Problem. Komplexer wird es dann, wenn Zeilen-übergreifend Text selektiert wird und dann beispielsweise durch "Einfügen" überschrieben. Deshalb ist die Handhabung grundlegend.

Ein gesamter Pool wäre da einfacher, da sich alles am Stück behandeln lässt. Allerdings wird die PB interne String-Verarbeitung bei großen Texten immer langsamer, da beim hinzuketten soweit ich weis der gesamte neu aufgebaut wird.

Für den Zeilenumbruch wäre sicher eine Liste am bequemsten gewesen. Ich würde mich sehr freuen wenn sich jemand daran beteiligen möchte, da ich mit anderen Steuerelementen doch noch sehr ausgelastet bin. Das Canvas kann dann wie erwähnt direkt mit dem ScrollArea gekoppelt werden.

Wichtig wäre noch das von Anfang an Einzüge mit einberechnet werden, damit der Editor theoretisch als Image in einem anderen Canvas eingesetzt werden kann.
Antworten