#include "ObjektOptionen.h" #include "../../../../Initialisierung/Initialisierung.h" #include using namespace Editor; ObjektTool::ObjektTool( Schrift *zSchrift, KarteDaten *daten ) : RightTool() { dialog = 0; dialog2 = 0; this->daten = daten; schrift = zSchrift->getThis(); objekte = new AuswahlListe(); objekte->setStyle( AuswahlListe::Style::Normal | AuswahlBox::Style::VScroll ); objekte->setRahmenFarbe( 0xFFFFFFFF ); objekte->setRahmenBreite( 1 ); objekte->setSchriftZ( zSchrift->getThis() ); objekte->setSize( 290, 200 ); int anz = daten->getObjektAnzahl(); for( int i = 0; i < anz; i++ ) { const ObjektDaten *o = daten->getObjekt( i ); objekte->addEintrag( Text( o->id ) ); } neuesObjekt = initKnopf( 0, 205, 290, 20, zSchrift, Knopf::Style::Normal, "Neues Objekt erstellen" ); neuesObjekt->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me ) { if( me.id == ME_RLinks ) { cs.lock(); if( dialog ) dialog->release(); dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_MODEL2D, (KarteDaten *)this->daten->getThis(), [ this ]( const char *modelPath ) { cs.lock(); if( dialog2 ) dialog2->release(); dialog2 = dialog; dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_TEXTUR, (KarteDaten *)this->daten->getThis(), [ this, modelPath ]( const char *texturPath ) { ObjektDaten o; this->daten->getResourceIdFromPath( modelPath, [ this, &o, texturPath ]( int id ) { o.m2d = id; this->daten->getResourceIdFromPath( texturPath, [ this, &o ]( int id ) { o.bild = id; o.scale = 1; o.maxStabilität = 100; o.maxEnergie = 100; o.energieRadius = 0; o.reparatur = 0; o.akkuLeistung = 0; o.team = this->daten->getTeam( 0 )->id; o.pos.x = 0; o.pos.y = 0; o.rot = 0; this->daten->addObjekt( o, [ this ]( int id ) { objekte->addEintrag( Text( id ) ); selectObject( id ); } ); } ); } ); }, screenSize ); cs.unlock(); }, screenSize ); cs.unlock(); } return 1; } ); model = new M2DVorschau(); model->setStyle( M2DVorschau::Style::Rahmen | M2DVorschau::Style::UsrRot | M2DVorschau::Style::UsrMove ); model->setSize( 290, 290 ); model->setPosition( 0, 230 ); changeModel = initKnopf( 0, 520, 142, 20, zSchrift, Knopf::Style::Normal, "Model ändern" ); changeModel->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me ) { if( me.id == ME_RLinks ) { if( dialog ) dialog->release(); cs.lock(); dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_MODEL2D, (KarteDaten*)this->daten->getThis(), [ this ]( const char *path ) { modelPath = path; model->setModel2D( this->daten->loadModelFromPath( modelPath ) ); Textur2D *textur = new Textur2D(); textur->setTexturZ( this->daten->loadBildFromPath( texturPath ) ); model->zModel()->setTextur( textur ); }, screenSize ); cs.unlock(); } return 1; } ); changeTextur = initKnopf( 147, 520, 143, 20, zSchrift, Knopf::Style::Normal, "Textur ändern" ); changeTextur->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me ) { if( me.id == ME_RLinks ) { cs.lock(); if( dialog ) dialog->release(); dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_TEXTUR, (KarteDaten *)this->daten->getThis(), [ this ]( const char *path ) { texturPath = path; Textur2D *textur = new Textur2D(); textur->setTexturZ( this->daten->loadBildFromPath( texturPath ) ); model->zModel()->setTextur( textur ); }, screenSize ); cs.unlock(); } return 1; } ); stabilitätT = initTextFeld( 0, 545, 100, 20, zSchrift, TextFeld::Style::Text, "Stabilität: " ); stabilität = initTextFeld( 100, 545, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" ); energieT = initTextFeld( 0, 570, 100, 20, zSchrift, TextFeld::Style::Text, "Energie: " ); energie = initTextFeld( 100, 570, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" ); energieRadiusT = initTextFeld( 0, 595, 100, 20, zSchrift, TextFeld::Style::Text, "Radius: " ); energieRadius = initTextFeld( 100, 595, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" ); reparaturT = initTextFeld( 0, 620, 100, 20, zSchrift, TextFeld::Style::Text, "Reparatur: " ); reparatur = initTextFeld( 100, 620, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" ); akkuLeistungT = initTextFeld( 0, 645, 100, 20, zSchrift, TextFeld::Style::Text, "Akku: " ); akkuLeistung = initTextFeld( 100, 645, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" ); team = initAuswahlBox( 0, 670, 150, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, {} ); anz = daten->getTeamAnzahl(); for( int i = 0; i < anz; i++ ) team->addEintrag( daten->getTeamName( i ) ); speichern = initKnopf( 0, 695, 100, 20, zSchrift, Knopf::Style::Normal, "Speichern" ); speichern->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me ) { if( me.id == ME_RLinks ) { ObjektDaten *o = this->daten->getObjekt( this->daten->getObjektIndexById( *objekte->zEintrag( objekte->getAuswahl() )->zText() ) ); this->daten->getResourceIdFromPath( modelPath, [ this, o ]( int id ) { o->m2d = id; this->daten->getResourceIdFromPath( texturPath, [ this, o ]( int id ) { o->bild = id; o->maxStabilität = *stabilität->zText(); o->maxEnergie = *energie->zText(); o->energieRadius = *energieRadius->zText(); o->reparatur = *reparatur->zText(); o->akkuLeistung = *akkuLeistung->zText(); o->team = team->getAuswahl(); o->update(); } ); } ); } return 1; } ); selectObject( 0 ); } ObjektTool::~ObjektTool() { cs.lock(); if( dialog ) dialog->release(); if( dialog2 ) dialog2->release(); cs.unlock(); objekte->release(); neuesObjekt->release(); model->release(); changeModel->release(); changeTextur->release(); stabilitätT->release(); stabilität->release(); energieT->release(); energie->release(); energieRadiusT->release(); energieRadius->release(); reparaturT->release(); reparatur->release(); akkuLeistungT->release(); akkuLeistung->release(); team->release(); speichern->release(); daten->release(); schrift->release(); } void ObjektTool::doMausEreignis( MausEreignis & me ) { bool vera = me.verarbeitet; if( hatStyleNicht( Zeichnung::Style::Sichtbar ) ) me.verarbeitet = 1; cs.lock(); if( dialog ) dialog->doMausEreignis( me ); cs.unlock(); me.mx -= pos.x; me.my -= pos.y; int ausw = objekte->getAuswahl(); akkuLeistung->doMausEreignis( me ); objekte->doMausEreignis( me ); if( objekte->getAuswahl() != ausw && objekte->getAuswahl() >= 0 ) selectObject( *objekte->zEintrag( objekte->getAuswahl() )->zText() ); if( objekte->getAuswahl() != ausw && objekte->getAuswahl() < 0 ) selectObject( 0 ); model->doMausEreignis( me ); changeModel->doMausEreignis( me ); changeTextur->doMausEreignis( me ); stabilität->doMausEreignis( me ); energie->doMausEreignis( me ); energieRadius->doMausEreignis( me ); reparatur->doMausEreignis( me ); akkuLeistung->doMausEreignis( me ); speichern->doMausEreignis( me ); me.mx += pos.x; me.my += pos.y; if( hatStyleNicht( Zeichnung::Style::Sichtbar ) ) me.verarbeitet = vera; RightTool::doMausEreignis( me ); } void ObjektTool::doTastaturEreignis( TastaturEreignis & te ) { if( hatStyleNicht( Zeichnung::Style::Sichtbar ) ) return; cs.lock(); if( dialog ) dialog->doTastaturEreignis( te ); cs.unlock(); model->doTastaturEreignis( te ); stabilität->doTastaturEreignis( te ); energie->doTastaturEreignis( te ); energieRadius->doTastaturEreignis( te ); reparatur->doTastaturEreignis( te ); akkuLeistung->doTastaturEreignis( te ); } bool ObjektTool::tick( double tickVal ) { if( hatStyleNicht( Zeichnung::Style::Sichtbar ) ) return RightTool::tick( tickVal ); cs.lock(); if( dialog ) rend |= dialog->tick( tickVal ); cs.unlock(); rend |= objekte->tick( tickVal ); rend |= neuesObjekt->tick( tickVal ); rend |= model->tick( tickVal ); rend |= changeModel->tick( tickVal ); rend |= changeTextur->tick( tickVal ); rend |= stabilität->tick( tickVal ); rend |= energie->tick( tickVal ); rend |= energieRadius->tick( tickVal ); rend |= reparatur->tick( tickVal ); rend |= akkuLeistung->tick( tickVal ); rend |= team->tick( tickVal ); rend |= speichern->tick( tickVal ); return RightTool::tick( tickVal ); } void ObjektTool::render( Bild & rObj ) { screenSize = rObj.getSize(); if( hatStyleNicht( Zeichnung::Style::Sichtbar ) ) return; if( rObj.setDrawOptions( pos, gr ) ) { objekte->render( rObj ); neuesObjekt->render( rObj ); model->render( rObj ); changeModel->render( rObj ); changeTextur->render( rObj ); stabilitätT->render( rObj ); stabilität->render( rObj ); energieT->render( rObj ); energie->render( rObj ); energieRadiusT->render( rObj ); energieRadius->render( rObj ); reparaturT->render( rObj ); reparatur->render( rObj ); akkuLeistungT->render( rObj ); akkuLeistung->render( rObj ); speichern->render( rObj ); team->render( rObj ); rObj.releaseDrawOptions(); } cs.lock(); if( dialog ) dialog->render( rObj ); cs.unlock(); } void ObjektTool::selectObject( int id ) { if( id == 0 ) { model->removeStyle( M2DVorschau::Style::Sichtbar ); changeModel->removeStyle( M2DVorschau::Style::Sichtbar ); changeTextur->removeStyle( M2DVorschau::Style::Sichtbar ); stabilitätT->removeStyle( M2DVorschau::Style::Sichtbar ); stabilität->removeStyle( M2DVorschau::Style::Sichtbar ); energieT->removeStyle( M2DVorschau::Style::Sichtbar ); energie->removeStyle( M2DVorschau::Style::Sichtbar ); energieRadiusT->removeStyle( M2DVorschau::Style::Sichtbar ); energieRadius->removeStyle( M2DVorschau::Style::Sichtbar ); reparaturT->removeStyle( M2DVorschau::Style::Sichtbar ); reparatur->removeStyle( M2DVorschau::Style::Sichtbar ); akkuLeistungT->removeStyle( M2DVorschau::Style::Sichtbar ); akkuLeistung->removeStyle( M2DVorschau::Style::Sichtbar ); team->removeStyle( M2DVorschau::Style::Sichtbar ); speichern->removeStyle( M2DVorschau::Style::Sichtbar ); } else { int index = 0; int anz = objekte->getEintragAnzahl(); for( int i = 0; i < anz; i++ ) { if( objekte->zEintrag( i )->zText()->istGleich( Text( id ) ) ) break; index++; } objekte->setAuswahl( index ); ObjektDaten *o = daten->getObjekt( daten->getObjektIndexById( id ) ); model->setModel2D( daten->loadModelFromRessource( o->m2d ) ); modelPath = daten->getResource( daten->getResourceIndexById( o->m2d ) )->path; Textur2D *textur = new Textur2D(); textur->setTexturZ( daten->loadBildFromRessource( o->bild ) ); texturPath = daten->getResource( daten->getResourceIndexById( o->bild ) )->path; model->zModel()->setTextur( textur ); stabilität->setText( Text( o->maxStabilität ) ); energie->setText( Text( o->maxEnergie ) ); energieRadius->setText( Text( o->energieRadius ) ); reparatur->setText( Text( o->reparatur ) ); akkuLeistung->setText( Text( o->akkuLeistung ) ); team->setAuswahl( Text( o->team ) ); model->addStyle( M2DVorschau::Style::Sichtbar ); changeModel->addStyle( M2DVorschau::Style::Sichtbar ); changeTextur->addStyle( M2DVorschau::Style::Sichtbar ); stabilitätT->addStyle( M2DVorschau::Style::Sichtbar ); stabilität->addStyle( M2DVorschau::Style::Sichtbar ); energieT->addStyle( M2DVorschau::Style::Sichtbar ); energie->addStyle( M2DVorschau::Style::Sichtbar ); energieRadiusT->addStyle( M2DVorschau::Style::Sichtbar ); energieRadius->addStyle( M2DVorschau::Style::Sichtbar ); reparaturT->addStyle( M2DVorschau::Style::Sichtbar ); reparatur->addStyle( M2DVorschau::Style::Sichtbar ); akkuLeistungT->addStyle( M2DVorschau::Style::Sichtbar ); akkuLeistung->addStyle( M2DVorschau::Style::Sichtbar ); team->addStyle( M2DVorschau::Style::Sichtbar ); speichern->addStyle( M2DVorschau::Style::Sichtbar ); } }