edittechadapter.cpp

Go to the documentation of this file.
00001 /*
00002      This file is part of Advanced Strategic Command; http://www.asc-hq.de
00003      Copyright (C) 1994-2010  Martin Bickel  and  Marc Schellenberger
00004  
00005      This program is free software; you can redistribute it and/or modify
00006      it under the terms of the GNU General Public License as published by
00007      the Free Software Foundation; either version 2 of the License, or
00008      (at your option) any later version.
00009  
00010      This program is distributed in the hope that it will be useful,
00011      but WITHOUT ANY WARRANTY; without even the implied warranty of
00012      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013      GNU General Public License for more details.
00014  
00015      You should have received a copy of the GNU General Public License
00016      along with this program; see the file COPYING. If not, write to the 
00017      Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
00018      Boston, MA  02111-1307  USA
00019 */
00020 
00021 
00022 #include "edittechadapter.h"
00023 
00024 #include "../player.h"
00025 #include "../gamemap.h"
00026 
00027 #include "../paradialog.h"
00028 #include "../itemrepository.h"
00029 #include "../iconrepository.h"
00030 #include "../vehicletype.h"
00031 #include "unitinfodialog.h"
00032 
00033 #include "selectionwindow.h"
00034 
00035 #include "pgmultilineedit.h"
00036 #include "../widgets/textrenderer.h"
00037 
00038 class TechAdapterWidget: public SelectionWidget
00039 {
00040       ASCString name;
00041    public:
00042       TechAdapterWidget( PG_Widget* parent, const PG_Point& pos, int width, const ASCString& adapterName ) : SelectionWidget( parent, PG_Rect( pos.x, pos.y, width, 18 )), name(adapterName)
00043       {
00044          PG_Label* lbl1 = new PG_Label( this, PG_Rect( 5, 0, width - 10, Height() ), name );
00045          lbl1->SetFontSize( lbl1->GetFontSize() -1 );
00046 
00047          SetTransparency( 255 );
00048       };
00049 
00050       ASCString getName() const
00051       {
00052          return name;
00053       };
00054 
00055    protected:
00056 
00057       void display( SDL_Surface * surface, const PG_Rect & src, const PG_Rect & dst )
00058       {
00059       }
00060       ;
00061 };
00062 
00063 
00064 
00065 
00066    class TechAdapterSelectionItemFactory: public SelectionItemFactory, public SigC::Object  {
00067         
00068          ASCString selected;
00069          
00070          void add( set<ASCString>& list, const TechAdapterDependency& adapter );
00071          
00072       public:
00073          typedef set<ASCString> Container;
00074 
00075       protected:
00076          Container::iterator it;
00077          Container items;
00078          Container* adapterForPlayer;
00079 
00080       public:
00081          TechAdapterSelectionItemFactory(  );
00082          TechAdapterSelectionItemFactory( set<ASCString>& adapter );
00083 
00084          
00085          
00086          void restart();
00087          SigC::Signal1<void,const ASCString&> techSelected;
00088    
00089          SelectionWidget* spawnNextItem( PG_Widget* parent, const PG_Point& pos );
00090       
00091          void itemSelected( const SelectionWidget* widget, bool mouse );
00092          void itemMarked( const SelectionWidget* widget, bool mouse );
00093          
00094          ASCString getSelected() { return selected; };
00095    };
00096 
00097 
00098 
00099    TechAdapterSelectionItemFactory :: TechAdapterSelectionItemFactory( ) : adapterForPlayer(NULL)
00100    {
00101       restart();
00102    };
00103 
00104    TechAdapterSelectionItemFactory :: TechAdapterSelectionItemFactory( set<ASCString>& adapter ) : adapterForPlayer( &adapter )
00105    {
00106       restart();
00107    };
00108 
00109    
00110    void TechAdapterSelectionItemFactory::add( set<ASCString>& list, const TechAdapterDependency& adapter )
00111    {
00112       const TechAdapterDependency::RequiredTechAdapter& deps = adapter.listAdapters();
00113       for ( TechAdapterDependency::RequiredTechAdapter::const_iterator i = deps.begin(); i != deps.end(); ++i ) {
00114          list.insert( *i );
00115       }
00116    }
00117    
00118    
00119    void TechAdapterSelectionItemFactory::restart()
00120    {
00121       items.clear();
00122       
00123       if ( !adapterForPlayer ) {
00124          
00125          for ( int i = 0; i < vehicleTypeRepository.getNum(); ++i )
00126             add( items, vehicleTypeRepository.getObject_byPos(i)->techDependency );
00127       
00128          for ( int i = 0; i < buildingTypeRepository.getNum(); ++i )
00129             add( items, buildingTypeRepository.getObject_byPos(i)->techDependency );
00130          
00131          for ( int i = 0; i < objectTypeRepository.getNum(); ++i )
00132             add( items, objectTypeRepository.getObject_byPos(i)->techDependency );
00133          
00134       } else {
00135          items = *adapterForPlayer;
00136       }
00137          
00138       it = items.begin();
00139    };
00140 
00141 
00142    SelectionWidget* TechAdapterSelectionItemFactory::spawnNextItem( PG_Widget* parent, const PG_Point& pos )
00143    {
00144       if ( it != items.end() ) {
00145          ASCString v = *(it++);
00146          
00147          return new TechAdapterWidget( parent, pos, parent->Width() - 15, v );
00148       } else
00149          return NULL;
00150    };
00151 
00152 
00153    void TechAdapterSelectionItemFactory::itemMarked( const SelectionWidget* widget, bool mouse )
00154    {
00155       itemSelected(widget, mouse );
00156    }
00157    
00158    void TechAdapterSelectionItemFactory::itemSelected( const SelectionWidget* widget, bool mouse )
00159    {
00160       if ( !widget )
00161          return;
00162 
00163       const TechAdapterWidget* tw = dynamic_cast<const TechAdapterWidget*>(widget);
00164       assert( tw );
00165 
00166       selected = tw->getName();
00167       techSelected(tw->getName());
00168    }
00169 
00170 
00171 
00172 class EditTechAdapter : public ASC_PG_Dialog
00173 {
00174    ItemSelectorWidget* allItemSelector;
00175    ItemSelectorWidget* playerItemSelector;
00176    TechAdapterSelectionItemFactory* allAdapterfactory;
00177    TechAdapterSelectionItemFactory* playerFactory;
00178    
00179    set<ASCString> playerAdapter;
00180    
00181    TextRenderer* objectList;
00182    Player& player;
00183 
00184    bool containsAdapter( const ASCString& adapter, const TechAdapterDependency& dependency )
00185    {
00186       return find( dependency.listAdapters().begin(), dependency.listAdapters().end(), adapter ) != dependency.listAdapters().end();
00187    }
00188    
00189    void techAdapterSelected( const ASCString& adapter )
00190    {
00191       const ASCString big = "#fontsize=14#";
00192       const ASCString medium = "#fontsize=12#";
00193       const ASCString small = "#fontsize=10#";
00194       
00195       ASCString complete = big + "TechAdapter " + adapter + " is used by:" + small + "\n";
00196       ASCString local;
00197       
00198       for ( int i = 0; i < vehicleTypeRepository.getNum(); ++i )
00199          if ( containsAdapter( adapter, vehicleTypeRepository.getObject_byPos(i)->techDependency ))
00200             local += "#vehicletype=" + ASCString::toString(vehicleTypeRepository.getObject_byPos(i)->id) + "# " + vehicleTypeRepository.getObject_byPos(i)->getName() + " \n";
00201       
00202       if ( !local.empty() )
00203          complete += medium + "VehicleTypes" + small + "\n" + local;
00204       local.clear();
00205       
00206       for ( int i = 0; i < buildingTypeRepository.getNum(); ++i )
00207          if ( containsAdapter( adapter, buildingTypeRepository.getObject_byPos(i)->techDependency ))
00208             local += "  " + buildingTypeRepository.getObject_byPos(i)->getName() + "\n";
00209          
00210       if ( !local.empty() )
00211          complete += medium + "BuildingTypes" + small + "\n" + local;
00212       local.clear();
00213       
00214       for ( int i = 0; i < objectTypeRepository.getNum(); ++i )
00215          if ( containsAdapter( adapter, objectTypeRepository.getObject_byPos(i)->techDependency ))
00216             local += "  " + objectTypeRepository.getObject_byPos(i)->getName() + "\n";
00217       
00218       if ( !local.empty() )
00219          complete += medium + "ObjectTypes" + small + "\n" + local;
00220       
00221       objectList->SetText( complete );
00222    };
00223 
00224    protected:
00225       bool handleButtonClick(PG_Button* button) 
00226       {
00227             return false;
00228       };
00229 
00230       bool ok()
00231       {
00232          player.research.setPredefinedTechAdapter( playerAdapter );
00233          QuitModal();
00234          return true;
00235       }
00236 
00237       bool cancel()
00238       {
00239          QuitModal();
00240          return true;
00241       }
00242       
00243       bool add()
00244       {
00245          playerAdapter.insert( allAdapterfactory->getSelected() );
00246          playerItemSelector->reLoad( true );
00247          return true;  
00248       }
00249       
00250       bool remove()
00251       {
00252          set<ASCString>::iterator i = playerAdapter.find( playerFactory->getSelected());
00253          if ( i != playerAdapter.end() )
00254             playerAdapter.erase( playerFactory->getSelected() );
00255          playerItemSelector->reLoad( true );
00256               
00257          return true;  
00258       }
00259      
00260       bool eventKeyDown(const SDL_KeyboardEvent* key)
00261       {
00262          int mod = SDL_GetModState() & ~(KMOD_NUM | KMOD_CAPS | KMOD_MODE);
00263 
00264          if ( !mod  ) 
00265             if ( key->keysym.sym == SDLK_RETURN ) 
00266                return ok();
00267          
00268          return false;
00269       };
00270 
00271    
00272    public:
00273       EditTechAdapter( Player& my_player ) : ASC_PG_Dialog( NULL, PG_Rect( -1, -1, 770, 600), "Edit Tech Adapter" ) , allAdapterfactory(NULL), playerFactory(NULL), player( my_player )
00274       {
00275          playerAdapter.insert( player.research.getPredefinedTechAdapter().begin(), player.research.getPredefinedTechAdapter().end() );
00276          
00277          new PG_Label(this, PG_Rect( 10, 30, 300, 20), "All TechAdapter");
00278          PG_Rect left ( 10, 55, 300, Height() - 220 );
00279          
00280          new PG_Label(this, PG_Rect( 420, 30, 300, 20), "TechAdapter for " + player.getName() );
00281          PG_Rect right( 420, 55, 300, Height() - 220 );
00282          
00283          Emboss* eleft = new Emboss( this, left, true );
00284          Emboss* eright = new Emboss( this, right, true );
00285          
00286          
00287          allAdapterfactory = new TechAdapterSelectionItemFactory();
00288          allAdapterfactory->techSelected.connect( SigC::slot( *this, &EditTechAdapter::techAdapterSelected ));
00289          allItemSelector = new ItemSelectorWidget( eleft, PG_Rect( 10, 10, eleft->Width() - 20, eleft->Height()-20 ), allAdapterfactory );
00290 
00291          playerFactory = new TechAdapterSelectionItemFactory( playerAdapter );
00292          playerFactory->techSelected.connect( SigC::slot( *this, &EditTechAdapter::techAdapterSelected ));
00293          playerItemSelector = new ItemSelectorWidget( eright, PG_Rect( 10, 10, eright->Width() - 20, eright->Height()-20 ), playerFactory );
00294          
00295          
00296          (new PG_Button(this, PG_Rect( left.x + left.Width() + 10, left.y, right.x - left.x - left.Width() - 20,  30), "Add >>" ))->sigClick.connect( SigC::slot( *this, &EditTechAdapter::add));
00297          (new PG_Button(this, PG_Rect( left.x + left.Width() + 10, left.y + 40, right.x - left.x - left.Width() - 20,  30), "Remove <<" ))->sigClick.connect( SigC::slot( *this, &EditTechAdapter::remove));
00298          
00299          Emboss* deps = new Emboss(this, PG_Rect ( 10, Height() - 160, 330, 120 ), true);
00300          objectList = new TextRenderer( deps, PG_Rect(1,1,deps->Width() - 2, deps->Height() - 2) );
00301 
00302          AddStandardButton("~O~K")->sigClick.connect( SigC::slot( *this, &EditTechAdapter::ok ));
00303          AddStandardButton("~C~ancel")->sigClick.connect( SigC::slot( *this, &EditTechAdapter::cancel ));
00304       };
00305 };
00306 
00307 
00308 
00309 
00310 void editTechAdapter( Player& player )
00311 {
00312    EditTechAdapter eta( player);
00313    eta.Show();
00314    eta.RunModal();
00315 }
00316 
00317 
00318 

Generated on Mon May 21 01:26:32 2012 for Advanced Strategic Command by  doxygen 1.5.1