AccountSpielPartner.cpp 28 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(const 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(const char* gp)
  677. {
  678. lockZeichnung();
  679. gruppierung->setText(gp);
  680. rend = 1;
  681. unlockZeichnung();
  682. }
  683. void AccountSPListe::setSortSpalte(const 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. }