"eigener" Text-Editor - ImageGadget geeignet ? Ja (Demo)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

"eigener" Text-Editor - ImageGadget geeignet ? Ja (Demo)

Beitrag von STARGÅTE »

Hier gehts zur ersten Demo: viewtopic.php?p=269553#p269553

Tachchen Leute,

ich brauche mal wieder euern Rat.

Nachdem ich mich mit dem Editor-Gadget (RTF-Format) und dem ScintillaGadget befasst habe, bin ich zum schluss gekommen das diese Editoren für meine Ansprüche nicht ausreichend flexibel sind.
Ich brauche u.a. Sachen wie: SyntaxHighLighting, verschiedene Font-Styles und versetzungen (Gruppenelemente)
Also bekannte Sache aus Mathe: Brüche, Summen, Integrale, Matrizen, usw.
die Mittem im Text-fluss liegen.

Ich bin zum Schluss gekommen dafür ein ImageGadget zu nutzen.

Der Formatierte Text wird auf ein Image gezeichnet und dieses im Gadget aktuallisiert.
auch die Eingabe von Text "in das Image" macht keine Probleme (EventwParam() gibt einem ja das genaue Zeichen zurück welches geschrieben werden soll , auch sachen wie ^+e -> ê).
Nur bin ich mir nicht sicher ob das auf Dauer (bei großen Dokumenten) immer noch flüssig läuft, wenn man mitten Im Dokument den Text ändern und alles danach seine Position ändert.
Klar wird immer nur das Geändert was auch sichtbar ist, das Image ist also nicht so groß wie das Dokument, sonden nur Bildschirm-Größe, mit ScrollBalken wird dann die "fiktive" Position eingestellt und das Image gezeichnet.
Trotzdem beansprucht das schon den PC, dauertn n Image zu Rendern ... und ins gadget zu Packen ...

Hat einer n bessere Lösung ?

Direkt auf das Window zeichnen geht ja nicht, weil der Inhalt zerstört wird (bei Bewegung).
Ein Screen zu nutzen ist auch keine Lösung, da in einer Anwenung mehrere Dokumente möglich sein sollen.

Falls einer nicht genau weiß, wie das mit dem Image zur zeit bei mir aussieht, soll er es sagen, dann schreib ich noch n mini-Beispiel.

Wie funzt das bei Word, Browsern, und co ... ?
Zuletzt geändert von STARGÅTE am 29.03.2010 17:17, insgesamt 3-mal geändert.
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
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von CSHW89 »

Hi Stargate,
also erstmal das klingt echt interressant, wenn es das ist was ich meine. du möchtest also so eine art formel-editor, wie er auch in word oder so integriert ist, schreiben!?

ok, ich weiß ja nicht ob das so praktikabel ist, aber wie wärs mit mehreren images. ich mein damit, dass z.b. text, der in auf der gleichen höhe liegt, in einem image gespeichert ist, ein bruch z.b. besteht dann aus zwei images usw...
wenn du dann ein text änderst, musst du nur "sein" image ändern, bei allen anderen images muss nur die position geändert werden.
das ist so das erste was mir einfällt. ich hoffe das ist jetzt nicht zu overkill. ich denk mal da muss dann viel umgeändert werden. ich überleg mir aber noch was anderes dazu.

wenn du dann mal was brauchbares hast, würd ich mir gerne mal das programm ansehen. sowas wollte ich auch schon mal progn
lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von Josh »

STARGÅTE hat geschrieben:Direkt auf das Window zeichnen geht ja nicht, weil der Inhalt zerstört wird
also ich könnte mir schon vorstellen, dass es zeitmäßig was bringen könnte direkt auf den bildschirm zu zeichnen. dann musst du halt selber dafür sorgen, dass der inhalt wieder dargestellt wird. ist doch beim image-gadget auch nichts anderes, nur dass dann das gadget von sich aus dafür sorgt.

aber über die paar zeichen, die du am bildschirm hast, würde ich mir wegen der zeit nicht viel kopfzerbrechen machen. ich hab mich mal mit dem sci-gadget gespielt und versuchsweise bei jedem tipper alles durchstylen lassen. bei einem text von 30k hat man beim normalen tippen überhaupt nichts gemerkt.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von STARGÅTE »

@CSHW89
"du möchtest also so eine art formel-editor, wie er auch in word oder so integriert ist, schreiben!?"
Jo so in etwar, wobei der formel-editor an sich nicht das eigentliche Ziel ist, sonden nur ein Werkzeug welches das eigentliche Programm später selber nutzt, und der benutzer auch zur Eingabe benutzen kann.

"ok, ich weiß ja nicht ob das so praktikabel ist, aber wie wärs mit mehreren images. ich mein damit, dass z.b. text, der in auf der gleichen höhe liegt, in einem image gespeichert ist, ein bruch z.b. besteht dann aus zwei images usw..."

Die Idee ist schon mal nicht schlecht.
Dann würde ich so zu sagen auf ein ScrollAreaGadget() wechseln.
Eine Eingabe erzeugt dann ein Image, wird die Eingabe komplexer (größer) wird das Image zerteilt und die ImageGadgets auf der ScrollArea Positioniert.
Ändert man dann einen Textabschnitt, muss wirklich nur dieser Teil als Image neu gezeichnet werden, die anderen ImageGadgets ändern nur ihre Position.
Zeilenumbruch und Ausdrucken solcher Gadget-Haufen soll jetzt mal im hintergrund stehen.

Ein Problem was es dann jedoch geben könnte ist das Markieren von Text-Abschnitten oder Teilen von Formeln, so ein Hover-Effekt müsste dann auf mehreren Images gleichzeitig gemacht werden, oder das macht man dann wirklich als Window-Draw

@Josh
Das problem was es beim direkt auf den bildschirm zeichnen noch gibt ist das es "flackert" wenn viel Text/Bilder oft erneuert werden. da es ja kein "FlipBuffer" gibt.

@ALL

Hier mal n wirklich sehr sehr vereinfachte Variante:
Ein ImageGadget in dem man Text schreiben kann (mit zeilenumbruch)
Cursor kann mit Pfeiltasten navigiert werden Backspace und Entf gehen auch ...

Das wäre so zu sagen, der Startschuss, den Text$ könnte man dann Analysieren und dann Styles und Prositionen anpassen.
Das Image könnte man zerkleinern usw.
Schwerer wirds dann schon beim Markieren mit der Maus, wenn man bei gestylten um versetzten Texten die Position unter der Maus findne muss ...

Code: Alles auswählen

Enumeration
 #Window
 #Gadget
 #Image
EndEnumeration

#Window_Width  = 640
#Window_Height = 480

CreateImage(#Image, #Window_Width, #Window_Height)

Global Text$ = "Hier steht Irgend ein Text."+Chr(13)+"Und in der nächsten Zeile auch."
Global Position.i = Len(Text$)

Global Font = FontID(LoadFont(#PB_Any, "Times New Roman", 12))
 
Procedure UpdateImage()
  StartDrawing(ImageOutput(#Image))
    DrawingMode(1) : DrawingFont(Font)
    maxRow = CountString(Text$, Chr(13))
    RowHeight = TextHeight(" ")
    BoxHeight = (maxRow+1)*RowHeight
    Dim Row$(maxRow)
    For n = 0 To maxRow
      Row$(n) = StringField(Text$, n+1, Chr(13))
    Next
    Box(0, 0, WindowWidth(#Window), WindowHeight(#Window), $FFFFFF)
    Char = 0
    Cursor = 0
    For n = 0 To maxRow
      DrawText(10, 10+n*RowHeight, Row$(n), $000000)
      If Char + Len(Row$(n)) >= Position And Cursor = 0
        DrawingMode(#PB_2DDrawing_XOr)
        Box(10+TextWidth(Left(Row$(n),Position-Char)), 10+n*RowHeight, 1, TextHeight(" ")) 
        DrawingMode(1)
        Cursor = 1
      EndIf
      Char + Len(Row$(n))+1
    Next
  StopDrawing()
  SetGadgetState(#Gadget, ImageID(#Image))
EndProcedure 
 
 
 
OpenWindow(#Window, 0, 0, #Window_Width, #Window_Height, "Fenster", #PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
 
  AddKeyboardShortcut(#Window, #PB_Shortcut_Left, #PB_Shortcut_Left)
  AddKeyboardShortcut(#Window, #PB_Shortcut_Right, #PB_Shortcut_Right)
  AddKeyboardShortcut(#Window, #PB_Shortcut_Delete, #PB_Shortcut_Delete)

  SmartWindowRefresh(#Window, 1) 

  ImageGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window), ImageID(#Image))

  UpdateImage()



Repeat

  Event = WaitWindowEvent()

  Select Event
  
    Case 258
      Select EventwParam()
        Case 8
          If Position > 0 : Position - 1 : EndIf
          Text$ = Left(Text$, Position) + Mid(Text$, Position+2)
        Default
          Text$ = Left(Text$, Position) + Chr(EventwParam()) + Mid(Text$, Position+1)
          Position + 1
      EndSelect
      UpdateImage()
  
    Case #PB_Event_SizeWindow
      CreateImage(#Image, WindowWidth(#Window), WindowHeight(#Window))
      ResizeGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
      UpdateImage()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Menu
      Select EventMenu()
        Case #PB_Shortcut_Left
          If Position > 0 : Position - 1 : EndIf
          UpdateImage()
        Case #PB_Shortcut_Right
          If Position < Len(Text$) : Position + 1 : EndIf
          UpdateImage()
        Case #PB_Shortcut_Delete
          Text$ = Left(Text$, Position) + Mid(Text$, Position+2)
          UpdateImage()
      EndSelect
  EndSelect

ForEver
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von Kaeru Gaman »

kennst du InkScape? wenn nicht schaus dir mal an, gibt dir vielleicht noch Anregungen.
eventuell wäre so ein Objektbezogener, Vektorbasierter Ansatz besser geeignet, als ein Textbezogener...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von Kukulkan »

Hi,

Spontan viel mir da ein, doch das RTF Gadget zu nehmen. Alles was da nicht geht könnte doch ein Image sein. Bilder bekommt man ja in's RTF Control rein. Und Word fügt Formeln letztenendes auch als Objekt/Bild in den Fliesstext. Wenn ein Bild per Doppelklick 'aktiviert' wird, könntest Du den Formeleditor (arbeitet auf Basis von Bitmap) anschmeissen. Beim verlassen wird ein Image gerendert (nur dieses Feld) und wieder normal im RTF angezeigt. So musst Du nur den Editor für einen überschaubaren Teilbereich schreiben.

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

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von STARGÅTE »

Tachchen Leute,

Es ist nun knapp 1 Monat her als ich mir darüber "nur" gedanken gemacht habe.
Inzwischen bin ich nicht mehr weit entfernt von einem funktionsfähigen Mini-Formel-Editor.
Noch kann ich keine Demo zeigen, trotzdem hier n Liste von Sachen die gehen und die ich noch einbaue:

Was schon geht:
- ImageFormel in Quelltext Form bringen und zurück: FractionBox('x','y') erzeugt zB einen Bruch.
- Navigation mit Pfeiltasten durch die komplette Formel
- Hinzufügen/Einfügen von Text oder Elementen (Bruch, Hochgestellt, usw.) an jeder Stelle/ in jedem Element
Woran ich gerade Arbeite:
- CursorSprung durch mausklick an die richtige Stelle
- Löschen von Elementen
Was noch kommen wird:
- Markieren von Bereichen, auch mit Maus

Sobald ich eine Vorzeigefähige Version habe werde ich eine Demo hochladen.
Ob ich auch ein Include bereitstelle weiß ich nocht nicht ...
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
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von Kiffi »

Hallo STARGÅTE,

TeX / LaTeX mit einem WYSIWYG-Editor (beispielsweise LyX) ist keine Option für Dich?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: "eigener" Text-Editor - ImageGadget geeignet ?

Beitrag von STARGÅTE »

Tachchen Leute,

wie versprochen habe ich nun eine kleine Demo-Exe geschrieben, wo mein Editor in Aktion tritt:

Das woran ich noch gearbeitet habe funktioniert nun:
- CursorSprung durch mausklick an die richtige Stelle
- Löschen von Elementen
Mit dem was schon funktioniert hat:
- Elemente einfügen, Symbole einfügen.
- Navigation durch die Formel
(nur rechts, links. was eine Navigation durch den Aufbau ermöglicht! )

Bild

Hier Könnte ihr mein Editor ausprobieren, der Beispieltext wird gleich zum anfang eingeladen, danach könnte ihr darin "rumspielen".
http://data.unionbytes.de/Editor.zip

Hinweis: Die Prozeduren sind leider noch nicht "Kugel-Sicher", es könnte also ggf. beim Missbrauch des Editors zum Abstürzen kommen.

Der Editor ist natürlich noch nicht fertig. zB geht das Markieren von Text-Abschnitten garnicht.
Aber ich bin jetzt schon recht zufrieden mit dem was er kann.
Zuletzt geändert von STARGÅTE am 09.07.2010 15:51, insgesamt 1-mal geändert.
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
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: "eigener" Text-Editor - ImageGadget geeignet ? Ja (Demo)

Beitrag von CSHW89 »

Hi Stargate,
also erst einmal, klasse sache. hatte mich ja schon zu anfang dafür interressiert. respekt :allright:.
so jetzt kommen aber leider auch ein paar negative punkte, die mir sofort aufgefallen sind:

- das navigieren durch den bruch ist etwas gewöhnungsbedürftig. also mir wäre es lieber, wenn man im zähler am Ende angelangt ist und dann nochmal nach rechts drückt, sich neben dem bruch befindet und nicht im nenner am anfang.
- andersrum müsstest du dann zulassen, dass man mit 'runter' nach unten kommt. am besten da hin, wo auch der cursor vorher stand (also X-Wert meine ich). das könnte man denk ich lösen, wenn du ein mausklick simulierst, der den gleichen X-Wert hat, wie der cursor, und der Y-Wert naja i-wo zwischen bruchstrich und untere grenze des nenners. wäre echt super
- das kannst du aber erst machen, wenn man text selektieren kann: also wenn man hinter einem "konstrukt" stehst (also ein bruch oder so), und dann die 'back'-Taste drückst, entfernt dein editor SOFORT das gesammt konstrukt. besser wäre es wenn dieses konstrukt dann erst selektiert wird, und dann beim zweiter drücken dann gelöscht. ich glaub, ich kenn das aus anderen formeleditoren auch. falls du also dann mit dem selektieren anfängst, kannste ja nochmal drüber nachdenken.
- ach ja genau, eine undo-funktion wäre hilfreich

aber alles in allem echt schönes projekt, ich hoffe du arbeitest noch lange weiter dran.
lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten