AccountSpielPartner.cpp 37 KB

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