at the same level, a document and a folder can share the same name

preferencesAboutTextFull
Clément Fauconnier 3 years ago
parent e993b146d4
commit 7466b60778
  1. 59
      src/document/UBDocumentController.cpp
  2. 16
      src/document/UBDocumentController.h

@ -1034,6 +1034,16 @@ QString UBDocumentTreeModel::virtualPathForIndex(const QModelIndex &pIndex) cons
return virtualDirForIndex(pIndex) + "/" + curNode->nodeName();
}
QList<UBDocumentTreeNode*> UBDocumentTreeModel::nodeChildrenFromIndex(const QModelIndex &pIndex) const
{
UBDocumentTreeNode *node = nodeFromIndex(pIndex);
if (node)
return node->children();
else
return QList<UBDocumentTreeNode*>();
}
QStringList UBDocumentTreeModel::nodeNameList(const QModelIndex &pIndex, bool distinctNodeType) const
{
QStringList result;
@ -1668,16 +1678,22 @@ void UBDocumentTreeItemDelegate::commitAndCloseEditor()
void UBDocumentTreeItemDelegate::processChangedText(const QString &str) const
{
QLineEdit *editor = qobject_cast<QLineEdit*>(sender());
if (!editor) {
return;
}
if (!validateString(str)) {
if (editor)
{
if (editor->validator())
{
int pos = 0;
if (editor->validator()->validate(const_cast<QString&>(str), pos) != QValidator::Acceptable)
{
editor->setStyleSheet("background-color: #FFB3C8;");
} else {
}
else
{
editor->setStyleSheet("background-color: #FFFFFF;");
}
}
}
}
bool UBDocumentTreeItemDelegate::validateString(const QString &str) const
{
@ -1702,18 +1718,30 @@ QWidget *UBDocumentTreeItemDelegate::createEditor(QWidget *parent, const QStyleO
QModelIndex sourceIndex = proxy->mapToSource(index);
if (docModel) {
if (docModel)
{
mExistingFileNames = docModel->nodeNameList(sourceIndex.parent());
mExistingFileNames.removeOne(sourceIndex.data().toString());
}
UBDocumentTreeNode* sourceNode = docModel->nodeFromIndex(sourceIndex);
if (sourceNode)
{
QLineEdit *nameEditor = new QLineEdit(parent);
UBValidator* validator = new UBValidator(mExistingFileNames);
QList<UBDocumentTreeNode*> nodeChildren = docModel->nodeChildrenFromIndex(sourceIndex.parent());
nodeChildren.removeOne(sourceNode);
UBValidator* validator = new UBValidator(nodeChildren, sourceNode->nodeType());
nameEditor->setValidator(validator);
connect(nameEditor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor()));
connect(nameEditor, SIGNAL(textChanged(QString)), this, SLOT(processChangedText(QString)));
return nameEditor;
}
}
return nullptr;
}
//N/C - NNe - 20140407 : the other column are not editable.
return 0;
@ -1731,8 +1759,17 @@ void UBDocumentTreeItemDelegate::setEditorData(QWidget *editor, const QModelInde
void UBDocumentTreeItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QLineEdit *lineEditor = qobject_cast<QLineEdit*>(editor);
if (validateString(lineEditor->text())) {
model->setData(index, lineEditor->text());
if (lineEditor)
{
int pos;
QString input = lineEditor->text();
if (lineEditor->validator())
{
if (lineEditor->validator()->validate(input, pos) == QValidator::Acceptable)
{
model->setData(index, input);
}
}
}
}

@ -210,6 +210,7 @@ public:
QString virtualDirForIndex(const QModelIndex &pIndex) const;
QString virtualPathForIndex(const QModelIndex &pIndex) const;
QStringList nodeNameList(const QModelIndex &pIndex, bool distinctNodeType = false) const;
QList<UBDocumentTreeNode*> nodeChildrenFromIndex(const QModelIndex &pIndex) const;
bool newNodeAllowed(const QModelIndex &pSelectedIndex) const;
QModelIndex goTo(const QString &dir);
bool inTrash(const QModelIndex &index) const;
@ -324,21 +325,26 @@ private:
class UBValidator : public QValidator
{
const QStringList mExistingFileNames;
const QList<UBDocumentTreeNode*> mExistingNodes;
UBDocumentTreeNode::Type mEditedNodeType;
public:
UBValidator(const QStringList existingFileNames, QObject *parent = nullptr)
UBValidator(const QList<UBDocumentTreeNode*> existingNodes, UBDocumentTreeNode::Type editedNodeType, QObject *parent = nullptr)
: QValidator(parent)
, mExistingFileNames(existingFileNames)
, mExistingNodes(existingNodes)
, mEditedNodeType(editedNodeType)
{
}
QValidator::State validate(QString &input, int &pos) const
{
if (mExistingFileNames.contains(input))
for (auto node : mExistingNodes)
{
if (node->nodeName() == input && node->nodeType() == mEditedNodeType)
return QValidator::Intermediate;
else
}
return QValidator::Acceptable;
}
};

Loading…
Cancel
Save