NachrichtenListe.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. #include "NachrichtenListe.h"
  2. #include <Punkt.h>
  3. #include <MausEreignis.h>
  4. #include <Bild.h>
  5. #include "../../Global/Initialisierung.h"
  6. #include <Scroll.h>
  7. #include "../../Global/Variablen.h"
  8. #include <Rahmen.h>
  9. #include <DateiSystem.h>
  10. #include <KSGTDatei.h>
  11. #include <ToolTip.h>
  12. #include <GSLDateiV.h>
  13. #include <Globals.h>
  14. typedef GSL::GSLDateiV *( *GetGSLDatei )( );
  15. NLNachricht::NLNachricht( Schrift *zSchrift, Text *titel )
  16. {
  17. rahmen = new LRahmen();
  18. rahmen->setRamenBreite( 1 );
  19. rahmen->setFarbe( 0xFFFFFFFF );
  20. this->titel = initTextFeld( 1, 1, 208, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, titel->getText() );
  21. titel = titel->release();
  22. close = initKnopf( 208, 1, 20, 20, 0, 0, "" );
  23. close->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
  24. Bild * closeBild = bilder->get( "chat.ltdb/entfernen.png" );
  25. if( !closeBild )
  26. {
  27. LTDBDatei *datei = new LTDBDatei();
  28. datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
  29. datei->leseDaten( 0 );
  30. closeBild = datei->laden( 0, new Text( "entfernen.png" ) );
  31. datei->release();
  32. bilder->add( "chat.ltdb/entfernen.png", closeBild->getThis() );
  33. }
  34. close->setHintergrundBildZ( closeBild );
  35. initToolTip( close, "Nachricht ignorieren.", zSchrift, hauptScreen );
  36. maxHöhe = 20;
  37. ref = 1;
  38. animation = 1;
  39. ausgewählt = 0;
  40. tickVal = 0;
  41. rend = 0;
  42. höhe = 0;
  43. }
  44. NLNachricht::~NLNachricht()
  45. {
  46. titel = (TextFeld *)titel->release();
  47. close = (Knopf *)close->release();
  48. rahmen->release();
  49. }
  50. void NLNachricht::entfernen()
  51. {
  52. animation = 3;
  53. }
  54. void NLNachricht::setAusgewählt( bool ausgewählt )
  55. {
  56. if( animation != 3 )
  57. {
  58. this->ausgewählt = ausgewählt;
  59. if( ausgewählt )
  60. animation = 2;
  61. else
  62. animation = 1;
  63. }
  64. }
  65. void NLNachricht::doMausEreignis( MausEreignis & me )
  66. {
  67. if( animation != 3 )
  68. {
  69. bool tmp = 0;
  70. if( me.my > höhe || !ausgewählt )
  71. {
  72. tmp = me.verarbeitet;
  73. me.verarbeitet = 1;
  74. }
  75. char aktion = me.verarbeitet ? 2 : 0;
  76. close->doMausEreignis( me );
  77. if( !aktion )
  78. aktion = me.verarbeitet ? 1 : 0;
  79. if( me.my > höhe || !ausgewählt )
  80. {
  81. me.verarbeitet = tmp;
  82. return;
  83. }
  84. if( me.id != ME_RLinks )
  85. return;
  86. if( aktion == 1 )
  87. entfernen();
  88. }
  89. }
  90. bool NLNachricht::tick( double tickVal )
  91. {
  92. rend |= close->tick( tickVal );
  93. if( !animation )
  94. {
  95. bool ret = rend;
  96. rend = 0;
  97. return ret;
  98. }
  99. this->tickVal += tickVal * 100;
  100. int val = (int)this->tickVal;
  101. if( val < 1 )
  102. {
  103. bool ret = rend;
  104. rend = 0;
  105. return ret;
  106. }
  107. if( val > 4 )
  108. val = 4;
  109. this->tickVal -= val;
  110. switch( animation )
  111. {
  112. case 1:
  113. if( höhe != 20 )
  114. {
  115. if( höhe > 20 )
  116. {
  117. höhe -= val;
  118. if( höhe < 20 )
  119. höhe = 20;
  120. }
  121. else
  122. {
  123. höhe += val;
  124. if( höhe > 20 )
  125. höhe = 20;
  126. }
  127. rend = 1;
  128. }
  129. else
  130. animation = 0;
  131. break;
  132. case 2:
  133. if( höhe != maxHöhe )
  134. {
  135. höhe += val;
  136. if( höhe > maxHöhe )
  137. höhe = maxHöhe;
  138. rend = 1;
  139. }
  140. else
  141. animation = 0;
  142. break;
  143. case 3:
  144. höhe -= val;
  145. if( höhe <= 0 )
  146. {
  147. nachLogin->zNachrichtenListe()->removeNachricht( this ); // delete this
  148. return 1;
  149. }
  150. rend = 1;
  151. break;
  152. }
  153. bool ret = rend;
  154. rend = 0;
  155. return ret;
  156. }
  157. void NLNachricht::render( int y, Bild & zRObj )
  158. {
  159. int br = 228;
  160. int hö = höhe;
  161. if( !zRObj.setDrawOptions( 0, y, br, hö ) )
  162. return;
  163. rahmen->setSize( br, hö );
  164. rahmen->render( zRObj );
  165. int rbr = rahmen->getRBreite();
  166. if( !zRObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
  167. {
  168. zRObj.releaseDrawOptions();
  169. return;
  170. }
  171. titel->render( zRObj );
  172. close->render( zRObj );
  173. zRObj.releaseDrawOptions();
  174. zRObj.releaseDrawOptions();
  175. }
  176. // contant
  177. bool NLNachricht::istAusgewählt() const
  178. {
  179. return ausgewählt;
  180. }
  181. int NLNachricht::getHeight() const
  182. {
  183. return höhe;
  184. }
  185. Text *NLNachricht::zTitel() const
  186. {
  187. return titel->zText();
  188. }
  189. // Reference Counting
  190. NLNachricht *NLNachricht::getThis()
  191. {
  192. ref++;
  193. return this;
  194. }
  195. NLNachricht *NLNachricht::release()
  196. {
  197. ref--;
  198. if( !ref )
  199. delete this;
  200. return 0;
  201. }
  202. SpielUpdateNachricht::SpielUpdateNachricht( Schrift * zSchrift, Text * titel, Text * nachricht, int dgID, std::function<void()> posAk, std::function<void()> negAk )
  203. : NLNachricht( zSchrift, titel )
  204. {
  205. Text *result = new Text( nachricht->getText() );
  206. int län = nachricht->getLength();
  207. char *txt = nachricht->getText();
  208. int x = 0;
  209. int y = 0;
  210. Alphabet *tmp = zSchrift->getAlphabet( 12 );
  211. TextRenderer rd( zSchrift->getThis() );
  212. rd.setSchriftSize( 12 );
  213. int zeilenHöhe = rd.getZeilenHeight() + rd.getZeilenAbstand();
  214. int lastPos = -1;
  215. for( int i = 0; i < län; i++ )
  216. {
  217. char c = txt[ i ];
  218. if( c == ' ' )
  219. {
  220. lastPos = i;
  221. x += 6;
  222. continue;
  223. }
  224. if( c == '\n' )
  225. {
  226. x = 0;
  227. y += zeilenHöhe;
  228. lastPos = -1;
  229. continue;
  230. }
  231. Buchstabe *b = tmp->getBuchstabe( (unsigned)c );
  232. if( b )
  233. {
  234. x += b->getBreite();
  235. if( x > 228 && lastPos > -1 )
  236. {
  237. result->ersetzen( lastPos, lastPos + 1, "\n" );
  238. x = 0;
  239. y += zeilenHöhe;
  240. i = lastPos;
  241. lastPos = -1;
  242. }
  243. b = b->release();
  244. }
  245. }
  246. y += zeilenHöhe;
  247. tmp = tmp->release();
  248. nachricht = nachricht->release();
  249. text = initTextFeld( 1, 22, 228, y, zSchrift, TextFeld::Style::Text, result->getText() );
  250. result = result->release();
  251. fortschritt = initFBalken( 5, y + 20, 215, 20, zSchrift, FBalken::Style::normal );
  252. herunterladen = initKnopf( 10, 45 + y, 120, 20, zSchrift, Knopf::Style::Sichtbar, "herunterladen" );
  253. abbrechen = initKnopf( 140, 45 + y, 80, 20, zSchrift, Knopf::Style::Sichtbar, "abbrechen" );
  254. this->posAk = posAk;
  255. this->negAk = negAk;
  256. maxHöhe = 75 + y;
  257. update = new Update( zSchrift, (FBalken *)fortschritt->getThis(), dgID, [ this ]( bool ok )
  258. {
  259. this->animation = 3;
  260. if( ok )
  261. this->posAk();
  262. else
  263. this->negAk();
  264. } );
  265. if( !updateH->add( (Update*)update->getThis() ) )
  266. entfernen();
  267. }
  268. SpielUpdateNachricht::~SpielUpdateNachricht()
  269. {
  270. text->release();
  271. herunterladen->release();
  272. abbrechen->release();
  273. fortschritt->release();
  274. updateH->remove( update->getDateiGruppe() );
  275. update->release();
  276. }
  277. // nicht constant
  278. void SpielUpdateNachricht::entfernen()
  279. {
  280. __super::entfernen();
  281. negAk();
  282. }
  283. void SpielUpdateNachricht::doMausEreignis( MausEreignis & me )
  284. {
  285. __super::doMausEreignis( me );
  286. if( animation != 3 )
  287. {
  288. bool tmp = 0;
  289. if( me.my > höhe || !ausgewählt )
  290. {
  291. tmp = me.verarbeitet;
  292. me.verarbeitet = 1;
  293. }
  294. char aktion = me.verarbeitet ? 3 : 0;
  295. herunterladen->doMausEreignis( me );
  296. if( !aktion )
  297. aktion = me.verarbeitet ? 1 : 0;
  298. abbrechen->doMausEreignis( me );
  299. if( !aktion )
  300. aktion = me.verarbeitet ? 2 : 0;
  301. if( me.my > höhe || !ausgewählt )
  302. {
  303. me.verarbeitet = tmp;
  304. return;
  305. }
  306. if( me.id != ME_RLinks )
  307. return;
  308. switch( aktion )
  309. {
  310. case 1:
  311. // positiv
  312. update->herunterladen();
  313. herunterladen->removeStyle( Knopf::Style::Erlaubt | Knopf::Style::Sichtbar );
  314. break;
  315. case 2:
  316. // negativ
  317. update->abbrechen();
  318. abbrechen->removeStyle( Knopf::Style::Erlaubt | Knopf::Style::Sichtbar );
  319. break;
  320. }
  321. }
  322. }
  323. bool SpielUpdateNachricht::tick( double tickVal )
  324. {
  325. rend |= herunterladen->tick( tickVal );
  326. rend |= fortschritt->tick( tickVal );
  327. rend |= abbrechen->tick( tickVal );
  328. rend |= text->tick( tickVal );
  329. return __super::tick( tickVal );
  330. }
  331. void SpielUpdateNachricht::render( int y, Bild & zRObj )
  332. {
  333. __super::render( y, zRObj );
  334. int rbr = rahmen->getRBreite();
  335. if( !zRObj.setDrawOptions( rbr, y + rbr, rahmen->getBreite() - rbr * 2, rahmen->getHeight() - rbr * 2 ) )
  336. return;
  337. text->render( zRObj );
  338. fortschritt->render( zRObj );
  339. herunterladen->render( zRObj );
  340. abbrechen->render( zRObj );
  341. zRObj.releaseDrawOptions();
  342. }
  343. // Inhalt der Nachricht Klasse aus NachrichtListe.h
  344. // Konstruktor
  345. Nachricht::Nachricht( Schrift * zSchrift, Text * titel, Text * nachricht, Text * positiv, Text * negativ, std::function<void()> posAk, std::function<void()> negAk )
  346. : NLNachricht( zSchrift, titel )
  347. {
  348. Text *result = new Text( nachricht->getText() );
  349. int län = nachricht->getLength();
  350. char *txt = nachricht->getText();
  351. int x = 0;
  352. int y = 0;
  353. Alphabet *tmp = zSchrift->getAlphabet( 12 );
  354. TextRenderer rd( zSchrift->getThis() );
  355. rd.setSchriftSize( 12 );
  356. int zeilenHöhe = rd.getZeilenHeight() + rd.getZeilenAbstand();
  357. int lastPos = -1;
  358. for( int i = 0; i < län; i++ )
  359. {
  360. char c = txt[ i ];
  361. if( c == ' ' )
  362. {
  363. lastPos = i;
  364. x += 6;
  365. continue;
  366. }
  367. if( c == '\n' )
  368. {
  369. x = 0;
  370. y += zeilenHöhe;
  371. lastPos = -1;
  372. continue;
  373. }
  374. Buchstabe *b = tmp->getBuchstabe( (unsigned)c );
  375. if( b )
  376. {
  377. x += b->getBreite();
  378. if( x > 228 && lastPos > -1 )
  379. {
  380. result->ersetzen( lastPos, lastPos + 1, "\n" );
  381. x = 0;
  382. y += zeilenHöhe;
  383. i = lastPos;
  384. lastPos = -1;
  385. }
  386. b = b->release();
  387. }
  388. }
  389. y += zeilenHöhe;
  390. tmp = tmp->release();
  391. nachricht = nachricht->release();
  392. text = initTextFeld( 1, 22, 228, y, zSchrift, TextFeld::Style::Text, result->getText() );
  393. result = result->release();
  394. if( positiv )
  395. {
  396. this->positiv = initKnopf( 10, 20 + y, 100, 20, zSchrift, Knopf::Style::Sichtbar, positiv->getText() );
  397. positiv = positiv->release();
  398. }
  399. else
  400. this->positiv = 0;
  401. if( negativ )
  402. {
  403. this->negativ = initKnopf( 120, 20 + y, 100, 20, zSchrift, Knopf::Style::Sichtbar, negativ->getText() );
  404. negativ = negativ->release();
  405. }
  406. else
  407. this->negativ = 0;
  408. this->posAk = posAk;
  409. this->negAk = negAk;
  410. maxHöhe = 50 + y;
  411. }
  412. // Destruktor
  413. Nachricht::~Nachricht()
  414. {
  415. text = (TextFeld *)text->release();
  416. if( positiv )
  417. positiv = (Knopf *)positiv->release();
  418. if( negativ )
  419. negativ = (Knopf *)negativ->release();
  420. }
  421. void Nachricht::entfernen()
  422. {
  423. __super::entfernen();
  424. negAk();
  425. }
  426. void Nachricht::doMausEreignis( MausEreignis & me )
  427. {
  428. __super::doMausEreignis( me );
  429. if( animation != 3 )
  430. {
  431. bool tmp = 0;
  432. if( me.my > höhe || !ausgewählt )
  433. {
  434. tmp = me.verarbeitet;
  435. me.verarbeitet = 1;
  436. }
  437. char aktion = me.verarbeitet ? 3 : 0;
  438. if( positiv )
  439. positiv->doMausEreignis( me );
  440. if( !aktion )
  441. aktion = me.verarbeitet ? 1 : 0;
  442. if( negativ )
  443. negativ->doMausEreignis( me );
  444. if( !aktion )
  445. aktion = me.verarbeitet ? 2 : 0;
  446. if( me.my > höhe || !ausgewählt )
  447. {
  448. me.verarbeitet = tmp;
  449. return;
  450. }
  451. if( me.id != ME_RLinks )
  452. return;
  453. switch( aktion )
  454. {
  455. case 1:
  456. // positiv
  457. __super::entfernen();
  458. posAk();
  459. break;
  460. case 2:
  461. // negativ
  462. __super::entfernen();
  463. negAk();
  464. break;
  465. }
  466. }
  467. }
  468. bool Nachricht::tick( double tickVal )
  469. {
  470. rend |= positiv ? positiv->tick( tickVal ) : 0;
  471. rend |= negativ ? negativ->tick( tickVal ) : 0;
  472. rend |= text->tick( tickVal );
  473. return __super::tick( tickVal );
  474. }
  475. void Nachricht::render( int yPos, Bild & zRObj )
  476. {
  477. __super::render( yPos, zRObj );
  478. int rbr = rahmen->getRBreite();
  479. if( !zRObj.setDrawOptions( rbr, yPos + rbr, rahmen->getBreite() - rbr * 2, rahmen->getHeight() - rbr * 2 ) )
  480. return;
  481. text->render( zRObj );
  482. if( positiv )
  483. positiv->render( zRObj );
  484. if( negativ )
  485. negativ->render( zRObj );
  486. zRObj.releaseDrawOptions();
  487. }
  488. // Inhalt der NachrichtenListeObj Klasse aus NachrichtListe.h
  489. // Konstruktor
  490. NachrichtenListeObj::NachrichtenListeObj( Schrift * zSchrift )
  491. : Zeichnung()
  492. {
  493. members = new RCArray< NLNachricht >();
  494. schrift = zSchrift->getThis();
  495. vsb = new VScrollBar();
  496. vsb->setKlickScroll( 10 );
  497. bildschirmGröße = BildschirmGröße();
  498. vsb->update( 0, bildschirmGröße.y - 122 );
  499. anzahl = 0;
  500. gr = Punkt( 250, bildschirmGröße.y - 122 );
  501. }
  502. // Destruktor
  503. NachrichtenListeObj::~NachrichtenListeObj()
  504. {
  505. schrift = schrift->release();
  506. vsb = (VScrollBar *)vsb->release();
  507. members = members->release();
  508. }
  509. // nicht constant
  510. void NachrichtenListeObj::addNachricht( NLNachricht * nachricht )
  511. {
  512. members->add( nachricht, anzahl );
  513. anzahl++;
  514. rend = 1;
  515. }
  516. void NachrichtenListeObj::removeNachricht( NLNachricht * zNachricht )
  517. {
  518. for( int i = 0; i < anzahl; i++ )
  519. {
  520. if( members->z( i ) == zNachricht )
  521. {
  522. members->remove( i );
  523. anzahl--;
  524. rend = 1;
  525. break;
  526. }
  527. }
  528. }
  529. void NachrichtenListeObj::removeAll()
  530. {
  531. lockZeichnung();
  532. members->leeren();
  533. anzahl = 0;
  534. rend = 1;
  535. unlockZeichnung();
  536. }
  537. bool NachrichtenListeObj::tick( double tickVal )
  538. {
  539. lockZeichnung();
  540. rend |= vsb->getRend();
  541. rend |= nachLogin->zNachrichtenListe()->tick( tickVal );
  542. for( int i = 0; i < anzahl; i++ )
  543. {
  544. NLNachricht *tmp = members->z( i );
  545. if( tmp )
  546. rend |= tmp->tick( tickVal );
  547. }
  548. unlockZeichnung();
  549. bool ret = rend;
  550. rend = 0;
  551. return ret;
  552. }
  553. void NachrichtenListeObj::doMausEreignis( MausEreignis & me )
  554. {
  555. lockZeichnung();
  556. int my = me.my;
  557. me.my -= 20;
  558. if( me.mx <= 229 && me.mx > 0 && me.my >= 0 )
  559. {
  560. me.my += vsb->getScroll();
  561. for( int i = 0; i < anzahl; i++ )
  562. {
  563. NLNachricht *tmp = members->z( i );
  564. if( tmp )
  565. {
  566. if( me.my > 0 && me.my < tmp->getHeight() )
  567. tmp->setAusgewählt( 1 );
  568. else
  569. tmp->setAusgewählt( 0 );
  570. tmp->doMausEreignis( me );
  571. me.my -= tmp->getHeight();
  572. }
  573. }
  574. me.my -= vsb->getScroll();
  575. }
  576. else
  577. {
  578. me.my += vsb->getScroll();
  579. for( int i = 0; i < anzahl; i++ )
  580. {
  581. NLNachricht *tmp = members->z( i );
  582. if( tmp )
  583. {
  584. tmp->setAusgewählt( 0 );
  585. tmp->doMausEreignis( me );
  586. me.my -= tmp->getHeight();
  587. }
  588. }
  589. me.my -= vsb->getScroll();
  590. }
  591. me.my = my;
  592. vsb->doMausMessage( 229, 20, 20, bildschirmGröße.y - 122, me );
  593. unlockZeichnung();
  594. }
  595. void NachrichtenListeObj::render( Bild & zrObj )
  596. {
  597. lockZeichnung();
  598. int x = pos.x;
  599. int y = pos.y;
  600. int br = gr.x;
  601. int hö = gr.y;
  602. if( !zrObj.setDrawOptions( x, y, br, hö ) )
  603. {
  604. unlockZeichnung();
  605. return;
  606. }
  607. int höhe = 0;
  608. for( int i = 0; i < anzahl; i++ )
  609. {
  610. NLNachricht *tmp = members->z( i );
  611. tmp->render( höhe - ( vsb ? vsb->getScroll() : 0 ), zrObj );
  612. höhe += tmp->getHeight();
  613. }
  614. if( vsb )
  615. {
  616. vsb->update( höhe, bildschirmGröße.y - 122 );
  617. vsb->render( 229, 0, 20, bildschirmGröße.y - 122, zrObj );
  618. }
  619. zrObj.releaseDrawOptions();
  620. unlockZeichnung();
  621. }
  622. // Inhalt der NachrichtenListe Klasse aus NachrichtListe.h
  623. // Konstruktor
  624. NachrichtenListe::NachrichtenListe( Schrift * zSchrift, Fenster * zNachLoginFenster )
  625. {
  626. schrift = zSchrift->getThis();
  627. minimierenBild = bilder->get( "chat.ltdb/minimieren.png" );
  628. if( !minimierenBild )
  629. {
  630. LTDBDatei *datei = new LTDBDatei();
  631. datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
  632. datei->leseDaten( 0 );
  633. minimierenBild = datei->laden( 0, new Text( "minimieren.png" ) );
  634. datei->release();
  635. bilder->add( "chat.ltdb/minimieren.png", minimierenBild->getThis() );
  636. }
  637. maximierenBild = bilder->get( "chat.ltdb/maximieren.png" );
  638. if( !maximierenBild )
  639. {
  640. LTDBDatei *datei = new LTDBDatei();
  641. datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
  642. datei->leseDaten( 0 );
  643. maximierenBild = datei->laden( 0, new Text( "maximieren.png" ) );
  644. datei->release();
  645. bilder->add( "chat.ltdb/maximieren.png", maximierenBild->getThis() );
  646. }
  647. bildschirmGröße = BildschirmGröße();
  648. fenster = initFenster( bildschirmGröße.x - 21, 100, 250, 22, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::BodyHintergrund, "" );
  649. fenster->setKBgFarbe( 0xFF000000 );
  650. überschrift = initTextFeld( 1, 1, 248, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center | TextFeld::Style::Sichtbar, "Nachrichten" );
  651. überschrift->setSchriftSize( 15 );
  652. fenster->addMember( überschrift->getThis() );
  653. minMax = initKnopf( 1, 1, 20, 20, 0, 0, "" );
  654. minMax->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
  655. minMax->setMausEreignisParameter( this );
  656. minMax->setMausEreignis( NachrichtenListeMinMaxME );
  657. minMax->setHintergrundBildZ( minimierenBild->getThis() );
  658. initToolTip( minMax, "Nachrichten Leiste minimieren.", zSchrift, hauptScreen );
  659. fenster->addMember( minMax->getThis() );
  660. nachrichtenListe = new NachrichtenListeObj( zSchrift );
  661. nachrichtenListe->setPosition( 1, 21 );
  662. nachrichtenListe->setSize( 248, bildschirmGröße.y - 122 );
  663. fenster->addMember( nachrichtenListe->getThis() );
  664. zNachLoginFenster->addMember( fenster->getThis() );
  665. tickVal = 0;
  666. animation = 1;
  667. rend = 0;
  668. msgSound = 0;
  669. errSound = 0;
  670. HMODULE dll = Framework::getDLLRegister()->ladeDLL( "GSL.dll", "data/bin/GSL.dll" );
  671. if( dll )
  672. {
  673. GetGSLDatei getGSLDatei = (GetGSLDatei)GetProcAddress( dll, "getGSLDatei" );
  674. if( getGSLDatei )
  675. {
  676. GSL::GSLDateiV *sDat = getGSLDatei();
  677. sDat->setDatei( "data/sounds/popup.gsl" );
  678. sDat->leseDaten();
  679. msgSound = sDat->getSound( "info.wav" );
  680. errSound = sDat->getSound( "error.wav" );
  681. sDat->release();
  682. if( msgSound )
  683. msgSound->setVolume( 0xFFFF, 0xFFFF );
  684. if( errSound )
  685. errSound->setVolume( 0xFFFF, 0xFFFF );
  686. }
  687. if( !msgSound && !errSound )
  688. Framework::getDLLRegister()->releaseDLL( "GSL.dll" );
  689. }
  690. ref = 1;
  691. }
  692. // Destruktor
  693. NachrichtenListe::~NachrichtenListe()
  694. {
  695. if( msgSound || errSound )
  696. {
  697. if( msgSound )
  698. {
  699. msgSound->stopSound();
  700. msgSound->release();
  701. }
  702. if( errSound )
  703. {
  704. errSound->stopSound();
  705. errSound->release();
  706. }
  707. Framework::getDLLRegister()->releaseDLL( "GSL.dll" );
  708. }
  709. überschrift = (TextFeld *)überschrift->release();
  710. fenster = (Fenster *)fenster->release();
  711. minMax = (Knopf *)minMax->release();
  712. nachrichtenListe = (NachrichtenListeObj*)nachrichtenListe->release();
  713. minimierenBild = minimierenBild->release();
  714. maximierenBild = maximierenBild->release();
  715. schrift->release();
  716. }
  717. // nicht constant
  718. void NachrichtenListe::addNachricht( Text * titel, Text * nachricht, Text * positiv, Text * negativ, std::function<void()> posAk, std::function<void()> negAk )
  719. {
  720. if( titel &&titel->hat( "Fehler" ) && errSound )
  721. errSound->playSound();
  722. else if( msgSound )
  723. msgSound->playSound();
  724. nachrichtenListe->addNachricht( new Nachricht( schrift, titel, nachricht, positiv, negativ, posAk, negAk ) );
  725. }
  726. void NachrichtenListe::addNachricht( NLNachricht * nachricht )
  727. {
  728. if( nachricht->zTitel() && nachricht->zTitel()->hat( "Fehler" ) && errSound )
  729. errSound->playSound();
  730. else if( msgSound )
  731. msgSound->playSound();
  732. nachrichtenListe->addNachricht( nachricht );
  733. }
  734. void NachrichtenListe::removeNachricht( NLNachricht * zNachricht )
  735. {
  736. nachrichtenListe->removeNachricht( zNachricht );
  737. }
  738. void NachrichtenListe::removeAll()
  739. {
  740. nachrichtenListe->removeAll();
  741. }
  742. bool NachrichtenListe::druckMinMax( MausEreignis & me )
  743. {
  744. if( me.id == ME_RLinks )
  745. {
  746. if( minMax->zHintergrundBild() == minimierenBild )
  747. {
  748. animation = 2;
  749. minMax->setHintergrundBildZ( maximierenBild->getThis() );
  750. // TODO minMax->zToolTip()->setText( "Nachrichten Leiste maximieren." );
  751. }
  752. else
  753. {
  754. animation = 1;
  755. minMax->setHintergrundBildZ( minimierenBild->getThis() );
  756. // TODO minMax->zToolTip()->setText( "Nachrichten Leiste minimieren." );
  757. }
  758. }
  759. return 1;
  760. }
  761. bool NachrichtenListe::tick( double tickVal )
  762. {
  763. if( !animation )
  764. {
  765. bool ret = rend;
  766. rend = 0;
  767. return ret;
  768. }
  769. this->tickVal += tickVal * 400;
  770. int val = (int)this->tickVal;
  771. if( val < 1 )
  772. {
  773. bool ret = rend;
  774. rend = 0;
  775. return ret;
  776. }
  777. if( val > 14 )
  778. val = 14;
  779. this->tickVal -= val;
  780. switch( animation )
  781. {
  782. case 1: // maximieren
  783. if( fenster->getX() > bildschirmGröße.x - 250 )
  784. {
  785. fenster->setPosition( fenster->getX() - val, fenster->getY() );
  786. minMax->setPosition( minMax->getX() + val, minMax->getY() );
  787. if( fenster->getX() < bildschirmGröße.x - 250 )
  788. {
  789. fenster->setPosition( bildschirmGröße.x - 250, fenster->getY() );
  790. minMax->setPosition( 229, minMax->getY() );
  791. }
  792. rend = 1;
  793. }
  794. else if( fenster->getHeight() < bildschirmGröße.y - 100 )
  795. {
  796. fenster->setSize( fenster->getBreite(), fenster->getHeight() + val );
  797. if( fenster->getHeight() >= bildschirmGröße.y - 100 )
  798. {
  799. fenster->setSize( fenster->getBreite(), bildschirmGröße.y - 100 );
  800. animation = 0;
  801. }
  802. rend = 1;
  803. }
  804. break;
  805. case 2: // minimieren
  806. if( fenster->getHeight() > 22 )
  807. {
  808. fenster->setSize( fenster->getBreite(), fenster->getHeight() - val );
  809. if( fenster->getHeight() < 22 )
  810. fenster->setSize( fenster->getBreite(), 22 );
  811. rend = 1;
  812. }
  813. else if( fenster->getX() < bildschirmGröße.x - 21 )
  814. {
  815. minMax->setPosition( minMax->getX() - val, minMax->getY() );
  816. fenster->setPosition( fenster->getX() + val, fenster->getY() );
  817. if( fenster->getX() >= bildschirmGröße.x - 21 )
  818. {
  819. minMax->setPosition( 1, minMax->getY() );
  820. fenster->setPosition( bildschirmGröße.x - 21, fenster->getY() );
  821. animation = 0;
  822. }
  823. rend = 1;
  824. }
  825. break;
  826. }
  827. bool ret = rend;
  828. rend = 0;
  829. return ret;
  830. }
  831. // contant
  832. Schrift *NachrichtenListe::zSchrift() const
  833. {
  834. return schrift;
  835. }
  836. // Reference Counting
  837. NachrichtenListe *NachrichtenListe::getThis()
  838. {
  839. ref++;
  840. return this;
  841. }
  842. NachrichtenListe *NachrichtenListe::release()
  843. {
  844. ref--;
  845. if( !ref )
  846. delete this;
  847. return 0;
  848. }
  849. // Nachrichten
  850. bool NachrichtenListeMinMaxME( void *p, void *obj, MausEreignis me )
  851. {
  852. return ( (NachrichtenListe *)p )->druckMinMax( me );
  853. }