#include "KEBeschreibung.h" #include "../../../../Global/Initialisierung.h" #include "../../../../Global/Variablen.h" bool KEBKnopfPressME( void *p, void *obj, MausEreignis me ) { if( p ) ( (KEBeschreibung*)p )->knopfPress( (Knopf*)obj, &me ); return 1; } // Inhalt der KEBeschreibung Klasse aus KEBeschreibung.h // Konstruktor KEBeschreibung::KEBeschreibung( int karte, Schrift *zSchrift ) : Thread() { schrift = zSchrift->getThis(); Text *kName = infoKlient->getKarteName( karte ); Text titel = kName ? kName->getText() : ""; titel += " - Beschreibung"; if( kName ) kName->release(); fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel ); editor = new KEBEditor( zSchrift, this ); vorschau = new KEBVorschau( zSchrift ); fenster->addMember( editor ); fenster->addMember( vorschau ); laden = (Animation2D*)ladeAnimation->dublizieren(); laden->setPosition( 425, 275 ); laden->setSichtbar( 0 ); importDialog = 0; importPfad = 0; animation = 0; tickVal = 0; sichtbar = 0; rechts = 0; xStart = 0; breite = 0; aktion = 0; jetzt = 0; this->karte = karte; alpha = 255; ref = 1; } // Destruktor KEBeschreibung::~KEBeschreibung() { if( run ) { warteAufThread( 5000 ); if( run ) ende(); } fenster->release(); laden->release(); schrift->release(); editor->release(); vorschau->release(); if( importDialog ) importDialog->release(); if( importPfad ) importPfad->release(); } // nicht constant void KEBeschreibung::setSichtbar( bool s, bool vr ) { animation = 1; sichtbar = s; rechts = vr; if( sichtbar ) { if( vr ) { xStart = 900; breite = 0; } else { xStart = 0; breite = 0; } if( !run ) { aktion = 0; start(); } } } void KEBeschreibung::thread() { laden->setSichtbar( 1 ); if( aktion == 0 ) { if( jetzt == 1 ) { // beschreibung laden Text *t = editorKlient->beschreibungLaden(); t->ersetzen( "\r\n", "\n" ); hauptScreen->lock(); if( !t ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); else editor->setText( t ); hauptScreen->unlock(); t->release(); } if( jetzt == 2 ) { // Titelbild laden Bild *b = editorKlient->titelbildLaden(); hauptScreen->lock(); if( !b ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); else editor->setBild( b ); hauptScreen->unlock(); b->release(); } if( jetzt == 3 ) { // Minimap Bild laden Bild *b = editorKlient->minimapLaden(); hauptScreen->lock(); if( !b ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); else editor->setBild( b ); hauptScreen->unlock(); b->release(); } if( jetzt == 4 ) { // Ladebild laden Bild *b = editorKlient->ladebildLaden(); hauptScreen->lock(); if( !b ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); else editor->setBild( b ); hauptScreen->unlock(); b->release(); } editor->setSichtbar( 1 ); } if( aktion == 1 ) { if( jetzt == 1 ) { // Beschreibung speichern if( !editorKlient->beschreibungSpeichern( editor->zBeschreibung() ) ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); } if( jetzt == 2 ) { // Titelbild hochladen importPfad->ersetzen( "\\", "/" ); Text *n = importPfad->getTeilText( importPfad->positionVon( "/", importPfad->anzahlVon( "/" ) - 1 ) + 1 ); Text name = n->getText(); n->release(); Text *err = new Text(); Bild *b = ladeBild( importPfad->getText(), err ); if( !b ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) ); else { err->release(); if( !editorKlient->titelbildSpeichern( b ) ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); hauptScreen->lock(); editor->setBild( b ); hauptScreen->unlock(); b->release(); } } if( jetzt == 3 ) { // Minimap hochladen importPfad->ersetzen( "\\", "/" ); Text *n = importPfad->getTeilText( importPfad->positionVon( "/", importPfad->anzahlVon( "/" ) - 1 ) + 1 ); Text name = n->getText(); n->release(); Text *err = new Text(); Bild *b = ladeBild( importPfad->getText(), err ); if( !b ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) ); else { err->release(); if( !editorKlient->minimapSpeichern( b ) ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); hauptScreen->lock(); editor->setBild( b ); hauptScreen->unlock(); b->release(); } } if( jetzt == 4 ) { // Ladebild hochladen importPfad->ersetzen( "\\", "/" ); Text *n = importPfad->getTeilText( importPfad->positionVon( "/", importPfad->anzahlVon( "/" ) - 1 ) + 1 ); Text name = n->getText(); n->release(); Text *err = new Text(); Bild *b = ladeBild( importPfad->getText(), err ); if( !b ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) ); else { err->release(); if( !editorKlient->ladebildSpeichern( b ) ) nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorKlient->getLetzterFehler() ), new Text( "Ok" ) ); hauptScreen->lock(); editor->setBild( b ); hauptScreen->unlock(); b->release(); } } } if( aktion == 2 ) { // Vorschau if( vorschau->ladeKarte() ) { editor->setSichtbar( 0 ); vorschau->setSichtbar( 1 ); } } run = 0; laden->setSichtbar( 0 ); return; } void KEBeschreibung::knopfPress( Knopf *k, MausEreignis *me ) { if( run || me->id != ME_RLinks ) return; if( editor->getKNum( k ) > 0 && jetzt != editor->getKNum( k ) ) { jetzt = editor->getKNum( k ); aktion = 0; start(); } if( editor->getKNum( k ) == -1 ) { aktion = 1; start(); } if( editor->getKNum( k ) == -2 ) { if( !importDialog ) { importDialog = new DateiDialogTh(); importDialog->setOpen( 1 ); importDialog->setDateiTypAuswahl( 4 ); importDialog->addDateiTyp( "JPEG-Bild", "*.jpg;*.jpeg;*.jpe" ); importDialog->addDateiTyp( "GIF-Bild", "*.gif" ); importDialog->addDateiTyp( "PNG-Bild", "*.png" ); importDialog->addDateiTyp( "Alle Dateien", "*.*" ); importDialog->start(); } } if( editor->getKNum( k ) == -3 ) { aktion = 2; start(); } } void KEBeschreibung::doMausEreignis( MausEreignis &me ) { if( !run ) fenster->doMausEreignis( me ); } void KEBeschreibung::doTastaturEreignis( TastaturEreignis &te ) { if( !run ) fenster->doTastaturEreignis( te ); } bool KEBeschreibung::tick( double z ) { if( importDialog ) { if( !importDialog->isRunning() ) { if( importPfad ) importPfad->release(); importPfad = importDialog->getPfad(); importDialog = importDialog->release(); if( sichtbar && importPfad ) { aktion = 1; start(); } } } if( vorschau->istSichtbar() ) { if( vorschau->getAktion() ) { vorschau->setSichtbar( 0 ); editor->setSichtbar( 1 ); } } bool ret = laden->tick( z ); tickVal += z * 150; int val = (int)tickVal; tickVal -= val; if( val ) { if( run && alpha > 100 ) { if( alpha - val < 100 ) alpha = 100; else alpha -= val; ret = 1; } if( sichtbar && !run && alpha != 255 ) { if( alpha + val > 255 ) alpha = 255; else alpha += val; ret = 1; } val *= 3; if( sichtbar ) { if( alpha < 100 ) { if( alpha + val > 100 ) alpha = 100; else alpha += val; ret = 1; } if( xStart != 0 || breite != 900 ) { if( rechts ) { if( xStart - val <= 0 ) { xStart = 0; breite = 900; animation = 0; } else { xStart -= val; breite += val; } } else { if( breite + val >= 900 ) { breite = 900; animation = 0; } else breite += val; } ret = 1; } } else { if( breite != 0 ) { if( rechts ) { if( breite - val <= 0 ) { breite = 0; animation = 0; } else breite -= val; } else { if( breite - val <= 0 ) { breite = 0; xStart = 900; animation = 0; } else { breite -= val; xStart += val; } } ret = 1; } } } return ret || fenster->tick( z ); } void KEBeschreibung::render( Bild &zRObj ) { if( !zRObj.setDrawOptions( xStart, 0, breite, 600 ) ) return; zRObj.setAlpha( alpha ); fenster->render( zRObj ); zRObj.releaseAlpha(); laden->render( zRObj ); zRObj.releaseDrawOptions(); } // constant bool KEBeschreibung::istSichtbar() const { return sichtbar || animation; } // Reference Counting KEBeschreibung *KEBeschreibung::getThis() { ref++; return this; } KEBeschreibung *KEBeschreibung::release() { ref--; if( !ref ) delete this; return 0; }