ソースを参照

Undo element delete

Kandrashin Denis 13 年 前
コミット
0dd7e7798a
3 ファイル変更54 行追加2 行削除
  1. 33 0
      source/fb2html.cpp
  2. 14 0
      source/fb2html.h
  3. 7 2
      source/fb2tree.cpp

+ 33 - 0
source/fb2html.cpp

@@ -75,3 +75,36 @@ void Fb2SubtitleCmd::undo()
     m_page.update();
     m_page.update();
 }
 }
 
 
+//---------------------------------------------------------------------------
+//  Fb2DeleteCmd
+//---------------------------------------------------------------------------
+
+Fb2DeleteCmd::Fb2DeleteCmd(Fb2TextPage &page, Fb2TextElement &element, QUndoCommand *parent)
+    : QUndoCommand(parent)
+    , m_element(element)
+    , m_page(page)
+    , m_inner(false)
+{
+    m_parent = element.previousSibling();
+    if (m_parent.isNull()) {
+        m_parent = element.parent();
+        m_inner = true;
+    }
+}
+
+void Fb2DeleteCmd::redo()
+{
+    m_element.takeFromDocument();
+    m_page.update();
+}
+
+void Fb2DeleteCmd::undo()
+{
+    if (m_inner) {
+        m_parent.prependInside(m_element);
+    } else {
+        m_parent.appendOutside(m_element);
+    }
+    m_page.update();
+}
+

+ 14 - 0
source/fb2html.h

@@ -44,4 +44,18 @@ private:
     QString m_position;
     QString m_position;
 };
 };
 
 
+class Fb2DeleteCmd : public QUndoCommand
+{
+public:
+    explicit Fb2DeleteCmd(Fb2TextPage &page, Fb2TextElement &element, QUndoCommand *parent = 0);
+    virtual void undo();
+    virtual void redo();
+private:
+    Fb2TextElement m_element;
+    Fb2TextElement m_parent;
+    Fb2TextPage & m_page;
+    QString m_position;
+    bool m_inner;
+};
+
 #endif // FB2HTML_H
 #endif // FB2HTML_H

+ 7 - 2
source/fb2tree.cpp

@@ -11,6 +11,7 @@
 #include <QUrl>
 #include <QUrl>
 
 
 #include "fb2text.hpp"
 #include "fb2text.hpp"
+#include "fb2html.h"
 #include "fb2utils.h"
 #include "fb2utils.h"
 
 
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -38,7 +39,7 @@ Fb2TreeItem::Fb2TreeItem(QWebElement &element, Fb2TreeItem *parent, int number)
     } else if (m_name == "img") {
     } else if (m_name == "img") {
         m_name = "image";
         m_name = "image";
         QUrl url = element.attribute("src");
         QUrl url = element.attribute("src");
-        m_text = url.path();
+        m_text = url.fragment();
     }
     }
     addChildren(element);
     addChildren(element);
 }
 }
@@ -315,7 +316,11 @@ bool Fb2TreeModel::removeRows(int row, int count, const QModelIndex &parent)
     beginRemoveRows(parent, row, last);
     beginRemoveRows(parent, row, last);
     for (int i = last; i >= row; i--) {
     for (int i = last; i >= row; i--) {
         if (Fb2TreeItem * child = owner->takeAt(i)) {
         if (Fb2TreeItem * child = owner->takeAt(i)) {
-            child->element().removeFromDocument();
+//            child->element().removeFromDocument();
+            Fb2TextPage & page = *m_view.page();
+            page.undoStack()->beginMacro("Delete element");
+            page.undoStack()->push(new Fb2DeleteCmd(page, child->element()));
+            page.undoStack()->endMacro();
             delete child;
             delete child;
         }
         }
     }
     }