/**
* Copyright (C) 2009-2014 Cars and Tracks Development Project (CTDP).
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package net.ctdp.rfdynhud.widgets.standard.image;
import java.io.IOException;
import net.ctdp.rfdynhud.gamedata.LiveGameData;
import net.ctdp.rfdynhud.properties.BooleanProperty;
import net.ctdp.rfdynhud.properties.ImagePropertyWithTexture;
import net.ctdp.rfdynhud.properties.PropertiesContainer;
import net.ctdp.rfdynhud.properties.PropertyLoader;
import net.ctdp.rfdynhud.properties.StringProperty;
import net.ctdp.rfdynhud.render.DrawnStringFactory;
import net.ctdp.rfdynhud.render.TextureImage2D;
import net.ctdp.rfdynhud.render.TransformableTexture;
import net.ctdp.rfdynhud.util.PropertyWriter;
import net.ctdp.rfdynhud.util.SubTextureCollector;
import net.ctdp.rfdynhud.valuemanagers.Clock;
import net.ctdp.rfdynhud.widgets.WidgetsConfiguration;
import net.ctdp.rfdynhud.widgets.base.widget.Widget;
import net.ctdp.rfdynhud.widgets.base.widget.WidgetPackage;
import net.ctdp.rfdynhud.widgets.standard._util.StandardWidgetSet;
/**
* The {@link ImageWidget} displays an image.
*
* @author Marvin Froehlich (CTDP)
*/
public class ImageWidget extends Widget
{
private final StringProperty visibleIf = new StringProperty( "visibleIf", "" );
private final ImagePropertyWithTexture imageName = new ImagePropertyWithTexture( "imageName", "standard/ctdp.png" )
{
@Override
public void onValueChanged( String oldValue, String newValue )
{
super.onValueChanged( oldValue, newValue );
forceCompleteRedraw( true );
transTexDirty = true;
}
};
private TransformableTexture transTex = null;
private boolean usingTransTex = false;
private boolean transTexDirty = false;
private final BooleanProperty useHardwareStretching = new BooleanProperty( "useHardwareStretching", "hardwareStretching", false );
private Widget visibleIfWidget = null;
public ImageWidget( WidgetPackage widgetPackage )
{
super( StandardWidgetSet.INSTANCE, widgetPackage, 17.0f, 8.6f );
//getBackgroundProperty().setColorValue( "#00000000" );
}
public ImageWidget()
{
this( StandardWidgetSet.WIDGET_PACKAGE );
}
@Override
protected boolean canHaveBorder()
{
return ( false );
}
@Override
protected boolean canHaveBackground()
{
return ( false );
}
@Override
protected boolean hasText()
{
return ( false );
}
/**
* {@inheritDoc}
*/
@Override
public void saveProperties( PropertyWriter writer ) throws IOException
{
super.saveProperties( writer );
writer.writeProperty( visibleIf, "Name of the Widget, that needs to be visible for this Widget to be visible, too." );
writer.writeProperty( getImageNameProperty(), "The displayed image's name." );
writer.writeProperty( useHardwareStretching, "Whether to use hardware image stretching or software mode." );
}
/**
* {@inheritDoc}
*/
@Override
public void loadProperty( PropertyLoader loader )
{
super.loadProperty( loader );
if ( loader.loadProperty( visibleIf ) );
else if ( loader.loadProperty( getImageNameProperty() ) );
else if ( loader.loadProperty( useHardwareStretching ) );
}
/**
* {@inheritDoc}
*/
@Override
protected void addVisibilityPropertiesToContainer( PropertiesContainer propsCont, boolean forceAll )
{
super.addVisibilityPropertiesToContainer( propsCont, forceAll );
if ( getMasterWidget() == null )
{
propsCont.addProperty( visibleIf );
}
}
/**
* {@inheritDoc}
*/
@Override
public void getProperties( PropertiesContainer propsCont, boolean forceAll )
{
super.getProperties( propsCont, forceAll );
propsCont.addGroup( "Misc" );
propsCont.addProperty( getImageNameProperty() );
propsCont.addProperty( useHardwareStretching );
}
/**
* {@inheritDoc}
*/
@Override
public boolean hasMasterCanvas( boolean isEditorMode )
{
return ( !useHardwareStretching.getBooleanValue() || isEditorMode );
}
protected ImagePropertyWithTexture getImageNameProperty()
{
return ( imageName );
}
protected TransformableTexture getTransformableTexture()
{
if ( usingTransTex )
return ( transTex );
return ( null );
}
/**
* {@inheritDoc}
*/
@Override
public void afterConfigurationLoaded( WidgetsConfiguration widgetsConfig, LiveGameData gameData, boolean isEditorMode )
{
super.afterConfigurationLoaded( widgetsConfig, gameData, isEditorMode );
if ( !isEditorMode )
{
String visibleIfWidgetName = visibleIf.getStringValue().trim();
if ( visibleIfWidgetName.equals( "" ) )
visibleIfWidget = null;
else
visibleIfWidget = widgetsConfig.getWidget( visibleIfWidgetName );
}
}
/**
* {@inheritDoc}
*/
@Override
protected void initSubTextures( LiveGameData gameData, boolean isEditorMode, int widgetInnerWidth, int widgetInnerHeight, SubTextureCollector collector )
{
if ( useHardwareStretching.getBooleanValue() && !isEditorMode )
{
transTex = imageName.getImage().getTransformableTexture();
transTexDirty = false;
float scaleX = (float)widgetInnerWidth / transTex.getWidth();
float scaleY = (float)widgetInnerHeight / transTex.getHeight();
transTex.setScale( scaleX, scaleY );
collector.add( transTex );
usingTransTex = true;
}
else
{
usingTransTex = false;
}
}
/**
* {@inheritDoc}
*/
@Override
protected Boolean updateVisibility( LiveGameData gameData, boolean isEditorMode )
{
Boolean result = super.updateVisibility( gameData, isEditorMode );
if ( visibleIfWidget != null )
{
result = visibleIfWidget.isVisible();
}
return ( result );
}
protected void initTextureSize( int width, int height, boolean isEditorMode )
{
getImageNameProperty().updateSize( width, height, isEditorMode );
}
/**
* {@inheritDoc}
*/
@Override
protected void initialize( LiveGameData gameData, boolean isEditorMode, DrawnStringFactory dsf, TextureImage2D texture, int width, int height )
{
if ( !useHardwareStretching.getBooleanValue() || isEditorMode )
{
initTextureSize( width, height, isEditorMode );
}
}
@Override
protected void drawWidget( Clock clock, boolean needsCompleteRedraw, LiveGameData gameData, boolean isEditorMode, TextureImage2D texture, int offsetX, int offsetY, int width, int height )
{
if ( needsCompleteRedraw )
{
if ( usingTransTex )
{
if ( transTexDirty )
{
imageName.getImage().drawScaled( 0, 0, imageName.getImage().getBaseWidth(), imageName.getImage().getBaseHeight(), transTex.getTexture(), true );
}
}
else
{
if ( getMasterWidget() == null )
texture.clear( getImageNameProperty().getTexture(), 0, 0, width, height, offsetX, offsetY, width, height, true, null );
else
texture.drawImage( getImageNameProperty().getTexture(), 0, 0, width, height, offsetX, offsetY, width, height, true, null );
}
}
}
}