Skip to content

Commit

Permalink
Fix issues with inserting mime data with tables
Browse files Browse the repository at this point in the history
  • Loading branch information
dimkanovikov committed Dec 12, 2022
1 parent de2f5f0 commit ba78cbf
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 3 deletions.
72 changes: 69 additions & 3 deletions src/corelib/business_layer/model/text/text_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1201,6 +1201,7 @@ int TextModel::insertFromMime(const QModelIndex& _index, int _positionInBlock,
contentReader.readNextStartElement(); // document
contentReader.readNextStartElement();
bool isFirstTextItemHandled = false;
bool isSplitterStartWasCreated = false;
TextModelItem* lastItem = item;
TextModelItem* insertAfterItem = lastItem;
QVector<TextModelItem*> itemsToInsert;
Expand Down Expand Up @@ -1291,17 +1292,82 @@ int TextModel::insertFromMime(const QModelIndex& _index, int _positionInBlock,
}

groupItem = static_cast<TextModelGroupItem*>(insertAfterItem);
};
}
}

newItem = newGroupItem;
} else if (currentTag == xml::kSplitterTag) {
increaseMimeLength();
newItem = createSplitterItem(contentReader);
const auto previousItemType
= insertAfterItem != nullptr ? insertAfterItem->type() : TextModelItemType::Folder;
switch (previousItemType) {
case TextModelItemType::Text: {
QScopedPointer<TextModelSplitterItem> newSplitterItem(
createSplitterItem(contentReader));
const auto textItem = static_cast<TextModelTextItem*>(insertAfterItem);

//
// Если предыдущий элемент уже в таблице, то не нужно ничего создавать тут
//
if (textItem->isInFirstColumn().has_value()) {
break;
}
//
// Если создаётся открывающий элемент, запоним этот нюанс
//
if (newSplitterItem->splitterType() == TextModelSplitterItemType::Start) {
isSplitterStartWasCreated = true;
}
//
// Если создаётся закрывающий элемент, то позволяем этому свершиться,
// только если был создал открывающий, иначе пропускаем его
//
else {
if (!isSplitterStartWasCreated) {
break;
}
//
// ... сбрасываем статус создания открывающего элемента для следующего прохода
//
isSplitterStartWasCreated = false;
}

//
// Если всё прошло успешно, добавляем созданный разделитель
//
increaseMimeLength();
newItem = createSplitterItem();
newItem->copyFrom(newSplitterItem.data());
break;
}

default: {
Q_ASSERT(false);
break;
}
}
} else {
auto newTextItem = createTextItem(contentReader);
increaseMimeLength(newTextItem->text().length());
//
// Смотрим на положение в таблице предыдущего элемента
//
if (insertAfterItem != nullptr && insertAfterItem->type() == TextModelItemType::Text) {
const auto textItem = static_cast<TextModelTextItem*>(insertAfterItem);
//
// ... если он в таблице, то помещаем добавляемый элемент в ту же колонку
//
if (textItem->isInFirstColumn().has_value()) {
newTextItem->setInFirstColumn(textItem->isInFirstColumn());
}
//
// ... если не в таблице, и при вставке не было добавлено таблицы,
// то удаляем информацию о таблице в новом текстовом элементе
//
else if (!isSplitterStartWasCreated) {
newTextItem->setInFirstColumn({});
}
}
//
// Если вставляется текстовый элемент внутрь уже существующего элемента
//
if (!isFirstTextItemHandled) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ void TextModelSplitterItem::copyFrom(TextModelItem* _item)
Q_ASSERT(false);
return;
}

const auto splitterItem = static_cast<TextModelSplitterItem*>(_item);
d->splitterType = splitterItem->splitterType();
}

bool TextModelSplitterItem::isEqual(TextModelItem* _item) const
Expand Down

0 comments on commit ba78cbf

Please sign in to comment.