Создаём карточку, в которую уже скопированы некоторые из данных текущей открытой карточки
Создаём карточку, в которую уже скопированы некоторые из данных текущей открытой карточки¶
Допустим надо сделать контекстную плитку, которая создаёт новую карточку того же типа, для которой она была вызвана, и дополнительно копирует некоторые из полей из исходной карточки в создаваемую, после чего создаваемую карточку нужно открыть в новой вкладке.
Для расширения TileExtension понадобится получить в конструкторе объект IUIHost из Unity и сохранить его значение в поле класса:
using Tessa.Cards;
using Tessa.UI;
using Tessa.UI.Cards;
public CopyCardTileExtension(IUIHost uiHost)
{
this.uiHost = uiHost;
}
private readonly IUIHost uiHost;
Далее в методе Execute команды нужно сделать следующее:
private async void TileCommandActionAsync(object parameter)
{
ITile tile = (ITile)parameter; // плитка, для которой была вызвана команда, передаётся в параметр
ICardModel oldModel = tile.Context.CardEditor.CardModel;
await this.uiHost.CreateCardAsync(
oldModel.CardType.ID,
oldModel.CardType.Name,
new CreateCardOptions()
{
UIContext = tile.Context,
CardModifierActionAsync = ctx =>
{
Card oldCard = oldModel.Card;
Card newCard = ctx.Card;
// здесь выполняем копирование нужных полей из oldCard в newCard
// причём для строк в коллекционных секциях в newCard надо установить состояние
// для каждой строки cardRow.State = CardRowState.Inserted и cardRow.RowID = Guid.NewGuid();
// например, копируем коллекционную секцию таким образом:
CardSection oldSection = oldCard.Sections["SectionName"];
CardSection newSection = newCard.Sections["SectionName"];
newSection.Set(oldSection);
// если секция коллекционная:
foreach (CardRow row in newSection.Rows)
{
row.State = CardRowState.Inserted;
row.RowID = Guid.NewGuid();
}
return ValueTask.CompletedTask;
}
});
}