Browse Source

add Edit to context menu in read mode to edit current note

Le Tan 8 years ago
parent
commit
022d3ae2f7
5 changed files with 83 additions and 9 deletions
  1. 4 2
      src/src.pro
  2. 7 3
      src/vedittab.cpp
  3. 6 4
      src/vedittab.h
  4. 39 0
      src/vwebview.cpp
  5. 27 0
      src/vwebview.h

+ 4 - 2
src/src.pro

@@ -59,7 +59,8 @@ SOURCES += main.cpp\
     vcaptain.cpp \
     vopenedlistmenu.cpp \
     vorphanfile.cpp \
-    vcodeblockhighlighthelper.cpp
+    vcodeblockhighlighthelper.cpp \
+    vwebview.cpp
 
 HEADERS  += vmainwindow.h \
     vdirectorytree.h \
@@ -105,7 +106,8 @@ HEADERS  += vmainwindow.h \
     vopenedlistmenu.h \
     vnavigationmode.h \
     vorphanfile.h \
-    vcodeblockhighlighthelper.h
+    vcodeblockhighlighthelper.h \
+    vwebview.h
 
 RESOURCES += \
     vnote.qrc \

+ 7 - 3
src/vedittab.cpp

@@ -1,6 +1,5 @@
 #include <QtWidgets>
 #include <QWebChannel>
-#include <QWebEngineView>
 #include <QFileInfo>
 #include <QXmlStreamReader>
 #include "vedittab.h"
@@ -18,11 +17,13 @@
 #include "dialog/vfindreplacedialog.h"
 #include "veditarea.h"
 #include "vconstants.h"
+#include "vwebview.h"
 
 extern VConfigManager vconfig;
 
 VEditTab::VEditTab(VFile *p_file, OpenFileMode p_mode, QWidget *p_parent)
-    : QStackedWidget(p_parent), m_file(p_file), isEditMode(false), document(p_file, this),
+    : QStackedWidget(p_parent), m_file(p_file), isEditMode(false),
+      webPreviewer(NULL), document(p_file, this),
       mdConverterType(vconfig.getMdConverterType()), m_fileModified(false),
       m_editArea(NULL)
 {
@@ -273,7 +274,10 @@ void VEditTab::setupMarkdownPreview()
     const QString jsHolder("JS_PLACE_HOLDER");
     const QString extraHolder("<!-- EXTRA_PLACE_HOLDER -->");
 
-    webPreviewer = new QWebEngineView(this);
+    webPreviewer = new VWebView(m_file, this);
+    connect(webPreviewer, &VWebView::editNote,
+            this, &VEditTab::editFile);
+
     VPreviewPage *page = new VPreviewPage(this);
     webPreviewer->setPage(page);
     webPreviewer->setZoomFactor(vconfig.getWebZoomFactor());

+ 6 - 4
src/vedittab.h

@@ -12,7 +12,7 @@
 #include "vtoc.h"
 #include "vfile.h"
 
-class QWebEngineView;
+class VWebView;
 class VNote;
 class QXmlStreamReader;
 class VEditArea;
@@ -25,8 +25,6 @@ public:
     ~VEditTab();
     void init(VEditArea *p_editArea);
     bool closeFile(bool p_forced);
-    // Enter edit mode
-    void editFile();
     // Enter read mode
     void readFile();
     // Save file
@@ -51,6 +49,10 @@ public:
     QString getSelectedText() const;
     void clearSearchedWordHighlight();
 
+public slots:
+    // Enter edit mode
+    void editFile();
+
 protected:
     void wheelEvent(QWheelEvent *p_event) Q_DECL_OVERRIDE;
 
@@ -91,7 +93,7 @@ private:
     QPointer<VFile> m_file;
     bool isEditMode;
     VEdit *m_textEditor;
-    QWebEngineView *webPreviewer;
+    VWebView *webPreviewer;
     VDocument document;
     MarkdownConverterType mdConverterType;
     VToc tableOfContent;

+ 39 - 0
src/vwebview.cpp

@@ -0,0 +1,39 @@
+#include "vwebview.h"
+
+#include <QMenu>
+#include <QPoint>
+#include <QContextMenuEvent>
+#include <QWebEnginePage>
+#include <QAction>
+#include <QList>
+#include "vfile.h"
+
+VWebView::VWebView(VFile *p_file, QWidget *p_parent)
+    : QWebEngineView(p_parent), m_file(p_file)
+{
+}
+
+void VWebView::contextMenuEvent(QContextMenuEvent *p_event)
+{
+    QMenu *menu = page()->createStandardContextMenu();
+    menu->setToolTipsVisible(true);
+    const QList<QAction *> actions = menu->actions();
+
+    QAction *editAction = new QAction(QIcon(":/resources/icons/edit_note.svg"),
+                                     tr("&Edit"), this);
+    editAction->setToolTip(tr("Edit current note"));
+    connect(editAction, &QAction::triggered,
+            this, &VWebView::handleEditAction);
+    if (!m_file->isModifiable()) {
+        editAction->setEnabled(false);
+    }
+    menu->insertAction(actions.isEmpty() ? NULL : actions[0], editAction);
+
+    connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater);
+    menu->popup(p_event->globalPos());
+}
+
+void VWebView::handleEditAction()
+{
+    emit editNote();
+}

+ 27 - 0
src/vwebview.h

@@ -0,0 +1,27 @@
+#ifndef VWEBVIEW_H
+#define VWEBVIEW_H
+
+#include <QWebEngineView>
+
+class VFile;
+
+class VWebView : public QWebEngineView
+{
+    Q_OBJECT
+public:
+    explicit VWebView(VFile *p_file, QWidget *p_parent = Q_NULLPTR);
+
+signals:
+    void editNote();
+
+protected:
+    void contextMenuEvent(QContextMenuEvent *p_event);
+
+private slots:
+    void handleEditAction();
+
+private:
+    VFile *m_file;
+};
+
+#endif // VWEBVIEW_H