diff --git a/src/dialog/vdirinfodialog.cpp b/src/dialog/vdirinfodialog.cpp index a93d3d6d..608f0961 100644 --- a/src/dialog/vdirinfodialog.cpp +++ b/src/dialog/vdirinfodialog.cpp @@ -1,16 +1,23 @@ #include #include "vdirinfodialog.h" +#include "vdirectory.h" +#include "vconfigmanager.h" -VDirInfoDialog::VDirInfoDialog(const QString &title, const QString &info, - const QString &defaultName, +extern VConfigManager *g_config; + +VDirInfoDialog::VDirInfoDialog(const QString &title, + const QString &info, + const VDirectory *directory, + VDirectory *parentDirectory, QWidget *parent) - : QDialog(parent), infoLabel(NULL), title(title), info(info), defaultName(defaultName) + : QDialog(parent), infoLabel(NULL), title(title), info(info), + m_directory(directory), m_parentDirectory(parentDirectory) { setupUI(); - connect(nameEdit, &QLineEdit::textChanged, this, &VDirInfoDialog::enableOkButton); + connect(nameEdit, &QLineEdit::textChanged, this, &VDirInfoDialog::handleInputChanged); - enableOkButton(); + handleInputChanged(); } void VDirInfoDialog::setupUI() @@ -19,10 +26,14 @@ void VDirInfoDialog::setupUI() infoLabel = new QLabel(info); } nameLabel = new QLabel(tr("Folder &name:")); - nameEdit = new QLineEdit(defaultName); + nameEdit = new QLineEdit(m_directory->getName()); nameEdit->selectAll(); nameLabel->setBuddy(nameEdit); + m_warnLabel = new QLabel(); + m_warnLabel->setWordWrap(true); + m_warnLabel->hide(); + // Ok is the default button. m_btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(m_btnBox, &QDialogButtonBox::accepted, this, &QDialog::accept); @@ -40,6 +51,7 @@ void VDirInfoDialog::setupUI() mainLayout->addWidget(infoLabel); } mainLayout->addLayout(topLayout); + mainLayout->addWidget(m_warnLabel); mainLayout->addWidget(m_btnBox); mainLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(mainLayout); @@ -47,10 +59,28 @@ void VDirInfoDialog::setupUI() setWindowTitle(title); } -void VDirInfoDialog::enableOkButton() +void VDirInfoDialog::handleInputChanged() { + bool showWarnLabel = false; + QString name = nameEdit->text(); + bool nameOk = !name.isEmpty(); + if (nameOk && name != m_directory->getName()) { + // Check if the name conflicts with existing directory name. + // Case-insensitive when creating note. + if (m_parentDirectory->findSubDirectory(name, false)) { + nameOk = false; + showWarnLabel = true; + QString nameConflictText = tr("WARNING: Name (case-insensitive) already exists. " + "Please choose another name.") + .arg(g_config->c_warningTextStyle); + m_warnLabel->setText(nameConflictText); + } + } + + m_warnLabel->setVisible(showWarnLabel); + QPushButton *okBtn = m_btnBox->button(QDialogButtonBox::Ok); - okBtn->setEnabled(!nameEdit->text().isEmpty()); + okBtn->setEnabled(nameOk); } QString VDirInfoDialog::getNameInput() const diff --git a/src/dialog/vdirinfodialog.h b/src/dialog/vdirinfodialog.h index f3df2b6e..5078b9cc 100644 --- a/src/dialog/vdirinfodialog.h +++ b/src/dialog/vdirinfodialog.h @@ -7,17 +7,22 @@ class QLabel; class QLineEdit; class QDialogButtonBox; class QString; +class VDirectory; class VDirInfoDialog : public QDialog { Q_OBJECT public: - VDirInfoDialog(const QString &title, const QString &info, const QString &defaultName, + VDirInfoDialog(const QString &title, + const QString &info, + const VDirectory *directory, + VDirectory *parentDirectory, QWidget *parent = 0); + QString getNameInput() const; private slots: - void enableOkButton(); + void handleInputChanged(); private: void setupUI(); @@ -25,10 +30,13 @@ private: QLabel *infoLabel; QLabel *nameLabel; QLineEdit *nameEdit; + QLabel *m_warnLabel; QDialogButtonBox *m_btnBox; QString title; QString info; - QString defaultName; + + VDirectory *m_parentDirectory; + const VDirectory *m_directory; }; #endif // VDIRINFODIALOG_H diff --git a/src/dialog/vfileinfodialog.cpp b/src/dialog/vfileinfodialog.cpp index 1c26469e..b7087770 100644 --- a/src/dialog/vfileinfodialog.cpp +++ b/src/dialog/vfileinfodialog.cpp @@ -65,7 +65,7 @@ void VFileInfoDialog::handleInputChanged() QString name = nameEdit->text(); bool nameOk = !name.isEmpty(); if (nameOk && name != m_file->getName()) { - // Check if the name conflicts with existing notebook name. + // Check if the name conflicts with existing note name. // Case-insensitive when creating note. if (m_directory->findFile(name, false)) { nameOk = false; diff --git a/src/dialog/vnewdirdialog.cpp b/src/dialog/vnewdirdialog.cpp index 89d57f70..353bac8c 100644 --- a/src/dialog/vnewdirdialog.cpp +++ b/src/dialog/vnewdirdialog.cpp @@ -1,13 +1,23 @@ #include #include "vnewdirdialog.h" +#include "vdirectory.h" +#include "vconfigmanager.h" -VNewDirDialog::VNewDirDialog(const QString &title, const QString &info, const QString &name, const QString &defaultName, +extern VConfigManager *g_config; + +VNewDirDialog::VNewDirDialog(const QString &title, + const QString &info, + const QString &defaultName, + VDirectory *directory, QWidget *parent) - : QDialog(parent), title(title), info(info), name(name), defaultName(defaultName) + : QDialog(parent), title(title), info(info), defaultName(defaultName), + m_directory(directory) { setupUI(); - connect(nameEdit, &QLineEdit::textChanged, this, &VNewDirDialog::enableOkButton); + connect(nameEdit, &QLineEdit::textChanged, this, &VNewDirDialog::handleInputChanged); + + handleInputChanged(); } void VNewDirDialog::setupUI() @@ -18,11 +28,15 @@ void VNewDirDialog::setupUI() infoLabel->setWordWrap(true); } - nameLabel = new QLabel(name); + QLabel *nameLabel = new QLabel("Folder &name:"); nameEdit = new QLineEdit(defaultName); nameEdit->selectAll(); nameLabel->setBuddy(nameEdit); + m_warnLabel = new QLabel(); + m_warnLabel->setWordWrap(true); + m_warnLabel->hide(); + // Ok is the default button. m_btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(m_btnBox, &QDialogButtonBox::accepted, this, &QDialog::accept); @@ -40,16 +54,35 @@ void VNewDirDialog::setupUI() mainLayout->addWidget(infoLabel); } mainLayout->addLayout(topLayout); + mainLayout->addWidget(m_warnLabel); mainLayout->addWidget(m_btnBox); mainLayout->setSizeConstraint(QLayout::SetFixedSize); setLayout(mainLayout); setWindowTitle(title); } -void VNewDirDialog::enableOkButton(const QString &editText) +void VNewDirDialog::handleInputChanged() { + bool showWarnLabel = false; + QString name = nameEdit->text(); + bool nameOk = !name.isEmpty(); + if (nameOk) { + // Check if the name conflicts with existing directory name. + // Case-insensitive when creating folder. + if (m_directory->findSubDirectory(name, false)) { + nameOk = false; + showWarnLabel = true; + QString nameConflictText = tr("WARNING: Name (case-insensitive) already exists. " + "Please choose another name.") + .arg(g_config->c_warningTextStyle); + m_warnLabel->setText(nameConflictText); + } + } + + m_warnLabel->setVisible(showWarnLabel); + QPushButton *okBtn = m_btnBox->button(QDialogButtonBox::Ok); - okBtn->setEnabled(!editText.isEmpty()); + okBtn->setEnabled(nameOk); } QString VNewDirDialog::getNameInput() const diff --git a/src/dialog/vnewdirdialog.h b/src/dialog/vnewdirdialog.h index bef785df..30ca9727 100644 --- a/src/dialog/vnewdirdialog.h +++ b/src/dialog/vnewdirdialog.h @@ -7,29 +7,36 @@ class QLabel; class QLineEdit; class QDialogButtonBox; class QString; +class VDirectory; class VNewDirDialog : public QDialog { Q_OBJECT public: - VNewDirDialog(const QString &title, const QString &info, const QString &name, - const QString &defaultName, QWidget *parent = 0); + VNewDirDialog(const QString &title, + const QString &info, + const QString &defaultName, + VDirectory *directory, + QWidget *parent = 0); + QString getNameInput() const; private slots: - void enableOkButton(const QString &editText); + void handleInputChanged(); private: void setupUI(); - QLabel *nameLabel; QLineEdit *nameEdit; QDialogButtonBox *m_btnBox; + QLabel *m_warnLabel; + QString title; QString info; - QString name; QString defaultName; + + VDirectory *m_directory; }; #endif // VNEWDIRDIALOG_H diff --git a/src/dialog/vnewfiledialog.cpp b/src/dialog/vnewfiledialog.cpp index 0342ff70..69009ff7 100644 --- a/src/dialog/vnewfiledialog.cpp +++ b/src/dialog/vnewfiledialog.cpp @@ -77,7 +77,7 @@ void VNewFileDialog::handleInputChanged() QString name = nameEdit->text(); bool nameOk = !name.isEmpty(); if (nameOk) { - // Check if the name conflicts with existing notebook name. + // Check if the name conflicts with existing note name. // Case-insensitive when creating note. if (m_directory->findFile(name, false)) { nameOk = false; diff --git a/src/vdirectorytree.cpp b/src/vdirectorytree.cpp index 4da4c6a2..60bb4081 100644 --- a/src/vdirectorytree.cpp +++ b/src/vdirectorytree.cpp @@ -388,35 +388,24 @@ void VDirectoryTree::newSubDirectory() QString info = tr("Create a subfolder in %2.") .arg(g_config->c_dataTextStyle).arg(curDir->getName()); - QString text(tr("Folder &name:")); - QString defaultText("new_folder"); + QString defaultName("new_folder"); + defaultName = VUtils::getFileNameWithSequence(curDir->fetchPath(), defaultName); + VNewDirDialog dialog(tr("Create Folder"), info, defaultName, curDir, this); + if (dialog.exec() == QDialog::Accepted) { + QString name = dialog.getNameInput(); - do { - VNewDirDialog dialog(tr("Create Folder"), info, text, defaultText, this); - if (dialog.exec() == QDialog::Accepted) { - QString name = dialog.getNameInput(); - // Case-insensitive. - if (curDir->findSubDirectory(name, false)) { - info = tr("Name (case-insensitive) already exists in " - "%2. Please choose another name.") - .arg(g_config->c_dataTextStyle).arg(curDir->getName()); - defaultText = name; - continue; - } - - VDirectory *subDir = curDir->createSubDirectory(name); - if (!subDir) { - VUtils::showMessage(QMessageBox::Warning, tr("Warning"), - tr("Fail to create folder %2.") - .arg(g_config->c_dataTextStyle).arg(name), "", - QMessageBox::Ok, QMessageBox::Ok, this); - return; - } - updateItemChildren(curItem); - locateDirectory(subDir); + VDirectory *subDir = curDir->createSubDirectory(name); + if (!subDir) { + VUtils::showMessage(QMessageBox::Warning, tr("Warning"), + tr("Fail to create folder %2.") + .arg(g_config->c_dataTextStyle).arg(name), "", + QMessageBox::Ok, QMessageBox::Ok, this); + return; } - break; - } while (true); + + updateItemChildren(curItem); + locateDirectory(subDir); + } } void VDirectoryTree::newRootDirectory() @@ -426,33 +415,25 @@ void VDirectoryTree::newRootDirectory() } QString info = tr("Create a root folder in notebook %2.") .arg(g_config->c_dataTextStyle).arg(m_notebook->getName()); - QString text(tr("Folder &name:")); - QString defaultText("new_folder"); VDirectory *rootDir = m_notebook->getRootDir(); - do { - VNewDirDialog dialog(tr("Create Root Folder"), info, text, defaultText, this); - if (dialog.exec() == QDialog::Accepted) { - QString name = dialog.getNameInput(); - if (rootDir->findSubDirectory(name, false)) { - info = tr("Name (case-insensitive) already exists in " - "notebook %2. Please choose another name.") - .arg(g_config->c_dataTextStyle).arg(m_notebook->getName()); - defaultText = name; - continue; - } - VDirectory *subDir = rootDir->createSubDirectory(name); - if (!subDir) { - VUtils::showMessage(QMessageBox::Warning, tr("Warning"), - tr("Fail to create folder %2.") - .arg(g_config->c_dataTextStyle).arg(name), "", - QMessageBox::Ok, QMessageBox::Ok, this); - return; - } - updateItemChildren(NULL); - locateDirectory(subDir); + QString defaultName("new_folder"); + defaultName = VUtils::getFileNameWithSequence(rootDir->fetchPath(), defaultName); + VNewDirDialog dialog(tr("Create Root Folder"), info, defaultName, rootDir, this); + if (dialog.exec() == QDialog::Accepted) { + QString name = dialog.getNameInput(); + + VDirectory *subDir = rootDir->createSubDirectory(name); + if (!subDir) { + VUtils::showMessage(QMessageBox::Warning, tr("Warning"), + tr("Fail to create folder %2.") + .arg(g_config->c_dataTextStyle).arg(name), "", + QMessageBox::Ok, QMessageBox::Ok, this); + return; } - break; - } while (true); + + updateItemChildren(NULL); + locateDirectory(subDir); + } } void VDirectoryTree::deleteDirectory() @@ -503,36 +484,26 @@ void VDirectoryTree::editDirectoryInfo() VDirectory *curDir = getVDirectory(curItem); VDirectory *parentDir = curDir->getParentDirectory(); QString curName = curDir->getName(); - QString info; - QString defaultName = curName; - do { - VDirInfoDialog dialog(tr("Folder Information"), info, defaultName, this); - if (dialog.exec() == QDialog::Accepted) { - QString name = dialog.getNameInput(); - if (name == curName) { - return; - } - - if (parentDir->findSubDirectory(name, false)) { - info = "Name (case-insensitive) already exists. Please choose another name."; - defaultName = name; - continue; - } - - if (!curDir->rename(name)) { - VUtils::showMessage(QMessageBox::Warning, tr("Warning"), - tr("Fail to rename folder %2.") - .arg(g_config->c_dataTextStyle).arg(curName), "", - QMessageBox::Ok, QMessageBox::Ok, this); - return; - } - curItem->setText(0, name); - curItem->setToolTip(0, name); - emit directoryUpdated(curDir); + VDirInfoDialog dialog(tr("Folder Information"), "", curDir, parentDir, this); + if (dialog.exec() == QDialog::Accepted) { + QString name = dialog.getNameInput(); + if (name == curName) { + return; } - break; - } while (true); + + if (!curDir->rename(name)) { + VUtils::showMessage(QMessageBox::Warning, tr("Warning"), + tr("Fail to rename folder %2.") + .arg(g_config->c_dataTextStyle).arg(curName), "", + QMessageBox::Ok, QMessageBox::Ok, this); + return; + } + + curItem->setText(0, name); + curItem->setToolTip(0, name); + emit directoryUpdated(curDir); + } } void VDirectoryTree::openDirectoryLocation() const