private void OtherToolsDropdown(ImGui gui, ref bool closed)
        {
            if (gui.BuildContextMenuButton("Duplicate page"))
            {
                closed = true;
                var project        = editingPage.owner;
                var collector      = new ErrorCollector();
                var serializedCopy = JsonUtils.Copy(editingPage, project, collector);
                if (collector.severity > ErrorSeverity.None)
                {
                    ErrorListPanel.Show(collector);
                }
                if (serializedCopy != null)
                {
                    serializedCopy.GenerateNewGuid();
                    serializedCopy.icon = icon;
                    serializedCopy.name = name;
                    project.RecordUndo().pages.Add(serializedCopy);
                    MainScreen.Instance.SetActivePage(serializedCopy);
                    Close();
                }
            }

            if (gui.BuildContextMenuButton("Share (export string to clipboard)"))
            {
                closed = true;
                var data = JsonUtils.SaveToJson(editingPage);
                using (var targetStream = new MemoryStream())
                {
                    using (var compress = new DeflateStream(targetStream, CompressionLevel.Optimal, true))
                    {
                        using (var writer = new BinaryWriter(compress, Encoding.UTF8, true))
                        {
                            // write some magic chars and version as a marker
                            writer.Write("YAFC\nProjectPage\n".AsSpan());
                            writer.Write(YafcLib.version.ToString().AsSpan());
                            writer.Write("\n\n\n".AsSpan());
                        }
                        data.CopyTo(compress);
                    }
                    var encoded = Convert.ToBase64String(targetStream.GetBuffer(), 0, (int)targetStream.Length);
                    SDL.SDL_SetClipboardText(encoded);
                }
            }
        }
Esempio n. 2
0
        public override void Build(ImGui gui)
        {
            gui.spacing = 3f;
            BuildHeader(gui, editingPage == null ? "Create new page" : "Edit page icon and name");
            Build(gui, ref name, icon, s =>
            {
                icon = s;
                Rebuild();
            });

            using (gui.EnterRow(0.5f, RectAllocator.RightRow))
            {
                if (editingPage == null && gui.BuildButton("Create", active: !string.IsNullOrEmpty(name)))
                {
                    callback?.Invoke(name, icon);
                    Close();
                }

                if (editingPage != null && gui.BuildButton("OK", active: !string.IsNullOrEmpty(name)))
                {
                    if (editingPage.name != name || editingPage.icon != icon)
                    {
                        editingPage.RecordUndo(true).name = name;
                        editingPage.icon = icon;
                    }
                    Close();
                }

                if (gui.BuildButton("Cancel", SchemeColor.Grey))
                {
                    Close();
                }

                if (editingPage != null && gui.BuildButton("Duplicate page", SchemeColor.Grey, active: !string.IsNullOrEmpty(name)))
                {
                    var project        = editingPage.owner;
                    var collector      = new ErrorCollector();
                    var serializedCopy = JsonUtils.Copy(editingPage, project, collector);
                    if (collector.severity > ErrorSeverity.None)
                    {
                        ErrorListPanel.Show(collector);
                    }
                    if (serializedCopy != null)
                    {
                        serializedCopy.GenerateNewGuid();
                        serializedCopy.icon = icon;
                        serializedCopy.name = name;
                        project.RecordUndo().pages.Add(serializedCopy);
                        MainScreen.Instance.SetActivePage(serializedCopy);
                        Close();
                    }
                }

                gui.allocator = RectAllocator.LeftRow;
                if (editingPage != null && gui.BuildRedButton("Delete page") == ImGuiUtils.Event.Click)
                {
                    Project.current.RecordUndo().pages.Remove(editingPage);
                    Close();
                }
            }
        }