Example #1
0
        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);
        }
Example #2
0
        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);
        }