From b9ac16d16577c7badbc1c91cd0b913c795e08db4 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Mon, 17 May 2021 05:39:03 -0700 Subject: [PATCH] Quick Access and Flash Page (#1763) * flash page * Quick Access --- src/core/core.pri | 2 + src/core/coreconfig.h | 3 + src/core/iconfig.h | 24 ++++ src/core/quickaccesshelper.cpp | 19 +++ src/core/quickaccesshelper.h | 17 +++ src/core/sessionconfig.cpp | 29 +++- src/core/sessionconfig.h | 10 ++ src/core/vnotex.cpp | 9 ++ src/core/vnotex.h | 4 + src/data/core/core.qrc | 2 + src/data/core/icons/flash_page_menu.svg | 1 + src/data/core/icons/quick_access_menu.svg | 7 + src/data/core/vnotex.json | 5 +- src/widgets/dialogs/exportdialog.cpp | 20 +-- src/widgets/dialogs/exportdialog.h | 3 +- .../dialogs/settings/quickaccesspage.cpp | 104 ++++++++++++++ .../dialogs/settings/quickaccesspage.h | 39 ++++++ .../dialogs/settings/settingsdialog.cpp | 7 + src/widgets/locationinputwithbrowsebutton.cpp | 45 ++++++ src/widgets/locationinputwithbrowsebutton.h | 35 +++++ src/widgets/markdownviewwindow.cpp | 7 +- src/widgets/notebookexplorer.cpp | 3 - src/widgets/notebooknodeexplorer.cpp | 35 +++++ src/widgets/notebooknodeexplorer.h | 3 +- src/widgets/toolbarhelper.cpp | 132 +++++++++++++++--- src/widgets/viewarea.cpp | 12 +- src/widgets/widgets.pri | 4 + src/widgets/widgetsfactory.cpp | 6 + src/widgets/widgetsfactory.h | 2 + 29 files changed, 540 insertions(+), 49 deletions(-) create mode 100644 src/core/quickaccesshelper.cpp create mode 100644 src/core/quickaccesshelper.h create mode 100644 src/data/core/icons/flash_page_menu.svg create mode 100644 src/data/core/icons/quick_access_menu.svg create mode 100644 src/widgets/dialogs/settings/quickaccesspage.cpp create mode 100644 src/widgets/dialogs/settings/quickaccesspage.h create mode 100644 src/widgets/locationinputwithbrowsebutton.cpp create mode 100644 src/widgets/locationinputwithbrowsebutton.h diff --git a/src/core/core.pri b/src/core/core.pri index f5407f21..c66493a3 100644 --- a/src/core/core.pri +++ b/src/core/core.pri @@ -21,6 +21,7 @@ SOURCES += \ $$PWD/logger.cpp \ $$PWD/mainconfig.cpp \ $$PWD/markdowneditorconfig.cpp \ + $$PWD/quickaccesshelper.cpp \ $$PWD/singleinstanceguard.cpp \ $$PWD/texteditorconfig.cpp \ $$PWD/vnotex.cpp \ @@ -46,6 +47,7 @@ HEADERS += \ $$PWD/logger.h \ $$PWD/mainconfig.h \ $$PWD/markdowneditorconfig.h \ + $$PWD/quickaccesshelper.h \ $$PWD/singleinstanceguard.h \ $$PWD/iconfig.h \ $$PWD/texteditorconfig.h \ diff --git a/src/core/coreconfig.h b/src/core/coreconfig.h index b7f99839..c8e3449b 100644 --- a/src/core/coreconfig.h +++ b/src/core/coreconfig.h @@ -35,6 +35,9 @@ namespace vnotex RemoveSplitAndWorkspace, NewWorkspace, Export, + Quit, + FlashPage, + QuickAccess, MaxShortcut }; Q_ENUM(Shortcut) diff --git a/src/core/iconfig.h b/src/core/iconfig.h index c7f2f773..263a2816 100644 --- a/src/core/iconfig.h +++ b/src/core/iconfig.h @@ -94,6 +94,30 @@ namespace vnotex return res; } + static QStringList readStringList(const QJsonObject &p_obj, + const QString &p_key) + { + auto arr = p_obj.value(p_key).toArray(); + QStringList res; + res.reserve(arr.size()); + for (const auto &ele : arr) { + res.push_back(ele.toString()); + } + return res; + } + + static void writeStringList(QJsonObject &p_obj, + const QString &p_key, + const QStringList &p_list) + { + QJsonArray arr; + for (const auto &ele : p_list) { + arr.push_back(ele); + } + + p_obj[p_key] = arr; + } + static QString readString(const QJsonObject &p_obj, const QString &p_key) { diff --git a/src/core/quickaccesshelper.cpp b/src/core/quickaccesshelper.cpp new file mode 100644 index 00000000..9b1ebe8f --- /dev/null +++ b/src/core/quickaccesshelper.cpp @@ -0,0 +1,19 @@ +#include "quickaccesshelper.h" + +#include "configmgr.h" +#include "sessionconfig.h" + +using namespace vnotex; + +void QuickAccessHelper::pinToQuickAccess(const QStringList &p_files) +{ + if (p_files.isEmpty()) { + return; + } + + auto &sessionConfig = ConfigMgr::getInst().getSessionConfig(); + auto qaFiles = sessionConfig.getQuickAccessFiles(); + qaFiles.append(p_files); + qaFiles.removeDuplicates(); + sessionConfig.setQuickAccessFiles(qaFiles); +} diff --git a/src/core/quickaccesshelper.h b/src/core/quickaccesshelper.h new file mode 100644 index 00000000..09378562 --- /dev/null +++ b/src/core/quickaccesshelper.h @@ -0,0 +1,17 @@ +#ifndef QUICKACCESSHELPER_H +#define QUICKACCESSHELPER_H + +#include + +namespace vnotex +{ + class QuickAccessHelper + { + public: + QuickAccessHelper() = delete; + + static void pinToQuickAccess(const QStringList &p_files); + }; +} + +#endif // QUICKACCESSHELPER_H diff --git a/src/core/sessionconfig.cpp b/src/core/sessionconfig.cpp index 9d21201e..e6b16856 100644 --- a/src/core/sessionconfig.cpp +++ b/src/core/sessionconfig.cpp @@ -79,8 +79,7 @@ void SessionConfig::loadCore(const QJsonObject &p_session) m_newNotebookDefaultRootFolderPath = QDir::homePath(); } - m_currentNotebookRootFolderPath = readString(coreObj, - QStringLiteral("current_notebook_root_folder_path")); + m_currentNotebookRootFolderPath = readString(coreObj, QStringLiteral("current_notebook_root_folder_path")); { auto option = readString(coreObj, QStringLiteral("opengl")); @@ -96,6 +95,10 @@ void SessionConfig::loadCore(const QJsonObject &p_session) if (!isUndefinedKey(coreObj, QStringLiteral("minimize_to_system_tray"))) { m_minimizeToSystemTray = readBool(coreObj, QStringLiteral("minimize_to_system_tray")) ? 1 : 0; } + + m_flashPage = readString(coreObj, QStringLiteral("flash_page")); + + m_quickAccessFiles = readStringList(coreObj, QStringLiteral("quick_access")); } QJsonObject SessionConfig::saveCore() const @@ -108,6 +111,8 @@ QJsonObject SessionConfig::saveCore() const if (m_minimizeToSystemTray != -1) { coreObj[QStringLiteral("minimize_to_system_tray")] = m_minimizeToSystemTray > 0; } + coreObj[QStringLiteral("flash_page")] = m_flashPage; + writeStringList(coreObj, QStringLiteral("quick_access"), m_quickAccessFiles); return coreObj; } @@ -338,3 +343,23 @@ void SessionConfig::setNotebookExplorerSession(const QByteArray &p_bytes) { updateConfigWithoutCheck(m_notebookExplorerSession, p_bytes, this); } + +const QString &SessionConfig::getFlashPage() const +{ + return m_flashPage; +} + +void SessionConfig::setFlashPage(const QString &p_file) +{ + updateConfig(m_flashPage, p_file, this); +} + +const QStringList &SessionConfig::getQuickAccessFiles() const +{ + return m_quickAccessFiles; +} + +void SessionConfig::setQuickAccessFiles(const QStringList &p_files) +{ + updateConfig(m_quickAccessFiles, p_files, this); +} diff --git a/src/core/sessionconfig.h b/src/core/sessionconfig.h index b7a892c4..e8813e2c 100644 --- a/src/core/sessionconfig.h +++ b/src/core/sessionconfig.h @@ -97,6 +97,12 @@ namespace vnotex QByteArray getNotebookExplorerSessionAndClear(); void setNotebookExplorerSession(const QByteArray &p_bytes); + const QString &getFlashPage() const; + void setFlashPage(const QString &p_file); + + const QStringList &getQuickAccessFiles() const; + void setQuickAccessFiles(const QStringList &p_files); + private: void loadCore(const QJsonObject &p_session); @@ -139,6 +145,10 @@ namespace vnotex QByteArray m_viewAreaSession; QByteArray m_notebookExplorerSession; + + QString m_flashPage; + + QStringList m_quickAccessFiles; }; } // ns vnotex diff --git a/src/core/vnotex.cpp b/src/core/vnotex.cpp index 2f581fe3..df6008e5 100644 --- a/src/core/vnotex.cpp +++ b/src/core/vnotex.cpp @@ -11,6 +11,7 @@ #include "location.h" #include "fileopenparameters.h" +#include "quickaccesshelper.h" #include @@ -31,6 +32,8 @@ VNoteX::VNoteX(QObject *p_parent) initBufferMgr(); initDocsUtils(); + + initQuickAccess(); } void VNoteX::initLoad() @@ -128,3 +131,9 @@ void VNoteX::initDocsUtils() DocsUtils::setLocale(configMgr.getCoreConfig().getLocaleToUse()); } + +void VNoteX::initQuickAccess() +{ + connect(this, &VNoteX::pinToQuickAccessRequested, + this, &QuickAccessHelper::pinToQuickAccess); +} diff --git a/src/core/vnotex.h b/src/core/vnotex.h index 0872a6cd..7c0cfdd3 100644 --- a/src/core/vnotex.h +++ b/src/core/vnotex.h @@ -107,6 +107,8 @@ namespace vnotex void exportRequested(); + void pinToQuickAccessRequested(const QStringList &p_files); + private: explicit VNoteX(QObject *p_parent = nullptr); @@ -118,6 +120,8 @@ namespace vnotex void initDocsUtils(); + void initQuickAccess(); + MainWindow *m_mainWindow; // QObject managed. diff --git a/src/data/core/core.qrc b/src/data/core/core.qrc index 7b07cafa..b30a489f 100644 --- a/src/data/core/core.qrc +++ b/src/data/core/core.qrc @@ -26,6 +26,8 @@ icons/whatsthis.svg icons/help_menu.svg icons/import_export_menu.svg + icons/flash_page_menu.svg + icons/quick_access_menu.svg icons/native_notebook_default.svg icons/notebook_default.svg icons/file_node.svg diff --git a/src/data/core/icons/flash_page_menu.svg b/src/data/core/icons/flash_page_menu.svg new file mode 100644 index 00000000..6e1c07f9 --- /dev/null +++ b/src/data/core/icons/flash_page_menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/data/core/icons/quick_access_menu.svg b/src/data/core/icons/quick_access_menu.svg new file mode 100644 index 00000000..349a2bdc --- /dev/null +++ b/src/data/core/icons/quick_access_menu.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/src/data/core/vnotex.json b/src/data/core/vnotex.json index 0bcb819d..35075f50 100644 --- a/src/data/core/vnotex.json +++ b/src/data/core/vnotex.json @@ -28,7 +28,10 @@ "DistributeSplits" : "Ctrl+G, =", "RemoveSplitAndWorkspace" : "Ctrl+G, R", "NewWorkspace" : "Ctrl+G, N", - "Export" : "Ctrl+G, T" + "Export" : "Ctrl+G, T", + "Quit" : "Ctrl+Q", + "FlashPage" : "Ctrl+Alt+L", + "QuickAccess" : "Ctrl+Alt+I" }, "toolbar_icon_size" : 16, "note_management" : { diff --git a/src/widgets/dialogs/exportdialog.cpp b/src/widgets/dialogs/exportdialog.cpp index f07a7cfe..9e718064 100644 --- a/src/widgets/dialogs/exportdialog.cpp +++ b/src/widgets/dialogs/exportdialog.cpp @@ -32,6 +32,7 @@ #include #include #include +#include using namespace vnotex; @@ -181,14 +182,9 @@ QGroupBox *ExportDialog::setupTargetGroup(QWidget *p_parent) } { - auto outputLayout = new QHBoxLayout(); - - m_outputDirLineEdit = WidgetsFactory::createLineEdit(box); - outputLayout->addWidget(m_outputDirLineEdit); - - auto browseBtn = new QPushButton(tr("Browse"), box); - outputLayout->addWidget(browseBtn); - connect(browseBtn, &QPushButton::clicked, + m_outputDirInput = new LocationInputWithBrowseButton(box); + layout->addRow(tr("Output directory:"), m_outputDirInput); + connect(m_outputDirInput, &LocationInputWithBrowseButton::clicked, this, [this]() { QString initPath = getOutputDir(); if (!QFileInfo::exists(initPath)) { @@ -202,11 +198,9 @@ QGroupBox *ExportDialog::setupTargetGroup(QWidget *p_parent) | QFileDialog::DontResolveSymlinks); if (!dirPath.isEmpty()) { - m_outputDirLineEdit->setText(dirPath); + m_outputDirInput->setText(dirPath); } }); - - layout->addRow(tr("Output directory:"), outputLayout); } return box; @@ -281,7 +275,7 @@ void ExportDialog::setupButtonBox() QString ExportDialog::getOutputDir() const { - return m_outputDirLineEdit->text(); + return m_outputDirInput->text(); } void ExportDialog::initOptions() @@ -330,7 +324,7 @@ void ExportDialog::restoreFields(const ExportOption &p_option) } } - m_outputDirLineEdit->setText(p_option.m_outputDir); + m_outputDirInput->setText(p_option.m_outputDir); m_recursiveCheckBox->setChecked(p_option.m_recursive); diff --git a/src/widgets/dialogs/exportdialog.h b/src/widgets/dialogs/exportdialog.h index d18d6dc5..ad79faeb 100644 --- a/src/widgets/dialogs/exportdialog.h +++ b/src/widgets/dialogs/exportdialog.h @@ -22,6 +22,7 @@ namespace vnotex class Node; class Buffer; class Exporter; + class LocationInputWithBrowseButton; class ExportDialog : public ScrollDialog { @@ -130,7 +131,7 @@ namespace vnotex QComboBox *m_syntaxHighlightStyleComboBox = nullptr; - QLineEdit *m_outputDirLineEdit = nullptr; + LocationInputWithBrowseButton *m_outputDirInput = nullptr; QProgressBar *m_progressBar = nullptr; diff --git a/src/widgets/dialogs/settings/quickaccesspage.cpp b/src/widgets/dialogs/settings/quickaccesspage.cpp new file mode 100644 index 00000000..994bf10b --- /dev/null +++ b/src/widgets/dialogs/settings/quickaccesspage.cpp @@ -0,0 +1,104 @@ +#include "quickaccesspage.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace vnotex; + +QuickAccessPage::QuickAccessPage(QWidget *p_parent) + : SettingsPage(p_parent) +{ + setupUI(); +} + +void QuickAccessPage::setupUI() +{ + auto mainLayout = new QVBoxLayout(this); + + auto flashPageBox = setupFlashPageGroup(); + mainLayout->addWidget(flashPageBox); + + auto quickAccessBox = setupQuickAccessGroup(); + mainLayout->addWidget(quickAccessBox); +} + +void QuickAccessPage::loadInternal() +{ + const auto &sessionConfig = ConfigMgr::getInst().getSessionConfig(); + + m_flashPageInput->setText(sessionConfig.getFlashPage()); + + { + const auto &quickAccess = sessionConfig.getQuickAccessFiles(); + if (!quickAccess.isEmpty()) { + m_quickAccessTextEdit->setPlainText(quickAccess.join(QChar('\n'))); + } + } +} + +void QuickAccessPage::saveInternal() +{ + auto &sessionConfig = ConfigMgr::getInst().getSessionConfig(); + + sessionConfig.setFlashPage(m_flashPageInput->text()); + + { + auto text = m_quickAccessTextEdit->toPlainText(); + if (!text.isEmpty()) { + sessionConfig.setQuickAccessFiles(text.split(QChar('\n'))); + } + } +} + +QString QuickAccessPage::title() const +{ + return tr("Quick Access"); +} + +QGroupBox *QuickAccessPage::setupFlashPageGroup() +{ + auto box = new QGroupBox(tr("Flash Page"), this); + auto layout = WidgetsFactory::createFormLayout(box); + + { + m_flashPageInput = new LocationInputWithBrowseButton(box); + m_flashPageInput->setToolTip(tr("Flash Page location (user could copy the path of one note and paste it here)")); + + const QString label(tr("Flash Page:")); + layout->addRow(label, m_flashPageInput); + addSearchItem(label, m_flashPageInput->toolTip(), m_flashPageInput); + connect(m_flashPageInput, &LocationInputWithBrowseButton::textChanged, + this, &QuickAccessPage::pageIsChanged); + } + + return box; +} + +QGroupBox *QuickAccessPage::setupQuickAccessGroup() +{ + auto box = new QGroupBox(tr("Quick Access"), this); + auto layout = WidgetsFactory::createFormLayout(box); + + { + m_quickAccessTextEdit = WidgetsFactory::createPlainTextEdit(box); + m_quickAccessTextEdit->setToolTip(tr("Edit the files pinned to Quick Access (one file per line)")); + + const QString label(tr("Quick Access:")); + layout->addRow(label, m_quickAccessTextEdit); + addSearchItem(label, m_quickAccessTextEdit->toolTip(), m_quickAccessTextEdit); + connect(m_quickAccessTextEdit, &QPlainTextEdit::textChanged, + this, &QuickAccessPage::pageIsChanged); + } + + return box; +} diff --git a/src/widgets/dialogs/settings/quickaccesspage.h b/src/widgets/dialogs/settings/quickaccesspage.h new file mode 100644 index 00000000..86e5e905 --- /dev/null +++ b/src/widgets/dialogs/settings/quickaccesspage.h @@ -0,0 +1,39 @@ +#ifndef QUICKACCESSPAGE_H +#define QUICKACCESSPAGE_H + +#include "settingspage.h" + +class QGroupBox; +class QPlainTextEdit; + +namespace vnotex +{ + class LocationInputWithBrowseButton; + + class QuickAccessPage : public SettingsPage + { + Q_OBJECT + public: + explicit QuickAccessPage(QWidget *p_parent = nullptr); + + QString title() const Q_DECL_OVERRIDE; + + protected: + void loadInternal() Q_DECL_OVERRIDE; + + void saveInternal() Q_DECL_OVERRIDE; + + private: + void setupUI(); + + QGroupBox *setupFlashPageGroup(); + + QGroupBox *setupQuickAccessGroup(); + + LocationInputWithBrowseButton *m_flashPageInput = nullptr; + + QPlainTextEdit *m_quickAccessTextEdit = nullptr; + }; +} + +#endif // QUICKACCESSPAGE_H diff --git a/src/widgets/dialogs/settings/settingsdialog.cpp b/src/widgets/dialogs/settings/settingsdialog.cpp index 912b1548..6695512a 100644 --- a/src/widgets/dialogs/settings/settingsdialog.cpp +++ b/src/widgets/dialogs/settings/settingsdialog.cpp @@ -13,6 +13,7 @@ #include "texteditorpage.h" #include "markdowneditorpage.h" #include "appearancepage.h" +#include "quickaccesspage.h" #include "themepage.h" using namespace vnotex; @@ -89,6 +90,12 @@ void SettingsDialog::setupPages() } } + // Quick Access. + { + auto page = new QuickAccessPage(this); + addPage(page); + } + // Editor. { auto page = new EditorPage(this); diff --git a/src/widgets/locationinputwithbrowsebutton.cpp b/src/widgets/locationinputwithbrowsebutton.cpp new file mode 100644 index 00000000..256fd04a --- /dev/null +++ b/src/widgets/locationinputwithbrowsebutton.cpp @@ -0,0 +1,45 @@ +#include "locationinputwithbrowsebutton.h" + +#include +#include +#include + +#include + +using namespace vnotex; + +LocationInputWithBrowseButton::LocationInputWithBrowseButton(QWidget *p_parent) + : QWidget(p_parent) +{ + auto layout = new QHBoxLayout(this); + + m_lineEdit = WidgetsFactory::createLineEdit(this); + layout->addWidget(m_lineEdit, 1); + connect(m_lineEdit, &QLineEdit::textChanged, + this, &LocationInputWithBrowseButton::textChanged); + + auto browseBtn = new QPushButton(tr("Browse"), this); + layout->addWidget(browseBtn); + connect(browseBtn, &QPushButton::clicked, + this, &LocationInputWithBrowseButton::clicked); +} + +QString LocationInputWithBrowseButton::text() const +{ + return m_lineEdit->text(); +} + +void LocationInputWithBrowseButton::setText(const QString &p_text) +{ + m_lineEdit->setText(p_text); +} + +QString LocationInputWithBrowseButton::toolTip() const +{ + return m_lineEdit->toolTip(); +} + +void LocationInputWithBrowseButton::setToolTip(const QString &p_tip) +{ + m_lineEdit->setToolTip(p_tip); +} diff --git a/src/widgets/locationinputwithbrowsebutton.h b/src/widgets/locationinputwithbrowsebutton.h new file mode 100644 index 00000000..a18be952 --- /dev/null +++ b/src/widgets/locationinputwithbrowsebutton.h @@ -0,0 +1,35 @@ +#ifndef LOCATIONINPUTWITHBROWSEBUTTON_H +#define LOCATIONINPUTWITHBROWSEBUTTON_H + +#include + +class QLineEdit; +class QPushButton; + +namespace vnotex +{ + class LocationInputWithBrowseButton : public QWidget + { + Q_OBJECT + public: + explicit LocationInputWithBrowseButton(QWidget *p_parent = nullptr); + + QString text() const; + + void setText(const QString &p_text); + + QString toolTip() const; + + void setToolTip(const QString &p_tip); + + signals: + void clicked(); + + void textChanged(const QString &p_text); + + private: + QLineEdit *m_lineEdit = nullptr; + }; +} + +#endif // LOCATIONINPUTWITHBROWSEBUTTON_H diff --git a/src/widgets/markdownviewwindow.cpp b/src/widgets/markdownviewwindow.cpp index 736e43c7..fc69be25 100644 --- a/src/widgets/markdownviewwindow.cpp +++ b/src/widgets/markdownviewwindow.cpp @@ -904,9 +904,11 @@ void MarkdownViewWindow::handleFileOpenParameters(const QSharedPointergetName()).completeBaseName()); m_editor->insertText(title); } - } + } else { + setMode(p_paras->m_mode); - scrollToLine(p_paras->m_lineNumber); + scrollToLine(p_paras->m_lineNumber); + } } void MarkdownViewWindow::scrollToLine(int p_lineNumber) @@ -931,7 +933,6 @@ bool MarkdownViewWindow::isReadMode() const void MarkdownViewWindow::openTwice(const QSharedPointer &p_paras) { - qDebug() << p_paras->m_lineNumber; Q_ASSERT(!p_paras || !p_paras->m_newFile); handleFileOpenParameters(p_paras); } diff --git a/src/widgets/notebookexplorer.cpp b/src/widgets/notebookexplorer.cpp index 957ffc92..8935fdc7 100644 --- a/src/widgets/notebookexplorer.cpp +++ b/src/widgets/notebookexplorer.cpp @@ -475,8 +475,6 @@ void NotebookExplorer::recoverSession() auto it = m_session.m_notebooks.find(m_currentNotebook->getRootFolderPath()); if (it != m_session.m_notebooks.end()) { - qDebug() << it.value().m_recovered << it.value().m_currentNodePath; - if (it.value().m_recovered || it.value().m_currentNodePath.isEmpty()) { return; } @@ -484,7 +482,6 @@ void NotebookExplorer::recoverSession() it.value().m_recovered = true; auto node = m_currentNotebook->loadNodeByPath(it.value().m_currentNodePath); - qDebug() << "node" << node; if (node) { m_nodeExplorer->setCurrentNode(node.data()); } diff --git a/src/widgets/notebooknodeexplorer.cpp b/src/widgets/notebooknodeexplorer.cpp index 0f466e4b..b50e20f5 100644 --- a/src/widgets/notebooknodeexplorer.cpp +++ b/src/widgets/notebooknodeexplorer.cpp @@ -870,6 +870,13 @@ void NotebookNodeExplorer::createContextMenuOnNode(QMenu *p_menu, const Node *p_ act = createAction(Action::Sort, p_menu); p_menu->addAction(act); + { + p_menu->addSeparator(); + + act = createAction(Action::PinToQuickAccess, p_menu); + p_menu->addAction(act); + } + if (selectedSize == 1) { p_menu->addSeparator(); @@ -898,6 +905,13 @@ void NotebookNodeExplorer::createContextMenuOnExternalNode(QMenu *p_menu, const act = createAction(Action::ImportToConfig, p_menu); p_menu->addAction(act); + { + p_menu->addSeparator(); + + act = createAction(Action::PinToQuickAccess, p_menu); + p_menu->addAction(act); + } + if (selectedSize == 1) { p_menu->addSeparator(); @@ -1154,6 +1168,27 @@ QAction *NotebookNodeExplorer::createAction(Action p_act, QObject *p_parent) act = new QAction(tr("&Expand All\t*"), p_parent); connect(act, &QAction::triggered, this, &NotebookNodeExplorer::expandCurrentNodeAll); + + case Action::PinToQuickAccess: + act = new QAction(tr("Pin To &Quick Access"), p_parent); + connect(act, &QAction::triggered, + this, [this]() { + auto nodes = getSelectedNodes(); + QStringList files; + for (const auto &node : nodes.first) { + if (node->hasContent()) { + files.push_back(node->fetchAbsolutePath()); + } + } + for (const auto &node : nodes.second) { + if (!node->isFolder()) { + files.push_back(node->fetchAbsolutePath()); + } + } + if (!files.isEmpty()) { + emit VNoteX::getInst().pinToQuickAccessRequested(files); + } + }); break; } diff --git a/src/widgets/notebooknodeexplorer.h b/src/widgets/notebooknodeexplorer.h index 4402e989..6266c28c 100644 --- a/src/widgets/notebooknodeexplorer.h +++ b/src/widgets/notebooknodeexplorer.h @@ -149,7 +149,8 @@ namespace vnotex ReloadIndex, ImportToConfig, Open, - ExpandAll + ExpandAll, + PinToQuickAccess }; void setupUI(); diff --git a/src/widgets/toolbarhelper.cpp b/src/widgets/toolbarhelper.cpp index 47c7bdda..3dfece61 100644 --- a/src/widgets/toolbarhelper.cpp +++ b/src/widgets/toolbarhelper.cpp @@ -16,12 +16,15 @@ #include #include #include +#include #include "fullscreentoggleaction.h" #include #include +#include #include #include "propertydefs.h" #include "dialogs/settings/settingsdialog.h" +#include "messageboxhelper.h" using namespace vnotex; @@ -52,38 +55,38 @@ QToolBar *ToolBarHelper::setupFileToolBar(MainWindow *p_win, QToolBar *p_toolBar toolBtn->setPopupMode(QToolButton::InstantPopup); toolBtn->setProperty(PropertyDefs::c_toolButtonWithoutMenuIndicator, true); - auto newMenu = WidgetsFactory::createMenu(tb); - toolBtn->setMenu(newMenu); + auto btnMenu = WidgetsFactory::createMenu(tb); + toolBtn->setMenu(btnMenu); - newMenu->addAction(generateIcon("new_notebook.svg"), + btnMenu->addAction(generateIcon("new_notebook.svg"), MainWindow::tr("New Notebook"), - newMenu, + btnMenu, []() { emit VNoteX::getInst().newNotebookRequested(); }); // New notebook from folder. - newMenu->addAction(generateIcon("new_notebook_from_folder.svg"), + btnMenu->addAction(generateIcon("new_notebook_from_folder.svg"), MainWindow::tr("New Notebook From Folder"), - newMenu, + btnMenu, []() { emit VNoteX::getInst().newNotebookFromFolderRequested(); }); - newMenu->addSeparator(); + btnMenu->addSeparator(); // Import notebook. - newMenu->addAction(generateIcon("import_notebook.svg"), + btnMenu->addAction(generateIcon("import_notebook.svg"), MainWindow::tr("Import Notebook"), - newMenu, + btnMenu, []() { emit VNoteX::getInst().importNotebookRequested(); }); // Import notebook of VNote 2.0. - newMenu->addAction(generateIcon("import_notebook_of_vnote2.svg"), + btnMenu->addAction(generateIcon("import_notebook_of_vnote2.svg"), MainWindow::tr("Import Legacy Notebook Of VNote 2.0"), - newMenu, + btnMenu, []() { emit VNoteX::getInst().importLegacyNotebookRequested(); }); @@ -190,6 +193,90 @@ QToolBar *ToolBarHelper::setupQuickAccessToolBar(MainWindow *p_win, QToolBar *p_ tb = createToolBar(p_win, MainWindow::tr("Quick Access"), "QuickAccessToolBar"); } + const auto &coreConfig = ConfigMgr::getInst().getCoreConfig(); + + // Flash Page. + { + auto flashPageAct = tb->addAction(generateIcon("flash_page_menu.svg"), + MainWindow::tr("Flash Page"), + tb, + [p_win]() { + const auto &flashPage = ConfigMgr::getInst().getSessionConfig().getFlashPage(); + if (flashPage.isEmpty()) { + MessageBoxHelper::notify( + MessageBoxHelper::Type::Information, + MainWindow::tr("Please set the Flash Page location in the Settings dialog first."), + MainWindow::tr("Flash Page is a temporary page for a flash of inspiration."), + QString(), + p_win); + return; + } + + auto paras = QSharedPointer::create(); + paras->m_mode = ViewWindowMode::Edit; + emit VNoteX::getInst().openFileRequested(flashPage, paras); + }); + WidgetUtils::addActionShortcut(flashPageAct, + coreConfig.getShortcut(CoreConfig::Shortcut::FlashPage)); + } + + // Quick Access. + { + auto toolBtn = WidgetsFactory::createToolButton(tb); + toolBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + + auto btnMenu = WidgetsFactory::createMenu(tb); + toolBtn->setMenu(btnMenu); + + // Quick Acces. + auto quickAccessAct = new QAction(generateIcon("quick_access_menu.svg"), MainWindow::tr("Quick Access"), toolBtn); + MainWindow::connect(quickAccessAct, &QAction::triggered, + p_win, [p_win]() { + const auto &quickAccess = ConfigMgr::getInst().getSessionConfig().getQuickAccessFiles(); + if (quickAccess.isEmpty()) { + MessageBoxHelper::notify( + MessageBoxHelper::Type::Information, + MainWindow::tr("Please pin files to Quick Access first."), + MainWindow::tr("Files could be pinned to Quick Access via context menu."), + MainWindow::tr("Quick Access could be managed in the Settings dialog."), + p_win); + return; + } + + emit VNoteX::getInst().openFileRequested(quickAccess.first(), + QSharedPointer::create()); + }); + WidgetUtils::addActionShortcut(quickAccessAct, + coreConfig.getShortcut(CoreConfig::Shortcut::QuickAccess)); + + toolBtn->setDefaultAction(quickAccessAct); + // To hide the shortcut text shown in button. + toolBtn->setText(MainWindow::tr("Quick Access")); + + 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); + } + }); + MainWindow::connect(btnMenu, &QMenu::triggered, + btnMenu, [](QAction *p_act) { + emit VNoteX::getInst().openFileRequested(p_act->data().toString(), + QSharedPointer::create()); + }); + tb->addWidget(toolBtn); + } + return tb; } @@ -330,17 +417,20 @@ QToolBar *ToolBarHelper::setupSettingsToolBar(MainWindow *p_win, QToolBar *p_too menu->addSeparator(); - menu->addAction(MainWindow::tr("Quit"), - menu, - [p_win]() { - p_win->quitApp(); - }); - menu->addAction(MainWindow::tr("Restart"), menu, [p_win]() { p_win->restart(); }); + + auto quitAct = menu->addAction(MainWindow::tr("Quit"), + menu, + [p_win]() { + p_win->quitApp(); + }); + quitAct->setMenuRole(QAction::QuitRole); + WidgetUtils::addActionShortcut(quitAct, + coreConfig.getShortcut(CoreConfig::Shortcut::Quit)); } // Help. @@ -465,12 +555,12 @@ void ToolBarHelper::setupToolBars(MainWindow *p_win) { m_toolBars.clear(); - auto quickAccessTb = setupQuickAccessToolBar(p_win, nullptr); - m_toolBars.insert(quickAccessTb->objectName(), quickAccessTb); - auto fileTab = setupFileToolBar(p_win, nullptr); m_toolBars.insert(fileTab->objectName(), fileTab); + auto quickAccessTb = setupQuickAccessToolBar(p_win, nullptr); + m_toolBars.insert(quickAccessTb->objectName(), quickAccessTb); + auto settingsToolBar = setupSettingsToolBar(p_win, nullptr); m_toolBars.insert(settingsToolBar->objectName(), settingsToolBar); } @@ -483,8 +573,8 @@ void ToolBarHelper::setupToolBars(MainWindow *p_win, QToolBar *p_toolBar) p_toolBar->setMovable(false); p_win->addToolBar(p_toolBar); - setupQuickAccessToolBar(p_win, p_toolBar); setupFileToolBar(p_win, p_toolBar); + setupQuickAccessToolBar(p_win, p_toolBar); setupSettingsToolBar(p_win, p_toolBar); m_toolBars.insert(p_toolBar->objectName(), p_toolBar); } diff --git a/src/widgets/viewarea.cpp b/src/widgets/viewarea.cpp index ecbc0a48..eb0e113f 100644 --- a/src/widgets/viewarea.cpp +++ b/src/widgets/viewarea.cpp @@ -65,10 +65,8 @@ ViewArea::ViewArea(QWidget *p_parent) close(true); }); - if (ConfigMgr::getInst().getCoreConfig().isRecoverLastSessionOnStartEnabled()) { - connect(mainWindow, &MainWindow::mainWindowStarted, - this, &ViewArea::loadSession); - } + connect(mainWindow, &MainWindow::mainWindowStarted, + this, &ViewArea::loadSession); connect(&VNoteX::getInst(), &VNoteX::nodeAboutToMove, this, &ViewArea::handleNodeChange); @@ -1024,8 +1022,14 @@ QList ViewArea::getAllBuffersInViewSplits() const void ViewArea::loadSession() { auto &sessionConfig = ConfigMgr::getInst().getSessionConfig(); + // Clear it if recover is disabled. auto sessionData = sessionConfig.getViewAreaSessionAndClear(); + if (!ConfigMgr::getInst().getCoreConfig().isRecoverLastSessionOnStartEnabled()) { + showSceneWidget(); + return; + } + auto session = ViewAreaSession::deserialize(sessionData); // Load widgets layout. diff --git a/src/widgets/widgets.pri b/src/widgets/widgets.pri index f0da8f2c..76c857a2 100644 --- a/src/widgets/widgets.pri +++ b/src/widgets/widgets.pri @@ -19,6 +19,7 @@ SOURCES += \ $$PWD/dialogs/settings/editorpage.cpp \ $$PWD/dialogs/settings/generalpage.cpp \ $$PWD/dialogs/settings/markdowneditorpage.cpp \ + $$PWD/dialogs/settings/quickaccesspage.cpp \ $$PWD/dialogs/settings/settingspage.cpp \ $$PWD/dialogs/settings/settingsdialog.cpp \ $$PWD/dialogs/settings/texteditorpage.cpp \ @@ -43,6 +44,7 @@ SOURCES += \ $$PWD/lineedit.cpp \ $$PWD/lineeditdelegate.cpp \ $$PWD/listwidget.cpp \ + $$PWD/locationinputwithbrowsebutton.cpp \ $$PWD/locationlist.cpp \ $$PWD/mainwindow.cpp \ $$PWD/markdownviewwindow.cpp \ @@ -112,6 +114,7 @@ HEADERS += \ $$PWD/dialogs/settings/editorpage.h \ $$PWD/dialogs/settings/generalpage.h \ $$PWD/dialogs/settings/markdowneditorpage.h \ + $$PWD/dialogs/settings/quickaccesspage.h \ $$PWD/dialogs/settings/settingspage.h \ $$PWD/dialogs/settings/settingsdialog.h \ $$PWD/dialogs/settings/texteditorpage.h \ @@ -136,6 +139,7 @@ HEADERS += \ $$PWD/lineedit.h \ $$PWD/lineeditdelegate.h \ $$PWD/listwidget.h \ + $$PWD/locationinputwithbrowsebutton.h \ $$PWD/locationlist.h \ $$PWD/mainwindow.h \ $$PWD/markdownviewwindow.h \ diff --git a/src/widgets/widgetsfactory.cpp b/src/widgets/widgetsfactory.cpp index 9ede5c92..36891346 100644 --- a/src/widgets/widgetsfactory.cpp +++ b/src/widgets/widgetsfactory.cpp @@ -95,3 +95,9 @@ QPlainTextEdit *WidgetsFactory::createPlainTextConsole(QWidget *p_parent) edit->setLineWrapMode(QPlainTextEdit::WidgetWidth); return edit; } + +QPlainTextEdit *WidgetsFactory::createPlainTextEdit(QWidget *p_parent) +{ + auto edit = new QPlainTextEdit(p_parent); + return edit; +} diff --git a/src/widgets/widgetsfactory.h b/src/widgets/widgetsfactory.h index 4bb9e5a6..9966d51b 100644 --- a/src/widgets/widgetsfactory.h +++ b/src/widgets/widgetsfactory.h @@ -44,6 +44,8 @@ namespace vnotex static QFormLayout *createFormLayout(QWidget *p_parent = nullptr); static QPlainTextEdit *createPlainTextConsole(QWidget *p_parent = nullptr); + + static QPlainTextEdit *createPlainTextEdit(QWidget *p_parent = nullptr); }; } // ns vnotex