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)
{
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)

View File

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

View File

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

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

View File

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

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 "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.

View File

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

View File

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

View File

@ -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);
StatusBarHelper() = delete;
void setupStatusBar();
private:
MainWindow *m_mainWindow = nullptr;
QStatusBar *m_statusBar;
static void setupStatusBar(MainWindow *p_mainWindow);
};
} // ns vnotex

View File

@ -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();
if (colors.isEmpty()) {
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));
}
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);
}
}

View File

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

View File

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