Изменение местоположения стандартной плитки "Удалить"
Изменение местоположения стандартной плитки “Удалить”¶
Допустим, плитку “Удалить”, доступную для открытой карточки, требуется переместить из подгруппы “Другие” на верхний уровень боковой панели. Аналогично можно перемещать любые другие плитки, как добавленные в системе, так и настроенные в ваших расширениях.
Для этого надо написать расширение TileExtension
и перегрузить метод InitializingLocal
. В нём для всех карточек, кроме “Удалённая карточка”, плитка “Удалить” перемещается следующим образом: исходная плитка копируется deleteCard.Clone()
и затем скрывается deleteCard.DisableWithCollapsing()
. Плитка-копия размещается на верхнем уровне левой боковой панели.
using System.Threading.Tasks;
using Tessa.Cards;
using Tessa.Extensions.Platform.Client.Tiles;
using Tessa.Platform;
using Tessa.UI;
using Tessa.UI.Cards;
using Tessa.UI.Tiles;
using Tessa.UI.Tiles.Extensions;
// ...
public sealed class RelocateDeleteCardTileExtension : TileExtension
{
public override Task InitializingLocal(ITileLocalExtensionContext context)
{
// игнорируем тип карточки "Удалённая карточка", в котором плитка "Удалить" уже перемещена
ITilePanel panel = context.Workspace.LeftPanel;
ICardModel model;
ICardEditorModel editor = panel.Context.CardEditor;
if (editor == null
|| (model = editor.CardModel) == null
|| model.CardType.ID == CardHelper.DeletedTypeID)
{
return Task.CompletedTask;
}
// получаем плитку "Другие"
ITile cardOthers = panel.Tiles.TryGet(TileNames.CardOthers);
if (cardOthers != null)
{
// в ней плитка "Удалить"
ITile deleteCard = cardOthers.Tiles.TryGet(TileNames.DeleteCard);
if (deleteCard != null)
{
// клонируем её, а старую плитку "отключаем"
ITile clone = deleteCard.Clone();
deleteCard.DisableWithCollapsing();
// плитка будет в нижней части панели над плитками "Системные" и "Другие"
clone.VerticalAlignment = TileVerticalAlignment.Bottom;
clone.Order = -1;
panel.Tiles.Add(clone);
// добавляем тот же хоткей для удаления
clone.Context.AddInputBinding(clone, TileKeys.DeleteCard);
}
}
return Task.CompletedTask;
}
}
Расширение должно быть зарегистрировано на этапе ExtensionStage.AfterPlatform
, т.е. после того, как выполнены платформенные расширения, затрагивающие плитку “Удалить”.
[Registrator]
public sealed class Registrator : RegistratorBase
{
public override void RegisterExtensions(IExtensionContainer extensionContainer)
{
extensionContainer
.RegisterExtension<ITileLocalExtension, RelocateDeleteCardTileExtension>(x => x
.WithOrder(ExtensionStage.AfterPlatform, 1)
.WithSingleton())
;
}
}