2009-03-31 9 views
4

Ich schreibe eine Desktop-Anwendung, um Vektorzeichnungen in C++ zu machen, und über die Verwendung von sqlite, um meine Undo/Redo-Funktion zu unterstützen.Wie kann sqlite für Funktionen zum Rückgängigmachen/Wiederherstellen verwendet werden?

Hat jemand sqlite für Undo/Redo Funktionen verwendet? Wie geht es dir?

Klarstellung:

ich bewusst den Stack-Ansatz war, habe ich auch eine Anwendung mit diesem Ansatz umgesetzt. Das Problem, auf das ich stieß, war, dass es nach einer Weile schwer zu pflegen ist.

Was ich mit sqlite gemeint habe, ist, dass ich meine gesamte In-Memory-Datenstruktur in eine SQLite-Datenbank mappen werde, und lasse die SQLite das Diff und die Revision für mich machen. Geschwindigkeit sollte kein Problem sein, wenn ich eine In-Memory-Datenbank erstellen.

Das war die Idee und ich fragte mich, ob das funktionieren könnte.

+0

Das scheint übertrieben. Was stimmt nicht mit dem normalen Ansatz mit begrenztem Stapel/Befehlsmuster überein? –

+1

http://c2.com/cgi/wiki?AbstractionInversion –

+1

Ich stimme mit Pete überein. Beginnen Sie mit einem Stack-basierten Ansatz; Wenn das nicht funktioniert, sehen Sie, wie Sie jedem Befehl die Möglichkeit geben, sich in einer Datenbank zu serialisieren/zu deserialisieren. Aber wirklich, wenn Sie etwas wirklich seltsames tun, wird der Stack-basierte Ansatz * es * schneiden. –

Antwort

10

Es ist sinnvoll, SQLite zu verwenden, um das Rückgängigmachen/Wiederholen rückgängig zu machen, wenn eine SQLite-Datenbank das Datendateiformat der Anwendung ist. Eine Erläuterung dazu, wie Sie dies mit SQLite-Triggern erreichen, finden Sie unter the SQLite website.

+0

Ich hätte diese Antwort gegeben, wenn ich mehr als 15 Ruf hatte. – lyxera

+0

Wenn Sie gerne eine GPL lizenzierte Bibliothek verwenden, gibt es ein Source-Schmiede-Projekt, das viel Arbeit für Sie geleistet hat. (Ich habe es noch nicht benutzt; ich lese gerade die Dokumente.) Sie finden es unter http://sourceforge.net/projects/sqlite-undo/ – Eponymous

2

Grundsätzlich kann eine Funktion zum Rückgängigmachen/Wiederherstellen mithilfe eines Stapels implementiert werden: Wenn der Benutzer eine Operation ausführt, schieben Sie auf dem Stapel ein Objekt, das das Delta zwischen dem Zustand vor und nach der Operation darstellt, und wenn Sie rückgängig machen "entrollt" das Delta. Da bei jeder Operation, die der Benutzer erstellt, ein neues Delta-Objekt auf dem Stack erstellt wird, kann es sein, dass sqlite nicht die Technologie ist, weil es zu langsam ist. Ich würde empfehlen, die Möglichkeit in Betracht zu ziehen, die Undo/Redo-Information nur im Speicher zu speichern und sie nur dann auf der Platte zu linearisieren, wenn Sie den Undo/Redo-Verlauf speichern möchten.

+0

Nicht unbedingt der beste Ansatz für eine Grafik-App. Wenn Sie wissen, dass die letzte Operation geändert wurde, reicht jedes Pixel in Schwarz nicht aus, um die Operation rückgängig zu machen. –

+0

@mgb Natürlich nicht --- aber so macht man es sowieso nicht. Eine nicht optimierte Implementierung würde eine grundlegende Operation zum Ändern der Farbe eines Pixels haben. Das Delta-Objekt wäre ein Tripel (X, Y, old_color). Wenn Sie (X, Y) zu einer neuen Farbe wechseln, drücken Sie das Delta Triple inkl. die alte Farbe auf dem Stapel. Später, wenn Sie rückgängig machen Sie Pop das Delta-Objekt und schreiben Sie die alte Farbe zurück auf den Bildschirm. Wenn Sie jedes Pixel auf einem 1000x1000 Canvas schwarz setzen, werden 1 Million Delta-Objekte erstellt. In der Praxis tun dies natürlich Grafikprogramme auf eine optimierte Art und Weise. –

+0

Anstatt einen Stapel zu verwenden, können Sie auch eine Warteschlange mit einem "Jetzt" -Zeiger verwenden. Dies ermöglicht es, sowohl die Rückgängig- als auch die Wiederherstellungsfunktionalität leicht durch Rückwärts- und Vorwärtsbewegungen in der Warteschlange zu implementieren (d. H., Rückgängig macht ein Objekt in der Warteschlange rückgängig und wiederholt Schritte nach vorne und wiederholt die Aktion). – CodeFusionMobile

Verwandte Themen