public override void Build(ImGui gui) { BuildHeader(gui, "Milestone editor"); milestoneList.Build(gui); gui.BuildText( "Hint: You can reorder milestones. When an object is locked behind a milestone, the first inaccessible milestone will be shown. Also when there is a choice between different milestones, first will be chosen", wrap: true, color: SchemeColor.BackgroundTextFaint); using (gui.EnterRow()) { if (gui.BuildButton("Auto sort milestones", SchemeColor.Grey)) { var collector = new ErrorCollector(); Milestones.Instance.ComputeWithParameters(Project.current, collector, Project.current.settings.milestones.ToArray(), true); if (collector.severity > ErrorSeverity.None) { ErrorListPanel.Show(collector); } milestoneList.RebuildContents(); } if (gui.BuildButton("Add milestone")) { if (Project.current.settings.milestones.Count >= 60) { MessageBox.Show(null, "Milestone limit reached", "60 milestones is the limit. You may delete some of the milestones you've already reached.", "Ok"); } else { SelectObjectPanel.Select(Database.objects.all, "Add new milestone", AddMilestone); } } } }
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); } } }
public static void LoadProjectPageFromClipboard() { var collector = new ErrorCollector(); var project = Project.current; ProjectPage page = null; try { var text = SDL.SDL_GetClipboardText(); var compressedBytes = Convert.FromBase64String(text.Trim()); using (var deflateStream = new DeflateStream(new MemoryStream(compressedBytes), CompressionMode.Decompress)) { using (var ms = new MemoryStream()) { deflateStream.CopyTo(ms); var bytes = ms.GetBuffer(); var index = 0; if (DataUtils.ReadLine(bytes, ref index) != "YAFC" || DataUtils.ReadLine(bytes, ref index) != "ProjectPage") { throw new InvalidDataException(); } var version = new Version(DataUtils.ReadLine(bytes, ref index) ?? ""); if (version > YafcLib.version) { collector.Error("String was created with the newer version of YAFC (" + version + "). Data may be lost.", ErrorSeverity.Important); } DataUtils.ReadLine(bytes, ref index); // reserved 1 if (DataUtils.ReadLine(bytes, ref index) != "") // reserved 2 but this time it is requried to be empty { throw new NotSupportedException("Share string was created with future version of YAFC (" + version + ") and is incompatible"); } page = JsonUtils.LoadFromJson <ProjectPage>(new ReadOnlySpan <byte>(bytes, index, (int)ms.Length - index), project, collector); } } } catch (Exception ex) { collector.Exception(ex, "Clipboard text does not contain valid YAFC share string", ErrorSeverity.Critical); } if (page != null) { var existing = project.FindPage(page.guid); if (existing != null) { MessageBox.Show((haveChoice, choice) => { if (!haveChoice) { return; } if (choice) { project.RecordUndo().pages.Remove(existing); } else { page.GenerateNewGuid(); } project.RecordUndo().pages.Add(page); MainScreen.Instance.SetActivePage(page); }, "Page already exists", "Looks like this page already exists with name '" + existing.name + "'. Would you like to replace it or import as copy?", "Replace", "Import as copy"); } else { project.RecordUndo().pages.Add(page); MainScreen.Instance.SetActivePage(page); } } if (collector.severity > ErrorSeverity.None) { ErrorListPanel.Show(collector); } }
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(); } } }