#include "Bestenliste.h" #include "Initialisierung.h" Bestenliste::Bestenliste( int id, Schrift *schrift ) : Variable( BESTENLISTE ) { this->schrift = schrift; this->id = id; ram.setFarbe( 0xFFFFFFFF ); ram.setRamenBreite( 1 ); sichtbar = 1; } Bestenliste::~Bestenliste() { schrift->release(); } int Bestenliste::getSpaltenBreite( int j ) const { if( j == -1 ) { int maxBr = 0; for( int i = 0; i < zeilen.getEintragAnzahl(); i++ ) { if( maxBr < zeilen.z( i )->getBreite() ) maxBr = zeilen.z( i )->getBreite(); } return maxBr; } int maxBr = spalten.z( j )->getBreite(); for( int i = 0; i < zeilen.getEintragAnzahl(); i++ ) { if( werte.z( i ) && werte.z( i )->z( j ) ) { if( maxBr < werte.z( i )->z( j )->getBreite() ) maxBr = werte.z( i )->z( j )->getBreite(); } } return maxBr; } void Bestenliste::setSichtbar( bool sichtbar ) { this->sichtbar = sichtbar; } void Bestenliste::addSpalte( const char *name ) { spalten.add( initTextFeld( 0, 0, -1, -1, schrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) ); } void Bestenliste::addZeile( const char *name ) { zeilen.add( initTextFeld( 0, 0, -1, -1, schrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) ); } void Bestenliste::setWert( const char *spalte, const char *zeile, const char *wert ) { int spalteI = 0; for( auto s = spalten.getIterator(); s; s++, spalteI++ ) { if( s->zText() && s->zText()->istGleich( spalte ) ) break; } int zeileI = 0; for( auto z = zeilen.getIterator(); z; z++, zeileI++ ) { if( z->zText() && z->zText()->istGleich( zeile ) ) break; } if( !werte.z( zeileI ) ) werte.set( new RCArray< TextFeld >(), zeileI ); werte.z( zeileI )->set( initTextFeld( 0, 0, -1, 20, schrift, TextFeld::Style::Text | TextFeld::Style::Center, wert ), spalteI ); } const char *Bestenliste::getWert( const char *spalte, const char *zeile ) { int spalteI = 0; for( auto s = spalten.getIterator(); s; s++, spalteI++ ) { if( s->zText() && s->zText()->istGleich( spalte ) ) break; } int zeileI = 0; for( auto z = zeilen.getIterator(); z; z++, spalteI++ ) { if( z->zText() && z->zText()->istGleich( zeile ) ) break; } if( !werte.z( zeileI ) || !werte.z( zeileI )->hat( spalteI ) || !werte.z( zeileI )->z( spalteI )->zText() ) return ""; return werte.z( zeileI )->z( spalteI )->zText()->getText(); } void Bestenliste::render( int x, int y, Bild &rObj ) { ram.setPosition( x, y ); ram.setSize( getBreite(), getHeight() ); ram.render( rObj ); Array spaltenBr; x += 1; y += 1; int startX = x; int br = getBreite(); int hi = getHeight(); int ssbr = getSpaltenBreite( -1 ); x += ssbr; for( int i = 0; i < spalten.getEintragAnzahl(); i++ ) { rObj.drawLinieV( x++, y, hi - 2, 0xFFFFFFFF ); int sbr = getSpaltenBreite( i ); TextFeld *tf = spalten.z( i ); tf->setSize( sbr, 20 ); tf->setPosition( x, y ); tf->render( rObj ); x += sbr; spaltenBr.add( sbr ); } x = startX; y += 20; for( int i = 0; i < zeilen.getEintragAnzahl(); i++ ) { rObj.drawLinieH( x, y++, br - 2, 0xFFFFFFFF ); TextFeld *tf = zeilen.z( i ); tf->setSize( ssbr, 20 ); tf->setPosition( x, y ); tf->render( rObj ); x += ssbr + 1; for( int j = 0; j < spalten.getEintragAnzahl(); j++ ) { int sbr = spaltenBr.get( j ); TextFeld *tf = werte.z( i ) ? werte.z( i )->z( j ) : 0; if( tf ) { tf->setSize( sbr, 20 ); tf->setPosition( x, y ); tf->render( rObj ); } x += sbr + 1; } x = startX; y += 20; } } int Bestenliste::getBreite() const { int br = 1; for( int i = -1; i < spalten.getEintragAnzahl(); i++ ) br += getSpaltenBreite( i ) + 1; return br; } int Bestenliste::getHeight() const { int hi = 22; for( int i = 0; i < zeilen.getEintragAnzahl(); i++ ) hi += 21; return hi; }