| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- #include "newnotedialog.h"
- #include <QHBoxLayout>
- #include <QLineEdit>
- #include <QComboBox>
- #include <QFormLayout>
- #include <QPushButton>
- #include <QPlainTextEdit>
- #include "notebook/notebook.h"
- #include "notebook/node.h"
- #include "../widgetsfactory.h"
- #include <utils/pathutils.h>
- #include <utils/fileutils.h>
- #include "exception.h"
- #include "nodeinfowidget.h"
- #include <utils/widgetutils.h>
- #include <core/templatemgr.h>
- #include <snippet/snippetmgr.h>
- using namespace vnotex;
- QString NewNoteDialog::s_lastTemplate;
- NewNoteDialog::NewNoteDialog(Node *p_node, QWidget *p_parent)
- : ScrollDialog(p_parent)
- {
- Q_ASSERT(p_node && p_node->isLoaded());
- setupUI(p_node);
- initDefaultValues(p_node);
- m_infoWidget->getNameLineEdit()->setFocus();
- }
- void NewNoteDialog::setupUI(const Node *p_node)
- {
- setupNodeInfoWidget(p_node, this);
- setCentralWidget(m_infoWidget);
- auto infoLayout = m_infoWidget->getMainLayout();
- {
- auto templateLayout = new QHBoxLayout();
- templateLayout->setContentsMargins(0, 0, 0, 0);
- infoLayout->addRow(tr("Template:"), templateLayout);
- setupTemplateComboBox(m_infoWidget);
- templateLayout->addWidget(m_templateComboBox);
- templateLayout->addStretch();
- auto manageBtn = new QPushButton(tr("Manage"), m_infoWidget);
- templateLayout->addWidget(manageBtn);
- connect(manageBtn, &QPushButton::clicked,
- this, []() {
- WidgetUtils::openUrlByDesktop(QUrl::fromLocalFile(TemplateMgr::getInst().getTemplateFolder()));
- });
- m_templateTextEdit = WidgetsFactory::createPlainTextConsole(m_infoWidget);
- infoLayout->addRow("", m_templateTextEdit);
- m_templateTextEdit->hide();
- }
- setDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
- setWindowTitle(tr("New Note"));
- }
- void NewNoteDialog::setupNodeInfoWidget(const Node *p_node, QWidget *p_parent)
- {
- m_infoWidget = new NodeInfoWidget(p_node, Node::Flag::Content, p_parent);
- }
- bool NewNoteDialog::validateInputs()
- {
- bool valid = true;
- QString msg;
- valid = valid && validateNameInput(msg);
- setInformationText(msg, valid ? ScrollDialog::InformationLevel::Info
- : ScrollDialog::InformationLevel::Error);
- return valid;
- }
- bool NewNoteDialog::validateNameInput(QString &p_msg)
- {
- p_msg.clear();
- auto name = m_infoWidget->getName();
- if (name.isEmpty() || !PathUtils::isLegalFileName(name)) {
- p_msg = tr("Please specify a valid name for the note.");
- return false;
- }
- if (!m_infoWidget->getParentNode()->isLegalNameForNewChild(name)) {
- p_msg = tr("Name conflicts with existing or built-in note.");
- return false;
- }
- return true;
- }
- void NewNoteDialog::acceptedButtonClicked()
- {
- s_lastTemplate = m_templateComboBox->currentData().toString();
- if (validateInputs() && newNote()) {
- accept();
- }
- }
- bool NewNoteDialog::newNote()
- {
- m_newNode.clear();
- Notebook *notebook = const_cast<Notebook *>(m_infoWidget->getNotebook());
- Node *parentNode = const_cast<Node *>(m_infoWidget->getParentNode());
- try {
- m_newNode = notebook->newNode(parentNode,
- Node::Flag::Content,
- m_infoWidget->getName(),
- getTemplateContent());
- } catch (Exception &p_e) {
- QString msg = tr("Failed to create note under (%1) in (%2) (%3).").arg(parentNode->getName(),
- notebook->getName(),
- p_e.what());
- qCritical() << msg;
- setInformationText(msg, ScrollDialog::InformationLevel::Error);
- return false;
- }
- emit notebook->nodeUpdated(m_newNode.data());
- return true;
- }
- const QSharedPointer<Node> &NewNoteDialog::getNewNode() const
- {
- return m_newNode;
- }
- void NewNoteDialog::initDefaultValues(const Node *p_node)
- {
- {
- auto lineEdit = m_infoWidget->getNameLineEdit();
- auto defaultName = FileUtils::generateFileNameWithSequence(p_node->fetchAbsolutePath(),
- tr("note"),
- QStringLiteral("md"));
- lineEdit->setText(defaultName);
- WidgetUtils::selectBaseName(lineEdit);
- }
- if (!s_lastTemplate.isEmpty()) {
- // Restore.
- int idx = m_templateComboBox->findData(s_lastTemplate);
- if (idx != -1) {
- m_templateComboBox->setCurrentIndex(idx);
- } else {
- s_lastTemplate.clear();
- }
- }
- }
- void NewNoteDialog::setupTemplateComboBox(QWidget *p_parent)
- {
- m_templateComboBox = WidgetsFactory::createComboBox(p_parent);
- // None.
- m_templateComboBox->addItem(tr("None"), "");
- int idx = 1;
- auto templates = TemplateMgr::getInst().getTemplates();
- for (const auto &temp : templates) {
- m_templateComboBox->addItem(temp, temp);
- m_templateComboBox->setItemData(idx++, temp, Qt::ToolTipRole);
- }
- m_templateComboBox->setCurrentIndex(0);
- connect(m_templateComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
- this, &NewNoteDialog::updateCurrentTemplate);
- }
- QString NewNoteDialog::getTemplateContent() const
- {
- int cursorOffset = 0;
- return SnippetMgr::getInst().applySnippetBySymbol(m_templateContent,
- QString(),
- cursorOffset,
- SnippetMgr::generateOverrides(m_infoWidget->getName()));
- }
- void NewNoteDialog::updateCurrentTemplate()
- {
- m_templateContent.clear();
- m_templateTextEdit->clear();
- auto temp = m_templateComboBox->currentData().toString();
- if (temp.isEmpty()) {
- m_templateTextEdit->hide();
- return;
- }
- const auto filePath = TemplateMgr::getInst().getTemplateFilePath(temp);
- try {
- m_templateContent = FileUtils::readTextFile(filePath);
- m_templateTextEdit->setPlainText(m_templateContent);
- m_templateTextEdit->show();
- } catch (Exception &p_e) {
- m_templateTextEdit->hide();
- QString msg = tr("Failed to load template (%1) (%2).")
- .arg(filePath, p_e.what());
- qCritical() << msg;
- setInformationText(msg, ScrollDialog::InformationLevel::Error);
- }
- }
|