Ver Fonte

refine Quick Access

Le Tan há 4 anos atrás
pai
commit
0b624eeefd

+ 15 - 1
src/core/sessionconfig.cpp

@@ -396,7 +396,21 @@ const QStringList &SessionConfig::getQuickAccessFiles() const
 
 void SessionConfig::setQuickAccessFiles(const QStringList &p_files)
 {
-    updateConfig(m_quickAccessFiles, p_files, this);
+    QStringList files;
+    for (const auto &file : p_files) {
+        auto fi = file.trimmed();
+        if (!fi.isEmpty()) {
+            files << fi;
+        }
+    }
+    updateConfig(m_quickAccessFiles, files, this);
+}
+
+void SessionConfig::removeQuickAccessFile(const QString &p_file)
+{
+    if (m_quickAccessFiles.removeOne(p_file)) {
+        update();
+    }
 }
 
 void SessionConfig::loadExternalPrograms(const QJsonObject &p_session)

+ 2 - 0
src/core/sessionconfig.h

@@ -128,6 +128,8 @@ namespace vnotex
         const QStringList &getQuickAccessFiles() const;
         void setQuickAccessFiles(const QStringList &p_files);
 
+        void removeQuickAccessFile(const QString &p_file);
+
         const QVector<ExternalProgram> &getExternalPrograms() const;
 
         const QVector<HistoryItem> &getHistory() const;

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

@@ -76,6 +76,7 @@
         <file>icons/maximize.svg</file>
         <file>icons/maximize_restore.svg</file>
         <file>icons/close.svg</file>
+        <file>icons/delete.svg</file>
         <file>icons/stay_on_top.svg</file>
         <file>icons/outline_editor.svg</file>
         <file>icons/find_replace_editor.svg</file>

+ 1 - 0
src/data/core/icons/delete.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="1604798605911" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="19441" width="512" height="512" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M517.08411984 479.11475483L301.90637831 263.93753776a26.85237631 26.85237631 0 1 0-37.98667221 37.95153335l215.17669262 215.19504873L263.91970607 732.27864411a26.85237631 26.85237631 0 1 0 37.96936504 37.96884057l215.19504878-215.17669264 215.19504866 215.17669264a26.85237631 26.85237631 0 1 0 37.9688406-37.95100889l-215.17669262-215.2123559 215.17669262-215.1772171a26.85237631 26.85237631 0 1 0-37.9688406-37.96936505L517.10195147 479.11475483z" p-id="19442" fill="#000000"></path></svg>

+ 17 - 0
src/data/extra/themes/moonlight/interface.qss

@@ -329,6 +329,23 @@ QMenu::indicator:exclusive:unchecked {
 QMenu::indicator:exclusive:checked {
     image: url(menu_radiobutton.svg);
 }
+
+/* QWidgetAction item */
+vnotex--LabelWithButtonsWidget {
+    background-color: @widgets#qmenu#bg;
+}
+
+vnotex--LabelWithButtonsWidget:hover {
+    background-color: @widgets#qmenu#item#selected#bg;
+}
+
+vnotex--LabelWithButtonsWidget QLabel {
+    color: @widgets#qmenu#fg;
+}
+
+vnotex--LabelWithButtonsWidget QLabel:hover {
+    color: @widgets#qmenu#item#selected#fg;
+}
 /* End QMenu */
 
 QDialog {

+ 17 - 0
src/data/extra/themes/pure/interface.qss

@@ -329,6 +329,23 @@ QMenu::indicator:exclusive:unchecked {
 QMenu::indicator:exclusive:checked {
     image: url(menu_radiobutton.svg);
 }
+
+/* QWidgetAction item */
+vnotex--LabelWithButtonsWidget {
+    background-color: @widgets#qmenu#bg;
+}
+
+vnotex--LabelWithButtonsWidget:hover {
+    background-color: @widgets#qmenu#item#selected#bg;
+}
+
+vnotex--LabelWithButtonsWidget QLabel {
+    color: @widgets#qmenu#fg;
+}
+
+vnotex--LabelWithButtonsWidget QLabel:hover {
+    color: @widgets#qmenu#item#selected#fg;
+}
 /* End QMenu */
 
 QDialog {

+ 82 - 0
src/widgets/labelwithbuttonswidget.cpp

@@ -0,0 +1,82 @@
+#include "labelwithbuttonswidget.h"
+
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QStyleOption>
+#include <QPainter>
+#include <QDebug>
+#include <QStyle>
+#include <QToolButton>
+#include <QAction>
+
+#include <core/vnotex.h>
+#include <utils/iconutils.h>
+
+using namespace vnotex;
+
+LabelWithButtonsWidget::LabelWithButtonsWidget(const QString &p_label, Buttons p_buttons, QWidget *p_parent)
+    : QWidget(p_parent)
+{
+    setupUI(p_buttons);
+
+    setLabel(p_label);
+}
+
+void LabelWithButtonsWidget::setupUI(Buttons p_buttons)
+{
+    auto mainLayout = new QHBoxLayout(this);
+
+    m_label = new QLabel(this);
+    mainLayout->addWidget(m_label);
+
+    if (p_buttons & Button::Delete) {
+        auto btn = createButton(Button::Delete, this);
+        mainLayout->addWidget(btn);
+    }
+}
+
+void LabelWithButtonsWidget::setLabel(const QString &p_label)
+{
+    m_label->setText(p_label);
+}
+
+void LabelWithButtonsWidget::paintEvent(QPaintEvent *p_event)
+{
+    Q_UNUSED(p_event);
+
+    QStyleOption opt;
+    opt.init(this);
+    QPainter p(this);
+    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+}
+
+QToolButton *LabelWithButtonsWidget::createButton(Button p_button, QWidget *p_parent)
+{
+    auto btn = new QToolButton(p_parent);
+    QAction *act = nullptr;
+    switch (p_button) {
+    case Button::Delete:
+        act = new QAction(generateIcon(QStringLiteral("delete.svg")), tr("Delete"), p_parent);
+        break;
+
+    default:
+        Q_ASSERT(false);
+        break;
+    }
+
+    if (act) {
+        act->setData(static_cast<int>(p_button));
+        btn->setDefaultAction(act);
+        connect(btn, &QToolButton::triggered,
+                this, [this](QAction *p_act) {
+                    emit triggered(static_cast<Button>(p_act->data().toInt()));
+                });
+    }
+    return btn;
+}
+
+QIcon LabelWithButtonsWidget::generateIcon(const QString &p_name) const
+{
+    auto iconFile = VNoteX::getInst().getThemeMgr().getIconFile(p_name);
+    return IconUtils::fetchIcon(iconFile);
+}

+ 47 - 0
src/widgets/labelwithbuttonswidget.h

@@ -0,0 +1,47 @@
+#ifndef LABELWITHBUTTONSWIDGET_H
+#define LABELWITHBUTTONSWIDGET_H
+
+#include <QWidget>
+
+class QLabel;
+class QToolButton;
+
+namespace vnotex
+{
+    class LabelWithButtonsWidget : public QWidget
+    {
+        Q_OBJECT
+    public:
+        enum Button
+        {
+            NoButton,
+            Delete
+        };
+        Q_DECLARE_FLAGS(Buttons, Button);
+
+        LabelWithButtonsWidget(const QString &p_label,
+                               Buttons p_buttons = Button::NoButton,
+                               QWidget *p_parent = nullptr);
+
+        void setLabel(const QString &p_label);
+
+    signals:
+        void triggered(Button p_button);
+
+    protected:
+        void paintEvent(QPaintEvent *p_event) Q_DECL_OVERRIDE;
+
+    private:
+        void setupUI(Buttons p_buttons);
+
+        QToolButton *createButton(Button p_button, QWidget *p_parent);
+
+        QIcon generateIcon(const QString &p_name) const;
+
+        QLabel *m_label = nullptr;
+    };
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(vnotex::LabelWithButtonsWidget::Buttons)
+
+#endif // LABELWITHBUTTONSWIDGET_H

+ 5 - 5
src/widgets/mainwindow.cpp

@@ -54,13 +54,13 @@
 #include <core/thememgr.h>
 #include "dialogs/updater.h"
 #include "tagexplorer.h"
+#include "toolbarhelper.h"
+#include "statusbarhelper.h"
 
 using namespace vnotex;
 
 MainWindow::MainWindow(QWidget *p_parent)
     : FramelessMainWindowImpl(!ConfigMgr::getInst().getSessionConfig().getSystemTitleBarEnabled(), p_parent),
-      m_toolBarHelper(this),
-      m_statusBarHelper(this),
       m_dockWidgetHelper(this)
 {
     VNoteX::getInst().setMainWindow(this);
@@ -175,7 +175,7 @@ void MainWindow::setupUI()
 
 void MainWindow::setupStatusBar()
 {
-    m_statusBarHelper.setupStatusBar();
+    StatusBarHelper::setupStatusBar(this);
     connect(&VNoteX::getInst(), &VNoteX::statusMessageRequested,
             statusBar(), &QStatusBar::showMessage);
 }
@@ -525,7 +525,7 @@ void MainWindow::setupToolBar()
     if (isFrameless()) {
         auto toolBar = new TitleToolBar(tr("Global"), this);
         toolBar->setIconSize(iconSize);
-        m_toolBarHelper.setupToolBars(toolBar);
+        ToolBarHelper::setupToolBars(this, toolBar);
         toolBar->addTitleBarIcons(ToolBarHelper::generateIcon(QStringLiteral("minimize.svg")),
                                   ToolBarHelper::generateIcon(QStringLiteral("maximize.svg")),
                                   ToolBarHelper::generateIcon(QStringLiteral("maximize_restore.svg")),
@@ -536,7 +536,7 @@ void MainWindow::setupToolBar()
     } else {
         auto toolBar = new QToolBar(tr("Global"), this);
         toolBar->setIconSize(iconSize);
-        m_toolBarHelper.setupToolBars(toolBar);
+        ToolBarHelper::setupToolBars(this, toolBar);
     }
 
     // Disable the context menu above tool bar.

+ 0 - 6
src/widgets/mainwindow.h

@@ -7,9 +7,7 @@
 #include <QBitArray>
 #include <QSet>
 
-#include "toolbarhelper.h"
 #include "dockwidgethelper.h"
-#include "statusbarhelper.h"
 
 class QDockWidget;
 class QSystemTrayIcon;
@@ -149,10 +147,6 @@ namespace vnotex
 
         void loadWidgetsData();
 
-        ToolBarHelper m_toolBarHelper;
-
-        StatusBarHelper m_statusBarHelper;
-
         DockWidgetHelper m_dockWidgetHelper;
 
         ToolBox *m_navigationToolBox = nullptr;

+ 3 - 9
src/widgets/statusbarhelper.cpp

@@ -1,19 +1,13 @@
 #include "statusbarhelper.h"
 
 #include <QStatusBar>
-#include <QtWidgets>
 
 #include "mainwindow.h"
 
 using namespace vnotex;
 
-StatusBarHelper::StatusBarHelper(MainWindow *p_mainWindow)
-    : m_mainWindow(p_mainWindow)
+void StatusBarHelper::setupStatusBar(MainWindow *p_mainWindow)
 {
-}
-
-void StatusBarHelper::setupStatusBar()
-{
-    m_statusBar = new QStatusBar(m_mainWindow);
-    m_mainWindow->setStatusBar(m_statusBar);
+    auto bar = new QStatusBar(p_mainWindow);
+    p_mainWindow->setStatusBar(bar);
 }

+ 2 - 10
src/widgets/statusbarhelper.h

@@ -1,9 +1,6 @@
 #ifndef STATUSBARHELPER_H
 #define STATUSBARHELPER_H
 
-class QStatusBar;
-class QWidget;
-
 namespace vnotex
 {
     class MainWindow;
@@ -11,14 +8,9 @@ namespace vnotex
     class StatusBarHelper
     {
     public:
-        explicit StatusBarHelper(MainWindow *p_mainWindow);
-
-        void setupStatusBar();
-
-    private:
-        MainWindow *m_mainWindow = nullptr;
+        StatusBarHelper() = delete;
 
-        QStatusBar *m_statusBar;
+        static void setupStatusBar(MainWindow *p_mainWindow);
     };
 } // ns vnotex
 

+ 54 - 41
src/widgets/toolbarhelper.cpp

@@ -9,6 +9,7 @@
 #include <QApplication>
 #include <QDir>
 #include <QFileDialog>
+#include <QWidgetAction>
 
 #include "mainwindow.h"
 #include <core/vnotex.h>
@@ -24,16 +25,12 @@
 #include <core/fileopenparameters.h>
 #include "propertydefs.h"
 #include "dialogs/settings/settingsdialog.h"
-#include "messageboxhelper.h"
 #include "dialogs/updater.h"
+#include "messageboxhelper.h"
+#include "labelwithbuttonswidget.h"
 
 using namespace vnotex;
 
-ToolBarHelper::ToolBarHelper(MainWindow *p_mainWindow)
-    : m_mainWindow(p_mainWindow)
-{
-}
-
 static QToolBar *createToolBar(MainWindow *p_win, const QString &p_title, const QString &p_name)
 {
     auto tb = p_win->addToolBar(p_title);
@@ -269,19 +266,7 @@ QToolBar *ToolBarHelper::setupQuickAccessToolBar(MainWindow *p_win, QToolBar *p_
 
         MainWindow::connect(btnMenu, &QMenu::aboutToShow,
                             btnMenu, [btnMenu]() {
-                                btnMenu->clear();
-                                const auto &quickAccess = ConfigMgr::getInst().getSessionConfig().getQuickAccessFiles();
-                                if (quickAccess.isEmpty()) {
-                                    auto act = btnMenu->addAction(MainWindow::tr("Quick Access Not Set"));
-                                    act->setEnabled(false);
-                                    return;
-                                }
-
-                                for (const auto &file : quickAccess) {
-                                    auto act = btnMenu->addAction(PathUtils::fileName(file));
-                                    act->setData(file);
-                                    act->setToolTip(file);
-                                }
+                                ToolBarHelper::updateQuickAccessMenu(btnMenu);
                             });
         MainWindow::connect(btnMenu, &QMenu::triggered,
                             btnMenu, [](QAction *p_act) {
@@ -567,13 +552,17 @@ static const QString c_dangerousPalette = QStringLiteral("widgets#toolbar#icon#d
 
 QIcon ToolBarHelper::generateIcon(const QString &p_iconName)
 {
+    static QVector<IconUtils::OverriddenColor> colors;
+
     const auto &themeMgr = VNoteX::getInst().getThemeMgr();
-    const auto fg = themeMgr.paletteColor(c_fgPalette);
-    const auto disabledFg = themeMgr.paletteColor(c_disabledPalette);
 
-    QVector<IconUtils::OverriddenColor> colors;
-    colors.push_back(IconUtils::OverriddenColor(fg, QIcon::Normal));
-    colors.push_back(IconUtils::OverriddenColor(disabledFg, QIcon::Disabled));
+    if (colors.isEmpty()) {
+        const auto fg = themeMgr.paletteColor(c_fgPalette);
+        const auto disabledFg = themeMgr.paletteColor(c_disabledPalette);
+
+        colors.push_back(IconUtils::OverriddenColor(fg, QIcon::Normal));
+        colors.push_back(IconUtils::OverriddenColor(disabledFg, QIcon::Disabled));
+    }
 
     auto iconFile = themeMgr.getIconFile(p_iconName);
     return IconUtils::fetchIcon(iconFile, colors);
@@ -595,32 +584,24 @@ QIcon ToolBarHelper::generateDangerousIcon(const QString &p_iconName)
     return IconUtils::fetchIcon(iconFile, colors);
 }
 
-void ToolBarHelper::setupToolBars()
+void ToolBarHelper::setupToolBars(MainWindow *p_mainWindow)
 {
-    m_toolBars.clear();
+    setupFileToolBar(p_mainWindow, nullptr);
 
-    auto fileTab = setupFileToolBar(m_mainWindow, nullptr);
-    m_toolBars.insert(fileTab->objectName(), fileTab);
+    setupQuickAccessToolBar(p_mainWindow, nullptr);
 
-    auto quickAccessTb = setupQuickAccessToolBar(m_mainWindow, nullptr);
-    m_toolBars.insert(quickAccessTb->objectName(), quickAccessTb);
-
-    auto settingsToolBar = setupSettingsToolBar(m_mainWindow, nullptr);
-    m_toolBars.insert(settingsToolBar->objectName(), settingsToolBar);
+    setupSettingsToolBar(p_mainWindow, nullptr);
 }
 
-void ToolBarHelper::setupToolBars(QToolBar *p_toolBar)
+void ToolBarHelper::setupToolBars(MainWindow *p_mainWindow, QToolBar *p_toolBar)
 {
-    m_toolBars.clear();
-
     p_toolBar->setObjectName(QStringLiteral("UnifiedToolBar"));
     p_toolBar->setMovable(false);
-    m_mainWindow->addToolBar(p_toolBar);
+    p_mainWindow->addToolBar(p_toolBar);
 
-    setupFileToolBar(m_mainWindow, p_toolBar);
-    setupQuickAccessToolBar(m_mainWindow, p_toolBar);
-    setupSettingsToolBar(m_mainWindow, p_toolBar);
-    m_toolBars.insert(p_toolBar->objectName(), p_toolBar);
+    setupFileToolBar(p_mainWindow, p_toolBar);
+    setupQuickAccessToolBar(p_mainWindow, p_toolBar);
+    setupSettingsToolBar(p_mainWindow, p_toolBar);
 }
 
 void ToolBarHelper::addSpacer(QToolBar *p_toolBar)
@@ -630,3 +611,35 @@ void ToolBarHelper::addSpacer(QToolBar *p_toolBar)
     auto act = p_toolBar->addWidget(spacer);
     act->setEnabled(false);
 }
+
+void ToolBarHelper::updateQuickAccessMenu(QMenu *p_menu)
+{
+    p_menu->clear();
+    const auto &quickAccess = ConfigMgr::getInst().getSessionConfig().getQuickAccessFiles();
+    if (quickAccess.isEmpty()) {
+        auto act = p_menu->addAction(MainWindow::tr("Quick Access Not Set"));
+        act->setEnabled(false);
+        return;
+    }
+
+    for (const auto &file : quickAccess) {
+        auto act = new QWidgetAction(p_menu);
+        auto widget = new LabelWithButtonsWidget(PathUtils::fileName(file), LabelWithButtonsWidget::Delete);
+        p_menu->connect(widget, &LabelWithButtonsWidget::triggered,
+                        p_menu, [p_menu, act]() {
+                            const auto qaFile = act->data().toString();
+                            ConfigMgr::getInst().getSessionConfig().removeQuickAccessFile(qaFile);
+                            p_menu->removeAction(act);
+                            if (p_menu->isEmpty()) {
+                                p_menu->hide();
+                            }
+                        });
+        // @act will own @widget.
+        act->setDefaultWidget(widget);
+        act->setData(file);
+        act->setToolTip(file);
+
+        // Must call after setDefaultWidget().
+        p_menu->addAction(act);
+    }
+}

+ 5 - 7
src/widgets/toolbarhelper.h

@@ -1,10 +1,10 @@
 #ifndef TOOLBARHELPER_H
 #define TOOLBARHELPER_H
 
-#include <QHash>
 #include <QIcon>
 
 class QToolBar;
+class QMenu;
 
 namespace vnotex
 {
@@ -14,13 +14,13 @@ namespace vnotex
     class ToolBarHelper
     {
     public:
-        explicit ToolBarHelper(MainWindow *p_mainWindow);
+        ToolBarHelper() = delete;
 
         // Setup all tool bars of main window.
-        void setupToolBars();
+        static void setupToolBars(MainWindow *p_mainWindow);
 
         // Setup tool bars of main window into one unified tool bar.
-        void setupToolBars(QToolBar *p_toolBar);
+        static void setupToolBars(MainWindow *p_mainWindow, QToolBar *p_toolBar);
 
         static QIcon generateIcon(const QString &p_iconName);
 
@@ -35,9 +35,7 @@ namespace vnotex
 
         static QToolBar *setupSettingsToolBar(MainWindow *p_win, QToolBar *p_toolBar);
 
-        MainWindow *m_mainWindow = nullptr;
-
-        QHash<QString, QToolBar *> m_toolBars;
+        static void updateQuickAccessMenu(QMenu *p_menu);
     };
 } // ns vnotex
 

+ 2 - 0
src/widgets/widgets.pri

@@ -64,6 +64,7 @@ SOURCES += \
     $$PWD/fullscreentoggleaction.cpp \
     $$PWD/historypanel.cpp \
     $$PWD/itemproxystyle.cpp \
+    $$PWD/labelwithbuttonswidget.cpp \
     $$PWD/lineedit.cpp \
     $$PWD/lineeditdelegate.cpp \
     $$PWD/lineeditwithsnippet.cpp \
@@ -191,6 +192,7 @@ HEADERS += \
     $$PWD/fullscreentoggleaction.h \
     $$PWD/historypanel.h \
     $$PWD/itemproxystyle.h \
+    $$PWD/labelwithbuttonswidget.h \
     $$PWD/lineedit.h \
     $$PWD/lineeditdelegate.h \
     $$PWD/lineeditwithsnippet.h \