Перейти к содержанию

Расширение на контекстное меню файла в карточке

Расширение на контекстное меню файла в карточке

Допустим, требуется написать расширение, изменяющее категорию сразу нескольких выделенных файлов при условии, что система умеет изменять категорию только единственного файла (в текущей версии). Для этого надо написать расширение на меню файла IFileExtension, в котором добавить MenuAction для действия, и указать его видимость в параметре isCollapsed.

Note

Начиная со сборки 2.4 уже присутствует функционал по изменению категории для нескольких выбранных файлов. Приведённое расширение следует рассматривать как пример реализации такого функционала, в проектных расширения добавлять его не следует.

using Tessa.Files; using Tessa.UI; using Tessa.UI.Files; using Tessa.UI.Files.Controls; using Tessa.UI.Menu;

public sealed class ChangeCategoryMultipleFileExtension : FileExtension { public override void OpeningMenu(IFileExtensionContext context) { context.Actions.Add( new MenuAction( "ChangeCategoryMultiple", "$UI_Controls_FilesControl_ChangeCategory", context.Icons.Get("Thin131"), new DelegateCommand(o => ChangeFileCategoryMultiple(context.Control, context.Files)), isCollapsed: !context.Control.IsCategoriesEnabled || context.Files.Count < 2 || context.Files.Any(file => !file.Permissions.CanModifyCategory)));

}

private static void ChangeFileCategoryMultiple(IFileControl control, IFileCollection files) { bool categoryIsCanceled; IFileCategory category = FileControlHelper.SelectFileCategory(control, false, out categoryIsCanceled);

if (categoryIsCanceled) { return; }

var totalResult = new ValidationResultBuilder();

foreach (IFile file in files) { ValidationResult result = file.ChangeCategory(category); totalResult.Add(result); }

TessaDialog.ShowNotEmpty(totalResult.Build()); } }

Important

Метод расширения OpeningMenu будет вызван каждый раз при открытии контекстного меню, поэтому обращаться на сервер в этом методе крайне не рекомендуется. Но любой вызов сервера можно выполнить внутри команды DelegateCommand, при этом интерфейсы сервисов можно получить через конструктор.

Код регистрации:

using Tessa.Extensions; using Tessa.UI.Files;

[Registrator] public sealed class Registrator : RegistratorBase { public override void RegisterExtensions(IExtensionContainer extensionContainer) { extensionContainer .RegisterExtension<IFileExtension, ChangeCategoryMultipleFileExtension>(x => x .WithOrder(ExtensionStage.AfterPlatform, 1) .WithSingleton()) ; } }

Расширения на меню контрола файлов IFileControlExtension и на меню версии файла IFileVersionExtension пишутся аналогичным образом.

Back to top