Undo/Redo für Editor implementieren
-
Hallo,
ich arbeite zur Zeit an einem Texteditor, welcher in ein System integriert ist. Das Tool ist mit C++ und dem gtkmm Toolkit realisiert. Da mir das gtkmm keine Undo/Redo Funktionalitäten anbietet, muss ich das Teil also selber schreiben. Google ergab, dass das Command-Pattern dafür wohl nützlich sei. Gut, die Frage ist jetzt: Wie implementiere ich so einen Undo-Manager vernünftig? Schließlich kann ich ja nicht den gesamten Inhalt des Text-Widgets auf nen Stack pushen, nur weil einer mal die Leertaste gedrückt hat.
Wäre es sinnvoll, den speziell geänderten Bereich zu hinterlegen? Also in etwa:
User drückt leertaste
Ich merk mir die Position und leg die Aktion (also Löschen) auf'm Stack ab.
...
User drückt auf Undo
Aktion von vorhin wird geholt und an der Position ausgefürt, also das Leerzeichen wieder gelöscht?Guter Ansatz? Schlechter Ansatz?
Falls jemand schon mal sowas realisiert hat, wäre ich für nen Hinweis dankbar.
MfG
GPC
-
Wenn ich mich nicht täusche, gibt's im Buch "Entwurfsmuster" von GoF eine Abschnitt zu diesem Problem (Undo mit Command-Pattern). Hab das Buch aber grad nicht hier.
-
Hm, das ist noch nicht in meiner Sammlung... wollte ich mir demnächst aber so oder so holen. Danke für den Tipp.

-
Ich habe so etwas noch nicht implementiert, aber ich würde im Grunde eine Art "Diff"-Format benutzen. Von deinem Beispiel nehme ich mal an, dass es um eine Form der Textverarbeitung geht. Da solltest du ja relativ simpel etwas ala
ZEILE:SPALTE +"..." bzw. -"..."
erstellen und auf einen Stack pushen können.
Wenn ich es richtig in Erinnerung habe, gab es in Bakery Undo/Redo Funktionen für GTKmm. Wobei ich nicht weiß wie gut Bakery ist und ich glaube kaum, dass man es so einfach in bestehenden Code integrieren kann.
-
Genau deshalb hatt ich ja eigentlich mal einen Thread eröffnet in dem möglichst allgemeingültige Implementierungen der Entwurfsmuster stehen sollten..
Ist aber mal wieder anhand einer Diskussion zugrunde gerichtet worden.
Wie dem auch sei. Das Command pattern und eine entsprechende Verwaltung sind da drin
-
kingruedi schrieb:
Ich habe so etwas noch nicht implementiert, aber ich würde im Grunde eine Art "Diff"-Format benutzen. Von deinem Beispiel nehme ich mal an, dass es um eine Form der Textverarbeitung geht. Da solltest du ja relativ simpel etwas ala
ZEILE:SPALTE +"..." bzw. -"..."
erstellen und auf einen Stack pushen können.
Yo, so in der Richtung dachte ich mir das auch, scheint eine praktikable Lösung zu sein

kingruedi schrieb:
Wenn ich es richtig in Erinnerung habe, gab es in Bakery Undo/Redo Funktionen für GTKmm. Wobei ich nicht weiß wie gut Bakery ist und ich glaube kaum, dass man es so einfach in bestehenden Code integrieren kann.
Bakery ist noch nicht so ausgereift, wie der Rest des gtkmm Toolkits... und es würde sehr "angebaut" wirken, wenn ich jetzt gegen Ende (hoffentlich^^) noch mit Bakery anfange. Schlecht für's Gesamtdesign.
DocJunioR schrieb:
Genau deshalb hatt ich ja eigentlich mal einen Thread eröffnet in dem möglichst allgemeingültige Implementierungen der Entwurfsmuster stehen sollten..
Ist aber mal wieder anhand einer Diskussion zugrunde gerichtet worden.
Wie dem auch sei. Das Command pattern und eine entsprechende Verwaltung sind da drinDanke mann! Sowas hab ich gesucht... ist ja fast wie Weihnachten hier

Danke für alle Antworten.
Viele Grüße
GPC
-
wenn das ein windoze-programm werden soll: die edit controls haben schon ein eingebautes 'undo'
-
net schrieb:
wenn das ein windoze-programm werden soll: die edit controls haben schon ein eingebautes 'undo'
Die Gtk::TextView, bzw. der Gtk::TextBuffer haben ein eingebautes undo unter Windows? For sure?
Nun, das Programm wird wohl größtenteils unter Windows laufen, jedoch auch (z.B. bei mir) unter GNU/Linux. Daher wäre eine portable Lösung schon nicht übel...
-
GPC schrieb:
net schrieb:
wenn das ein windoze-programm werden soll: die edit controls haben schon ein eingebautes 'undo'
Die Gtk::TextView, bzw. der Gtk::TextBuffer haben ein eingebautes undo unter Windows? For sure?
wenn das nur getarnte windows edit controls sind, dann schon: http://windowssdk.msdn.microsoft.com/en-us/library/ms672061.aspx#undoing_operations
GPC schrieb:
Daher wäre eine portable Lösung schon nicht übel...
ja, äääh, nöö, portabel ist das natürlich nicht...
-
ne gtk benutzt doch keine nativen widgets
-
net schrieb:
GPC schrieb:
net schrieb:
wenn das ein windoze-programm werden soll: die edit controls haben schon ein eingebautes 'undo'
Die Gtk::TextView, bzw. der Gtk::TextBuffer haben ein eingebautes undo unter Windows? For sure?
wenn das nur getarnte windows edit controls sind, dann schon: http://windowssdk.msdn.microsoft.com/en-us/library/ms672061.aspx#undoing_operations
gtkmm wrappt die nativen WinAPI Widgets nicht, sondern zeichnet seine Widgets selber (bzw. lässt zeichnen).
net schrieb:
GPC schrieb:
Daher wäre eine portable Lösung schon nicht übel...
ja, äääh, nöö, portabel ist das natürlich nicht...
Ach, was soll's... dann schreib ich's halt selber. DocJuniors Vorlage ist ja schon ziemlich gut.
MfG
GPC
-
DocJunioR schrieb:
Genau deshalb hatt ich ja eigentlich mal einen Thread eröffnet in dem möglichst allgemeingültige Implementierungen der Entwurfsmuster stehen sollten..
Ist aber mal wieder anhand einer Diskussion zugrunde gerichtet worden.Jo, weil's nix getaugt hat.