private string[] Paginate(StringBuilder fullText, CairoFont font, double pageWidth, double pageHeight, double lineHeight) { TextSizeProber prober = new TextSizeProber(); Stack <string> lines = new Stack <string>(prober.InsertAutoLineBreaks(font, fullText, pageWidth).Reverse()); double lineheight = prober.GetLineHeight(font, lineHeight); int maxlinesPerPage = (int)(pageHeight / lineheight); List <string> pagesTemp = new List <string>(); StringBuilder pageBuilder = new StringBuilder(); while (lines.Count > 0) { int currentPageLines = 0; while (currentPageLines < maxlinesPerPage && lines.Count > 0) { string line = lines.Pop(); string[] parts = line.Split(new string[] { "___NEWPAGE___" }, 2, StringSplitOptions.None); if (parts.Length > 1) { pageBuilder.AppendLine(parts[0]); if (parts[1].Length > 0) { lines.Push(parts[1]); } break; } currentPageLines++; pageBuilder.AppendLine(line); } string pageText = pageBuilder.ToString().TrimEnd(); if (pageText.Length > 0) { pagesTemp.Add(pageText); } pageBuilder.Clear(); } return(pagesTemp.ToArray()); }
private bool onClickItem(int i) { currentLoreItemIndex = i; page = 0; CairoFont font = CairoFont.WhiteDetailText().WithFontSize(17); TextSizeProber prober = new TextSizeProber(); StringBuilder fulltext = new StringBuilder(); for (int p = 0; p < journalitems[currentLoreItemIndex].Pieces.Length; p++) { if (p > 0) { fulltext.AppendLine(); } fulltext.Append(journalitems[currentLoreItemIndex].Pieces[p]); } pages = Paginate(fulltext, font, GuiElement.scaled(629), GuiElement.scaled(450), 1.15); double elemToDlgPad = ElementGeometrics.ElementToDialogPadding; ElementBounds textBounds = ElementBounds.Fixed(0, 0, 630, 450); ElementBounds dialogBounds = textBounds.ForkBoundingParent(elemToDlgPad, elemToDlgPad + 20, elemToDlgPad, elemToDlgPad + 30).WithAlignment(EnumDialogArea.LeftMiddle); dialogBounds.fixedX = 350; DialogComposers["loreItem"] = capi.Gui .CreateCompo("loreItem", dialogBounds, false) .AddDialogBG(ElementBounds.Fill, true) .AddDialogTitleBar(journalitems[i].Title, CloseIconPressedLoreItem) .AddDynamicText(pages[0], font, EnumTextOrientation.Left, textBounds, 1.15f, "page") .AddDynamicText("1 / " + pages.Length, CairoFont.WhiteSmallishText(), EnumTextOrientation.Center, ElementBounds.Fixed(250, 500, 100, 30), 1, "currentpage") .AddButton("Previous Page", OnPrevPage, ElementBounds.Fixed(17, 500, 100, 23).WithFixedPadding(10, 4), CairoFont.WhiteSmallishText()) .AddButton("Next Page", OnNextPage, ElementBounds.Fixed(520, 500, 100, 23).WithFixedPadding(10, 4), CairoFont.WhiteSmallishText()) .Compose() ; return(true); }