132 lines
3.5 KiB
Java
132 lines
3.5 KiB
Java
/*
|
|
* This file is part of ComputerCraft - http://www.computercraft.info
|
|
* Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission.
|
|
* Send enquiries to dratcliffe@gmail.com
|
|
*/
|
|
package dan200.computercraft.shared.peripheral.printer;
|
|
|
|
import dan200.computercraft.api.lua.IArguments;
|
|
import dan200.computercraft.api.lua.LuaException;
|
|
import dan200.computercraft.api.lua.LuaFunction;
|
|
import dan200.computercraft.api.peripheral.IPeripheral;
|
|
import dan200.computercraft.core.terminal.Terminal;
|
|
import dan200.computercraft.shared.util.StringUtil;
|
|
|
|
import javax.annotation.Nonnull;
|
|
import java.util.Optional;
|
|
|
|
/**
|
|
* The printer peripheral allows pages and books to be printed.
|
|
*
|
|
* @cc.module printer
|
|
*/
|
|
public class PrinterPeripheral implements IPeripheral
|
|
{
|
|
private final TilePrinter printer;
|
|
|
|
public PrinterPeripheral( TilePrinter printer )
|
|
{
|
|
this.printer = printer;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String getType()
|
|
{
|
|
return "printer";
|
|
}
|
|
|
|
// FIXME: There's a theoretical race condition here between getCurrentPage and then using the page. Ideally
|
|
// we'd lock on the page, consume it, and unlock.
|
|
|
|
// FIXME: None of our page modification functions actually mark the tile as dirty, so the page may not be
|
|
// persisted correctly.
|
|
|
|
@LuaFunction
|
|
public final void write( IArguments arguments ) throws LuaException
|
|
{
|
|
String text = StringUtil.toString( arguments.get( 0 ) );
|
|
Terminal page = getCurrentPage();
|
|
page.write( text );
|
|
page.setCursorPos( page.getCursorX() + text.length(), page.getCursorY() );
|
|
}
|
|
|
|
@LuaFunction
|
|
public final Object[] getCursorPos() throws LuaException
|
|
{
|
|
Terminal page = getCurrentPage();
|
|
int x = page.getCursorX();
|
|
int y = page.getCursorY();
|
|
return new Object[] { x + 1, y + 1 };
|
|
}
|
|
|
|
@LuaFunction
|
|
public final void setCursorPos( int x, int y ) throws LuaException
|
|
{
|
|
Terminal page = getCurrentPage();
|
|
page.setCursorPos( x - 1, y - 1 );
|
|
}
|
|
|
|
@LuaFunction
|
|
public final Object[] getPageSize() throws LuaException
|
|
{
|
|
Terminal page = getCurrentPage();
|
|
int width = page.getWidth();
|
|
int height = page.getHeight();
|
|
return new Object[] { width, height };
|
|
}
|
|
|
|
@LuaFunction( mainThread = true )
|
|
public final boolean newPage()
|
|
{
|
|
return printer.startNewPage();
|
|
}
|
|
|
|
@LuaFunction( mainThread = true )
|
|
public final boolean endPage() throws LuaException
|
|
{
|
|
getCurrentPage();
|
|
return printer.endCurrentPage();
|
|
}
|
|
|
|
@LuaFunction
|
|
public final void setPageTitle( Optional<String> title ) throws LuaException
|
|
{
|
|
getCurrentPage();
|
|
printer.setPageTitle( StringUtil.normaliseLabel( title.orElse( "" ) ) );
|
|
}
|
|
|
|
@LuaFunction
|
|
public final int getInkLevel()
|
|
{
|
|
return printer.getInkLevel();
|
|
}
|
|
|
|
@LuaFunction
|
|
public final int getPaperLevel()
|
|
{
|
|
return printer.getPaperLevel();
|
|
}
|
|
|
|
@Override
|
|
public boolean equals( IPeripheral other )
|
|
{
|
|
return other instanceof PrinterPeripheral && ((PrinterPeripheral) other).printer == printer;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public Object getTarget()
|
|
{
|
|
return printer;
|
|
}
|
|
|
|
@Nonnull
|
|
private Terminal getCurrentPage() throws LuaException
|
|
{
|
|
Terminal currentPage = printer.getCurrentPage();
|
|
if( currentPage == null ) throw new LuaException( "Page not started" );
|
|
return currentPage;
|
|
}
|
|
}
|