Prechádzať zdrojové kódy

Modify text actions

Kandrashin Denis 12 rokov pred
rodič
commit
95e15c351b

BIN
3rdparty/gnome/24x24/edit-clear.png


+ 24 - 12
source/fb2main.cpp

@@ -378,7 +378,7 @@ void FbMainWindow::createActions()
 
     menuText = menu = menuBar()->addMenu(tr("Fo&rmat"));
 
-    actionClearFormat = act = new QAction(tr("Clear format"), this);
+    actionClearFormat = act = new QAction(FbIcon("edit-clear"), tr("Clear format"), this);
     menu->addAction(act);
 
     menu->addSeparator();
@@ -512,16 +512,21 @@ void FbMainWindow::createImgs()
 
 void FbMainWindow::selectionChanged()
 {
-    actionCut->setEnabled(textFrame->view()->CutEnabled());
-    actionCopy->setEnabled(textFrame->view()->CopyEnabled());
-
-    actionTextBold->setChecked(textFrame->view()->BoldChecked());
-    actionTextItalic->setChecked(textFrame->view()->ItalicChecked());
-    actionTextStrike->setChecked(textFrame->view()->StrikeChecked());
-    actionTextSub->setChecked(textFrame->view()->SubChecked());
-    actionTextSup->setChecked(textFrame->view()->SupChecked());
+    FbTextEdit *view = textFrame->view();
+    actionCut->setEnabled(view->actionEnabled(QWebPage::Cut));
+    actionCopy->setEnabled(view->actionEnabled(QWebPage::Copy));
+    statusBar()->showMessage(view->page()->status());
+}
 
-    statusBar()->showMessage(textFrame->view()->page()->status());
+void FbMainWindow::formatChanged()
+{
+    FbTextEdit *view = textFrame->view();
+    actionClearFormat->setEnabled(view->actionEnabled(QWebPage::RemoveFormat));
+    actionTextBold->setChecked(view->actionChecked(QWebPage::ToggleBold));
+    actionTextItalic->setChecked(view->actionChecked(QWebPage::ToggleItalic));
+    actionTextStrike->setChecked(view->actionChecked(QWebPage::ToggleStrikethrough));
+    actionTextSub->setChecked(view->actionChecked(QWebPage::ToggleSubscript));
+    actionTextSup->setChecked(view->actionChecked(QWebPage::ToggleSuperscript));
 }
 
 void FbMainWindow::canUndoChanged(bool canUndo)
@@ -536,12 +541,12 @@ void FbMainWindow::canRedoChanged(bool canRedo)
 
 void FbMainWindow::undoChanged()
 {
-    actionUndo->setEnabled(textFrame->view()->UndoEnabled());
+    actionUndo->setEnabled(textFrame->view()->actionEnabled(QWebPage::Undo));
 }
 
 void FbMainWindow::redoChanged()
 {
-    actionRedo->setEnabled(textFrame->view()->RedoEnabled());
+    actionRedo->setEnabled(textFrame->view()->actionEnabled(QWebPage::Redo));
 }
 
 void FbMainWindow::createStatusBar()
@@ -668,6 +673,13 @@ void FbMainWindow::createTextToolbar()
     connect(actionTextSub, SIGNAL(triggered()), textEdit->pageAction(QWebPage::ToggleSubscript), SIGNAL(triggered()));
     connect(actionTextSup, SIGNAL(triggered()), textEdit->pageAction(QWebPage::ToggleSuperscript), SIGNAL(triggered()));
 
+    connect(textEdit->pageAction(QWebPage::RemoveFormat), SIGNAL(changed()), SLOT(formatChanged()));
+    connect(textEdit->pageAction(QWebPage::ToggleBold), SIGNAL(changed()), SLOT(formatChanged()));
+    connect(textEdit->pageAction(QWebPage::ToggleItalic), SIGNAL(changed()), SLOT(formatChanged()));
+    connect(textEdit->pageAction(QWebPage::ToggleStrikethrough), SIGNAL(changed()), SLOT(formatChanged()));
+    connect(textEdit->pageAction(QWebPage::ToggleSubscript), SIGNAL(changed()), SLOT(formatChanged()));
+    connect(textEdit->pageAction(QWebPage::ToggleSuperscript), SIGNAL(changed()), SLOT(formatChanged()));
+
     connect(actionFind, SIGNAL(triggered()), textEdit, SLOT(find()));
     connect(actionImage, SIGNAL(triggered()), textEdit, SLOT(insertImage()));
     connect(actionNote, SIGNAL(triggered()), textEdit, SLOT(insertNote()));

+ 1 - 0
source/fb2main.hpp

@@ -70,6 +70,7 @@ private slots:
     void status(const QString &text);
     void clipboardDataChanged();
     void selectionChanged();
+    void formatChanged();
     void undoChanged();
     void redoChanged();
     void openSettings();

+ 25 - 23
source/fb2temp.cpp

@@ -1,6 +1,7 @@
 #include "fb2temp.hpp"
 
 #include <QAbstractListModel>
+#include <QBuffer>
 #include <QCryptographicHash>
 #include <QFileInfo>
 #include <QImageReader>
@@ -21,11 +22,14 @@ FbTemporaryFile::FbTemporaryFile(const QString &name)
 {
 }
 
-qint64 FbTemporaryFile::write(const QByteArray &data)
+qint64 FbTemporaryFile::write(QByteArray &data)
 {
     open();
     if (m_hash.isEmpty()) m_hash = md5(data);
     m_size = QTemporaryFile::write(data);
+    QBuffer buffer(&data);
+    buffer.open(QIODevice::ReadOnly);
+    m_type = QImageReader::imageFormat(&buffer);
     close();
     return m_size;
 }
@@ -57,7 +61,7 @@ FbTemporaryList::~FbTemporaryList()
     while (it.hasNext()) delete it.next();
 }
 
-QString FbTemporaryList::add(const QString &path, const QByteArray &data)
+QString FbTemporaryList::add(const QString &path, QByteArray &data)
 {
     QString hash = FbTemporaryFile::md5(data);
     QString name = this->name(hash);
@@ -105,7 +109,7 @@ QByteArray FbTemporaryList::data(const QString &name) const
     return QByteArray();
 }
 
-const QString & FbTemporaryList::set(const QString &name, const QByteArray &data, const QString &hash)
+const QString & FbTemporaryList::set(const QString &name, QByteArray &data, const QString &hash)
 {
     FbTemporaryFile * file = get(name);
     if (!file) append(file = new FbTemporaryFile(name));
@@ -210,20 +214,18 @@ QNetworkReply * FbNetworkAccessManager::imageRequest(Operation op, const QNetwor
     return new FbImageReply(op, request, data);
 }
 
-QString FbNetworkAccessManager::name(int index) const
+QVariant FbNetworkAccessManager::info(int row, int col) const
 {
-    if (0 <= index && index < count()) {
-        return m_files[index]->name();
-    }
-    return QString();
-}
-
-int FbNetworkAccessManager::size(int index) const
-{
-    if (0 <= index && index < count()) {
-        return m_files[index]->size();
+    if (0 <= row && row < count()) {
+        FbTemporaryFile *file = m_files[row];
+        switch (col) {
+            case 0: return file->name();
+            case 1: return file->type();
+            case 2: return file->size();
+        }
+        return m_files[row]->name();
     }
-    return 0;
+    return QVariant();
 }
 
 QByteArray FbNetworkAccessManager::data(int index) const
@@ -252,7 +254,7 @@ FbListModel::FbListModel(FbNetworkAccessManager &files, QObject *parent)
 int FbListModel::columnCount(const QModelIndex &parent) const
 {
     Q_UNUSED(parent);
-    return 2;
+    return 3;
 }
 
 int FbListModel::rowCount(const QModelIndex &parent) const
@@ -266,7 +268,8 @@ QVariant FbListModel::headerData(int section, Qt::Orientation orientation, int r
     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
         switch (section) {
             case 0: return tr("File name");
-            case 1: return tr("Size");
+            case 1: return tr("Type");
+            case 2: return tr("Size");
         }
     }
     return QVariant();
@@ -277,15 +280,12 @@ QVariant FbListModel::data(const QModelIndex &index, int role) const
     if (index.isValid()) {
         switch (role) {
             case Qt::DisplayRole: {
-                switch (index.column()) {
-                    case 0: return m_files.name(index.row());
-                    case 1: return m_files.size(index.row());
-                }
+                return m_files.info(index.row(), index.column());
             } break;
             case Qt::TextAlignmentRole: {
                 switch (index.column()) {
-                    case 0: return Qt::AlignLeft;
-                    case 1: return Qt::AlignRight;
+                    case 2: return Qt::AlignRight;
+                    default: return Qt::AlignLeft;
                 }
             }
         }
@@ -362,4 +362,6 @@ void FbListWidget::loadFinished(bool ok)
     m_list->setModel(new FbListModel(*m_view.files(), this));
     m_list->label()->clear();
     m_list->reset();
+    m_list->resizeColumnToContents(1);
+    m_list->resizeColumnToContents(2);
 }

+ 7 - 6
source/fb2temp.hpp

@@ -20,15 +20,17 @@ public:
     static QString md5(const QByteArray &data);
 public:
     explicit FbTemporaryFile(const QString &name);
-    inline qint64 write(const QByteArray &data);
+    inline qint64 write(QByteArray &data);
     void setHash(const QString &hash) { m_hash = hash; }
     const QString & hash() const { return m_hash; }
     const QString & name() const { return m_name; }
+    const QString & type() const { return m_type; }
     qint64 size() const { return m_size; }
     QByteArray data();
 private:
     const QString m_name;
     QString m_hash;
+    QString m_type;
     qint64 m_size;
 };
 
@@ -38,10 +40,10 @@ public:
     explicit FbTemporaryList();
     virtual ~FbTemporaryList();
 
-    QString add(const QString &path, const QByteArray &data);
+    QString add(const QString &path, QByteArray &data);
     bool exists(const QString &name) const;
     FbTemporaryFile * get(const QString &name) const;
-    const QString & set(const QString &name, const QByteArray &data, const QString &hash = QString());
+    const QString & set(const QString &name, QByteArray &data, const QString &hash = QString());
     QString name(const QString &hash) const;
     QByteArray data(const QString &name) const;
 private:
@@ -92,13 +94,12 @@ public slots:
     void data(QString name, QByteArray data);
 
 public:
-    QString add(const QString &path, const QByteArray &data) { return m_files.add(path, data); }
+    QString add(const QString &path, QByteArray &data) { return m_files.add(path, data); }
     bool exists(const QString &name) const { return m_files.exists(name); }
     FbTemporaryFile * get(const QString &name) const { return m_files.get(name); }
     int count() const { return m_files.count(); }
     QByteArray data(int index) const;
-    QString name(int index) const;
-    int size(int index) const;
+    QVariant info(int row, int col) const;
 
 protected:
     virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0);

+ 12 - 14
source/fb2text.cpp

@@ -375,6 +375,10 @@ void FbTextBase::addTools(QToolBar *tool)
 
     tool->addSeparator();
 
+    act = pageAction(QWebPage::RemoveFormat);
+    act->setText(QObject::tr("Clear format"));
+    act->setIcon(FbIcon("edit-clear"));
+
     act = pageAction(QWebPage::ToggleBold);
     act->setIcon(FbIcon("format-text-bold"));
     act->setText(QObject::tr("&Bold"));
@@ -462,6 +466,8 @@ void FbTextEdit::contextMenu(const QPoint &pos)
     QMenu menu, *submenu;
 
     submenu = menu.addMenu(tr("Fo&rmat"));
+    submenu->addAction(pageAction(QWebPage::RemoveFormat));
+    submenu->addSeparator();
     submenu->addAction(pageAction(QWebPage::ToggleBold));
     submenu->addAction(pageAction(QWebPage::ToggleItalic));
     submenu->addAction(pageAction(QWebPage::ToggleStrikethrough));
@@ -581,24 +587,16 @@ void FbTextEdit::zoomReset()
     setZoomFactor(1);
 }
 
-bool FbTextEdit::UndoEnabled()
-{
-    return pageAction(QWebPage::Undo)->isEnabled();
-}
-
-bool FbTextEdit::RedoEnabled()
-{
-    return pageAction(QWebPage::Redo)->isEnabled();
-}
-
-bool FbTextEdit::CutEnabled()
+bool FbTextEdit::actionEnabled(QWebPage::WebAction action)
 {
-    return pageAction(QWebPage::Cut)->isEnabled();
+    QAction *act = pageAction(action);
+    return act ? act->isEnabled() : false;
 }
 
-bool FbTextEdit::CopyEnabled()
+bool FbTextEdit::actionChecked(QWebPage::WebAction action)
 {
-    return pageAction(QWebPage::Copy)->isEnabled();
+    QAction *act = pageAction(action);
+    return act ? act->isChecked() : false;
 }
 
 bool FbTextEdit::BoldChecked()

+ 3 - 4
source/fb2text.hpp

@@ -118,10 +118,9 @@ public:
     bool save(QByteArray *array);
     bool save(QString *string);
 
-    bool UndoEnabled();
-    bool RedoEnabled();
-    bool CutEnabled();
-    bool CopyEnabled();
+    bool actionEnabled(QWebPage::WebAction action);
+    bool actionChecked(QWebPage::WebAction action);
+
     bool BoldChecked();
     bool ItalicChecked();
     bool StrikeChecked();

BIN
source/ts/ru.qm


+ 8 - 0
source/ts/ru.ts

@@ -216,6 +216,10 @@
         <source>Size</source>
         <translation>Размер</translation>
     </message>
+    <message>
+        <source>Type</source>
+        <translation>Тип</translation>
+    </message>
 </context>
 <context>
     <name>FbMainWindow</name>
@@ -552,6 +556,10 @@
         <source>Clear format</source>
         <translation>&amp;Очистить формат</translation>
     </message>
+    <message>
+        <source>Paste (no style)</source>
+        <translation>Вставить простой текст</translation>
+    </message>
 </context>
 <context>
     <name>FbNodeDlg</name>