Made resource content provider into a prefab.

Screw the icon prefab, broken and cba to fix.
This commit is contained in:
Florian Nücke 2015-04-09 18:48:54 +02:00
parent b28bb6b2ad
commit 770bd5c28a
6 changed files with 81 additions and 68 deletions

View File

@ -7,6 +7,9 @@ package li.cil.oc.api.manual;
* arbitrary paths. Note that content providers have <em>lower</em> priority
* than content found in resource packs, i.e. content providers will only be
* queried for missing pages, so to speak.
* <p/>
*
* @see li.cil.oc.api.prefab.ResourceContentProvider
*/
public interface ContentProvider {
/**

View File

@ -7,9 +7,9 @@ package li.cil.oc.api.manual;
* provide different graphics for different tabs you'll need to create
* multiple tab renderer instances.
* <p/>
* See the prefabs {@link li.cil.oc.api.prefab.ItemStackTabIconRenderer} and
* {@link li.cil.oc.api.prefab.IconTabIconRenderer} for simple standard
* implementations.
*
* @see li.cil.oc.api.prefab.ItemStackTabIconRenderer
* @see li.cil.oc.api.prefab.TextureTabIconRenderer
*/
public interface TabIconRenderer {
/**

View File

@ -1,28 +0,0 @@
package li.cil.oc.api.prefab;
import li.cil.oc.api.manual.TabIconRenderer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
/**
* Simple implementation of a tab icon renderer using an icon as its graphic.
*/
@SuppressWarnings("UnusedDeclaration")
public class IconTabIconRenderer implements TabIconRenderer {
private final IIcon icon;
public IconTabIconRenderer(IIcon icon) {
this.icon = icon;
}
@Override
public void render() {
final Tessellator t = Tessellator.instance;
t.startDrawingQuads();
t.addVertexWithUV(0, 16, 0, icon.getMinU(), icon.getMaxV());
t.addVertexWithUV(16, 16, 0, icon.getMaxU(), icon.getMaxV());
t.addVertexWithUV(16, 0, 0, icon.getMaxU(), icon.getMinV());
t.addVertexWithUV(0, 0, 0, icon.getMinU(), icon.getMinV());
t.draw();
}
}

View File

@ -0,0 +1,64 @@
package li.cil.oc.api.prefab;
import li.cil.oc.api.manual.ContentProvider;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
/**
* Basic implementation of a content provider based on Minecraft's resource
* loading framework.
* <p/>
* Beware that the manual is unaware of resource domains. In other words, two
* paths that are identical except for their resource domain will be the same,
* as seen from the manual. This means you should probably place your
* documentation somewhere other than <tt>doc/</tt>, because that's where the
* OpenComputers documentation lives, and it is queried first - meaning if you
* have a page with the same path as one in OpenComputers, it is practically
* unreachable (because the OC provider is always queried first).
*/
@SuppressWarnings("UnusedDeclaration")
public class ResourceContentProvider implements ContentProvider {
private final String resourceDomain;
private final String basePath;
public ResourceContentProvider(String resourceDomain, String basePath) {
this.resourceDomain = resourceDomain;
this.basePath = basePath;
}
public ResourceContentProvider(String resourceDomain) {
this(resourceDomain, "");
}
@Override
public Iterable<String> getContent(String path) {
final ResourceLocation location = new ResourceLocation(resourceDomain, basePath + path);
InputStream is = null;
try {
is = Minecraft.getMinecraft().getResourceManager().getResource(location).getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(is));
final ArrayList<String> lines = new ArrayList<String>();
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
return lines;
} catch (Throwable ignored) {
return null;
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ignored) {
}
}
}
}
}

View File

@ -64,9 +64,8 @@ class Manual extends GuiScreen {
}
def pushPage(path: String): Unit = {
val resolvedPath = resolveLink(path, Manual.history.top.path)
if (resolvedPath != Manual.history.top.path) {
Manual.history.push(new Manual.History(resolvedPath))
if (path != Manual.history.top.path) {
Manual.history.push(new Manual.History(path))
refreshPage()
}
}
@ -85,7 +84,7 @@ class Manual extends GuiScreen {
override def actionPerformed(button: GuiButton): Unit = {
if (button.id >= 0 && button.id < Manual.tabs.length) {
pushPage(Manual.tabs(button.id).path)
api.Manual.navigate(Manual.tabs(button.id).path)
}
}
@ -107,7 +106,7 @@ class Manual extends GuiScreen {
for ((tab, i) <- Manual.tabs.zipWithIndex if i < 7) {
val x = guiLeft + tabPosX
val y = guiTop + tabPosY + i * (tabHeight - 1)
add(buttonList, new ImageButton(0, x, y, tabWidth, tabHeight, Textures.guiManualTab))
add(buttonList, new ImageButton(i, x, y, tabWidth, tabHeight, Textures.guiManualTab))
}
refreshPage()
@ -160,7 +159,7 @@ class Manual extends GuiScreen {
// Left click, did we hit a link?
hoveredLink.foreach(link => {
if (link.startsWith("http://") || link.startsWith("https://")) handleUrl(link)
else pushPage(link)
else pushPage(Manual.makeRelative(link, Manual.history.top.path))
})
}
else if (button == 1) {

View File

@ -1,9 +1,5 @@
package li.cil.oc.integration.opencomputers
import java.io.InputStream
import java.lang.Iterable
import com.google.common.base.Charsets
import cpw.mods.fml.common.FMLCommonHandler
import cpw.mods.fml.common.event.FMLInterModComms
import li.cil.oc.Constants
@ -12,8 +8,9 @@ import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.api.detail.ItemInfo
import li.cil.oc.api.internal
import li.cil.oc.api.manual.ContentProvider
import li.cil.oc.api.manual.PathProvider
import li.cil.oc.api.prefab.ItemStackTabIconRenderer
import li.cil.oc.api.prefab.ResourceContentProvider
import li.cil.oc.common.EventHandler
import li.cil.oc.common.Loot
import li.cil.oc.common.SaveHandler
@ -31,17 +28,12 @@ import li.cil.oc.integration.util.BundledRedstone
import li.cil.oc.integration.util.WirelessRedstone
import li.cil.oc.server.network.WirelessNetwork
import li.cil.oc.util.ExtendedNBT._
import net.minecraft.client.Minecraft
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.ResourceLocation
import net.minecraft.world.World
import net.minecraftforge.common.ForgeChunkManager
import net.minecraftforge.common.MinecraftForge
import scala.collection.convert.WrapAsJava._
import scala.io.Source
object ModOpenComputers extends ModProxy {
override def getMod = Mods.OpenComputers
@ -206,7 +198,10 @@ object ModOpenComputers extends ModProxy {
}
api.Manual.addProvider(DefinitionPathProvider)
api.Manual.addProvider(ResourceContentProvider)
api.Manual.addProvider(new ResourceContentProvider(Settings.resourceDomain))
api.Manual.addTab(new ItemStackTabIconRenderer(api.Items.get("case1").createItemStack(1)), "doc/%LANGUAGE%/block/index.md")
api.Manual.addTab(new ItemStackTabIconRenderer(api.Items.get("chip1").createItemStack(1)), "doc/%LANGUAGE%/item/index.md")
}
private def blacklistHost(host: Class[_], itemNames: String*) {
@ -240,24 +235,4 @@ object ModOpenComputers extends ModProxy {
else "item/" + info.name + ".md"
}
object ResourceContentProvider extends ContentProvider {
override def getContent(path: String): Iterable[String] = {
val location = new ResourceLocation(Settings.resourceDomain, path)
var is: InputStream = null
try {
val resource = Minecraft.getMinecraft.getResourceManager.getResource(location)
is = resource.getInputStream
// Force resolving immediately via toArray, otherwise we return a read
// iterator on a closed input stream (because of the finally).
asJavaIterable(Source.fromInputStream(is)(Charsets.UTF_8).getLines().toArray.toIterable)
}
catch {
case t: Throwable => null
}
finally {
Option(is).foreach(_.close())
}
}
}
}