Browse Source

Code actions

Kandrashin Denis 12 years ago
parent
commit
484346053b
11 changed files with 122 additions and 40 deletions
  1. 65 0
      source/fb2code.cpp
  2. 2 6
      source/fb2code.hpp
  3. 22 6
      source/fb2dock.cpp
  4. 4 0
      source/fb2dock.hpp
  5. 1 5
      source/fb2head.cpp
  6. 8 17
      source/fb2main.cpp
  7. 0 1
      source/fb2main.hpp
  8. 1 1
      source/fb2mode.cpp
  9. 2 2
      source/fb2mode.h
  10. 16 2
      source/fb2text.cpp
  11. 1 0
      source/fb2text.hpp

+ 65 - 0
source/fb2code.cpp

@@ -1,6 +1,10 @@
 #include "fb2code.hpp"
 #include "fb2dlgs.hpp"
 
+//---------------------------------------------------------------------------
+//  FbHighlighter
+//---------------------------------------------------------------------------
+
 #include <QXmlInputSource>
 #include <QtGui>
 
@@ -330,6 +334,10 @@ int FbHighlighter::processDefaultText(int i, const QString& text)
     return iLength;
 }
 
+//---------------------------------------------------------------------------
+//  FbCodeEdit
+//---------------------------------------------------------------------------
+
 qreal FbCodeEdit::baseFontSize = 10;
 qreal FbCodeEdit::zoomRatioMin = 0.2;
 qreal FbCodeEdit::zoomRatioMax = 5.0;
@@ -356,6 +364,11 @@ FbCodeEdit::FbCodeEdit(QWidget *parent) : QPlainTextEdit(parent)
     highlightCurrentLine();
 }
 
+QAction * FbCodeEdit::act(Fb::Actions index) const
+{
+    return m_actions[index];
+}
+
 void FbCodeEdit::setAction(Fb::Actions index, QAction *action)
 {
     m_actions[index] = action;
@@ -363,10 +376,62 @@ void FbCodeEdit::setAction(Fb::Actions index, QAction *action)
 
 void FbCodeEdit::connectActions(QToolBar *tool)
 {
+    act(Fb::EditUndo)->setEnabled(document()->isUndoAvailable());
+    act(Fb::EditRedo)->setEnabled(document()->isRedoAvailable());
+    act(Fb::EditFind)->setEnabled(true);
+
+    act(Fb::ZoomIn)->setEnabled(true);
+    act(Fb::ZoomOut)->setEnabled(true);
+    act(Fb::ZoomReset)->setEnabled(true);
+
+    connect(act(Fb::EditUndo), SIGNAL(triggered()), SLOT(undo()));
+    connect(act(Fb::EditRedo), SIGNAL(triggered()), SLOT(redo()));
+
+    connect(this, SIGNAL(undoAvailable(bool)), act(Fb::EditUndo), SLOT(setEnabled(bool)));
+    connect(this, SIGNAL(redoAvailable(bool)), act(Fb::EditRedo), SLOT(setEnabled(bool)));
+
+    connect(act(Fb::EditCut), SIGNAL(triggered()), SLOT(cut()));
+    connect(act(Fb::EditCopy), SIGNAL(triggered()), SLOT(copy()));
+    connect(act(Fb::EditPaste), SIGNAL(triggered()), SLOT(paste()));
+    connect(act(Fb::EditFind), SIGNAL(triggered()), SLOT(find()));
+
+    connect(this, SIGNAL(copyAvailable(bool)), act(Fb::EditCut), SLOT(setEnabled(bool)));
+    connect(this, SIGNAL(copyAvailable(bool)), act(Fb::EditCopy), SLOT(setEnabled(bool)));
+    connect(qApp->clipboard(), SIGNAL(dataChanged()), SLOT(clipboardDataChanged()));
+    clipboardDataChanged();
+
+    connect(act(Fb::ZoomIn), SIGNAL(triggered()), SLOT(zoomIn()));
+    connect(act(Fb::ZoomOut), SIGNAL(triggered()), SLOT(zoomOut()));
+    connect(act(Fb::ZoomReset), SIGNAL(triggered()), SLOT(zoomReset()));
+
+    tool->clear();
+
+    tool->addSeparator();
+    tool->addAction(act(Fb::EditUndo));
+    tool->addAction(act(Fb::EditRedo));
+
+    tool->addSeparator();
+    tool->addAction(act(Fb::EditCut));
+    tool->addAction(act(Fb::EditCopy));
+    tool->addAction(act(Fb::EditPaste));
+
+    tool->addSeparator();
+    tool->addAction(act(Fb::ZoomIn));
+    tool->addAction(act(Fb::ZoomOut));
+    tool->addAction(act(Fb::ZoomReset));
+
 }
 
 void FbCodeEdit::disconnectActions()
 {
+    m_actions.disconnect();
+}
+
+void FbCodeEdit::clipboardDataChanged()
+{
+    if (const QMimeData *md = QApplication::clipboard()->mimeData()) {
+        act(Fb::EditPaste)->setEnabled(md->hasText());
+    }
 }
 
 bool FbCodeEdit::read(QIODevice *device)

+ 2 - 6
source/fb2code.hpp

@@ -84,6 +84,7 @@ class FbCodeEdit : public QPlainTextEdit
 public:
     FbCodeEdit(QWidget *parent = 0);
 
+    QAction * act(Fb::Actions index) const;
     void setAction(Fb::Actions index, QAction *action);
     void connectActions(QToolBar *tool);
     void disconnectActions();
@@ -95,12 +96,6 @@ public:
     void load(const QByteArray data)
         { setPlainText(QString::fromUtf8(data.data())); }
 
-    bool isUndoAvailable() { return false; }
-
-    bool isRedoAvailable() { return false; }
-
-    void zoomTo ( int ) {}
-
     bool findText(const QString &exp, QTextDocument::FindFlags options = 0);
 
     bool isModified() const { return document()->isModified(); }
@@ -115,6 +110,7 @@ protected:
     void resizeEvent(QResizeEvent *event);
 
 private slots:
+    void clipboardDataChanged();
     void updateLineNumberAreaWidth(int newBlockCount);
     void highlightCurrentLine();
     void updateLineNumberArea(const QRect &, int);

+ 22 - 6
source/fb2dock.cpp

@@ -48,11 +48,12 @@ FbMainDock::FbMainDock(QWidget *parent)
 void FbMainDock::setMode(Fb::Mode mode)
 {
     if (mode == m_mode) return;
+    enableMenu(mode == Fb::Text);
     switch (m_mode = mode) {
-        case Fb::Text: setModeText(); return;
-        case Fb::Head: setModeHead(); return;
-        case Fb::Code: setModeCode(); return;
-        case Fb::Html: setModeHtml(); return;
+        case Fb::Text: setModeText(); break;
+        case Fb::Head: setModeHead(); break;
+        case Fb::Code: setModeCode(); break;
+        case Fb::Html: setModeHtml(); break;
     }
 }
 
@@ -68,6 +69,7 @@ void FbMainDock::setModeText()
 void FbMainDock::setModeHead()
 {
     m_mode = Fb::Head;
+    m_text->hideDocks();
     setCurrentWidget(m_head);
     m_text->disconnectActions();
     m_code->disconnectActions();
@@ -77,18 +79,20 @@ void FbMainDock::setModeHead()
 void FbMainDock::setModeCode()
 {
     m_mode = Fb::Code;
+    m_text->hideDocks();
     setCurrentWidget(m_code);
+    m_text->disconnectActions();
     m_head->disconnectActions();
-    m_code->disconnectActions();
     m_code->connectActions(m_tool);
 }
 
 void FbMainDock::setModeHtml()
 {
     m_mode = Fb::Html;
+    m_text->hideDocks();
     setCurrentWidget(m_code);
+    m_text->disconnectActions();
     m_head->disconnectActions();
-    m_code->disconnectActions();
     m_code->connectActions(m_tool);
 }
 
@@ -129,3 +133,15 @@ bool FbMainDock::isModified() const
     if (current == m_code) return m_code->isModified();
     return false;
 }
+
+void FbMainDock::addMenu(QMenu *menu)
+{
+    m_menus.append(menu);
+}
+
+void FbMainDock::enableMenu(bool value)
+{
+    foreach (QMenu *menu, m_menus) {
+        menu->setEnabled(value);
+    }
+}

+ 4 - 0
source/fb2dock.hpp

@@ -3,6 +3,7 @@
 
 #include <QAction>
 #include <QIcon>
+#include <QMenu>
 #include <QStackedWidget>
 #include <QToolBar>
 #include <QIODevice>
@@ -27,6 +28,7 @@ public:
     Fb::Mode mode() const { return m_mode; }
     void setMode(Fb::Mode mode);
     void setTool(QToolBar *tool) { m_tool = tool; }
+    void addMenu(QMenu *menu);
     bool isModified() const;
 
 signals:
@@ -34,6 +36,7 @@ signals:
 public slots:
 
 private:
+    void enableMenu(bool value);
     void setModeText();
     void setModeHead();
     void setModeCode();
@@ -41,6 +44,7 @@ private:
 
 private:
     QFrame *textFrame;
+    QList<QMenu*> m_menus;
     FbTextEdit *m_text;
     FbHeadEdit *m_head;
     FbCodeEdit *m_code;

+ 1 - 5
source/fb2head.cpp

@@ -601,11 +601,7 @@ void FbHeadEdit::connectActions(QToolBar *tool)
 
 void FbHeadEdit::disconnectActions()
 {
-    foreach (QAction *action, m_actions) {
-        action->setDisabled(true);
-        action->setChecked(false);
-        disconnect(action);
-    }
+    m_actions.disconnect();
 }
 
 FbHeadModel * FbHeadEdit::model() const

+ 8 - 17
source/fb2main.cpp

@@ -228,7 +228,7 @@ void FbMainWindow::createActions()
 
     act = new FbTextAction(FbIcon("edit-redo"), tr("&Redo"), QWebPage::Redo, text);
     text->setAction(Fb::EditRedo, act);
-    code->setAction(Fb::EditUndo, act);
+    code->setAction(Fb::EditRedo, act);
     act->setPriority(QAction::LowPriority);
     act->setShortcut(QKeySequence::Redo);
     act->setEnabled(false);
@@ -265,24 +265,21 @@ void FbMainWindow::createActions()
     act->setStatusTip(tr("Paste the clipboard's contents into the current selection"));
     menu->addAction(act);
 
-    act = new FbTextAction(FbIcon("Paste (no style)"), tr("&Paste"), QWebPage::PasteAndMatchStyle, text);
-    act = new QAction(tr("Paste (no style)"), this);
+    act = new FbTextAction(tr("Paste (no style)"), QWebPage::PasteAndMatchStyle, text);
     text->setAction(Fb::PasteText, act);
     menu->addAction(act);
 
-    clipboardDataChanged();
-
     menu->addSeparator();
 
     act = new QAction(FbIcon("edit-find"), tr("&Find..."), this);
-    text->setAction(Fb::TextFind, act);
-    code->setAction(Fb::TextFind, act);
+    text->setAction(Fb::EditFind, act);
+    code->setAction(Fb::EditFind, act);
     act->setShortcuts(QKeySequence::Find);
     menu->addAction(act);
 
     act = new QAction(FbIcon("edit-find-replace"), tr("&Replace..."), this);
-    text->setAction(Fb::TextReplace, act);
-    code->setAction(Fb::TextReplace, act);
+    text->setAction(Fb::EditReplace, act);
+    code->setAction(Fb::EditReplace, act);
     menu->addAction(act);
 
     menu->addSeparator();
@@ -294,6 +291,7 @@ void FbMainWindow::createActions()
     menu->addAction(act);
 
     menu = menuBar()->addMenu(tr("&Insert", "Main menu"));
+    mainDock->addMenu(menu);
 
     act = new QAction(FbIcon("insert-image"), tr("&Image"), this);
     text->setAction(Fb::InsertImage, act);
@@ -368,6 +366,7 @@ void FbMainWindow::createActions()
     menu->addAction(act);
 
     menu = menuBar()->addMenu(tr("Fo&rmat"));
+    mainDock->addMenu(menu);
 
     act = new FbTextAction(FbIcon("edit-clear"), tr("Clear format"), QWebPage::RemoveFormat, text);
     text->setAction(Fb::ClearFormat, act);
@@ -844,14 +843,6 @@ void FbMainWindow::viewImgs()
     if (dockImgs) dockImgs->deleteLater(); else createImgs();
 }
 */
-void FbMainWindow::clipboardDataChanged()
-{
-    if (const QMimeData *md = QApplication::clipboard()->mimeData()) {
-//        actionPaste->setEnabled(md->hasText());
-//        actionPasteText->setEnabled(md->hasText());
-    }
-}
-
 void FbMainWindow::status(const QString &text)
 {
     statusBar()->showMessage(text);

+ 0 - 1
source/fb2main.hpp

@@ -66,7 +66,6 @@ private slots:
     void logShowed();
 
     void status(const QString &text);
-    void clipboardDataChanged();
     void openSettings();
 
 private:

+ 1 - 1
source/fb2mode.cpp

@@ -14,8 +14,8 @@ void FbActionMap::connect()
 void FbActionMap::disconnect()
 {
     foreach (QAction *action, *this) {
+        if (action->isCheckable()) action->setChecked(false);
         action->setEnabled(false);
-        action->setChecked(false);
         action->disconnect();
     }
 }

+ 2 - 2
source/fb2mode.h

@@ -23,8 +23,8 @@ enum Actions {
     EditPaste,
     PasteText,
     TextSelect,
-    TextFind,
-    TextReplace,
+    EditFind,
+    EditReplace,
     InsertImage,
     InsertNote,
     InsertLink,

+ 16 - 2
source/fb2text.cpp

@@ -286,11 +286,10 @@ void FbTextEdit::connectActions(QToolBar *tool)
 
 void FbTextEdit::disconnectActions()
 {
+    m_actions.disconnect();
     foreach (QAction *action, m_actions) {
         if (FbTextAction *a = qobject_cast<FbTextAction*>(action)) {
             a->disconnectAction();
-        } else {
-            action->disconnect();
         }
     }
 }
@@ -341,6 +340,21 @@ void FbTextEdit::viewInspector(bool show)
     }
 }
 
+void FbTextEdit::hideDocks()
+{
+    if (dockTree) {
+        dockTree->deleteLater();
+        dockTree = 0;
+    }
+    if (dockImgs) {
+        dockImgs->deleteLater();
+        dockImgs = 0;
+    }
+    if (dockInsp) {
+        dockInsp->hide();
+    }
+}
+
 void FbTextEdit::treeDestroyed()
 {
     m_actions[Fb::ViewContents]->setChecked(false);

+ 1 - 0
source/fb2text.hpp

@@ -87,6 +87,7 @@ public:
     void setAction(Fb::Actions index, QAction *action);
     void connectActions(QToolBar *tool);
     void disconnectActions();
+    void hideDocks();
 
     bool BoldChecked();
     bool ItalicChecked();