Skip to content

Commit

Permalink
Initial implementation of automatic pagination
Browse files Browse the repository at this point in the history
  • Loading branch information
gigaherz committed Jun 1, 2018
1 parent 35edb6a commit e0ce711
Show file tree
Hide file tree
Showing 12 changed files with 308 additions and 160 deletions.
164 changes: 94 additions & 70 deletions src/main/java/gigaherz/guidebook/guidebook/BookDocument.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import gigaherz.guidebook.guidebook.conditions.IDisplayCondition;
import gigaherz.guidebook.guidebook.drawing.Point;
import gigaherz.guidebook.guidebook.drawing.Rect;
import gigaherz.guidebook.guidebook.drawing.VisualElement;
import gigaherz.guidebook.guidebook.drawing.VisualPage;
import gigaherz.guidebook.guidebook.elements.*;
import gigaherz.guidebook.guidebook.templates.TemplateDefinition;
Expand All @@ -34,9 +35,7 @@
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;

public class BookDocument
{
Expand All @@ -49,15 +48,14 @@ public class BookDocument
private ResourceLocation bookCover;

final List<SectionData> chapters = Lists.newArrayList();
private Table<Item, Integer, PageRef> stackLinks = HashBasedTable.create();
private Table<Item, Integer, SectionRef> stackLinks = HashBasedTable.create();

final Map<String, Integer> chaptersByName = Maps.newHashMap();
final Map<String, PageRef> pagesByName = Maps.newHashMap();
final Map<String, SectionRef> sectionsByName = Maps.newHashMap();

private final Map<String, TemplateDefinition> templates = Maps.newHashMap();
private final Map<String, IDisplayCondition> conditions = Maps.newHashMap();

private int totalPairs = 0;
private IBookGraphics rendering;

public BookDocument(ResourceLocation bookLocation)
Expand Down Expand Up @@ -88,7 +86,7 @@ public SectionData getChapter(int i)
}

@Nullable
public PageRef getStackLink(ItemStack stack)
public SectionRef getStackLink(ItemStack stack)
{
Item item = stack.getItem();
int damage = stack.getItemDamage();
Expand All @@ -104,11 +102,6 @@ else if (stackLinks.contains(item, -1))
return null;
}

public int getTotalPairCount()
{
return totalPairs;
}

public float getFontSize()
{
return fontSize;
Expand All @@ -127,7 +120,7 @@ public void findTextures(Set<ResourceLocation> textures)
// TODO: Add <image> texture locations when implemented
for (SectionData chapter : chapters)
{
for (PageData page : chapter.pages)
for (PageData page : chapter.sections)
{
for (Element element : page.elements)
{
Expand All @@ -142,8 +135,8 @@ public void initializeWithLoadError(String error)
SectionData ch = new SectionData(0);
chapters.add(ch);

PageData pg = new PageData(0);
ch.pages.add(pg);
PageData pg = new PageData();
ch.sections.add(pg);

pg.elements.add(ElementParagraph.of("Error loading book:"));
pg.elements.add(ElementParagraph.of(TextFormatting.RED + error));
Expand All @@ -156,10 +149,8 @@ public boolean parseBook(InputStream stream)
chapters.clear();
bookName = "";
bookCover = null;
totalPairs = 0;
fontSize = DEFAULT_FONT_SIZE;
chaptersByName.clear();
pagesByName.clear();

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Expand Down Expand Up @@ -232,14 +223,6 @@ else if(nodeName.equals("conditions"))
parseConditions(firstLevelNode);
}
}

int prevCount = 0;
for (SectionData chapter : chapters)
{
chapter.startPair = prevCount;
prevCount += chapter.pagePairs;
}
totalPairs = prevCount;
}
catch (IOException | ParserConfigurationException | SAXException e)
{
Expand Down Expand Up @@ -357,15 +340,29 @@ private void parseChapter(Node chapterItem)
{
parsePage(chapter, pageItem);
}
else if (nodeName.equals("section"))
{
parseSection(chapter, pageItem);
}
}

chapter.pagePairs = (chapter.pages.size() + 1) / 2;
}

private void parsePage(SectionData chapter, Node pageItem)
{
PageData page = new PageData(chapter.pages.size());
chapter.pages.add(page);
PageData page = new PageData();
parseSection(chapter, pageItem, page);
}

private void parseSection(SectionData chapter, Node pageItem)
{
PageData page = new PageGroup();
parseSection(chapter, pageItem, page);
}

private void parseSection(SectionData chapter, Node pageItem, PageData page)
{
int num = chapter.sections.size();
chapter.sections.add(page);

if (pageItem.hasAttributes())
{
Expand All @@ -374,14 +371,15 @@ private void parsePage(SectionData chapter, Node pageItem)
if (n != null)
{
page.id = n.getTextContent();
pagesByName.put(page.id, new PageRef(chapter.num, page.num));
chapter.pagesByName.put(page.id, page.num);
sectionsByName.put(page.id, new SectionRef(chapter.num, num));
chapter.sectionsByName.put(page.id, num);
}
}

parseChildElements(pageItem, page.elements, templates, true);
}


public static void parseChildElements(Node pageItem, List<Element> elements, Map<String, TemplateDefinition> templates, boolean generateParagraphs)
{
NodeList elementsList = pageItem.getChildNodes();
Expand Down Expand Up @@ -632,7 +630,7 @@ private void parseStackLinks(Node refsItem)
}

String ref = refItem.getTextContent();
stackLinks.put(item, damage_value, PageRef.fromString(ref));
stackLinks.put(item, damage_value, SectionRef.fromString(ref));
}
}
}
Expand All @@ -657,20 +655,33 @@ public class SectionData
public String id;
public IDisplayCondition condition;

public final List<PageData> pages = Lists.newArrayList();
public final Map<String, Integer> pagesByName = Maps.newHashMap();

public int pagePairs;
public int startPair;
public final List<PageData> sections = Lists.newArrayList();
public final Map<String, Integer> sectionsByName = Maps.newHashMap();

private SectionData(int num)
{
this.num = num;
}
}

public class PageData
{
public String id;

public int pairCount()
public final List<Element> elements = Lists.newArrayList();

public List<VisualPage> reflow(Rect leftBounds, Rect rightBounds, int pageNumber)
{
return pagePairs;
VisualPage page = new VisualPage();

Rect pageBounds = (pageNumber & 1) == 0 ? leftBounds : rightBounds;
int top = pageBounds.position.y;
for(Element element : elements)
{
top = element.reflow(page.children, getRendering(), new Rect(new Point(pageBounds.position.x, top), pageBounds.size), pageBounds);
}

return Collections.singletonList(page);
}
}

Expand All @@ -693,55 +704,68 @@ public int pairCount()
* </chapter>
* </book>
*/
public class PageGroup
public class PageGroup extends PageData
{
public final int num;
public String id;

public final List<Element> elements = Lists.newArrayList();

private PageGroup(int num)
@Override
public List<VisualPage> reflow(Rect leftBounds, Rect rightBounds, int pageNumber)
{
this.num = num;
}
List<VisualPage> pages = Lists.newArrayList();

public VisualPage reflow(Rect pageBounds)
{
VisualPage page = new VisualPage();
Rect pageBounds = (pageNumber & 1) == 0 ? leftBounds : rightBounds;

int top = pageBounds.position.y;
for(Element element : elements)
for (Element element : elements)
{
top = element.reflow(page.children, getRendering(), new Rect(new Point(pageBounds.position.x, top), pageBounds.size), pageBounds);
}

return page;
}
}
boolean needsRepagination = false;
for (VisualElement child : page.children)
{
if (child.position.y + child.size.height > (pageBounds.position.y + pageBounds.size.height))
{
needsRepagination = true;
}
}

public class PageData
{
public final int num;
public String id;
if (needsRepagination)
{
VisualPage page2 = new VisualPage();

public final List<Element> elements = Lists.newArrayList();
Rect pageBounds2;
int offsetY = 0;
int offsetX = 0;
for (VisualElement child : page.children)
{
int cpy = child.position.y + offsetY;
if (cpy + child.size.height > (pageBounds.position.y + pageBounds.size.height)
&& child.position.y > pageBounds.position.y)
{
pages.add(page2);
page2 = new VisualPage();

private PageData(int num)
{
this.num = num;
}
pageNumber++;
pageBounds2 = (pageNumber & 1) == 0 ? leftBounds : rightBounds;
offsetY = pageBounds.position.y - child.position.y;
offsetX = pageBounds2.position.x - pageBounds.position.x;
}

public VisualPage reflow(Rect pageBounds)
{
VisualPage page = new VisualPage();
child.position = new Point(
child.position.x + offsetX,
child.position.y + offsetY);
page2.children.add(child);

int top = pageBounds.position.y;
for(Element element : elements)
}

pages.add(page2);
}
else
{
top = element.reflow(page.children, getRendering(), new Rect(new Point(pageBounds.position.x, top), pageBounds.size), pageBounds);
pages.add(page);
}

return page;
return pages;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import gigaherz.guidebook.guidebook.drawing.VisualElement;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.Rectangle;

import java.util.List;

Expand All @@ -24,7 +23,7 @@ public interface IBookGraphics

boolean canGoPrevChapter();

void navigateTo(PageRef target);
void navigateTo(SectionRef target);

void nextPage();

Expand Down
Loading

0 comments on commit e0ce711

Please sign in to comment.