Exemple #1
0
        //reads all the views from the current views directory with empty FigmaBundleViews (not implemented the read)
        //public void RefreshViews ()
        //{
        //	Views.Clear ();

        //	if (!Directory.Exists (ViewsDirectoryPath)) {
        //		return;
        //	}

        //	foreach (var viewFullPath in Directory.EnumerateFiles (ViewsDirectoryPath, $"*{FigmaBundleViewBase.PartialDesignerExtension}")) {
        //		var name = viewFullPath.Substring (0, viewFullPath.Length - FigmaBundleViewBase.PartialDesignerExtension.Length);
        //		//TODO: right not it's not possible to read the content of the current .cs file then we create a fake file

        //		var bundleView = NativeControlsContext.Current.GetBundleView (this, name, new FigmaNode ());
        //		Views.Add (bundleView);
        //	}
        //}

        //this happens when we call to FigmaBundle.FromDirectoryPath
        public void Load(string bundleDirectoryPath)
        {
            if (!Directory.Exists(bundleDirectoryPath))
            {
                throw new DirectoryNotFoundException("directory doesn't exists");
            }

            var manifestFullPath = Path.Combine(bundleDirectoryPath, ManifestFileName);

            if (!File.Exists(manifestFullPath))
            {
                throw new FileNotFoundException("manifest doesn't exists");
            }

            DirectoryPath = bundleDirectoryPath;

            try {
                Manifest  = FigmaManifest.FromFilePath(manifestFullPath);
                Namespace = Manifest.Namespace;
                Version   = new FigmaFileVersion()
                {
                    id = Manifest.DocumentVersion
                };
            }
            catch (Exception ex) {
                throw new FileLoadException("error reading manifest file", ex);
            }

            //RefreshViews ();
        }
        void WindowController_VersionSelected(object sender, FigmaFileVersion version)
        {
            windowController.ToggleToolbarSpinner(toggle_on: true);

            CurrentPageIndex = 0;
            Reload(version: version);
        }
Exemple #3
0
        public async Task UpdateVersionMenu(string link_id)
        {
            if (!UseAsVersionsMenu())
            {
                return;
            }

            versionsMainMenu.Activated += (s, e) => {
                FigmaFileVersion version = menuManager.GetFileVersion(versionsMainMenu);
                if (version != null)
                {
                    VersionSelected?.Invoke(this, version);
                }
            };

            var versions = await Task.Run(() =>
            {
                var query = new FigmaFileVersionQuery(link_id);

                FigmaSharp.AppContext.Current.SetAccessToken(TokenStore.SharedTokenStore.GetToken());

                return(FigmaSharp.AppContext.Api.GetFileVersions(query)
                       .versions.GroupByCreatedAt()
                       .ToArray());
            });

            menuManager.Clear();

            foreach (var version in versions)
            {
                menuManager.AddItem(version);
            }

            UseAsVersionsMenu();
        }
        public void LoadDocument(string token, string documentId, FigmaFileVersion version = null)
        {
            Token      = token;
            DocumentID = documentId;

            ToggleSpinner(toggle_on: true);
            Load(version: version, pageIndex: CurrentPageIndex);
        }
Exemple #5
0
        private async void FigmaUrlTextField_Changed(object sender, EventArgs e)
        {
            ShowLoading(true);

            SelectedFileVersion = null;

            //loads current versions
            versionPopUp.RemoveAllItems();

            RefreshStates();

            if (WebApiHelper.TryParseFileUrl(FileId, out string fileId))
            {
                figmaUrlTextField.StringValue = fileId;
            }

            versions = await Task.Run(() => {
                try {
                    var query             = new FigmaFileVersionQuery(fileId);
                    var figmaFileVersions = FigmaSharp.AppContext.Api.GetFileVersions(query).versions;
                    var result            = figmaFileVersions
                                            .GroupByCreatedAt()
                                            .ToArray();
                    return(result);
                } catch (Exception ex) {
                    LoggingService.LogError("[FIGMA] Error", ex);
                    return(null);
                }
            });

            ShowLoading(false);

            versionMenu.Clear();

            if (versions != null)
            {
                foreach (var item in versions)
                {
                    versionMenu.AddItem(item);
                }

                versionMenu.Generate(versionPopUp.Menu);

                versionPopUp.SelectItem(versionMenu.CurrentMenu);
                SelectedFileVersion = versionMenu.CurrentVersion;
            }

            RefreshStates();
        }
Exemple #6
0
        async Task GenerateBundle(string fileId, FigmaFileVersion version, string namesSpace, bool includeImages, bool translateLabels)
        {
            IdeApp.Workbench.StatusBar.AutoPulse = true;
            IdeApp.Workbench.StatusBar.BeginProgress($"Adding package ‘{fileId}’…");

            //we need to ask to figma server to get nodes as demmand
            var fileProvider = new ControlRemoteNodeProvider();
            await fileProvider.LoadAsync(fileId);

            //bundle generation
            var currentBundle = await Task.Run(() =>
            {
                var bundle = currentProject.CreateBundle(fileId, version, fileProvider, namesSpace);
                bundle.SaveAll(includeImages, fileProvider);
                return(bundle);
            });

            //now we need to add to Monodevelop all the stuff
            await currentProject.IncludeBundleAsync(currentBundle, includeImages, savesInProject : false);

            //to generate all layers we need a code renderer
            var codeRendererService = new NativeViewCodeService(fileProvider)
            {
                TranslationService = new MonoDevelopTranslationService()
            };

            var mainFigmaNodes = fileProvider.GetMainGeneratedLayers();

            foreach (var figmaNode in mainFigmaNodes)
            {
                if (!(figmaNode is FigmaFrame) || (figmaNode is FigmaGroup))
                {
                    continue;
                }
                var figmaBundleView = currentBundle.GetFigmaFileView(figmaNode);
                figmaBundleView.Generate(codeRendererService, writePublicClassIfExists: false, namesSpace: currentBundle.Namespace, translateLabels);

                await currentProject.AddFigmaBundleViewAsync(figmaBundleView, savesInProject : false);
            }

            await IdeApp.ProjectOperations.SaveAsync(currentProject);

            IdeApp.Workbench.StatusBar.EndProgress();
            IdeApp.Workbench.StatusBar.AutoPulse = false;
        }
Exemple #7
0
        internal void LoadLocalDocument()
        {
            //generate also Document.figma
            Document = AppContext.Api.GetFile(new FigmaFileQuery(FileId, Version));

            if (Manifest != null && Document != null)
            {
                Manifest.DocumentTitle   = Document.name;
                Manifest.DocumentVersion = Document.version;
            }

            if (Version == null)
            {
                Version = new FigmaFileVersion()
                {
                    id = Manifest.DocumentVersion
                };
            }
            Console.WriteLine($"[Done] Refreshed Figma Package from remote Figma API");
        }
        public async Task UpdateVersionMenu(string link_id)
        {
            if (!UseAsVersionsMenu())
            {
                return;
            }

            versionsMainMenu.Activated += (s, e) => {
                FigmaFileVersion version = menuManager.GetFileVersion(versionsMainMenu);
                if (version != null)
                {
                    VersionSelected?.Invoke(this, version);
                }
            };

            var versions = await Task.Run(() =>
            {
                try
                {
                    var query = new FigmaFileVersionQuery(link_id);

                    return(FigmaSharp.AppContext.Api.GetFileVersions(query)
                           .versions.GroupByCreatedAt()
                           .ToArray());
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    return(new FigmaFileVersion[0]);
                }
            });

            menuManager.Clear();

            foreach (var version in versions)
            {
                menuManager.AddItem(version);
            }

            UseAsVersionsMenu();
        }
Exemple #9
0
        internal void LoadLocalDocument()
        {
            //generate also Document.figma
            Document = AppContext.Api.GetFile(new FigmaFileQuery(FileId, Version));

            if (Manifest != null && Document != null)
            {
                Manifest.DocumentTitle        = Document.name;
                Manifest.DocumentVersion      = Document.version;
                Manifest.DocumentLastModified = Document.lastModified;
            }

            if (Version == null)
            {
                Version = new FigmaFileVersion()
                {
                    id = Manifest.DocumentVersion
                };
            }
            LoggingService.LogInfo($"[Done] Refreshed Figma Package from remote Figma API");
        }
Exemple #10
0
        public static FigmaBundle Empty(string fileId, FigmaFileVersion version, string directoryPath, string nameSpace = null)
        {
            var bundle = new FigmaBundle()
            {
                DirectoryPath = directoryPath,
                Version       = version,
            };

            bundle.Manifest = new FigmaManifest()
            {
                ApiVersion       = AppContext.Current.Version,
                RemoteApiVersion = AppContext.Api.Version.ToString(),
                Date             = DateTime.Now,
                FileId           = fileId,
            };

            if (!string.IsNullOrEmpty(nameSpace))
            {
                bundle.Manifest.Namespace = bundle.Namespace = nameSpace;
            }

            return(bundle);
        }
 public void Reload(FigmaFileVersion version = null, int pageIndex = 0)
 {
     Load(version: version, pageIndex: pageIndex);
 }
Exemple #12
0
        public static async Task UpdateFigmaFilesAsync(this Project sender, IEnumerable <ProjectFile> projectFiles, FigmaBundle figmaBundle, FigmaFileVersion version, bool translateStrings)
        {
            var includeImages = true;
            var fileProvider  = new FigmaRemoteFileProvider()
            {
                Version = version
            };
            await fileProvider.LoadAsync(figmaBundle.FileId);

            Console.WriteLine($"[Done] Loaded Remote File provider for Version {version?.id ?? "Current"}");
            var codeRendererService = new NativeViewCodeService(fileProvider);

            await Task.Run(() => {
                figmaBundle.Update(version, includeImages: includeImages);
            });

            await sender.IncludeBundleAsync(figmaBundle, includeImages : includeImages);

            foreach (var designerFile in projectFiles)
            {
                if (designerFile.TryGetFigmaNode(fileProvider, out var figmaNode))
                {
                    var fileView = figmaBundle.GetFigmaFileView(figmaNode);
                    fileView.GeneratePartialDesignerClass(codeRendererService,
                                                          designerFile.FilePath.ParentDirectory,
                                                          figmaBundle.Namespace,
                                                          translateStrings);
                }
            }
        }
Exemple #13
0
 /// <summary>
 /// Updates and Reloads a bundler to a specific version
 /// </summary>
 /// <param name="version"></param>
 public void Update(FigmaFileVersion version, NodeProvider provider, bool includeImages = true)
 {
     Version = version;
     Reload();
     SaveAll(includeImages, provider);
 }
Exemple #14
0
        public static async Task UpdateFigmaFilesAsync(this Project sender, ProgressMonitor monitor, IEnumerable <ProjectFile> projectFiles, FigmaBundle figmaBundle, FigmaFileVersion version, bool translateStrings)
        {
            var includeImages = true;
            var fileProvider  = new ControlRemoteNodeProvider()
            {
                Version = version
            };
            await fileProvider.LoadAsync(figmaBundle.FileId);

            FigmaSharp.Services.LoggingService.LogInfo($"[Done] Loaded Remote File provider for Version {version?.id ?? "Current"}");
            var codeRendererService = new NativeViewCodeService(fileProvider)
            {
                TranslationService = new Services.MonoDevelopTranslationService()
            };

            await Task.Run(() => {
                figmaBundle.Update(version, fileProvider, includeImages: includeImages);
            });

            await sender.IncludeBundleAsync(monitor, figmaBundle, includeImages : includeImages);

            foreach (var designerFile in projectFiles)
            {
                if (designerFile.TryGetFigmaNode(fileProvider, out var figmaNode))
                {
                    try
                    {
                        var fileView = figmaBundle.GetFigmaFileView(figmaNode);
                        fileView.GeneratePartialDesignerClass(codeRendererService,
                                                              designerFile.FilePath.ParentDirectory,
                                                              figmaBundle.Namespace,
                                                              translateStrings);
                        await sender.FormatFileAsync(designerFile.FilePath);
                    }
                    catch (Exception ex)
                    {
                        FigmaSharp.Services.LoggingService.LogError($"Cannot update {designerFile.FilePath}' with '{figmaNode.name}' node.", ex);
                    }
                }
            }
        }
        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);
            }

            FigmaSharp.AppContext.Current.SetAccessToken(Token);

            if (response == null || version != null)
            {
                fileProvider = new FigmaRemoteFileProvider()
                {
                    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 NativeViewRenderingService(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 FigmaViewRendererServiceOptions()
            {
                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);

            windowController.Window.Title           = windowController.Title = response.name;
            windowController.Window.BackgroundColor = NativeScrollView.BackgroundColor;

            windowController.UpdatePagesPopupButton(response.document, pageIndex);
            await windowController.UpdateVersionMenu(DocumentID);

            windowController.EnableButtons(true);

            RecentStore.SharedRecentStore.AddRecent(DocumentID, windowController.Window.Title);
            ToggleSpinner(toggle_on: false);
        }
Exemple #16
0
 /// <summary>
 /// Updates and Reloads a bundler to a specific version
 /// </summary>
 /// <param name="version"></param>
 public void Update(FigmaFileVersion version, bool includeImages = true)
 {
     Version = version;
     Reload();
     SaveAll(includeImages);
 }
        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);
        }