AccountSpielPartner.cpp 30 KB

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