198 lines
4.9 KiB
C++
198 lines
4.9 KiB
C++
//===========================================================================
|
|
// Copyright (C) 2000 Radical Entertainment Ltd. All rights reserved.
|
|
//
|
|
// Component: NumericText
|
|
//
|
|
// Description:
|
|
//
|
|
//
|
|
// Authors: Tony Chu
|
|
//
|
|
// Revisions Date Author Revision
|
|
// 2002/08/07 TChu Created for SRR2
|
|
//
|
|
//===========================================================================
|
|
|
|
#ifndef NUMERICTEXT_H
|
|
#define NUMERICTEXT_H
|
|
|
|
//===========================================================================
|
|
// Nested Includes
|
|
//===========================================================================
|
|
|
|
#include <raddebug.hpp> // Foundation
|
|
#include <group.h>
|
|
#include <text.h>
|
|
|
|
//===========================================================================
|
|
// Forward References
|
|
//===========================================================================
|
|
namespace Scrooby
|
|
{
|
|
class Group;
|
|
class Page;
|
|
class Text;
|
|
}
|
|
|
|
//===========================================================================
|
|
// Interface Definitions
|
|
//===========================================================================
|
|
template <class Digit>
|
|
struct NumericText
|
|
{
|
|
enum eDigits
|
|
{
|
|
DIGIT_ONES,
|
|
DIGIT_TENS,
|
|
DIGIT_HUNDREDS,
|
|
|
|
MAX_NUM_DIGITS
|
|
};
|
|
|
|
enum eAlignment
|
|
{
|
|
ALIGN_RIGHT,
|
|
ALIGN_LEFT,
|
|
|
|
NUM_ALIGNMENTS
|
|
};
|
|
|
|
Digit* m_digits[ MAX_NUM_DIGITS ];
|
|
Scrooby::Group* m_group;
|
|
int m_numDigits;
|
|
bool m_showLeadingZeros;
|
|
eAlignment m_alignment;
|
|
|
|
NumericText()
|
|
: m_group( NULL ),
|
|
m_numDigits( 0 ),
|
|
m_showLeadingZeros( false ),
|
|
m_alignment( ALIGN_RIGHT )
|
|
{
|
|
memset( m_digits, 0, sizeof( m_digits ) );
|
|
}
|
|
|
|
void SetScroobyText( Scrooby::Group* pGroup, const char* name )
|
|
{
|
|
m_group = pGroup;
|
|
m_numDigits = 0;
|
|
|
|
char objectName[ 32 ];
|
|
for( int i = 0; i < MAX_NUM_DIGITS; i++ )
|
|
{
|
|
sprintf( objectName, "%s_%d", name, i );
|
|
|
|
Digit* pDrawable = dynamic_cast<Digit*>( pGroup->GetText( objectName ) );
|
|
if( pDrawable == NULL )
|
|
{
|
|
pDrawable = dynamic_cast<Digit*>( pGroup->GetSprite( objectName ) );
|
|
}
|
|
|
|
if( pDrawable != NULL )
|
|
{
|
|
m_digits[ i ] = pDrawable;
|
|
|
|
// increment number of digits
|
|
//
|
|
m_numDigits++;
|
|
}
|
|
else
|
|
{
|
|
// break, assuming no more digits to follow
|
|
//
|
|
break;
|
|
}
|
|
}
|
|
|
|
// set value to zero by default
|
|
//
|
|
this->SetValue( 0 );
|
|
}
|
|
|
|
void SetValue( unsigned int value, unsigned int offset = 0 )
|
|
{
|
|
for( int i = 0; i < m_numDigits; i++ )
|
|
{
|
|
// set current digit value
|
|
rAssert( m_digits[ i ] );
|
|
|
|
m_digits[ i ]->SetIndex( value % 10 + offset );
|
|
|
|
// show leading zeros, if enabled
|
|
if( m_showLeadingZeros )
|
|
{
|
|
m_digits[ i ]->SetVisible( true );
|
|
}
|
|
else
|
|
{
|
|
m_digits[ i ]->SetVisible( value > 0 || i == 0 );
|
|
}
|
|
|
|
// shift value one digit to the right
|
|
value = value / 10;
|
|
}
|
|
|
|
if( m_alignment == ALIGN_LEFT )
|
|
{
|
|
// align numeric text to the left (TC: Can this be improved??)
|
|
for( int j = m_numDigits - 1; j >= 0; j-- )
|
|
{
|
|
if( m_digits[ j ]->IsVisible() )
|
|
{
|
|
// found leading digit = j, now shift digits to the left
|
|
//
|
|
for( int k = m_numDigits - 1; k >= 0; k-- )
|
|
{
|
|
if( j >= 0 )
|
|
{
|
|
m_digits[ k ]->SetIndex( m_digits[ j ]->GetIndex() );
|
|
m_digits[ k ]->SetVisible( true );
|
|
|
|
j--;
|
|
}
|
|
else
|
|
{
|
|
m_digits[ k ]->SetVisible( false );
|
|
}
|
|
}
|
|
|
|
// done, break out of loop
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void SetVisible( bool isVisible )
|
|
{
|
|
if( m_group != NULL )
|
|
{
|
|
m_group->SetVisible( isVisible );
|
|
}
|
|
else
|
|
{
|
|
for( int i = 0; i < MAX_NUM_DIGITS; i++ )
|
|
{
|
|
if( m_digits[ i ] != NULL )
|
|
{
|
|
m_digits[ i ]->SetVisible( isVisible );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void SetColour( tColour colour )
|
|
{
|
|
for( int i = 0; i < MAX_NUM_DIGITS; i++ )
|
|
{
|
|
if( m_digits[ i ] != NULL )
|
|
{
|
|
m_digits[ i ]->SetColour( colour );
|
|
}
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
#endif // NUMERICTEXT_H
|