Kandrashin Denis пре 13 година
родитељ
комит
a5d08a51b1
6 измењених фајлова са 40 додато и 40 уклоњено
  1. 12 4
      source/fb2main.cpp
  2. 1 1
      source/fb2main.hpp
  3. 15 25
      source/fb2save.cpp
  4. 5 6
      source/fb2save.hpp
  5. 6 3
      source/fb2view.cpp
  6. 1 1
      source/fb2view.hpp

+ 12 - 4
source/fb2main.cpp

@@ -6,6 +6,7 @@
 #include "fb2main.hpp"
 #include "fb2code.hpp"
 #include "fb2read.hpp"
+#include "fb2save.hpp"
 #include "fb2tree.hpp"
 #include "fb2view.hpp"
 #include "fb2head.hpp"
@@ -171,9 +172,12 @@ bool Fb2MainWindow::fileSave()
 
 bool Fb2MainWindow::fileSaveAs()
 {
-    QString fileName = QFileDialog::getSaveFileName(this, tr("Save As..."), curFile);
+    Fb2SaveDialog dlg(this, tr("Save As..."));
+    dlg.selectFile(curFile);
+    if (!dlg.exec()) return false;
+    QString fileName = dlg.fileName();
     if (fileName.isEmpty()) return false;
-    return saveFile(fileName);
+    return saveFile(fileName, dlg.codec());
 }
 
 void Fb2MainWindow::about()
@@ -514,14 +518,18 @@ bool Fb2MainWindow::maybeSave()
     return true;
 }
 
-bool Fb2MainWindow::saveFile(const QString &fileName)
+bool Fb2MainWindow::saveFile(const QString &fileName, const QString &codec)
 {
     QFile file(fileName);
     if (!file.open(QFile::WriteOnly | QFile::Text)) {
         QMessageBox::warning(this, qApp->applicationName(), tr("Cannot write file %1: %2.").arg(fileName).arg(file.errorString()));
         return false;
     }
-    if (textEdit) return textEdit->save(&file);
+
+    if (textEdit) {
+        textEdit->save(&file, codec);
+        setCurrentFile(fileName);
+    }
     return true;
 
 /*

+ 1 - 1
source/fb2main.hpp

@@ -70,7 +70,7 @@ private:
     void readSettings();
     void writeSettings();
     bool maybeSave();
-    bool saveFile(const QString &fileName);
+    bool saveFile(const QString &fileName, const QString &codec = QString());
     void setCurrentFile(const QString &fileName = QString());
     Fb2MainWindow *findFb2MainWindow(const QString &fileName);
 

+ 15 - 25
source/fb2save.cpp

@@ -82,6 +82,14 @@ void Fb2SaveDialog::init()
     layout->addWidget(combo, row, 1);
 }
 
+QString Fb2SaveDialog::fileName() const
+{
+    foreach (QString filename, selectedFiles()) {
+        return filename;
+    }
+    return QString();
+}
+
 QString Fb2SaveDialog::codec() const
 {
     return combo->currentText();
@@ -127,7 +135,6 @@ Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QByteArray *array, QList<int> *fo
     , m_view(view)
     , m_line(0)
 {
-    Init();
 }
 
 Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QIODevice *device, QList<int> *folds)
@@ -136,7 +143,6 @@ Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QIODevice *device, QList<int> *fo
     , m_view(view)
     , m_line(0)
 {
-    Init();
 }
 
 Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QString *string, QList<int> *folds)
@@ -145,17 +151,6 @@ Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QString *string, QList<int> *fold
     , m_view(view)
     , m_line(0)
 {
-    Init();
-}
-
-void Fb2SaveWriter::Init()
-{
-    writeStartDocument();
-}
-
-Fb2SaveWriter::~Fb2SaveWriter()
-{
-    writeEndDocument();
 }
 
 void Fb2SaveWriter::writeStartElement(const QString &name, int level)
@@ -443,17 +438,9 @@ void Fb2SaveHandler::ParagHandler::start()
 //  Fb2SaveHandler
 //---------------------------------------------------------------------------
 
-Fb2SaveHandler::Fb2SaveHandler(Fb2WebView &view, QIODevice *device, QList<int> *folds)
-    : Fb2HtmlHandler()
-    , m_writer(view, device, folds)
-    , m_view(view)
-{
-}
-
-Fb2SaveHandler::Fb2SaveHandler(Fb2WebView &view, QByteArray *array, QList<int> *folds)
+Fb2SaveHandler::Fb2SaveHandler(Fb2SaveWriter &writer)
     : Fb2HtmlHandler()
-    , m_writer(view, array, folds)
-    , m_view(view)
+    , m_writer(writer)
 {
 }
 
@@ -466,8 +453,11 @@ Fb2XmlHandler::NodeHandler * Fb2SaveHandler::CreateRoot(const QString &name, con
 
 bool Fb2SaveHandler::save()
 {
+    m_writer.writeStartDocument();
+    QWebFrame * frame = m_writer.view().page()->mainFrame();
     static const QString javascript = FB2::read(":/js/export.js");
-    m_view.page()->mainFrame()->addToJavaScriptWindowObject("handler", this);
-    m_view.page()->mainFrame()->evaluateJavaScript(javascript);
+    frame->addToJavaScriptWindowObject("handler", this);
+    frame->evaluateJavaScript(javascript);
+    m_writer.writeEndDocument();
     return true;
 }

+ 5 - 6
source/fb2save.hpp

@@ -30,6 +30,8 @@ public:
                          const QString &directory = QString(),
                          const QString &filter = QString());
 
+    QString fileName() const;
+
     QString codec() const;
 
 private:
@@ -66,14 +68,13 @@ public:
     explicit Fb2SaveWriter(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
     explicit Fb2SaveWriter(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
     explicit Fb2SaveWriter(Fb2WebView &view, QString *string, QList<int> *folds = 0);
-    virtual ~Fb2SaveWriter();
+    Fb2WebView & view() { return m_view; }
     QString getFileName(const QString &src);
     void writeStartElement(const QString &name, int level);
     void writeEndElement(int level);
     void writeLineEnd();
     void writeFiles();
 private:
-    void Init();
     QByteArray downloadFile(const QUrl &url);
     QByteArray getFileData(const QString &name);
     QString newFileName(const QString &path);
@@ -88,8 +89,7 @@ private:
 class Fb2SaveHandler : public Fb2HtmlHandler
 {
 public:
-    explicit Fb2SaveHandler(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
-    explicit Fb2SaveHandler(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
+    explicit Fb2SaveHandler(Fb2SaveWriter &writer);
     bool save();
 
 private:
@@ -169,8 +169,7 @@ protected:
     virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
 
 private:
-    Fb2SaveWriter m_writer;
-    Fb2WebView & m_view;
+    Fb2SaveWriter & m_writer;
 };
 
 #endif // Fb2Save_H

+ 6 - 3
source/fb2view.cpp

@@ -175,14 +175,17 @@ void Fb2WebView::load(const QString &filename, const QString &xml)
     m_thread->start();
 }
 
-bool Fb2WebView::save(QIODevice *device)
+bool Fb2WebView::save(QIODevice *device, const QString &codec)
 {
-    return Fb2SaveHandler(*this, device).save();
+    Fb2SaveWriter writer(*this, device);
+    if (!codec.isEmpty()) writer.setCodec(codec.toLatin1());
+    return Fb2SaveHandler(writer).save();
 }
 
 bool Fb2WebView::save(QByteArray *array, QList<int> *folds)
 {
-    return Fb2SaveHandler(*this, array, folds).save();
+    Fb2SaveWriter writer(*this, array, folds);
+    return Fb2SaveHandler(writer).save();
 }
 
 bool Fb2WebView::save(QString *string)

+ 1 - 1
source/fb2view.hpp

@@ -66,8 +66,8 @@ public:
 
     const Fb2TemporaryList & files() const { return m_files; }
     void load(const QString &filename, const QString &xml = QString());
+    bool save(QIODevice *device, const QString &codec = QString());
     bool save(QByteArray *array, QList<int> *folds = 0);
-    bool save(QIODevice *device);
     bool save(QString *string);
     QString toBodyXml();
     QString status();