protected override async Task OnInitialize(ModelDescriptor modelDescriptor, Properties status) { if (!(modelDescriptor is FileDescriptor fileDescriptor)) { throw new InvalidOperationException(); } if (session == null) { Owner = fileDescriptor.Owner; filePath = fileDescriptor.FilePath; DocumentTitle = fileDescriptor.FilePath.FileName; figmaDelegate = new FigmaDesignerDelegate(); var localPath = Path.Combine(filePath.ParentDirectory.FullPath, FigmaBundle.ResourcesDirectoryName); fileProvider = new ControlFileNodeProvider(localPath) { File = filePath.FullPath }; rendererService = new ControlViewRenderingService(fileProvider); //we generate a new file provider for embeded windows var tmpRemoteProvider = new FileNodeProvider(localPath) { File = filePath.FullPath }; rendererService.CustomConverters.Add(new EmbededWindowConverter(tmpRemoteProvider) { LiveButtonAlwaysVisible = false }); rendererService.CustomConverters.Add(new EmbededSheetDialogConverter(tmpRemoteProvider)); layoutManager = new StoryboardLayoutManager(); session = new FigmaDesignerSession(fileProvider, rendererService, layoutManager); //session.ModifiedChanged += HandleModifiedChanged; session.ReloadFinished += Session_ReloadFinished; surface = new FigmaDesignerSurface(figmaDelegate, session) { Session = session }; surface.FocusedViewChanged += Surface_FocusedViewChanged; var window = NSApplication.SharedApplication.MainWindow; surface.SetWindow(new WindowInternalWrapper(window)); surface.StartHoverSelection(); //IdeApp.Workbench.ActiveDocumentChanged += OnActiveDocumentChanged; IdeApp.Workbench.DocumentOpened += OnDocumentOpened; } await RefreshAll(); await base.OnInitialize(modelDescriptor, status); }
static void Example1() { const string fileName = "FwVa4JS5QsohRhNEnEBKslFk"; var fileProvider = new ControlRemoteNodeProvider(); fileProvider.Load(fileName); var rendererService = new ControlViewRenderingService(fileProvider); //we want to include some special converters to handle windows like normal view containers rendererService.CustomConverters.Add(new EmbededSheetDialogConverter(fileProvider)); rendererService.CustomConverters.Add(new EmbededWindowConverter(fileProvider)); rendererService.RenderInWindow(mainWindow); new StoryboardLayoutManager() .Run(mainWindow.Content, rendererService); mainWindow.Center(); }
public override IView ConvertToView(FigmaNode currentNode, ViewNode parentNode, ViewRenderService rendererService) { string title = ""; var frame = (FigmaFrame)currentNode; var nativeView = new FakeWindowView(title); nativeView.LiveButtonAlwaysVisible = LiveButtonAlwaysVisible; nativeView.Configure(currentNode); var view = new View(nativeView); var windowComponent = currentNode.GetDialogInstanceFromParentContainer(); if (windowComponent != null) { var optionsNode = windowComponent.Options(); if (optionsNode is IFigmaNodeContainer figmaNodeContainer) { nativeView.CloseButtonHidden = (figmaNodeContainer.HasChildrenVisible("close") == false); nativeView.MinButtonHidden = (figmaNodeContainer.HasChildrenVisible("min") == false); nativeView.MaxButtonHidden = (figmaNodeContainer.HasChildrenVisible("max") == false); var titleText = (FigmaText)optionsNode.GetChildren().FirstOrDefault(s => s.name == "title" && s.visible); if (titleText != null) { nativeView.Title = titleText.characters; } } } nativeView.LiveButton.Activated += async(s, e) => { var window = new Window(view.Allocation); LivePreviewLoading?.Invoke(this, EventArgs.Empty); await newWindowProvider.LoadAsync(rendererService.NodeProvider.File); var secondaryRender = new ControlViewRenderingService(newWindowProvider); var options = new ViewRenderServiceOptions() { GenerateMainView = false }; secondaryRender.RenderInWindow(window, currentNode, options); var mainNodes = currentNode.GetChildren() .ToArray(); ViewNode[] processedNodes = secondaryRender.GetProcessedNodes(mainNodes); var layoutManager = new StoryboardLayoutManager() { UsesConstraints = true }; layoutManager.Run(processedNodes, window.Content, secondaryRender); var nativeWindow = (NSWindow)window.NativeObject; nativeWindow.Appearance = nativeView.EffectiveAppearance; nativeWindow.ContentMinSize = nativeWindow.ContentView.Frame.Size; nativeWindow.Center(); nativeWindow.MakeKeyAndOrderFront(null); LivePreviewLoaded?.Invoke(this, EventArgs.Empty); }; return(view); }
async void Load(FigmaFileVersion version = null, int pageIndex = 0) { if (string.IsNullOrEmpty(DocumentID)) { return; } windowController.EnableButtons(false); if (response == null) { windowController.Title = string.Format("Opening “{0}”…", DocumentID); } if (response == null || version != null) { fileProvider = new ControlRemoteNodeProvider() { File = DocumentID, Version = version }; fileProvider.ImageLinksProcessed += (sender, e) => { InvokeOnMainThread(() => { windowController.ToggleToolbarSpinner(toggle_on: false); }); }; var embeddedSheetConverter = new EmbededSheetDialogConverter(fileProvider); var embeddedWindowConverter = new EmbededWindowConverter(fileProvider); rendererService = new ControlViewRenderingService(fileProvider); rendererService.CustomConverters.Add(embeddedSheetConverter); rendererService.CustomConverters.Add(embeddedWindowConverter); embeddedWindowConverter.LivePreviewLoading += (s, e) => windowController.ToggleToolbarSpinner(true); embeddedWindowConverter.LivePreviewLoaded += (s, e) => windowController.ToggleToolbarSpinner(false); } var scrollView = CreateScrollView(); await rendererService.StartAsync(DocumentID, scrollView.ContentView, new ViewRenderServiceOptions() { StartPage = pageIndex }); windowController.ToggleToolbarSpinner(toggle_on: true); new StoryboardLayoutManager().Run(scrollView.ContentView, rendererService); response = fileProvider.Response; NativeScrollView.RemoveFromSuperview(); MainScrollView = scrollView; NativeScrollView = (NSScrollView)scrollView.NativeObject; View.AddSubview(NativeScrollView); if (response != null) { windowController.Window.Title = windowController.Title = response.name; // NOTE: Figma does not (yet) support color styles for the document background, // so for now use UnderPageBackgroundColor to get a good contrast in all themes // // windowController.Window.BackgroundColor = NativeScrollView.BackgroundColor; windowController.Window.BackgroundColor = NSColor.UnderPageBackgroundColor; NativeScrollView.BackgroundColor = NSColor.UnderPageBackgroundColor; windowController.UpdatePagesPopupButton(response.document, pageIndex); await windowController.UpdateVersionMenu(DocumentID); windowController.EnableButtons(true); RecentStore.SharedRecentStore.AddRecent(DocumentID, windowController.Window.Title); } else { if (View.Window?.WindowController is DocumentWindowController controller) { controller.ShowError(DocumentID); } var windowController = this.Storyboard.InstantiateControllerWithIdentifier("OpenLocationWindow") as NSWindowController; windowController.ShowWindow(null); this.View.Window.Close(); } ToggleSpinner(toggle_on: false); }