Explorar o código

update a more friendly toolbar

Signed-off-by: Le Tan <[email protected]>
Le Tan %!s(int64=9) %!d(string=hai) anos
pai
achega
ec7850685e

+ 10 - 0
src/resources/icons/create_note_tb.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<path d="M399.3,168.9c-0.7-2.9-2-5-3.5-6.8l-83.7-91.7c-1.9-2.1-4.1-3.1-6.6-4.4c-2.9-1.5-6.1-1.6-9.4-1.6H136.2
+	c-12.4,0-23.7,9.6-23.7,22.9v335.2c0,13.4,11.3,25.9,23.7,25.9h243.1c12.4,0,21.2-12.5,21.2-25.9V178.4
+	C400.5,174.8,400.1,172.2,399.3,168.9z M305.5,111l58,63.5h-58V111z M144.5,416.5v-320h129v81.7c0,14.8,13.4,28.3,28.1,28.3h66.9
+	v210H144.5z"/>
+</svg>

+ 9 - 0
src/resources/icons/discard_exit.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
+<path d="M215.469,332.802l29.863,29.864L352,256L245.332,149.333l-29.863,29.865l55.469,55.469H64v42.666h205.864L215.469,332.802z
+	 M405.334,64H106.666C83.198,64,64,83.198,64,106.666V192h42.666v-85.333h298.668v298.668H106.666V320H64v85.334
+	C64,428.802,83.198,448,106.666,448h298.668C428.802,448,448,428.802,448,405.334V106.666C448,83.198,428.802,64,405.334,64z"/>
+</svg>

+ 14 - 0
src/resources/icons/edit_note.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+	<path d="M442.8,99.6l-30.4-30.4c-7-6.9-18.2-6.9-25.1,0L355.5,101l55.5,55.5l31.8-31.7C449.7,117.7,449.7,106.5,442.8,99.6z"/>
+	<g>
+		<polygon points="346.1,110.5 174.1,288 160,352 224,337.9 400.6,164.9 		"/>
+	</g>
+	<path d="M384,256v150c0,5.1-3.9,10.1-9.2,10.1s-269-0.1-269-0.1c-5.6,0-9.8-5.4-9.8-10s0-268,0-268c0-5,4.7-10,10.6-10H256l32-32
+		H87.4c-13,0-23.4,10.3-23.4,23.3v305.3c0,12.9,10.5,23.4,23.4,23.4h305.3c12.9,0,23.3-10.5,23.3-23.4V224L384,256z"/>
+</g>
+</svg>

+ 10 - 0
src/resources/icons/save_exit.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<path d="M461.6,109.6l-54.9-43.3c-1.7-1.4-3.8-2.4-6.2-2.4c-2.4,0-4.6,1-6.3,2.5L194.5,323c0,0-78.5-75.5-80.7-77.7
+	c-2.2-2.2-5.1-5.9-9.5-5.9c-4.4,0-6.4,3.1-8.7,5.4c-1.7,1.8-29.7,31.2-43.5,45.8c-0.8,0.9-1.3,1.4-2,2.1c-1.2,1.7-2,3.6-2,5.7
+	c0,2.2,0.8,4,2,5.7l2.8,2.6c0,0,139.3,133.8,141.6,136.1c2.3,2.3,5.1,5.2,9.2,5.2c4,0,7.3-4.3,9.2-6.2L462,121.8
+	c1.2-1.7,2-3.6,2-5.8C464,113.5,463,111.4,461.6,109.6z"/>
+</svg>

+ 12 - 0
src/resources/icons/save_note.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="512px" height="512px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
+<g>
+	<polygon points="256,307.7 384,192 304,192 304,96 207.6,96 207.6,192 128,192 	"/>
+	<path d="M465.4,297.2l-71.4-55h-42l62,61.8h-50.6c-2.3,0-4.3,1.2-5.4,2.9l-18.4,45.5H172.1l-18.4-45.5c-1-1.8-3.1-2.9-5.4-2.9H97.8
+		l62.2-61.8h-42.2l-71.4,55c-10.6,6.2-15.8,19-14.1,31.6l8.7,66.9c2.3,13.1,9.7,20.3,28.1,20.3h373.8c19.1,0,25.8-7.6,28.1-20.3
+		l8.7-66.9C481.4,315.9,476,303.4,465.4,297.2z"/>
+</g>
+</svg>

+ 14 - 1
src/veditor.h

@@ -8,9 +8,9 @@
 #include "vdocument.h"
 #include "vmarkdownconverter.h"
 #include "vconfigmanager.h"
+#include "vedit.h"
 
 class QTextBrowser;
-class VEdit;
 class QWebEngineView;
 class VNote;
 
@@ -27,6 +27,9 @@ public:
     // Save file
     bool saveFile();
 
+    inline bool getIsEditMode() const;
+    inline bool isModified() const;
+
 private:
     bool isMarkdown(const QString &name);
     void setupUI();
@@ -44,4 +47,14 @@ private:
     MarkdownConverterType mdConverterType;
 };
 
+inline bool VEditor::getIsEditMode() const
+{
+    return isEditMode;
+}
+
+inline bool VEditor::isModified() const
+{
+    return textEditor->isModified();
+}
+
 #endif // VEDITOR_H

+ 62 - 8
src/vmainwindow.cpp

@@ -1,4 +1,5 @@
 #include <QtWidgets>
+#include <QList>
 #include "vmainwindow.h"
 #include "vdirectorytree.h"
 #include "vnote.h"
@@ -81,16 +82,23 @@ void VMainWindow::setupUI()
     // Editor tab widget
     tabs = new VTabWidget(vnote);
     tabs->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    tabs->setTabBarAutoHide(true);
 
     // Main Splitter
     mainSplitter = new QSplitter();
     mainSplitter->addWidget(nbContainer);
     mainSplitter->addWidget(fileList);
     mainSplitter->addWidget(tabs);
+    QList<int> sizes;
+    int sa = nbContainer->minimumSizeHint().width();
+    int sb = fileList->minimumSizeHint().width();
+    int sc = qMax(mainSplitter->sizeHint().width() - sa - sb, sa + sb);
+    sizes.append(sa);
+    sizes.append(sb);
+    sizes.append(sc);
+    mainSplitter->setSizes(sizes);
     mainSplitter->setStretchFactor(0, 1);
     mainSplitter->setStretchFactor(1, 1);
-    mainSplitter->setStretchFactor(2, 10);
+    mainSplitter->setStretchFactor(2, 200);
 
     // Signals
     connect(notebookComboBox, SIGNAL(currentIndexChanged(int)), this,
@@ -111,6 +119,8 @@ void VMainWindow::setupUI()
             tabs, &VTabWidget::openFile);
     connect(vnote, &VNote::notebooksRenamed,
             tabs, &VTabWidget::handleNotebookRenamed);
+    connect(tabs, &VTabWidget::tabModeChanged,
+            this, &VMainWindow::updateToolbarFromTabChage);
 
     connect(newNotebookBtn, &QPushButton::clicked,
             this, &VMainWindow::onNewNotebookBtnClicked);
@@ -146,17 +156,32 @@ void VMainWindow::setupUI()
 
 void VMainWindow::initActions()
 {
-    editNoteAct = new QAction(tr("&Edit"), this);
+    newNoteAct = new QAction(QIcon(":/resources/icons/create_note_tb.svg"),
+                             tr("&New note"), this);
+    newNoteAct->setStatusTip(tr("Create a new note"));
+    connect(newNoteAct, &QAction::triggered,
+            fileList, &VFileList::newFile);
+
+    editNoteAct = new QAction(QIcon(":/resources/icons/edit_note.svg"),
+                              tr("&Edit"), this);
     editNoteAct->setStatusTip(tr("Edit current note"));
     connect(editNoteAct, &QAction::triggered,
             tabs, &VTabWidget::editFile);
 
-    readNoteAct = new QAction(tr("&Read"), this);
-    readNoteAct->setStatusTip(tr("Open current note in read mode"));
-    connect(readNoteAct, &QAction::triggered,
+    discardExitAct = new QAction(QIcon(":/resources/icons/discard_exit.svg"),
+                                 tr("Discard changes and exit"), this);
+    discardExitAct->setStatusTip(tr("Discard changes and exit edit mode"));
+    connect(discardExitAct, &QAction::triggered,
             tabs, &VTabWidget::readFile);
 
-    saveNoteAct = new QAction(tr("&Save"), this);
+    saveExitAct = new QAction(QIcon(":/resources/icons/save_exit.svg"),
+                              tr("Save changes and exit"), this);
+    saveExitAct->setStatusTip(tr("Save changes and exit edit mode"));
+    connect(saveExitAct, &QAction::triggered,
+            tabs, &VTabWidget::saveAndReadFile);
+
+    saveNoteAct = new QAction(QIcon(":/resources/icons/save_note.svg"),
+                              tr("&Save"), this);
     saveNoteAct->setStatusTip(tr("Save current note"));
     saveNoteAct->setShortcut(QKeySequence::Save);
     connect(saveNoteAct, &QAction::triggered,
@@ -223,9 +248,16 @@ void VMainWindow::initToolBar()
 {
     QToolBar *fileToolBar = addToolBar(tr("Note"));
     fileToolBar->setMovable(false);
+    fileToolBar->addAction(newNoteAct);
     fileToolBar->addAction(editNoteAct);
-    fileToolBar->addAction(readNoteAct);
+    fileToolBar->addAction(saveExitAct);
+    fileToolBar->addAction(discardExitAct);
     fileToolBar->addAction(saveNoteAct);
+
+    editNoteAct->setVisible(false);
+    saveExitAct->setVisible(false);
+    discardExitAct->setVisible(false);
+    saveNoteAct->setVisible(false);
 }
 
 void VMainWindow::initMenuBar()
@@ -588,3 +620,25 @@ void VMainWindow::setRenderBackgroundColor(QAction *action)
     vconfig.setCurRenderBackgroundColor(action->data().toString());
     vnote->updateTemplate();
 }
+
+void VMainWindow::updateToolbarFromTabChage(const QString &notebook, const QString &relativePath,
+                                            bool editMode, bool modifiable)
+{
+    if (notebook.isEmpty() || !modifiable) {
+        editNoteAct->setVisible(false);
+        saveExitAct->setVisible(false);
+        discardExitAct->setVisible(false);
+        saveNoteAct->setVisible(false);
+        return;
+    } else if (editMode) {
+        editNoteAct->setVisible(false);
+        saveExitAct->setVisible(true);
+        discardExitAct->setVisible(true);
+        saveNoteAct->setVisible(true);
+    } else {
+        editNoteAct->setVisible(true);
+        saveExitAct->setVisible(false);
+        discardExitAct->setVisible(false);
+        saveNoteAct->setVisible(false);
+    }
+}

+ 5 - 1
src/vmainwindow.h

@@ -44,6 +44,8 @@ private slots:
     void setTabStopWidth(QAction *action);
     void setEditorBackgroundColor(QAction *action);
     void setRenderBackgroundColor(QAction *action);
+    void updateToolbarFromTabChage(const QString &notebook, const QString &relativePath,
+                                   bool editMode, bool modifiable);
 
 signals:
     void curNotebookChanged(const QString &notebookName);
@@ -77,9 +79,11 @@ private:
     VNote *vnote;
 
     // Actions
+    QAction *newNoteAct;
     QAction *editNoteAct;
     QAction *saveNoteAct;
-    QAction *readNoteAct;
+    QAction *saveExitAct;
+    QAction *discardExitAct;
     QAction *importNoteAct;
     QActionGroup *converterAct;
     QAction *markedAct;

+ 5 - 0
src/vnote.qrc

@@ -45,5 +45,10 @@
         <file>resources/icons/create_note.png</file>
         <file>resources/icons/delete_note.png</file>
         <file>resources/icons/note_info.png</file>
+        <file>resources/icons/create_note_tb.svg</file>
+        <file>resources/icons/save_note.svg</file>
+        <file>resources/icons/edit_note.svg</file>
+        <file>resources/icons/save_exit.svg</file>
+        <file>resources/icons/discard_exit.svg</file>
     </qresource>
 </RCC>

+ 38 - 3
src/vtabwidget.cpp

@@ -12,10 +12,10 @@ VTabWidget::VTabWidget(VNote *vnote, QWidget *parent)
 {
     setTabsClosable(true);
     setMovable(true);
-    connect(tabBar(), &QTabBar::tabCloseRequested,
+    connect(this, &VTabWidget::tabCloseRequested,
             this, &VTabWidget::handleTabCloseRequest);
-
-    openWelcomePage();
+    connect(this, &VTabWidget::currentChanged,
+            this, &VTabWidget::onCurrentChanged);
 }
 
 void VTabWidget::openWelcomePage()
@@ -33,6 +33,8 @@ int VTabWidget::insertTabWithData(int index, QWidget *page,
     QTabBar *tabs = tabBar();
     tabs->setTabData(idx, tabData);
 
+    // Need to update again with tabData
+    onCurrentChanged(idx);
     return idx;
 }
 
@@ -112,6 +114,7 @@ int VTabWidget::openFileInTab(const QString &notebook, const QString &relativePa
     QJsonObject tabJson;
     tabJson["notebook"] = notebook;
     tabJson["relative_path"] = relativePath;
+    tabJson["modifiable"] = modifiable;
     return appendTabWithData(editor, tabJson);
 }
 
@@ -146,6 +149,14 @@ void VTabWidget::readFile()
     VEditor *editor = dynamic_cast<VEditor *>(currentWidget());
     Q_ASSERT(editor);
     editor->readFile();
+    onCurrentChanged(currentIndex());
+}
+
+void VTabWidget::saveAndReadFile()
+{
+    saveFile();
+    readFile();
+    onCurrentChanged(currentIndex());
 }
 
 void VTabWidget::editFile()
@@ -153,6 +164,7 @@ void VTabWidget::editFile()
     VEditor *editor = dynamic_cast<VEditor *>(currentWidget());
     Q_ASSERT(editor);
     editor->editFile();
+    onCurrentChanged(currentIndex());
 }
 
 void VTabWidget::saveFile()
@@ -175,3 +187,26 @@ void VTabWidget::handleNotebookRenamed(const QVector<VNotebook> &notebooks,
         }
     }
 }
+
+void VTabWidget::onCurrentChanged(int index)
+{
+    if (index == -1) {
+        emit tabModeChanged("", "", false, false);
+        return;
+    }
+
+    QJsonObject tabJson = tabBar()->tabData(index).toJsonObject();
+    if (tabJson.isEmpty()) {
+        // Maybe the tab data has not been set yet
+        return;
+    }
+
+    QString notebook = tabJson["notebook"].toString();
+    QString relativePath = tabJson["relative_path"].toString();
+    VEditor *editor = (VEditor *)widget(index);
+    bool editMode = editor->getIsEditMode();
+    bool modifiable = tabJson["modifiable"].toBool();
+
+    emit tabModeChanged(notebook, relativePath,
+                        editMode, modifiable);
+}

+ 4 - 0
src/vtabwidget.h

@@ -17,6 +17,8 @@ public:
     explicit VTabWidget(VNote *vnote, QWidget *parent = 0);
 
 signals:
+    void tabModeChanged(const QString &notebook, const QString &relativePath,
+                        bool editMode, bool modifiable);
 
 public slots:
     void openFile(QJsonObject fileJson);
@@ -25,11 +27,13 @@ public slots:
     void editFile();
     void saveFile();
     void readFile();
+    void saveAndReadFile();
     void handleNotebookRenamed(const QVector<VNotebook> &notebooks, const QString &oldName,
                                const QString &newName);
 
 private slots:
     void handleTabCloseRequest(int index);
+    void onCurrentChanged(int index);
 
 private:
     void openWelcomePage();