AccountSpielPartner.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137
  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. if( !members )
  340. return 0;
  341. int anz = members->getEintragAnzahl();
  342. if( !anz )
  343. return 0;
  344. int ret = 0;
  345. bool *fertig = new bool[ anz ];
  346. ZeroMemory( fertig, anz );
  347. for( int i = 0; i < anz; i++ )
  348. {
  349. int index = -1;
  350. int minMax = 0;
  351. Text minMaxT;
  352. for( int j = 0; j < anz; j++ )
  353. {
  354. AccountSPListeEintrag *tmp = members->z( j );
  355. if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
  356. ( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
  357. {
  358. minMaxT = tmp->zDaten()->name->getText();
  359. index = j;
  360. }
  361. else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
  362. ( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
  363. {
  364. minMax = tmp->zDaten()->anzahl;
  365. index = j;
  366. }
  367. else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
  368. ( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
  369. {
  370. minMax = tmp->zDaten()->prozent;
  371. index = j;
  372. }
  373. }
  374. if( index < 0 )
  375. break;
  376. fertig[ index ] = 1;
  377. arr[ ret ] = index;
  378. ret++;
  379. }
  380. delete[] fertig;
  381. return ret;
  382. }
  383. // nicht constant
  384. void AccountSPListe::reset()
  385. {
  386. lockZeichnung();
  387. skp->leeren();
  388. spk->leeren();
  389. psk->leeren();
  390. unlockZeichnung();
  391. }
  392. void AccountSPListe::ladeDaten( int accId )
  393. {
  394. Array< int > *spieler = new Array< int >();
  395. Array< int > *karten = new Array< int >();
  396. Array< int > *anzahl = new Array< int >();
  397. if( infoClient->getSpielPartnerListe( accId, spieler, karten, anzahl ) )
  398. {
  399. int anz = spieler->getEintragAnzahl();
  400. int spielerAnzahl = 0;
  401. int spielArtAnzahl = 0;
  402. int anzahlGesammt = 0;
  403. Array< int > *spielerUnique = new Array< int >();
  404. Array< int > *spielArt = new Array< int >();
  405. for( int i = 0; i < anz; i++ )
  406. { // Spiel Art Ids ermitteln
  407. anzahlGesammt += anzahl->get( i );
  408. if( spieler->hat( i ) && spielerUnique->getWertIndex( spieler->get( i ) ) < 0 )
  409. {
  410. spielerUnique->set( spieler->get( i ), spielerAnzahl );
  411. spielerAnzahl++;
  412. }
  413. if( !spielArt->hat( i ) )
  414. {
  415. spielArtAnzahl++;
  416. int id = infoClient->getSpielId( karten->get( i ) );
  417. for( int j = i; j < anz; j++ )
  418. {
  419. if( karten->get( j ) == karten->get( i ) )
  420. spielArt->set( id, j );
  421. }
  422. }
  423. }
  424. spielerUnique->release();
  425. // Spiel/Karte/Spieler Tabelle initialisieren
  426. Array< int > *spielArtVera = new Array< int >();
  427. for( int i = 0; i < spielArtAnzahl; i++ )
  428. { // Spiel Arten Einträge
  429. int id = 0;
  430. for( int j = 0; j < anz; j++ )
  431. {
  432. if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
  433. {
  434. id = spielArt->get( j );
  435. spielArtVera->add( id );
  436. break;
  437. }
  438. }
  439. if( !id )
  440. break;
  441. AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
  442. tmp->id = id;
  443. tmp->name = infoClient->getSpielName( tmp->id );
  444. tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
  445. tmp->anzahl = 0;
  446. for( int j = 0; j < anz; j++ )
  447. {
  448. if( spielArt->get( j ) == tmp->id )
  449. tmp->anzahl += anzahl->get( j );
  450. }
  451. tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
  452. AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp, schrift );
  453. skp->add( spielE );
  454. Array< int > *kartenVera = new Array< int >();
  455. for( int j = 0; j < anz; j++ )
  456. { // Karten Einträge
  457. int id = 0;
  458. for( int k = 0; k < anz; k++ )
  459. {
  460. if( spielArt->get( k ) == tmp->id )
  461. {
  462. if( kartenVera->getWertIndex( karten->get( k ) ) < 0 )
  463. {
  464. id = karten->get( k );
  465. kartenVera->add( id );
  466. break;
  467. }
  468. }
  469. }
  470. if( !id )
  471. break;
  472. AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
  473. tmpk->id = id;
  474. tmpk->name = infoClient->getKarteName( tmpk->id );
  475. tmpk->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Karte;
  476. tmpk->anzahl = 0;
  477. for( int k = 0; k < anz; k++ )
  478. {
  479. if( karten->get( k ) == tmpk->id )
  480. tmpk->anzahl += anzahl->get( k );
  481. }
  482. tmpk->prozent = tmpk->anzahl * 100 / tmp->anzahl;
  483. AccountSPListeEintrag *karteE = new AccountSPListeEintrag( tmpk, schrift );
  484. spielE->addMember( karteE );
  485. Array< int > *spielerVera = new Array< int >();
  486. for( int k = 0; k < anz; k++ )
  487. { // Spieler Einträge
  488. int id = 0;
  489. int gAnz = 0;
  490. for( int l = 0; l < anz; l++ )
  491. {
  492. if( karten->get( l ) == tmpk->id )
  493. {
  494. if( spielerVera->getWertIndex( spieler->get( l ) ) < 0 )
  495. {
  496. id = spieler->get( l );
  497. spielerVera->add( id );
  498. gAnz = anzahl->get( l );
  499. break;
  500. }
  501. }
  502. }
  503. if( !id )
  504. break;
  505. AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
  506. tmps->id = id;
  507. tmps->name = infoClient->getSpielerName( tmps->id );
  508. tmps->style = ASPLEDStyle::Spieler;
  509. tmps->anzahl = gAnz;
  510. tmps->prozent = tmps->anzahl * 100 / tmpk->anzahl;
  511. karteE->addMember( new AccountSPListeEintrag( tmps, schrift ) );
  512. }
  513. spielerVera->release();
  514. }
  515. kartenVera->release();
  516. }
  517. spielArtVera->leeren();
  518. // Spiel/Spieler/Karte Tabelle initialisieren
  519. for( int i = 0; i < spielArtAnzahl; i++ )
  520. { // Spiel Arten Einträge
  521. int id = 0;
  522. for( int j = 0; j < anz; j++ )
  523. {
  524. if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
  525. {
  526. id = spielArt->get( j );
  527. spielArtVera->add( id );
  528. break;
  529. }
  530. }
  531. if( !id )
  532. break;
  533. AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
  534. tmp->id = id;
  535. tmp->name = infoClient->getSpielName( tmp->id );
  536. tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
  537. tmp->anzahl = 0;
  538. for( int j = 0; j < anz; j++ )
  539. {
  540. if( spielArt->get( j ) == tmp->id )
  541. tmp->anzahl += anzahl->get( j );
  542. }
  543. tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
  544. AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp, schrift );
  545. spk->add( spielE );
  546. Array< int > *spielerVera = new Array< int >();
  547. for( int j = 0; j < anz; j++ )
  548. { // Spieler Einträge
  549. int id = 0;
  550. for( int k = 0; k < anz; k++ )
  551. {
  552. if( spielArt->get( k ) == tmp->id )
  553. {
  554. if( spielerVera->getWertIndex( spieler->get( k ) ) < 0 )
  555. {
  556. id = spieler->get( k );
  557. spielerVera->add( id );
  558. break;
  559. }
  560. }
  561. }
  562. if( !id )
  563. break;
  564. AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
  565. tmps->id = id;
  566. tmps->name = infoClient->getSpielerName( tmps->id );
  567. tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Spieler;
  568. tmps->anzahl = 0;
  569. for( int k = 0; k < anz; k++ )
  570. {
  571. if( spieler->get( k ) == tmps->id && spielArt->get( k ) == tmp->id )
  572. tmps->anzahl += anzahl->get( k );
  573. }
  574. tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
  575. AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmps, schrift );
  576. spielE->addMember( spielerE );
  577. Array< int > *karteVera = new Array< int >();
  578. for( int k = 0; k < anz; k++ )
  579. { // Karten Einträge
  580. int id = 0;
  581. int gAnz = 0;
  582. for( int l = 0; l < anz; l++ )
  583. {
  584. if( spieler->get( l ) == tmps->id && spielArt->get( l ) == tmp->id )
  585. {
  586. if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
  587. {
  588. id = karten->get( l );
  589. karteVera->add( id );
  590. gAnz = anzahl->get( l );
  591. break;
  592. }
  593. }
  594. }
  595. if( !id )
  596. break;
  597. AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
  598. tmpk->id = id;
  599. tmpk->name = infoClient->getKarteName( tmpk->id );
  600. tmpk->style = ASPLEDStyle::Karte;
  601. tmpk->anzahl = gAnz;
  602. tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
  603. spielerE->addMember( new AccountSPListeEintrag( tmpk, schrift ) );
  604. }
  605. karteVera->release();
  606. }
  607. spielerVera->release();
  608. }
  609. spielArtVera->release();
  610. // Spieler/Spiel/Karte Tabelle initialisieren
  611. Array< int > *spielerVera = new Array< int >();
  612. for( int i = 0; i < spielerAnzahl; i++ )
  613. { // Spieler Einträge
  614. int id = 0;
  615. for( int j = 0; j < anz; j++ )
  616. {
  617. if( spielerVera->getWertIndex( spieler->get( j ) ) < 0 )
  618. {
  619. id = spieler->get( j );
  620. spielerVera->add( id );
  621. break;
  622. }
  623. }
  624. if( !id )
  625. break;
  626. AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
  627. tmp->id = id;
  628. tmp->name = infoClient->getSpielerName( tmp->id );
  629. tmp->style = ASPLEDStyle::Spieler | ASPLEDStyle::Ausklappbar;
  630. tmp->anzahl = 0;
  631. for( int j = 0; j < anz; j++ )
  632. {
  633. if( spieler->get( j ) == tmp->id )
  634. tmp->anzahl += anzahl->get( j );
  635. }
  636. tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
  637. AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmp, schrift );
  638. psk->add( spielerE );
  639. Array< int > *spielVera = new Array< int >();
  640. for( int j = 0; j < anz; j++ )
  641. { // Spiel Einträge
  642. int id = 0;
  643. for( int k = 0; k < anz; k++ )
  644. {
  645. if( spieler->get( k ) == tmp->id )
  646. {
  647. if( spielVera->getWertIndex( spielArt->get( k ) ) < 0 )
  648. {
  649. id = spielArt->get( k );
  650. spielVera->add( id );
  651. break;
  652. }
  653. }
  654. }
  655. if( !id )
  656. break;
  657. AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
  658. tmps->id = id;
  659. tmps->name = infoClient->getSpielName( tmps->id );
  660. tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::SpielArt;
  661. tmps->anzahl = 0;
  662. for( int k = 0; k < anz; k++ )
  663. {
  664. if( spieler->get( k ) == tmp->id && spielArt->get( k ) == tmps->id )
  665. tmps->anzahl += anzahl->get( k );
  666. }
  667. tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
  668. AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmps, schrift );
  669. spielerE->addMember( spielE );
  670. Array< int > *karteVera = new Array< int >();
  671. for( int k = 0; k < anz; k++ )
  672. { // Karte Einträge
  673. int id = 0;
  674. int gAnz = 0;
  675. for( int l = 0; l < anz; l++ )
  676. {
  677. if( spieler->get( l ) == tmp->id && spielArt->get( l ) == tmps->id )
  678. {
  679. if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
  680. {
  681. id = karten->get( l );
  682. karteVera->add( id );
  683. gAnz = anzahl->get( l );
  684. break;
  685. }
  686. }
  687. }
  688. if( !id )
  689. break;
  690. AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
  691. tmpk->id = id;
  692. tmpk->name = infoClient->getKarteName( tmpk->id );
  693. tmpk->style = ASPLEDStyle::Karte;
  694. tmpk->anzahl = gAnz;
  695. tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
  696. spielE->addMember( new AccountSPListeEintrag( tmpk, schrift ) );
  697. }
  698. karteVera->release();
  699. }
  700. spielVera->release();
  701. }
  702. spielerVera->release();
  703. spielArt->release();
  704. }
  705. else
  706. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spielpartner dieses Spielers konnten nicht ermittelt werden." ), new Text( "Ok" ) );
  707. spieler->release();
  708. karten->release();
  709. anzahl->release();
  710. }
  711. void AccountSPListe::setGruppierung( char *gp )
  712. {
  713. lockZeichnung();
  714. gruppierung->setText( gp );
  715. rend = 1;
  716. unlockZeichnung();
  717. }
  718. void AccountSPListe::setSortSpalte( char *sp )
  719. {
  720. lockZeichnung();
  721. sortSpalte->setText( sp );
  722. int anz = skp->getEintragAnzahl();
  723. for( int i = 0; i < anz; i++ )
  724. skp->z( i )->setSortSpalte( sp );
  725. anz = spk->getEintragAnzahl();
  726. for( int i = 0; i < anz; i++ )
  727. spk->z( i )->setSortSpalte( sp );
  728. anz = psk->getEintragAnzahl();
  729. for( int i = 0; i < anz; i++ )
  730. psk->z( i )->setSortSpalte( sp );
  731. rend = 1;
  732. unlockZeichnung();
  733. }
  734. void AccountSPListe::setSortRichtung( bool absteigend )
  735. {
  736. lockZeichnung();
  737. sortAbsteigend = absteigend;
  738. int anz = skp->getEintragAnzahl();
  739. for( int i = 0; i < anz; i++ )
  740. skp->z( i )->setSortRichtung( absteigend );
  741. anz = spk->getEintragAnzahl();
  742. for( int i = 0; i < anz; i++ )
  743. spk->z( i )->setSortRichtung( absteigend );
  744. anz = psk->getEintragAnzahl();
  745. for( int i = 0; i < anz; i++ )
  746. psk->z( i )->setSortRichtung( absteigend );
  747. rend = 1;
  748. unlockZeichnung();
  749. }
  750. bool AccountSPListe::tick( double tickVal )
  751. {
  752. lockZeichnung();
  753. RCArray< AccountSPListeEintrag > *members = 0;
  754. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  755. members = skp;
  756. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  757. members = spk;
  758. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  759. members = psk;
  760. if( members )
  761. {
  762. int anz = members->getEintragAnzahl();
  763. int *rf = new int[ anz ];
  764. int rfAnz = getReihenfolge( rf );
  765. for( int i = 0; i < rfAnz; i++ )
  766. rend |= members->z( rf[ i ] )->tick( tickVal );
  767. delete[] rf;
  768. }
  769. unlockZeichnung();
  770. rend |= scroll->getRend();
  771. bool ret = rend;
  772. rend = 0;
  773. return ret;
  774. }
  775. void AccountSPListe::doMausEreignis( MausEreignis &me )
  776. {
  777. bool vera = 0;
  778. if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
  779. {
  780. vera = 1;
  781. me.verarbeitet = 1;
  782. }
  783. int mx = me.mx, my = me.my;
  784. me.mx -= pos.x;
  785. me.my -= pos.y;
  786. scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
  787. me.mx -= 10;
  788. me.my -= 10 - scroll->getScroll();
  789. lockZeichnung();
  790. RCArray< AccountSPListeEintrag > *members = 0;
  791. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  792. members = skp;
  793. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  794. members = spk;
  795. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  796. members = psk;
  797. if( members )
  798. {
  799. int anz = members->getEintragAnzahl();
  800. int *rf = new int[ anz ];
  801. int rfAnz = getReihenfolge( rf );
  802. for( int i = 0; i < rfAnz; i++ )
  803. {
  804. members->z( rf[ i ] )->doMausEreignis( me );
  805. me.my -= members->z( rf[ i ] )->getHeight() + 10;
  806. }
  807. delete[] rf;
  808. }
  809. unlockZeichnung();
  810. me.mx = mx, me.my = my;
  811. if( vera )
  812. me.verarbeitet = 0;
  813. }
  814. void AccountSPListe::render( Bild &zRObj )
  815. {
  816. if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
  817. return;
  818. ram->render( zRObj );
  819. scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
  820. if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
  821. {
  822. zRObj.releaseDrawOptions();
  823. return;
  824. }
  825. int anzHö = 10;
  826. lockZeichnung();
  827. RCArray< AccountSPListeEintrag > *members = 0;
  828. if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
  829. members = skp;
  830. if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
  831. members = spk;
  832. if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
  833. members = psk;
  834. if( members )
  835. {
  836. int anz = members->getEintragAnzahl();
  837. int *rf = new int[ anz ];
  838. int rfAnz = getReihenfolge( rf );
  839. for( int i = 0; i < rfAnz; i++ )
  840. {
  841. members->z( rf[ i ] )->render( 10, anzHö - scroll->getScroll(), ram->getBreite() - 36, zRObj );
  842. anzHö += members->z( rf[ i ] )->getHeight() + 10;
  843. }
  844. delete[] rf;
  845. }
  846. unlockZeichnung();
  847. scroll->update( anzHö, ram->getHeight() - 2 );
  848. zRObj.releaseDrawOptions();
  849. zRObj.releaseDrawOptions();
  850. }
  851. // constant
  852. // Reference Counting
  853. AccountSPListe *AccountSPListe::getThis()
  854. {
  855. ref++;
  856. return this;
  857. }
  858. AccountSPListe *AccountSPListe::release()
  859. {
  860. ref--;
  861. if( !ref )
  862. delete this;
  863. return 0;
  864. }
  865. // Inhalt der AccountSpielPartner Klasse aus AccountSpielPartner.h
  866. // Konstruktor
  867. AccountSpielPartner::AccountSpielPartner( Schrift *zSchrift )
  868. : Thread(),
  869. spielPartnerF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Spielpartner von " ) ),
  870. gruppAusw( initAuswahlBox( 10, 10, 150, 20, zSchrift, ABSTYLE, { "Spieler/Spiel/Karte", "Spiel/Karte/Spieler", "Spiel/Spieler/Karte" } ) ),
  871. sortSpalte( initAuswahlBox( 170, 10, 150, 20, zSchrift, ABSTYLE, { "Name", "Spiele", "Prozent" } ) ),
  872. sortRichtung( initAuswahlBox( 330, 10, 150, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
  873. liste( new AccountSPListe( zSchrift ) ),
  874. status( 0 ),
  875. accId( 0 ),
  876. animation( 0 ),
  877. alpha( 255 ),
  878. tickVal( 0 ),
  879. rend( 0 ),
  880. ref( 1 )
  881. {
  882. initToolTip( gruppAusw, "Wähle Gruppierung aus, nach der die Daten angezeigt werden sollen.", zSchrift->getThis(), hauptScreen );
  883. initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", zSchrift->getThis(), hauptScreen );
  884. initToolTip( sortRichtung, "Wähle aus, Ob Aufwärts oder Abwärts sortiert werden soll.", zSchrift->getThis(), hauptScreen );
  885. spielPartnerF->addMember( liste );
  886. spielPartnerF->addMember( gruppAusw );
  887. spielPartnerF->addMember( sortSpalte );
  888. spielPartnerF->addMember( sortRichtung );
  889. spielPartnerF->setMausEreignis( _ret1ME );
  890. }
  891. // Destruktor
  892. AccountSpielPartner::~AccountSpielPartner()
  893. {
  894. spielPartnerF->release();
  895. gruppAusw->release();
  896. sortSpalte->release();
  897. sortRichtung->release();
  898. liste->release();
  899. }
  900. // nicht constant
  901. void AccountSpielPartner::reset()
  902. {
  903. liste->reset();
  904. }
  905. void AccountSpielPartner::ladeStatistik( int accId )
  906. {
  907. if( this->accId == accId )
  908. return;
  909. this->status = 0;
  910. if( run )
  911. {
  912. warteAufThread( 1000 );
  913. ende();
  914. }
  915. if( ( animation | 0x1 ) == animation )
  916. {
  917. animation |= 0x4;
  918. this->accId = accId;
  919. this->status = 1;
  920. return;
  921. }
  922. if( this->accId )
  923. reset();
  924. this->accId = accId;
  925. start();
  926. this->status = 1;
  927. }
  928. void AccountSpielPartner::thread()
  929. {
  930. Text *name = infoClient->getSpielerName( accId );
  931. if( name )
  932. {
  933. name->insert( 0, "Spielpartner von " );
  934. spielPartnerF->setTitel( *name );
  935. name->release();
  936. }
  937. liste->ladeDaten( accId );
  938. animation &= ~0x4;
  939. status = 2;
  940. run = 0;
  941. }
  942. void AccountSpielPartner::setSichtbar( bool sichtbar, bool nachRechts )
  943. {
  944. if( sichtbar )
  945. {
  946. if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
  947. {
  948. if( nachRechts )
  949. spielPartnerF->setPosition( -810, 40 );
  950. else
  951. spielPartnerF->setPosition( 810, 40 );
  952. }
  953. animation |= 0x1;
  954. }
  955. else
  956. animation &= ~0x1;
  957. if( nachRechts )
  958. animation |= 0x2;
  959. else
  960. animation &= ~0x2;
  961. }
  962. bool AccountSpielPartner::tick( double zeit )
  963. {
  964. rend |= spielPartnerF->tick( zeit );
  965. tickVal += zeit;
  966. int valA = (int)( tickVal * 150 );
  967. int valB = (int)( tickVal * 500 );
  968. tickVal -= valA / 150.0;
  969. if( valA )
  970. {
  971. if( ( animation | 0x4 ) == animation && alpha )
  972. {
  973. if( alpha - valA <= 0 )
  974. alpha = 0;
  975. else
  976. alpha -= valA;
  977. rend = 1;
  978. if( !alpha )
  979. {
  980. reset();
  981. start();
  982. }
  983. }
  984. if( ( animation | 0x4 ) != animation && alpha != 255 )
  985. {
  986. if( alpha + valA >= 255 )
  987. alpha = 255;
  988. else
  989. alpha += valA;
  990. rend = 1;
  991. }
  992. }
  993. if( valB )
  994. {
  995. if( ( animation | 0x1 ) == animation )
  996. { // Sichtbar
  997. if( ( animation | 0x2 ) == animation )
  998. { // Nach Rechts
  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. else
  1009. { // Nach Links
  1010. if( spielPartnerF->getX() != 10 )
  1011. {
  1012. if( spielPartnerF->getX() - valB < 10 )
  1013. spielPartnerF->setPosition( 10, spielPartnerF->getY() );
  1014. else
  1015. spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
  1016. rend = 1;
  1017. }
  1018. }
  1019. }
  1020. else
  1021. { // Unsichtbar
  1022. if( ( animation | 0x2 ) == animation )
  1023. { // Nach Rechts
  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. else
  1034. { // Nach Links
  1035. if( spielPartnerF->getX() != -810 )
  1036. {
  1037. if( spielPartnerF->getX() - valB < -810 )
  1038. spielPartnerF->setPosition( -810, spielPartnerF->getY() );
  1039. else
  1040. spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
  1041. rend = 1;
  1042. }
  1043. }
  1044. }
  1045. }
  1046. bool ret = rend;
  1047. rend = 0;
  1048. return ret;
  1049. }
  1050. void AccountSpielPartner::doMausEreignis( MausEreignis &me )
  1051. {
  1052. int gruppAuswS = gruppAusw->getAuswahl();
  1053. int sortSpalteS = sortSpalte->getAuswahl();
  1054. int sortRichtungS = sortRichtung->getAuswahl();
  1055. spielPartnerF->doMausEreignis( me );
  1056. if( gruppAusw->getAuswahl() != gruppAuswS )
  1057. {
  1058. liste->setGruppierung( gruppAusw->zEintrag( gruppAusw->getAuswahl() )->zText()->getText() );
  1059. gruppAusw->einklappen();
  1060. }
  1061. if( sortSpalte->getAuswahl() != sortSpalteS )
  1062. {
  1063. liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
  1064. sortSpalte->einklappen();
  1065. }
  1066. if( sortRichtung->getAuswahl() != sortRichtungS )
  1067. {
  1068. liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
  1069. sortRichtung->einklappen();
  1070. }
  1071. }
  1072. void AccountSpielPartner::render( Bild &zRObj )
  1073. {
  1074. zRObj.setAlpha( alpha );
  1075. spielPartnerF->render( zRObj );
  1076. zRObj.releaseAlpha();
  1077. }
  1078. // constant
  1079. int AccountSpielPartner::getStatus() const
  1080. {
  1081. return status;
  1082. }
  1083. // Reference Counting
  1084. AccountSpielPartner *AccountSpielPartner::getThis()
  1085. {
  1086. ref++;
  1087. return this;
  1088. }
  1089. AccountSpielPartner *AccountSpielPartner::release()
  1090. {
  1091. ref--;
  1092. if( !ref )
  1093. delete this;
  1094. return 0;
  1095. }