Bestenliste.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "Bestenliste.h"
  2. #include "Initialisierung.h"
  3. Bestenliste::Bestenliste( int id, Schrift *schrift )
  4. : Variable( BESTENLISTE )
  5. {
  6. this->schrift = schrift;
  7. this->id = id;
  8. ram.setFarbe( 0xFFFFFFFF );
  9. ram.setRamenBreite( 1 );
  10. sichtbar = 1;
  11. }
  12. Bestenliste::~Bestenliste()
  13. {
  14. schrift->release();
  15. }
  16. int Bestenliste::getSpaltenBreite( int j ) const
  17. {
  18. if( j == -1 )
  19. {
  20. int maxBr = 0;
  21. for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
  22. {
  23. if( maxBr < zeilen.z( i )->getBreite() )
  24. maxBr = zeilen.z( i )->getBreite();
  25. }
  26. return maxBr;
  27. }
  28. int maxBr = spalten.z( j )->getBreite();
  29. for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
  30. {
  31. if( werte.z( i ) && werte.z( i )->z( j ) )
  32. {
  33. if( maxBr < werte.z( i )->z( j )->getBreite() )
  34. maxBr = werte.z( i )->z( j )->getBreite();
  35. }
  36. }
  37. return maxBr;
  38. }
  39. void Bestenliste::setSichtbar( bool sichtbar )
  40. {
  41. this->sichtbar = sichtbar;
  42. }
  43. void Bestenliste::addSpalte( const char *name )
  44. {
  45. spalten.add( initTextFeld( 0, 0, -1, -1, schrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) );
  46. }
  47. void Bestenliste::addZeile( const char *name )
  48. {
  49. zeilen.add( initTextFeld( 0, 0, -1, -1, schrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) );
  50. }
  51. void Bestenliste::setWert( const char *spalte, const char *zeile, const char *wert )
  52. {
  53. int spalteI = 0;
  54. for( auto s = spalten.getIterator(); s; s++, spalteI++ )
  55. {
  56. if( s->zText() && s->zText()->istGleich( spalte ) )
  57. break;
  58. }
  59. int zeileI = 0;
  60. for( auto z = zeilen.getIterator(); z; z++, zeileI++ )
  61. {
  62. if( z->zText() && z->zText()->istGleich( zeile ) )
  63. break;
  64. }
  65. if( !werte.z( zeileI ) )
  66. werte.set( new RCArray< TextFeld >(), zeileI );
  67. werte.z( zeileI )->set( initTextFeld( 0, 0, -1, 20, schrift, TextFeld::Style::Text | TextFeld::Style::Center, wert ), spalteI );
  68. }
  69. const char *Bestenliste::getWert( const char *spalte, const char *zeile )
  70. {
  71. int spalteI = 0;
  72. for( auto s = spalten.getIterator(); s; s++, spalteI++ )
  73. {
  74. if( s->zText() && s->zText()->istGleich( spalte ) )
  75. break;
  76. }
  77. int zeileI = 0;
  78. for( auto z = zeilen.getIterator(); z; z++, spalteI++ )
  79. {
  80. if( z->zText() && z->zText()->istGleich( zeile ) )
  81. break;
  82. }
  83. if( !werte.z( zeileI ) || !werte.z( zeileI )->hat( spalteI ) || !werte.z( zeileI )->z( spalteI )->zText() )
  84. return "";
  85. return werte.z( zeileI )->z( spalteI )->zText()->getText();
  86. }
  87. void Bestenliste::render( int x, int y, Bild &rObj )
  88. {
  89. ram.setPosition( x, y );
  90. ram.setSize( getBreite(), getHeight() );
  91. ram.render( rObj );
  92. Array<int> spaltenBr;
  93. x += 1;
  94. y += 1;
  95. int startX = x;
  96. int br = getBreite();
  97. int hi = getHeight();
  98. int ssbr = getSpaltenBreite( -1 );
  99. x += ssbr;
  100. for( int i = 0; i < spalten.getEintragAnzahl(); i++ )
  101. {
  102. rObj.drawLinieV( x++, y, hi - 2, 0xFFFFFFFF );
  103. int sbr = getSpaltenBreite( i );
  104. TextFeld *tf = spalten.z( i );
  105. tf->setSize( sbr, 20 );
  106. tf->setPosition( x, y );
  107. tf->render( rObj );
  108. x += sbr;
  109. spaltenBr.add( sbr );
  110. }
  111. x = startX;
  112. y += 20;
  113. for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
  114. {
  115. rObj.drawLinieH( x, y++, br - 2, 0xFFFFFFFF );
  116. TextFeld *tf = zeilen.z( i );
  117. tf->setSize( ssbr, 20 );
  118. tf->setPosition( x, y );
  119. tf->render( rObj );
  120. x += ssbr + 1;
  121. for( int j = 0; j < spalten.getEintragAnzahl(); j++ )
  122. {
  123. int sbr = spaltenBr.get( j );
  124. TextFeld *tf = werte.z( i ) ? werte.z( i )->z( j ) : 0;
  125. if( tf )
  126. {
  127. tf->setSize( sbr, 20 );
  128. tf->setPosition( x, y );
  129. tf->render( rObj );
  130. }
  131. x += sbr + 1;
  132. }
  133. x = startX;
  134. y += 20;
  135. }
  136. }
  137. int Bestenliste::getBreite() const
  138. {
  139. int br = 1;
  140. for( int i = -1; i < spalten.getEintragAnzahl(); i++ )
  141. br += getSpaltenBreite( i ) + 1;
  142. return br;
  143. }
  144. int Bestenliste::getHeight() const
  145. {
  146. int hi = 22;
  147. for( int i = 0; i < zeilen.getEintragAnzahl(); i++ )
  148. hi += 21;
  149. return hi;
  150. }