refine Quick Access

This commit is contained in:
Le Tan 2021-10-30 08:09:53 +08:00
parent 8de8b0dda8
commit 0b624eeefd
15 changed files with 254 additions and 80 deletions

View File

@ -396,7 +396,21 @@ const QStringList &SessionConfig::getQuickAccessFiles() const
void SessionConfig::setQuickAccessFiles(const QStringList &p_files) 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) void SessionConfig::loadExternalPrograms(const QJsonObject &p_session)

View File

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

View File

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

View File

@ -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>

After

Width:  |  Height:  |  Size: 869 B

View File

@ -329,6 +329,23 @@ QMenu::indicator:exclusive:unchecked {
QMenu::indicator:exclusive:checked { QMenu::indicator:exclusive:checked {
image: url(menu_radiobutton.svg); 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 */ /* End QMenu */
QDialog { QDialog {

View File

@ -329,6 +329,23 @@ QMenu::indicator:exclusive:unchecked {
QMenu::indicator:exclusive:checked { QMenu::indicator:exclusive:checked {
image: url(menu_radiobutton.svg); 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 */ /* End QMenu */
QDialog { QDialog {

View File

@ -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);
}

View File

@ -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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,6 +9,7 @@
#include <QApplication> #include <QApplication>
#include <QDir> #include <QDir>
#include <QFileDialog> #include <QFileDialog>
#include <QWidgetAction>
#include "mainwindow.h" #include "mainwindow.h"
#include <core/vnotex.h> #include <core/vnotex.h>
@ -24,16 +25,12 @@
#include <core/fileopenparameters.h> #include <core/fileopenparameters.h>
#include "propertydefs.h" #include "propertydefs.h"
#include "dialogs/settings/settingsdialog.h" #include "dialogs/settings/settingsdialog.h"
#include "messageboxhelper.h"
#include "dialogs/updater.h" #include "dialogs/updater.h"
#include "messageboxhelper.h"
#include "labelwithbuttonswidget.h"
using namespace vnotex; 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) static QToolBar *createToolBar(MainWindow *p_win, const QString &p_title, const QString &p_name)
{ {
auto tb = p_win->addToolBar(p_title); auto tb = p_win->addToolBar(p_title);
@ -269,19 +266,7 @@ QToolBar *ToolBarHelper::setupQuickAccessToolBar(MainWindow *p_win, QToolBar *p_
MainWindow::connect(btnMenu, &QMenu::aboutToShow, MainWindow::connect(btnMenu, &QMenu::aboutToShow,
btnMenu, [btnMenu]() { btnMenu, [btnMenu]() {
btnMenu->clear(); ToolBarHelper::updateQuickAccessMenu(btnMenu);
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);
}
}); });
MainWindow::connect(btnMenu, &QMenu::triggered, MainWindow::connect(btnMenu, &QMenu::triggered,
btnMenu, [](QAction *p_act) { 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) QIcon ToolBarHelper::generateIcon(const QString &p_iconName)
{ {
static QVector<IconUtils::OverriddenColor> colors;
const auto &themeMgr = VNoteX::getInst().getThemeMgr(); const auto &themeMgr = VNoteX::getInst().getThemeMgr();
if (colors.isEmpty()) {
const auto fg = themeMgr.paletteColor(c_fgPalette); const auto fg = themeMgr.paletteColor(c_fgPalette);
const auto disabledFg = themeMgr.paletteColor(c_disabledPalette); const auto disabledFg = themeMgr.paletteColor(c_disabledPalette);
QVector<IconUtils::OverriddenColor> colors;
colors.push_back(IconUtils::OverriddenColor(fg, QIcon::Normal)); colors.push_back(IconUtils::OverriddenColor(fg, QIcon::Normal));
colors.push_back(IconUtils::OverriddenColor(disabledFg, QIcon::Disabled)); colors.push_back(IconUtils::OverriddenColor(disabledFg, QIcon::Disabled));
}
auto iconFile = themeMgr.getIconFile(p_iconName); auto iconFile = themeMgr.getIconFile(p_iconName);
return IconUtils::fetchIcon(iconFile, colors); return IconUtils::fetchIcon(iconFile, colors);
@ -595,32 +584,24 @@ QIcon ToolBarHelper::generateDangerousIcon(const QString &p_iconName)
return IconUtils::fetchIcon(iconFile, colors); 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); setupQuickAccessToolBar(p_mainWindow, nullptr);
m_toolBars.insert(fileTab->objectName(), fileTab);
auto quickAccessTb = setupQuickAccessToolBar(m_mainWindow, nullptr); setupSettingsToolBar(p_mainWindow, nullptr);
m_toolBars.insert(quickAccessTb->objectName(), quickAccessTb);
auto settingsToolBar = setupSettingsToolBar(m_mainWindow, nullptr);
m_toolBars.insert(settingsToolBar->objectName(), settingsToolBar);
} }
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->setObjectName(QStringLiteral("UnifiedToolBar"));
p_toolBar->setMovable(false); p_toolBar->setMovable(false);
m_mainWindow->addToolBar(p_toolBar); p_mainWindow->addToolBar(p_toolBar);
setupFileToolBar(m_mainWindow, p_toolBar); setupFileToolBar(p_mainWindow, p_toolBar);
setupQuickAccessToolBar(m_mainWindow, p_toolBar); setupQuickAccessToolBar(p_mainWindow, p_toolBar);
setupSettingsToolBar(m_mainWindow, p_toolBar); setupSettingsToolBar(p_mainWindow, p_toolBar);
m_toolBars.insert(p_toolBar->objectName(), p_toolBar);
} }
void ToolBarHelper::addSpacer(QToolBar *p_toolBar) void ToolBarHelper::addSpacer(QToolBar *p_toolBar)
@ -630,3 +611,35 @@ void ToolBarHelper::addSpacer(QToolBar *p_toolBar)
auto act = p_toolBar->addWidget(spacer); auto act = p_toolBar->addWidget(spacer);
act->setEnabled(false); 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);
}
}

View File

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

View File

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