AccountSpielPartner.cpp 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126
  1. #include "AccountSpielPartner.h"
  2. #include "../../../Global/Initialisierung.h"
  3. #include "../../../Global/Variablen.h"
  4. #include <Rahmen.h>
  5. #include <DateiSystem.h>
  6. #include <ToolTip.h>
  7. #include <Punkt.h>
  8. #define HATSTYLE( b ) ( daten->style | (b) ) == daten->style
  9. // Inhalt der AccountSPListeEintrag Klasse aus AccountSpielPartner.h
  10. // Konstruktor
  11. AccountSPListeEintrag::AccountSPListeEintrag( AccountSPListeEintragDaten *daten, Schrift *zSchrift )
  12. : daten( daten ),
  13. ram( new LRahmen() ),
  14. members( new RCArray< AccountSPListeEintrag >() ),
  15. name( initTextFeld( 5, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Name" ) ),
  16. anzahl( initTextFeld( 110, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " ) ),
  17. prozent( initFBalken( 220, 0, 400, 20, zSchrift, FBalken::Style::normal ) ),
  18. details( initKnopf( 580, 0, 20, 20, 0, 0, "" ) ),
  19. ausklappen( bilder->get( "account.ltdb/ausklappen.png" ) ),
  20. einklappen( bilder->get( "account.ltdb/einklappen.png" ) ),
  21. sortSpalte( new Text( "Name" ) ),
  22. sortAbsteigend( 0 ),
  23. tickVal( 0 ),
  24. rend( 0 ),
  25. ref( 1 )
  26. {
  27. if( !einklappen )
  28. {
  29. LTDBDatei *datei = new LTDBDatei();
  30. datei->setDatei( new Text( "data/client/bilder/account.ltdb" ) );
  31. datei->leseDaten( 0 );
  32. einklappen = datei->laden( 0, new Text( "einklappen.png" ) );
  33. datei->release();
  34. bilder->add( "account.ltdb/einklappen.png", einklappen->getThis() );
  35. }
  36. if( !ausklappen )
  37. {
  38. LTDBDatei *datei = new LTDBDatei();
  39. datei->setDatei( new Text( "data/client/bilder/account.ltdb" ) );
  40. datei->leseDaten( 0 );
  41. ausklappen = datei->laden( 0, new Text( "ausklappen.png" ) );
  42. datei->release();
  43. bilder->add( "account.ltdb/ausklappen.png", ausklappen->getThis() );
  44. }
  45. details->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
  46. details->setHintergrundBildZ( ausklappen->getThis() );
  47. initToolTip( details, "Details anzeigen.", zSchrift->getThis(), hauptScreen );
  48. ram->setFarbe( 0xFFFFFFFF );
  49. ram->setRamenBreite( 1 );
  50. ram->setSize( 0, 20 );
  51. if( daten->name )
  52. name->setText( daten->name->getText() );
  53. anzahl->zText()->append( daten->anzahl );
  54. zSchrift->lock();
  55. zSchrift->setSchriftSize( 12 );
  56. name->setSize( zSchrift->getTextBreite( name->zText() ) + 5, name->getHeight() );
  57. anzahl->setPosition( ( name->getX() + name->getBreite() + 10 ) < 100 ? 100 : ( name->getX() + name->getBreite() + 10 ), anzahl->getY() );
  58. anzahl->setSize( zSchrift->getTextBreite( anzahl->zText() ) + 5, anzahl->getHeight() );
  59. zSchrift->unlock();
  60. prozent->setPosition( ( anzahl->getX() + anzahl->getBreite() + 10 ) < 200 ? 200 : ( anzahl->getX() + anzahl->getBreite() + 10 ), prozent->getY() );
  61. prozent->setAktionAnzahl( 100 );
  62. prozent->aktionPlus( daten->prozent );
  63. }
  64. // Destruktor
  65. AccountSPListeEintrag::~AccountSPListeEintrag()
  66. {
  67. ram->release();
  68. members->release();
  69. name->release();
  70. anzahl->release();
  71. prozent->release();
  72. details->release();
  73. ausklappen->release();
  74. einklappen->release();
  75. sortSpalte->release();
  76. daten->name->release();
  77. delete daten;
  78. }
  79. // privat
  80. int AccountSPListeEintrag::getReihenfolge( int *arr )
  81. {
  82. int anz = members->getEintragAnzahl();
  83. if( !anz || !HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  84. return 0;
  85. int ret = 0;
  86. bool *fertig = new bool[ anz ];
  87. ZeroMemory( fertig, anz );
  88. for( int i = 0; i < anz; i++ )
  89. {
  90. int index = -1;
  91. int minMax = 0;
  92. Text minMaxT;
  93. for( int j = 0; j < anz; j++ )
  94. {
  95. AccountSPListeEintrag *tmp = members->z( j );
  96. if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
  97. ( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
  98. {
  99. minMaxT = tmp->zDaten()->name->getText();
  100. index = j;
  101. }
  102. else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
  103. ( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
  104. {
  105. minMax = tmp->zDaten()->anzahl;
  106. index = j;
  107. }
  108. else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
  109. ( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
  110. {
  111. minMax = tmp->zDaten()->prozent;
  112. index = j;
  113. }
  114. }
  115. if( index < 0 )
  116. break;
  117. fertig[ index ] = 1;
  118. arr[ ret ] = index;
  119. ret++;
  120. }
  121. delete[] fertig;
  122. return ret;
  123. }
  124. // nicht constant
  125. void AccountSPListeEintrag::addMember( AccountSPListeEintrag *e )
  126. {
  127. members->add( e );
  128. rend = 1;
  129. }
  130. void AccountSPListeEintrag::setSortSpalte( char *sp )
  131. {
  132. sortSpalte->setText( sp );
  133. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  134. {
  135. int anz = members->getEintragAnzahl();
  136. for( int i = 0; i < anz; i++ )
  137. members->z( i )->setSortSpalte( sp );
  138. }
  139. rend = 1;
  140. }
  141. void AccountSPListeEintrag::setSortRichtung( bool absteigend )
  142. {
  143. sortAbsteigend = absteigend;
  144. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  145. {
  146. int anz = members->getEintragAnzahl();
  147. for( int i = 0; i < anz; i++ )
  148. members->z( i )->setSortRichtung( absteigend );
  149. }
  150. rend = 1;
  151. }
  152. bool AccountSPListeEintrag::tick( double tickVal )
  153. {
  154. rend |= details->tick( tickVal );
  155. int anz = members->getEintragAnzahl();
  156. for( int i = 0; i < anz; i++ )
  157. rend |= members->z( i )->tick( tickVal );
  158. this->tickVal += tickVal * 150;
  159. int val = ( int )this->tickVal;
  160. this->tickVal -= val;
  161. if( val )
  162. {
  163. if( details->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
  164. {
  165. if( ram->getHeight() - val < 20 )
  166. ram->setSize( ram->getBreite(), 20 );
  167. else
  168. ram->setSize( ram->getBreite(), ram->getHeight() - val );
  169. rend = 1;
  170. }
  171. if( details->zHintergrundBild() == einklappen )
  172. {
  173. int maxHö = 20;
  174. for( int i = 0; i < anz; i++ )
  175. maxHö += 5 + members->z( i )->getHeight();
  176. if( maxHö > 20 )
  177. maxHö += 5;
  178. if( ram->getHeight() > maxHö )
  179. {
  180. if( ram->getHeight() - val < maxHö )
  181. ram->setSize( ram->getBreite(), maxHö );
  182. else
  183. ram->setSize( ram->getBreite(), ram->getHeight() - val );
  184. rend = 1;
  185. }
  186. if( ram->getHeight() < maxHö )
  187. {
  188. if( ram->getHeight() + val > maxHö )
  189. ram->setSize( ram->getBreite(), maxHö );
  190. else
  191. ram->setSize( ram->getBreite(), ram->getHeight() + val );
  192. rend = 1;
  193. }
  194. }
  195. }
  196. bool ret = rend;
  197. rend = 0;
  198. return ret;
  199. }
  200. void AccountSPListeEintrag::doMausEreignis( MausEreignis &me )
  201. {
  202. int mx = me.mx;
  203. int my = me.my;
  204. bool vera = 0;
  205. if( me.mx < 0 || me.my < 0 || me.mx > ram->getBreite() || me.my > ram->getHeight() )
  206. {
  207. vera = 1;
  208. me.verarbeitet = 1;
  209. }
  210. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  211. {
  212. bool ok = me.verarbeitet;
  213. details->doMausEreignis( me );
  214. if( !ok && me.verarbeitet && me.id == ME_RLinks )
  215. {
  216. if( details->zHintergrundBild() == ausklappen )
  217. {
  218. details->setHintergrundBildZ( einklappen->getThis() );
  219. details->zToolTip()->setText( "Karten verbergen." );
  220. }
  221. else
  222. {
  223. details->setHintergrundBildZ( ausklappen->getThis() );
  224. details->zToolTip()->setText( "Karten anzeigen." );
  225. }
  226. }
  227. }
  228. if( ram->getHeight() > 20 )
  229. {
  230. int anz = members->getEintragAnzahl();
  231. int *rf = new int[ anz ];
  232. int rfAnz = getReihenfolge( rf );
  233. me.my -= 25;
  234. for( int i = 0; i < rfAnz; i++ )
  235. {
  236. members->z( rf[ i ] )->doMausEreignis( me );
  237. me.my -= members->z( rf[ i ] )->getHeight() + 5;
  238. }
  239. delete[] rf;
  240. }
  241. me.mx = mx;
  242. me.my = my;
  243. if( vera )
  244. me.verarbeitet = 0;
  245. }
  246. void AccountSPListeEintrag::render( int xOff, int yOff, int breite, Bild &zRObj )
  247. {
  248. ram->setSize( breite, ram->getHeight() );
  249. details->setPosition( ram->getBreite() - 20, details->getY() );
  250. if( !zRObj.setDrawOptions( xOff, yOff, breite, ram->getHeight() ) )
  251. return;
  252. name->render( zRObj );
  253. anzahl->render( zRObj );
  254. prozent->render( zRObj );
  255. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  256. details->render( zRObj );
  257. ram->render( zRObj );
  258. if( ram->getHeight() > 20 )
  259. {
  260. zRObj.drawLinieH( 0, 20, ram->getBreite(), ram->getFarbe() );
  261. int anz = members->getEintragAnzahl();
  262. int *rf = new int[ anz ];
  263. int rfAnz = getReihenfolge( rf );
  264. yOff = 0;
  265. for( int i = 0; i < rfAnz; i++ )
  266. {
  267. members->z( rf[ i ] )->render( 5, yOff + 25, breite - 10, zRObj );
  268. yOff += 5 + members->z( rf[ i ] )->getHeight();
  269. }
  270. delete[] rf;
  271. }
  272. zRObj.releaseDrawOptions();
  273. }
  274. // constant
  275. int AccountSPListeEintrag::getHeight() const
  276. {
  277. return ram->getHeight();
  278. }
  279. AccountSPListeEintragDaten *AccountSPListeEintrag::zDaten() const
  280. {
  281. return daten;
  282. }
  283. // Reference Counting
  284. AccountSPListeEintrag *AccountSPListeEintrag::getThis()
  285. {
  286. ref++;
  287. return this;
  288. }
  289. AccountSPListeEintrag *AccountSPListeEintrag::release()
  290. {
  291. ref--;
  292. if( !ref )
  293. delete this;
  294. return 0;
  295. }
  296. // Inhalt der AccountSPListe Klasse aus AccountSpielPartner.h
  297. // Konstruktor
  298. AccountSPListe::AccountSPListe( Schrift *zSchrift )
  299. : Zeichnung(),
  300. schrift( zSchrift->getThis() ),
  301. ram( new LRahmen() ),
  302. scroll( new VScrollBar() ),
  303. skp( new RCArray< AccountSPListeEintrag >() ),
  304. spk( new RCArray< AccountSPListeEintrag >() ),
  305. psk( new RCArray< AccountSPListeEintrag >() ),
  306. gruppierung( new Text( "Spieler/Spiel/Karte" ) ),
  307. sortSpalte( new Text( "Name" ) ),
  308. sortAbsteigend( 0 ),
  309. rend( 0 ),
  310. ref( 1 )
  311. {
  312. pos = Punkt( 10, 40 );
  313. ram->setSize( 760, 380 );
  314. ram->setFarbe( 0xFFFFFFFF );
  315. ram->setRamenBreite( 1 );
  316. }
  317. // Destruktor
  318. AccountSPListe::~AccountSPListe()
  319. {
  320. schrift->release();
  321. ram->release();
  322. scroll->release();
  323. skp->release();
  324. spk->release();
  325. psk->release();
  326. gruppierung->release();
  327. sortSpalte->release();
  328. }
  329. // privat
  330. int AccountSPListe::getReihenfolge( int *arr )
  331. {
  332. RCArray< AccountSPListeEintrag > *members = 0;
  333. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  334. members = skp;
  335. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  336. members = spk;
  337. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  338. members = psk;
  339. int anz = members->getEintragAnzahl();
  340. if( !anz )
  341. return 0;
  342. int ret = 0;
  343. bool *fertig = new bool[ anz ];
  344. ZeroMemory( fertig, anz );
  345. for( int i = 0; i < anz; i++ )
  346. {
  347. int index = -1;
  348. int minMax = 0;
  349. Text minMaxT;
  350. for( int j = 0; j < anz; j++ )
  351. {
  352. AccountSPListeEintrag *tmp = members->z( j );
  353. if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
  354. ( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
  355. {
  356. minMaxT = tmp->zDaten()->name->getText();
  357. index = j;
  358. }
  359. else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
  360. ( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
  361. {
  362. minMax = tmp->zDaten()->anzahl;
  363. index = j;
  364. }
  365. else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
  366. ( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
  367. {
  368. minMax = tmp->zDaten()->prozent;
  369. index = j;
  370. }
  371. }
  372. if( index < 0 )
  373. break;
  374. fertig[ index ] = 1;
  375. arr[ ret ] = index;
  376. ret++;
  377. }
  378. delete[] fertig;
  379. return ret;
  380. }
  381. // nicht constant
  382. void AccountSPListe::reset()
  383. {
  384. lockZeichnung();
  385. skp->leeren();
  386. spk->leeren();
  387. psk->leeren();
  388. unlockZeichnung();
  389. }
  390. void AccountSPListe::ladeDaten( int accId )
  391. {
  392. Array< int > *spieler = new Array< int >();
  393. Array< int > *karten = new Array< int >();
  394. Array< int > *anzahl = new Array< int >();
  395. if( infoKlient->getSpielPartnerListe( accId, spieler, karten, anzahl ) )
  396. {
  397. int anz = spieler->getEintragAnzahl();
  398. int spielerAnzahl = 0;
  399. int spielArtAnzahl = 0;
  400. int anzahlGesammt = 0;
  401. Array< int > *spielerUnique = new Array< int >();
  402. Array< int > *spielArt = new Array< int >();
  403. for( int i = 0; i < anz; i++ )
  404. { // Spiel Art Ids ermitteln
  405. anzahlGesammt += anzahl->get( i );
  406. if( spieler->hat( i ) && spielerUnique->getWertIndex( spieler->get( i ) ) < 0 )
  407. {
  408. spielerUnique->set( spieler->get( i ), spielerAnzahl );
  409. spielerAnzahl++;
  410. }
  411. if( !spielArt->hat( i ) )
  412. {
  413. spielArtAnzahl++;
  414. int id = infoKlient->getSpielId( karten->get( i ) );
  415. for( int j = i; j < anz; j++ )
  416. {
  417. if( karten->get( j ) == karten->get( i ) )
  418. spielArt->set( id, j );
  419. }
  420. }
  421. }
  422. spielerUnique->release();
  423. // Spiel/Karte/Spieler Tabelle initialisieren
  424. Array< int > *spielArtVera = new Array< int >();
  425. for( int i = 0; i < spielArtAnzahl; i++ )
  426. { // Spiel Arten Einträge
  427. int id = 0;
  428. for( int j = 0; j < anz; j++ )
  429. {
  430. if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
  431. {
  432. id = spielArt->get( j );
  433. spielArtVera->add( id );
  434. break;
  435. }
  436. }
  437. if( !id )
  438. break;
  439. AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
  440. tmp->id = id;
  441. tmp->name = infoKlient->getSpielName( tmp->id );
  442. tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
  443. tmp->anzahl = 0;
  444. for( int j = 0; j < anz; j++ )
  445. {
  446. if( spielArt->get( j ) == tmp->id )
  447. tmp->anzahl += anzahl->get( j );
  448. }
  449. tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
  450. AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp, schrift );
  451. skp->add( spielE );
  452. Array< int > *kartenVera = new Array< int >();
  453. for( int j = 0; j < anz; j++ )
  454. { // Karten Einträge
  455. int id = 0;
  456. for( int k = 0; k < anz; k++ )
  457. {
  458. if( spielArt->get( k ) == tmp->id )
  459. {
  460. if( kartenVera->getWertIndex( karten->get( k ) ) < 0 )
  461. {
  462. id = karten->get( k );
  463. kartenVera->add( id );
  464. break;
  465. }
  466. }
  467. }
  468. if( !id )
  469. break;
  470. AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
  471. tmpk->id = id;
  472. tmpk->name = infoKlient->getKarteName( tmpk->id );
  473. tmpk->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Karte;
  474. tmpk->anzahl = 0;
  475. for( int k = 0; k < anz; k++ )
  476. {
  477. if( karten->get( k ) == tmpk->id )
  478. tmpk->anzahl += anzahl->get( k );
  479. }
  480. tmpk->prozent = tmpk->anzahl * 100 / tmp->anzahl;
  481. AccountSPListeEintrag *karteE = new AccountSPListeEintrag( tmpk, schrift );
  482. spielE->addMember( karteE );
  483. Array< int > *spielerVera = new Array< int >();
  484. for( int k = 0; k < anz; k++ )
  485. { // Spieler Einträge
  486. int id = 0;
  487. int gAnz = 0;
  488. for( int l = 0; l < anz; l++ )
  489. {
  490. if( karten->get( l ) == tmpk->id )
  491. {
  492. if( spielerVera->getWertIndex( spieler->get( l ) ) < 0 )
  493. {
  494. id = spieler->get( l );
  495. spielerVera->add( id );
  496. gAnz = anzahl->get( l );
  497. break;
  498. }
  499. }
  500. }
  501. if( !id )
  502. break;
  503. AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
  504. tmps->id = id;
  505. tmps->name = infoKlient->getSpielerName( tmps->id );
  506. tmps->style = ASPLEDStyle::Spieler;
  507. tmps->anzahl = gAnz;
  508. tmps->prozent = tmps->anzahl * 100 / tmpk->anzahl;
  509. karteE->addMember( new AccountSPListeEintrag( tmps, schrift ) );
  510. }
  511. spielerVera->release();
  512. }
  513. kartenVera->release();
  514. }
  515. spielArtVera->leeren();
  516. // Spiel/Spieler/Karte Tabelle initialisieren
  517. for( int i = 0; i < spielArtAnzahl; i++ )
  518. { // Spiel Arten Einträge
  519. int id = 0;
  520. for( int j = 0; j < anz; j++ )
  521. {
  522. if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
  523. {
  524. id = spielArt->get( j );
  525. spielArtVera->add( id );
  526. break;
  527. }
  528. }
  529. if( !id )
  530. break;
  531. AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
  532. tmp->id = id;
  533. tmp->name = infoKlient->getSpielName( tmp->id );
  534. tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
  535. tmp->anzahl = 0;
  536. for( int j = 0; j < anz; j++ )
  537. {
  538. if( spielArt->get( j ) == tmp->id )
  539. tmp->anzahl += anzahl->get( j );
  540. }
  541. tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
  542. AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp, schrift );
  543. spk->add( spielE );
  544. Array< int > *spielerVera = new Array< int >();
  545. for( int j = 0; j < anz; j++ )
  546. { // Spieler Einträge
  547. int id = 0;
  548. for( int k = 0; k < anz; k++ )
  549. {
  550. if( spielArt->get( k ) == tmp->id )
  551. {
  552. if( spielerVera->getWertIndex( spieler->get( k ) ) < 0 )
  553. {
  554. id = spieler->get( k );
  555. spielerVera->add( id );
  556. break;
  557. }
  558. }
  559. }
  560. if( !id )
  561. break;
  562. AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
  563. tmps->id = id;
  564. tmps->name = infoKlient->getSpielerName( tmps->id );
  565. tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Spieler;
  566. tmps->anzahl = 0;
  567. for( int k = 0; k < anz; k++ )
  568. {
  569. if( spieler->get( k ) == tmps->id && spielArt->get( k ) == tmp->id )
  570. tmps->anzahl += anzahl->get( k );
  571. }
  572. tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
  573. AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmps, schrift );
  574. spielE->addMember( spielerE );
  575. Array< int > *karteVera = new Array< int >();
  576. for( int k = 0; k < anz; k++ )
  577. { // Karten Einträge
  578. int id = 0;
  579. int gAnz = 0;
  580. for( int l = 0; l < anz; l++ )
  581. {
  582. if( spieler->get( l ) == tmps->id && spielArt->get( l ) == tmp->id )
  583. {
  584. if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
  585. {
  586. id = karten->get( l );
  587. karteVera->add( id );
  588. gAnz = anzahl->get( l );
  589. break;
  590. }
  591. }
  592. }
  593. if( !id )
  594. break;
  595. AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
  596. tmpk->id = id;
  597. tmpk->name = infoKlient->getKarteName( tmpk->id );
  598. tmpk->style = ASPLEDStyle::Karte;
  599. tmpk->anzahl = gAnz;
  600. tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
  601. spielerE->addMember( new AccountSPListeEintrag( tmpk, schrift ) );
  602. }
  603. karteVera->release();
  604. }
  605. spielerVera->release();
  606. }
  607. spielArtVera->release();
  608. // Spieler/Spiel/Karte Tabelle initialisieren
  609. Array< int > *spielerVera = new Array< int >();
  610. for( int i = 0; i < spielerAnzahl; i++ )
  611. { // Spieler Einträge
  612. int id = 0;
  613. for( int j = 0; j < anz; j++ )
  614. {
  615. if( spielerVera->getWertIndex( spieler->get( j ) ) < 0 )
  616. {
  617. id = spieler->get( j );
  618. spielerVera->add( id );
  619. break;
  620. }
  621. }
  622. if( !id )
  623. break;
  624. AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
  625. tmp->id = id;
  626. tmp->name = infoKlient->getSpielerName( tmp->id );
  627. tmp->style = ASPLEDStyle::Spieler | ASPLEDStyle::Ausklappbar;
  628. tmp->anzahl = 0;
  629. for( int j = 0; j < anz; j++ )
  630. {
  631. if( spieler->get( j ) == tmp->id )
  632. tmp->anzahl += anzahl->get( j );
  633. }
  634. tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
  635. AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmp, schrift );
  636. psk->add( spielerE );
  637. Array< int > *spielVera = new Array< int >();
  638. for( int j = 0; j < anz; j++ )
  639. { // Spiel Einträge
  640. int id = 0;
  641. for( int k = 0; k < anz; k++ )
  642. {
  643. if( spieler->get( k ) == tmp->id )
  644. {
  645. if( spielVera->getWertIndex( spielArt->get( k ) ) < 0 )
  646. {
  647. id = spielArt->get( k );
  648. spielVera->add( id );
  649. break;
  650. }
  651. }
  652. }
  653. if( !id )
  654. break;
  655. AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
  656. tmps->id = id;
  657. tmps->name = infoKlient->getSpielName( tmps->id );
  658. tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::SpielArt;
  659. tmps->anzahl = 0;
  660. for( int k = 0; k < anz; k++ )
  661. {
  662. if( spieler->get( k ) == tmp->id && spielArt->get( k ) == tmps->id )
  663. tmps->anzahl += anzahl->get( k );
  664. }
  665. tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
  666. AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmps, schrift );
  667. spielerE->addMember( spielE );
  668. Array< int > *karteVera = new Array< int >();
  669. for( int k = 0; k < anz; k++ )
  670. { // Karte Einträge
  671. int id = 0;
  672. int gAnz = 0;
  673. for( int l = 0; l < anz; l++ )
  674. {
  675. if( spieler->get( l ) == tmp->id && spielArt->get( l ) == tmps->id )
  676. {
  677. if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
  678. {
  679. id = karten->get( l );
  680. karteVera->add( id );
  681. gAnz = anzahl->get( l );
  682. break;
  683. }
  684. }
  685. }
  686. if( !id )
  687. break;
  688. AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
  689. tmpk->id = id;
  690. tmpk->name = infoKlient->getKarteName( tmpk->id );
  691. tmpk->style = ASPLEDStyle::Karte;
  692. tmpk->anzahl = gAnz;
  693. tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
  694. spielE->addMember( new AccountSPListeEintrag( tmpk, schrift ) );
  695. }
  696. karteVera->release();
  697. }
  698. spielVera->release();
  699. }
  700. spielerVera->release();
  701. spielArt->release();
  702. }
  703. else
  704. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spielpartner dieses Spielers konnten nicht ermittelt werden." ), new Text( "Ok" ) );
  705. spieler->release();
  706. karten->release();
  707. anzahl->release();
  708. }
  709. void AccountSPListe::setGruppierung( char *gp )
  710. {
  711. lockZeichnung();
  712. gruppierung->setText( gp );
  713. rend = 1;
  714. unlockZeichnung();
  715. }
  716. void AccountSPListe::setSortSpalte( char *sp )
  717. {
  718. lockZeichnung();
  719. sortSpalte->setText( sp );
  720. int anz = skp->getEintragAnzahl();
  721. for( int i = 0; i < anz; i++ )
  722. skp->z( i )->setSortSpalte( sp );
  723. anz = spk->getEintragAnzahl();
  724. for( int i = 0; i < anz; i++ )
  725. spk->z( i )->setSortSpalte( sp );
  726. anz = psk->getEintragAnzahl();
  727. for( int i = 0; i < anz; i++ )
  728. psk->z( i )->setSortSpalte( sp );
  729. rend = 1;
  730. unlockZeichnung();
  731. }
  732. void AccountSPListe::setSortRichtung( bool absteigend )
  733. {
  734. lockZeichnung();
  735. sortAbsteigend = absteigend;
  736. int anz = skp->getEintragAnzahl();
  737. for( int i = 0; i < anz; i++ )
  738. skp->z( i )->setSortRichtung( absteigend );
  739. anz = spk->getEintragAnzahl();
  740. for( int i = 0; i < anz; i++ )
  741. spk->z( i )->setSortRichtung( absteigend );
  742. anz = psk->getEintragAnzahl();
  743. for( int i = 0; i < anz; i++ )
  744. psk->z( i )->setSortRichtung( absteigend );
  745. rend = 1;
  746. unlockZeichnung();
  747. }
  748. bool AccountSPListe::tick( double tickVal )
  749. {
  750. lockZeichnung();
  751. RCArray< AccountSPListeEintrag > *members = 0;
  752. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  753. members = skp;
  754. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  755. members = spk;
  756. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  757. members = psk;
  758. int anz = members->getEintragAnzahl();
  759. int *rf = new int[ anz ];
  760. int rfAnz = getReihenfolge( rf );
  761. for( int i = 0; i < rfAnz; i++ )
  762. rend |= members->z( rf[ i ] )->tick( tickVal );
  763. delete[] rf;
  764. unlockZeichnung();
  765. rend |= scroll->getRend();
  766. bool ret = rend;
  767. rend = 0;
  768. return ret;
  769. }
  770. void AccountSPListe::doMausEreignis( MausEreignis &me )
  771. {
  772. bool vera = 0;
  773. if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
  774. {
  775. vera = 1;
  776. me.verarbeitet = 1;
  777. }
  778. int mx = me.mx, my = me.my;
  779. me.mx -= pos.x;
  780. me.my -= pos.y;
  781. scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
  782. me.mx -= 10;
  783. me.my -= 10 - scroll->getScroll();
  784. lockZeichnung();
  785. RCArray< AccountSPListeEintrag > *members = 0;
  786. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  787. members = skp;
  788. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  789. members = spk;
  790. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  791. members = psk;
  792. int anz = members->getEintragAnzahl();
  793. int *rf = new int[ anz ];
  794. int rfAnz = getReihenfolge( rf );
  795. for( int i = 0; i < rfAnz; i++ )
  796. {
  797. members->z( rf[ i ] )->doMausEreignis( me );
  798. me.my -= members->z( rf[ i ] )->getHeight() + 10;
  799. }
  800. delete[] rf;
  801. unlockZeichnung();
  802. me.mx = mx, me.my = my;
  803. if( vera )
  804. me.verarbeitet = 0;
  805. }
  806. void AccountSPListe::render( Bild &zRObj )
  807. {
  808. if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
  809. return;
  810. ram->render( zRObj );
  811. scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
  812. if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
  813. {
  814. zRObj.releaseDrawOptions();
  815. return;
  816. }
  817. int anzHö = 10;
  818. lockZeichnung();
  819. RCArray< AccountSPListeEintrag > *members = 0;
  820. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  821. members = skp;
  822. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  823. members = spk;
  824. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  825. members = psk;
  826. int anz = members->getEintragAnzahl();
  827. int *rf = new int[ anz ];
  828. int rfAnz = getReihenfolge( rf );
  829. for( int i = 0; i < rfAnz; i++ )
  830. {
  831. members->z( rf[ i ] )->render( 10, anzHö - scroll->getScroll(), ram->getBreite() - 36, zRObj );
  832. anzHö += members->z( rf[ i ] )->getHeight() + 10;
  833. }
  834. delete[] rf;
  835. unlockZeichnung();
  836. scroll->update( anzHö, ram->getHeight() - 2 );
  837. zRObj.releaseDrawOptions();
  838. zRObj.releaseDrawOptions();
  839. }
  840. // constant
  841. // Reference Counting
  842. AccountSPListe *AccountSPListe::getThis()
  843. {
  844. ref++;
  845. return this;
  846. }
  847. AccountSPListe *AccountSPListe::release()
  848. {
  849. ref--;
  850. if( !ref )
  851. delete this;
  852. return 0;
  853. }
  854. // Inhalt der AccountSpielPartner Klasse aus AccountSpielPartner.h
  855. // Konstruktor
  856. AccountSpielPartner::AccountSpielPartner( Schrift *zSchrift )
  857. : Thread(),
  858. spielPartnerF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Spielpartner von " ) ),
  859. gruppAusw( initAuswahlBox( 10, 10, 150, 20, zSchrift, ABSTYLE, { "Spieler/Spiel/Karte", "Spiel/Karte/Spieler", "Spiel/Spieler/Karte" } ) ),
  860. sortSpalte( initAuswahlBox( 170, 10, 150, 20, zSchrift, ABSTYLE, { "Name", "Spiele", "Prozent" } ) ),
  861. sortRichtung( initAuswahlBox( 330, 10, 150, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
  862. liste( new AccountSPListe( zSchrift ) ),
  863. status( 0 ),
  864. accId( 0 ),
  865. animation( 0 ),
  866. alpha( 255 ),
  867. tickVal( 0 ),
  868. rend( 0 ),
  869. ref( 1 )
  870. {
  871. initToolTip( gruppAusw, "Wähle Gruppierung aus, nach der die Daten angezeigt werden sollen.", zSchrift->getThis(), hauptScreen );
  872. initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", zSchrift->getThis(), hauptScreen );
  873. initToolTip( sortRichtung, "Wähle aus, Ob Aufwärts oder Abwärts sortiert werden soll.", zSchrift->getThis(), hauptScreen );
  874. spielPartnerF->addMember( liste );
  875. spielPartnerF->addMember( gruppAusw );
  876. spielPartnerF->addMember( sortSpalte );
  877. spielPartnerF->addMember( sortRichtung );
  878. spielPartnerF->setMausEreignis( _ret1ME );
  879. }
  880. // Destruktor
  881. AccountSpielPartner::~AccountSpielPartner()
  882. {
  883. spielPartnerF->release();
  884. gruppAusw->release();
  885. sortSpalte->release();
  886. sortRichtung->release();
  887. liste->release();
  888. }
  889. // nicht constant
  890. void AccountSpielPartner::reset()
  891. {
  892. liste->reset();
  893. }
  894. void AccountSpielPartner::ladeStatistik( int accId )
  895. {
  896. if( this->accId == accId )
  897. return;
  898. this->status = 0;
  899. if( run )
  900. {
  901. warteAufThread( 1000 );
  902. ende();
  903. }
  904. if( ( animation | 0x1 ) == animation )
  905. {
  906. animation |= 0x4;
  907. this->accId = accId;
  908. this->status = 1;
  909. return;
  910. }
  911. if( this->accId )
  912. reset();
  913. this->accId = accId;
  914. start();
  915. this->status = 1;
  916. }
  917. void AccountSpielPartner::thread()
  918. {
  919. Text *name = infoKlient->getSpielerName( accId );
  920. if( name )
  921. {
  922. name->insert( 0, "Spielpartner von " );
  923. spielPartnerF->setTitel( *name );
  924. name->release();
  925. }
  926. liste->ladeDaten( accId );
  927. animation &= ~0x4;
  928. status = 2;
  929. run = 0;
  930. }
  931. void AccountSpielPartner::setSichtbar( bool sichtbar, bool nachRechts )
  932. {
  933. if( sichtbar )
  934. {
  935. if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
  936. {
  937. if( nachRechts )
  938. spielPartnerF->setPosition( -810, 40 );
  939. else
  940. spielPartnerF->setPosition( 810, 40 );
  941. }
  942. animation |= 0x1;
  943. }
  944. else
  945. animation &= ~0x1;
  946. if( nachRechts )
  947. animation |= 0x2;
  948. else
  949. animation &= ~0x2;
  950. }
  951. bool AccountSpielPartner::tick( double zeit )
  952. {
  953. rend |= spielPartnerF->tick( zeit );
  954. tickVal += zeit;
  955. int valA = (int)( tickVal * 150 );
  956. int valB = (int)( tickVal * 500 );
  957. tickVal -= valA / 150.0;
  958. if( valA )
  959. {
  960. if( ( animation | 0x4 ) == animation && alpha )
  961. {
  962. if( alpha - valA <= 0 )
  963. alpha = 0;
  964. else
  965. alpha -= valA;
  966. rend = 1;
  967. if( !alpha )
  968. {
  969. reset();
  970. start();
  971. }
  972. }
  973. if( ( animation | 0x4 ) != animation && alpha != 255 )
  974. {
  975. if( alpha + valA >= 255 )
  976. alpha = 255;
  977. else
  978. alpha += valA;
  979. rend = 1;
  980. }
  981. }
  982. if( valB )
  983. {
  984. if( ( animation | 0x1 ) == animation )
  985. { // Sichtbar
  986. if( ( animation | 0x2 ) == animation )
  987. { // Nach Rechts
  988. if( spielPartnerF->getX() != 10 )
  989. {
  990. if( spielPartnerF->getX() + valB > 10 )
  991. spielPartnerF->setPosition( 10, spielPartnerF->getY() );
  992. else
  993. spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
  994. rend = 1;
  995. }
  996. }
  997. else
  998. { // Nach Links
  999. if( spielPartnerF->getX() != 10 )
  1000. {
  1001. if( spielPartnerF->getX() - valB < 10 )
  1002. spielPartnerF->setPosition( 10, spielPartnerF->getY() );
  1003. else
  1004. spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
  1005. rend = 1;
  1006. }
  1007. }
  1008. }
  1009. else
  1010. { // Unsichtbar
  1011. if( ( animation | 0x2 ) == animation )
  1012. { // Nach Rechts
  1013. if( spielPartnerF->getX() != 810 )
  1014. {
  1015. if( spielPartnerF->getX() + valB > 810 )
  1016. spielPartnerF->setPosition( 810, spielPartnerF->getY() );
  1017. else
  1018. spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
  1019. rend = 1;
  1020. }
  1021. }
  1022. else
  1023. { // Nach Links
  1024. if( spielPartnerF->getX() != -810 )
  1025. {
  1026. if( spielPartnerF->getX() - valB < -810 )
  1027. spielPartnerF->setPosition( -810, spielPartnerF->getY() );
  1028. else
  1029. spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
  1030. rend = 1;
  1031. }
  1032. }
  1033. }
  1034. }
  1035. bool ret = rend;
  1036. rend = 0;
  1037. return ret;
  1038. }
  1039. void AccountSpielPartner::doMausEreignis( MausEreignis &me )
  1040. {
  1041. int gruppAuswS = gruppAusw->getAuswahl();
  1042. int sortSpalteS = sortSpalte->getAuswahl();
  1043. int sortRichtungS = sortRichtung->getAuswahl();
  1044. spielPartnerF->doMausEreignis( me );
  1045. if( gruppAusw->getAuswahl() != gruppAuswS )
  1046. {
  1047. liste->setGruppierung( gruppAusw->zEintrag( gruppAusw->getAuswahl() )->zText()->getText() );
  1048. gruppAusw->einklappen();
  1049. }
  1050. if( sortSpalte->getAuswahl() != sortSpalteS )
  1051. {
  1052. liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
  1053. sortSpalte->einklappen();
  1054. }
  1055. if( sortRichtung->getAuswahl() != sortRichtungS )
  1056. {
  1057. liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
  1058. sortRichtung->einklappen();
  1059. }
  1060. }
  1061. void AccountSpielPartner::render( Bild &zRObj )
  1062. {
  1063. zRObj.setAlpha( alpha );
  1064. spielPartnerF->render( zRObj );
  1065. zRObj.releaseAlpha();
  1066. }
  1067. // constant
  1068. int AccountSpielPartner::getStatus() const
  1069. {
  1070. return status;
  1071. }
  1072. // Reference Counting
  1073. AccountSpielPartner *AccountSpielPartner::getThis()
  1074. {
  1075. ref++;
  1076. return this;
  1077. }
  1078. AccountSpielPartner *AccountSpielPartner::release()
  1079. {
  1080. ref--;
  1081. if( !ref )
  1082. delete this;
  1083. return 0;
  1084. }