1. PlantUmlWebService override;
2. Shortcut to clear highlights;
3. Save ViewArea session on minimized to system tray;
4. Prompt for restart after Settings
This commit is contained in:
Le Tan 2022-03-31 21:21:15 +08:00
parent ecce8d13c1
commit 8a1bd930eb
24 changed files with 156 additions and 15 deletions

View File

@ -61,6 +61,7 @@ namespace vnotex
Tag,
Debug,
Print,
ClearHighlights,
MaxShortcut
};
Q_ENUM(Shortcut)

View File

@ -20,6 +20,7 @@ QString WebGlobalOptions::toJavascriptObject() const
{
return QStringLiteral("window.vxOptions = {\n")
+ QString("webPlantUml: %1,\n").arg(Utils::boolToString(m_webPlantUml))
+ QString("plantUmlWebService: '%1',\n").arg(m_plantUmlWebService)
+ QString("webGraphviz: %1,\n").arg(Utils::boolToString(m_webGraphviz))
+ QString("mathJaxScript: '%1',\n").arg(m_mathJaxScript)
+ QString("constrainImageWidthEnabled: %1,\n").arg(Utils::boolToString(m_constrainImageWidthEnabled))
@ -213,6 +214,7 @@ QString HtmlTemplateHelper::generateMarkdownViewerTemplate(const MarkdownEditorC
{
WebGlobalOptions opts;
opts.m_webPlantUml = p_config.getWebPlantUml();
opts.m_plantUmlWebService = p_config.getPlantUmlWebService();
opts.m_webGraphviz = p_config.getWebGraphviz();
opts.m_mathJaxScript = p_config.getMathJaxScript();
opts.m_sectionNumberEnabled = p_config.getSectionNumberMode() == MarkdownEditorConfig::SectionNumberMode::Read;

View File

@ -13,6 +13,8 @@ namespace vnotex
{
bool m_webPlantUml = true;
QString m_plantUmlWebService;
bool m_webGraphviz = true;
QString m_mathJaxScript;

View File

@ -35,6 +35,8 @@ void MarkdownEditorConfig::init(const QJsonObject &p_app, const QJsonObject &p_u
m_plantUmlCommand = READSTR(QStringLiteral("plantuml_command"));
m_plantUmlWebService = READSTR(QStringLiteral("plantuml_web_service"));
m_webGraphviz = READBOOL(QStringLiteral("web_graphviz"));
m_graphvizExe = READSTR(QStringLiteral("graphviz_exe"));
@ -90,6 +92,7 @@ QJsonObject MarkdownEditorConfig::toJson() const
obj[QStringLiteral("web_plantuml")] = m_webPlantUml;
obj[QStringLiteral("plantuml_jar")] = m_plantUmlJar;
obj[QStringLiteral("plantuml_command")] = m_plantUmlCommand;
obj[QStringLiteral("plantuml_web_service")] = m_plantUmlWebService;
obj[QStringLiteral("web_graphviz")] = m_webGraphviz;
obj[QStringLiteral("graphviz_exe")] = m_graphvizExe;
obj[QStringLiteral("mathjax_script")] = m_mathJaxScript;
@ -238,6 +241,16 @@ const QString &MarkdownEditorConfig::getPlantUmlCommand() const
return m_plantUmlCommand;
}
const QString &MarkdownEditorConfig::getPlantUmlWebService() const
{
return m_plantUmlWebService;
}
void MarkdownEditorConfig::setPlantUmlWebService(const QString &p_service)
{
updateConfig(m_plantUmlWebService, p_service, this);
}
bool MarkdownEditorConfig::getWebGraphviz() const
{
return m_webGraphviz;
@ -280,9 +293,7 @@ bool MarkdownEditorConfig::getConfirmBeforeClearObsoleteImages() const
void MarkdownEditorConfig::setConfirmBeforeClearObsoleteImages(bool p_confirm)
{
updateConfig(m_confirmBeforeClearObsoleteImages,
p_confirm,
this);
updateConfig(m_confirmBeforeClearObsoleteImages, p_confirm, this);
}
bool MarkdownEditorConfig::getInsertFileNameAsTitle() const

View File

@ -70,6 +70,9 @@ namespace vnotex
const QString &getPlantUmlCommand() const;
const QString &getPlantUmlWebService() const;
void setPlantUmlWebService(const QString &p_service);
bool getWebGraphviz() const;
void setWebGraphviz(bool p_enabled);
@ -185,6 +188,9 @@ namespace vnotex
// %1: the format to render in.
QString m_plantUmlCommand;
// PlantUml Web service to override that in plantuml.js file.
QString m_plantUmlWebService;
bool m_webGraphviz = true;
// Graphviz executable file.

View File

@ -208,7 +208,8 @@
"ApplySnippet" : "Ctrl+G, I",
"Tag" : "Ctrl+G, B",
"Debug" : "F12",
"Print" : ""
"Print" : "",
"ClearHighlights" : "Ctrl+G, Space"
},
"spell_check_auto_detect_language" : false,
"spell_check_default_dictionary" : "en_US",
@ -401,6 +402,8 @@
"//commnet" : "Command to render PlantUML via stdin and stdout (overrides plantuml_jar)",
"//commnet" : "- %1: the format to render in",
"plantuml_command" : "",
"//commnet" : "PlantUml Web service to use",
"plantuml_web_service" : "",
"//comment" : "Whether use javascript or external program to render Graphviz",
"web_graphviz" : true,
"//commnet" : "Local Graphviz executable file to render Graphviz",

View File

@ -34,6 +34,18 @@ class PlantUml extends GraphRenderer {
}
}
initialize(p_callback) {
if (super.initialized) {
return true;
}
if (!!window.vxOptions.plantUmlWebService) {
this.serverUrl = window.vxOptions.plantUmlWebService;
console.log('override PlantUml Web service', this.serverUrl);
}
return super.initialize(p_callback);
}
// Interface 1.
render(p_node, p_format) {

View File

@ -62,7 +62,7 @@ bool FileAssociationPage::saveInternal()
if (name.isEmpty()) {
continue;
}
auto suffixes = lineEdit->text().split(c_suffixSeparator, Qt::SkipEmptyParts);
auto suffixes = lineEdit->text().split(c_suffixSeparator, QString::SkipEmptyParts);
fileTypeSuffixes.push_back(CoreConfig::FileTypeSuffix(name, Utils::toLower(suffixes)));
}

View File

@ -104,6 +104,8 @@ void MarkdownEditorPage::loadInternal()
m_plantUmlJarFileInput->setText(markdownConfig.getPlantUmlJar());
m_plantUmlWebServiceLineEdit->setText(markdownConfig.getPlantUmlWebService());
{
int idx = m_graphvizModeComboBox->findData(markdownConfig.getWebGraphviz() ? 0 : 1);
m_graphvizModeComboBox->setCurrentIndex(idx);
@ -189,6 +191,8 @@ bool MarkdownEditorPage::saveInternal()
markdownConfig.setPlantUmlJar(m_plantUmlJarFileInput->text());
markdownConfig.setPlantUmlWebService(m_plantUmlWebServiceLineEdit->text());
markdownConfig.setWebGraphviz(m_graphvizModeComboBox->currentData().toInt() == 0);
markdownConfig.setGraphvizExe(m_graphvizFileInput->text());
@ -468,9 +472,9 @@ QGroupBox *MarkdownEditorPage::setupGeneralGroup()
{
m_plantUmlModeComboBox = WidgetsFactory::createComboBox(box);
m_plantUmlModeComboBox->setToolTip(tr("Use online service or local JAR file to render PlantUml graphs"));
m_plantUmlModeComboBox->setToolTip(tr("Use Web service or local JAR file to render PlantUml graphs"));
m_plantUmlModeComboBox->addItem(tr("Online Service"), 0);
m_plantUmlModeComboBox->addItem(tr("Web Service"), 0);
m_plantUmlModeComboBox->addItem(tr("Local JAR"), 1);
const QString label(tr("PlantUml:"));
@ -527,10 +531,21 @@ QGroupBox *MarkdownEditorPage::setupGeneralGroup()
}
{
m_graphvizModeComboBox = WidgetsFactory::createComboBox(box);
m_graphvizModeComboBox->setToolTip(tr("Use online service or local executable file to render Graphviz graphs"));
m_plantUmlWebServiceLineEdit = WidgetsFactory::createLineEdit(box);
m_plantUmlWebServiceLineEdit->setToolTip(tr("Override the Web service used to render PlantUml graphs"));
m_graphvizModeComboBox->addItem(tr("Online Service"), 0);
const QString label(tr("PlantUml Web service:"));
layout->addRow(label, m_plantUmlWebServiceLineEdit);
addSearchItem(label, m_plantUmlWebServiceLineEdit->toolTip(), m_plantUmlWebServiceLineEdit);
connect(m_plantUmlWebServiceLineEdit, &QLineEdit::textChanged,
this, &MarkdownEditorPage::pageIsChanged);
}
{
m_graphvizModeComboBox = WidgetsFactory::createComboBox(box);
m_graphvizModeComboBox->setToolTip(tr("Use Web service or local executable file to render Graphviz graphs"));
m_graphvizModeComboBox->addItem(tr("Web Service"), 0);
m_graphvizModeComboBox->addItem(tr("Local Executable"), 1);
const QString label(tr("Graphviz:"));

View File

@ -79,6 +79,8 @@ namespace vnotex
LocationInputWithBrowseButton *m_plantUmlJarFileInput = nullptr;
QLineEdit *m_plantUmlWebServiceLineEdit = nullptr;
QComboBox *m_graphvizModeComboBox = nullptr;
LocationInputWithBrowseButton *m_graphvizFileInput = nullptr;

View File

@ -13,6 +13,8 @@
#include <widgets/lineedit.h>
#include <widgets/widgetsfactory.h>
#include <widgets/propertydefs.h>
#include <widgets/messageboxhelper.h>
#include <widgets/mainwindow.h>
#include <utils/widgetutils.h>
#include <core/vnotex.h>
@ -37,6 +39,9 @@ SettingsDialog::SettingsDialog(QWidget *p_parent)
setupUI();
setupPages();
connect(this, &QDialog::finished,
this, &SettingsDialog::checkOnFinish);
}
void SettingsDialog::setupUI()
@ -315,3 +320,25 @@ void SettingsDialog::search()
return true;
});
}
void SettingsDialog::checkOnFinish()
{
// Check whether need to prompt for restart.
forEachPage([this](const SettingsPage *p_page) {
if (p_page->isRestartNeeded()) {
// Restart VNote.
int ret = MessageBoxHelper::questionYesNo(MessageBoxHelper::Type::Information,
tr("A restart of VNote may be needed to make changes take effect. Restart VNote now?"),
QString(),
QString(),
this);
if (ret == QMessageBox::Yes) {
QMetaObject::invokeMethod(VNoteX::getInst().getMainWindow(),
&MainWindow::restart,
Qt::QueuedConnection);
}
return false;
}
return true;
});
}

View File

@ -53,6 +53,8 @@ namespace vnotex
void search();
void checkOnFinish();
QLineEdit *m_searchEdit = nullptr;
TreeWidget *m_pageExplorer = nullptr;

View File

@ -78,6 +78,8 @@ bool SettingsPage::save()
if (saveInternal()) {
m_changed = false;
// TODO: may need finer-grain check.
m_restartNeeded = true;
return true;
}
@ -102,3 +104,8 @@ void SettingsPage::setError(const QString &p_err)
{
m_error = p_err;
}
bool SettingsPage::isRestartNeeded() const
{
return m_restartNeeded;
}

View File

@ -25,6 +25,8 @@ namespace vnotex
const QString &error() const;
bool isRestartNeeded() const;
signals:
void changed();
@ -64,6 +66,8 @@ namespace vnotex
bool m_changed = false;
bool m_restartNeeded = false;
QString m_error;
};
}

View File

@ -389,6 +389,7 @@ void MainWindow::closeEvent(QCloseEvent *p_event)
showNormal();
}
}
saveStateAndGeometry();
}
@ -408,6 +409,8 @@ void MainWindow::closeEvent(QCloseEvent *p_event)
FramelessMainWindowImpl::closeEvent(p_event);
qApp->exit(exitCode > -1 ? exitCode : 0);
} else {
emit minimizedToSystemTray();
hide();
p_event->ignore();
if (needShowMessage) {

View File

@ -85,6 +85,8 @@ namespace vnotex
// @m_response of @p_event: true to continue the close, false to stop the close.
void mainWindowClosed(const QSharedPointer<Event> &p_event);
void minimizedToSystemTray();
// No user interaction is available.
void mainWindowClosedOnQuit();

View File

@ -1025,10 +1025,19 @@ void MarkdownViewWindow::handleReplaceAll(const QString &p_text, FindOptions p_o
void MarkdownViewWindow::handleFindAndReplaceWidgetClosed()
{
if (m_editor) {
TextViewWindowHelper::handleFindAndReplaceWidgetClosed(this);
} else {
if (isReadMode()) {
adapter()->findText(QStringList(), FindOption::FindNone);
} else {
TextViewWindowHelper::clearSearchHighlights(this);
}
}
void MarkdownViewWindow::clearHighlights()
{
if (isReadMode()) {
adapter()->findText(QStringList(), FindOption::FindNone);
} else {
TextViewWindowHelper::clearSearchHighlights(this);
}
}

View File

@ -86,6 +86,8 @@ namespace vnotex
void print() Q_DECL_OVERRIDE;
void clearHighlights() Q_DECL_OVERRIDE;
protected:
void syncEditorFromBuffer() Q_DECL_OVERRIDE;

View File

@ -241,7 +241,7 @@ void TextViewWindow::handleReplaceAll(const QString &p_text, FindOptions p_optio
void TextViewWindow::handleFindAndReplaceWidgetClosed()
{
TextViewWindowHelper::handleFindAndReplaceWidgetClosed(this);
TextViewWindowHelper::clearSearchHighlights(this);
}
void TextViewWindow::updateEditorFromConfig()
@ -317,3 +317,8 @@ void TextViewWindow::print()
m_editor->getTextEdit()->print(printer.data());
}
}
void TextViewWindow::clearHighlights()
{
TextViewWindowHelper::clearSearchHighlights(this);
}

View File

@ -70,6 +70,8 @@ namespace vnotex
QPoint getFloatingWidgetPosition() Q_DECL_OVERRIDE;
void clearHighlights() Q_DECL_OVERRIDE;
private:
void setupUI();

View File

@ -213,7 +213,7 @@ namespace vnotex
}
template <typename _ViewWindow>
static void handleFindAndReplaceWidgetClosed(_ViewWindow *p_win)
static void clearSearchHighlights(_ViewWindow *p_win)
{
p_win->m_editor->clearIncrementalSearchHighlight();
p_win->m_editor->clearSearchHighlight();

View File

@ -67,6 +67,13 @@ ViewArea::ViewArea(QWidget *p_parent)
p_event->m_handled = true;
}
});
connect(mainWindow, &MainWindow::minimizedToSystemTray,
this, [this]() {
if (ConfigMgr::getInst().getCoreConfig().isRecoverLastSessionOnStartEnabled()) {
// Save it here, too. Avoid losing session when VNote is closed unexpectedly.
saveSession();
}
});
connect(mainWindow, &MainWindow::mainWindowClosedOnQuit,
this, [this]() {

View File

@ -1001,6 +1001,17 @@ void ViewWindow::setupShortcuts()
});
}
}
// ClearHighlights.
{
auto shortcut = WidgetUtils::createShortcut(editorConfig.getShortcut(EditorConfig::ClearHighlights), this, Qt::WidgetWithChildrenShortcut);
if (shortcut) {
connect(shortcut, &QShortcut::activated,
this, [this]() {
clearHighlights();
});
}
}
}
void ViewWindow::wheelEvent(QWheelEvent *p_event)
@ -1345,3 +1356,7 @@ void ViewWindow::print()
{
qWarning() << "print is not supported";
}
void ViewWindow::clearHighlights()
{
}

View File

@ -256,6 +256,8 @@ namespace vnotex
virtual void updateViewModeMenu(QMenu *p_menu);
virtual void clearHighlights();
static QToolBar *createToolBar(QWidget *p_parent = nullptr);
// The revision of the buffer of the last sync content.