[Module] EditorEx (Custom Editor Gadget)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Code: Alles auswählen

[05/12/18] Undo/Redo feature & Copy / Cut / Paste & Bugfixes
Mehrstufiges Undo (differentzielle Speicherung der Undo-Schritte) & Redo
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von DarkSoul »

Hab auch mal getestet. :)

- Das große ẞ funktioniert nicht richtig (er schreibt es zwar, aber der Cursor wird nicht weitergeschoben und der Cursor befindet sich dann bei den nachfolgenden Buchstaben nicht mehr sauber zwischen den Buchstaben).
- Das Scrollen ist ruckelig/buggy
- Der Scrollbalken ist um ein paar Pixel versetzt dargestellt
- Mausrad funktioniert nicht
- Wenn ich am Ende der obersten Zeile Return drücke, wird statt einer neuen leeren Zeile darunter lediglich ein Leerzeichen am Anfang der zweiten Zeile eingefügt. (Manchmal macht er es aber richtig)
- Der Cursor blinkt nicht
- Wenn man einen Buchstaben gedrückt hält ("ddddddd....."), dann bricht die Performance stark ein und der Cursor überspringt ab und zu ein paar Wortfragmente, so dass diese nun innerhalb der Buchstabenreihe sind.
- Wenn du erst per Scrollbalken scrollst und dann die Pfeiltasten benutzt, springt der Cursor an falsche Stellen.
- Wenn du ein paar Mal per Pfeiltasten rauf- und runterscrollst, "zerbuggt" sich irgendwann der Text und das Feld ist leer.
- Einfach nur starten, den Cursor auf "Affenschar" setzen und als erstes Pfeiltaste herunter gedrückt halten, bis der Cursor ganz unten ist. Das Wort "Affenschar" wird nun ein weiteres Mal unter dem Text in Blau angezeigt und das Programm reagiert träger als zuvor.
- Page-Up und Page-Down funktionieren nicht
- Einige Male ist das Programm komplett eingefroren, so dass ich es killen musste.
- Backspace überspringt manchmal eine Zeile
- Ctrl+A funktioniert nicht
- Ctrl+Z funktioniert nicht
- Das Wort "Baumschule" wird falsch getrennt, wenn man es am Ende eines mehrzeiligen Satzes verwendet und anschließend alles vor dem Wort per Backspace weglöscht. (er macht dann "Baumsch-ule")
- Markierter Text wird nicht gelöscht, wenn Eingaben erfolgen.
- Die Farbe der Markierung entspricht nicht der Standardfarbe.
- Wenn man mit Shift- und Pfeiltasten rauf/runter Text markiert und den Anschlag erreicht, wird das Markieren abgebrochen.
- Rechtsklick->Undo löscht den Text und Redo ließ das Programm einfrieren. Diese beiden Funktionen funktionieren gar nicht.
- Wenn man per Ende-Taste ans Zeilenende springt und dann schreibt, dann schreibt er am Anfang der Zeile darunter rückwärts(!?!?)
- Wenn man direkt beim Start per Shift+Pfeiltaste runter den Text markiert, dann wird die zweite Zeile (und nur diese) unsichtbar.
- Einfg-Taste funktionslos (keine Umschaltung auf Überschreibmodus)
- Tab-Taste funktionslos (Entweder Tab machen oder zum nächsten Gadget weiterspringen)
- "Redo" sollte im Contextmenü ausgegraut sein, wenn man Undo nicht zuvor verwendet hat.
- Das Hineinpasten dieses Textes ist vollkommen misslungen (kam Zeichensalat bei raus und teilweise haben sich die Zeilen überschnitten)
- Mutti-Tab (Ein Wort per Leertaste-Leertaste-Leertaste..... nach rechts rücken) führt zu verbuggten Zeilenumbrüchen.
- Wenn ich ein Wort durch Mutti-Tab umbrechen lasse und den erzeugten Bindestrich entferne und dann das Wort wieder zurückhole, ist an der Stelle, wo der Bindestrich war, ein zusätzliches Leerzeichen.
- Nachdem das Teil beim Versuch, etwas per Ctrl+Einfg in die Zwischenablage zu kopieren, meine Maus "gefressen" hat (nur noch das EditorGadget hat Mauseingaben
angenommen. Alles andere, was gerade lief, erst dann wieder, als ich dein Programm abgewürgt habe), habe ich das Testen abgebrochen. Reicht ja auch erstmal. Scheint noch sehr buggy zu sein. :wink:
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Ich habe alles durchgetestet und die meisten angesprochenen Punkte funktionieren bei mir (PB 5.7x / Win 10). Bist du sicher, dass du die aktuelle Version getestet hast (mit MIT-Lizenz).
Ob es möglicherweise an Linux liegt, kann ich leider nicht testen.
DarkSoul hat geschrieben:- Der Cursor blinkt nicht
- Page-Up und Page-Down funktionieren nicht
- Ctrl+A funktioniert nicht
- Ctrl+Z funktioniert nicht
- Markierter Text wird nicht gelöscht, wenn Eingaben erfolgen.
- Einfg-Taste funktionslos (keine Umschaltung auf Überschreibmodus)
- Tab-Taste funktionslos (Entweder Tab machen oder zum nächsten Gadget weiterspringen)
Diese Funktionen wurden noch nicht implementiert. Die Ctrl-Tasten waren mir bisher unbekannt, kann ich aber noch einfügen.
DarkSoul hat geschrieben:- Die Farbe der Markierung entspricht nicht der Standardfarbe.
Künstlerische Freiheit ;-) Kann mit SelectColor() an das jeweilige Betriebssystem angepasst werden.
DarkSoul hat geschrieben:- Wenn man mit Shift- und Pfeiltasten rauf/runter Text markiert und den Anschlag erreicht, wird das Markieren abgebrochen.
- Wenn man per Ende-Taste ans Zeilenende springt und dann schreibt, dann schreibt er am Anfang der Zeile darunter rückwärts(!?!?)
Bugs hoffentlich behoben.
DarkSoul hat geschrieben:- "Redo" sollte im Contextmenü ausgegraut sein, wenn man Undo nicht zuvor verwendet hat.
Das muss der Programmierer selber für seine Menüs erledigen. Habe hierfür die Befehle IsUndo()/IsRedo() hinzugefügt.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von DarkSoul »

Ich habe es gestern von deinem ersten Posting heruntergeladen und auf der offiziellen PB 5.7-Beta, die hier zum Download angeboten wird, getestet. Und ja, ich habe die Lizenz gekauft und es handelte sich nicht um eine fragwürdige Schwarzkopie. Allerdings ist sie jetzt nicht mehr aktuell, weil zwischen diesem und meinem letzten Post eine neue Beta erschienen ist. :mrgreen:

Unter PB 5.62 kann ich allerdings auch keinen Unterschied feststellen :wink:

Ich habe diese Version deines Moduls verwendet:

Code: Alles auswählen

;/ ==========================
;/ =    EditExModule.pbi    =
;/ ==========================
;/
;/ [ PB V5.7x / All OS ]
;/
;/ Module by Thorsten1867 (11/2018)
;/
[...]
; [05/12/18] Undo/Redo feature & Copy / Cut / Paste & Bugfixes
Also nach dem Changelog nicht soooo alt. :)

Vielleicht solltest du mal über Versionsnummern nachdenken. :)
Bugs hoffentlich behoben.
Verschlimmbessert. :cry:
- Alles markieren ist mit Shift und Pfeilrunter gedrückt halten nun gar nicht mehr möglich (scrollt nicht mehr)
- Statt bei der beschriebenen Ende-Problematik an die darunterliegende Zeile die eingegebenen Zeichen anzustücken, tut er dieses nun mit Leerzeichen
- Neu: (ging gestern noch einwandfrei) Starte mal das Programm, setze den Cursor hinter "wahr" und drücke ganz viel Leertaste. Sobald er rechts über den Rand geht, fängt er an, die Leerzeichen am Anfang derselben Zeile anzufügen. (ggf. den restlichen Demo-Text wieder einkommentieren, da ich mit dem ganzen Demo-Text und ohne diese Steuerzeichen getestet habe)
- Zu den Steuerzeichen: Der Punkt, der ein Leerzeichen markiert, fehlt.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von Thorsten1867 »

Das Problem mit dem Cursor beim automatischen Zeilenumbruch konnte ich reproduzieren.
Dieser Fließtext treibt mich noch in den Wahnsinn! Nie ist der Cursor dort wo er sein soll. :evil:
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: [Module] EditorEx (Custom Editor Gadget)

Beitrag von DarkSoul »

Nicht böse gemeint:

Vielleicht gehst du das Projekt etwas falsch an. Du hast schon Zusatzfeatures eingebaut, obwohl die Basics noch nicht richtig funktionieren.

Baue doch erstmal das ganz normale EditorGadget nach. Wenn das perfekt fehlerfrei und performant funktioniert, baue die Zusatzfeatures ein. :wink:

Mal ein paar Beispiele:

Code: Alles auswählen

 
  Procedure.s GetDrawText_(Text.s)             ; Text with or without control characters
    
    If Edit()\Visible\CtrlChars
      ProcedureReturn Text
    Else
      Text = RemoveString(Text, #LineBreak$)
      Text = RemoveString(Text, #SoftHyphen$)
      ProcedureReturn Text
    EndIf
    
  EndProcedure
Das ist z.B. eine ganz schlechte Idee. RemoveString() ist (wie die meisten Stringoperationen, die durchsuchen und die Länge verändern) "teuer" und haut auf die Performance.
Da sowohl LineBreak als auch SoftHyphen üblicherweise am Ende sitzen, wäre es wesentlich besser, bei Bedarf einfach die entsprechenden Zeichen (rein zeichnerisch!) dranzuhängen. Es ist ein Fehler, diese Zeichen als tatsächlich existente Characters im eigentlichen Text zu haben. Das bringt dich vor etliche Probleme (u.a. dass du diese Formatierungszeichen einfach per del löschen kannst).

Und was machst du, wenn der User den Character für deinen Soft-Hypen an irgendeiner Stelle selbst eingeben möchte? Wie unterscheidest du deine "hinzuerfundenen" von denen, die tatsächlich eingegeben worden sind?

Oder sowas hier:

Code: Alles auswählen

          If Edit()\Border
            Box(0, 0, Edit()\Size\CanvasWidth - 4, Edit()\Size\CanvasHeight - 4, Edit()\Color\Back)
          Else
            Box(0, 0, Edit()\Size\CanvasWidth, Edit()\Size\CanvasHeight, Edit()\Color\Back)
          EndIf
Wer sagt denn, dass die Border das Canvas immer um genau 4px verkleinert (und nicht 3 oder 6)? :)

Diese Konstante verwendest du, wenn ich das richtig sehe, als Scrollbalkenbreite:

Code: Alles auswählen

  #Scroll_Width = 18
Da hast du wahrscheinlich einen Screenshot gemacht und in Paintbrush nachgeschaut, wie viele Pixel so eine Windows-Scrollleiste breit ist.
Auch die ist nicht immer 18px. Auch unter Windows ist das nicht garantiert.

Code: Alles auswählen

DrawingMode(#PB_2DDrawing_Default)
If Edit()\Border
   Box(0, 0, Edit()\Size\CanvasWidth - 4, Edit()\Size\CanvasHeight - 4, Edit()\Color\Back) 
Else
   Box(0, 0, Edit()\Size\CanvasWidth, Edit()\Size\CanvasHeight, Edit()\Color\Back)
EndIf
Da ist auch die Erklärung dafür, dass bei mir die Ränder nicht mitaktualisiert werden und sich allmälich mit Pixelresten füllen. Meine Border ist nämlich nur 1 oder 2 Pixel breit. Du weißt doch an der Stelle genau, wie groß dein Canvas ist und kannst auch ohne Magic-Number (-4) diesen zuverlässig clearen.

Dieses sind alles Beispiele für potentielle Bugquellen. Wenn du zu viele davon aufeinanderbaust, dann wird es extrem buggy und unübersichtlich und dann hilft irgendwann nur noch CTRL+A, DEL und nochmal komplett von vorne. :wink:

Kleiner Tipp: In der Windows-Registry gibt es einen Ordner "WindowMetrics". AFAIK gibt es sogar einen eigenen Api-Aufruf dafür. :wink:
Die Standard-Scrollbalkenbreite ist bei mir unter Ubuntu 0, da sie über dem Content liegt (die Scrollbar selbst hat natürlich eine Breite, aber die zählt nicht auf das Canvas). Aber auch das lässt sich sicher irgendwo abfragen (weiß ich nicht genau, wie)

Wenn du eine canvasbasierte Textausgabe gebaut hast, die einen Text flüssig(!) scrollen kann, der deutlich länger als die Abmessungen des Canvas (welches selbst ein maximiertes Fenster ausfüllt) ist, dann hast du schon viel geschafft, da das nämlich recht schwierig ist (mit einfach Canvas löschen und komplett neu rendern ist spätestens hier endgültig vorbei). Solange das noch fehlerhaft funktioniert, kann die Eingabe nicht einwandfrei funktionieren :). Dann wäre so der nächste Schritt, dass man den Cursor platzieren und Text markieren kann. Mit allen gängigen Methoden wohlbemerkt. Wenn auch das funktioniert, dann kannst du dich um die automatischen Zeilenumbrüche kümmern. Wenn du hierhin gekommen bist, dann kannst du dich so langsam um die Bearbeitung des Textes kümmern. Und wenn alles fertig ist, dann könntest du in Richtung Rechtschreibkorrektur oder Rich-Text-Editor weiterentwickeln (verschiedene Schriftarten und -größen, Fett, Kursiv....)
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget) [Beta]

Beitrag von Thorsten1867 »

Code: Alles auswählen

[09/12/18] Scroll and drawing routines completely revised & flashing cursor & mouse wheel & Shortcuts added & Bugfixes
Ich hoffe die internen Änderungen waren erfolgreich. Bitte testen!

Hier noch eine Liste der aktuell verfügebaren Shortcuts:

Code: Alles auswählen

; Home         - Move cursor to start of row
; End          - Move cursor to end of row
; Shft-Del     - Cut & copy selected text to clipboard
; Shft-Insert  - Paste clipboard at cursor position
; Crtl-A       - Select all
; Crtl-C       - Copy selected text to clipboard
; Crtl-D       - Delete selected text
; Crtl-V       - Paste clipboard at cursor position
; Crtl-X       - Cut & copy selected text to clipboard
; Ctrl-Z       - Perform Undo
; Ctrl-End     - Move the cursor to the end of the last row
; Ctrl-Down    - Move the cursor to the beginning of the next paragraph
; Ctrl-Home    - Move the cursor to the beginning of the first row
; Crtl-Insert  - Copy selected text to clipboard 
; Crtl-Left    - Move the cursor to the beginning of the previous word
; Crtl-Minus   - Insert at cursor position a 'Soft-Hyphen'
; Crtl-Right   - Move the cursor to the beginning of the next word.
; Crtl-Up      - Move the cursor to the beginning of the previous paragraph.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget) [Beta]

Beitrag von STARGÅTE »

Hallo Thorsten1867,

erst mal mein Respekt, dass du es "wagst" ein EditorGadget zu schreiben (ich weiß was da auf einen alles zukommt).
Auch das SyntaxHighlight gefällt mir.

Allerdings gibts auch (noch) viele kleine Baustellen:
  • Das Undo/Redo funktioniert nicht zuverlässig. Wenn ich an z.B. drei verschiedenen Stellen eine Zahl schreibe, kann ich normalerweise diese 3 Schritte rückgängig machen bzw. wiederholen.
    In deinem Fall wird hin und wieder mehrere Schritte zusammen durchgeführt und das Redo funkioniert nicht immer bis zum ende, manchmal garnicht.
  • Das Markieren von Text ist sehr merkwürdig (ander als im PB Editor). Wenn ich z.B. das Word "Baum" von links nach rechts Markiere (den Zeicher nicht loslasse) und dann nach links zu "umgestürzten" zeihe, bleibt der Buchstabe "B" markiert.
    Probleme mit dem Anker z.B. vor "Baum" gibt es auch, wenn man die Markierung von rechts nach links durchführt in eine höhere Zeile durchführt. Geht man nämlich dann wieder zurück, ist der Anker auf einmal weiter oben.
  • Das Löschen von Text ist fehlerhaft. Markiere ich Text über mehrere Zeilen und lösche diesen, bleibt ein Buchstabe übrig.
    Außerdem stimmt etwas mit dem Löschen von Zeichenumbrüchen nicht. Wenn ich an einen Zeilenanfang gehe und "Back" drücke, landet die Zeile eins darüber (richtig) hat jedoch ein leerzeichen mehr.
  • Man kann keine Zeilenumbruche markieren. Normalerweise, kann man am Zeilenende mit Umschalt+Right ioder mit der Maus den Zeilenumbruch markieren (z.B. um ihn zu löschen). Bei dir existiert dieses "Zeichen" garnicht im Editor, sattdessen wird der nächste Buchstabe markiert.
  • Das Einfügen von Text mit Zeilenumbrüchen (selbst aus dem eigenen Gadget) funkioniert nicht, die Umbrücke werden entfernt.
Außerdem friert mit das Fenster sporadisch ein wenn ich etwas gemacht habe und dann das Gadget für längere Zeit "liegen lasse", es also den Fokus verliert (ich kann es jedoch noch nicht reproduzieren).
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
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget) [Beta]

Beitrag von Thorsten1867 »

Ich hoffe, ich konnte einige der beschriebenen Fehler beheben ohne, dass sich wieder neue eingeschlichen haben.

Nachdem sich #LF$ seltsamerweise nicht mittels 2DDrawing zeichnen lässt (=> Buchstabenfragmente anstatt nichts), habe ich ein Dummy-Zeichen eingefügt, um den Zeilenumbruch markieren zu können.
Bei der Selektion mit den Cursortasten, bin ich mir noch nicht ganz sicher, ob ich alle "Ausnahmen" gefunden habe.

Code: Alles auswählen

[11/12/18] Fixed fundamental problem in selection & Bugfixes
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: [Module] EditorEx (Custom Editor Gadget) [Beta]

Beitrag von Thorsten1867 »

Code: Alles auswählen

[12/12/18] Automatic spell checking & Bugfixes
Ich habe versucht, dies möglichst ressourcenschonend umzusetzen.

Zum einen wird erst bei einem Leer- oder Satzzeichen eine Überprüfung durchgeführt und zum anderen wird jedes Wort (auch bei mehreren Gadgets) bis zum Beenden des Programmes nur einmal mit dem Wörterbuch abgeglichen.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten