瀏覽代碼

refine toolbar

Le Tan 4 年之前
父節點
當前提交
f68c3c2722

+ 14 - 12
README.md

@@ -1,7 +1,7 @@
 # vnote
-A pleasant note-taking platform.
+![CI-Windows](https://github.com/vnotex/vnote/workflows/CI-Windows/badge.svg) ![CI-Linux](https://github.com/vnotex/vnote/workflows/CI-Linux/badge.svg) ![CI-MacOS](https://github.com/vnotex/vnote/workflows/CI-MacOS/badge.svg)
 
-![CI-Windows](https://github.com/vnotex/vnote/workflows/CI-Windows/badge.svg) ![CI-Linux](https://github.com/vnotex/vnote/workflows/CI-Linux/badge.svg)
+A pleasant note-taking platform.
 
 > At early 2019, I decided to refactor VNote as VNoteX. Now a fresh VNote is ready!  
 > VNoteX is closed source and is intended to keep several premium features compared to VNote. Most of VNoteX's code base will be open source as VNote 3.0, so VNote will share most of the code base with VNoteX and continue to be open source from 3.0.  
@@ -28,22 +28,24 @@ Utilizing Qt, VNote could run on **Linux**, **Windows**, and **macOS**.
 ## Downloads
 Continuous builds on `master` branch could be found at the [Continuous Build](https://github.com/vnotex/vnote/releases/tag/continuous-build) release.
 
-Latest stable builds could be found at the [latest release](https://github.com/vnotex/vnote/releases/latest).
+Latest stable builds could be found at the [latest release](https://github.com/vnotex/vnote/releases/latest). Alternative download services are available:
+
+* [Tianyi Netdisk](https://cloud.189.cn/t/Av67NvmEJVBv)
 
 ## Supports
-- [GitHub Issues](https://github.com/vnotex/vnote/issues);
-- Email: `tamlokveer at gmail.com`;
-- [Slack](https://join.slack.com/t/vnote/shared_invite/enQtNDg2MzY0NDg3NzI4LTVhMzBlOTY0YzVhMmQyMTFmZDdhY2M3MDQxYTBjOTA2Y2IxOGRiZjg2NzdhMjkzYmUyY2VkMWJlZTNhMTQyODU);
-- [Telegram](https://t.me/vnotex);
-- WeChat Public Account: vnotex;
+* [GitHub Issues](https://github.com/vnotex/vnote/issues);
+* Email: `tamlokveer at gmail.com`;
+* [Slack](https://join.slack.com/t/vnote/shared_invite/enQtNDg2MzY0NDg3NzI4LTVhMzBlOTY0YzVhMmQyMTFmZDdhY2M3MDQxYTBjOTA2Y2IxOGRiZjg2NzdhMjkzYmUyY2VkMWJlZTNhMTQyODU);
+* [Telegram](https://t.me/vnotex);
+* WeChat Public Account: vnotex;
 
 ## Donate
 You could help VNote's development in many ways.
 
-- Keep monitoring VNote and sending feedback for improvement.
-- Spread and promote VNote to your friends. Popularity is a strong power to drive developers.
-- Participate in the development of VNote and send [Pull Request](https://github.com/vnotex/vnote/pulls) to make VNote perfect.
-- Last, really appreciate your donate to VNote if VNote does help.
+* Keep monitoring VNote and sending feedback for improvement.
+* Spread and promote VNote to your friends. Popularity is a strong power to drive developers.
+* Participate in the development of VNote and send [Pull Request](https://github.com/vnotex/vnote/pulls) to make VNote perfect.
+* Last, really appreciate your donate to VNote if VNote does help.
 
 **PayPal**: [PayPal.Me/vnotemd](https://www.paypal.me/vnotemd)
 

+ 4 - 0
src/data/core/core.qrc

@@ -7,6 +7,7 @@
         <file>icons/import_notebook.svg</file>
         <file>icons/import_notebook_of_vnote2.svg</file>
         <file>icons/new_notebook.svg</file>
+        <file>icons/notebook_menu.svg</file>
         <file>icons/new_notebook_from_folder.svg</file>
         <file>icons/discard_editor.svg</file>
         <file>icons/edit_editor.svg</file>
@@ -19,7 +20,10 @@
         <file>icons/help.svg</file>
         <file>icons/menu.svg</file>
         <file>icons/settings.svg</file>
+        <file>icons/settings_menu.svg</file>
         <file>icons/whatsthis.svg</file>
+        <file>icons/help_menu.svg</file>
+        <file>icons/import_export_menu.svg</file>
         <file>icons/native_notebook_default.svg</file>
         <file>icons/notebook_default.svg</file>
         <file>icons/file_node.svg</file>

+ 14 - 0
src/data/core/icons/help_menu.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 fill="#000000" d="M345.1,77.1C317.6,56.2,286.6,49,247.3,49c-29.8,0-55.3,6.1-75.5,19.7C142,89,128,123.1,128,177h76.8
+		c0-14.4-1.4-29.9,7-43.2c8.4-13.3,20.1-23.5,40.2-23.5c20.4,0,30.9,5.9,40.8,18.1c8.4,10.4,11.6,22.8,11.6,36
+		c0,11.4-5.8,21.9-12.7,31.4c-3.8,5.6-8.8,10.6-15.1,15.4c0,0-41.5,24.7-56.1,48.1c-10.9,17.4-14.8,39.2-15.7,65.3
+		c-0.1,1.9,0.6,5.8,7.2,5.8c6.5,0,56,0,61.8,0c5.8,0,7-4.4,7.1-6.2c0.4-9.5,1.6-24.1,3.3-29.6c3.3-10.4,9.7-19.5,19.7-27.3
+		l20.7-14.3c18.7-14.6,33.6-26.5,40.2-35.9c11.3-15.4,19.2-34.4,19.2-56.9C384,123.5,370.5,96.4,345.1,77.1z M242,370.2
+		c-25.9-0.8-47.3,17.2-48.2,45.3c-0.8,28.2,19.5,46.7,45.5,47.5c27,0.8,47.9-16.6,48.7-44.7C288.8,390.2,269,371,242,370.2z"/>
+</g>
+</svg>

+ 1 - 0
src/data/core/icons/import_export_menu.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1607931217887" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1738" width="512" height="512" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M344.352 403.072l-160.8 0 243.296 243.264 243.296-243.264-157.376 0c8.832-338.976-299.168-376.736-491.424-198.88 130.528-72.096 329.664-84.192 323.04 198.88l0 0zM937.76 66.24l-524.896 0c26.976 13.92 51.232 31.904 72.512 53.76 27.872 28.576 49.536 55.456 68.128 120.448l395.04 0 0 701.088-827.104 0 0-683.936c0 0-16.768-20.128-52.96-2.496l0 680.448c0 35.904 29.088 64.864 64.928 64.864l804.384 0c35.872 0 64.896-28.96 64.896-64.864l0-804.384c0-35.84-29.024-64.928-64.928-64.928l0 0z" p-id="1739" fill="#000000"></path></svg>

+ 8 - 0
src/data/core/icons/notebook_menu.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, 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 style="fill:#000000" d="M464,64v416H80c-17.672,0-32-14.313-32-32s14.328-32,32-32h352V0H80C44.656,0,16,28.656,16,64v384c0,35.344,28.656,64,64,64
+	h416V64H464z M80,128V96V32h320v352H80V128z M336,96H144V64h192V96z M272,160H144v-32h128V160z M208,224h-64v-32h64V224z"/>
+</svg>

+ 18 - 0
src/data/core/icons/settings_menu.svg

@@ -0,0 +1,18 @@
+<?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 style="fill:#000000" d="M450,138.3l-47.7,48.5l-2.7,2.8l-1.6,1.7c-1.1,0.8-2.4,1.2-3.9,1.2c-1.6,0-3.1-0.6-4.3-1.6l-0.9-0.9l-2.7-2.7l-41.3-42.1
+	l-2.2-2.2l-1.7-1.7c-1-1.5-1.6-3.4-1.6-5.3c0-1.7,0.6-3.2,1.6-4.4l0.7-0.8l2.6-2.6l47.9-48.7c-5.1-10.1-24.7-14.9-35.1-14.1
+	c-17.1,1.3-34.7,7-52.8,25.5c-0.7,0.8-1.5,1.6-2.2,2.3C277.5,120,272.6,156,282.6,189c0.7,1.4,1.3,3.1,1.6,4.6
+	c1.1,5.5-0.4,10.2-4,13.5l-37.9,36.4c-11.8-12-13.5-13.6-13.5-13.6c-2-2-6-3.3-9.5-1.2l-5.9,3.6c-22.7-23.1-32.3-32.4-35.4-43.6
+	c-3.2-11.7-0.3-27.3,2.7-33.1c2.5-4.6,10.3-8.9,16.9-9.4l8.6,8.8c2,2,5.1,2,7.1,0l30.9-31.4c2-2,2-5.3,0-7.3l-49.9-50.7
+	c-2-2-5.2-2-7.1,0l-30.9,31.4c-2,2-2,5.3,0,7.3l3.3,3.4c0,4.9-0.7,12.5-4.7,16.6c-6.2,6.3-18.5-1-26.5,4.7
+	c-7.9,5.6-17.9,14.6-24.3,21c-6.3,6.4-30.5,31.8-47.8,74.6c-17.3,42.8-4,82.5,5.4,92.9c5,5.5,14.1,11.1,12.5,0.7
+	c-1.6-10.5-4.2-46.9,7.7-61.8c11.9-14.9,27.6-27.1,48-28.1c19.6-1,30.9,5.7,56.3,31.5l-2.8,5.2c-1.8,3.4-0.8,7.7,1.2,9.7
+	c0,0,1.5,1.6,12.1,12.4l-97.2,93.2c-16.2,14.3-15.3,40.5-0.3,56c15.2,15.2,41.1,16.3,55.2-0.2l91.4-98.6
+	c49.1,52.3,93.3,107.4,93.3,107.4c2,2,5.2,2,7.1,0l49.9-50.7c2-2,2-5.2,0-7.3c0,0-55.2-45.7-107-96.2l35.5-38.3
+	c3.3-3.7,7.9-5.2,13.3-4.1c1.5,0.3,3.1,1,4.5,1.7c32.4,10.2,67.8,5.2,94-19.8c0.8-0.7,1.5-1.5,2.3-2.3c18.1-18.4,23.7-36.4,25-53.8
+	C464.7,163.5,460.2,143.8,450,138.3z"/>
+</svg>

+ 4 - 0
src/widgets/mainwindow.cpp

@@ -49,6 +49,10 @@ MainWindow::MainWindow(QWidget *p_parent)
 
     loadStateAndGeometry();
 
+#if defined(Q_OS_MACOS) || defined(Q_OS_MAC)
+    QApplication::setQuitOnLastWindowClosed(false);
+#endif
+
     connect(qApp, &QCoreApplication::aboutToQuit,
             this, &MainWindow::closeOnQuit);
 }

+ 0 - 2
src/widgets/markdownviewwindow.cpp

@@ -279,8 +279,6 @@ void MarkdownViewWindow::setupToolBar()
     addAction(toolBar, ViewWindowToolBarHelper::TypeImage);
     addAction(toolBar, ViewWindowToolBarHelper::TypeTable);
 
-    toolBar->addSeparator();
-
     ToolBarHelper::addSpacer(toolBar);
     addAction(toolBar, ViewWindowToolBarHelper::FindAndReplace);
     addAction(toolBar, ViewWindowToolBarHelper::Outline);

+ 0 - 66
src/widgets/notebookexplorer.cpp

@@ -77,59 +77,6 @@ TitleBar *NotebookExplorer::setupTitleBar(QWidget *p_parent)
                                  p_parent);
     titleBar->setWhatsThis(tr("This title bar contains buttons and menu to manage notebooks and notes."));
 
-    titleBar->addMenuSeparator();
-    auto newNoteAct = titleBar->addMenuAction(QStringLiteral("new_note.svg"),
-                                              tr("New N&ote"),
-                                              titleBar,
-                                              []() {
-                                                  emit VNoteX::getInst().newNoteRequested();
-                                              });
-    WidgetUtils::addActionShortcutText(newNoteAct,
-                                       ConfigMgr::getInst().getCoreConfig().getShortcut(CoreConfig::Shortcut::NewNote));
-
-    titleBar->addMenuSeparator();
-    auto newFolderAct = titleBar->addMenuAction(QStringLiteral("new_folder.svg"),
-                                                tr("New &Folder"),
-                                                titleBar,
-                                                []() {
-                                                    emit VNoteX::getInst().newFolderRequested();
-                                                });
-
-    connect(this, &NotebookExplorer::updateTitleBarMenuActions,
-            this, [=]() {
-                newFolderAct->setEnabled(m_currentNotebook);
-                newNoteAct->setEnabled(m_currentNotebook);
-            });
-
-    titleBar->addMenuSeparator();
-    titleBar->addMenuAction(QStringLiteral("new_notebook.svg"),
-                            tr("New &Notebook"),
-                            titleBar,
-                            []() {
-                                emit VNoteX::getInst().newNotebookRequested();
-                            });
-
-    titleBar->addMenuAction(QStringLiteral("new_notebook_from_folder.svg"),
-                            tr("N&ew Notebook From Folder"),
-                            titleBar,
-                            []() {
-                                emit VNoteX::getInst().newNotebookFromFolderRequested();
-                            });
-
-    titleBar->addMenuAction(QStringLiteral("import_notebook.svg"),
-                            tr("&Import Notebook"),
-                            titleBar,
-                            []() {
-                                emit VNoteX::getInst().importNotebookRequested();
-                            });
-
-    titleBar->addMenuAction(QStringLiteral("import_notebook_of_vnote2.svg"),
-                            tr("Import Legacy Notebook Of &VNote 2.0"),
-                            titleBar,
-                            []() {
-                                emit VNoteX::getInst().importLegacyNotebookRequested();
-                            });
-
     titleBar->addMenuAction(QStringLiteral("manage_notebooks.svg"),
                             tr("&Manage Notebooks"),
                             titleBar,
@@ -139,19 +86,6 @@ TitleBar *NotebookExplorer::setupTitleBar(QWidget *p_parent)
                                 dialog.exec();
                             });
 
-    titleBar->addMenuSeparator();
-    titleBar->addMenuAction(tr("Import File"),
-                            titleBar,
-                            [this]() {
-                                emit VNoteX::getInst().importFileRequested();
-                            });
-
-    titleBar->addMenuAction(tr("Import Folder"),
-                            titleBar,
-                            [this]() {
-                                emit VNoteX::getInst().importFolderRequested();
-                            });
-
     return titleBar;
 }
 

+ 0 - 2
src/widgets/textviewwindow.cpp

@@ -65,8 +65,6 @@ void TextViewWindow::setupToolBar()
 
     addAction(toolBar, ViewWindowToolBarHelper::Attachment);
 
-    toolBar->addSeparator();
-
     ToolBarHelper::addSpacer(toolBar);
     addAction(toolBar, ViewWindowToolBarHelper::FindAndReplace);
 }

+ 88 - 57
src/widgets/toolbarhelper.cpp

@@ -20,6 +20,7 @@
 #include <core/configmgr.h>
 #include <core/coreconfig.h>
 #include <core/fileopenparameters.h>
+#include "propertydefs.h"
 #include "dialogs/settings/settingsdialog.h"
 
 using namespace vnotex;
@@ -39,43 +40,18 @@ QToolBar *ToolBarHelper::setupFileToolBar(MainWindow *p_win, QToolBar *p_toolBar
         tb = createToolBar(p_win, MainWindow::tr("File"), "FileToolBar");
     }
 
-    // New.
+    // Notebook.
     {
-        const auto &coreConfig = ConfigMgr::getInst().getCoreConfig();
+        auto act = tb->addAction(generateIcon("notebook_menu.svg"), MainWindow::tr("Notebook"));
 
-        auto newBtn = WidgetsFactory::createToolButton(tb);
-        newBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+        auto toolBtn = dynamic_cast<QToolButton *>(tb->widgetForAction(act));
+        Q_ASSERT(toolBtn);
+        toolBtn->setPopupMode(QToolButton::InstantPopup);
+        toolBtn->setProperty(PropertyDefs::s_toolButtonWithoutMenuIndicator, true);
 
-        // Popup menu.
         auto newMenu = WidgetsFactory::createMenu(tb);
-        newBtn->setMenu(newMenu);
+        toolBtn->setMenu(newMenu);
 
-        // New note.
-        auto newNoteAct = newMenu->addAction(generateIcon("new_note.svg"),
-                                             MainWindow::tr("New Note"),
-                                             newMenu,
-                                             []() {
-                                                 emit VNoteX::getInst().newNoteRequested();
-                                             });
-        WidgetUtils::addActionShortcut(newNoteAct,
-                                       coreConfig.getShortcut(CoreConfig::Shortcut::NewNote));
-        newBtn->setDefaultAction(newNoteAct);
-        // To hide the shortcut text shown in button.
-        newBtn->setText(MainWindow::tr("New Note"));
-
-        newMenu->addSeparator();
-
-        // New folder.
-        newMenu->addAction(generateIcon("new_folder.svg"),
-                           MainWindow::tr("New Folder"),
-                           newMenu,
-                           []() {
-                               emit VNoteX::getInst().newFolderRequested();
-                           });
-
-        newMenu->addSeparator();
-
-        // New notebook.
         newMenu->addAction(generateIcon("new_notebook.svg"),
                            MainWindow::tr("New Notebook"),
                            newMenu,
@@ -91,6 +67,8 @@ QToolBar *ToolBarHelper::setupFileToolBar(MainWindow *p_win, QToolBar *p_toolBar
                                emit VNoteX::getInst().newNotebookFromFolderRequested();
                            });
 
+        newMenu->addSeparator();
+
         // Import notebook.
         newMenu->addAction(generateIcon("import_notebook.svg"),
                            MainWindow::tr("Import Notebook"),
@@ -106,21 +84,38 @@ QToolBar *ToolBarHelper::setupFileToolBar(MainWindow *p_win, QToolBar *p_toolBar
                            []() {
                                emit VNoteX::getInst().importLegacyNotebookRequested();
                            });
+    }
 
-        newMenu->addSeparator();
+    // New Note.
+    {
+        const auto &coreConfig = ConfigMgr::getInst().getCoreConfig();
 
-        // Import file.
-        newMenu->addAction(MainWindow::tr("Import File"),
-                           newMenu,
-                           []() {
-                               emit VNoteX::getInst().importFileRequested();
-                           });
+        auto newBtn = WidgetsFactory::createToolButton(tb);
+        newBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
 
-        // Import folder.
-        newMenu->addAction(MainWindow::tr("Import Folder"),
+        // Popup menu.
+        auto newMenu = WidgetsFactory::createMenu(tb);
+        newBtn->setMenu(newMenu);
+
+        // New note.
+        auto newNoteAct = newMenu->addAction(generateIcon("new_note.svg"),
+                                             MainWindow::tr("New Note"),
+                                             newMenu,
+                                             []() {
+                                                 emit VNoteX::getInst().newNoteRequested();
+                                             });
+        WidgetUtils::addActionShortcut(newNoteAct,
+                                       coreConfig.getShortcut(CoreConfig::Shortcut::NewNote));
+        newBtn->setDefaultAction(newNoteAct);
+        // To hide the shortcut text shown in button.
+        newBtn->setText(MainWindow::tr("New Note"));
+
+        // New folder.
+        newMenu->addAction(generateIcon("new_folder.svg"),
+                           MainWindow::tr("New Folder"),
                            newMenu,
                            []() {
-                               emit VNoteX::getInst().importFolderRequested();
+                               emit VNoteX::getInst().newFolderRequested();
                            });
 
         newMenu->addSeparator();
@@ -147,6 +142,33 @@ QToolBar *ToolBarHelper::setupFileToolBar(MainWindow *p_win, QToolBar *p_toolBar
         tb->addWidget(newBtn);
     }
 
+    // Import and export.
+    {
+        auto act = tb->addAction(generateIcon("import_export_menu.svg"), MainWindow::tr("Import And Export"));
+
+        auto btn = dynamic_cast<QToolButton *>(tb->widgetForAction(act));
+        Q_ASSERT(btn);
+        btn->setPopupMode(QToolButton::InstantPopup);
+        btn->setProperty(PropertyDefs::s_toolButtonWithoutMenuIndicator, true);
+
+        auto newMenu = WidgetsFactory::createMenu(tb);
+        btn->setMenu(newMenu);
+
+        // Import file.
+        newMenu->addAction(MainWindow::tr("Import File"),
+                           newMenu,
+                           []() {
+                               emit VNoteX::getInst().importFileRequested();
+                           });
+
+        // Import folder.
+        newMenu->addAction(MainWindow::tr("Import Folder"),
+                           newMenu,
+                           []() {
+                               emit VNoteX::getInst().importFolderRequested();
+                           });
+    }
+
     return tb;
 }
 
@@ -176,9 +198,11 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
 
         auto btn = WidgetsFactory::createToolButton(tb);
 
-        auto expandAct = new QAction(generateIcon("expand.svg"),
-                                     MainWindow::tr("Expand Content Area"),
-                                     btn);
+        auto menu = WidgetsFactory::createMenu(tb);
+        btn->setMenu(menu);
+
+        auto expandAct = menu->addAction(generateIcon("expand.svg"),
+                                         MainWindow::tr("Expand Content Area"));
         WidgetUtils::addActionShortcut(expandAct,
                                        coreConfig.getShortcut(CoreConfig::Shortcut::ExpandContentArea));
         expandAct->setCheckable(true);
@@ -190,9 +214,6 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
                             });
         btn->setDefaultAction(expandAct);
 
-        auto menu = WidgetsFactory::createMenu(tb);
-        btn->setMenu(menu);
-
         auto fullScreenAct = new FullScreenToggleAction(p_win,
                                                         generateIcon("fullscreen.svg"),
                                                         menu);
@@ -221,7 +242,11 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
     {
         const auto &coreConfig = ConfigMgr::getInst().getCoreConfig();
 
-        auto btn = WidgetsFactory::createToolButton(tb);
+        auto act = tb->addAction(generateIcon("settings_menu.svg"), MainWindow::tr("Settings"));
+        auto btn = dynamic_cast<QToolButton *>(tb->widgetForAction(act));
+        Q_ASSERT(btn);
+        btn->setPopupMode(QToolButton::InstantPopup);
+        btn->setProperty(PropertyDefs::s_toolButtonWithoutMenuIndicator, true);
 
         auto menu = WidgetsFactory::createMenu(tb);
         btn->setMenu(menu);
@@ -235,7 +260,6 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
                                            });
         WidgetUtils::addActionShortcut(settingsAct,
                                        coreConfig.getShortcut(CoreConfig::Shortcut::Settings));
-        btn->setDefaultAction(settingsAct);
 
         menu->addSeparator();
 
@@ -279,13 +303,15 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
                         [p_win]() {
                             p_win->resetStateAndGeometry();
                         });
-
-        tb->addWidget(btn);
     }
 
-    // WhatsThis.
+    // Help.
     {
-        auto btn = WidgetsFactory::createToolButton(tb);
+        auto act = tb->addAction(generateIcon("help_menu.svg"), MainWindow::tr("Help"));
+        auto btn = dynamic_cast<QToolButton *>(tb->widgetForAction(act));
+        Q_ASSERT(btn);
+        btn->setPopupMode(QToolButton::InstantPopup);
+        btn->setProperty(PropertyDefs::s_toolButtonWithoutMenuIndicator, true);
 
         auto menu = WidgetsFactory::createMenu(tb);
         btn->setMenu(menu);
@@ -297,7 +323,6 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
                                                 QWhatsThis::enterWhatsThisMode();
                                             });
         whatsThisAct->setToolTip(MainWindow::tr("Enter WhatsThis mode and click somewhere to show help information"));
-        btn->setDefaultAction(whatsThisAct);
 
         menu->addSeparator();
 
@@ -327,6 +352,14 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
 
         menu->addSeparator();
 
+        menu->addAction(MainWindow::tr("Feedback And Discussions"),
+                        menu,
+                        []() {
+                            WidgetUtils::openUrlByDesktop(QUrl("https://github.com/vnotex/vnote/discussions"));
+                        });
+
+        menu->addSeparator();
+
         menu->addAction(MainWindow::tr("About"),
                         menu,
                         [p_win]() {
@@ -340,8 +373,6 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too
         aboutQtAct->setMenuRole(QAction::AboutQtRole);
         MainWindow::connect(aboutQtAct, &QAction::triggered,
                             qApp, &QApplication::aboutQt);
-
-        tb->addWidget(btn);
     }
 
     return tb;