Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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);
        }