public ExampleViewManager(IScrollView scrollView, FigmaViewConverter[] converters) { fileProvider = new FigmaRemoteFileProvider(); RendererService = new FigmaFileRendererService(fileProvider, converters); var options = new FigmaViewRendererServiceOptions() { ScanChildrenFromFigmaInstances = false }; RendererService.Start(fileName, scrollView.ContentView, options); distributionService = new FigmaViewRendererDistributionService(RendererService); distributionService.Start(); //We want know the background color of the figma camvas and apply to our scrollview var canvas = fileProvider.Nodes.OfType <FigmaCanvas>().FirstOrDefault(); if (canvas != null) { scrollView.BackgroundColor = canvas.backgroundColor; } scrollView.AdjustToContent(); }
static void LoadSignInDialog(FigmaViewRendererService rendererService, FigmaViewRendererServiceOptions options) { mainWindow.Size = new Size(440, 456); //var customConverters = new FigmaViewConverter[] { // new SearchFilterConverter(), //}; //rendererService.CustomConverters.AddRange(customConverters); //new SearchFilterConverter () var dialog = rendererService.RenderByName <IView>(SignInDialog, options); dialog.CornerRadius = 5; dialog.BackgroundColor = Color.White; SetContentDialog(dialog); //foreach (var viewConverter in customConverters) // rendererService.CustomConverters.Remove(viewConverter); var closeButton = dialog.Children .OfType <IImageButton>() .FirstOrDefault(); closeButton.Clicked += (s, e) => { if (closeButton is IViewTransitable figmaTransition) { ProcessTransitionNodeID(figmaTransition.TransitionNodeID, rendererService, options); } }; }
static void Example2() { var document = "b05oGrcu9WI9txiHqdhCUyE4"; mainWindow.Size = new Size(720, 467); mainWindow.Center(); //windows properties mainWindow.Content.BackgroundColor = Color.Transparent; mainWindow.Borderless = true; mainWindow.Resizable = false; mainWindow.BackgroundColor = Color.Transparent; //we add the control converters var converters = Resources.GetConverters() .Union(FigmaSharp.AppContext.Current.GetFigmaConverters()) .ToArray(); fileProvider = new FigmaRemoteFileProvider(); fileProvider.Load(document); var rendererService = new FigmaViewRendererService(fileProvider, converters); var options = new FigmaViewRendererServiceOptions { ScanChildrenFromFigmaInstances = false }; var figmaCanvas = fileProvider.Nodes .OfType <FigmaCanvas>() .FirstOrDefault(); rendererService.CustomConverters.Add(new CloseButtonConverter()); ProcessTransitionNodeID(figmaCanvas.prototypeStartNodeID, rendererService, options); }
static void Example1() { const string fileName = "EGTUYgwUC9rpHmm4kJwZQXq4"; var converters = Resources.GetConverters() .Union(FigmaSharp.AppContext.Current.GetFigmaConverters()) .ToArray(); fileProvider = new FigmaRemoteFileProvider(); fileProvider.Load(fileName); var rendererService = new FigmaViewRendererService(fileProvider, converters); var rendererOptions = new FigmaViewRendererServiceOptions() { ScanChildrenFromFigmaInstances = false }; rendererService.RenderInWindow(mainWindow, rendererOptions, "1.0. Bundle Figma Document"); mainWindow.Resizable = false; mainWindow.Center(); var urlTextField = rendererService.FindViewByName <TextBox>("FigmaUrlTextField"); var bundleButton = rendererService.FindViewByName <Button>("BundleButton"); var cancelButton = rendererService.FindViewByName <Button>("CancelButton"); if (cancelButton != null) { cancelButton.Clicked += (s, e) => { if (urlTextField != null) { urlTextField.Text = "You pressed cancel"; } }; } if (bundleButton != null) { bundleButton.Clicked += (s, e) => { if (urlTextField != null) { urlTextField.Text = "You pressed bundle"; } }; } //We want know the background color of the figma camvas and apply to our scrollview var canvas = fileProvider.Nodes.OfType <FigmaCanvas>().FirstOrDefault(); if (canvas != null) { mainWindow.BackgroundColor = canvas.backgroundColor; } }
public static void RenderInWindow(this FigmaViewRendererService sender, IWindow mainWindow, string windowLayerName, FigmaViewRendererServiceOptions options = null) { var windowFigmaNode = sender.FileProvider.FindByName(windowLayerName); FigmaNode content = null; if (windowFigmaNode is IFigmaNodeContainer figmaNodeContainer) { content = figmaNodeContainer.children.FirstOrDefault(s => s.IsNodeWindowContent()); var windowComponent = windowFigmaNode.GetDialogInstanceFromParentContainer(); if (options == null) { options = new FigmaViewRendererServiceOptions(); options.AreImageProcessed = false; } options.ToIgnore = new FigmaNode[] { windowComponent }; if (windowComponent != null) { var windowLabel = windowComponent.children .OfType <FigmaText>() .FirstOrDefault(); if (windowLabel != null) { mainWindow.Title = windowLabel.characters; } } } if (windowFigmaNode is IAbsoluteBoundingBox box) { mainWindow.Size = box.absoluteBoundingBox.Size; } if (content == null) { content = windowFigmaNode; } var renderContent = sender.RenderByNode(content, mainWindow.Content, options); mainWindow.Content = renderContent; }
static void LoadLoginDialog(FigmaViewRendererService rendererService, FigmaViewRendererServiceOptions options) { mainWindow.Size = new Size(720, 467); var customConverters = new FigmaViewConverter[] { new DoThisLaterButtonConverter(), new SignInMicrosoftButtonConverter(), //new CreateAccountLinkConverter (), //new WhySignInLinkConverter (), }; rendererService.CustomConverters.AddRange(customConverters); var signInDialog = rendererService.RenderByName <IView>(LoginDialog, options); signInDialog.CornerRadius = 5; signInDialog.BackgroundColor = new Color(0.27f, 0.15f, 0.41f); SetContentDialog(signInDialog); foreach (var viewConverter in customConverters) { rendererService.CustomConverters.Remove(viewConverter); } //logic var signInButton = rendererService.FindViewByName <IButton>(SignInMicrosoftButtonConverter.SignInMicrosoftButtonName); signInButton.Focus(); signInButton.Clicked += (s, e) => { if (signInButton is IViewTransitable figmaTransition) { ProcessTransitionNodeID(figmaTransition.TransitionNodeID, rendererService, options); } }; var doThisLaterButton = rendererService.FindViewByName <IButton>(DoThisLaterButtonConverter.DoThisLaterButtonName); doThisLaterButton.Clicked += (s, e) => { if (doThisLaterButton is IViewTransitable figmaTransition) { ProcessTransitionNodeID(figmaTransition.TransitionNodeID, rendererService, options); } }; }
public void Reload(IViewWrapper contentView, string file, FigmaViewRendererServiceOptions options) { try { rendererService.Start(file, contentView, options); distributionService.Start(); ReloadFinished?.Invoke(this, EventArgs.Empty); } catch (DirectoryNotFoundException ex) { Console.WriteLine("[FIGMA.RENDERER] Resource directory not found ({0}). Images will not load", ex.Message); } catch (System.Exception ex) { Console.WriteLine(ex); } }
static void LoadRecentItemsDialog(FigmaViewRendererService rendererService, FigmaViewRendererServiceOptions options) { mainWindow.Size = new Size(720, 467); var customConverters = new FigmaViewConverter[] { new SearchFilterConverter(), }; rendererService.CustomConverters.AddRange(customConverters); //new SearchFilterConverter () var dialog = rendererService.RenderByName <IView>("RecentItemsDialog", options); dialog.CornerRadius = 5; dialog.BackgroundColor = Color.White; SetContentDialog(dialog); foreach (var viewConverter in customConverters) { rendererService.CustomConverters.Remove(viewConverter); } var searchBox = dialog.Children .OfType <ISearchBox>() .FirstOrDefault(); searchBox.Focus(); var closeButton = dialog.Children .OfType <IImageButton>() .FirstOrDefault(); closeButton.Clicked += (s, e) => { NSRunningApplication.CurrentApplication.Terminate(); }; }
public static void RenderInWindow(this FigmaViewRendererService sender, IWindow mainWindow, FigmaViewRendererServiceOptions options, params string[] path) { var contentPath = path.Concat(new[] { "content" }).ToArray(); var contentFigmaNode = (IAbsoluteBoundingBox)sender.FileProvider.FindByPath(contentPath); var contentView = sender.RenderByNode <IView>((FigmaNode)contentFigmaNode, options); var windowFigmaNode = (IAbsoluteBoundingBox)sender.FileProvider.FindByPath(path); mainWindow.Size = windowFigmaNode.absoluteBoundingBox.Size; var windowNodeContainer = (IFigmaNodeContainer)windowFigmaNode; var windowComponent = windowNodeContainer.children .OfType <FigmaInstance>() .FirstOrDefault(s => s.Component.key == "b666bac2b68d976c9e3e5b52a0956a9f1857c1f2"); var windowLabel = windowComponent.children .OfType <FigmaText>() .FirstOrDefault(); mainWindow.Title = windowLabel.characters; var difX = contentFigmaNode.absoluteBoundingBox.X - windowFigmaNode.absoluteBoundingBox.X; var difY = contentFigmaNode.absoluteBoundingBox.Y - windowFigmaNode.absoluteBoundingBox.Y; const int WindowTitleHeight = 20; difY -= WindowTitleHeight; mainWindow.Content.AddChild(contentView); contentView.SetPosition(difX, difY); }
static void ProcessTransitionNodeID(string transitionNodeId, FigmaViewRendererService rendererService, FigmaViewRendererServiceOptions options) { if (string.IsNullOrEmpty(transitionNodeId)) { return; } var node = rendererService.FindNodeById(transitionNodeId); if (node.name == SignInDialog) { LoadSignInDialog(rendererService, options); } else if (node.name == RecentItemsDialog) { LoadRecentItemsDialog(rendererService, options); } else if (node.name == LoginDialog) { LoadLoginDialog(rendererService, options); } else if (node.name == LoadingDialog) { LoadLoadingDialog(rendererService, options); } else { var selectedNode = rendererService.FindNodeById(transitionNodeId); var storyboardRedered = rendererService.RenderByNode <IView>(selectedNode); storyboardRedered.CornerRadius = 5; SetContentDialog(storyboardRedered); } }
static async void LoadLoadingDialog(FigmaViewRendererService rendererService, FigmaViewRendererServiceOptions options) { mainWindow.Size = new Size(720, 467); var loadingSpinnerConverter = new LoadingSpinnerConverter(); rendererService.CustomConverters.Add(loadingSpinnerConverter); var loadingDialogFigmaNode = rendererService.FindNodeByName(LoadingDialog); var loadingDialog = rendererService.RenderByName <IView>(LoadingDialog, options); loadingDialog.BackgroundColor = new Color(0.27f, 0.15f, 0.41f); loadingDialog.CornerRadius = 5; SetContentDialog(loadingDialog); rendererService.CustomConverters.Remove(loadingSpinnerConverter); //finds view and process animation var spinnerView = rendererService.FindViewByName <ISpinner>(LoadingSpinnerConverter.LoadingSpinnerName); spinnerView.Start(); //we wait for 5 seconds and we show next screen await Task.Run(() => { if (loadingDialogFigmaNode is FigmaFrameEntity figmaFrameEntity) { Thread.Sleep((int)figmaFrameEntity.transitionDuration); FigmaSharp.AppContext.Current.BeginInvoke(() => ProcessTransitionNodeID(figmaFrameEntity.transitionNodeID, rendererService, options)); } }); }
public override IView ConvertTo(FigmaNode currentNode, ProcessedNode parentNode, FigmaRendererService 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.FileProvider.File); var secondaryRender = new NativeViewRenderingService(newWindowProvider); var options = new FigmaViewRendererServiceOptions() { GenerateMainView = false }; secondaryRender.RenderInWindow(window, currentNode, options); var mainNodes = currentNode.GetChildren() .ToArray(); ProcessedNode[] 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); }