AccountSpielPartner.cpp 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102
  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, 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. TextRenderer rd( zSchrift->getThis() );
  55. rd.setSchriftSize( 12 );
  56. name->setSize( rd.getTextBreite( name->zText()->getText() ) + 5, name->getHeight() );
  57. anzahl->setPosition( ( name->getX() + name->getBreite() + 10 ) < 100 ? 100 : ( name->getX() + name->getBreite() + 10 ), anzahl->getY() );
  58. anzahl->setSize( rd.getTextBreite( anzahl->zText()->getText() ) + 5, anzahl->getHeight() );
  59. prozent->setPosition( ( anzahl->getX() + anzahl->getBreite() + 10 ) < 200 ? 200 : ( anzahl->getX() + anzahl->getBreite() + 10 ), prozent->getY() );
  60. prozent->setAktionAnzahl( 100 );
  61. prozent->aktionPlus( daten->prozent );
  62. }
  63. // Destruktor
  64. AccountSPListeEintrag::~AccountSPListeEintrag()
  65. {
  66. ram->release();
  67. members->release();
  68. name->release();
  69. anzahl->release();
  70. prozent->release();
  71. details->release();
  72. ausklappen->release();
  73. einklappen->release();
  74. sortSpalte->release();
  75. daten->name->release();
  76. delete daten;
  77. }
  78. // privat
  79. int AccountSPListeEintrag::getReihenfolge( int *arr )
  80. {
  81. int anz = members->getEintragAnzahl();
  82. if( !anz || !HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  83. return 0;
  84. int ret = 0;
  85. bool *fertig = new bool[ anz ];
  86. ZeroMemory( fertig, anz );
  87. for( int i = 0; i < anz; i++ )
  88. {
  89. int index = -1;
  90. int minMax = 0;
  91. Text minMaxT;
  92. for( int j = 0; j < anz; j++ )
  93. {
  94. AccountSPListeEintrag *tmp = members->z( j );
  95. if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
  96. ( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
  97. {
  98. minMaxT = tmp->zDaten()->name->getText();
  99. index = j;
  100. }
  101. else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
  102. ( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
  103. {
  104. minMax = tmp->zDaten()->anzahl;
  105. index = j;
  106. }
  107. else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
  108. ( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
  109. {
  110. minMax = tmp->zDaten()->prozent;
  111. index = j;
  112. }
  113. }
  114. if( index < 0 )
  115. break;
  116. fertig[ index ] = 1;
  117. arr[ ret ] = index;
  118. ret++;
  119. }
  120. delete[] fertig;
  121. return ret;
  122. }
  123. // nicht constant
  124. void AccountSPListeEintrag::addMember( AccountSPListeEintrag *e )
  125. {
  126. members->add( e );
  127. rend = 1;
  128. }
  129. void AccountSPListeEintrag::setSortSpalte( char *sp )
  130. {
  131. sortSpalte->setText( sp );
  132. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  133. {
  134. int anz = members->getEintragAnzahl();
  135. for( int i = 0; i < anz; i++ )
  136. members->z( i )->setSortSpalte( sp );
  137. }
  138. rend = 1;
  139. }
  140. void AccountSPListeEintrag::setSortRichtung( bool absteigend )
  141. {
  142. sortAbsteigend = absteigend;
  143. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  144. {
  145. int anz = members->getEintragAnzahl();
  146. for( int i = 0; i < anz; i++ )
  147. members->z( i )->setSortRichtung( absteigend );
  148. }
  149. rend = 1;
  150. }
  151. bool AccountSPListeEintrag::tick( double tickVal )
  152. {
  153. rend |= details->tick( tickVal );
  154. int anz = members->getEintragAnzahl();
  155. for( int i = 0; i < anz; i++ )
  156. rend |= members->z( i )->tick( tickVal );
  157. this->tickVal += tickVal * 150;
  158. int val = ( int )this->tickVal;
  159. this->tickVal -= val;
  160. if( val )
  161. {
  162. if( details->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
  163. {
  164. if( ram->getHeight() - val < 20 )
  165. ram->setSize( ram->getBreite(), 20 );
  166. else
  167. ram->setSize( ram->getBreite(), ram->getHeight() - val );
  168. rend = 1;
  169. }
  170. if( details->zHintergrundBild() == einklappen )
  171. {
  172. int maxHö = 20;
  173. for( int i = 0; i < anz; i++ )
  174. maxHö += 5 + members->z( i )->getHeight();
  175. if( maxHö > 20 )
  176. maxHö += 5;
  177. if( ram->getHeight() > maxHö )
  178. {
  179. if( ram->getHeight() - val < maxHö )
  180. ram->setSize( ram->getBreite(), maxHö );
  181. else
  182. ram->setSize( ram->getBreite(), ram->getHeight() - val );
  183. rend = 1;
  184. }
  185. if( ram->getHeight() < maxHö )
  186. {
  187. if( ram->getHeight() + val > maxHö )
  188. ram->setSize( ram->getBreite(), maxHö );
  189. else
  190. ram->setSize( ram->getBreite(), ram->getHeight() + val );
  191. rend = 1;
  192. }
  193. }
  194. }
  195. bool ret = rend;
  196. rend = 0;
  197. return ret;
  198. }
  199. void AccountSPListeEintrag::doMausEreignis( MausEreignis &me )
  200. {
  201. int mx = me.mx;
  202. int my = me.my;
  203. bool vera = 0;
  204. if( me.mx < 0 || me.my < 0 || me.mx > ram->getBreite() || me.my > ram->getHeight() )
  205. {
  206. vera = 1;
  207. me.verarbeitet = 1;
  208. }
  209. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  210. {
  211. bool ok = me.verarbeitet;
  212. details->doMausEreignis( me );
  213. if( !ok && me.verarbeitet && me.id == ME_RLinks )
  214. {
  215. if( details->zHintergrundBild() == ausklappen )
  216. {
  217. details->setHintergrundBildZ( einklappen->getThis() );
  218. // TODO: details->zToolTip()->setText( "Karten verbergen." );
  219. }
  220. else
  221. {
  222. details->setHintergrundBildZ( ausklappen->getThis() );
  223. // TODO: details->zToolTip()->setText( "Karten anzeigen." );
  224. }
  225. }
  226. }
  227. if( ram->getHeight() > 20 )
  228. {
  229. int anz = members->getEintragAnzahl();
  230. int *rf = new int[ anz ];
  231. int rfAnz = getReihenfolge( rf );
  232. me.my -= 25;
  233. for( int i = 0; i < rfAnz; i++ )
  234. {
  235. members->z( rf[ i ] )->doMausEreignis( me );
  236. me.my -= members->z( rf[ i ] )->getHeight() + 5;
  237. }
  238. delete[] rf;
  239. }
  240. me.mx = mx;
  241. me.my = my;
  242. if( vera )
  243. me.verarbeitet = 0;
  244. }
  245. void AccountSPListeEintrag::render( int xOff, int yOff, int breite, Bild &zRObj )
  246. {
  247. ram->setSize( breite, ram->getHeight() );
  248. details->setPosition( ram->getBreite() - 20, details->getY() );
  249. if( !zRObj.setDrawOptions( xOff, yOff, breite, ram->getHeight() ) )
  250. return;
  251. name->render( zRObj );
  252. anzahl->render( zRObj );
  253. prozent->render( zRObj );
  254. if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
  255. details->render( zRObj );
  256. ram->render( zRObj );
  257. if( ram->getHeight() > 20 )
  258. {
  259. zRObj.drawLinieH( 0, 20, ram->getBreite(), ram->getFarbe() );
  260. int anz = members->getEintragAnzahl();
  261. int *rf = new int[ anz ];
  262. int rfAnz = getReihenfolge( rf );
  263. yOff = 0;
  264. for( int i = 0; i < rfAnz; i++ )
  265. {
  266. members->z( rf[ i ] )->render( 5, yOff + 25, breite - 10, zRObj );
  267. yOff += 5 + members->z( rf[ i ] )->getHeight();
  268. }
  269. delete[] rf;
  270. }
  271. zRObj.releaseDrawOptions();
  272. }
  273. // constant
  274. int AccountSPListeEintrag::getHeight() const
  275. {
  276. return ram->getHeight();
  277. }
  278. AccountSPListeEintragDaten *AccountSPListeEintrag::zDaten() const
  279. {
  280. return daten;
  281. }
  282. // Reference Counting
  283. AccountSPListeEintrag *AccountSPListeEintrag::getThis()
  284. {
  285. ref++;
  286. return this;
  287. }
  288. AccountSPListeEintrag *AccountSPListeEintrag::release()
  289. {
  290. ref--;
  291. if( !ref )
  292. delete this;
  293. return 0;
  294. }
  295. // Inhalt der AccountSPListe Klasse aus AccountSpielPartner.h
  296. // Konstruktor
  297. AccountSPListe::AccountSPListe( Schrift *zSchrift )
  298. : Zeichnung(),
  299. schrift( zSchrift->getThis() ),
  300. ram( new LRahmen() ),
  301. scroll( new VScrollBar() ),
  302. skp( new RCArray< AccountSPListeEintrag >() ),
  303. spk( new RCArray< AccountSPListeEintrag >() ),
  304. psk( new RCArray< AccountSPListeEintrag >() ),
  305. gruppierung( new Text( "Spieler/Spiel/Karte" ) ),
  306. sortSpalte( new Text( "Name" ) ),
  307. sortAbsteigend( 0 ),
  308. rend( 0 )
  309. {
  310. pos = Punkt( 10, 40 );
  311. ram->setSize( 760, 380 );
  312. ram->setFarbe( 0xFFFFFFFF );
  313. ram->setRamenBreite( 1 );
  314. }
  315. // Destruktor
  316. AccountSPListe::~AccountSPListe()
  317. {
  318. schrift->release();
  319. ram->release();
  320. scroll->release();
  321. skp->release();
  322. spk->release();
  323. psk->release();
  324. gruppierung->release();
  325. sortSpalte->release();
  326. }
  327. // privat
  328. int AccountSPListe::getReihenfolge( int *arr )
  329. {
  330. RCArray< AccountSPListeEintrag > *members = 0;
  331. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  332. members = skp;
  333. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  334. members = spk;
  335. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  336. members = psk;
  337. if( !members )
  338. return 0;
  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( infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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 = infoClient->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. if( members )
  759. {
  760. int anz = members->getEintragAnzahl();
  761. int *rf = new int[ anz ];
  762. int rfAnz = getReihenfolge( rf );
  763. for( int i = 0; i < rfAnz; i++ )
  764. rend |= members->z( rf[ i ] )->tick( tickVal );
  765. delete[] rf;
  766. }
  767. unlockZeichnung();
  768. rend |= scroll->getRend();
  769. bool ret = rend;
  770. rend = 0;
  771. return ret;
  772. }
  773. void AccountSPListe::doMausEreignis( MausEreignis &me )
  774. {
  775. bool vera = 0;
  776. if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
  777. {
  778. vera = 1;
  779. me.verarbeitet = 1;
  780. }
  781. int mx = me.mx, my = me.my;
  782. me.mx -= pos.x;
  783. me.my -= pos.y;
  784. scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
  785. me.mx -= 10;
  786. me.my -= 10 - scroll->getScroll();
  787. lockZeichnung();
  788. RCArray< AccountSPListeEintrag > *members = 0;
  789. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  790. members = skp;
  791. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  792. members = spk;
  793. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  794. members = psk;
  795. if( members )
  796. {
  797. int anz = members->getEintragAnzahl();
  798. int *rf = new int[ anz ];
  799. int rfAnz = getReihenfolge( rf );
  800. for( int i = 0; i < rfAnz; i++ )
  801. {
  802. members->z( rf[ i ] )->doMausEreignis( me );
  803. me.my -= members->z( rf[ i ] )->getHeight() + 10;
  804. }
  805. delete[] rf;
  806. }
  807. unlockZeichnung();
  808. me.mx = mx, me.my = my;
  809. if( vera )
  810. me.verarbeitet = 0;
  811. }
  812. void AccountSPListe::render( Bild &zRObj )
  813. {
  814. if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
  815. return;
  816. ram->render( zRObj );
  817. scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
  818. if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
  819. {
  820. zRObj.releaseDrawOptions();
  821. return;
  822. }
  823. int anzHö = 10;
  824. lockZeichnung();
  825. RCArray< AccountSPListeEintrag > *members = 0;
  826. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  827. members = skp;
  828. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  829. members = spk;
  830. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  831. members = psk;
  832. if( members )
  833. {
  834. int anz = members->getEintragAnzahl();
  835. int *rf = new int[ anz ];
  836. int rfAnz = getReihenfolge( rf );
  837. for( int i = 0; i < rfAnz; i++ )
  838. {
  839. members->z( rf[ i ] )->render( 10, anzHö - scroll->getScroll(), ram->getBreite() - 36, zRObj );
  840. anzHö += members->z( rf[ i ] )->getHeight() + 10;
  841. }
  842. delete[] rf;
  843. }
  844. unlockZeichnung();
  845. scroll->update( anzHö, ram->getHeight() - 2 );
  846. zRObj.releaseDrawOptions();
  847. zRObj.releaseDrawOptions();
  848. }
  849. // Inhalt der AccountSpielPartner Klasse aus AccountSpielPartner.h
  850. // Konstruktor
  851. AccountSpielPartner::AccountSpielPartner( Schrift *zSchrift )
  852. : Thread(),
  853. spielPartnerF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Spielpartner von " ) ),
  854. gruppAusw( initAuswahlBox( 10, 10, 150, 20, zSchrift, ABSTYLE, { "Spieler/Spiel/Karte", "Spiel/Karte/Spieler", "Spiel/Spieler/Karte" } ) ),
  855. sortSpalte( initAuswahlBox( 170, 10, 150, 20, zSchrift, ABSTYLE, { "Name", "Spiele", "Prozent" } ) ),
  856. sortRichtung( initAuswahlBox( 330, 10, 150, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
  857. liste( new AccountSPListe( zSchrift ) ),
  858. status( 0 ),
  859. accId( 0 ),
  860. animation( 0 ),
  861. alpha( 255 ),
  862. tickVal( 0 ),
  863. rend( 0 )
  864. {
  865. initToolTip( gruppAusw, "Wähle Gruppierung aus, nach der die Daten angezeigt werden sollen.", zSchrift, hauptScreen );
  866. initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", zSchrift, hauptScreen );
  867. initToolTip( sortRichtung, "Wähle aus, Ob Aufwärts oder Abwärts sortiert werden soll.", zSchrift, hauptScreen );
  868. spielPartnerF->addMember( liste );
  869. spielPartnerF->addMember( gruppAusw );
  870. spielPartnerF->addMember( sortSpalte );
  871. spielPartnerF->addMember( sortRichtung );
  872. spielPartnerF->setMausEreignis( _ret1ME );
  873. }
  874. // Destruktor
  875. AccountSpielPartner::~AccountSpielPartner()
  876. {
  877. spielPartnerF->release();
  878. gruppAusw->release();
  879. sortSpalte->release();
  880. sortRichtung->release();
  881. liste->release();
  882. }
  883. // nicht constant
  884. void AccountSpielPartner::reset()
  885. {
  886. liste->reset();
  887. }
  888. void AccountSpielPartner::ladeStatistik( int accId )
  889. {
  890. if( this->accId == accId )
  891. return;
  892. this->status = 0;
  893. if( run )
  894. {
  895. warteAufThread( 1000 );
  896. ende();
  897. }
  898. if( ( animation | 0x1 ) == animation )
  899. {
  900. animation |= 0x4;
  901. this->accId = accId;
  902. this->status = 1;
  903. return;
  904. }
  905. if( this->accId )
  906. reset();
  907. this->accId = accId;
  908. start();
  909. this->status = 1;
  910. }
  911. void AccountSpielPartner::thread()
  912. {
  913. Text *name = infoClient->getSpielerName( accId );
  914. if( name )
  915. {
  916. name->insert( 0, "Spielpartner von " );
  917. spielPartnerF->setTitel( *name );
  918. name->release();
  919. }
  920. liste->ladeDaten( accId );
  921. animation &= ~0x4;
  922. status = 2;
  923. run = 0;
  924. }
  925. void AccountSpielPartner::setSichtbar( bool sichtbar, bool nachRechts )
  926. {
  927. if( sichtbar )
  928. {
  929. if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
  930. {
  931. if( nachRechts )
  932. spielPartnerF->setPosition( -810, 40 );
  933. else
  934. spielPartnerF->setPosition( 810, 40 );
  935. }
  936. animation |= 0x1;
  937. }
  938. else
  939. animation &= ~0x1;
  940. if( nachRechts )
  941. animation |= 0x2;
  942. else
  943. animation &= ~0x2;
  944. }
  945. bool AccountSpielPartner::tick( double zeit )
  946. {
  947. rend |= spielPartnerF->tick( zeit );
  948. tickVal += zeit;
  949. int valA = (int)( tickVal * 150 );
  950. int valB = (int)( tickVal * 500 );
  951. tickVal -= valA / 150.0;
  952. if( valA )
  953. {
  954. if( ( animation | 0x4 ) == animation && alpha )
  955. {
  956. if( alpha - valA <= 0 )
  957. alpha = 0;
  958. else
  959. alpha -= valA;
  960. rend = 1;
  961. if( !alpha )
  962. {
  963. reset();
  964. start();
  965. }
  966. }
  967. if( ( animation | 0x4 ) != animation && alpha != 255 )
  968. {
  969. if( alpha + valA >= 255 )
  970. alpha = 255;
  971. else
  972. alpha += valA;
  973. rend = 1;
  974. }
  975. }
  976. if( valB )
  977. {
  978. if( ( animation | 0x1 ) == animation )
  979. { // Sichtbar
  980. if( ( animation | 0x2 ) == animation )
  981. { // Nach Rechts
  982. if( spielPartnerF->getX() != 10 )
  983. {
  984. if( spielPartnerF->getX() + valB > 10 )
  985. spielPartnerF->setPosition( 10, spielPartnerF->getY() );
  986. else
  987. spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
  988. rend = 1;
  989. }
  990. }
  991. else
  992. { // Nach Links
  993. if( spielPartnerF->getX() != 10 )
  994. {
  995. if( spielPartnerF->getX() - valB < 10 )
  996. spielPartnerF->setPosition( 10, spielPartnerF->getY() );
  997. else
  998. spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
  999. rend = 1;
  1000. }
  1001. }
  1002. }
  1003. else
  1004. { // Unsichtbar
  1005. if( ( animation | 0x2 ) == animation )
  1006. { // Nach Rechts
  1007. if( spielPartnerF->getX() != 810 )
  1008. {
  1009. if( spielPartnerF->getX() + valB > 810 )
  1010. spielPartnerF->setPosition( 810, spielPartnerF->getY() );
  1011. else
  1012. spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
  1013. rend = 1;
  1014. }
  1015. }
  1016. else
  1017. { // Nach Links
  1018. if( spielPartnerF->getX() != -810 )
  1019. {
  1020. if( spielPartnerF->getX() - valB < -810 )
  1021. spielPartnerF->setPosition( -810, spielPartnerF->getY() );
  1022. else
  1023. spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
  1024. rend = 1;
  1025. }
  1026. }
  1027. }
  1028. }
  1029. bool ret = rend;
  1030. rend = 0;
  1031. return ret;
  1032. }
  1033. void AccountSpielPartner::doMausEreignis( MausEreignis &me )
  1034. {
  1035. int gruppAuswS = gruppAusw->getAuswahl();
  1036. int sortSpalteS = sortSpalte->getAuswahl();
  1037. int sortRichtungS = sortRichtung->getAuswahl();
  1038. spielPartnerF->doMausEreignis( me );
  1039. if( gruppAusw->getAuswahl() != gruppAuswS )
  1040. {
  1041. liste->setGruppierung( gruppAusw->zEintrag( gruppAusw->getAuswahl() )->zText()->getText() );
  1042. gruppAusw->einklappen();
  1043. }
  1044. if( sortSpalte->getAuswahl() != sortSpalteS )
  1045. {
  1046. liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
  1047. sortSpalte->einklappen();
  1048. }
  1049. if( sortRichtung->getAuswahl() != sortRichtungS )
  1050. {
  1051. liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
  1052. sortRichtung->einklappen();
  1053. }
  1054. }
  1055. void AccountSpielPartner::render( Bild &zRObj )
  1056. {
  1057. zRObj.setAlpha( alpha );
  1058. spielPartnerF->render( zRObj );
  1059. zRObj.releaseAlpha();
  1060. }
  1061. // constant
  1062. int AccountSpielPartner::getStatus() const
  1063. {
  1064. return status;
  1065. }